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 package org.eclipse.jgit.internal.storage.dfs;
45
46 import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
47 import static org.junit.Assert.assertEquals;
48 import static org.junit.Assert.assertTrue;
49
50 import java.util.Arrays;
51 import java.util.Collections;
52 import java.util.List;
53 import java.util.stream.LongStream;
54
55 import org.eclipse.jgit.junit.TestRng;
56 import org.eclipse.jgit.lib.ObjectId;
57 import org.eclipse.jgit.lib.ObjectInserter;
58 import org.eclipse.jgit.lib.ObjectReader;
59 import org.junit.Before;
60 import org.junit.Rule;
61 import org.junit.Test;
62 import org.junit.rules.TestName;
63
64 public class DfsBlockCacheTest {
65 @Rule
66 public TestName testName = new TestName();
67 private TestRng rng;
68 private DfsBlockCache cache;
69
70 @Before
71 public void setUp() {
72 rng = new TestRng(testName.getMethodName());
73 resetCache();
74 }
75
76 @SuppressWarnings("resource")
77 @Test
78 public void streamKeyReusesBlocks() throws Exception {
79 DfsRepositoryDescription repo = new DfsRepositoryDescription("test");
80 InMemoryRepository r1 = new InMemoryRepository(repo);
81 byte[] content = rng.nextBytes(424242);
82 ObjectId id;
83 try (ObjectInserter ins = r1.newObjectInserter()) {
84 id = ins.insert(OBJ_BLOB, content);
85 ins.flush();
86 }
87
88 long oldSize = LongStream.of(cache.getCurrentSize()).sum();
89 assertTrue(oldSize > 2000);
90 assertEquals(0, LongStream.of(cache.getHitCount()).sum());
91
92 List<DfsPackDescription> packs = r1.getObjectDatabase().listPacks();
93 InMemoryRepository r2 = new InMemoryRepository(repo);
94 r2.getObjectDatabase().commitPack(packs, Collections.emptyList());
95 try (ObjectReader rdr = r2.newObjectReader()) {
96 byte[] actual = rdr.open(id, OBJ_BLOB).getBytes();
97 assertTrue(Arrays.equals(content, actual));
98 }
99 assertEquals(0, LongStream.of(cache.getMissCount()).sum());
100 assertEquals(oldSize, LongStream.of(cache.getCurrentSize()).sum());
101 }
102
103 @SuppressWarnings("resource")
104 @Test
105 public void weirdBlockSize() throws Exception {
106 DfsRepositoryDescription repo = new DfsRepositoryDescription("test");
107 InMemoryRepository r1 = new InMemoryRepository(repo);
108
109 byte[] content1 = rng.nextBytes(4);
110 byte[] content2 = rng.nextBytes(424242);
111 ObjectId id1;
112 ObjectId id2;
113 try (ObjectInserter ins = r1.newObjectInserter()) {
114 id1 = ins.insert(OBJ_BLOB, content1);
115 id2 = ins.insert(OBJ_BLOB, content2);
116 ins.flush();
117 }
118
119 resetCache();
120 List<DfsPackDescription> packs = r1.getObjectDatabase().listPacks();
121
122 InMemoryRepository r2 = new InMemoryRepository(repo);
123 r2.getObjectDatabase().setReadableChannelBlockSizeForTest(500);
124 r2.getObjectDatabase().commitPack(packs, Collections.emptyList());
125 try (ObjectReader rdr = r2.newObjectReader()) {
126 byte[] actual = rdr.open(id1, OBJ_BLOB).getBytes();
127 assertTrue(Arrays.equals(content1, actual));
128 }
129
130 InMemoryRepository r3 = new InMemoryRepository(repo);
131 r3.getObjectDatabase().setReadableChannelBlockSizeForTest(500);
132 r3.getObjectDatabase().commitPack(packs, Collections.emptyList());
133 try (ObjectReader rdr = r3.newObjectReader()) {
134 byte[] actual = rdr.open(id2, OBJ_BLOB).getBytes();
135 assertTrue(Arrays.equals(content2, actual));
136 }
137 }
138
139 private void resetCache() {
140 DfsBlockCache.reconfigure(new DfsBlockCacheConfig()
141 .setBlockSize(512)
142 .setBlockLimit(1 << 20));
143 cache = DfsBlockCache.getInstance();
144 }
145 }