diff options
| author | Aníbal Limón <anibal.limon@linux.intel.com> | 2016-10-31 17:24:25 -0600 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-01-23 12:05:19 +0000 |
| commit | 8a37763ae9e5b8bfa4ed89c2ab8642b8f5bfc287 (patch) | |
| tree | d4af06c2d2efd97b340aa657959a7abca1af4a1a /meta | |
| parent | 9a23e0f703ec3ccb99b354102d804eda13543b23 (diff) | |
| download | poky-8a37763ae9e5b8bfa4ed89c2ab8642b8f5bfc287.tar.gz | |
oeqa/sdk: Add case and context modules for the SDK component
Adds case and context modules for SDK based on oetest.py old code.
Enables SDK Test component usage with oe-test, the SDK Test component
adds command line options for specify sdk installed dir, sdk environment
and target/hosts maniftest.
[YOCTO #10599]
(From OE-Core rev: 19e875dd81c42841666e6db5f6b665b4e1cddfe6)
Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
Signed-off-by: Mariano Lopez <mariano.lopez@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
| -rw-r--r-- | meta/lib/oeqa/oetest.py | 51 | ||||
| -rw-r--r-- | meta/lib/oeqa/sdk/__init__.py | 0 | ||||
| -rw-r--r-- | meta/lib/oeqa/sdk/case.py | 12 | ||||
| -rw-r--r-- | meta/lib/oeqa/sdk/context.py | 133 |
4 files changed, 145 insertions, 51 deletions
diff --git a/meta/lib/oeqa/oetest.py b/meta/lib/oeqa/oetest.py index d1aef967e4..d7c358844f 100644 --- a/meta/lib/oeqa/oetest.py +++ b/meta/lib/oeqa/oetest.py | |||
| @@ -145,20 +145,6 @@ class OETestCalledProcessError(subprocess.CalledProcessError): | |||
| 145 | 145 | ||
| 146 | subprocess.CalledProcessError = OETestCalledProcessError | 146 | subprocess.CalledProcessError = OETestCalledProcessError |
| 147 | 147 | ||
| 148 | class oeSDKTest(oeTest): | ||
| 149 | def __init__(self, methodName='runTest'): | ||
| 150 | self.sdktestdir = oeSDKTest.tc.sdktestdir | ||
| 151 | super(oeSDKTest, self).__init__(methodName) | ||
| 152 | |||
| 153 | @classmethod | ||
| 154 | def hasHostPackage(self, pkg): | ||
| 155 | if re.search(pkg, oeTest.tc.hostpkgmanifest): | ||
| 156 | return True | ||
| 157 | return False | ||
| 158 | |||
| 159 | def _run(self, cmd): | ||
| 160 | return subprocess.check_output(". %s > /dev/null; %s;" % (self.tc.sdkenv, cmd), shell=True, stderr=subprocess.STDOUT).decode("utf-8") | ||
| 161 | |||
| 162 | class oeSDKExtTest(oeSDKTest): | 148 | class oeSDKExtTest(oeSDKTest): |
| 163 | def _run(self, cmd): | 149 | def _run(self, cmd): |
| 164 | # extensible sdk shows a warning if found bitbake in the path | 150 | # extensible sdk shows a warning if found bitbake in the path |
| @@ -657,43 +643,6 @@ class ExportTestContext(RuntimeTestContext): | |||
| 657 | pkg_dir = os.path.join(export_dir, extracted_dir) | 643 | pkg_dir = os.path.join(export_dir, extracted_dir) |
| 658 | super(ExportTestContext, self).install_uninstall_packages(test_id, pkg_dir, install) | 644 | super(ExportTestContext, self).install_uninstall_packages(test_id, pkg_dir, install) |
| 659 | 645 | ||
| 660 | class SDKTestContext(TestContext): | ||
| 661 | def __init__(self, d, sdktestdir, sdkenv, tcname, *args): | ||
| 662 | super(SDKTestContext, self).__init__(d) | ||
| 663 | |||
| 664 | self.sdktestdir = sdktestdir | ||
| 665 | self.sdkenv = sdkenv | ||
| 666 | self.tcname = tcname | ||
| 667 | |||
| 668 | if not hasattr(self, 'target_manifest'): | ||
| 669 | self.target_manifest = d.getVar("SDK_TARGET_MANIFEST") | ||
| 670 | try: | ||
| 671 | self.pkgmanifest = {} | ||
| 672 | with open(self.target_manifest) as f: | ||
| 673 | for line in f: | ||
| 674 | (pkg, arch, version) = line.strip().split() | ||
| 675 | self.pkgmanifest[pkg] = (version, arch) | ||
| 676 | except IOError as e: | ||
| 677 | bb.fatal("No package manifest file found. Did you build the sdk image?\n%s" % e) | ||
| 678 | |||
| 679 | if not hasattr(self, 'host_manifest'): | ||
| 680 | self.host_manifest = d.getVar("SDK_HOST_MANIFEST") | ||
| 681 | try: | ||
| 682 | with open(self.host_manifest) as f: | ||
| 683 | self.hostpkgmanifest = f.read() | ||
| 684 | except IOError as e: | ||
| 685 | bb.fatal("No host package manifest file found. Did you build the sdk image?\n%s" % e) | ||
| 686 | |||
| 687 | def _get_test_namespace(self): | ||
| 688 | return "sdk" | ||
| 689 | |||
| 690 | def _get_test_suites(self): | ||
| 691 | return (self.d.getVar("TEST_SUITES_SDK") or "auto").split() | ||
| 692 | |||
| 693 | def _get_test_suites_required(self): | ||
| 694 | return [t for t in (self.d.getVar("TEST_SUITES_SDK") or \ | ||
| 695 | "auto").split() if t != "auto"] | ||
| 696 | |||
| 697 | class SDKExtTestContext(SDKTestContext): | 646 | class SDKExtTestContext(SDKTestContext): |
| 698 | def __init__(self, d, sdktestdir, sdkenv, tcname, *args): | 647 | def __init__(self, d, sdktestdir, sdkenv, tcname, *args): |
| 699 | self.target_manifest = d.getVar("SDK_EXT_TARGET_MANIFEST") | 648 | self.target_manifest = d.getVar("SDK_EXT_TARGET_MANIFEST") |
diff --git a/meta/lib/oeqa/sdk/__init__.py b/meta/lib/oeqa/sdk/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/meta/lib/oeqa/sdk/__init__.py | |||
diff --git a/meta/lib/oeqa/sdk/case.py b/meta/lib/oeqa/sdk/case.py new file mode 100644 index 0000000000..782db8b523 --- /dev/null +++ b/meta/lib/oeqa/sdk/case.py | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | # Copyright (C) 2016 Intel Corporation | ||
| 2 | # Released under the MIT license (see COPYING.MIT) | ||
| 3 | |||
| 4 | import subprocess | ||
| 5 | |||
| 6 | from oeqa.core.case import OETestCase | ||
| 7 | |||
| 8 | class OESDKTestCase(OETestCase): | ||
| 9 | def _run(self, cmd): | ||
| 10 | return subprocess.check_output(". %s > /dev/null; %s;" % \ | ||
| 11 | (self.tc.sdk_env, cmd), shell=True, | ||
| 12 | stderr=subprocess.STDOUT).decode("utf-8") | ||
diff --git a/meta/lib/oeqa/sdk/context.py b/meta/lib/oeqa/sdk/context.py new file mode 100644 index 0000000000..0189ed851e --- /dev/null +++ b/meta/lib/oeqa/sdk/context.py | |||
| @@ -0,0 +1,133 @@ | |||
| 1 | # Copyright (C) 2016 Intel Corporation | ||
| 2 | # Released under the MIT license (see COPYING.MIT) | ||
| 3 | |||
| 4 | import os | ||
| 5 | import sys | ||
| 6 | import glob | ||
| 7 | import re | ||
| 8 | |||
| 9 | from oeqa.core.context import OETestContext, OETestContextExecutor | ||
| 10 | |||
| 11 | class OESDKTestContext(OETestContext): | ||
| 12 | sdk_files_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "files") | ||
| 13 | |||
| 14 | def __init__(self, td=None, logger=None, sdk_dir=None, sdk_env=None, | ||
| 15 | target_pkg_manifest=None, host_pkg_manifest=None): | ||
| 16 | super(OESDKTestContext, self).__init__(td, logger) | ||
| 17 | |||
| 18 | self.sdk_dir = sdk_dir | ||
| 19 | self.sdk_env = sdk_env | ||
| 20 | self.target_pkg_manifest = target_pkg_manifest | ||
| 21 | self.host_pkg_manifest = host_pkg_manifest | ||
| 22 | |||
| 23 | def _hasPackage(self, manifest, pkg): | ||
| 24 | for host_pkg in manifest.keys(): | ||
| 25 | if re.search(pkg, host_pkg): | ||
| 26 | return True | ||
| 27 | return False | ||
| 28 | |||
| 29 | def hasHostPackage(self, pkg): | ||
| 30 | return self._hasPackage(self.host_pkg_manifest, pkg) | ||
| 31 | |||
| 32 | def hasTargetPackage(self, pkg): | ||
| 33 | return self._hasPackage(self.target_pkg_manifest, pkg) | ||
| 34 | |||
| 35 | class OESDKTestContextExecutor(OETestContextExecutor): | ||
| 36 | _context_class = OESDKTestContext | ||
| 37 | |||
| 38 | name = 'sdk' | ||
| 39 | help = 'sdk test component' | ||
| 40 | description = 'executes sdk tests' | ||
| 41 | |||
| 42 | default_cases = [os.path.join(os.path.abspath(os.path.dirname(__file__)), | ||
| 43 | 'cases')] | ||
| 44 | default_test_data = None | ||
| 45 | |||
| 46 | def register_commands(self, logger, subparsers): | ||
| 47 | import argparse_oe | ||
| 48 | |||
| 49 | super(OESDKTestContextExecutor, self).register_commands(logger, subparsers) | ||
| 50 | |||
| 51 | sdk_group = self.parser.add_argument_group('sdk options') | ||
| 52 | sdk_group.add_argument('--sdk-env', action='store', | ||
| 53 | help='sdk environment') | ||
| 54 | sdk_group.add_argument('--target-manifest', action='store', | ||
| 55 | help='sdk target manifest') | ||
| 56 | sdk_group.add_argument('--host-manifest', action='store', | ||
| 57 | help='sdk host manifest') | ||
| 58 | |||
| 59 | sdk_dgroup = self.parser.add_argument_group('sdk display options') | ||
| 60 | sdk_dgroup.add_argument('--list-sdk-env', action='store_true', | ||
| 61 | default=False, help='sdk list available environment') | ||
| 62 | |||
| 63 | # XXX this option is required but argparse_oe has a bug handling | ||
| 64 | # required options, seems that don't keep track of already parsed | ||
| 65 | # options | ||
| 66 | sdk_rgroup = self.parser.add_argument_group('sdk required options') | ||
| 67 | sdk_rgroup.add_argument('--sdk-dir', required=False, action='store', | ||
| 68 | help='sdk installed directory') | ||
| 69 | |||
| 70 | @staticmethod | ||
| 71 | def _load_manifest(manifest): | ||
| 72 | pkg_manifest = {} | ||
| 73 | if manifest: | ||
| 74 | with open(manifest) as f: | ||
| 75 | for line in f: | ||
| 76 | (pkg, arch, version) = line.strip().split() | ||
| 77 | pkg_manifest[pkg] = (version, arch) | ||
| 78 | |||
| 79 | return pkg_manifest | ||
| 80 | |||
| 81 | def _process_args(self, logger, args): | ||
| 82 | super(OESDKTestContextExecutor, self)._process_args(logger, args) | ||
| 83 | |||
| 84 | self.tc_kwargs['init']['sdk_dir'] = args.sdk_dir | ||
| 85 | self.tc_kwargs['init']['sdk_env'] = self.sdk_env | ||
| 86 | self.tc_kwargs['init']['target_pkg_manifest'] = \ | ||
| 87 | OESDKTestContextExecutor._load_manifest(args.target_manifest) | ||
| 88 | self.tc_kwargs['init']['host_pkg_manifest'] = \ | ||
| 89 | OESDKTestContextExecutor._load_manifest(args.host_manifest) | ||
| 90 | |||
| 91 | @staticmethod | ||
| 92 | def _get_sdk_environs(sdk_dir): | ||
| 93 | sdk_env = {} | ||
| 94 | |||
| 95 | environ_pattern = sdk_dir + '/environment-setup-*' | ||
| 96 | full_sdk_env = glob.glob(sdk_dir + '/environment-setup-*') | ||
| 97 | for env in full_sdk_env: | ||
| 98 | m = re.search('environment-setup-(.*)', env) | ||
| 99 | if m: | ||
| 100 | sdk_env[m.group(1)] = env | ||
| 101 | |||
| 102 | return sdk_env | ||
| 103 | |||
| 104 | def _display_sdk_envs(self, log, args, sdk_envs): | ||
| 105 | log("Available SDK environments at directory %s:" \ | ||
| 106 | % args.sdk_dir) | ||
| 107 | log("") | ||
| 108 | for env in sdk_envs: | ||
| 109 | log(env) | ||
| 110 | |||
| 111 | def run(self, logger, args): | ||
| 112 | if not args.sdk_dir: | ||
| 113 | raise argparse_oe.ArgumentUsageError("No SDK directory "\ | ||
| 114 | "specified please do, --sdk-dir SDK_DIR", self.name) | ||
| 115 | |||
| 116 | sdk_envs = OESDKTestContextExecutor._get_sdk_environs(args.sdk_dir) | ||
| 117 | if not sdk_envs: | ||
| 118 | raise argparse_oe.ArgumentUsageError("No available SDK "\ | ||
| 119 | "enviroments found at %s" % args.sdk_dir, self.name) | ||
| 120 | |||
| 121 | if args.list_sdk_env: | ||
| 122 | self._display_sdk_envs(logger.info, args, sdk_envs) | ||
| 123 | sys.exit(0) | ||
| 124 | |||
| 125 | if not args.sdk_env in sdk_envs: | ||
| 126 | self._display_sdk_envs(logger.error, args, sdk_envs) | ||
| 127 | raise argparse_oe.ArgumentUsageError("No valid SDK "\ | ||
| 128 | "environment (%s) specified" % args.sdk_env, self.name) | ||
| 129 | |||
| 130 | self.sdk_env = sdk_envs[args.sdk_env] | ||
| 131 | super(OESDKTestContextExecutor, self).run(logger, args) | ||
| 132 | |||
| 133 | _executor_class = OESDKTestContextExecutor | ||
