diff options
| -rw-r--r-- | meta/classes/testimage.bbclass | 78 | ||||
| -rw-r--r-- | meta/lib/oeqa/oetest.py | 74 |
2 files changed, 78 insertions, 74 deletions
diff --git a/meta/classes/testimage.bbclass b/meta/classes/testimage.bbclass index 3986340f46..3fe27a27db 100644 --- a/meta/classes/testimage.bbclass +++ b/meta/classes/testimage.bbclass | |||
| @@ -106,74 +106,6 @@ do_testsdk[nostamp] = "1" | |||
| 106 | do_testsdk[depends] += "${TESTIMAGEDEPENDS}" | 106 | do_testsdk[depends] += "${TESTIMAGEDEPENDS}" |
| 107 | do_testsdk[lockfiles] += "${TESTIMAGELOCK}" | 107 | do_testsdk[lockfiles] += "${TESTIMAGELOCK}" |
| 108 | 108 | ||
| 109 | # get testcase list from specified file | ||
| 110 | # if path is a relative path, then relative to build/conf/ | ||
| 111 | def read_testlist(d, fpath): | ||
| 112 | if not os.path.isabs(fpath): | ||
| 113 | builddir = d.getVar("TOPDIR", True) | ||
| 114 | fpath = os.path.join(builddir, "conf", fpath) | ||
| 115 | if not os.path.exists(fpath): | ||
| 116 | bb.fatal("No such manifest file: ", fpath) | ||
| 117 | tcs = [] | ||
| 118 | for line in open(fpath).readlines(): | ||
| 119 | line = line.strip() | ||
| 120 | if line and not line.startswith("#"): | ||
| 121 | tcs.append(line) | ||
| 122 | return " ".join(tcs) | ||
| 123 | |||
| 124 | def get_tests_list(d, type="runtime"): | ||
| 125 | testsuites = [] | ||
| 126 | testslist = [] | ||
| 127 | manifests = d.getVar("TEST_SUITES_MANIFEST", True) | ||
| 128 | if manifests is not None: | ||
| 129 | manifests = manifests.split() | ||
| 130 | for manifest in manifests: | ||
| 131 | testsuites.extend(read_testlist(d, manifest).split()) | ||
| 132 | else: | ||
| 133 | testsuites = d.getVar("TEST_SUITES", True).split() | ||
| 134 | if type == "sdk": | ||
| 135 | testsuites = (d.getVar("TEST_SUITES_SDK", True) or "auto").split() | ||
| 136 | bbpath = d.getVar("BBPATH", True).split(':') | ||
| 137 | |||
| 138 | # This relies on lib/ under each directory in BBPATH being added to sys.path | ||
| 139 | # (as done by default in base.bbclass) | ||
| 140 | for testname in testsuites: | ||
| 141 | if testname != "auto": | ||
| 142 | if testname.startswith("oeqa."): | ||
| 143 | testslist.append(testname) | ||
| 144 | continue | ||
| 145 | found = False | ||
| 146 | for p in bbpath: | ||
| 147 | if os.path.exists(os.path.join(p, 'lib', 'oeqa', type, testname + '.py')): | ||
| 148 | testslist.append("oeqa." + type + "." + testname) | ||
| 149 | found = True | ||
| 150 | break | ||
| 151 | elif os.path.exists(os.path.join(p, 'lib', 'oeqa', type, testname.split(".")[0] + '.py')): | ||
| 152 | testslist.append("oeqa." + type + "." + testname) | ||
| 153 | found = True | ||
| 154 | break | ||
| 155 | if not found: | ||
| 156 | bb.fatal('Test %s specified in TEST_SUITES could not be found in lib/oeqa/runtime under BBPATH' % testname) | ||
| 157 | |||
| 158 | if "auto" in testsuites: | ||
| 159 | def add_auto_list(path): | ||
| 160 | if not os.path.exists(os.path.join(path, '__init__.py')): | ||
| 161 | bb.fatal('Tests directory %s exists but is missing __init__.py' % path) | ||
| 162 | files = sorted([f for f in os.listdir(path) if f.endswith('.py') and not f.startswith('_')]) | ||
| 163 | for f in files: | ||
| 164 | module = 'oeqa.' + type + '.' + f[:-3] | ||
| 165 | if module not in testslist: | ||
| 166 | testslist.append(module) | ||
| 167 | |||
| 168 | for p in bbpath: | ||
| 169 | testpath = os.path.join(p, 'lib', 'oeqa', type) | ||
| 170 | bb.debug(2, 'Searching for tests in %s' % testpath) | ||
| 171 | if os.path.exists(testpath): | ||
| 172 | add_auto_list(testpath) | ||
| 173 | |||
| 174 | return testslist | ||
| 175 | |||
| 176 | |||
| 177 | def exportTests(d,tc): | 109 | def exportTests(d,tc): |
| 178 | import json | 110 | import json |
| 179 | import shutil | 111 | import shutil |
| @@ -272,7 +204,7 @@ def testimage_main(d): | |||
| 272 | import oeqa.runtime | 204 | import oeqa.runtime |
| 273 | import time | 205 | import time |
| 274 | import signal | 206 | import signal |
| 275 | from oeqa.oetest import loadTests, runTests | 207 | from oeqa.oetest import loadTests, runTests, get_test_suites, get_tests_list |
| 276 | from oeqa.targetcontrol import get_target_controller | 208 | from oeqa.targetcontrol import get_target_controller |
| 277 | from oeqa.utils.dump import get_host_dumper | 209 | from oeqa.utils.dump import get_host_dumper |
| 278 | 210 | ||
| @@ -286,7 +218,7 @@ def testimage_main(d): | |||
| 286 | # tests in TEST_SUITES become required tests | 218 | # tests in TEST_SUITES become required tests |
| 287 | # they won't be skipped even if they aren't suitable for a image (like xorg for minimal) | 219 | # they won't be skipped even if they aren't suitable for a image (like xorg for minimal) |
| 288 | # testslist is what we'll actually pass to the unittest loader | 220 | # testslist is what we'll actually pass to the unittest loader |
| 289 | testslist = get_tests_list(d) | 221 | testslist = get_tests_list(get_test_suites(d), d.getVar("BBPATH", True).split(':')) |
| 290 | testsrequired = [t for t in d.getVar("TEST_SUITES", True).split() if t != "auto"] | 222 | testsrequired = [t for t in d.getVar("TEST_SUITES", True).split() if t != "auto"] |
| 291 | 223 | ||
| 292 | tagexp = d.getVar("TEST_SUITES_TAGS", True) | 224 | tagexp = d.getVar("TEST_SUITES_TAGS", True) |
| @@ -368,7 +300,6 @@ def testimage_main(d): | |||
| 368 | 300 | ||
| 369 | testimage_main[vardepsexclude] =+ "BB_ORIGENV" | 301 | testimage_main[vardepsexclude] =+ "BB_ORIGENV" |
| 370 | 302 | ||
| 371 | |||
| 372 | def testsdk_main(d): | 303 | def testsdk_main(d): |
| 373 | import unittest | 304 | import unittest |
| 374 | import os | 305 | import os |
| @@ -377,7 +308,7 @@ def testsdk_main(d): | |||
| 377 | import oeqa.sdk | 308 | import oeqa.sdk |
| 378 | import time | 309 | import time |
| 379 | import subprocess | 310 | import subprocess |
| 380 | from oeqa.oetest import loadTests, runTests | 311 | from oeqa.oetest import loadTests, runTests, get_test_suites, get_tests_list |
| 381 | 312 | ||
| 382 | pn = d.getVar("PN", True) | 313 | pn = d.getVar("PN", True) |
| 383 | bb.utils.mkdirhier(d.getVar("TEST_LOG_DIR", True)) | 314 | bb.utils.mkdirhier(d.getVar("TEST_LOG_DIR", True)) |
| @@ -385,7 +316,7 @@ def testsdk_main(d): | |||
| 385 | # tests in TEST_SUITES become required tests | 316 | # tests in TEST_SUITES become required tests |
| 386 | # they won't be skipped even if they aren't suitable. | 317 | # they won't be skipped even if they aren't suitable. |
| 387 | # testslist is what we'll actually pass to the unittest loader | 318 | # testslist is what we'll actually pass to the unittest loader |
| 388 | testslist = get_tests_list(d, "sdk") | 319 | testslist = get_tests_list(get_test_suites(d, "sdk"), d.getVar("BBPATH", True).split(':'), "sdk") |
| 389 | testsrequired = [t for t in (d.getVar("TEST_SUITES_SDK", True) or "auto").split() if t != "auto"] | 320 | testsrequired = [t for t in (d.getVar("TEST_SUITES_SDK", True) or "auto").split() if t != "auto"] |
| 390 | 321 | ||
| 391 | tcname = d.expand("${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.sh") | 322 | tcname = d.expand("${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.sh") |
| @@ -457,4 +388,3 @@ def testsdk_main(d): | |||
| 457 | bb.utils.remove(sdktestdir, True) | 388 | bb.utils.remove(sdktestdir, True) |
| 458 | 389 | ||
| 459 | testsdk_main[vardepsexclude] =+ "BB_ORIGENV" | 390 | testsdk_main[vardepsexclude] =+ "BB_ORIGENV" |
| 460 | |||
diff --git a/meta/lib/oeqa/oetest.py b/meta/lib/oeqa/oetest.py index 6f9edec58d..18b2209656 100644 --- a/meta/lib/oeqa/oetest.py +++ b/meta/lib/oeqa/oetest.py | |||
| @@ -250,3 +250,77 @@ def skipModuleUnless(cond, reason): | |||
| 250 | 250 | ||
| 251 | if not cond: | 251 | if not cond: |
| 252 | skipModule(reason, 3) | 252 | skipModule(reason, 3) |
| 253 | |||
| 254 | # get testcase list from specified file | ||
| 255 | # if path is a relative path, then relative to build/conf/ | ||
| 256 | def read_testlist(fpath, builddir): | ||
| 257 | if not os.path.isabs(fpath): | ||
| 258 | fpath = os.path.join(builddir, "conf", fpath) | ||
| 259 | if not os.path.exists(fpath): | ||
| 260 | bb.fatal("No such manifest file: ", fpath) | ||
| 261 | tcs = [] | ||
| 262 | for line in open(fpath).readlines(): | ||
| 263 | line = line.strip() | ||
| 264 | if line and not line.startswith("#"): | ||
| 265 | tcs.append(line) | ||
| 266 | return " ".join(tcs) | ||
| 267 | |||
| 268 | # get test suites, returns test suites based on d variables | ||
| 269 | def get_test_suites(d, type='runtime'): | ||
| 270 | testsuites = [] | ||
| 271 | |||
| 272 | if type == "sdk": | ||
| 273 | testsuites = (d.getVar("TEST_SUITES_SDK", True) or "auto").split() | ||
| 274 | else: | ||
| 275 | manifests = (d.getVar("TEST_SUITES_MANIFEST", True) or '').split() | ||
| 276 | if manifests: | ||
| 277 | for manifest in manifests: | ||
| 278 | testsuites.extend(read_testlist(manifest, | ||
| 279 | d.getVar("TOPDIR", True)).split()) | ||
| 280 | |||
| 281 | else: | ||
| 282 | testsuites = d.getVar("TEST_SUITES", True).split() | ||
| 283 | |||
| 284 | return testsuites | ||
| 285 | |||
| 286 | # return test list by type also filter if TEST_SUITES is specified | ||
| 287 | def get_tests_list(testsuites, bbpath, type="runtime"): | ||
| 288 | testslist = [] | ||
| 289 | |||
| 290 | # This relies on lib/ under each directory in BBPATH being added to sys.path | ||
| 291 | # (as done by default in base.bbclass) | ||
| 292 | for testname in testsuites: | ||
| 293 | if testname != "auto": | ||
| 294 | if testname.startswith("oeqa."): | ||
| 295 | testslist.append(testname) | ||
| 296 | continue | ||
| 297 | found = False | ||
| 298 | for p in bbpath: | ||
| 299 | if os.path.exists(os.path.join(p, 'lib', 'oeqa', type, testname + '.py')): | ||
| 300 | testslist.append("oeqa." + type + "." + testname) | ||
| 301 | found = True | ||
| 302 | break | ||
| 303 | elif os.path.exists(os.path.join(p, 'lib', 'oeqa', type, testname.split(".")[0] + '.py')): | ||
| 304 | testslist.append("oeqa." + type + "." + testname) | ||
| 305 | found = True | ||
| 306 | break | ||
| 307 | if not found: | ||
| 308 | bb.fatal('Test %s specified in TEST_SUITES could not be found in lib/oeqa/runtime under BBPATH' % testname) | ||
| 309 | |||
| 310 | if "auto" in testsuites: | ||
| 311 | def add_auto_list(path): | ||
| 312 | if not os.path.exists(os.path.join(path, '__init__.py')): | ||
| 313 | bb.fatal('Tests directory %s exists but is missing __init__.py' % path) | ||
| 314 | files = sorted([f for f in os.listdir(path) if f.endswith('.py') and not f.startswith('_')]) | ||
| 315 | for f in files: | ||
| 316 | module = 'oeqa.' + type + '.' + f[:-3] | ||
| 317 | if module not in testslist: | ||
| 318 | testslist.append(module) | ||
| 319 | |||
| 320 | for p in bbpath: | ||
| 321 | testpath = os.path.join(p, 'lib', 'oeqa', type) | ||
| 322 | bb.debug(2, 'Searching for tests in %s' % testpath) | ||
| 323 | if os.path.exists(testpath): | ||
| 324 | add_auto_list(testpath) | ||
| 325 | |||
| 326 | return testslist | ||
