Skip to content

Commit 099356b

Browse files
committed
Refactor impact_test.py and impact_git_test.py
1 parent aced9ab commit 099356b

File tree

3 files changed

+102
-61
lines changed

3 files changed

+102
-61
lines changed

osv/impact_git_test.py

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,60 @@
66

77
class TestImpactTest(unittest.TestCase):
88

9-
def test_range_simple(self):
10-
"""TODO see doc """
11-
12-
13-
repo_analyzer = impact.RepoAnalyzer()
14-
## create a mock repo
15-
repo = TestRepository('test')
16-
first = repo.add_empty_commit()
17-
second = repo.add_empty_commit(parents=[first],vulnerability=TestRepository.VulnerabilityType.INTRODUCED)
18-
third = repo.add_empty_commit(
19-
parents=[second])
20-
fourth = repo.add_empty_commit(
21-
parents=[third], vulnerability=TestRepository.VulnerabilityType.FIXED)
22-
(all_introduced, all_fixed, all_last_affected,
23-
all_limit) = repo.get_ranges()
9+
10+
def test_introduced_fixed_linear(self):
11+
12+
repo_analyzer = impact.RepoAnalyzer(detect_cherrypicks=False)
13+
repo = TestRepository('test_introduced_fixed_linear')
14+
15+
16+
first = repo.add_empty_commit(vulnerability=TestRepository.VulnerabilityType.INTRODUCED)
17+
second = repo.add_empty_commit(parents=[first])
18+
third = repo.add_empty_commit(parents=[second], vulnerability=TestRepository.VulnerabilityType.FIXED)
19+
(all_introduced, all_fixed, all_last_affected,all_limit) = repo.get_ranges()
2420

2521
result = repo_analyzer.get_affected(repo.repo, all_introduced, all_fixed,
2622
all_limit, all_last_affected)
27-
for commit in result.commits:
28-
print(commit)
23+
24+
expected = set([first.hex, second.hex])
25+
repo.remove()
26+
self.assertEqual(result.commits, expected )
27+
28+
def test_introduced_fixed_branch_propagation(self):
29+
30+
repo_analyzer = impact.RepoAnalyzer(detect_cherrypicks=False)
31+
repo = TestRepository('test_introduced_fixed_branch_propagation')
32+
33+
34+
first = repo.add_empty_commit(vulnerability=TestRepository.VulnerabilityType.INTRODUCED)
35+
second = repo.add_empty_commit(parents=[first])
36+
third = repo.add_empty_commit(parents=[second], vulnerability=TestRepository.VulnerabilityType.FIXED)
37+
fourth = repo.add_empty_commit(parents=[second])
38+
(all_introduced, all_fixed, all_last_affected,all_limit) = repo.get_ranges()
39+
40+
result = repo_analyzer.get_affected(repo.repo, all_introduced, all_fixed,
41+
all_limit, all_last_affected)
42+
43+
expected = set([first.hex,second.hex,fourth.hex])
44+
repo.remove()
45+
self.assertEqual(result.commits, expected )
46+
47+
def test_introduced_fixed_merge(self):
48+
49+
repo_analyzer = impact.RepoAnalyzer(detect_cherrypicks=False)
50+
repo = TestRepository('test_introduced_fixed_merge')
51+
52+
53+
first = repo.add_empty_commit(vulnerability=TestRepository.VulnerabilityType.INTRODUCED)
54+
second = repo.add_empty_commit()
55+
third = repo.add_empty_commit(parents=[first,second])
56+
fourth = repo.add_empty_commit(parents=[third], vulnerability=TestRepository.VulnerabilityType.FIXED)
57+
(all_introduced, all_fixed, all_last_affected,all_limit) = repo.get_ranges()
58+
59+
result = repo_analyzer.get_affected(repo.repo, all_introduced, all_fixed,
60+
all_limit, all_last_affected)
61+
62+
expected = set([first.hex,third.hex])
63+
repo.remove()
64+
self.assertEqual(result.commits, expected, "Expected: %s, got: %s" % (expected, result.commits))
2965

osv/impact_test.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,3 @@ def test_update_no_commits(self):
146146
impact.update_affected_commits('BUG-1', set(), True)
147147
affected_commits = list(models.AffectedCommits.query())
148148
self.assertEqual(0, len(affected_commits))
149-
150-
151-
def test_range_simple():
152-
repo_analyzer = impact.RepoAnalyzer()
153-
linear3_repo = pygit2.Repository
154-
linear3_repo.ad
155-
156-
157-
repo_analyzer.get_affected()

osv/test_tools/test_repository.py

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from enum import Enum
55
import os
66
import shutil
7-
7+
import uuid
88

99
class TestRepository:
1010

@@ -18,19 +18,31 @@ class VulnerabilityType(Enum):
1818
__AUTHOR = pygit2.Signature('John Smith', '[email protected]')
1919
__COMMITER = pygit2.Signature('John Smith', '[email protected]')
2020

21+
__initialCommit = None
22+
2123
introduced = []
2224
fixed = []
2325
last_affected = []
2426
limit = []
2527

