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