Browse Source

Refactor ReadTreeTest to allow testing other checkout classes

ReadTreeTest contains a lot of useful tests for "checkout"
implementations. But ReadTreeTest was hardcoded to test only
WorkDirCheckout. This change doesn't add/modify any tests semantically
but refactors ReadTreeTest so that a different implementations of
checkout can be tested. This was done to allow DirCacheCheckout to be
tested without rewriting all these tests.

Change-Id: I36e34264482b855ed22c9dde98824f573cf8ae22
Signed-off-by: Christian Halstrick <christian.halstrick@sap.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
tags/v0.9.1
Christian Halstrick 14 years ago
parent
commit
eca2946457
1 changed files with 96 additions and 41 deletions
  1. 96
    41
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReadTreeTest.java

+ 96
- 41
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReadTreeTest.java View File

@@ -2,6 +2,7 @@
* Copyright (C) 2007, Dave Watson <dwatson@mimvista.com>
* Copyright (C) 2008-2009, Robin Rosenberg <robin.rosenberg@dewire.com>
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
* Copyright (C) 2010, Christian Halstrick <christian.halstrick@sap.com>
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
@@ -49,6 +50,7 @@ import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;

import org.eclipse.jgit.errors.CheckoutConflictException;
@@ -58,7 +60,7 @@ public class ReadTreeTest extends RepositoryTestCase {
private Tree theHead;
private Tree theMerge;
private GitIndex theIndex;
private WorkDirCheckout theReadTree;
private Checkout theReadTree;
// Each of these rules are from the read-tree manpage
// go there to see what they mean.
// Rule 0 is left out for obvious reasons :)
@@ -71,23 +73,23 @@ public class ReadTreeTest extends RepositoryTestCase {
headFile.setId(objectId);
Tree merge = new Tree(db);

WorkDirCheckout readTree = new WorkDirCheckout(db, trash, head, index, merge);
Checkout readTree = getCheckoutImpl(head, index, merge);
readTree.prescanTwoTrees();

assertTrue(readTree.removed.contains("foo"));
assertTrue(readTree.removed().contains("foo"));

readTree = new WorkDirCheckout(db, trash, merge, index, head);
readTree = getCheckoutImpl(merge, index, head);
readTree.prescanTwoTrees();

assertEquals(objectId, readTree.updated.get("foo"));
assertEquals(objectId, readTree.updated().get("foo"));

ObjectId anotherId = ObjectId.fromString("ba78e065e2c261d4f7b8f42107588051e87e18ee");
merge.addFile("foo").setId(anotherId);

readTree = new WorkDirCheckout(db, trash, head, index, merge);
readTree = getCheckoutImpl(head, index, merge);
readTree.prescanTwoTrees();

assertEquals(anotherId, readTree.updated.get("foo"));
assertEquals(anotherId, readTree.updated().get("foo"));
}

void setupCase(HashMap<String, String> headEntries,
@@ -134,8 +136,8 @@ public class ReadTreeTest extends RepositoryTestCase {
return null;
}

private WorkDirCheckout go() throws IOException {
theReadTree = new WorkDirCheckout(db, trash, theHead, theIndex, theMerge);
private Checkout go() throws IOException {
theReadTree = getCheckoutImpl(theHead, theIndex, theMerge);
theReadTree.prescanTwoTrees();
return theReadTree;
}
@@ -152,9 +154,9 @@ public class ReadTreeTest extends RepositoryTestCase {
setupCase(null, null, idxMap);
theReadTree = go();

assertTrue(theReadTree.updated.isEmpty());
assertTrue(theReadTree.removed.isEmpty());
assertTrue(theReadTree.conflicts.isEmpty());
assertTrue(theReadTree.updated().isEmpty());
assertTrue(theReadTree.removed().isEmpty());
assertTrue(theReadTree.conflicts().isEmpty());

// rules 6 and 7
idxMap = new HashMap<String, String>();
@@ -172,9 +174,9 @@ public class ReadTreeTest extends RepositoryTestCase {
setupCase(null, mergeMap, idxMap);
go();

assertTrue(theReadTree.updated.isEmpty());
assertTrue(theReadTree.removed.isEmpty());
assertTrue(theReadTree.conflicts.contains("foo"));
assertTrue(theReadTree.updated().isEmpty());
assertTrue(theReadTree.removed().isEmpty());
assertTrue(theReadTree.conflicts().contains("foo"));

// rule 10

@@ -183,9 +185,9 @@ public class ReadTreeTest extends RepositoryTestCase {
setupCase(headMap, null, idxMap);
go();

assertTrue(theReadTree.removed.contains("foo"));
assertTrue(theReadTree.updated.isEmpty());
assertTrue(theReadTree.conflicts.isEmpty());
assertTrue(theReadTree.removed().contains("foo"));
assertTrue(theReadTree.updated().isEmpty());
assertTrue(theReadTree.conflicts().isEmpty());

// rule 11
setupCase(headMap, null, idxMap);
@@ -194,18 +196,18 @@ public class ReadTreeTest extends RepositoryTestCase {
theIndex.getMembers()[0].forceRecheck();
go();

assertTrue(theReadTree.removed.isEmpty());
assertTrue(theReadTree.updated.isEmpty());
assertTrue(theReadTree.conflicts.contains("foo"));
assertTrue(theReadTree.removed().isEmpty());
assertTrue(theReadTree.updated().isEmpty());
assertTrue(theReadTree.conflicts().contains("foo"));

// rule 12 & 13
headMap.put("foo", "head");
setupCase(headMap, null, idxMap);
go();

assertTrue(theReadTree.removed.isEmpty());
assertTrue(theReadTree.updated.isEmpty());
assertTrue(theReadTree.conflicts.contains("foo"));
assertTrue(theReadTree.removed().isEmpty());
assertTrue(theReadTree.updated().isEmpty());
assertTrue(theReadTree.conflicts().contains("foo"));

// rules 14 & 15
setupCase(headMap, headMap, idxMap);
@@ -215,7 +217,7 @@ public class ReadTreeTest extends RepositoryTestCase {

// rules 16 & 17
setupCase(headMap, mergeMap, idxMap); go();
assertTrue(theReadTree.conflicts.contains("foo"));
assertTrue(theReadTree.conflicts().contains("foo"));

// rules 18 & 19
setupCase(headMap, idxMap, idxMap); go();
@@ -223,7 +225,7 @@ public class ReadTreeTest extends RepositoryTestCase {

// rule 20
setupCase(idxMap, mergeMap, idxMap); go();
assertTrue(theReadTree.updated.containsKey("foo"));
assertTrue(theReadTree.updated().containsKey("foo"));

// rules 21
setupCase(idxMap, mergeMap, idxMap);
@@ -231,13 +233,13 @@ public class ReadTreeTest extends RepositoryTestCase {
writeTrashFile("foo", "bar");
theIndex.getMembers()[0].forceRecheck();
go();
assertTrue(theReadTree.conflicts.contains("foo"));
assertTrue(theReadTree.conflicts().contains("foo"));
}

private void assertAllEmpty() {
assertTrue(theReadTree.removed.isEmpty());
assertTrue(theReadTree.updated.isEmpty());
assertTrue(theReadTree.conflicts.isEmpty());
assertTrue(theReadTree.removed().isEmpty());
assertTrue(theReadTree.updated().isEmpty());
assertTrue(theReadTree.conflicts().isEmpty());
}

public void testDirectoryFileSimple() throws IOException {
@@ -254,20 +256,20 @@ public class ReadTreeTest extends RepositoryTestCase {
recursiveDelete(new File(trash, "DF"));

theIndex.add(trash, writeTrashFile("DF", "DF"));
theReadTree = new WorkDirCheckout(db, trash, treeDF, theIndex, treeDFDF);
theReadTree = getCheckoutImpl(treeDF, theIndex, treeDFDF);
theReadTree.prescanTwoTrees();

assertTrue(theReadTree.removed.contains("DF"));
assertTrue(theReadTree.updated.containsKey("DF/DF"));
assertTrue(theReadTree.removed().contains("DF"));
assertTrue(theReadTree.updated().containsKey("DF/DF"));

recursiveDelete(new File(trash, "DF"));
theIndex = new GitIndex(db);
theIndex.add(trash, writeTrashFile("DF/DF", "DF/DF"));

theReadTree = new WorkDirCheckout(db, trash, treeDFDF, theIndex, treeDF);
theReadTree = getCheckoutImpl(treeDFDF, theIndex, treeDF);
theReadTree.prescanTwoTrees();
assertTrue(theReadTree.removed.contains("DF/DF"));
assertTrue(theReadTree.updated.containsKey("DF"));
assertTrue(theReadTree.removed().contains("DF/DF"));
assertTrue(theReadTree.updated().containsKey("DF"));
}

/*
@@ -473,19 +475,19 @@ public class ReadTreeTest extends RepositoryTestCase {
}

private void assertConflict(String s) {
assertTrue(theReadTree.conflicts.contains(s));
assertTrue(theReadTree.conflicts().contains(s));
}

private void assertUpdated(String s) {
assertTrue(theReadTree.updated.containsKey(s));
assertTrue(theReadTree.updated().containsKey(s));
}

private void assertRemoved(String s) {
assertTrue(theReadTree.removed.contains(s));
assertTrue(theReadTree.removed().contains(s));
}

private void assertNoConflicts() {
assertTrue(theReadTree.conflicts.isEmpty());
assertTrue(theReadTree.conflicts().isEmpty());
}

private void doit(HashMap<String, String> h, HashMap<String, String>m,
@@ -551,7 +553,7 @@ public class ReadTreeTest extends RepositoryTestCase {
}

private void checkout() throws IOException {
theReadTree = new WorkDirCheckout(db, trash, theHead, theIndex, theMerge);
theReadTree = getCheckoutImpl(theHead, theIndex, theMerge);
theReadTree.checkout();
}

@@ -578,4 +580,57 @@ public class ReadTreeTest extends RepositoryTestCase {
// should have thrown
}
}

/**
* The interface these tests need from a class implementing a checkout
*/
interface Checkout {
HashMap<String, ObjectId> updated();
ArrayList<String> conflicts();
ArrayList<String> removed();
void prescanTwoTrees() throws IOException;
void checkout() throws IOException;
}

/**
* Return the current implementation of the {@link Checkout} interface.
* <p>
* May be overridden by subclasses which would inherit all tests but can
* specify their own implementation of a Checkout
*
* @param head
* @param index
* @param merge
* @return the current implementation of {@link Checkout}
*/
protected Checkout getCheckoutImpl(Tree head, GitIndex index,
Tree merge) {
return new WorkdirCheckoutImpl(head, index, merge);
}

/**
* An implementation of the {@link Checkout} interface which uses {@link WorkDirCheckout}
*/
class WorkdirCheckoutImpl extends WorkDirCheckout implements Checkout {
public WorkdirCheckoutImpl(Tree head, GitIndex index,
Tree merge) {
super(db, trash, head, index, merge);
}

public HashMap<String, ObjectId> updated() {
return updated;
}

public ArrayList<String> conflicts() {
return conflicts;
}

public ArrayList<String> removed() {
return removed;
}

public void prescanTwoTrees() throws IOException {
super.prescanTwoTrees();
}
}
}

Loading…
Cancel
Save