Skip to content

Commit

Permalink
tests/test_target: Read target connection settings from a YAML file
Browse files Browse the repository at this point in the history
This will be useful in automating CI tests without modifying the source
code.

Replace unittest with pytest in order to make parameter passing to test
functions easier.

Move target configuration reading and generating target object outside
of the test function. Because we will run the test function for new
targets and may want to add new test functions.

While we are here, also fix pylint issues.

Signed-off-by: Metin Kaya <[email protected]>
  • Loading branch information
metin-arm committed Feb 23, 2024
1 parent fb8887f commit 6217c77
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 20 deletions.
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ def _load_path(filepath):
'wrapt', # Basic for construction of decorator functions
'numpy',
'pandas',
'pytest',
'lxml', # More robust xml parsing
'nest_asyncio', # Allows running nested asyncio loops
'future', # for the "past" Python package
Expand Down
5 changes: 5 additions & 0 deletions tests/target_configs.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
LocalLinuxTarget:
entry-0:
connection_settings:
unrooted: True

68 changes: 48 additions & 20 deletions tests/test_target.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,35 +14,63 @@
# limitations under the License.
#

"""Module for testing targets."""

import os
import shutil
import tempfile
from unittest import TestCase
from pprint import pp
import pytest

from devlib import LocalLinuxTarget
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 = []

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'])
targets.append(ll_target)

return targets


@pytest.mark.parametrize("target", build_targets())
def test_read_multiline_values(target):
"""
Test Target.read_tree_values_flat()
class TestReadTreeValues(TestCase):
:param target: Type of target per :class:`Target` based classes.
:type target: Target
"""

def test_read_multiline_values(self):
data = {
'test1': '1',
'test2': '2\n\n',
'test3': '3\n\n4\n\n',
}
data = {
'test1': '1',
'test2': '2\n\n',
'test3': '3\n\n4\n\n',
}

tempdir = tempfile.mkdtemp(prefix='devlib-test-')
for key, value in data.items():
path = os.path.join(tempdir, key)
with open(path, 'w') as wfh:
wfh.write(value)
tempdir = tempfile.mkdtemp(prefix='devlib-test-')
for key, value in data.items():
path = os.path.join(tempdir, key)
with open(path, 'w', encoding='utf-8') as wfh:
wfh.write(value)

t = LocalLinuxTarget(connection_settings={'unrooted': True})
raw_result = t.read_tree_values_flat(tempdir)
result = {os.path.basename(k): v for k, v in raw_result.items()}
raw_result = target.read_tree_values_flat(tempdir)
result = {os.path.basename(k): v for k, v in raw_result.items()}

shutil.rmtree(tempdir)
shutil.rmtree(tempdir)

self.assertEqual({k: v.strip()
for k, v in data.items()},
result)
assert {k: v.strip() for k, v in data.items()} == result

0 comments on commit 6217c77

Please sign in to comment.