| Brad Bishop | c342db3 | 2019-05-15 21:57:59 -0400 | [diff] [blame] | 1 | # | 
|  | 2 | # SPDX-License-Identifier: MIT | 
|  | 3 | # | 
|  | 4 |  | 
| Brad Bishop | d7bf8c1 | 2018-02-25 22:55:05 -0500 | [diff] [blame] | 5 | from oeqa.selftest.case import OESelftestTestCase | 
|  | 6 | from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars | 
|  | 7 | from oeqa.utils.decorators import testcase | 
|  | 8 | from oeqa.utils.ftools import write_file | 
| Brad Bishop | d7bf8c1 | 2018-02-25 22:55:05 -0500 | [diff] [blame] | 9 |  | 
| Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 10 | import oe.recipeutils | 
|  | 11 |  | 
| Brad Bishop | d7bf8c1 | 2018-02-25 22:55:05 -0500 | [diff] [blame] | 12 | class Distrodata(OESelftestTestCase): | 
|  | 13 |  | 
| Brad Bishop | d7bf8c1 | 2018-02-25 22:55:05 -0500 | [diff] [blame] | 14 | def test_checkpkg(self): | 
|  | 15 | """ | 
|  | 16 | Summary:     Test that upstream version checks do not regress | 
|  | 17 | Expected:    Upstream version checks should succeed except for the recipes listed in the exception list. | 
|  | 18 | Product:     oe-core | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 19 | Author:      Alexander Kanavin <alex.kanavin@gmail.com> | 
| Brad Bishop | d7bf8c1 | 2018-02-25 22:55:05 -0500 | [diff] [blame] | 20 | """ | 
| Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 21 | feature = 'LICENSE_FLAGS_WHITELIST += " commercial"\n' | 
|  | 22 | self.write_config(feature) | 
|  | 23 |  | 
|  | 24 | pkgs = oe.recipeutils.get_recipe_upgrade_status() | 
|  | 25 |  | 
|  | 26 | regressed_failures = [pkg[0] for pkg in pkgs if pkg[1] == 'UNKNOWN_BROKEN'] | 
|  | 27 | regressed_successes = [pkg[0] for pkg in pkgs if pkg[1] == 'KNOWN_BROKEN'] | 
| Brad Bishop | d7bf8c1 | 2018-02-25 22:55:05 -0500 | [diff] [blame] | 28 | msg = "" | 
|  | 29 | if len(regressed_failures) > 0: | 
|  | 30 | msg = msg + """ | 
|  | 31 | The following packages failed upstream version checks. Please fix them using UPSTREAM_CHECK_URI/UPSTREAM_CHECK_REGEX | 
|  | 32 | (when using tarballs) or UPSTREAM_CHECK_GITTAGREGEX (when using git). If an upstream version check cannot be performed | 
|  | 33 | (for example, if upstream does not use git tags), you can set UPSTREAM_VERSION_UNKNOWN to '1' in the recipe to acknowledge | 
|  | 34 | that the check cannot be performed. | 
|  | 35 | """ + "\n".join(regressed_failures) | 
|  | 36 | if len(regressed_successes) > 0: | 
|  | 37 | msg = msg + """ | 
|  | 38 | The following packages have been checked successfully for upstream versions, | 
|  | 39 | but their recipes claim otherwise by setting UPSTREAM_VERSION_UNKNOWN. Please remove that line from the recipes. | 
|  | 40 | """ + "\n".join(regressed_successes) | 
|  | 41 | self.assertTrue(len(regressed_failures) == 0 and len(regressed_successes) == 0, msg) | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 42 |  | 
|  | 43 | def test_maintainers(self): | 
|  | 44 | """ | 
| Andrew Geissler | 82c905d | 2020-04-13 13:39:40 -0500 | [diff] [blame] | 45 | Summary:     Test that oe-core recipes have a maintainer and entries in maintainers list have a recipe | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 46 | Expected:    All oe-core recipes (except a few special static/testing ones) should have a maintainer listed in maintainers.inc file. | 
| Andrew Geissler | 82c905d | 2020-04-13 13:39:40 -0500 | [diff] [blame] | 47 | Expected:    All entries in maintainers list should have a recipe file that matches them | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 48 | Product:     oe-core | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 49 | Author:      Alexander Kanavin <alex.kanavin@gmail.com> | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 50 | """ | 
|  | 51 | def is_exception(pkg): | 
|  | 52 | exceptions = ["packagegroup-", "initramfs-", "systemd-machine-units", "target-sdk-provides-dummy"] | 
|  | 53 | for i in exceptions: | 
|  | 54 | if i in pkg: | 
|  | 55 | return True | 
|  | 56 | return False | 
|  | 57 |  | 
| Andrew Geissler | 82c905d | 2020-04-13 13:39:40 -0500 | [diff] [blame] | 58 | def is_maintainer_exception(entry): | 
|  | 59 | exceptions = ["musl", "newlib", "linux-yocto", "linux-dummy", "mesa-gl", "libgfortran", | 
|  | 60 | "cve-update-db-native"] | 
|  | 61 | for i in exceptions: | 
|  | 62 | if i in entry: | 
|  | 63 | return True | 
|  | 64 | return False | 
|  | 65 |  | 
|  | 66 | feature = 'require conf/distro/include/maintainers.inc\nLICENSE_FLAGS_WHITELIST += " commercial"\nPARSE_ALL_RECIPES = "1"\n' | 
| Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 67 | self.write_config(feature) | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 68 |  | 
| Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 69 | with bb.tinfoil.Tinfoil() as tinfoil: | 
|  | 70 | tinfoil.prepare(config_only=False) | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 71 |  | 
| Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 72 | with_maintainer_list = [] | 
|  | 73 | no_maintainer_list = [] | 
| Andrew Geissler | 82c905d | 2020-04-13 13:39:40 -0500 | [diff] [blame] | 74 |  | 
|  | 75 | missing_recipes = [] | 
|  | 76 | recipes = [] | 
|  | 77 | prefix = "RECIPE_MAINTAINER_pn-" | 
|  | 78 |  | 
| Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 79 | # We could have used all_recipes() here, but this method will find | 
|  | 80 | # every recipe if we ever move to setting RECIPE_MAINTAINER in recipe files | 
|  | 81 | # instead of maintainers.inc | 
|  | 82 | for fn in tinfoil.all_recipe_files(variants=False): | 
|  | 83 | if not '/meta/recipes-' in fn: | 
|  | 84 | # We are only interested in OE-Core | 
|  | 85 | continue | 
|  | 86 | rd = tinfoil.parse_recipe_file(fn, appends=False) | 
|  | 87 | pn = rd.getVar('PN') | 
| Andrew Geissler | 82c905d | 2020-04-13 13:39:40 -0500 | [diff] [blame] | 88 | recipes.append(pn) | 
| Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 89 | if is_exception(pn): | 
|  | 90 | continue | 
|  | 91 | if rd.getVar('RECIPE_MAINTAINER'): | 
|  | 92 | with_maintainer_list.append((pn, fn)) | 
|  | 93 | else: | 
|  | 94 | no_maintainer_list.append((pn, fn)) | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 95 |  | 
| Andrew Geissler | 82c905d | 2020-04-13 13:39:40 -0500 | [diff] [blame] | 96 | maintainers = tinfoil.config_data.keys() | 
|  | 97 | for key in maintainers: | 
|  | 98 | if key.startswith(prefix): | 
|  | 99 | recipe = tinfoil.config_data.expand(key[len(prefix):]) | 
|  | 100 | if is_maintainer_exception(recipe): | 
|  | 101 | continue | 
|  | 102 | if recipe not in recipes: | 
|  | 103 | missing_recipes.append(recipe) | 
|  | 104 |  | 
| Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 105 | if no_maintainer_list: | 
|  | 106 | self.fail(""" | 
|  | 107 | The following recipes do not have a maintainer assigned to them. Please add an entry to meta/conf/distro/include/maintainers.inc file. | 
|  | 108 | """ + "\n".join(['%s (%s)' % i for i in no_maintainer_list])) | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 109 |  | 
| Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 110 | if not with_maintainer_list: | 
|  | 111 | self.fail(""" | 
|  | 112 | The list of oe-core recipes with maintainers is empty. This may indicate that the test has regressed and needs fixing. | 
|  | 113 | """) | 
| Andrew Geissler | 82c905d | 2020-04-13 13:39:40 -0500 | [diff] [blame] | 114 |  | 
|  | 115 | if missing_recipes: | 
|  | 116 | self.fail(""" | 
|  | 117 | Unable to find recipes for the following entries in maintainers.inc: | 
|  | 118 | """ + "\n".join(['%s' % i for i in missing_recipes])) |