summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
Diffstat (limited to 'meta')
-rw-r--r--meta/lib/oeqa/selftest/cases/devtool.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/meta/lib/oeqa/selftest/cases/devtool.py b/meta/lib/oeqa/selftest/cases/devtool.py
index 81d02017c1..94873fd19f 100644
--- a/meta/lib/oeqa/selftest/cases/devtool.py
+++ b/meta/lib/oeqa/selftest/cases/devtool.py
@@ -848,6 +848,99 @@ class DevtoolModifyTests(DevtoolBase):
848 # Try building 848 # Try building
849 bitbake(testrecipe) 849 bitbake(testrecipe)
850 850
851 def test_devtool_modify_git_crates_subpath(self):
852 # This tests two things in devtool context:
853 # - that we support local git dependencies for cargo based recipe
854 # - that we support patches in SRC_URI when git url contains subpath parameter
855
856 # Check preconditions:
857 # recipe inherits cargo
858 # git:// uri with a subpath as the main package
859 # some crate:// in SRC_URI
860 # others git:// in SRC_URI
861 # cointains a patch
862 testrecipe = 'zvariant'
863 bb_vars = get_bb_vars(['SRC_URI', 'FILE', 'WORKDIR', 'CARGO_HOME'], testrecipe)
864 recipefile = bb_vars['FILE']
865 workdir = bb_vars['WORKDIR']
866 cargo_home = bb_vars['CARGO_HOME']
867 src_uri = bb_vars['SRC_URI'].split()
868 self.assertTrue(src_uri[0].startswith('git://'),
869 'This test expects the %s recipe to have a git repo has its main uri' % testrecipe)
870 self.assertIn(';subpath=', src_uri[0],
871 'This test expects the %s recipe to have a git uri with subpath' % testrecipe)
872 self.assertTrue(any([uri.startswith('crate://') for uri in src_uri]),
873 'This test expects the %s recipe to have some crates in its src uris' % testrecipe)
874 self.assertGreater(sum(map(lambda x:x.startswith('git://'), src_uri)), 2,
875 'This test expects the %s recipe to have several git:// uris' % testrecipe)
876 self.assertTrue(any([uri.startswith('file://') and '.patch' in uri for uri in src_uri]),
877 'This test expects the %s recipe to have a patch in its src uris' % testrecipe)
878
879 self._test_recipe_contents(recipefile, {}, ['cargo'])
880
881 # Clean up anything in the workdir/sysroot/sstate cache
882 bitbake('%s -c cleansstate' % testrecipe)
883 # Try modifying a recipe
884 tempdir = tempfile.mkdtemp(prefix='devtoolqa')
885 self.track_for_cleanup(tempdir)
886 self.track_for_cleanup(self.workspacedir)
887 self.add_command_to_tearDown('bitbake -c clean %s' % testrecipe)
888 self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
889 result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir))
890 self.assertExists(os.path.join(tempdir, 'Cargo.toml'), 'Extracted source could not be found')
891 self.assertExists(os.path.join(self.workspacedir, 'conf', 'layer.conf'), 'Workspace directory not created. devtool output: %s' % result.output)
892 matches = glob.glob(os.path.join(self.workspacedir, 'appends', 'zvariant_*.bbappend'))
893 self.assertTrue(matches, 'bbappend not created')
894 # Test devtool status
895 result = runCmd('devtool status')
896 self.assertIn(testrecipe, result.output)
897 self.assertIn(tempdir, result.output)
898 # Check git repo
899 self._check_src_repo(tempdir)
900 # Check that the patch is correctly applied
901 # last commit message in the tree must contain
902 # %% original patch: <patchname>
903 # ..
904 patchname = None
905 for uri in src_uri:
906 if uri.startswith('file://') and '.patch' in uri:
907 patchname = uri.replace("file://", "").partition('.patch')[0] + '.patch'
908 self.assertIsNotNone(patchname)
909 result = runCmd('git -C %s log -1' % tempdir)
910 self.assertIn("%%%% original patch: %s" % patchname, result.output)
911
912 # Configure the recipe to check that the git dependencies are correctly patched in cargo config
913 bitbake('-c configure %s' % testrecipe)
914
915 cargo_config_path = os.path.join(cargo_home, 'config')
916 with open(cargo_config_path, "r") as f:
917 cargo_config_contents = [line.strip('\n') for line in f.readlines()]
918
919 # Get back git dependencies of the recipe (ignoring the main one)
920 # and check that they are all correctly patched to be fetched locally
921 git_deps = [uri for uri in src_uri if uri.startswith("git://")][1:]
922 for git_dep in git_deps:
923 raw_url, _, raw_parms = git_dep.partition(";")
924 parms = {}
925 for parm in raw_parms.split(";"):
926 name_parm, _, value_parm = parm.partition('=')
927 parms[name_parm]=value_parm
928 self.assertIn('protocol', parms, 'git dependencies uri should contain the "protocol" parameter')
929 self.assertIn('name', parms, 'git dependencies uri should contain the "name" parameter')
930 self.assertIn('destsuffix', parms, 'git dependencies uri should contain the "destsuffix" parameter')
931 self.assertIn('type', parms, 'git dependencies uri should contain the "type" parameter')
932 self.assertEqual(parms['type'], 'git-dependency', 'git dependencies uri should have "type=git-dependency"')
933 raw_url = raw_url.replace("git://", '%s://' % parms['protocol'])
934 patch_line = '[patch."%s"]' % raw_url
935 path_patched = os.path.join(workdir, parms['destsuffix'])
936 path_override_line = '%s = { path = "%s" }' % (parms['name'], path_patched)
937 # Would have been better to use tomllib to read this file :/
938 self.assertIn(patch_line, cargo_config_contents)
939 self.assertIn(path_override_line, cargo_config_contents)
940
941 # Try to package the recipe
942 bitbake('-c package_qa %s' % testrecipe)
943
851 def test_devtool_modify_localfiles(self): 944 def test_devtool_modify_localfiles(self):
852 # Check preconditions 945 # Check preconditions
853 testrecipe = 'lighttpd' 946 testrecipe = 'lighttpd'