Andrew Geissler | 5082cc7 | 2023-09-11 08:41:39 -0400 | [diff] [blame] | 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) |