xref: /openbmc/openbmc/poky/meta/lib/oeqa/selftest/cases/gitarchivetests.py (revision 5082cc7fedfff6c28a1406c79606b09012b134bc)
1 #
2 # Copyright OpenEmbedded Contributors
3 #
4 # SPDX-License-Identifier: MIT
5 #
6 
7 import os
8 import sys
9 basepath = os.path.abspath(os.path.dirname(__file__) + '/../../../../../')
10 lib_path = basepath + '/scripts/lib'
11 sys.path = sys.path + [lib_path]
12 import oeqa.utils.gitarchive as ga
13 from oeqa.utils.git import GitError
14 import tempfile
15 import shutil
16 import scriptutils
17 import logging
18 from oeqa.selftest.case import OESelftestTestCase
19 
20 logger = scriptutils.logger_create('resulttool')
21 
22 def 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 
48 def delete_fake_repository(path):
49     shutil.rmtree(path)
50 
51 def 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 
57 class 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)
137