Close ObjectReaders in tests

Change-Id: Ic839af4f85861fb48091d45679e2a614f001d770
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
This commit is contained in:
Thomas Wolf 2019-10-21 11:38:00 +02:00
parent 123634e2aa
commit c020848dbb
4 changed files with 138 additions and 113 deletions

View File

@ -92,18 +92,22 @@ public void testInserterDiscardsPack() throws IOException {
@Test @Test
public void testReadFromInserterSmallObjects() throws IOException { public void testReadFromInserterSmallObjects() throws IOException {
ObjectInserter ins = db.newObjectInserter(); try (ObjectInserter ins = db.newObjectInserter()) {
ObjectId id1 = ins.insert(Constants.OBJ_BLOB, Constants.encode("foo")); ObjectId id1 = ins.insert(Constants.OBJ_BLOB,
ObjectId id2 = ins.insert(Constants.OBJ_BLOB, Constants.encode("bar")); Constants.encode("foo"));
assertEquals(0, db.getObjectDatabase().listPacks().size()); ObjectId id2 = ins.insert(Constants.OBJ_BLOB,
Constants.encode("bar"));
assertEquals(0, db.getObjectDatabase().listPacks().size());
ObjectReader reader = ins.newReader(); try (ObjectReader reader = ins.newReader()) {
assertSame(ins, reader.getCreatedFromInserter()); assertSame(ins, reader.getCreatedFromInserter());
assertEquals("foo", readString(reader.open(id1))); assertEquals("foo", readString(reader.open(id1)));
assertEquals("bar", readString(reader.open(id2))); assertEquals("bar", readString(reader.open(id2)));
assertEquals(0, db.getObjectDatabase().listPacks().size()); assertEquals(0, db.getObjectDatabase().listPacks().size());
ins.flush(); ins.flush();
assertEquals(1, db.getObjectDatabase().listPacks().size()); assertEquals(1, db.getObjectDatabase().listPacks().size());
}
}
} }
@Test @Test
@ -114,17 +118,19 @@ public void testReadFromInserterLargerObjects() throws IOException {
.setBlockLimit(2048)); .setBlockLimit(2048));
byte[] data = new TestRng(JGitTestUtil.getName()).nextBytes(8192); byte[] data = new TestRng(JGitTestUtil.getName()).nextBytes(8192);
DfsInserter ins = (DfsInserter) db.newObjectInserter(); try (DfsInserter ins = (DfsInserter) db.newObjectInserter()) {
ins.setCompressionLevel(Deflater.NO_COMPRESSION); ins.setCompressionLevel(Deflater.NO_COMPRESSION);
ObjectId id1 = ins.insert(Constants.OBJ_BLOB, data); ObjectId id1 = ins.insert(Constants.OBJ_BLOB, data);
assertEquals(0, db.getObjectDatabase().listPacks().size()); assertEquals(0, db.getObjectDatabase().listPacks().size());
ObjectReader reader = ins.newReader(); try (ObjectReader reader = ins.newReader()) {
assertSame(ins, reader.getCreatedFromInserter()); assertSame(ins, reader.getCreatedFromInserter());
assertTrue(Arrays.equals(data, readStream(reader.open(id1)))); assertTrue(Arrays.equals(data, readStream(reader.open(id1))));
assertEquals(0, db.getObjectDatabase().listPacks().size()); assertEquals(0, db.getObjectDatabase().listPacks().size());
ins.flush(); }
ins.flush();
}
List<DfsPackDescription> packs = db.getObjectDatabase().listPacks(); List<DfsPackDescription> packs = db.getObjectDatabase().listPacks();
assertEquals(1, packs.size()); assertEquals(1, packs.size());
assertTrue(packs.get(0).getFileSize(PackExt.PACK) > 2048); assertTrue(packs.get(0).getFileSize(PackExt.PACK) > 2048);
@ -132,48 +138,58 @@ public void testReadFromInserterLargerObjects() throws IOException {
@Test @Test
public void testReadFromFallback() throws IOException { public void testReadFromFallback() throws IOException {
ObjectInserter ins = db.newObjectInserter(); try (ObjectInserter ins = db.newObjectInserter()) {
ObjectId id1 = ins.insert(Constants.OBJ_BLOB, Constants.encode("foo")); ObjectId id1 = ins.insert(Constants.OBJ_BLOB,
ins.flush(); Constants.encode("foo"));
ObjectId id2 = ins.insert(Constants.OBJ_BLOB, Constants.encode("bar")); ins.flush();
assertEquals(1, db.getObjectDatabase().listPacks().size()); ObjectId id2 = ins.insert(Constants.OBJ_BLOB,
Constants.encode("bar"));
assertEquals(1, db.getObjectDatabase().listPacks().size());
ObjectReader reader = ins.newReader(); try (ObjectReader reader = ins.newReader()) {
assertSame(ins, reader.getCreatedFromInserter()); assertSame(ins, reader.getCreatedFromInserter());
assertEquals("foo", readString(reader.open(id1))); assertEquals("foo", readString(reader.open(id1)));
assertEquals("bar", readString(reader.open(id2))); assertEquals("bar", readString(reader.open(id2)));
assertEquals(1, db.getObjectDatabase().listPacks().size()); assertEquals(1, db.getObjectDatabase().listPacks().size());
ins.flush(); }
assertEquals(2, db.getObjectDatabase().listPacks().size()); ins.flush();
assertEquals(2, db.getObjectDatabase().listPacks().size());
}
} }
@Test @Test
public void testReaderResolve() throws IOException { public void testReaderResolve() throws IOException {
ObjectInserter ins = db.newObjectInserter(); try (ObjectInserter ins = db.newObjectInserter()) {
ObjectId id1 = ins.insert(Constants.OBJ_BLOB, Constants.encode("foo")); ObjectId id1 = ins.insert(Constants.OBJ_BLOB,
ins.flush(); Constants.encode("foo"));
ObjectId id2 = ins.insert(Constants.OBJ_BLOB, Constants.encode("bar")); ins.flush();
String abbr1 = ObjectId.toString(id1).substring(0, 4); ObjectId id2 = ins.insert(Constants.OBJ_BLOB,
String abbr2 = ObjectId.toString(id2).substring(0, 4); Constants.encode("bar"));
assertFalse(abbr1.equals(abbr2)); String abbr1 = ObjectId.toString(id1).substring(0, 4);
String abbr2 = ObjectId.toString(id2).substring(0, 4);
assertFalse(abbr1.equals(abbr2));
ObjectReader reader = ins.newReader(); try (ObjectReader reader = ins.newReader()) {
assertSame(ins, reader.getCreatedFromInserter()); assertSame(ins, reader.getCreatedFromInserter());
Collection<ObjectId> objs; Collection<ObjectId> objs;
objs = reader.resolve(AbbreviatedObjectId.fromString(abbr1)); objs = reader.resolve(AbbreviatedObjectId.fromString(abbr1));
assertEquals(1, objs.size()); assertEquals(1, objs.size());
assertEquals(id1, objs.iterator().next()); assertEquals(id1, objs.iterator().next());
objs = reader.resolve(AbbreviatedObjectId.fromString(abbr2)); objs = reader.resolve(AbbreviatedObjectId.fromString(abbr2));
assertEquals(1, objs.size()); assertEquals(1, objs.size());
assertEquals(id2, objs.iterator().next()); assertEquals(id2, objs.iterator().next());
}
}
} }
@Test @Test
public void testGarbageSelectivelyVisible() throws IOException { public void testGarbageSelectivelyVisible() throws IOException {
ObjectInserter ins = db.newObjectInserter(); ObjectId fooId;
ObjectId fooId = ins.insert(Constants.OBJ_BLOB, Constants.encode("foo")); try (ObjectInserter ins = db.newObjectInserter()) {
ins.flush(); fooId = ins.insert(Constants.OBJ_BLOB, Constants.encode("foo"));
ins.flush();
}
assertEquals(1, db.getObjectDatabase().listPacks().size()); assertEquals(1, db.getObjectDatabase().listPacks().size());
// Make pack 0 garbage. // Make pack 0 garbage.
@ -187,36 +203,40 @@ public void testGarbageSelectivelyVisible() throws IOException {
@Test @Test
public void testInserterIgnoresUnreachable() throws IOException { public void testInserterIgnoresUnreachable() throws IOException {
ObjectInserter ins = db.newObjectInserter(); ObjectId fooId;
ObjectId fooId = ins.insert(Constants.OBJ_BLOB, Constants.encode("foo")); try (ObjectInserter ins = db.newObjectInserter()) {
ins.flush(); fooId = ins.insert(Constants.OBJ_BLOB, Constants.encode("foo"));
assertEquals(1, db.getObjectDatabase().listPacks().size()); ins.flush();
assertEquals(1, db.getObjectDatabase().listPacks().size());
// Make pack 0 garbage. // Make pack 0 garbage.
db.getObjectDatabase().listPacks().get(0).setPackSource(PackSource.UNREACHABLE_GARBAGE); db.getObjectDatabase().listPacks().get(0)
.setPackSource(PackSource.UNREACHABLE_GARBAGE);
// We shouldn't be able to see foo because it's garbage. // We shouldn't be able to see foo because it's garbage.
assertFalse(db.getObjectDatabase().has(fooId, true)); assertFalse(db.getObjectDatabase().has(fooId, true));
// But if we re-insert foo, it should become visible again. // But if we re-insert foo, it should become visible again.
ins.insert(Constants.OBJ_BLOB, Constants.encode("foo")); ins.insert(Constants.OBJ_BLOB, Constants.encode("foo"));
ins.flush(); ins.flush();
}
assertTrue(db.getObjectDatabase().has(fooId, true)); assertTrue(db.getObjectDatabase().has(fooId, true));
// Verify that we have a foo in both packs, and 1 of them is garbage. // Verify that we have a foo in both packs, and 1 of them is garbage.
DfsReader reader = new DfsReader(db.getObjectDatabase()); try (DfsReader reader = new DfsReader(db.getObjectDatabase())) {
DfsPackFile packs[] = db.getObjectDatabase().getPacks(); DfsPackFile packs[] = db.getObjectDatabase().getPacks();
Set<PackSource> pack_sources = new HashSet<>(); Set<PackSource> pack_sources = new HashSet<>();
assertEquals(2, packs.length); assertEquals(2, packs.length);
pack_sources.add(packs[0].getPackDescription().getPackSource()); pack_sources.add(packs[0].getPackDescription().getPackSource());
pack_sources.add(packs[1].getPackDescription().getPackSource()); pack_sources.add(packs[1].getPackDescription().getPackSource());
assertTrue(packs[0].hasObject(reader, fooId)); assertTrue(packs[0].hasObject(reader, fooId));
assertTrue(packs[1].hasObject(reader, fooId)); assertTrue(packs[1].hasObject(reader, fooId));
assertTrue(pack_sources.contains(PackSource.UNREACHABLE_GARBAGE)); assertTrue(pack_sources.contains(PackSource.UNREACHABLE_GARBAGE));
assertTrue(pack_sources.contains(PackSource.INSERT)); assertTrue(pack_sources.contains(PackSource.INSERT));
}
} }
@Test @Test
@ -237,17 +257,20 @@ public void testNoCheckExisting() throws IOException {
assertEquals(2, db.getObjectDatabase().listPacks().size()); assertEquals(2, db.getObjectDatabase().listPacks().size());
// Verify that we have a foo in both INSERT packs. // Verify that we have a foo in both INSERT packs.
DfsReader reader = new DfsReader(db.getObjectDatabase()); try (DfsReader reader = new DfsReader(db.getObjectDatabase())) {
DfsPackFile packs[] = db.getObjectDatabase().getPacks(); DfsPackFile packs[] = db.getObjectDatabase().getPacks();
assertEquals(2, packs.length); assertEquals(2, packs.length);
DfsPackFile p1 = packs[0]; DfsPackFile p1 = packs[0];
assertEquals(PackSource.INSERT, p1.getPackDescription().getPackSource()); assertEquals(PackSource.INSERT,
assertTrue(p1.hasObject(reader, fooId)); p1.getPackDescription().getPackSource());
assertTrue(p1.hasObject(reader, fooId));
DfsPackFile p2 = packs[1]; DfsPackFile p2 = packs[1];
assertEquals(PackSource.INSERT, p2.getPackDescription().getPackSource()); assertEquals(PackSource.INSERT,
assertTrue(p2.hasObject(reader, fooId)); p2.getPackDescription().getPackSource());
assertTrue(p2.hasObject(reader, fooId));
}
} }
private static String readString(ObjectLoader loader) throws IOException { private static String readString(ObjectLoader loader) throws IOException {

View File

@ -881,9 +881,9 @@ private String contentAsString(Repository r, ObjectId treeId, String path)
} }
StringBuilder result = new StringBuilder(); StringBuilder result = new StringBuilder();
ObjectReader or = r.newObjectReader(); try (ObjectReader or = r.newObjectReader();
try (BufferedReader br = new BufferedReader( BufferedReader br = new BufferedReader(new InputStreamReader(
new InputStreamReader(or.open(blobId).openStream(), UTF_8))) { or.open(blobId).openStream(), UTF_8))) {
String line; String line;
boolean first = true; boolean first = true;
while ((line = br.readLine()) != null) { while ((line = br.readLine()) != null) {

View File

@ -65,12 +65,13 @@ public void testAtEOF() throws Exception {
@Test @Test
public void testCreateSubtreeIterator() throws Exception { public void testCreateSubtreeIterator() throws Exception {
final EmptyTreeIterator etp = new EmptyTreeIterator(); final EmptyTreeIterator etp = new EmptyTreeIterator();
final ObjectReader reader = db.newObjectReader(); try (ObjectReader reader = db.newObjectReader()) {
final AbstractTreeIterator sub = etp.createSubtreeIterator(reader); final AbstractTreeIterator sub = etp.createSubtreeIterator(reader);
assertNotNull(sub); assertNotNull(sub);
assertTrue(sub.first()); assertTrue(sub.first());
assertTrue(sub.eof()); assertTrue(sub.eof());
assertTrue(sub instanceof EmptyTreeIterator); assertTrue(sub instanceof EmptyTreeIterator);
}
} }
@Test @Test
@ -121,8 +122,9 @@ public void stopWalk() {
called[0] = true; called[0] = true;
} }
}; };
final ObjectReader reader = db.newObjectReader(); try (ObjectReader reader = db.newObjectReader()) {
parent.createSubtreeIterator(reader).stopWalk(); parent.createSubtreeIterator(reader).stopWalk();
}
assertTrue(called[0]); assertTrue(called[0]);
} }
} }

View File

@ -217,29 +217,29 @@ public void testSimpleIterate() throws Exception {
assertFalse(top.eof()); assertFalse(top.eof());
assertEquals(FileMode.TREE.getBits(), top.mode); assertEquals(FileMode.TREE.getBits(), top.mode);
final ObjectReader reader = db.newObjectReader(); try (ObjectReader reader = db.newObjectReader()) {
final AbstractTreeIterator sub = top.createSubtreeIterator(reader); final AbstractTreeIterator sub = top.createSubtreeIterator(reader);
assertTrue(sub instanceof FileTreeIterator); assertTrue(sub instanceof FileTreeIterator);
final FileTreeIterator subfti = (FileTreeIterator) sub; final FileTreeIterator subfti = (FileTreeIterator) sub;
assertTrue(sub.first()); assertTrue(sub.first());
assertFalse(sub.eof()); assertFalse(sub.eof());
assertEquals(paths[2], nameOf(sub)); assertEquals(paths[2], nameOf(sub));
assertEquals(paths[2].length(), subfti.getEntryLength()); assertEquals(paths[2].length(), subfti.getEntryLength());
assertEquals(mtime[2], subfti.getEntryLastModifiedInstant()); assertEquals(mtime[2], subfti.getEntryLastModifiedInstant());
sub.next(1); sub.next(1);
assertTrue(sub.eof()); assertTrue(sub.eof());
top.next(1);
assertFalse(top.first());
assertFalse(top.eof());
assertEquals(FileMode.REGULAR_FILE.getBits(), top.mode);
assertEquals(paths[3], nameOf(top));
assertEquals(paths[3].length(), top.getEntryLength());
assertEquals(mtime[3], top.getEntryLastModifiedInstant());
top.next(1); top.next(1);
assertFalse(top.first()); assertTrue(top.eof());
assertFalse(top.eof()); }
assertEquals(FileMode.REGULAR_FILE.getBits(), top.mode);
assertEquals(paths[3], nameOf(top));
assertEquals(paths[3].length(), top.getEntryLength());
assertEquals(mtime[3], top.getEntryLastModifiedInstant());
top.next(1);
assertTrue(top.eof());
} }
@Test @Test