xref: /openbmc/openbmc/poky/meta/lib/oeqa/sdk/context.py (revision 96e4b4e121e0e2da1535d7d537d6a982a6ff5bc0)
1#
2# Copyright (C) 2016 Intel Corporation
3#
4# SPDX-License-Identifier: MIT
5#
6
7import os
8import sys
9import glob
10import re
11
12from oeqa.core.context import OETestContext, OETestContextExecutor
13
14class OESDKTestContext(OETestContext):
15    sdk_files_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "files")
16
17    def __init__(self, td=None, logger=None, sdk_dir=None, sdk_env=None,
18            target_pkg_manifest=None, host_pkg_manifest=None):
19        super(OESDKTestContext, self).__init__(td, logger)
20
21        self.sdk_dir = sdk_dir
22        self.sdk_env = sdk_env
23        self.target_pkg_manifest = target_pkg_manifest
24        self.host_pkg_manifest = host_pkg_manifest
25
26        # match multilib according to sdk_env
27        self.multilib = ""
28        multilibs = self.td.get('MULTILIB_VARIANTS', '').split()
29        for ml in multilibs:
30            if ml in os.path.basename(self.sdk_env):
31                self.multilib = ml
32
33    def _hasPackage(self, manifest, pkg, regex=False):
34        if regex:
35            # do regex match
36            pat = re.compile(pkg)
37            for p in manifest.keys():
38                if pat.search(p):
39                    return True
40        else:
41            # do exact match
42            if pkg in manifest.keys():
43                return True
44        return False
45
46    def hasHostPackage(self, pkg, regex=False):
47        return self._hasPackage(self.host_pkg_manifest, pkg, regex=regex)
48
49    def hasTargetPackage(self, pkg, multilib=False, regex=False):
50        if multilib:
51            pkg = self.multilib + '-' + pkg
52        return self._hasPackage(self.target_pkg_manifest, pkg, regex=regex)
53
54class OESDKTestContextExecutor(OETestContextExecutor):
55    _context_class = OESDKTestContext
56
57    name = 'sdk'
58    help = 'sdk test component'
59    description = 'executes sdk tests'
60
61    default_cases = [os.path.join(os.path.abspath(os.path.dirname(__file__)),
62            'cases')]
63    default_test_data = None
64
65    def register_commands(self, logger, subparsers):
66        super(OESDKTestContextExecutor, self).register_commands(logger, subparsers)
67
68        sdk_group = self.parser.add_argument_group('sdk options')
69        sdk_group.add_argument('--sdk-env', action='store',
70            help='sdk environment')
71        sdk_group.add_argument('--target-manifest', action='store',
72            help='sdk target manifest')
73        sdk_group.add_argument('--host-manifest', action='store',
74            help='sdk host manifest')
75
76        sdk_dgroup = self.parser.add_argument_group('sdk display options')
77        sdk_dgroup.add_argument('--list-sdk-env', action='store_true',
78            default=False, help='sdk list available environment')
79
80        # XXX this option is required but argparse_oe has a bug handling
81        # required options, seems that don't keep track of already parsed
82        # options
83        sdk_rgroup = self.parser.add_argument_group('sdk required options')
84        sdk_rgroup.add_argument('--sdk-dir', required=False, action='store',
85            help='sdk installed directory')
86
87        self.parser.add_argument('-j', '--num-processes', dest='processes', action='store',
88                type=int, help="number of processes to execute in parallel with")
89
90    @staticmethod
91    def _load_manifest(manifest):
92        pkg_manifest = {}
93        if manifest:
94            with open(manifest) as f:
95                for line in f:
96                    (pkg, arch, version) = line.strip().split()
97                    pkg_manifest[pkg] = (version, arch)
98
99        return pkg_manifest
100
101    def _process_args(self, logger, args):
102        super(OESDKTestContextExecutor, self)._process_args(logger, args)
103
104        self.tc_kwargs['init']['sdk_dir'] = args.sdk_dir
105        self.tc_kwargs['init']['sdk_env'] = self.sdk_env
106        self.tc_kwargs['init']['target_pkg_manifest'] = \
107                OESDKTestContextExecutor._load_manifest(args.target_manifest)
108        self.tc_kwargs['init']['host_pkg_manifest'] = \
109                OESDKTestContextExecutor._load_manifest(args.host_manifest)
110        self.tc_kwargs['run']['processes'] = args.processes
111
112    @staticmethod
113    def _get_sdk_environs(sdk_dir):
114        sdk_env = {}
115
116        environ_pattern = sdk_dir + '/environment-setup-*'
117        full_sdk_env = glob.glob(sdk_dir + '/environment-setup-*')
118        for env in full_sdk_env:
119            m = re.search('environment-setup-(.*)', env)
120            if m:
121                sdk_env[m.group(1)] = env
122
123        return sdk_env
124
125    def _display_sdk_envs(self, log, args, sdk_envs):
126        log("Available SDK environments at directory %s:" \
127                % args.sdk_dir)
128        log("")
129        for env in sdk_envs:
130            log(env)
131
132    def run(self, logger, args):
133        import argparse_oe
134
135        if not args.sdk_dir:
136            raise argparse_oe.ArgumentUsageError("No SDK directory "\
137                   "specified please do, --sdk-dir SDK_DIR", self.name)
138
139        sdk_envs = OESDKTestContextExecutor._get_sdk_environs(args.sdk_dir)
140        if not sdk_envs:
141            raise argparse_oe.ArgumentUsageError("No available SDK "\
142                   "environments found at %s" % args.sdk_dir, self.name)
143
144        if args.list_sdk_env:
145            self._display_sdk_envs(logger.info, args, sdk_envs)
146            sys.exit(0)
147
148        if not args.sdk_env in sdk_envs:
149            self._display_sdk_envs(logger.error, args, sdk_envs)
150            raise argparse_oe.ArgumentUsageError("No valid SDK "\
151                   "environment (%s) specified" % args.sdk_env, self.name)
152
153        self.sdk_env = sdk_envs[args.sdk_env]
154        return super(OESDKTestContextExecutor, self).run(logger, args)
155
156_executor_class = OESDKTestContextExecutor
157