Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

HugeFileTest.java 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /*
  2. * Copyright (C) 2012, Robin Rosenberg <robin.rosenberg@dewire.com> and others
  3. *
  4. * This program and the accompanying materials are made available under the
  5. * terms of the Eclipse Distribution License v. 1.0 which is available at
  6. * https://www.eclipse.org/org/documents/edl-v10.php.
  7. *
  8. * SPDX-License-Identifier: BSD-3-Clause
  9. */
  10. package org.eclipse.jgit.api;
  11. import static org.junit.Assert.assertEquals;
  12. import java.io.File;
  13. import java.io.RandomAccessFile;
  14. import java.util.Arrays;
  15. import java.util.Collection;
  16. import org.eclipse.jgit.api.ResetCommand.ResetType;
  17. import org.eclipse.jgit.junit.RepositoryTestCase;
  18. import org.junit.After;
  19. import org.junit.Before;
  20. import org.junit.Ignore;
  21. import org.junit.Test;
  22. public class HugeFileTest extends RepositoryTestCase {
  23. private long t = System.currentTimeMillis();
  24. private long lastt = t;
  25. private Git git;
  26. private void measure(String name) {
  27. long c = System.currentTimeMillis();
  28. System.out.println(name + ", dt=" + (c - lastt) / 1000.0 + "s");
  29. lastt = c;
  30. }
  31. @Before
  32. public void before() {
  33. git = new Git(db);
  34. }
  35. @After
  36. public void after() {
  37. if (git != null) {
  38. git.close();
  39. }
  40. }
  41. @Ignore("Test takes way too long (~10 minutes) to be part of the standard suite")
  42. @Test
  43. public void testAddHugeFile() throws Exception {
  44. measure("Commencing test");
  45. File file = new File(db.getWorkTree(), "a.txt");
  46. try (RandomAccessFile rf = new RandomAccessFile(file, "rw")) {
  47. rf.setLength(4429185024L);
  48. }
  49. measure("Created file");
  50. git.add().addFilepattern("a.txt").call();
  51. measure("Added file");
  52. assertEquals(
  53. "[a.txt, mode:100644, length:134217728, sha1:b8cfba97c2b962a44f080b3ca4e03b3204b6a350]",
  54. indexState(LENGTH | CONTENT_ID));
  55. Status status = git.status().call();
  56. measure("Status after add");
  57. assertCollectionEquals(Arrays.asList("a.txt"), status.getAdded());
  58. assertEquals(0, status.getChanged().size());
  59. assertEquals(0, status.getConflicting().size());
  60. assertEquals(0, status.getMissing().size());
  61. assertEquals(0, status.getModified().size());
  62. assertEquals(0, status.getRemoved().size());
  63. assertEquals(0, status.getUntracked().size());
  64. // Does not change anything, but modified timestamp
  65. try (RandomAccessFile rf = new RandomAccessFile(file, "rw")) {
  66. rf.write(0);
  67. }
  68. status = git.status().call();
  69. measure("Status after non-modifying update");
  70. assertCollectionEquals(Arrays.asList("a.txt"), status.getAdded());
  71. assertEquals(0, status.getChanged().size());
  72. assertEquals(0, status.getConflicting().size());
  73. assertEquals(0, status.getMissing().size());
  74. assertEquals(0, status.getModified().size());
  75. assertEquals(0, status.getRemoved().size());
  76. assertEquals(0, status.getUntracked().size());
  77. // Change something
  78. try (RandomAccessFile rf = new RandomAccessFile(file, "rw")) {
  79. rf.write('a');
  80. }
  81. status = git.status().call();
  82. measure("Status after modifying update");
  83. assertCollectionEquals(Arrays.asList("a.txt"), status.getAdded());
  84. assertEquals(0, status.getChanged().size());
  85. assertEquals(0, status.getConflicting().size());
  86. assertEquals(0, status.getMissing().size());
  87. assertCollectionEquals(Arrays.asList("a.txt"), status.getModified());
  88. assertEquals(0, status.getRemoved().size());
  89. assertEquals(0, status.getUntracked().size());
  90. // Truncate mod 4G and re-establish equality
  91. try (RandomAccessFile rf = new RandomAccessFile(file, "rw")) {
  92. rf.setLength(134217728L);
  93. rf.write(0);
  94. }
  95. status = git.status().call();
  96. measure("Status after truncating update");
  97. assertCollectionEquals(Arrays.asList("a.txt"), status.getAdded());
  98. assertEquals(0, status.getChanged().size());
  99. assertEquals(0, status.getConflicting().size());
  100. assertEquals(0, status.getMissing().size());
  101. assertCollectionEquals(Arrays.asList("a.txt"), status.getModified());
  102. assertEquals(0, status.getRemoved().size());
  103. assertEquals(0, status.getUntracked().size());
  104. // Change something
  105. try (RandomAccessFile rf = new RandomAccessFile(file, "rw")) {
  106. rf.write('a');
  107. }
  108. status = git.status().call();
  109. measure("Status after modifying and truncating update");
  110. assertCollectionEquals(Arrays.asList("a.txt"), status.getAdded());
  111. assertEquals(0, status.getChanged().size());
  112. assertEquals(0, status.getConflicting().size());
  113. assertEquals(0, status.getMissing().size());
  114. assertCollectionEquals(Arrays.asList("a.txt"), status.getModified());
  115. assertEquals(0, status.getRemoved().size());
  116. assertEquals(0, status.getUntracked().size());
  117. // Truncate to entry length becomes negative int
  118. try (RandomAccessFile rf = new RandomAccessFile(file, "rw")) {
  119. rf.setLength(3429185024L);
  120. rf.write(0);
  121. }
  122. git.add().addFilepattern("a.txt").call();
  123. measure("Added truncated file");
  124. assertEquals(
  125. "[a.txt, mode:100644, length:-865782272, sha1:59b3282f8f59f22d953df956ad3511bf2dc660fd]",
  126. indexState(LENGTH | CONTENT_ID));
  127. status = git.status().call();
  128. measure("Status after status on truncated file");
  129. assertCollectionEquals(Arrays.asList("a.txt"), status.getAdded());
  130. assertEquals(0, status.getChanged().size());
  131. assertEquals(0, status.getConflicting().size());
  132. assertEquals(0, status.getMissing().size());
  133. assertEquals(0, status.getModified().size());
  134. assertEquals(0, status.getRemoved().size());
  135. assertEquals(0, status.getUntracked().size());
  136. // Change something
  137. try (RandomAccessFile rf = new RandomAccessFile(file, "rw")) {
  138. rf.write('a');
  139. }
  140. status = git.status().call();
  141. measure("Status after modifying and truncating update");
  142. assertCollectionEquals(Arrays.asList("a.txt"), status.getAdded());
  143. assertEquals(0, status.getChanged().size());
  144. assertEquals(0, status.getConflicting().size());
  145. assertEquals(0, status.getMissing().size());
  146. assertCollectionEquals(Arrays.asList("a.txt"), status.getModified());
  147. assertEquals(0, status.getRemoved().size());
  148. assertEquals(0, status.getUntracked().size());
  149. git.commit().setMessage("make a commit").call();
  150. measure("After commit");
  151. status = git.status().call();
  152. measure("After status after commit");
  153. assertEquals(0, status.getAdded().size());
  154. assertEquals(0, status.getChanged().size());
  155. assertEquals(0, status.getConflicting().size());
  156. assertEquals(0, status.getMissing().size());
  157. assertCollectionEquals(Arrays.asList("a.txt"), status.getModified());
  158. assertEquals(0, status.getRemoved().size());
  159. assertEquals(0, status.getUntracked().size());
  160. git.reset().setMode(ResetType.HARD).call();
  161. measure("After reset --hard");
  162. assertEquals(
  163. "[a.txt, mode:100644, length:-865782272, sha1:59b3282f8f59f22d953df956ad3511bf2dc660fd]",
  164. indexState(LENGTH | CONTENT_ID));
  165. status = git.status().call();
  166. measure("Status after hard reset");
  167. assertEquals(0, status.getAdded().size());
  168. assertEquals(0, status.getChanged().size());
  169. assertEquals(0, status.getConflicting().size());
  170. assertEquals(0, status.getMissing().size());
  171. assertEquals(0, status.getModified().size());
  172. assertEquals(0, status.getRemoved().size());
  173. assertEquals(0, status.getUntracked().size());
  174. }
  175. private static void assertCollectionEquals(Collection<?> asList,
  176. Collection<?> added) {
  177. assertEquals(asList.toString(), added.toString());
  178. }
  179. }