mirror of
https://git.yoctoproject.org/poky
synced 2026-04-28 06:32:34 +02:00
Test that the shared recipes in original mode with diff enabled works in multiconfig, otherwise it will not build when using the same TMP dir. The test can be run with: oe-selftest -r archiver.Archiver.test_archiver_multiconfig_shared_unpack_and_patch | oe-selftest - INFO - test_archiver_multiconfig_shared_unpack_and_patch (archiver.Archiver) | oe-selftest - INFO - ... ok | oe-selftest - INFO - ---------------------------------------------------------------------- | oe-selftest - INFO - Ran 1 test in 52.948s | oe-selftest - INFO - OK | oe-selftest - INFO - RESULTS: | oe-selftest - INFO - RESULTS - archiver.Archiver.test_archiver_multiconfig_shared_unpack_and_patch: PASSED (49.98s) | oe-selftest - INFO - SUMMARY: | oe-selftest - INFO - oe-selftest () - Ran 1 test in 52.948s | oe-selftest - INFO - oe-selftest - OK - All required tests passed (successes=1, skipped=0, failures=0, errors=0) (From OE-Core rev: 0059a5c9c0116dcc24d03a946703c0cd2ee23d16) Signed-off-by: Jose Quaresma <jose.quaresma@foundries.io> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
346 lines
15 KiB
Python
346 lines
15 KiB
Python
#
|
|
# Copyright OpenEmbedded Contributors
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
#
|
|
|
|
import os
|
|
import glob
|
|
import re
|
|
from oeqa.utils.commands import bitbake, get_bb_vars
|
|
from oeqa.selftest.case import OESelftestTestCase
|
|
|
|
class Archiver(OESelftestTestCase):
|
|
|
|
def test_archiver_allows_to_filter_on_recipe_name(self):
|
|
"""
|
|
Summary: The archiver should offer the possibility to filter on the recipe. (#6929)
|
|
Expected: 1. Included recipe (busybox) should be included
|
|
2. Excluded recipe (zlib) should be excluded
|
|
Product: oe-core
|
|
Author: Daniel Istrate <daniel.alexandrux.istrate@intel.com>
|
|
AutomatedBy: Daniel Istrate <daniel.alexandrux.istrate@intel.com>
|
|
"""
|
|
|
|
include_recipe = 'selftest-ed'
|
|
exclude_recipe = 'initscripts'
|
|
|
|
features = 'INHERIT += "archiver"\n'
|
|
features += 'ARCHIVER_MODE[src] = "original"\n'
|
|
features += 'COPYLEFT_PN_INCLUDE = "%s"\n' % include_recipe
|
|
features += 'COPYLEFT_PN_EXCLUDE = "%s"\n' % exclude_recipe
|
|
self.write_config(features)
|
|
|
|
bitbake('-c clean %s %s' % (include_recipe, exclude_recipe))
|
|
bitbake("-c deploy_archives %s %s" % (include_recipe, exclude_recipe))
|
|
|
|
bb_vars = get_bb_vars(['DEPLOY_DIR_SRC', 'TARGET_SYS'])
|
|
src_path = os.path.join(bb_vars['DEPLOY_DIR_SRC'], bb_vars['TARGET_SYS'])
|
|
|
|
# Check that include_recipe was included
|
|
included_present = len(glob.glob(src_path + '/%s-*/*' % include_recipe))
|
|
self.assertTrue(included_present, 'Recipe %s was not included.' % include_recipe)
|
|
|
|
# Check that exclude_recipe was excluded
|
|
excluded_present = len(glob.glob(src_path + '/%s-*/*' % exclude_recipe))
|
|
self.assertFalse(excluded_present, 'Recipe %s was not excluded.' % exclude_recipe)
|
|
|
|
def test_archiver_filters_by_type(self):
|
|
"""
|
|
Summary: The archiver is documented to filter on the recipe type.
|
|
Expected: 1. included recipe type (target) should be included
|
|
2. other types should be excluded
|
|
Product: oe-core
|
|
Author: André Draszik <adraszik@tycoint.com>
|
|
"""
|
|
|
|
target_recipe = 'selftest-ed'
|
|
native_recipe = 'selftest-ed-native'
|
|
|
|
features = 'INHERIT += "archiver"\n'
|
|
features += 'ARCHIVER_MODE[src] = "original"\n'
|
|
features += 'COPYLEFT_RECIPE_TYPES = "target"\n'
|
|
self.write_config(features)
|
|
|
|
bitbake('-c clean %s %s' % (target_recipe, native_recipe))
|
|
bitbake("%s -c deploy_archives %s" % (target_recipe, native_recipe))
|
|
|
|
bb_vars = get_bb_vars(['DEPLOY_DIR_SRC', 'TARGET_SYS', 'BUILD_SYS'])
|
|
src_path_target = os.path.join(bb_vars['DEPLOY_DIR_SRC'], bb_vars['TARGET_SYS'])
|
|
src_path_native = os.path.join(bb_vars['DEPLOY_DIR_SRC'], bb_vars['BUILD_SYS'])
|
|
|
|
# Check that target_recipe was included
|
|
included_present = len(glob.glob(src_path_target + '/%s-*/*' % target_recipe))
|
|
self.assertTrue(included_present, 'Recipe %s was not included.' % target_recipe)
|
|
|
|
# Check that native_recipe was excluded
|
|
excluded_present = len(glob.glob(src_path_native + '/%s-*/*' % native_recipe))
|
|
self.assertFalse(excluded_present, 'Recipe %s was not excluded.' % native_recipe)
|
|
|
|
def test_archiver_filters_by_type_and_name(self):
|
|
"""
|
|
Summary: Test that the archiver archives by recipe type, taking the
|
|
recipe name into account.
|
|
Expected: 1. included recipe type (target) should be included
|
|
2. other types should be excluded
|
|
3. recipe by name should be included / excluded,
|
|
overriding previous decision by type
|
|
Product: oe-core
|
|
Author: André Draszik <adraszik@tycoint.com>
|
|
"""
|
|
|
|
target_recipes = [ 'initscripts', 'selftest-ed' ]
|
|
native_recipes = [ 'update-rc.d-native', 'selftest-ed-native' ]
|
|
|
|
features = 'INHERIT += "archiver"\n'
|
|
features += 'ARCHIVER_MODE[src] = "original"\n'
|
|
features += 'COPYLEFT_RECIPE_TYPES = "target"\n'
|
|
features += 'COPYLEFT_PN_INCLUDE = "%s"\n' % native_recipes[1]
|
|
features += 'COPYLEFT_PN_EXCLUDE = "%s"\n' % target_recipes[1]
|
|
self.write_config(features)
|
|
|
|
bitbake('-c clean %s %s' % (' '.join(target_recipes), ' '.join(native_recipes)))
|
|
bitbake('-c deploy_archives %s %s' % (' '.join(target_recipes), ' '.join(native_recipes)))
|
|
|
|
bb_vars = get_bb_vars(['DEPLOY_DIR_SRC', 'TARGET_SYS', 'BUILD_SYS'])
|
|
src_path_target = os.path.join(bb_vars['DEPLOY_DIR_SRC'], bb_vars['TARGET_SYS'])
|
|
src_path_native = os.path.join(bb_vars['DEPLOY_DIR_SRC'], bb_vars['BUILD_SYS'])
|
|
|
|
# Check that target_recipe[0] and native_recipes[1] were included
|
|
included_present = len(glob.glob(src_path_target + '/%s-*/*' % target_recipes[0]))
|
|
self.assertTrue(included_present, 'Recipe %s was not included.' % target_recipes[0])
|
|
|
|
included_present = len(glob.glob(src_path_native + '/%s-*/*' % native_recipes[1]))
|
|
self.assertTrue(included_present, 'Recipe %s was not included.' % native_recipes[1])
|
|
|
|
# Check that native_recipes[0] and target_recipes[1] were excluded
|
|
excluded_present = len(glob.glob(src_path_native + '/%s-*/*' % native_recipes[0]))
|
|
self.assertFalse(excluded_present, 'Recipe %s was not excluded.' % native_recipes[0])
|
|
|
|
excluded_present = len(glob.glob(src_path_target + '/%s-*/*' % target_recipes[1]))
|
|
self.assertFalse(excluded_present, 'Recipe %s was not excluded.' % target_recipes[1])
|
|
|
|
def test_archiver_multiconfig_shared_unpack_and_patch(self):
|
|
"""
|
|
Test that shared recipes in original mode with diff enabled works in multiconfig,
|
|
otherwise it will not build when using the same TMP dir.
|
|
"""
|
|
|
|
features = 'BBMULTICONFIG = "mc1 mc2"\n'
|
|
features += 'INHERIT += "archiver"\n'
|
|
features += 'ARCHIVER_MODE[src] = "original"\n'
|
|
features += 'ARCHIVER_MODE[diff] = "1"\n'
|
|
self.write_config(features)
|
|
|
|
# We can use any machine in multiconfig as long as they are different
|
|
self.write_config('MACHINE = "qemuarm"\n', 'mc1')
|
|
self.write_config('MACHINE = "qemux86"\n', 'mc2')
|
|
|
|
task = 'do_unpack_and_patch'
|
|
# Use gcc-source as it is a shared recipe (appends the pv to the pn)
|
|
pn = 'gcc-source-%s' % get_bb_vars(['PV'], 'gcc')['PV']
|
|
|
|
# Generate the tasks signatures
|
|
bitbake('mc:mc1:%s mc:mc2:%s -c %s -S none' % (pn, pn, task))
|
|
|
|
# Check the tasks signatures
|
|
# To be machine agnostic the tasks needs to generate the same signature for each machine
|
|
locked_sigs_inc = "%s/locked-sigs.inc" % self.builddir
|
|
locked_sigs = open(locked_sigs_inc).read()
|
|
task_sigs = re.findall(r"%s:%s:.*" % (pn, task), locked_sigs)
|
|
uniq_sigs = set(task_sigs)
|
|
self.assertFalse(len(uniq_sigs) - 1, \
|
|
'The task "%s" of the recipe "%s" has different signatures in "%s" for each machine in multiconfig' \
|
|
% (task, pn, locked_sigs_inc))
|
|
|
|
def test_archiver_srpm_mode(self):
|
|
"""
|
|
Test that in srpm mode, the added recipe dependencies at least exist/work [YOCTO #11121]
|
|
"""
|
|
|
|
features = 'INHERIT += "archiver"\n'
|
|
features += 'ARCHIVER_MODE[srpm] = "1"\n'
|
|
features += 'PACKAGE_CLASSES = "package_rpm"\n'
|
|
self.write_config(features)
|
|
|
|
bitbake('-n selftest-nopackages selftest-ed')
|
|
|
|
def _test_archiver_mode(self, mode, target_file_name, extra_config=None):
|
|
target = 'selftest-ed-native'
|
|
|
|
features = 'INHERIT += "archiver"\n'
|
|
features += 'ARCHIVER_MODE[src] = "%s"\n' % (mode)
|
|
if extra_config:
|
|
features += extra_config
|
|
self.write_config(features)
|
|
|
|
bitbake('-c clean %s' % (target))
|
|
bitbake('-c deploy_archives %s' % (target))
|
|
|
|
bb_vars = get_bb_vars(['DEPLOY_DIR_SRC', 'BUILD_SYS'])
|
|
glob_str = os.path.join(bb_vars['DEPLOY_DIR_SRC'], bb_vars['BUILD_SYS'], '%s-*' % (target))
|
|
glob_result = glob.glob(glob_str)
|
|
self.assertTrue(glob_result, 'Missing archiver directory for %s' % (target))
|
|
|
|
archive_path = os.path.join(glob_result[0], target_file_name)
|
|
self.assertTrue(os.path.exists(archive_path), 'Missing archive file %s' % (target_file_name))
|
|
|
|
def test_archiver_mode_original(self):
|
|
"""
|
|
Test that the archiver works with `ARCHIVER_MODE[src] = "original"`.
|
|
"""
|
|
|
|
self._test_archiver_mode('original', 'ed-1.14.1.tar.lz')
|
|
|
|
def test_archiver_mode_patched(self):
|
|
"""
|
|
Test that the archiver works with `ARCHIVER_MODE[src] = "patched"`.
|
|
"""
|
|
|
|
self._test_archiver_mode('patched', 'selftest-ed-native-1.14.1-r0-patched.tar.xz')
|
|
|
|
def test_archiver_mode_configured(self):
|
|
"""
|
|
Test that the archiver works with `ARCHIVER_MODE[src] = "configured"`.
|
|
"""
|
|
|
|
self._test_archiver_mode('configured', 'selftest-ed-native-1.14.1-r0-configured.tar.xz')
|
|
|
|
def test_archiver_mode_recipe(self):
|
|
"""
|
|
Test that the archiver works with `ARCHIVER_MODE[recipe] = "1"`.
|
|
"""
|
|
|
|
self._test_archiver_mode('patched', 'selftest-ed-native-1.14.1-r0-recipe.tar.xz',
|
|
'ARCHIVER_MODE[recipe] = "1"\n')
|
|
|
|
def test_archiver_mode_diff(self):
|
|
"""
|
|
Test that the archiver works with `ARCHIVER_MODE[diff] = "1"`.
|
|
Exclusions controlled by `ARCHIVER_MODE[diff-exclude]` are not yet tested.
|
|
"""
|
|
|
|
self._test_archiver_mode('patched', 'selftest-ed-native-1.14.1-r0-diff.gz',
|
|
'ARCHIVER_MODE[diff] = "1"\n')
|
|
|
|
def test_archiver_mode_dumpdata(self):
|
|
"""
|
|
Test that the archiver works with `ARCHIVER_MODE[dumpdata] = "1"`.
|
|
"""
|
|
|
|
self._test_archiver_mode('patched', 'selftest-ed-native-1.14.1-r0-showdata.dump',
|
|
'ARCHIVER_MODE[dumpdata] = "1"\n')
|
|
|
|
def test_archiver_mode_mirror(self):
|
|
"""
|
|
Test that the archiver works with `ARCHIVER_MODE[src] = "mirror"`.
|
|
"""
|
|
|
|
self._test_archiver_mode('mirror', 'ed-1.14.1.tar.lz',
|
|
'BB_GENERATE_MIRROR_TARBALLS = "1"\n')
|
|
|
|
def test_archiver_mode_mirror_excludes(self):
|
|
"""
|
|
Test that the archiver works with `ARCHIVER_MODE[src] = "mirror"` and
|
|
correctly excludes an archive when its URL matches
|
|
`ARCHIVER_MIRROR_EXCLUDE`.
|
|
"""
|
|
|
|
target='selftest-ed'
|
|
target_file_name = 'ed-1.14.1.tar.lz'
|
|
|
|
features = 'INHERIT += "archiver"\n'
|
|
features += 'ARCHIVER_MODE[src] = "mirror"\n'
|
|
features += 'BB_GENERATE_MIRROR_TARBALLS = "1"\n'
|
|
features += 'ARCHIVER_MIRROR_EXCLUDE = "${GNU_MIRROR}"\n'
|
|
self.write_config(features)
|
|
|
|
bitbake('-c clean %s' % (target))
|
|
bitbake('-c deploy_archives %s' % (target))
|
|
|
|
bb_vars = get_bb_vars(['DEPLOY_DIR_SRC', 'TARGET_SYS'])
|
|
glob_str = os.path.join(bb_vars['DEPLOY_DIR_SRC'], bb_vars['TARGET_SYS'], '%s-*' % (target))
|
|
glob_result = glob.glob(glob_str)
|
|
self.assertTrue(glob_result, 'Missing archiver directory for %s' % (target))
|
|
|
|
archive_path = os.path.join(glob_result[0], target_file_name)
|
|
self.assertFalse(os.path.exists(archive_path), 'Failed to exclude archive file %s' % (target_file_name))
|
|
|
|
def test_archiver_mode_mirror_combined(self):
|
|
"""
|
|
Test that the archiver works with `ARCHIVER_MODE[src] = "mirror"`
|
|
and `ARCHIVER_MODE[mirror] = "combined"`. Archives for multiple recipes
|
|
should all end up in the 'mirror' directory.
|
|
"""
|
|
|
|
features = 'INHERIT += "archiver"\n'
|
|
features += 'ARCHIVER_MODE[src] = "mirror"\n'
|
|
features += 'ARCHIVER_MODE[mirror] = "combined"\n'
|
|
features += 'BB_GENERATE_MIRROR_TARBALLS = "1"\n'
|
|
features += 'COPYLEFT_LICENSE_INCLUDE = "*"\n'
|
|
self.write_config(features)
|
|
|
|
for target in ['selftest-ed', 'selftest-hardlink']:
|
|
bitbake('-c clean %s' % (target))
|
|
bitbake('-c deploy_archives %s' % (target))
|
|
|
|
bb_vars = get_bb_vars(['DEPLOY_DIR_SRC'])
|
|
for target_file_name in ['ed-1.14.1.tar.lz', 'hello.c']:
|
|
glob_str = os.path.join(bb_vars['DEPLOY_DIR_SRC'], 'mirror', target_file_name)
|
|
glob_result = glob.glob(glob_str)
|
|
self.assertTrue(glob_result, 'Missing archive file %s' % (target_file_name))
|
|
|
|
def test_archiver_mode_mirror_gitsm(self):
|
|
"""
|
|
Test that the archiver correctly handles git submodules with
|
|
`ARCHIVER_MODE[src] = "mirror"`.
|
|
"""
|
|
features = 'INHERIT += "archiver"\n'
|
|
features += 'ARCHIVER_MODE[src] = "mirror"\n'
|
|
features += 'ARCHIVER_MODE[mirror] = "combined"\n'
|
|
features += 'BB_GENERATE_MIRROR_TARBALLS = "1"\n'
|
|
features += 'COPYLEFT_LICENSE_INCLUDE = "*"\n'
|
|
self.write_config(features)
|
|
|
|
bitbake('-c clean git-submodule-test')
|
|
bitbake('-c deploy_archives -f git-submodule-test')
|
|
|
|
bb_vars = get_bb_vars(['DEPLOY_DIR_SRC'])
|
|
for target_file_name in [
|
|
'git2_git.yoctoproject.org.git-submodule-test.tar.gz',
|
|
'git2_git.yoctoproject.org.bitbake-gitsm-test1.tar.gz',
|
|
'git2_git.yoctoproject.org.bitbake-gitsm-test2.tar.gz',
|
|
'git2_git.openembedded.org.bitbake.tar.gz'
|
|
]:
|
|
target_path = os.path.join(bb_vars['DEPLOY_DIR_SRC'], 'mirror', target_file_name)
|
|
self.assertTrue(os.path.exists(target_path))
|
|
|
|
def test_archiver_mode_mirror_gitsm_shallow(self):
|
|
"""
|
|
Test that the archiver correctly handles git submodules with
|
|
`ARCHIVER_MODE[src] = "mirror"`.
|
|
"""
|
|
features = 'INHERIT += "archiver"\n'
|
|
features += 'ARCHIVER_MODE[src] = "mirror"\n'
|
|
features += 'ARCHIVER_MODE[mirror] = "combined"\n'
|
|
features += 'BB_GENERATE_MIRROR_TARBALLS = "1"\n'
|
|
features += 'COPYLEFT_LICENSE_INCLUDE = "*"\n'
|
|
features += 'BB_GIT_SHALLOW = "1"\n'
|
|
features += 'BB_GENERATE_SHALLOW_TARBALLS = "1"\n'
|
|
features += 'DL_DIR = "${TOPDIR}/downloads-shallow"\n'
|
|
self.write_config(features)
|
|
|
|
bitbake('-c clean git-submodule-test')
|
|
bitbake('-c deploy_archives -f git-submodule-test')
|
|
|
|
bb_vars = get_bb_vars(['DEPLOY_DIR_SRC'])
|
|
for target_file_name in [
|
|
'gitsmshallow_git.yoctoproject.org.git-submodule-test_a2885dd-1_master.tar.gz',
|
|
'gitsmshallow_git.yoctoproject.org.bitbake-gitsm-test1_bare_120f4c7-1.tar.gz',
|
|
'gitsmshallow_git.yoctoproject.org.bitbake-gitsm-test2_bare_f66699e-1.tar.gz',
|
|
'gitsmshallow_git.openembedded.org.bitbake_bare_52a144a-1.tar.gz',
|
|
'gitsmshallow_git.openembedded.org.bitbake_bare_c39b997-1.tar.gz'
|
|
]:
|
|
target_path = os.path.join(bb_vars['DEPLOY_DIR_SRC'], 'mirror', target_file_name)
|
|
self.assertTrue(os.path.exists(target_path))
|