summaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/selftest/cases/gitarchivetests.py
diff options
context:
space:
mode:
Diffstat (limited to 'meta/lib/oeqa/selftest/cases/gitarchivetests.py')
-rw-r--r--meta/lib/oeqa/selftest/cases/gitarchivetests.py136
1 files changed, 136 insertions, 0 deletions
diff --git a/meta/lib/oeqa/selftest/cases/gitarchivetests.py b/meta/lib/oeqa/selftest/cases/gitarchivetests.py
new file mode 100644
index 0000000000..71382089c1
--- /dev/null
+++ b/meta/lib/oeqa/selftest/cases/gitarchivetests.py
@@ -0,0 +1,136 @@
1#
2# Copyright OpenEmbedded Contributors
3#
4# SPDX-License-Identifier: MIT
5#
6
7import os
8import sys
9basepath = os.path.abspath(os.path.dirname(__file__) + '/../../../../../')
10lib_path = basepath + '/scripts/lib'
11sys.path = sys.path + [lib_path]
12import oeqa.utils.gitarchive as ga
13from oeqa.utils.git import GitError
14import tempfile
15import shutil
16import scriptutils
17import logging
18from oeqa.selftest.case import OESelftestTestCase
19
20logger = scriptutils.logger_create('resulttool')
21
22def create_fake_repository(commit, tag_list=[], add_remote=True):
23 """ Create a testing git directory
24
25 Initialize a simple git repository with one initial commit, and as many
26 tags on this commit as listed in tag_list
27 Returns both git directory path and gitarchive git object
28 If commit is true, fake data will be commited, otherwise it will stay in staging area
29 If commit is true and tag_lsit is non empty, all tags in tag_list will be
30 created on the initial commit
31 Fake remote will also be added to make git ls-remote work
32 """
33 fake_data_file = "fake_data.txt"
34 tempdir = tempfile.mkdtemp(prefix='fake_results.')
35 repo = ga.init_git_repo(tempdir, False, False, logger)
36 if add_remote:
37 repo.run_cmd(["remote", "add", "origin", "."])
38 with open(os.path.join(tempdir, fake_data_file), "w") as fake_data:
39 fake_data.write("Fake data")
40 if commit:
41 repo.run_cmd(["add", fake_data_file])
42 repo.run_cmd(["commit", "-m", "\"Add fake data\""])
43 for tag in tag_list:
44 repo.run_cmd(["tag", tag])
45
46 return tempdir, repo
47
48def delete_fake_repository(path):
49 shutil.rmtree(path)
50
51def tag_exists(git_obj, target_tag):
52 for tag in git_obj.run_cmd(["tag"]).splitlines():
53 if target_tag == tag:
54 return True
55 return False
56
57class GitArchiveTests(OESelftestTestCase):
58 TEST_BRANCH="main"
59 TEST_COMMIT="0f7d5df"
60 TEST_COMMIT_COUNT="42"
61
62 @classmethod
63 def setUpClass(cls):
64 super().setUpClass()
65 cls.log = logging.getLogger('gitarchivetests')
66 cls.log.setLevel(logging.DEBUG)
67
68 def test_create_first_test_tag(self):
69 path, git_obj = create_fake_repository(False)
70 keywords = {'commit': self.TEST_COMMIT, 'branch': self.TEST_BRANCH, "commit_count": self.TEST_COMMIT_COUNT}
71 target_tag = f"{self.TEST_BRANCH}/{self.TEST_COMMIT_COUNT}-g{self.TEST_COMMIT}/0"
72
73 ga.gitarchive(path, path, True, False,
74 "Results of {branch}:{commit}", "branch: {branch}\ncommit: {commit}", "{branch}",
75 False, "{branch}/{commit_count}-g{commit}/{tag_number}",
76 'Test run #{tag_number} of {branch}:{commit}', '',
77 [], [], False, keywords, logger)
78 self.assertTrue(tag_exists(git_obj, target_tag), msg=f"Tag {target_tag} has not been created")
79 delete_fake_repository(path)
80
81 def test_create_second_test_tag(self):
82 first_tag = f"{self.TEST_BRANCH}/{self.TEST_COMMIT_COUNT}-g{self.TEST_COMMIT}/0"
83 second_tag = f"{self.TEST_BRANCH}/{self.TEST_COMMIT_COUNT}-g{self.TEST_COMMIT}/1"
84 keywords = {'commit': self.TEST_COMMIT, 'branch': self.TEST_BRANCH, "commit_count": self.TEST_COMMIT_COUNT}
85
86 path, git_obj = create_fake_repository(True, [first_tag])
87 ga.gitarchive(path, path, True, False,
88 "Results of {branch}:{commit}", "branch: {branch}\ncommit: {commit}", "{branch}",
89 False, "{branch}/{commit_count}-g{commit}/{tag_number}",
90 'Test run #{tag_number} of {branch}:{commit}', '',
91 [], [], False, keywords, logger)
92 self.assertTrue(tag_exists(git_obj, second_tag), msg=f"Second tag {second_tag} has not been created")
93 delete_fake_repository(path)
94
95 def test_get_revs_on_branch(self):
96 fake_tags_list=["main/10-g0f7d5df/0", "main/10-g0f7d5df/1", "foo/20-g2468f5d/0"]
97 tag_name = "{branch}/{commit_number}-g{commit}/{tag_number}"
98
99 path, git_obj = create_fake_repository(True, fake_tags_list)
100 revs = ga.get_test_revs(logger, git_obj, tag_name, branch="main")
101 self.assertEqual(len(revs), 1)
102 self.assertEqual(revs[0].commit, "0f7d5df")
103 self.assertEqual(len(revs[0].tags), 2)
104 self.assertEqual(revs[0].tags, ['main/10-g0f7d5df/0', 'main/10-g0f7d5df/1'])
105 delete_fake_repository(path)
106
107 def test_get_tags_without_valid_remote(self):
108 url = 'git://git.yoctoproject.org/poky'
109 path, git_obj = create_fake_repository(False, None, False)
110
111 tags = ga.get_tags(git_obj, self.log, pattern="yocto-*", url=url)
112 """Test for some well established tags (released tags)"""
113 self.assertIn("yocto-4.0", tags)
114 self.assertIn("yocto-4.1", tags)
115 self.assertIn("yocto-4.2", tags)
116 delete_fake_repository(path)
117
118 def test_get_tags_with_only_local_tag(self):
119 fake_tags_list=["main/10-g0f7d5df/0", "main/10-g0f7d5df/1", "foo/20-g2468f5d/0"]
120 path, git_obj = create_fake_repository(True, fake_tags_list, False)
121
122 """No remote is configured and no url is passed: get_tags must fall
123 back to local tags
124 """
125 tags = ga.get_tags(git_obj, self.log)
126 self.assertCountEqual(tags, fake_tags_list)
127 delete_fake_repository(path)
128
129 def test_get_tags_without_valid_remote_and_wrong_url(self):
130 url = 'git://git.foo.org/bar'
131 path, git_obj = create_fake_repository(False, None, False)
132
133 """Test for some well established tags (released tags)"""
134 with self.assertRaises(GitError):
135 tags = ga.get_tags(git_obj, self.log, pattern="yocto-*", url=url)
136 delete_fake_repository(path)