26-
def __init__(self, name: str):
28+
def __init__(self, name: str,debug:bool = False):
29+
self.debug = debug
2730
self.name = name
2831
if (os.path.exists(f"osv/testdata/test_repositories/{name}")):
2932
shutil.rmtree(f"osv/testdata/test_repositories/{name}")
3033
self.repo = pygit2.init_repository(
3134
f"osv/testdata/test_repositories/{name}", bare=False)
32-
#pygit2.settings.enable_caching(True)
33-
35+
#empty initial commit usefull for the creation of the repository
36+
tree = self.repo.TreeBuilder().write()
37+
self.__initialCommit = self.repo.create_commit('refs/heads/main', self.__AUTHOR,
38+
self.__COMMITER, "message", tree, [])
39+
self.create_branch(f"branch_{self.__initialCommit.hex}", self.__initialCommit)
40+
self.repo.references.create(f"refs/remotes/origin/main", self.__initialCommit)
41+
42+
def create_branch(self, name: str, commit: pygit2.Oid):
43+
self.repo.references.create(f'refs/heads/{name}', commit)
44+
self.repo.references.create(f'refs/remotes/origin/{name}', commit)
45+
3446
def add_empty_commit(
3547
self,
3648
vulnerability: VulnerabilityType = VulnerabilityType.NONE,
@@ -41,41 +53,36 @@ def add_empty_commit(
4153
"""
4254

4355
tree = self.repo.TreeBuilder().write()
44-
56+
self.__AUTHOR = pygit2.Signature(str(uuid.uuid1()), '[email protected]')
4557
commit = None
4658

47-
if (self.repo.is_empty):
48-
commit = self.repo.create_commit('refs/heads/master', self.__AUTHOR,
49-
self.__COMMITER, message, tree, [])
50-
self.repo.references.create('refs/remotes/{0}/{1}'.format("origin", "master"), commit)
51-
else:
59+
60+
if (len(parents) == 0):
61+
self.repo.create_branch(
62+
f'branch_temp', self.repo.revparse_single(self.__initialCommit.hex))
63+
commit = self.repo.create_commit('refs/heads/branch_temp', self.__AUTHOR,
64+
self.__COMMITER, message, tree, [self.__initialCommit])
5265

53-
created_branch: pygit2.Branch = None
54-
branch_commit: pygit2.Commit = None
55-
for parent in parents:
56-
if (self.__has_children(parent)):
57-
created_branch = self.repo.create_branch(
58-
f'branch_{parent.hex}', self.repo.revparse_single(parent.hex))
59-
branch_commit = parent
60-
self.repo.checkout(created_branch.name)
61-
break
66+
self.repo.branches.delete(
67+
f'branch_temp')
68+
self.create_branch(
69+
f'branch_{commit.hex}', commit)
6270

63-
if (created_branch is None):
64-
commit = self.repo.create_commit('refs/heads/master', self.__AUTHOR,
65-
self.__COMMITER, message, tree,
66-
parents)
67-
else:
68-
parents.remove(branch_commit)
69-
parents.insert(0, branch_commit)
70-
commit = self.repo.create_commit(created_branch.name, self.__AUTHOR,
71-
self.__COMMITER, message, tree,
72-
parents)
73-
self.repo.references.create('refs/remotes/{0}/{1}'.format("origin", branch_commit.name), commit)
74-
75-
self.repo.checkout('refs/heads/master')
76-
headCommit = self.repo.head.target
77-
self.repo.references.delete('refs/remotes/{0}/{1}'.format("origin", "master"))
78-
self.repo.references.create('refs/remotes/{0}/{1}'.format("origin", "master"),headCommit)
71+
else:
72+
self.repo.create_branch(
73+
f'branch_temp', self.repo.revparse_single(parents[0].hex))
74+
commit = self.repo.create_commit('refs/heads/branch_temp', self.__AUTHOR,
75+
self.__COMMITER, message, tree, parents)
76+
self.repo.branches.delete(
77+
f'branch_temp')
78+
self.create_branch(commit=commit, name=f'branch_{commit.hex}')
79+
80+
self.repo.references.get('refs/remotes/{0}/{1}'.format("origin", "main")).set_target(commit)
81+
self.repo.references.get('refs/heads/main').set_target(commit)
82+
83+
if self.debug:
84+
os.system(f"echo ------------------------------------------------------------------")
85+
os.system(f"git -C /home/creux/Documents/software_heritage/swhsec/osv.dev/osv/testdata/test_repositories/test log --all --graph --decorate")
7986

8087
#self.repo.branches.delete(created_branch.branch_name)
8188

@@ -94,6 +101,8 @@ def add_empty_commit(
94101
raise ValueError("Invalid vulnerability type")
95102
return commit
96103

104+
105+
97106
def __has_children(self, commit: pygit2.Commit) -> bool:
98107
for current_commit in self.repo.walk(self.repo.head.target,
99108
pygit2.GIT_SORT_TOPOLOGICAL):
@@ -102,6 +111,11 @@ def __has_children(self, commit: pygit2.Commit) -> bool:
102111
return True
103112
return False
104113

114+
def remove(self):
115+
shutil.rmtree(f"osv/testdata/test_repositories/{self.name}/")
116+
while os.path.exists(f"osv/testdata/test_repositories/{self.name}/"): # check if it exists
117+
pass
118+
105119
def get_ranges(self):
106120
"""
107121
return the ranges of the repository

0 commit comments

Comments
 (0)