You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DirCacheBuilderTest.java 9.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. /*
  2. * Copyright (C) 2008-2009, Google Inc.
  3. * Copyright (C) 2011, Matthias Sohn <matthias.sohn@sap.com> and others
  4. *
  5. * This program and the accompanying materials are made available under the
  6. * terms of the Eclipse Distribution License v. 1.0 which is available at
  7. * https://www.eclipse.org/org/documents/edl-v10.php.
  8. *
  9. * SPDX-License-Identifier: BSD-3-Clause
  10. */
  11. package org.eclipse.jgit.dircache;
  12. import static org.junit.Assert.assertEquals;
  13. import static org.junit.Assert.assertFalse;
  14. import static org.junit.Assert.assertNotNull;
  15. import static org.junit.Assert.assertNotSame;
  16. import static org.junit.Assert.assertSame;
  17. import static org.junit.Assert.assertTrue;
  18. import static org.junit.Assert.fail;
  19. import java.io.File;
  20. import java.time.Instant;
  21. import org.eclipse.jgit.events.IndexChangedEvent;
  22. import org.eclipse.jgit.events.IndexChangedListener;
  23. import org.eclipse.jgit.events.ListenerList;
  24. import org.eclipse.jgit.junit.RepositoryTestCase;
  25. import org.eclipse.jgit.lib.FileMode;
  26. import org.eclipse.jgit.lib.ObjectId;
  27. import org.junit.Test;
  28. public class DirCacheBuilderTest extends RepositoryTestCase {
  29. @Test
  30. public void testBuildEmpty() throws Exception {
  31. {
  32. final DirCache dc = db.lockDirCache();
  33. final DirCacheBuilder b = dc.builder();
  34. assertNotNull(b);
  35. b.finish();
  36. dc.write();
  37. assertTrue(dc.commit());
  38. }
  39. {
  40. final DirCache dc = db.readDirCache();
  41. assertEquals(0, dc.getEntryCount());
  42. }
  43. }
  44. @Test
  45. public void testBuildRejectsUnsetFileMode() throws Exception {
  46. final DirCache dc = DirCache.newInCore();
  47. final DirCacheBuilder b = dc.builder();
  48. assertNotNull(b);
  49. final DirCacheEntry e = new DirCacheEntry("a");
  50. assertEquals(0, e.getRawMode());
  51. try {
  52. b.add(e);
  53. fail("did not reject unset file mode");
  54. } catch (IllegalArgumentException err) {
  55. assertEquals("FileMode not set for path a", err.getMessage());
  56. }
  57. }
  58. @Test
  59. public void testBuildOneFile_FinishWriteCommit() throws Exception {
  60. final String path = "a-file-path";
  61. final FileMode mode = FileMode.REGULAR_FILE;
  62. final Instant lastModified = Instant.ofEpochMilli(1218123387057L);
  63. final int length = 1342;
  64. final DirCacheEntry entOrig;
  65. {
  66. final DirCache dc = db.lockDirCache();
  67. final DirCacheBuilder b = dc.builder();
  68. assertNotNull(b);
  69. entOrig = new DirCacheEntry(path);
  70. entOrig.setFileMode(mode);
  71. entOrig.setLastModified(lastModified);
  72. entOrig.setLength(length);
  73. assertNotSame(path, entOrig.getPathString());
  74. assertEquals(path, entOrig.getPathString());
  75. assertEquals(ObjectId.zeroId(), entOrig.getObjectId());
  76. assertEquals(mode.getBits(), entOrig.getRawMode());
  77. assertEquals(0, entOrig.getStage());
  78. assertEquals(lastModified, entOrig.getLastModifiedInstant());
  79. assertEquals(length, entOrig.getLength());
  80. assertFalse(entOrig.isAssumeValid());
  81. b.add(entOrig);
  82. b.finish();
  83. assertEquals(1, dc.getEntryCount());
  84. assertSame(entOrig, dc.getEntry(0));
  85. dc.write();
  86. assertTrue(dc.commit());
  87. }
  88. {
  89. final DirCache dc = db.readDirCache();
  90. assertEquals(1, dc.getEntryCount());
  91. final DirCacheEntry entRead = dc.getEntry(0);
  92. assertNotSame(entOrig, entRead);
  93. assertEquals(path, entRead.getPathString());
  94. assertEquals(ObjectId.zeroId(), entOrig.getObjectId());
  95. assertEquals(mode.getBits(), entOrig.getRawMode());
  96. assertEquals(0, entOrig.getStage());
  97. assertEquals(lastModified, entOrig.getLastModifiedInstant());
  98. assertEquals(length, entOrig.getLength());
  99. assertFalse(entOrig.isAssumeValid());
  100. }
  101. }
  102. @Test
  103. public void testBuildOneFile_Commit() throws Exception {
  104. final String path = "a-file-path";
  105. final FileMode mode = FileMode.REGULAR_FILE;
  106. final Instant lastModified = Instant.ofEpochMilli(1218123387057L);
  107. final int length = 1342;
  108. final DirCacheEntry entOrig;
  109. {
  110. final DirCache dc = db.lockDirCache();
  111. final DirCacheBuilder b = dc.builder();
  112. assertNotNull(b);
  113. entOrig = new DirCacheEntry(path);
  114. entOrig.setFileMode(mode);
  115. entOrig.setLastModified(lastModified);
  116. entOrig.setLength(length);
  117. assertNotSame(path, entOrig.getPathString());
  118. assertEquals(path, entOrig.getPathString());
  119. assertEquals(ObjectId.zeroId(), entOrig.getObjectId());
  120. assertEquals(mode.getBits(), entOrig.getRawMode());
  121. assertEquals(0, entOrig.getStage());
  122. assertEquals(lastModified, entOrig.getLastModifiedInstant());
  123. assertEquals(length, entOrig.getLength());
  124. assertFalse(entOrig.isAssumeValid());
  125. b.add(entOrig);
  126. assertTrue(b.commit());
  127. assertEquals(1, dc.getEntryCount());
  128. assertSame(entOrig, dc.getEntry(0));
  129. assertFalse(new File(db.getDirectory(), "index.lock").exists());
  130. }
  131. {
  132. final DirCache dc = db.readDirCache();
  133. assertEquals(1, dc.getEntryCount());
  134. final DirCacheEntry entRead = dc.getEntry(0);
  135. assertNotSame(entOrig, entRead);
  136. assertEquals(path, entRead.getPathString());
  137. assertEquals(ObjectId.zeroId(), entOrig.getObjectId());
  138. assertEquals(mode.getBits(), entOrig.getRawMode());
  139. assertEquals(0, entOrig.getStage());
  140. assertEquals(lastModified, entOrig.getLastModifiedInstant());
  141. assertEquals(length, entOrig.getLength());
  142. assertFalse(entOrig.isAssumeValid());
  143. }
  144. }
  145. @Test
  146. public void testBuildOneFile_Commit_IndexChangedEvent()
  147. throws Exception {
  148. final class ReceivedEventMarkerException extends RuntimeException {
  149. private static final long serialVersionUID = 1L;
  150. // empty
  151. }
  152. final String path = "a-file-path";
  153. final FileMode mode = FileMode.REGULAR_FILE;
  154. // "old" date in 2008
  155. final Instant lastModified = Instant.ofEpochMilli(1218123387057L);
  156. final int length = 1342;
  157. DirCacheEntry entOrig;
  158. boolean receivedEvent = false;
  159. DirCache dc = db.lockDirCache();
  160. IndexChangedListener listener = (IndexChangedEvent event) -> {
  161. throw new ReceivedEventMarkerException();
  162. };
  163. ListenerList l = db.getListenerList();
  164. l.addIndexChangedListener(listener);
  165. DirCacheBuilder b = dc.builder();
  166. entOrig = new DirCacheEntry(path);
  167. entOrig.setFileMode(mode);
  168. entOrig.setLastModified(lastModified);
  169. entOrig.setLength(length);
  170. b.add(entOrig);
  171. try {
  172. b.commit();
  173. } catch (ReceivedEventMarkerException e) {
  174. receivedEvent = true;
  175. }
  176. if (!receivedEvent)
  177. fail("did not receive IndexChangedEvent");
  178. // do the same again, as this doesn't change index compared to first
  179. // round we should get no event this time
  180. dc = db.lockDirCache();
  181. listener = (IndexChangedEvent event) -> {
  182. throw new ReceivedEventMarkerException();
  183. };
  184. l = db.getListenerList();
  185. l.addIndexChangedListener(listener);
  186. b = dc.builder();
  187. entOrig = new DirCacheEntry(path);
  188. entOrig.setFileMode(mode);
  189. entOrig.setLastModified(lastModified);
  190. entOrig.setLength(length);
  191. b.add(entOrig);
  192. try {
  193. b.commit();
  194. } catch (ReceivedEventMarkerException e) {
  195. fail("unexpected IndexChangedEvent");
  196. }
  197. }
  198. @Test
  199. public void testFindSingleFile() throws Exception {
  200. final String path = "a-file-path";
  201. final DirCache dc = db.readDirCache();
  202. final DirCacheBuilder b = dc.builder();
  203. assertNotNull(b);
  204. final DirCacheEntry entOrig = new DirCacheEntry(path);
  205. entOrig.setFileMode(FileMode.REGULAR_FILE);
  206. assertNotSame(path, entOrig.getPathString());
  207. assertEquals(path, entOrig.getPathString());
  208. b.add(entOrig);
  209. b.finish();
  210. assertEquals(1, dc.getEntryCount());
  211. assertSame(entOrig, dc.getEntry(0));
  212. assertEquals(0, dc.findEntry(path));
  213. assertEquals(-1, dc.findEntry("@@-before"));
  214. assertEquals(0, real(dc.findEntry("@@-before")));
  215. assertEquals(-2, dc.findEntry("a-zoo"));
  216. assertEquals(1, real(dc.findEntry("a-zoo")));
  217. assertSame(entOrig, dc.getEntry(path));
  218. }
  219. @Test
  220. public void testAdd_InGitSortOrder() throws Exception {
  221. final DirCache dc = db.readDirCache();
  222. final String[] paths = { "a-", "a.b", "a/b", "a0b" };
  223. final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
  224. for (int i = 0; i < paths.length; i++) {
  225. ents[i] = new DirCacheEntry(paths[i]);
  226. ents[i].setFileMode(FileMode.REGULAR_FILE);
  227. }
  228. final DirCacheBuilder b = dc.builder();
  229. for (DirCacheEntry ent : ents) {
  230. b.add(ent);
  231. }
  232. b.finish();
  233. assertEquals(paths.length, dc.getEntryCount());
  234. for (int i = 0; i < paths.length; i++) {
  235. assertSame(ents[i], dc.getEntry(i));
  236. assertEquals(paths[i], dc.getEntry(i).getPathString());
  237. assertEquals(i, dc.findEntry(paths[i]));
  238. assertSame(ents[i], dc.getEntry(paths[i]));
  239. }
  240. }
  241. @Test
  242. public void testAdd_ReverseGitSortOrder() throws Exception {
  243. final DirCache dc = db.readDirCache();
  244. final String[] paths = { "a-", "a.b", "a/b", "a0b" };
  245. final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
  246. for (int i = 0; i < paths.length; i++) {
  247. ents[i] = new DirCacheEntry(paths[i]);
  248. ents[i].setFileMode(FileMode.REGULAR_FILE);
  249. }
  250. final DirCacheBuilder b = dc.builder();
  251. for (int i = ents.length - 1; i >= 0; i--)
  252. b.add(ents[i]);
  253. b.finish();
  254. assertEquals(paths.length, dc.getEntryCount());
  255. for (int i = 0; i < paths.length; i++) {
  256. assertSame(ents[i], dc.getEntry(i));
  257. assertEquals(paths[i], dc.getEntry(i).getPathString());
  258. assertEquals(i, dc.findEntry(paths[i]));
  259. assertSame(ents[i], dc.getEntry(paths[i]));
  260. }
  261. }
  262. @Test
  263. public void testBuilderClear() throws Exception {
  264. final DirCache dc = db.readDirCache();
  265. final String[] paths = { "a-", "a.b", "a/b", "a0b" };
  266. final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
  267. for (int i = 0; i < paths.length; i++) {
  268. ents[i] = new DirCacheEntry(paths[i]);
  269. ents[i].setFileMode(FileMode.REGULAR_FILE);
  270. }
  271. {
  272. final DirCacheBuilder b = dc.builder();
  273. for (DirCacheEntry ent : ents) {
  274. b.add(ent);
  275. }
  276. b.finish();
  277. }
  278. assertEquals(paths.length, dc.getEntryCount());
  279. {
  280. final DirCacheBuilder b = dc.builder();
  281. b.finish();
  282. }
  283. assertEquals(0, dc.getEntryCount());
  284. }
  285. private static int real(int eIdx) {
  286. if (eIdx < 0)
  287. eIdx = -(eIdx + 1);
  288. return eIdx;
  289. }
  290. }