Complete Yocto mirror with license table for TQMa6UL (2038-compliance)
- 264 license table entries with exact download URLs (224/264 resolved) - Complete sources/ directory with all BitBake recipes - Build configuration: tqma6ul-multi-mba6ulx, spaetzle (musl) - Full traceability for Softwarefreigabeantrag - GCC 13.4.0, Linux 6.6.102, U-Boot 2023.04, musl 1.2.4 - License distribution: GPL-2.0 (24), MIT (23), GPL-2.0+ (18), BSD-3 (16)
This commit is contained in:
157
sources/poky/meta/lib/oeqa/selftest/cases/oelib/buildhistory.py
Normal file
157
sources/poky/meta/lib/oeqa/selftest/cases/oelib/buildhistory.py
Normal file
@@ -0,0 +1,157 @@
|
||||
#
|
||||
# Copyright OpenEmbedded Contributors
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
#
|
||||
|
||||
import os
|
||||
import sys
|
||||
from oeqa.selftest.case import OESelftestTestCase
|
||||
import tempfile
|
||||
import operator
|
||||
from oeqa.utils.commands import get_bb_var
|
||||
|
||||
class TestBlobParsing(OESelftestTestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.repo_path = tempfile.mkdtemp(prefix='selftest-buildhistory',
|
||||
dir=get_bb_var('TOPDIR'))
|
||||
|
||||
try:
|
||||
from git import Repo
|
||||
self.repo = Repo.init(self.repo_path)
|
||||
except ImportError as e:
|
||||
self.skipTest('Python module GitPython is not present (%s) (%s)' % (e, sys.path))
|
||||
|
||||
self.test_file = "test"
|
||||
self.var_map = {}
|
||||
|
||||
def tearDown(self):
|
||||
import shutil
|
||||
shutil.rmtree(self.repo_path)
|
||||
|
||||
@property
|
||||
def heads_default(self):
|
||||
"""
|
||||
Support repos defaulting to master or to main branch
|
||||
"""
|
||||
try:
|
||||
return self.repo.heads.main
|
||||
except AttributeError:
|
||||
return self.repo.heads.master
|
||||
|
||||
def commit_vars(self, to_add={}, to_remove = [], msg="A commit message"):
|
||||
if len(to_add) == 0 and len(to_remove) == 0:
|
||||
return
|
||||
|
||||
for k in to_remove:
|
||||
self.var_map.pop(x,None)
|
||||
for k in to_add:
|
||||
self.var_map[k] = to_add[k]
|
||||
|
||||
with open(os.path.join(self.repo_path, self.test_file), 'w') as repo_file:
|
||||
for k in self.var_map:
|
||||
repo_file.write("%s = %s\n" % (k, self.var_map[k]))
|
||||
|
||||
self.repo.git.add("--all")
|
||||
self.repo.git.commit(message=msg)
|
||||
|
||||
def test_blob_to_dict(self):
|
||||
"""
|
||||
Test conversion of git blobs to dictionary
|
||||
"""
|
||||
from oe.buildhistory_analysis import blob_to_dict
|
||||
valuesmap = { "foo" : "1", "bar" : "2" }
|
||||
self.commit_vars(to_add = valuesmap)
|
||||
|
||||
blob = self.repo.head.commit.tree.blobs[0]
|
||||
self.assertEqual(valuesmap, blob_to_dict(blob),
|
||||
"commit was not translated correctly to dictionary")
|
||||
|
||||
def test_compare_dict_blobs(self):
|
||||
"""
|
||||
Test comparisson of dictionaries extracted from git blobs
|
||||
"""
|
||||
from oe.buildhistory_analysis import compare_dict_blobs
|
||||
|
||||
changesmap = { "foo-2" : ("2", "8"), "bar" : ("","4"), "bar-2" : ("","5")}
|
||||
|
||||
self.commit_vars(to_add = { "foo" : "1", "foo-2" : "2", "foo-3" : "3" })
|
||||
blob1 = self.heads_default.commit.tree.blobs[0]
|
||||
|
||||
self.commit_vars(to_add = { "foo-2" : "8", "bar" : "4", "bar-2" : "5" })
|
||||
blob2 = self.heads_default.commit.tree.blobs[0]
|
||||
|
||||
change_records = compare_dict_blobs(os.path.join(self.repo_path, self.test_file),
|
||||
blob1, blob2, False, False)
|
||||
|
||||
var_changes = { x.fieldname : (x.oldvalue, x.newvalue) for x in change_records}
|
||||
self.assertEqual(changesmap, var_changes, "Changes not reported correctly")
|
||||
|
||||
def test_compare_dict_blobs_default(self):
|
||||
"""
|
||||
Test default values for comparisson of git blob dictionaries
|
||||
"""
|
||||
from oe.buildhistory_analysis import compare_dict_blobs
|
||||
defaultmap = { x : ("default", "1") for x in ["PKG", "PKGE", "PKGV", "PKGR"]}
|
||||
|
||||
self.commit_vars(to_add = { "foo" : "1" })
|
||||
blob1 = self.heads_default.commit.tree.blobs[0]
|
||||
|
||||
self.commit_vars(to_add = { "PKG" : "1", "PKGE" : "1", "PKGV" : "1", "PKGR" : "1" })
|
||||
blob2 = self.heads_default.commit.tree.blobs[0]
|
||||
|
||||
change_records = compare_dict_blobs(os.path.join(self.repo_path, self.test_file),
|
||||
blob1, blob2, False, False)
|
||||
|
||||
var_changes = {}
|
||||
for x in change_records:
|
||||
oldvalue = "default" if ("default" in x.oldvalue) else x.oldvalue
|
||||
var_changes[x.fieldname] = (oldvalue, x.newvalue)
|
||||
|
||||
self.assertEqual(defaultmap, var_changes, "Defaults not set properly")
|
||||
|
||||
class TestFileListCompare(OESelftestTestCase):
|
||||
|
||||
def test_compare_file_lists(self):
|
||||
# Test that a directory tree that moves location such as /lib/modules/5.4.40-yocto-standard -> /lib/modules/5.4.43-yocto-standard
|
||||
# is correctly identified as a move
|
||||
from oe.buildhistory_analysis import compare_file_lists, FileChange
|
||||
|
||||
with open(self.tc.files_dir + "/buildhistory_filelist1.txt", "r") as f:
|
||||
filelist1 = f.readlines()
|
||||
with open(self.tc.files_dir + "/buildhistory_filelist2.txt", "r") as f:
|
||||
filelist2 = f.readlines()
|
||||
|
||||
expectedResult = [
|
||||
'/lib/libcap.so.2 changed symlink target from libcap.so.2.33 to libcap.so.2.34',
|
||||
'/lib/libcap.so.2.33 moved to /lib/libcap.so.2.34',
|
||||
'/lib/modules/5.4.40-yocto-standard moved to /lib/modules/5.4.43-yocto-standard',
|
||||
'/lib/modules/5.4.43-yocto-standard/modules.builtin.alias.bin was added',
|
||||
'/usr/bin/gawk-5.0.1 moved to /usr/bin/gawk-5.1.0',
|
||||
'/usr/lib/libbtrfsutil.so changed symlink target from libbtrfsutil.so.1.1.1 to libbtrfsutil.so.1.2.0',
|
||||
'/usr/lib/libbtrfsutil.so.1 changed symlink target from libbtrfsutil.so.1.1.1 to libbtrfsutil.so.1.2.0',
|
||||
'/usr/lib/libbtrfsutil.so.1.1.1 moved to /usr/lib/libbtrfsutil.so.1.2.0',
|
||||
'/usr/lib/libkmod.so changed symlink target from libkmod.so.2.3.4 to libkmod.so.2.3.5',
|
||||
'/usr/lib/libkmod.so.2 changed symlink target from libkmod.so.2.3.4 to libkmod.so.2.3.5',
|
||||
'/usr/lib/libkmod.so.2.3.4 moved to /usr/lib/libkmod.so.2.3.5',
|
||||
'/usr/lib/libpixman-1.so.0 changed symlink target from libpixman-1.so.0.38.4 to libpixman-1.so.0.40.0',
|
||||
'/usr/lib/libpixman-1.so.0.38.4 moved to /usr/lib/libpixman-1.so.0.40.0',
|
||||
'/usr/lib/opkg/alternatives/rtcwake was added',
|
||||
'/usr/lib/python3.8/site-packages/PyGObject-3.34.0.egg-info moved to /usr/lib/python3.8/site-packages/PyGObject-3.36.1.egg-info',
|
||||
'/usr/lib/python3.8/site-packages/btrfsutil-1.1.1-py3.8.egg-info moved to /usr/lib/python3.8/site-packages/btrfsutil-1.2.0-py3.8.egg-info',
|
||||
'/usr/lib/python3.8/site-packages/pycairo-1.19.0.egg-info moved to /usr/lib/python3.8/site-packages/pycairo-1.19.1.egg-info',
|
||||
'/usr/sbin/rtcwake changed type from file to symlink',
|
||||
'/usr/sbin/rtcwake changed permissions from rwxr-xr-x to rwxrwxrwx',
|
||||
'/usr/sbin/rtcwake changed symlink target from None to /usr/sbin/rtcwake.util-linux',
|
||||
'/usr/sbin/rtcwake.util-linux was added'
|
||||
]
|
||||
|
||||
result = compare_file_lists(filelist1, filelist2)
|
||||
rendered = []
|
||||
for entry in sorted(result, key=operator.attrgetter("path")):
|
||||
rendered.append(str(entry))
|
||||
|
||||
self.maxDiff = None
|
||||
self.assertCountEqual(rendered, expectedResult)
|
||||
|
||||
28
sources/poky/meta/lib/oeqa/selftest/cases/oelib/elf.py
Normal file
28
sources/poky/meta/lib/oeqa/selftest/cases/oelib/elf.py
Normal file
@@ -0,0 +1,28 @@
|
||||
#
|
||||
# Copyright OpenEmbedded Contributors
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
#
|
||||
|
||||
from unittest.case import TestCase
|
||||
import oe.qa
|
||||
|
||||
class TestElf(TestCase):
|
||||
def test_machine_name(self):
|
||||
"""
|
||||
Test elf_machine_to_string()
|
||||
"""
|
||||
self.assertEqual(oe.qa.elf_machine_to_string(0x02), "SPARC")
|
||||
self.assertEqual(oe.qa.elf_machine_to_string(0x03), "x86")
|
||||
self.assertEqual(oe.qa.elf_machine_to_string(0x08), "MIPS")
|
||||
self.assertEqual(oe.qa.elf_machine_to_string(0x14), "PowerPC")
|
||||
self.assertEqual(oe.qa.elf_machine_to_string(0x28), "ARM")
|
||||
self.assertEqual(oe.qa.elf_machine_to_string(0x2A), "SuperH")
|
||||
self.assertEqual(oe.qa.elf_machine_to_string(0x32), "IA-64")
|
||||
self.assertEqual(oe.qa.elf_machine_to_string(0x3E), "x86-64")
|
||||
self.assertEqual(oe.qa.elf_machine_to_string(0xB7), "AArch64")
|
||||
self.assertEqual(oe.qa.elf_machine_to_string(0xF7), "BPF")
|
||||
|
||||
self.assertEqual(oe.qa.elf_machine_to_string(0x00), "Unset")
|
||||
self.assertEqual(oe.qa.elf_machine_to_string(0xDEADBEEF), "Unknown (3735928559)")
|
||||
self.assertEqual(oe.qa.elf_machine_to_string("foobar"), "Unknown ('foobar')")
|
||||
105
sources/poky/meta/lib/oeqa/selftest/cases/oelib/license.py
Normal file
105
sources/poky/meta/lib/oeqa/selftest/cases/oelib/license.py
Normal file
@@ -0,0 +1,105 @@
|
||||
#
|
||||
# Copyright OpenEmbedded Contributors
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
#
|
||||
|
||||
from unittest.case import TestCase
|
||||
import oe.license
|
||||
|
||||
class SeenVisitor(oe.license.LicenseVisitor):
|
||||
def __init__(self):
|
||||
self.seen = []
|
||||
oe.license.LicenseVisitor.__init__(self)
|
||||
|
||||
def visit_Str(self, node):
|
||||
self.seen.append(node.s)
|
||||
|
||||
class TestSingleLicense(TestCase):
|
||||
licenses = [
|
||||
"GPL-2.0-only",
|
||||
"LGPL-2.0-only",
|
||||
"Artistic-1.0",
|
||||
"MIT",
|
||||
"GPL-3.0-or-later",
|
||||
"FOO_BAR",
|
||||
]
|
||||
invalid_licenses = ["GPL/BSD"]
|
||||
|
||||
@staticmethod
|
||||
def parse(licensestr):
|
||||
visitor = SeenVisitor()
|
||||
visitor.visit_string(licensestr)
|
||||
return visitor.seen
|
||||
|
||||
def test_single_licenses(self):
|
||||
for license in self.licenses:
|
||||
licenses = self.parse(license)
|
||||
self.assertListEqual(licenses, [license])
|
||||
|
||||
def test_invalid_licenses(self):
|
||||
for license in self.invalid_licenses:
|
||||
with self.assertRaises(oe.license.InvalidLicense) as cm:
|
||||
self.parse(license)
|
||||
self.assertEqual(cm.exception.license, license)
|
||||
|
||||
class TestSimpleCombinations(TestCase):
|
||||
tests = {
|
||||
"FOO&BAR": ["FOO", "BAR"],
|
||||
"BAZ & MOO": ["BAZ", "MOO"],
|
||||
"ALPHA|BETA": ["ALPHA"],
|
||||
"BAZ&MOO|FOO": ["FOO"],
|
||||
"FOO&BAR|BAZ": ["FOO", "BAR"],
|
||||
}
|
||||
preferred = ["ALPHA", "FOO", "BAR"]
|
||||
|
||||
def test_tests(self):
|
||||
def choose(a, b):
|
||||
if all(lic in self.preferred for lic in b):
|
||||
return b
|
||||
else:
|
||||
return a
|
||||
|
||||
for license, expected in self.tests.items():
|
||||
licenses = oe.license.flattened_licenses(license, choose)
|
||||
self.assertListEqual(licenses, expected)
|
||||
|
||||
class TestComplexCombinations(TestSimpleCombinations):
|
||||
tests = {
|
||||
"FOO & (BAR | BAZ)&MOO": ["FOO", "BAR", "MOO"],
|
||||
"(ALPHA|(BETA&THETA)|OMEGA)&DELTA": ["OMEGA", "DELTA"],
|
||||
"((ALPHA|BETA)&FOO)|BAZ": ["BETA", "FOO"],
|
||||
"(GPL-2.0-only|Proprietary)&BSD-4-clause&MIT": ["GPL-2.0-only", "BSD-4-clause", "MIT"],
|
||||
}
|
||||
preferred = ["BAR", "OMEGA", "BETA", "GPL-2.0-only"]
|
||||
|
||||
class TestIsIncluded(TestCase):
|
||||
tests = {
|
||||
("FOO | BAR", None, None):
|
||||
[True, ["FOO"]],
|
||||
("FOO | BAR", None, "FOO"):
|
||||
[True, ["BAR"]],
|
||||
("FOO | BAR", "BAR", None):
|
||||
[True, ["BAR"]],
|
||||
("FOO | BAR & FOOBAR", "*BAR", None):
|
||||
[True, ["BAR", "FOOBAR"]],
|
||||
("FOO | BAR & FOOBAR", None, "FOO*"):
|
||||
[False, ["FOOBAR"]],
|
||||
("(FOO | BAR) & FOOBAR | BARFOO", None, "FOO"):
|
||||
[True, ["BAR", "FOOBAR"]],
|
||||
("(FOO | BAR) & FOOBAR | BAZ & MOO & BARFOO", None, "FOO"):
|
||||
[True, ["BAZ", "MOO", "BARFOO"]],
|
||||
("GPL-3.0-or-later & GPL-2.0-only & LGPL-2.1-only | Proprietary", None, None):
|
||||
[True, ["GPL-3.0-or-later", "GPL-2.0-only", "LGPL-2.1-only"]],
|
||||
("GPL-3.0-or-later & GPL-2.0-only & LGPL-2.1-only | Proprietary", None, "GPL-3.0-or-later"):
|
||||
[True, ["Proprietary"]],
|
||||
("GPL-3.0-or-later & GPL-2.0-only & LGPL-2.1-only | Proprietary", None, "GPL-3.0-or-later Proprietary"):
|
||||
[False, ["GPL-3.0-or-later"]]
|
||||
}
|
||||
|
||||
def test_tests(self):
|
||||
for args, expected in self.tests.items():
|
||||
is_included, licenses = oe.license.is_included(
|
||||
args[0], (args[1] or '').split(), (args[2] or '').split())
|
||||
self.assertEqual(is_included, expected[0])
|
||||
self.assertListEqual(licenses, expected[1])
|
||||
91
sources/poky/meta/lib/oeqa/selftest/cases/oelib/path.py
Normal file
91
sources/poky/meta/lib/oeqa/selftest/cases/oelib/path.py
Normal file
@@ -0,0 +1,91 @@
|
||||
#
|
||||
# Copyright OpenEmbedded Contributors
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
#
|
||||
|
||||
from unittest.case import TestCase
|
||||
import oe, oe.path
|
||||
import tempfile
|
||||
import os
|
||||
import errno
|
||||
import shutil
|
||||
|
||||
class TestRealPath(TestCase):
|
||||
DIRS = [ "a", "b", "etc", "sbin", "usr", "usr/bin", "usr/binX", "usr/sbin", "usr/include", "usr/include/gdbm" ]
|
||||
FILES = [ "etc/passwd", "b/file" ]
|
||||
LINKS = [
|
||||
( "bin", "/usr/bin", "/usr/bin" ),
|
||||
( "binX", "usr/binX", "/usr/binX" ),
|
||||
( "c", "broken", "/broken" ),
|
||||
( "etc/passwd-1", "passwd", "/etc/passwd" ),
|
||||
( "etc/passwd-2", "passwd-1", "/etc/passwd" ),
|
||||
( "etc/passwd-3", "/etc/passwd-1", "/etc/passwd" ),
|
||||
( "etc/shadow-1", "/etc/shadow", "/etc/shadow" ),
|
||||
( "etc/shadow-2", "/etc/shadow-1", "/etc/shadow" ),
|
||||
( "prog-A", "bin/prog-A", "/usr/bin/prog-A" ),
|
||||
( "prog-B", "/bin/prog-B", "/usr/bin/prog-B" ),
|
||||
( "usr/bin/prog-C", "../../sbin/prog-C", "/sbin/prog-C" ),
|
||||
( "usr/bin/prog-D", "/sbin/prog-D", "/sbin/prog-D" ),
|
||||
( "usr/binX/prog-E", "../sbin/prog-E", None ),
|
||||
( "usr/bin/prog-F", "../../../sbin/prog-F", "/sbin/prog-F" ),
|
||||
( "loop", "a/loop", None ),
|
||||
( "a/loop", "../loop", None ),
|
||||
( "b/test", "file/foo", "/b/file/foo" ),
|
||||
]
|
||||
|
||||
LINKS_PHYS = [
|
||||
( "./", "/", "" ),
|
||||
( "binX/prog-E", "/usr/sbin/prog-E", "/sbin/prog-E" ),
|
||||
]
|
||||
|
||||
EXCEPTIONS = [
|
||||
( "loop", errno.ELOOP ),
|
||||
( "b/test", errno.ENOENT ),
|
||||
]
|
||||
|
||||
def setUp(self):
|
||||
self.tmpdir = tempfile.mkdtemp(prefix = "oe-test_path")
|
||||
self.root = os.path.join(self.tmpdir, "R")
|
||||
|
||||
os.mkdir(os.path.join(self.tmpdir, "_real"))
|
||||
os.symlink("_real", self.root)
|
||||
|
||||
for d in self.DIRS:
|
||||
os.mkdir(os.path.join(self.root, d))
|
||||
for f in self.FILES:
|
||||
open(os.path.join(self.root, f), "w")
|
||||
for l in self.LINKS:
|
||||
os.symlink(l[1], os.path.join(self.root, l[0]))
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.tmpdir)
|
||||
|
||||
def __realpath(self, file, use_physdir, assume_dir = True):
|
||||
return oe.path.realpath(os.path.join(self.root, file), self.root,
|
||||
use_physdir, assume_dir = assume_dir)
|
||||
|
||||
def test_norm(self):
|
||||
for l in self.LINKS:
|
||||
if l[2] == None:
|
||||
continue
|
||||
|
||||
target_p = self.__realpath(l[0], True)
|
||||
target_l = self.__realpath(l[0], False)
|
||||
|
||||
if l[2] != False:
|
||||
self.assertEqual(target_p, target_l)
|
||||
self.assertEqual(l[2], target_p[len(self.root):])
|
||||
|
||||
def test_phys(self):
|
||||
for l in self.LINKS_PHYS:
|
||||
target_p = self.__realpath(l[0], True)
|
||||
target_l = self.__realpath(l[0], False)
|
||||
|
||||
self.assertEqual(l[1], target_p[len(self.root):])
|
||||
self.assertEqual(l[2], target_l[len(self.root):])
|
||||
|
||||
def test_loop(self):
|
||||
for e in self.EXCEPTIONS:
|
||||
self.assertRaisesRegex(OSError, r'\[Errno %u\]' % e[1],
|
||||
self.__realpath, e[0], False, False)
|
||||
56
sources/poky/meta/lib/oeqa/selftest/cases/oelib/types.py
Normal file
56
sources/poky/meta/lib/oeqa/selftest/cases/oelib/types.py
Normal file
@@ -0,0 +1,56 @@
|
||||
#
|
||||
# Copyright OpenEmbedded Contributors
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
#
|
||||
|
||||
from unittest.case import TestCase
|
||||
from oe.maketype import create
|
||||
|
||||
class TestBooleanType(TestCase):
|
||||
def test_invalid(self):
|
||||
self.assertRaises(ValueError, create, '', 'boolean')
|
||||
self.assertRaises(ValueError, create, 'foo', 'boolean')
|
||||
self.assertRaises(TypeError, create, object(), 'boolean')
|
||||
|
||||
def test_true(self):
|
||||
self.assertTrue(create('y', 'boolean'))
|
||||
self.assertTrue(create('yes', 'boolean'))
|
||||
self.assertTrue(create('1', 'boolean'))
|
||||
self.assertTrue(create('t', 'boolean'))
|
||||
self.assertTrue(create('true', 'boolean'))
|
||||
self.assertTrue(create('TRUE', 'boolean'))
|
||||
self.assertTrue(create('truE', 'boolean'))
|
||||
|
||||
def test_false(self):
|
||||
self.assertFalse(create('n', 'boolean'))
|
||||
self.assertFalse(create('no', 'boolean'))
|
||||
self.assertFalse(create('0', 'boolean'))
|
||||
self.assertFalse(create('f', 'boolean'))
|
||||
self.assertFalse(create('false', 'boolean'))
|
||||
self.assertFalse(create('FALSE', 'boolean'))
|
||||
self.assertFalse(create('faLse', 'boolean'))
|
||||
|
||||
def test_bool_equality(self):
|
||||
self.assertEqual(create('n', 'boolean'), False)
|
||||
self.assertNotEqual(create('n', 'boolean'), True)
|
||||
self.assertEqual(create('y', 'boolean'), True)
|
||||
self.assertNotEqual(create('y', 'boolean'), False)
|
||||
|
||||
class TestList(TestCase):
|
||||
def assertListEqual(self, value, valid, sep=None):
|
||||
obj = create(value, 'list', separator=sep)
|
||||
self.assertEqual(obj, valid)
|
||||
if sep is not None:
|
||||
self.assertEqual(obj.separator, sep)
|
||||
self.assertEqual(str(obj), obj.separator.join(obj))
|
||||
|
||||
def test_list_nosep(self):
|
||||
testlist = ['alpha', 'beta', 'theta']
|
||||
self.assertListEqual('alpha beta theta', testlist)
|
||||
self.assertListEqual('alpha beta\ttheta', testlist)
|
||||
self.assertListEqual('alpha', ['alpha'])
|
||||
|
||||
def test_list_usersep(self):
|
||||
self.assertListEqual('foo:bar', ['foo', 'bar'], ':')
|
||||
self.assertListEqual('foo:bar:baz', ['foo', 'bar', 'baz'], ':')
|
||||
104
sources/poky/meta/lib/oeqa/selftest/cases/oelib/utils.py
Normal file
104
sources/poky/meta/lib/oeqa/selftest/cases/oelib/utils.py
Normal file
@@ -0,0 +1,104 @@
|
||||
#
|
||||
# Copyright OpenEmbedded Contributors
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
#
|
||||
|
||||
import sys
|
||||
from unittest.case import TestCase
|
||||
from contextlib import contextmanager
|
||||
from io import StringIO
|
||||
from oe.utils import packages_filter_out_system, trim_version, multiprocess_launch
|
||||
|
||||
class TestPackagesFilterOutSystem(TestCase):
|
||||
def test_filter(self):
|
||||
"""
|
||||
Test that oe.utils.packages_filter_out_system works.
|
||||
"""
|
||||
try:
|
||||
import bb
|
||||
except ImportError:
|
||||
self.skipTest("Cannot import bb")
|
||||
|
||||
d = bb.data_smart.DataSmart()
|
||||
d.setVar("PN", "foo")
|
||||
|
||||
d.setVar("PACKAGES", "foo foo-doc foo-dev")
|
||||
pkgs = packages_filter_out_system(d)
|
||||
self.assertEqual(pkgs, [])
|
||||
|
||||
d.setVar("PACKAGES", "foo foo-doc foo-data foo-dev")
|
||||
pkgs = packages_filter_out_system(d)
|
||||
self.assertEqual(pkgs, ["foo-data"])
|
||||
|
||||
d.setVar("PACKAGES", "foo foo-locale-en-gb")
|
||||
pkgs = packages_filter_out_system(d)
|
||||
self.assertEqual(pkgs, [])
|
||||
|
||||
d.setVar("PACKAGES", "foo foo-data foo-locale-en-gb")
|
||||
pkgs = packages_filter_out_system(d)
|
||||
self.assertEqual(pkgs, ["foo-data"])
|
||||
|
||||
|
||||
class TestTrimVersion(TestCase):
|
||||
def test_version_exception(self):
|
||||
with self.assertRaises(TypeError):
|
||||
trim_version(None, 2)
|
||||
with self.assertRaises(TypeError):
|
||||
trim_version((1, 2, 3), 2)
|
||||
|
||||
def test_num_exception(self):
|
||||
with self.assertRaises(ValueError):
|
||||
trim_version("1.2.3", 0)
|
||||
with self.assertRaises(ValueError):
|
||||
trim_version("1.2.3", -1)
|
||||
|
||||
def test_valid(self):
|
||||
self.assertEqual(trim_version("1.2.3", 1), "1")
|
||||
self.assertEqual(trim_version("1.2.3", 2), "1.2")
|
||||
self.assertEqual(trim_version("1.2.3", 3), "1.2.3")
|
||||
self.assertEqual(trim_version("1.2.3", 4), "1.2.3")
|
||||
|
||||
|
||||
class TestMultiprocessLaunch(TestCase):
|
||||
|
||||
def test_multiprocesslaunch(self):
|
||||
import bb
|
||||
|
||||
def testfunction(item, d):
|
||||
if item == "2":
|
||||
raise KeyError("Invalid number %s" % item)
|
||||
return "Found %s" % item
|
||||
|
||||
def dummyerror(msg):
|
||||
print("ERROR: %s" % msg)
|
||||
def dummyfatal(msg):
|
||||
print("ERROR: %s" % msg)
|
||||
raise bb.BBHandledException()
|
||||
|
||||
@contextmanager
|
||||
def captured_output():
|
||||
new_out, new_err = StringIO(), StringIO()
|
||||
old_out, old_err = sys.stdout, sys.stderr
|
||||
try:
|
||||
sys.stdout, sys.stderr = new_out, new_err
|
||||
yield sys.stdout, sys.stderr
|
||||
finally:
|
||||
sys.stdout, sys.stderr = old_out, old_err
|
||||
|
||||
d = bb.data_smart.DataSmart()
|
||||
bb.error = dummyerror
|
||||
bb.fatal = dummyfatal
|
||||
|
||||
# Assert the function returns the right results
|
||||
result = multiprocess_launch(testfunction, ["3", "4", "5", "6"], d, extraargs=(d,))
|
||||
self.assertIn("Found 3", result)
|
||||
self.assertIn("Found 4", result)
|
||||
self.assertIn("Found 5", result)
|
||||
self.assertIn("Found 6", result)
|
||||
self.assertEqual(len(result), 4)
|
||||
|
||||
# Assert the function prints exceptions
|
||||
with captured_output() as (out, err):
|
||||
self.assertRaises(bb.BBHandledException, multiprocess_launch, testfunction, ["1", "2", "3", "4", "5", "6"], d, extraargs=(d,))
|
||||
self.assertIn("KeyError: 'Invalid number 2'", out.getvalue())
|
||||
Reference in New Issue
Block a user