aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test/tst
diff options
context:
space:
mode:
authorIvan Frade <ifrade@google.com>2020-04-03 21:48:34 -0700
committerIvan Frade <ifrade@google.com>2020-04-28 16:56:32 -0700
commit20bb3124218ed93956450fb30a95b2277db590c5 (patch)
tree4718b35b77ac939d06a7f5dc5518590f538e5bcc /org.eclipse.jgit.test/tst
parentae26fa19b7945960fc6e8bf2ab64ec128836ea6d (diff)
downloadjgit-20bb3124218ed93956450fb30a95b2277db590c5.tar.gz
jgit-20bb3124218ed93956450fb30a95b2277db590c5.zip
revwalk: Extract ObjectReachabilityChecker interface
Extract ObjectReachabilityChecker interface from the walk-based implementation, to add a bitmapped based implementation later. Refactor the test case to use it for both implementations. Change-Id: Iaac7c6b037723811956ac22625f27d3b4d742139 Signed-off-by: Ivan Frade <ifrade@google.com>
Diffstat (limited to 'org.eclipse.jgit.test/tst')
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/ObjectReachabilityTestCase.java143
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/PedestrianObjectReachabilityTest.java138
2 files changed, 146 insertions, 135 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/ObjectReachabilityTestCase.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/ObjectReachabilityTestCase.java
new file mode 100644
index 0000000000..267b163f43
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/ObjectReachabilityTestCase.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2020, 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.eclipse.jgit.junit.TestRepository.CommitBuilder;
+import org.junit.Before;
+import org.junit.Test;
+
+public abstract class ObjectReachabilityTestCase
+ extends LocalDiskRepositoryTestCase {
+
+ private TestRepository<FileRepository> repo;
+ private AddressableRevCommit baseCommit;
+ private AddressableRevCommit branchACommit;
+ private AddressableRevCommit branchBCommit;
+ private AddressableRevCommit mergeCommit;
+
+ abstract ObjectReachabilityChecker getChecker(
+ TestRepository<FileRepository> repository) throws Exception;
+
+ // Pair of commit and blob inside it
+ protected static class AddressableRevCommit {
+ RevCommit commit;
+
+ RevBlob blob;
+
+ AddressableRevCommit(RevCommit commit, RevBlob blob) {
+ this.commit = commit;
+ this.blob = blob;
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ FileRepository db = createWorkRepository();
+ repo = new TestRepository<>(db);
+ prepareRepo();
+ }
+
+ @Test
+ public void blob_in_base_reachable_from_branches() throws Exception {
+ ObjectReachabilityChecker checker = getChecker(repo);
+
+ RevObject baseBlob = baseCommit.blob;
+ assertReachable("reachable from one branch", checker.areAllReachable(
+ Arrays.asList(baseBlob), Stream.of(branchACommit.commit)));
+ assertReachable("reachable from another branch",
+ checker.areAllReachable(
+ Arrays.asList(baseBlob),
+ Stream.of(branchBCommit.commit)));
+ }
+
+ @Test
+ public void blob_reachable_from_owning_commit() throws Exception {
+ ObjectReachabilityChecker checker = getChecker(repo);
+
+ RevObject branchABlob = branchACommit.blob;
+ assertReachable("reachable from itself",
+ checker.areAllReachable(Arrays.asList(branchABlob),
+ Stream.of(branchACommit.commit)));
+ }
+
+ @Test
+ public void blob_in_branch_reachable_from_merge() throws Exception {
+ ObjectReachabilityChecker checker = getChecker(repo);
+
+ RevObject branchABlob = branchACommit.blob;
+ assertReachable("reachable from merge", checker.areAllReachable(
+ Arrays.asList(branchABlob), Stream.of(mergeCommit.commit)));
+ }
+
+ @Test
+ public void blob_unreachable_from_earlier_commit() throws Exception {
+ ObjectReachabilityChecker checker = getChecker(repo);
+
+ RevObject branchABlob = branchACommit.blob;
+ assertUnreachable("unreachable from earlier commit",
+ checker.areAllReachable(Arrays.asList(branchABlob),
+ Stream.of(baseCommit.commit)));
+ }
+
+ @Test
+ public void blob_unreachable_from_parallel_branch() throws Exception {
+ ObjectReachabilityChecker checker = getChecker(repo);
+
+ RevObject branchABlob = branchACommit.blob;
+ assertUnreachable("unreachable from another branch",
+ checker.areAllReachable(Arrays.asList(branchABlob),
+ Stream.of(branchBCommit.commit)));
+ }
+
+ private void prepareRepo() throws Exception {
+ baseCommit = createCommit("base");
+ branchACommit = createCommit("branchA", baseCommit);
+ branchBCommit = createCommit("branchB", baseCommit);
+ mergeCommit = createCommit("merge", branchACommit, branchBCommit);
+
+ // Bitmaps are generated from references
+ repo.update("refs/heads/a", branchACommit.commit);
+ repo.update("refs/heads/b", branchBCommit.commit);
+ repo.update("refs/heads/merge", mergeCommit.commit);
+ }
+
+ private AddressableRevCommit createCommit(String blobPath, AddressableRevCommit... parents) throws Exception {
+ RevBlob blob = repo.blob(blobPath + " content");
+ CommitBuilder commitBuilder = repo.commit();
+ for (int i = 0; i < parents.length; i++) {
+ commitBuilder.parent(parents[i].commit);
+ }
+ commitBuilder.add(blobPath, blob);
+
+ RevCommit commit = commitBuilder.create();
+ return new AddressableRevCommit(commit, blob);
+ }
+
+ private static void assertReachable(String msg, Optional<RevObject> result) {
+ assertFalse(msg, result.isPresent());
+ }
+
+ private static void assertUnreachable(String msg, Optional<RevObject> result) {
+ assertTrue(msg, result.isPresent());
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/PedestrianObjectReachabilityTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/PedestrianObjectReachabilityTest.java
index f8fc0c9719..b1c9556df8 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/PedestrianObjectReachabilityTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/PedestrianObjectReachabilityTest.java
@@ -9,149 +9,17 @@
*/
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.eclipse.jgit.junit.TestRepository.CommitBuilder;
-import org.junit.Before;
-import org.junit.Test;
public class PedestrianObjectReachabilityTest
- extends LocalDiskRepositoryTestCase {
+ extends ObjectReachabilityTestCase {
- PedestrianObjectReachabilityChecker getChecker(
+ @Override
+ ObjectReachabilityChecker getChecker(
TestRepository<FileRepository> repository)
throws Exception {
return new PedestrianObjectReachabilityChecker(
repository.getRevWalk().toObjectWalkWithSameObjects());
}
-
- private TestRepository<FileRepository> repo;
-
- private AddressableRevCommit baseCommit;
-
- private AddressableRevCommit branchACommit;
-
- private AddressableRevCommit branchBCommit;
-
- private AddressableRevCommit mergeCommit;
-
- /** {@inheritDoc} */
- @Override
- @Before
- public void setUp() throws Exception {
- super.setUp();
- FileRepository db = createWorkRepository();
- repo = new TestRepository<>(db);
- prepareRepo();
- }
-
- @Test
- public void blob_in_base_reachable_from_branches() throws Exception {
- PedestrianObjectReachabilityChecker checker = getChecker(repo);
-
- RevObject baseBlob = baseCommit.blob;
- assertReachable("reachable from one branch", checker.areAllReachable(
- Arrays.asList(baseBlob), Stream.of(branchACommit.commit)));
- assertReachable("reachable from another branch",
- checker.areAllReachable(
- Arrays.asList(baseBlob), Stream.of(branchBCommit.commit)));
- }
-
- @Test
- public void blob_reachable_from_owning_commit() throws Exception {
- PedestrianObjectReachabilityChecker checker = getChecker(repo);
-
- RevObject branchABlob = branchACommit.blob;
- assertReachable("reachable from itself",
- checker.areAllReachable(Arrays.asList(branchABlob),
- Stream.of(branchACommit.commit)));
- }
-
- @Test
- public void blob_in_branch_reachable_from_merge() throws Exception {
- PedestrianObjectReachabilityChecker checker = getChecker(repo);
-
- RevObject branchABlob = branchACommit.blob;
- assertReachable("reachable from merge", checker.areAllReachable(
- Arrays.asList(branchABlob), Stream.of(mergeCommit.commit)));
- }
-
- @Test
- public void blob_unreachable_from_earlier_commit() throws Exception {
- PedestrianObjectReachabilityChecker checker = getChecker(repo);
-
- RevObject branchABlob = branchACommit.blob;
- assertUnreachable("unreachable from earlier commit",
- checker.areAllReachable(Arrays.asList(branchABlob),
- Stream.of(baseCommit.commit)));
- }
-
- @Test
- public void blob_unreachable_from_parallel_branch() throws Exception {
- PedestrianObjectReachabilityChecker checker = getChecker(repo);
-
- RevObject branchABlob = branchACommit.blob;
- assertUnreachable("unreachable from another branch",
- checker.areAllReachable(Arrays.asList(branchABlob),
- Stream.of(branchBCommit.commit)));
- }
-
- private void prepareRepo()
- throws Exception {
- baseCommit = createCommit("base");
- branchACommit = createCommit("branchA", baseCommit);
- branchBCommit = createCommit("branchB", baseCommit);
- mergeCommit = createCommit("merge", branchACommit, branchBCommit);
-
- // Bitmaps are generated from references
- // TODO(ifrade): These are not needed now, but will be when we use these
- // tests with the bitmap implementation.
- repo.update("refs/heads/a", branchACommit.commit);
- repo.update("refs/heads/b", branchBCommit.commit);
- repo.update("refs/heads/merge", mergeCommit.commit);
- }
-
- private AddressableRevCommit createCommit(String blobPath,
- AddressableRevCommit... parents) throws Exception {
- RevBlob blob = repo.blob(blobPath + " content");
- CommitBuilder commitBuilder = repo.commit();
- for (int i = 0; i < parents.length; i++) {
- commitBuilder.parent(parents[i].commit);
- }
- commitBuilder.add(blobPath, blob);
-
- RevCommit commit = commitBuilder.create();
- return new AddressableRevCommit(commit, blob);
- }
-
- // Pair of commit and blob inside it
- static class AddressableRevCommit {
- RevCommit commit;
-
- RevBlob blob;
-
- AddressableRevCommit(RevCommit commit, RevBlob blob) {
- this.commit = commit;
- this.blob = blob;
- }
- }
-
- private static void assertReachable(String msg,
- Optional<RevObject> result) {
- assertFalse(msg, result.isPresent());
- }
-
- private static void assertUnreachable(String msg,
- Optional<RevObject> result) {
- assertTrue(msg, result.isPresent());
- }
-
}