1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
/*
* Copyright (C) 2019, Google LLC. and others
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Distribution License v. 1.0 which is available at
* https://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
package org.eclipse.jgit.revwalk;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.Optional;
import java.util.stream.Stream;
import org.eclipse.jgit.internal.storage.file.FileRepository;
import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
import org.eclipse.jgit.junit.TestRepository;
import org.junit.Before;
import org.junit.Test;
public abstract class ReachabilityCheckerTestCase
extends LocalDiskRepositoryTestCase {
protected abstract ReachabilityChecker getChecker(
TestRepository<FileRepository> repository) throws Exception;
TestRepository<FileRepository> repo;
/** {@inheritDoc} */
@Override
@Before
public void setUp() throws Exception {
super.setUp();
FileRepository db = createWorkRepository();
repo = new TestRepository<>(db);
}
@Test
public void reachable() throws Exception {
RevCommit a = repo.commit().create();
RevCommit b1 = repo.commit(a);
RevCommit b2 = repo.commit(b1);
RevCommit c1 = repo.commit(a);
RevCommit c2 = repo.commit(c1);
repo.update("refs/heads/checker", b2);
ReachabilityChecker checker = getChecker(repo);
assertReachable("reachable from one tip",
checker.areAllReachable(Arrays.asList(a), Stream.of(c2)));
assertReachable("reachable from another tip",
checker.areAllReachable(Arrays.asList(a), Stream.of(b2)));
assertReachable("reachable from itself",
checker.areAllReachable(Arrays.asList(a), Stream.of(b2)));
}
@Test
public void reachable_merge() throws Exception {
RevCommit a = repo.commit().create();
RevCommit b1 = repo.commit(a);
RevCommit b2 = repo.commit(b1);
RevCommit c1 = repo.commit(a);
RevCommit c2 = repo.commit(c1);
RevCommit merge = repo.commit(c2, b2);
repo.update("refs/heads/checker", merge);
ReachabilityChecker checker = getChecker(repo);
assertReachable("reachable through one branch",
checker.areAllReachable(Arrays.asList(b1),
Stream.of(merge)));
assertReachable("reachable through another branch",
checker.areAllReachable(Arrays.asList(c1),
Stream.of(merge)));
assertReachable("reachable, before the branching",
checker.areAllReachable(Arrays.asList(a),
Stream.of(merge)));
}
@Test
public void unreachable_isLaterCommit() throws Exception {
RevCommit a = repo.commit().create();
RevCommit b1 = repo.commit(a);
RevCommit b2 = repo.commit(b1);
repo.update("refs/heads/checker", b2);
ReachabilityChecker checker = getChecker(repo);
assertUnreachable("unreachable from the future",
checker.areAllReachable(Arrays.asList(b2), Stream.of(b1)));
}
@Test
public void unreachable_differentBranch() throws Exception {
RevCommit a = repo.commit().create();
RevCommit b1 = repo.commit(a);
RevCommit b2 = repo.commit(b1);
RevCommit c1 = repo.commit(a);
repo.update("refs/heads/checker", b2);
ReachabilityChecker checker = getChecker(repo);
assertUnreachable("unreachable from different branch",
checker.areAllReachable(Arrays.asList(c1), Stream.of(b2)));
}
@Test
public void reachable_longChain() throws Exception {
RevCommit root = repo.commit().create();
RevCommit head = root;
for (int i = 0; i < 10000; i++) {
head = repo.commit(head);
}
repo.update("refs/heads/master", head);
ReachabilityChecker checker = getChecker(repo);
assertReachable("reachable with long chain in the middle", checker
.areAllReachable(Arrays.asList(root), Stream.of(head)));
}
private static void assertReachable(String msg,
Optional<RevCommit> result) {
assertFalse(msg, result.isPresent());
}
private static void assertUnreachable(String msg,
Optional<RevCommit> result) {
assertTrue(msg, result.isPresent());
}
}
|