2024-01-10 15:56:35 +00:00
|
|
|
#
|
|
|
|
# Copyright 2024 ARM Limited
|
|
|
|
#
|
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
|
# You may obtain a copy of the License at
|
|
|
|
#
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
#
|
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
# See the License for the specific language governing permissions and
|
|
|
|
# limitations under the License.
|
|
|
|
#
|
|
|
|
|
2024-02-05 08:36:19 +00:00
|
|
|
"""Module for testing targets."""
|
|
|
|
|
2018-08-23 09:57:56 +01:00
|
|
|
import os
|
2024-02-05 08:36:19 +00:00
|
|
|
from pprint import pp
|
|
|
|
import pytest
|
2018-08-23 09:57:56 +01:00
|
|
|
|
2024-01-15 12:53:45 +00:00
|
|
|
from devlib import AndroidTarget, LinuxTarget, LocalLinuxTarget, QEMUTargetRunner
|
2024-01-10 15:59:42 +00:00
|
|
|
from devlib.utils.android import AdbConnection
|
2024-02-05 08:36:19 +00:00
|
|
|
from devlib.utils.misc import load_struct_from_yaml
|
|
|
|
|
|
|
|
|
|
|
|
def build_targets():
|
|
|
|
"""Read targets from a YAML formatted config file"""
|
|
|
|
|
|
|
|
config_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'target_configs.yaml')
|
|
|
|
|
|
|
|
target_configs = load_struct_from_yaml(config_file)
|
|
|
|
if target_configs is None:
|
|
|
|
raise ValueError(f'{config_file} looks empty!')
|
|
|
|
|
|
|
|
targets = []
|
|
|
|
|
2024-01-10 15:59:42 +00:00
|
|
|
if target_configs.get('AndroidTarget') is not None:
|
|
|
|
print('> Android targets:')
|
|
|
|
for entry in target_configs['AndroidTarget'].values():
|
|
|
|
pp(entry)
|
|
|
|
a_target = AndroidTarget(
|
|
|
|
connection_settings=entry['connection_settings'],
|
|
|
|
conn_cls=lambda **kwargs: AdbConnection(adb_as_root=True, **kwargs),
|
|
|
|
)
|
2024-01-15 12:53:45 +00:00
|
|
|
targets.append((a_target, None))
|
2024-01-10 15:59:42 +00:00
|
|
|
|
|
|
|
if target_configs.get('LinuxTarget') is not None:
|
|
|
|
print('> Linux targets:')
|
|
|
|
for entry in target_configs['LinuxTarget'].values():
|
|
|
|
pp(entry)
|
|
|
|
l_target = LinuxTarget(connection_settings=entry['connection_settings'])
|
2024-01-15 12:53:45 +00:00
|
|
|
targets.append((l_target, None))
|
2024-01-10 15:59:42 +00:00
|
|
|
|
2024-02-05 08:36:19 +00:00
|
|
|
if target_configs.get('LocalLinuxTarget') is not None:
|
|
|
|
print('> LocalLinux targets:')
|
|
|
|
for entry in target_configs['LocalLinuxTarget'].values():
|
|
|
|
pp(entry)
|
|
|
|
ll_target = LocalLinuxTarget(connection_settings=entry['connection_settings'])
|
2024-01-15 12:53:45 +00:00
|
|
|
targets.append((ll_target, None))
|
|
|
|
|
|
|
|
if target_configs.get('QEMUTargetRunner') is not None:
|
|
|
|
print('> QEMU target runners:')
|
|
|
|
for entry in target_configs['QEMUTargetRunner'].values():
|
|
|
|
pp(entry)
|
|
|
|
qemu_settings = entry.get('qemu_settings') and entry['qemu_settings']
|
|
|
|
connection_settings = entry.get(
|
|
|
|
'connection_settings') and entry['connection_settings']
|
|
|
|
|
|
|
|
qemu_runner = QEMUTargetRunner(
|
|
|
|
qemu_settings=qemu_settings,
|
|
|
|
connection_settings=connection_settings,
|
|
|
|
)
|
|
|
|
targets.append((qemu_runner.target, qemu_runner))
|
2024-02-05 08:36:19 +00:00
|
|
|
|
|
|
|
return targets
|
|
|
|
|
2018-08-23 09:57:56 +01:00
|
|
|
|
2024-01-15 12:53:45 +00:00
|
|
|
@pytest.mark.parametrize("target, target_runner", build_targets())
|
|
|
|
def test_read_multiline_values(target, target_runner):
|
2024-02-05 08:36:19 +00:00
|
|
|
"""
|
|
|
|
Test Target.read_tree_values_flat()
|
2018-08-23 09:57:56 +01:00
|
|
|
|
2024-02-05 08:36:19 +00:00
|
|
|
:param target: Type of target per :class:`Target` based classes.
|
|
|
|
:type target: Target
|
2024-01-15 12:53:45 +00:00
|
|
|
|
|
|
|
:param target_runner: Target runner object to terminate target (if necessary).
|
|
|
|
:type target: TargetRunner
|
2024-02-05 08:36:19 +00:00
|
|
|
"""
|
2018-08-23 09:57:56 +01:00
|
|
|
|
2024-02-05 08:36:19 +00:00
|
|
|
data = {
|
|
|
|
'test1': '1',
|
|
|
|
'test2': '2\n\n',
|
|
|
|
'test3': '3\n\n4\n\n',
|
|
|
|
}
|
2018-08-23 09:57:56 +01:00
|
|
|
|
2024-01-10 15:59:42 +00:00
|
|
|
print(f'target={target.__class__.__name__} os={target.os} hostname={target.hostname}')
|
|
|
|
|
|
|
|
with target.make_temp() as tempdir:
|
|
|
|
print(f'Created {tempdir}.')
|
|
|
|
|
|
|
|
for key, value in data.items():
|
|
|
|
path = os.path.join(tempdir, key)
|
|
|
|
print(f'Writing {value!r} to {path}...')
|
|
|
|
target.write_value(path, value, verify=False,
|
|
|
|
as_root=target.conn.connected_as_root)
|
2018-08-23 09:57:56 +01:00
|
|
|
|
2024-01-10 15:59:42 +00:00
|
|
|
print('Reading values from target...')
|
|
|
|
raw_result = target.read_tree_values_flat(tempdir)
|
|
|
|
result = {os.path.basename(k): v for k, v in raw_result.items()}
|
2018-08-23 09:57:56 +01:00
|
|
|
|
2024-01-10 15:59:42 +00:00
|
|
|
print(f'Removing {target.working_directory}...')
|
|
|
|
target.remove(target.working_directory)
|
2018-08-23 09:57:56 +01:00
|
|
|
|
2024-01-15 12:53:45 +00:00
|
|
|
if target_runner is not None:
|
|
|
|
print('Terminating target runner...')
|
|
|
|
target_runner.terminate()
|
|
|
|
|
2024-02-05 08:36:19 +00:00
|
|
|
assert {k: v.strip() for k, v in data.items()} == result
|