Initial commit

This commit is contained in:
Your Name
2026-04-23 17:07:55 +08:00
commit b7e39e063b
16725 changed files with 1625565 additions and 0 deletions
View File
@@ -0,0 +1,2 @@
These test cases are used by buildtools-tarball, and are not used by the testsdk
class.
@@ -0,0 +1,32 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import os, tempfile
import time
from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
class BuildTests(OESDKTestCase):
"""
Verify that bitbake can build virtual/libc inside the buildtools.
"""
def test_libc(self):
with tempfile.TemporaryDirectory(prefix='bitbake-build-', dir=self.tc.sdk_dir) as testdir:
corebase = self.td['COREBASE']
self._run('. %s/oe-init-build-env %s' % (corebase, testdir))
with open(os.path.join(testdir, 'conf', 'local.conf'), 'ta') as conf:
conf.write('\n')
conf.write('DL_DIR = "%s"\n' % self.td['DL_DIR'])
try:
self._run('. %s/oe-init-build-env %s && bitbake virtual/libc' % (corebase, testdir))
finally:
delay = 10
while delay and (os.path.exists(testdir + "/bitbake.lock") or os.path.exists(testdir + "/cache/hashserv.db-wal")):
time.sleep(1)
delay = delay - 1
@@ -0,0 +1,31 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import os.path
from oeqa.sdk.case import OESDKTestCase
class GccTests(OESDKTestCase):
def test_verify_specs(self):
"""
Verify that the compiler has been relocated successfully and isn't
looking in the hard-coded prefix.
"""
# Canonicalise the SDK root
sdk_base = os.path.realpath(self.tc.sdk_dir)
# Canonicalise the location of GCC
gcc_path = os.path.realpath(self._run("command -v gcc").strip())
# Skip the test if the GCC didn't come from the buildtools, as it only
# comes with buildtools-extended-tarball.
if os.path.commonprefix((sdk_base, gcc_path)) != sdk_base:
self.skipTest("Buildtools does not provide GCC")
# This is the prefix that GCC is build with, and should be replaced at
# installation time.
sdkpath = self.td.get("SDKPATH")
self.assertTrue(sdkpath)
for line in self._run('gcc -dumpspecs').splitlines():
self.assertNotIn(sdkpath, line)
@@ -0,0 +1,22 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
class HTTPTests(OESDKTestCase):
"""
Verify that HTTPS certificates are working correctly, as this depends on
environment variables being set correctly.
"""
def test_wget(self):
self._run('env -i wget --debug --output-document /dev/null https://yoctoproject.org/connectivity.html')
def test_python(self):
# urlopen() returns a file-like object on success and throws an exception otherwise
self._run('python3 -c \'import urllib.request; urllib.request.urlopen("https://yoctoproject.org/connectivity.html")\'')
@@ -0,0 +1,24 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import shutil
import os.path
from oeqa.sdk.case import OESDKTestCase
class SanityTests(OESDKTestCase):
def test_tools(self):
"""
Test that wget and tar come from the buildtools, not the host. This
verifies that the buildtools have installed correctly. We can't check
for gcc as that is only installed by buildtools-extended.
"""
for command in ("tar", "wget"):
# Canonicalise the SDK root
sdk_base = os.path.realpath(self.tc.sdk_dir)
# Canonicalise the location of this command
tool_path = os.path.realpath(self._run("command -v %s" % command).strip())
# Assert that the tool was found inside the SDK root
self.assertEquals(os.path.commonprefix((sdk_base, tool_path)), sdk_base)
@@ -0,0 +1,2 @@
These test cases are used by build-docs-tarball, and are not used by the testsdk
class.
@@ -0,0 +1,19 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import tempfile
from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
class BuildTests(OESDKTestCase):
"""
Verify that our docs can build using our docs tools tarball.
"""
def test_docs_build(self):
with tempfile.TemporaryDirectory(prefix='docs-tarball-build-', dir=self.tc.sdk_dir) as testdir:
self._run('git clone git://git.yoctoproject.org/yocto-docs %s' % testdir)
self._run('cd %s/documentation && make html' % testdir)
+54
View File
@@ -0,0 +1,54 @@
#
# Copyright (C) 2016 Intel Corporation
#
# SPDX-License-Identifier: MIT
#
import os
import subprocess
from oeqa.core.case import OETestCase
class OESDKTestCase(OETestCase):
def _run(self, cmd):
return subprocess.check_output(". %s > /dev/null; %s;" % \
(self.tc.sdk_env, cmd), shell=True, executable="/bin/bash",
stderr=subprocess.STDOUT, universal_newlines=True)
def fetch(self, workdir, dl_dir, url, archive=None):
if not archive:
from urllib.parse import urlparse
archive = os.path.basename(urlparse(url).path)
if dl_dir:
tarball = os.path.join(dl_dir, archive)
if os.path.exists(tarball):
return tarball
tarball = os.path.join(workdir, archive)
subprocess.check_output(["wget", "-O", tarball, url], stderr=subprocess.STDOUT)
return tarball
def check_elf(self, path, target_os=None, target_arch=None):
"""
Verify that the ELF binary $path matches the specified target
OS/architecture, or if not specified the currently configured MACHINE's
OS/architecture.
"""
import oe.qa, oe.elf
if not target_os or not target_arch:
output = self._run("echo $OECORE_TARGET_OS:$OECORE_TARGET_ARCH")
target_os, target_arch = output.strip().split(":")
machine_data = oe.elf.machine_dict(None)[target_os][target_arch]
(machine, osabi, abiversion, endian, bits) = machine_data
elf = oe.qa.ELFFile(path)
elf.open()
self.assertEqual(machine, elf.machine(),
"Binary was %s but expected %s" %
(oe.qa.elf_machine_to_string(elf.machine()), oe.qa.elf_machine_to_string(machine)))
self.assertEqual(bits, elf.abiSize())
self.assertEqual(endian, elf.isLittleEndian())
+45
View File
@@ -0,0 +1,45 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import os
import subprocess
import tempfile
import unittest
from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
class BuildAssimp(OESDKTestCase):
"""
Test case to build a project using cmake.
"""
def setUp(self):
if not (self.tc.hasHostPackage("nativesdk-cmake") or
self.tc.hasHostPackage("cmake-native")):
raise unittest.SkipTest("Needs cmake")
if not (self.tc.hasTargetPackage("zlib", multilib=True) or \
self.tc.hasTargetPackage("libz1", multilib=True)):
raise unittest.SkipTest("Assimp test needs zlib in the SDK")
def test_assimp(self):
with tempfile.TemporaryDirectory(prefix="assimp", dir=self.tc.sdk_dir) as testdir:
tarball = self.fetch(testdir, self.td["DL_DIR"], "https://github.com/assimp/assimp/archive/v4.1.0.tar.gz")
dirs = {}
dirs["source"] = os.path.join(testdir, "assimp-4.1.0")
dirs["build"] = os.path.join(testdir, "build")
dirs["install"] = os.path.join(testdir, "install")
subprocess.check_output(["tar", "xf", tarball, "-C", testdir], stderr=subprocess.STDOUT)
self.assertTrue(os.path.isdir(dirs["source"]))
os.makedirs(dirs["build"])
self._run("cd {build} && cmake -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON {source}".format(**dirs))
self._run("cmake --build {build} -- -j".format(**dirs))
self._run("cmake --build {build} --target install -- DESTDIR={install}".format(**dirs))
self.check_elf(os.path.join(dirs["install"], "usr", "local", "lib", "libassimp.so.4.1.0"))
+38
View File
@@ -0,0 +1,38 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import os
import tempfile
import subprocess
import unittest
from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
class BuildCpioTest(OESDKTestCase):
"""
Check that autotools will cross-compile correctly.
"""
def test_cpio(self):
with tempfile.TemporaryDirectory(prefix="cpio-", dir=self.tc.sdk_dir) as testdir:
tarball = self.fetch(testdir, self.td["DL_DIR"], "https://ftp.gnu.org/gnu/cpio/cpio-2.13.tar.gz")
dirs = {}
dirs["source"] = os.path.join(testdir, "cpio-2.13")
dirs["build"] = os.path.join(testdir, "build")
dirs["install"] = os.path.join(testdir, "install")
subprocess.check_output(["tar", "xf", tarball, "-C", testdir], stderr=subprocess.STDOUT)
self.assertTrue(os.path.isdir(dirs["source"]))
os.makedirs(dirs["build"])
self._run("sed -i -e '/char.*program_name/d' {source}/src/global.c".format(**dirs))
self._run("cd {build} && {source}/configure --disable-maintainer-mode $CONFIGURE_FLAGS".format(**dirs))
self._run("cd {build} && make -j".format(**dirs))
self._run("cd {build} && make install DESTDIR={install}".format(**dirs))
self.check_elf(os.path.join(dirs["install"], "usr", "local", "bin", "cpio"))
@@ -0,0 +1,44 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import os
import subprocess
import tempfile
import unittest
from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
class EpoxyTest(OESDKTestCase):
"""
Test that Meson builds correctly.
"""
def setUp(self):
if not (self.tc.hasHostPackage("nativesdk-meson") or
self.tc.hasHostPackage("meson-native")):
raise unittest.SkipTest("EpoxyTest class: SDK doesn't contain Meson")
def test_epoxy(self):
with tempfile.TemporaryDirectory(prefix="epoxy", dir=self.tc.sdk_dir) as testdir:
tarball = self.fetch(testdir, self.td["DL_DIR"], "https://github.com/anholt/libepoxy/releases/download/1.5.3/libepoxy-1.5.3.tar.xz")
dirs = {}
dirs["source"] = os.path.join(testdir, "libepoxy-1.5.3")
dirs["build"] = os.path.join(testdir, "build")
dirs["install"] = os.path.join(testdir, "install")
subprocess.check_output(["tar", "xf", tarball, "-C", testdir], stderr=subprocess.STDOUT)
self.assertTrue(os.path.isdir(dirs["source"]))
os.makedirs(dirs["build"])
log = self._run("meson --warnlevel 1 -Degl=no -Dglx=no -Dx11=false {build} {source}".format(**dirs))
# Check that Meson thinks we're doing a cross build and not a native
self.assertIn("Build type: cross build", log)
self._run("ninja -C {build} -v".format(**dirs))
self._run("DESTDIR={install} ninja -C {build} -v install".format(**dirs))
self.check_elf(os.path.join(dirs["install"], "usr", "local", "lib", "libepoxy.so"))
@@ -0,0 +1,46 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import os
import subprocess
import tempfile
import unittest
from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
class GalculatorTest(OESDKTestCase):
"""
Test that autotools and GTK+ 3 compiles correctly.
"""
def setUp(self):
if not (self.tc.hasTargetPackage("gtk+3", multilib=True) or \
self.tc.hasTargetPackage("libgtk-3.0", multilib=True)):
raise unittest.SkipTest("GalculatorTest class: SDK don't support gtk+3")
if not (self.tc.hasHostPackage("nativesdk-gettext-dev") or
self.tc.hasHostPackage("gettext-native")):
raise unittest.SkipTest("GalculatorTest class: SDK doesn't contain gettext")
def test_galculator(self):
with tempfile.TemporaryDirectory(prefix="galculator", dir=self.tc.sdk_dir) as testdir:
tarball = self.fetch(testdir, self.td["DL_DIR"], "http://galculator.mnim.org/downloads/galculator-2.1.4.tar.bz2")
dirs = {}
dirs["source"] = os.path.join(testdir, "galculator-2.1.4")
dirs["build"] = os.path.join(testdir, "build")
dirs["install"] = os.path.join(testdir, "install")
subprocess.check_output(["tar", "xf", tarball, "-C", testdir], stderr=subprocess.STDOUT)
self.assertTrue(os.path.isdir(dirs["source"]))
os.makedirs(dirs["build"])
self._run("cd {source} && sed -i -e '/s_preferences.*prefs;/d' src/main.c && autoreconf -i -f -I $OECORE_TARGET_SYSROOT/usr/share/aclocal -I m4".format(**dirs))
self._run("cd {build} && {source}/configure $CONFIGURE_FLAGS".format(**dirs))
self._run("cd {build} && make -j".format(**dirs))
self._run("cd {build} && make install DESTDIR={install}".format(**dirs))
self.check_elf(os.path.join(dirs["install"], "usr", "local", "bin", "galculator"))
+39
View File
@@ -0,0 +1,39 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import os, tempfile, subprocess, unittest
from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
class BuildLzipTest(OESDKTestCase):
"""
Test that "plain" compilation works, using just $CC $CFLAGS etc.
"""
def test_lzip(self):
with tempfile.TemporaryDirectory(prefix="lzip", dir=self.tc.sdk_dir) as testdir:
tarball = self.fetch(testdir, self.td["DL_DIR"], "http://downloads.yoctoproject.org/mirror/sources/lzip-1.19.tar.gz")
dirs = {}
dirs["source"] = os.path.join(testdir, "lzip-1.19")
dirs["build"] = os.path.join(testdir, "build")
dirs["install"] = os.path.join(testdir, "install")
subprocess.check_output(["tar", "xf", tarball, "-C", testdir], stderr=subprocess.STDOUT)
self.assertTrue(os.path.isdir(dirs["source"]))
os.makedirs(dirs["build"])
cmd = """cd {build} && \
{source}/configure --srcdir {source} \
CXX="$CXX" \
CPPFLAGS="$CPPFLAGS" \
CXXFLAGS="$CXXFLAGS" \
LDFLAGS="$LDFLAGS" \
"""
self._run(cmd.format(**dirs))
self._run("cd {build} && make -j".format(**dirs))
self._run("cd {build} && make install DESTDIR={install}".format(**dirs))
self.check_elf(os.path.join(dirs["install"], "usr", "local", "bin", "lzip"))
+52
View File
@@ -0,0 +1,52 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import os
import shutil
import unittest
from oeqa.core.utils.path import remove_safe
from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
class GccCompileTest(OESDKTestCase):
td_vars = ['MACHINE']
@classmethod
def setUpClass(self):
files = {'test.c' : self.tc.files_dir, 'test.cpp' : self.tc.files_dir,
'testsdkmakefile' : self.tc.sdk_files_dir}
for f in files:
shutil.copyfile(os.path.join(files[f], f),
os.path.join(self.tc.sdk_dir, f))
def setUp(self):
machine = self.td.get("MACHINE")
if not (self.tc.hasHostPackage("packagegroup-cross-canadian-%s" % machine) or
self.tc.hasHostPackage("^gcc-", regex=True)):
raise unittest.SkipTest("GccCompileTest class: SDK doesn't contain a cross-canadian toolchain")
def test_gcc_compile(self):
self._run('$CC %s/test.c -o %s/test -lm' % (self.tc.sdk_dir, self.tc.sdk_dir))
def test_gpp_compile(self):
self._run('$CXX %s/test.c -o %s/test -lm' % (self.tc.sdk_dir, self.tc.sdk_dir))
def test_gpp2_compile(self):
self._run('$CXX %s/test.cpp -o %s/test -lm' % (self.tc.sdk_dir, self.tc.sdk_dir))
def test_make(self):
self._run('cd %s; make -f testsdkmakefile' % self.tc.sdk_dir)
@classmethod
def tearDownClass(self):
files = [os.path.join(self.tc.sdk_dir, f) \
for f in ['test.c', 'test.cpp', 'test.o', 'test',
'testsdkmakefile']]
for f in files:
remove_safe(f)
+22
View File
@@ -0,0 +1,22 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import unittest
from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
class PerlTest(OESDKTestCase):
def setUp(self):
if not (self.tc.hasHostPackage("nativesdk-perl") or
self.tc.hasHostPackage("perl-native")):
raise unittest.SkipTest("No perl package in the SDK")
def test_perl(self):
cmd = "perl -e '$_=\"Uryyb, jbeyq\"; tr/a-zA-Z/n-za-mN-ZA-M/;print'"
output = self._run(cmd)
self.assertEqual(output, "Hello, world")
+22
View File
@@ -0,0 +1,22 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import subprocess, unittest
from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
class Python3Test(OESDKTestCase):
def setUp(self):
if not (self.tc.hasHostPackage("nativesdk-python3-core") or
self.tc.hasHostPackage("python3-core-native")):
raise unittest.SkipTest("No python3 package in the SDK")
def test_python3(self):
cmd = "python3 -c \"import codecs; print(codecs.encode('Uryyb, jbeyq', 'rot13'))\""
output = self._run(cmd)
self.assertEqual(output, "Hello, world\n")
+35
View File
@@ -0,0 +1,35 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import os
import shutil
import unittest
from oeqa.core.utils.path import remove_safe
from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
class RustCompileTest(OESDKTestCase):
td_vars = ['MACHINE']
@classmethod
def setUpClass(self):
targetdir = os.path.join(self.tc.sdk_dir, "hello")
try:
shutil.rmtree(targetdir)
except FileNotFoundError:
pass
shutil.copytree(os.path.join(self.tc.sdk_files_dir, "rust/hello"), targetdir)
def setUp(self):
machine = self.td.get("MACHINE")
if not self.tc.hasHostPackage("packagegroup-rust-cross-canadian-%s" % machine):
raise unittest.SkipTest("RustCompileTest class: SDK doesn't contain a Rust cross-canadian toolchain")
def test_cargo_build(self):
self._run('cd %s/hello; cargo build' % self.tc.sdk_dir)
+153
View File
@@ -0,0 +1,153 @@
#
# Copyright (C) 2016 Intel Corporation
#
# SPDX-License-Identifier: MIT
#
import os
import sys
import glob
import re
from oeqa.core.context import OETestContext, OETestContextExecutor
class OESDKTestContext(OETestContext):
sdk_files_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "files")
def __init__(self, td=None, logger=None, sdk_dir=None, sdk_env=None,
target_pkg_manifest=None, host_pkg_manifest=None):
super(OESDKTestContext, self).__init__(td, logger)
self.sdk_dir = sdk_dir
self.sdk_env = sdk_env
self.target_pkg_manifest = target_pkg_manifest
self.host_pkg_manifest = host_pkg_manifest
def _hasPackage(self, manifest, pkg, regex=False):
if regex:
# do regex match
pat = re.compile(pkg)
for p in manifest.keys():
if pat.search(p):
return True
else:
# do exact match
if pkg in manifest.keys():
return True
return False
def hasHostPackage(self, pkg, regex=False):
return self._hasPackage(self.host_pkg_manifest, pkg, regex=regex)
def hasTargetPackage(self, pkg, multilib=False, regex=False):
if multilib:
# match multilib according to sdk_env
mls = self.td.get('MULTILIB_VARIANTS', '').split()
for ml in mls:
if ('ml'+ml) in self.sdk_env:
pkg = ml + '-' + pkg
return self._hasPackage(self.target_pkg_manifest, pkg, regex=regex)
class OESDKTestContextExecutor(OETestContextExecutor):
_context_class = OESDKTestContext
name = 'sdk'
help = 'sdk test component'
description = 'executes sdk tests'
default_cases = [os.path.join(os.path.abspath(os.path.dirname(__file__)),
'cases')]
default_test_data = None
def register_commands(self, logger, subparsers):
super(OESDKTestContextExecutor, self).register_commands(logger, subparsers)
sdk_group = self.parser.add_argument_group('sdk options')
sdk_group.add_argument('--sdk-env', action='store',
help='sdk environment')
sdk_group.add_argument('--target-manifest', action='store',
help='sdk target manifest')
sdk_group.add_argument('--host-manifest', action='store',
help='sdk host manifest')
sdk_dgroup = self.parser.add_argument_group('sdk display options')
sdk_dgroup.add_argument('--list-sdk-env', action='store_true',
default=False, help='sdk list available environment')
# XXX this option is required but argparse_oe has a bug handling
# required options, seems that don't keep track of already parsed
# options
sdk_rgroup = self.parser.add_argument_group('sdk required options')
sdk_rgroup.add_argument('--sdk-dir', required=False, action='store',
help='sdk installed directory')
self.parser.add_argument('-j', '--num-processes', dest='processes', action='store',
type=int, help="number of processes to execute in parallel with")
@staticmethod
def _load_manifest(manifest):
pkg_manifest = {}
if manifest:
with open(manifest) as f:
for line in f:
(pkg, arch, version) = line.strip().split()
pkg_manifest[pkg] = (version, arch)
return pkg_manifest
def _process_args(self, logger, args):
super(OESDKTestContextExecutor, self)._process_args(logger, args)
self.tc_kwargs['init']['sdk_dir'] = args.sdk_dir
self.tc_kwargs['init']['sdk_env'] = self.sdk_env
self.tc_kwargs['init']['target_pkg_manifest'] = \
OESDKTestContextExecutor._load_manifest(args.target_manifest)
self.tc_kwargs['init']['host_pkg_manifest'] = \
OESDKTestContextExecutor._load_manifest(args.host_manifest)
self.tc_kwargs['run']['processes'] = args.processes
@staticmethod
def _get_sdk_environs(sdk_dir):
sdk_env = {}
environ_pattern = sdk_dir + '/environment-setup-*'
full_sdk_env = glob.glob(sdk_dir + '/environment-setup-*')
for env in full_sdk_env:
m = re.search('environment-setup-(.*)', env)
if m:
sdk_env[m.group(1)] = env
return sdk_env
def _display_sdk_envs(self, log, args, sdk_envs):
log("Available SDK environments at directory %s:" \
% args.sdk_dir)
log("")
for env in sdk_envs:
log(env)
def run(self, logger, args):
import argparse_oe
if not args.sdk_dir:
raise argparse_oe.ArgumentUsageError("No SDK directory "\
"specified please do, --sdk-dir SDK_DIR", self.name)
sdk_envs = OESDKTestContextExecutor._get_sdk_environs(args.sdk_dir)
if not sdk_envs:
raise argparse_oe.ArgumentUsageError("No available SDK "\
"environments found at %s" % args.sdk_dir, self.name)
if args.list_sdk_env:
self._display_sdk_envs(logger.info, args, sdk_envs)
sys.exit(0)
if not args.sdk_env in sdk_envs:
self._display_sdk_envs(logger.error, args, sdk_envs)
raise argparse_oe.ArgumentUsageError("No valid SDK "\
"environment (%s) specified" % args.sdk_env, self.name)
self.sdk_env = sdk_envs[args.sdk_env]
return super(OESDKTestContextExecutor, self).run(logger, args)
_executor_class = OESDKTestContextExecutor
@@ -0,0 +1,6 @@
[package]
name = "hello"
version = "0.1.0"
edition = "2021"
[dependencies]
@@ -0,0 +1,3 @@
/* This is the simplest build script just to invoke host compiler
in the build process. */
fn main() {}
@@ -0,0 +1,3 @@
fn main() {
println!("Hello, OpenEmbedded world!");
}
@@ -0,0 +1,5 @@
test: test.o
$(CC) -o test test.o -lm
test.o: test.c
$(CC) -c test.c
@@ -0,0 +1,45 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
class TestSDK(object):
def run(self, d):
import json
import logging
from oeqa.sdk.context import OESDKTestContext, OESDKTestContextExecutor
from oeqa.utils import make_logger_bitbake_compatible
pn = d.getVar("PN")
logger = make_logger_bitbake_compatible(logging.getLogger("BitBake"))
sdk_dir = d.expand("${WORKDIR}/testsdk/")
bb.utils.remove(sdk_dir, True)
bb.utils.mkdirhier(sdk_dir)
sdk_envs = OESDKTestContextExecutor._get_sdk_environs(d.getVar("DEPLOY_DIR_IMAGE"))
tdname = d.expand("${DEPLOY_DIR_IMAGE}/${PN}.testdata.json")
test_data = json.load(open(tdname, "r"))
host_pkg_manifest = {"cmake-native":"", "gcc-cross":"", "gettext-native":"", "meson-native":"", "perl-native":"", "python3-core-native":"", }
target_pkg_manifest = {"gtk+3":""}
for s in sdk_envs:
bb.plain("meta-ide-support based SDK testing environment: %s" % s)
sdk_env = sdk_envs[s]
tc = OESDKTestContext(td=test_data, logger=logger, sdk_dir=sdk_dir,
sdk_env=sdk_env, target_pkg_manifest=target_pkg_manifest,
host_pkg_manifest=host_pkg_manifest)
tc.loadTests(OESDKTestContextExecutor.default_cases)
results = tc.runTests()
if results:
results.logSummary(pn)
if (not results) or (not results.wasSuccessful()):
bb.fatal('%s - FAILED' % (pn,), forcelog=True)
+145
View File
@@ -0,0 +1,145 @@
#
# Copyright 2018 by Garmin Ltd. or its subsidiaries
#
# SPDX-License-Identifier: MIT
#
from oeqa.sdk.context import OESDKTestContext, OESDKTestContextExecutor
class TestSDKBase(object):
@staticmethod
def get_sdk_configuration(d, test_type):
import platform
import oe.lsb
from oeqa.utils.metadata import get_layers
configuration = {'TEST_TYPE': test_type,
'MACHINE': d.getVar("MACHINE"),
'SDKMACHINE': d.getVar("SDKMACHINE"),
'IMAGE_BASENAME': d.getVar("IMAGE_BASENAME"),
'IMAGE_PKGTYPE': d.getVar("IMAGE_PKGTYPE"),
'STARTTIME': d.getVar("DATETIME"),
'HOST_DISTRO': oe.lsb.distro_identifier().replace(' ', '-'),
'LAYERS': get_layers(d.getVar("BBLAYERS"))}
return configuration
@staticmethod
def get_sdk_json_result_dir(d):
json_result_dir = os.path.join(d.getVar("LOG_DIR"), 'oeqa')
custom_json_result_dir = d.getVar("OEQA_JSON_RESULT_DIR")
if custom_json_result_dir:
json_result_dir = custom_json_result_dir
return json_result_dir
@staticmethod
def get_sdk_result_id(configuration):
return '%s_%s_%s_%s_%s' % (configuration['TEST_TYPE'], configuration['IMAGE_BASENAME'], configuration['SDKMACHINE'], configuration['MACHINE'], configuration['STARTTIME'])
class TestSDK(TestSDKBase):
context_executor_class = OESDKTestContextExecutor
context_class = OESDKTestContext
test_type = 'sdk'
def get_tcname(self, d):
"""
Get the name of the SDK file
"""
return d.expand("${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.sh")
def extract_sdk(self, tcname, sdk_dir, d):
"""
Extract the SDK to the specified location
"""
import subprocess
try:
subprocess.check_output("cd %s; %s <<EOF\n./\nY\nEOF" % (sdk_dir, tcname), shell=True)
except subprocess.CalledProcessError as e:
bb.fatal("Couldn't install the SDK:\n%s" % e.output.decode("utf-8"))
def setup_context(self, d):
"""
Return a dictionary of additional arguments that should be passed to
the context_class on construction
"""
return dict()
def run(self, d):
import os
import subprocess
import json
import logging
from bb.utils import export_proxies
from oeqa.utils import make_logger_bitbake_compatible
pn = d.getVar("PN")
logger = make_logger_bitbake_compatible(logging.getLogger("BitBake"))
# sdk use network for download projects for build
export_proxies(d)
tcname = self.get_tcname(d)
if not os.path.exists(tcname):
bb.fatal("The toolchain %s is not built. Build it before running the tests: 'bitbake <image> -c populate_sdk' ." % tcname)
tdname = d.expand("${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.testdata.json")
test_data = json.load(open(tdname, "r"))
target_pkg_manifest = self.context_executor_class._load_manifest(
d.expand("${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.target.manifest"))
host_pkg_manifest = self.context_executor_class._load_manifest(
d.expand("${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.host.manifest"))
processes = d.getVar("TESTIMAGE_NUMBER_THREADS") or d.getVar("BB_NUMBER_THREADS")
if processes:
try:
import testtools, subunit
except ImportError:
bb.warn("Failed to import testtools or subunit, the testcases will run serially")
processes = None
sdk_dir = d.expand("${WORKDIR}/testimage-sdk/")
bb.utils.remove(sdk_dir, True)
bb.utils.mkdirhier(sdk_dir)
context_args = self.setup_context(d)
self.extract_sdk(tcname, sdk_dir, d)
fail = False
sdk_envs = self.context_executor_class._get_sdk_environs(sdk_dir)
for s in sdk_envs:
sdk_env = sdk_envs[s]
bb.plain("SDK testing environment: %s" % s)
tc = self.context_class(td=test_data, logger=logger, sdk_dir=sdk_dir,
sdk_env=sdk_env, target_pkg_manifest=target_pkg_manifest,
host_pkg_manifest=host_pkg_manifest, **context_args)
try:
tc.loadTests(self.context_executor_class.default_cases)
except Exception as e:
import traceback
bb.fatal("Loading tests failed:\n%s" % traceback.format_exc())
if processes:
result = tc.runTests(processes=int(processes))
else:
result = tc.runTests()
component = "%s %s" % (pn, self.context_executor_class.name)
context_msg = "%s:%s" % (os.path.basename(tcname), os.path.basename(sdk_env))
configuration = self.get_sdk_configuration(d, self.test_type)
result.logDetails(self.get_sdk_json_result_dir(d),
configuration,
self.get_sdk_result_id(configuration))
result.logSummary(component, context_msg)
if not result.wasSuccessful():
fail = True
if fail:
bb.fatal("%s - FAILED - check the task log and the commands log" % pn)
@@ -0,0 +1,53 @@
#
# Copyright (C) 2016 Intel Corporation
#
# SPDX-License-Identifier: MIT
#
import os
import subprocess
from oeqa.utils.buildproject import BuildProject
class SDKBuildProject(BuildProject):
def __init__(self, testpath, sdkenv, uri, testlogdir, builddatetime,
foldername=None, dl_dir=None):
self.sdkenv = sdkenv
self.testdir = testpath
self.targetdir = testpath
os.makedirs(testpath, exist_ok=True)
self.datetime = builddatetime
self.testlogdir = testlogdir
os.makedirs(self.testlogdir, exist_ok=True)
self.logfile = os.path.join(self.testlogdir, "sdk_target_log.%s" % self.datetime)
BuildProject.__init__(self, uri, foldername, tmpdir=testpath, dl_dir=dl_dir)
def download_archive(self):
self._download_archive()
cmd = 'tar xf %s -C %s' % (os.path.join(self.targetdir, self.archive), self.targetdir)
subprocess.check_output(cmd, shell=True)
#Change targetdir to project folder
self.targetdir = os.path.join(self.targetdir, self.fname)
def run_configure(self, configure_args='', extra_cmds=''):
return super(SDKBuildProject, self).run_configure(configure_args=(configure_args or '$CONFIGURE_FLAGS'), extra_cmds=extra_cmds)
def run_install(self, install_args=''):
return super(SDKBuildProject, self).run_install(install_args=(install_args or "DESTDIR=%s/../install" % self.targetdir))
def log(self, msg):
if self.logfile:
with open(self.logfile, "a") as f:
f.write("%s\n" % msg)
def _run(self, cmd):
self.log("Running . %s; " % self.sdkenv + cmd)
try:
output = subprocess.check_output(". %s; " % self.sdkenv + cmd, shell=True,
executable='/bin/bash', stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as exc:
print(exc.output.decode('utf-8'))
return exc.returncode
return 0