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 | ||