Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

ObjectCheckerTest.java 37KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306
  1. /*
  2. * Copyright (C) 2008-2010, Google Inc.
  3. * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
  4. * and other copyright owners as documented in the project's IP log.
  5. *
  6. * This program and the accompanying materials are made available
  7. * under the terms of the Eclipse Distribution License v1.0 which
  8. * accompanies this distribution, is reproduced below, and is
  9. * available at http://www.eclipse.org/org/documents/edl-v10.php
  10. *
  11. * All rights reserved.
  12. *
  13. * Redistribution and use in source and binary forms, with or
  14. * without modification, are permitted provided that the following
  15. * conditions are met:
  16. *
  17. * - Redistributions of source code must retain the above copyright
  18. * notice, this list of conditions and the following disclaimer.
  19. *
  20. * - Redistributions in binary form must reproduce the above
  21. * copyright notice, this list of conditions and the following
  22. * disclaimer in the documentation and/or other materials provided
  23. * with the distribution.
  24. *
  25. * - Neither the name of the Eclipse Foundation, Inc. nor the
  26. * names of its contributors may be used to endorse or promote
  27. * products derived from this software without specific prior
  28. * written permission.
  29. *
  30. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  31. * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  32. * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  33. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  34. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  35. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  36. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  37. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  38. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  39. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  40. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  41. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  42. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  43. */
  44. package org.eclipse.jgit.lib;
  45. import junit.framework.TestCase;
  46. import org.eclipse.jgit.errors.CorruptObjectException;
  47. public class ObjectCheckerTest extends TestCase {
  48. private ObjectChecker checker;
  49. protected void setUp() throws Exception {
  50. super.setUp();
  51. checker = new ObjectChecker();
  52. }
  53. public void testInvalidType() {
  54. try {
  55. checker.check(Constants.OBJ_BAD, new byte[0]);
  56. fail("Did not throw CorruptObjectException");
  57. } catch (CorruptObjectException e) {
  58. final String m = e.getMessage();
  59. assertEquals("Invalid object type: " + Constants.OBJ_BAD, m);
  60. }
  61. }
  62. public void testCheckBlob() throws CorruptObjectException {
  63. // Any blob should pass...
  64. checker.checkBlob(new byte[0]);
  65. checker.checkBlob(new byte[1]);
  66. checker.check(Constants.OBJ_BLOB, new byte[0]);
  67. checker.check(Constants.OBJ_BLOB, new byte[1]);
  68. }
  69. public void testValidCommitNoParent() throws CorruptObjectException {
  70. final StringBuilder b = new StringBuilder();
  71. b.append("tree ");
  72. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  73. b.append('\n');
  74. b.append("author A. U. Thor <author@localhost> 1 +0000\n");
  75. b.append("committer A. U. Thor <author@localhost> 1 +0000\n");
  76. final byte[] data = Constants.encodeASCII(b.toString());
  77. checker.checkCommit(data);
  78. checker.check(Constants.OBJ_COMMIT, data);
  79. }
  80. public void testValidCommitBlankAuthor() throws CorruptObjectException {
  81. final StringBuilder b = new StringBuilder();
  82. b.append("tree ");
  83. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  84. b.append('\n');
  85. b.append("author <> 0 +0000\n");
  86. b.append("committer <> 0 +0000\n");
  87. final byte[] data = Constants.encodeASCII(b.toString());
  88. checker.checkCommit(data);
  89. checker.check(Constants.OBJ_COMMIT, data);
  90. }
  91. public void testValidCommit1Parent() throws CorruptObjectException {
  92. final StringBuilder b = new StringBuilder();
  93. b.append("tree ");
  94. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  95. b.append('\n');
  96. b.append("parent ");
  97. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  98. b.append('\n');
  99. b.append("author A. U. Thor <author@localhost> 1 +0000\n");
  100. b.append("committer A. U. Thor <author@localhost> 1 +0000\n");
  101. final byte[] data = Constants.encodeASCII(b.toString());
  102. checker.checkCommit(data);
  103. checker.check(Constants.OBJ_COMMIT, data);
  104. }
  105. public void testValidCommit2Parent() throws CorruptObjectException {
  106. final StringBuilder b = new StringBuilder();
  107. b.append("tree ");
  108. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  109. b.append('\n');
  110. b.append("parent ");
  111. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  112. b.append('\n');
  113. b.append("parent ");
  114. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  115. b.append('\n');
  116. b.append("author A. U. Thor <author@localhost> 1 +0000\n");
  117. b.append("committer A. U. Thor <author@localhost> 1 +0000\n");
  118. final byte[] data = Constants.encodeASCII(b.toString());
  119. checker.checkCommit(data);
  120. checker.check(Constants.OBJ_COMMIT, data);
  121. }
  122. public void testValidCommit128Parent() throws CorruptObjectException {
  123. final StringBuilder b = new StringBuilder();
  124. b.append("tree ");
  125. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  126. b.append('\n');
  127. for (int i = 0; i < 128; i++) {
  128. b.append("parent ");
  129. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  130. b.append('\n');
  131. }
  132. b.append("author A. U. Thor <author@localhost> 1 +0000\n");
  133. b.append("committer A. U. Thor <author@localhost> 1 +0000\n");
  134. final byte[] data = Constants.encodeASCII(b.toString());
  135. checker.checkCommit(data);
  136. checker.check(Constants.OBJ_COMMIT, data);
  137. }
  138. public void testValidCommitNormalTime() throws CorruptObjectException {
  139. final StringBuilder b = new StringBuilder();
  140. final String when = "1222757360 -0730";
  141. b.append("tree ");
  142. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  143. b.append('\n');
  144. b.append("author A. U. Thor <author@localhost> " + when + "\n");
  145. b.append("committer A. U. Thor <author@localhost> " + when + "\n");
  146. final byte[] data = Constants.encodeASCII(b.toString());
  147. checker.checkCommit(data);
  148. checker.check(Constants.OBJ_COMMIT, data);
  149. }
  150. public void testInvalidCommitNoTree1() {
  151. final StringBuilder b = new StringBuilder();
  152. b.append("parent ");
  153. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  154. b.append('\n');
  155. final byte[] data = Constants.encodeASCII(b.toString());
  156. try {
  157. checker.checkCommit(data);
  158. fail("Did not catch corrupt object");
  159. } catch (CorruptObjectException e) {
  160. assertEquals("no tree header", e.getMessage());
  161. }
  162. }
  163. public void testInvalidCommitNoTree2() {
  164. final StringBuilder b = new StringBuilder();
  165. b.append("trie ");
  166. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  167. b.append('\n');
  168. final byte[] data = Constants.encodeASCII(b.toString());
  169. try {
  170. checker.checkCommit(data);
  171. fail("Did not catch corrupt object");
  172. } catch (CorruptObjectException e) {
  173. assertEquals("no tree header", e.getMessage());
  174. }
  175. }
  176. public void testInvalidCommitNoTree3() {
  177. final StringBuilder b = new StringBuilder();
  178. b.append("tree");
  179. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  180. b.append('\n');
  181. final byte[] data = Constants.encodeASCII(b.toString());
  182. try {
  183. checker.checkCommit(data);
  184. fail("Did not catch corrupt object");
  185. } catch (CorruptObjectException e) {
  186. assertEquals("no tree header", e.getMessage());
  187. }
  188. }
  189. public void testInvalidCommitNoTree4() {
  190. final StringBuilder b = new StringBuilder();
  191. b.append("tree\t");
  192. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  193. b.append('\n');
  194. final byte[] data = Constants.encodeASCII(b.toString());
  195. try {
  196. checker.checkCommit(data);
  197. fail("Did not catch corrupt object");
  198. } catch (CorruptObjectException e) {
  199. assertEquals("no tree header", e.getMessage());
  200. }
  201. }
  202. public void testInvalidCommitInvalidTree1() {
  203. final StringBuilder b = new StringBuilder();
  204. b.append("tree ");
  205. b.append("zzzzfa841874ccc9f2ef7c48d0c76226f89b7189");
  206. b.append('\n');
  207. final byte[] data = Constants.encodeASCII(b.toString());
  208. try {
  209. checker.checkCommit(data);
  210. fail("Did not catch corrupt object");
  211. } catch (CorruptObjectException e) {
  212. assertEquals("invalid tree", e.getMessage());
  213. }
  214. }
  215. public void testInvalidCommitInvalidTree2() {
  216. final StringBuilder b = new StringBuilder();
  217. b.append("tree ");
  218. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  219. b.append("z\n");
  220. final byte[] data = Constants.encodeASCII(b.toString());
  221. try {
  222. checker.checkCommit(data);
  223. fail("Did not catch corrupt object");
  224. } catch (CorruptObjectException e) {
  225. assertEquals("invalid tree", e.getMessage());
  226. }
  227. }
  228. public void testInvalidCommitInvalidTree3() {
  229. final StringBuilder b = new StringBuilder();
  230. b.append("tree ");
  231. b.append("be9b");
  232. b.append("\n");
  233. final byte[] data = Constants.encodeASCII(b.toString());
  234. try {
  235. checker.checkCommit(data);
  236. fail("Did not catch corrupt object");
  237. } catch (CorruptObjectException e) {
  238. assertEquals("invalid tree", e.getMessage());
  239. }
  240. }
  241. public void testInvalidCommitInvalidTree4() {
  242. final StringBuilder b = new StringBuilder();
  243. b.append("tree ");
  244. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  245. b.append('\n');
  246. final byte[] data = Constants.encodeASCII(b.toString());
  247. try {
  248. checker.checkCommit(data);
  249. fail("Did not catch corrupt object");
  250. } catch (CorruptObjectException e) {
  251. assertEquals("invalid tree", e.getMessage());
  252. }
  253. }
  254. public void testInvalidCommitInvalidParent1() {
  255. final StringBuilder b = new StringBuilder();
  256. b.append("tree ");
  257. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  258. b.append('\n');
  259. b.append("parent ");
  260. b.append("\n");
  261. final byte[] data = Constants.encodeASCII(b.toString());
  262. try {
  263. checker.checkCommit(data);
  264. fail("Did not catch corrupt object");
  265. } catch (CorruptObjectException e) {
  266. assertEquals("invalid parent", e.getMessage());
  267. }
  268. }
  269. public void testInvalidCommitInvalidParent2() {
  270. final StringBuilder b = new StringBuilder();
  271. b.append("tree ");
  272. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  273. b.append('\n');
  274. b.append("parent ");
  275. b.append("zzzzfa841874ccc9f2ef7c48d0c76226f89b7189");
  276. b.append("\n");
  277. final byte[] data = Constants.encodeASCII(b.toString());
  278. try {
  279. checker.checkCommit(data);
  280. fail("Did not catch corrupt object");
  281. } catch (CorruptObjectException e) {
  282. assertEquals("invalid parent", e.getMessage());
  283. }
  284. }
  285. public void testInvalidCommitInvalidParent3() {
  286. final StringBuilder b = new StringBuilder();
  287. b.append("tree ");
  288. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  289. b.append('\n');
  290. b.append("parent ");
  291. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  292. b.append("\n");
  293. final byte[] data = Constants.encodeASCII(b.toString());
  294. try {
  295. checker.checkCommit(data);
  296. fail("Did not catch corrupt object");
  297. } catch (CorruptObjectException e) {
  298. assertEquals("invalid parent", e.getMessage());
  299. }
  300. }
  301. public void testInvalidCommitInvalidParent4() {
  302. final StringBuilder b = new StringBuilder();
  303. b.append("tree ");
  304. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  305. b.append('\n');
  306. b.append("parent ");
  307. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  308. b.append("z\n");
  309. final byte[] data = Constants.encodeASCII(b.toString());
  310. try {
  311. checker.checkCommit(data);
  312. fail("Did not catch corrupt object");
  313. } catch (CorruptObjectException e) {
  314. assertEquals("invalid parent", e.getMessage());
  315. }
  316. }
  317. public void testInvalidCommitInvalidParent5() {
  318. final StringBuilder b = new StringBuilder();
  319. b.append("tree ");
  320. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  321. b.append('\n');
  322. b.append("parent\t");
  323. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  324. b.append("\n");
  325. final byte[] data = Constants.encodeASCII(b.toString());
  326. try {
  327. checker.checkCommit(data);
  328. fail("Did not catch corrupt object");
  329. } catch (CorruptObjectException e) {
  330. // Yes, really, we complain about author not being
  331. // found as the invalid parent line wasn't consumed.
  332. assertEquals("no author", e.getMessage());
  333. }
  334. }
  335. public void testInvalidCommitNoAuthor() {
  336. final StringBuilder b = new StringBuilder();
  337. b.append("tree ");
  338. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  339. b.append('\n');
  340. b.append("committer A. U. Thor <author@localhost> 1 +0000\n");
  341. final byte[] data = Constants.encodeASCII(b.toString());
  342. try {
  343. checker.checkCommit(data);
  344. fail("Did not catch corrupt object");
  345. } catch (CorruptObjectException e) {
  346. // Yes, really, we complain about author not being
  347. // found as the invalid parent line wasn't consumed.
  348. assertEquals("no author", e.getMessage());
  349. }
  350. }
  351. public void testInvalidCommitNoCommitter1() {
  352. final StringBuilder b = new StringBuilder();
  353. b.append("tree ");
  354. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  355. b.append('\n');
  356. b.append("author A. U. Thor <author@localhost> 1 +0000\n");
  357. final byte[] data = Constants.encodeASCII(b.toString());
  358. try {
  359. checker.checkCommit(data);
  360. fail("Did not catch corrupt object");
  361. } catch (CorruptObjectException e) {
  362. // Yes, really, we complain about author not being
  363. // found as the invalid parent line wasn't consumed.
  364. assertEquals("no committer", e.getMessage());
  365. }
  366. }
  367. public void testInvalidCommitNoCommitter2() {
  368. final StringBuilder b = new StringBuilder();
  369. b.append("tree ");
  370. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  371. b.append('\n');
  372. b.append("author A. U. Thor <author@localhost> 1 +0000\n");
  373. b.append("\n");
  374. final byte[] data = Constants.encodeASCII(b.toString());
  375. try {
  376. checker.checkCommit(data);
  377. fail("Did not catch corrupt object");
  378. } catch (CorruptObjectException e) {
  379. // Yes, really, we complain about author not being
  380. // found as the invalid parent line wasn't consumed.
  381. assertEquals("no committer", e.getMessage());
  382. }
  383. }
  384. public void testInvalidCommitInvalidAuthor1() {
  385. final StringBuilder b = new StringBuilder();
  386. b.append("tree ");
  387. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  388. b.append('\n');
  389. b.append("author A. U. Thor <foo 1 +0000\n");
  390. final byte[] data = Constants.encodeASCII(b.toString());
  391. try {
  392. checker.checkCommit(data);
  393. fail("Did not catch corrupt object");
  394. } catch (CorruptObjectException e) {
  395. // Yes, really, we complain about author not being
  396. // found as the invalid parent line wasn't consumed.
  397. assertEquals("invalid author", e.getMessage());
  398. }
  399. }
  400. public void testInvalidCommitInvalidAuthor2() {
  401. final StringBuilder b = new StringBuilder();
  402. b.append("tree ");
  403. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  404. b.append('\n');
  405. b.append("author A. U. Thor foo> 1 +0000\n");
  406. final byte[] data = Constants.encodeASCII(b.toString());
  407. try {
  408. checker.checkCommit(data);
  409. fail("Did not catch corrupt object");
  410. } catch (CorruptObjectException e) {
  411. // Yes, really, we complain about author not being
  412. // found as the invalid parent line wasn't consumed.
  413. assertEquals("invalid author", e.getMessage());
  414. }
  415. }
  416. public void testInvalidCommitInvalidAuthor3() {
  417. final StringBuilder b = new StringBuilder();
  418. b.append("tree ");
  419. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  420. b.append('\n');
  421. b.append("author 1 +0000\n");
  422. final byte[] data = Constants.encodeASCII(b.toString());
  423. try {
  424. checker.checkCommit(data);
  425. fail("Did not catch corrupt object");
  426. } catch (CorruptObjectException e) {
  427. // Yes, really, we complain about author not being
  428. // found as the invalid parent line wasn't consumed.
  429. assertEquals("invalid author", e.getMessage());
  430. }
  431. }
  432. public void testInvalidCommitInvalidAuthor4() {
  433. final StringBuilder b = new StringBuilder();
  434. b.append("tree ");
  435. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  436. b.append('\n');
  437. b.append("author a <b> +0000\n");
  438. final byte[] data = Constants.encodeASCII(b.toString());
  439. try {
  440. checker.checkCommit(data);
  441. fail("Did not catch corrupt object");
  442. } catch (CorruptObjectException e) {
  443. // Yes, really, we complain about author not being
  444. // found as the invalid parent line wasn't consumed.
  445. assertEquals("invalid author", e.getMessage());
  446. }
  447. }
  448. public void testInvalidCommitInvalidAuthor5() {
  449. final StringBuilder b = new StringBuilder();
  450. b.append("tree ");
  451. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  452. b.append('\n');
  453. b.append("author a <b>\n");
  454. final byte[] data = Constants.encodeASCII(b.toString());
  455. try {
  456. checker.checkCommit(data);
  457. fail("Did not catch corrupt object");
  458. } catch (CorruptObjectException e) {
  459. // Yes, really, we complain about author not being
  460. // found as the invalid parent line wasn't consumed.
  461. assertEquals("invalid author", e.getMessage());
  462. }
  463. }
  464. public void testInvalidCommitInvalidAuthor6() {
  465. final StringBuilder b = new StringBuilder();
  466. b.append("tree ");
  467. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  468. b.append('\n');
  469. b.append("author a <b> z");
  470. final byte[] data = Constants.encodeASCII(b.toString());
  471. try {
  472. checker.checkCommit(data);
  473. fail("Did not catch corrupt object");
  474. } catch (CorruptObjectException e) {
  475. // Yes, really, we complain about author not being
  476. // found as the invalid parent line wasn't consumed.
  477. assertEquals("invalid author", e.getMessage());
  478. }
  479. }
  480. public void testInvalidCommitInvalidAuthor7() {
  481. final StringBuilder b = new StringBuilder();
  482. b.append("tree ");
  483. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  484. b.append('\n');
  485. b.append("author a <b> 1 z");
  486. final byte[] data = Constants.encodeASCII(b.toString());
  487. try {
  488. checker.checkCommit(data);
  489. fail("Did not catch corrupt object");
  490. } catch (CorruptObjectException e) {
  491. // Yes, really, we complain about author not being
  492. // found as the invalid parent line wasn't consumed.
  493. assertEquals("invalid author", e.getMessage());
  494. }
  495. }
  496. public void testInvalidCommitInvalidCommitter() {
  497. final StringBuilder b = new StringBuilder();
  498. b.append("tree ");
  499. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  500. b.append('\n');
  501. b.append("author a <b> 1 +0000\n");
  502. b.append("committer a <");
  503. final byte[] data = Constants.encodeASCII(b.toString());
  504. try {
  505. checker.checkCommit(data);
  506. fail("Did not catch corrupt object");
  507. } catch (CorruptObjectException e) {
  508. // Yes, really, we complain about author not being
  509. // found as the invalid parent line wasn't consumed.
  510. assertEquals("invalid committer", e.getMessage());
  511. }
  512. }
  513. public void testValidTag() throws CorruptObjectException {
  514. final StringBuilder b = new StringBuilder();
  515. b.append("object ");
  516. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  517. b.append('\n');
  518. b.append("type commit\n");
  519. b.append("tag test-tag\n");
  520. b.append("tagger A. U. Thor <author@localhost> 1 +0000\n");
  521. final byte[] data = Constants.encodeASCII(b.toString());
  522. checker.checkTag(data);
  523. checker.check(Constants.OBJ_TAG, data);
  524. }
  525. public void testInvalidTagNoObject1() {
  526. final StringBuilder b = new StringBuilder();
  527. final byte[] data = Constants.encodeASCII(b.toString());
  528. try {
  529. checker.checkTag(data);
  530. fail("incorrectly accepted invalid tag");
  531. } catch (CorruptObjectException e) {
  532. assertEquals("no object header", e.getMessage());
  533. }
  534. }
  535. public void testInvalidTagNoObject2() {
  536. final StringBuilder b = new StringBuilder();
  537. b.append("object\t");
  538. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  539. b.append('\n');
  540. final byte[] data = Constants.encodeASCII(b.toString());
  541. try {
  542. checker.checkTag(data);
  543. fail("incorrectly accepted invalid tag");
  544. } catch (CorruptObjectException e) {
  545. assertEquals("no object header", e.getMessage());
  546. }
  547. }
  548. public void testInvalidTagNoObject3() {
  549. final StringBuilder b = new StringBuilder();
  550. b.append("obejct ");
  551. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  552. b.append('\n');
  553. final byte[] data = Constants.encodeASCII(b.toString());
  554. try {
  555. checker.checkTag(data);
  556. fail("incorrectly accepted invalid tag");
  557. } catch (CorruptObjectException e) {
  558. assertEquals("no object header", e.getMessage());
  559. }
  560. }
  561. public void testInvalidTagNoObject4() {
  562. final StringBuilder b = new StringBuilder();
  563. b.append("object ");
  564. b.append("zz9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  565. b.append('\n');
  566. final byte[] data = Constants.encodeASCII(b.toString());
  567. try {
  568. checker.checkTag(data);
  569. fail("incorrectly accepted invalid tag");
  570. } catch (CorruptObjectException e) {
  571. assertEquals("invalid object", e.getMessage());
  572. }
  573. }
  574. public void testInvalidTagNoObject5() {
  575. final StringBuilder b = new StringBuilder();
  576. b.append("object ");
  577. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  578. b.append(" \n");
  579. final byte[] data = Constants.encodeASCII(b.toString());
  580. try {
  581. checker.checkTag(data);
  582. fail("incorrectly accepted invalid tag");
  583. } catch (CorruptObjectException e) {
  584. assertEquals("invalid object", e.getMessage());
  585. }
  586. }
  587. public void testInvalidTagNoObject6() {
  588. final StringBuilder b = new StringBuilder();
  589. b.append("object ");
  590. b.append("be9");
  591. final byte[] data = Constants.encodeASCII(b.toString());
  592. try {
  593. checker.checkTag(data);
  594. fail("incorrectly accepted invalid tag");
  595. } catch (CorruptObjectException e) {
  596. assertEquals("invalid object", e.getMessage());
  597. }
  598. }
  599. public void testInvalidTagNoType1() {
  600. final StringBuilder b = new StringBuilder();
  601. b.append("object ");
  602. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  603. b.append('\n');
  604. final byte[] data = Constants.encodeASCII(b.toString());
  605. try {
  606. checker.checkTag(data);
  607. fail("incorrectly accepted invalid tag");
  608. } catch (CorruptObjectException e) {
  609. assertEquals("no type header", e.getMessage());
  610. }
  611. }
  612. public void testInvalidTagNoType2() {
  613. final StringBuilder b = new StringBuilder();
  614. b.append("object ");
  615. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  616. b.append('\n');
  617. b.append("type\tcommit\n");
  618. final byte[] data = Constants.encodeASCII(b.toString());
  619. try {
  620. checker.checkTag(data);
  621. fail("incorrectly accepted invalid tag");
  622. } catch (CorruptObjectException e) {
  623. assertEquals("no type header", e.getMessage());
  624. }
  625. }
  626. public void testInvalidTagNoType3() {
  627. final StringBuilder b = new StringBuilder();
  628. b.append("object ");
  629. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  630. b.append('\n');
  631. b.append("tpye commit\n");
  632. final byte[] data = Constants.encodeASCII(b.toString());
  633. try {
  634. checker.checkTag(data);
  635. fail("incorrectly accepted invalid tag");
  636. } catch (CorruptObjectException e) {
  637. assertEquals("no type header", e.getMessage());
  638. }
  639. }
  640. public void testInvalidTagNoType4() {
  641. final StringBuilder b = new StringBuilder();
  642. b.append("object ");
  643. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  644. b.append('\n');
  645. b.append("type commit");
  646. final byte[] data = Constants.encodeASCII(b.toString());
  647. try {
  648. checker.checkTag(data);
  649. fail("incorrectly accepted invalid tag");
  650. } catch (CorruptObjectException e) {
  651. assertEquals("no tag header", e.getMessage());
  652. }
  653. }
  654. public void testInvalidTagNoTagHeader1() {
  655. final StringBuilder b = new StringBuilder();
  656. b.append("object ");
  657. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  658. b.append('\n');
  659. b.append("type commit\n");
  660. final byte[] data = Constants.encodeASCII(b.toString());
  661. try {
  662. checker.checkTag(data);
  663. fail("incorrectly accepted invalid tag");
  664. } catch (CorruptObjectException e) {
  665. assertEquals("no tag header", e.getMessage());
  666. }
  667. }
  668. public void testInvalidTagNoTagHeader2() {
  669. final StringBuilder b = new StringBuilder();
  670. b.append("object ");
  671. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  672. b.append('\n');
  673. b.append("type commit\n");
  674. b.append("tag\tfoo\n");
  675. final byte[] data = Constants.encodeASCII(b.toString());
  676. try {
  677. checker.checkTag(data);
  678. fail("incorrectly accepted invalid tag");
  679. } catch (CorruptObjectException e) {
  680. assertEquals("no tag header", e.getMessage());
  681. }
  682. }
  683. public void testInvalidTagNoTagHeader3() {
  684. final StringBuilder b = new StringBuilder();
  685. b.append("object ");
  686. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  687. b.append('\n');
  688. b.append("type commit\n");
  689. b.append("tga foo\n");
  690. final byte[] data = Constants.encodeASCII(b.toString());
  691. try {
  692. checker.checkTag(data);
  693. fail("incorrectly accepted invalid tag");
  694. } catch (CorruptObjectException e) {
  695. assertEquals("no tag header", e.getMessage());
  696. }
  697. }
  698. public void testValidTagHasNoTaggerHeader() throws CorruptObjectException {
  699. final StringBuilder b = new StringBuilder();
  700. b.append("object ");
  701. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  702. b.append('\n');
  703. b.append("type commit\n");
  704. b.append("tag foo\n");
  705. checker.checkTag(Constants.encodeASCII(b.toString()));
  706. }
  707. public void testInvalidTagInvalidTaggerHeader1() {
  708. final StringBuilder b = new StringBuilder();
  709. b.append("object ");
  710. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  711. b.append('\n');
  712. b.append("type commit\n");
  713. b.append("tag foo\n");
  714. b.append("tagger \n");
  715. final byte[] data = Constants.encodeASCII(b.toString());
  716. try {
  717. checker.checkTag(data);
  718. fail("incorrectly accepted invalid tag");
  719. } catch (CorruptObjectException e) {
  720. assertEquals("invalid tagger", e.getMessage());
  721. }
  722. }
  723. public void testInvalidTagInvalidTaggerHeader3() {
  724. final StringBuilder b = new StringBuilder();
  725. b.append("object ");
  726. b.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
  727. b.append('\n');
  728. b.append("type commit\n");
  729. b.append("tag foo\n");
  730. b.append("tagger a < 1 +000\n");
  731. final byte[] data = Constants.encodeASCII(b.toString());
  732. try {
  733. checker.checkTag(data);
  734. fail("incorrectly accepted invalid tag");
  735. } catch (CorruptObjectException e) {
  736. assertEquals("invalid tagger", e.getMessage());
  737. }
  738. }
  739. public void testValidEmptyTree() throws CorruptObjectException {
  740. checker.checkTree(new byte[0]);
  741. checker.check(Constants.OBJ_TREE, new byte[0]);
  742. }
  743. public void testValidTree1() throws CorruptObjectException {
  744. final StringBuilder b = new StringBuilder();
  745. entry(b, "100644 regular-file");
  746. final byte[] data = Constants.encodeASCII(b.toString());
  747. checker.checkTree(data);
  748. }
  749. public void testValidTree2() throws CorruptObjectException {
  750. final StringBuilder b = new StringBuilder();
  751. entry(b, "100755 executable");
  752. final byte[] data = Constants.encodeASCII(b.toString());
  753. checker.checkTree(data);
  754. }
  755. public void testValidTree3() throws CorruptObjectException {
  756. final StringBuilder b = new StringBuilder();
  757. entry(b, "40000 tree");
  758. final byte[] data = Constants.encodeASCII(b.toString());
  759. checker.checkTree(data);
  760. }
  761. public void testValidTree4() throws CorruptObjectException {
  762. final StringBuilder b = new StringBuilder();
  763. entry(b, "120000 symlink");
  764. final byte[] data = Constants.encodeASCII(b.toString());
  765. checker.checkTree(data);
  766. }
  767. public void testValidTree5() throws CorruptObjectException {
  768. final StringBuilder b = new StringBuilder();
  769. entry(b, "160000 git link");
  770. final byte[] data = Constants.encodeASCII(b.toString());
  771. checker.checkTree(data);
  772. }
  773. public void testValidTree6() throws CorruptObjectException {
  774. final StringBuilder b = new StringBuilder();
  775. entry(b, "100644 .a");
  776. final byte[] data = Constants.encodeASCII(b.toString());
  777. checker.checkTree(data);
  778. }
  779. public void testValidTreeSorting1() throws CorruptObjectException {
  780. final StringBuilder b = new StringBuilder();
  781. entry(b, "100644 fooaaa");
  782. entry(b, "100755 foobar");
  783. final byte[] data = Constants.encodeASCII(b.toString());
  784. checker.checkTree(data);
  785. }
  786. public void testValidTreeSorting2() throws CorruptObjectException {
  787. final StringBuilder b = new StringBuilder();
  788. entry(b, "100755 fooaaa");
  789. entry(b, "100644 foobar");
  790. final byte[] data = Constants.encodeASCII(b.toString());
  791. checker.checkTree(data);
  792. }
  793. public void testValidTreeSorting3() throws CorruptObjectException {
  794. final StringBuilder b = new StringBuilder();
  795. entry(b, "40000 a");
  796. entry(b, "100644 b");
  797. final byte[] data = Constants.encodeASCII(b.toString());
  798. checker.checkTree(data);
  799. }
  800. public void testValidTreeSorting4() throws CorruptObjectException {
  801. final StringBuilder b = new StringBuilder();
  802. entry(b, "100644 a");
  803. entry(b, "40000 b");
  804. final byte[] data = Constants.encodeASCII(b.toString());
  805. checker.checkTree(data);
  806. }
  807. public void testValidTreeSorting5() throws CorruptObjectException {
  808. final StringBuilder b = new StringBuilder();
  809. entry(b, "100644 a.c");
  810. entry(b, "40000 a");
  811. entry(b, "100644 a0c");
  812. final byte[] data = Constants.encodeASCII(b.toString());
  813. checker.checkTree(data);
  814. }
  815. public void testValidTreeSorting6() throws CorruptObjectException {
  816. final StringBuilder b = new StringBuilder();
  817. entry(b, "40000 a");
  818. entry(b, "100644 apple");
  819. final byte[] data = Constants.encodeASCII(b.toString());
  820. checker.checkTree(data);
  821. }
  822. public void testValidTreeSorting7() throws CorruptObjectException {
  823. final StringBuilder b = new StringBuilder();
  824. entry(b, "40000 an orang");
  825. entry(b, "40000 an orange");
  826. final byte[] data = Constants.encodeASCII(b.toString());
  827. checker.checkTree(data);
  828. }
  829. public void testValidTreeSorting8() throws CorruptObjectException {
  830. final StringBuilder b = new StringBuilder();
  831. entry(b, "100644 a");
  832. entry(b, "100644 a0c");
  833. entry(b, "100644 b");
  834. final byte[] data = Constants.encodeASCII(b.toString());
  835. checker.checkTree(data);
  836. }
  837. public void testInvalidTreeModeStartsWithZero1() {
  838. final StringBuilder b = new StringBuilder();
  839. entry(b, "0 a");
  840. final byte[] data = Constants.encodeASCII(b.toString());
  841. try {
  842. checker.checkTree(data);
  843. fail("incorrectly accepted an invalid tree");
  844. } catch (CorruptObjectException e) {
  845. assertEquals("mode starts with '0'", e.getMessage());
  846. }
  847. }
  848. public void testInvalidTreeModeStartsWithZero2() {
  849. final StringBuilder b = new StringBuilder();
  850. entry(b, "0100644 a");
  851. final byte[] data = Constants.encodeASCII(b.toString());
  852. try {
  853. checker.checkTree(data);
  854. fail("incorrectly accepted an invalid tree");
  855. } catch (CorruptObjectException e) {
  856. assertEquals("mode starts with '0'", e.getMessage());
  857. }
  858. }
  859. public void testInvalidTreeModeStartsWithZero3() {
  860. final StringBuilder b = new StringBuilder();
  861. entry(b, "040000 a");
  862. final byte[] data = Constants.encodeASCII(b.toString());
  863. try {
  864. checker.checkTree(data);
  865. fail("incorrectly accepted an invalid tree");
  866. } catch (CorruptObjectException e) {
  867. assertEquals("mode starts with '0'", e.getMessage());
  868. }
  869. }
  870. public void testInvalidTreeModeNotOctal1() {
  871. final StringBuilder b = new StringBuilder();
  872. entry(b, "8 a");
  873. final byte[] data = Constants.encodeASCII(b.toString());
  874. try {
  875. checker.checkTree(data);
  876. fail("incorrectly accepted an invalid tree");
  877. } catch (CorruptObjectException e) {
  878. assertEquals("invalid mode character", e.getMessage());
  879. }
  880. }
  881. public void testInvalidTreeModeNotOctal2() {
  882. final StringBuilder b = new StringBuilder();
  883. entry(b, "Z a");
  884. final byte[] data = Constants.encodeASCII(b.toString());
  885. try {
  886. checker.checkTree(data);
  887. fail("incorrectly accepted an invalid tree");
  888. } catch (CorruptObjectException e) {
  889. assertEquals("invalid mode character", e.getMessage());
  890. }
  891. }
  892. public void testInvalidTreeModeNotSupportedMode1() {
  893. final StringBuilder b = new StringBuilder();
  894. entry(b, "1 a");
  895. final byte[] data = Constants.encodeASCII(b.toString());
  896. try {
  897. checker.checkTree(data);
  898. fail("incorrectly accepted an invalid tree");
  899. } catch (CorruptObjectException e) {
  900. assertEquals("invalid mode 1", e.getMessage());
  901. }
  902. }
  903. public void testInvalidTreeModeNotSupportedMode2() {
  904. final StringBuilder b = new StringBuilder();
  905. entry(b, "170000 a");
  906. final byte[] data = Constants.encodeASCII(b.toString());
  907. try {
  908. checker.checkTree(data);
  909. fail("incorrectly accepted an invalid tree");
  910. } catch (CorruptObjectException e) {
  911. assertEquals("invalid mode " + 0170000, e.getMessage());
  912. }
  913. }
  914. public void testInvalidTreeModeMissingName() {
  915. final StringBuilder b = new StringBuilder();
  916. b.append("100644");
  917. final byte[] data = Constants.encodeASCII(b.toString());
  918. try {
  919. checker.checkTree(data);
  920. fail("incorrectly accepted an invalid tree");
  921. } catch (CorruptObjectException e) {
  922. assertEquals("truncated in mode", e.getMessage());
  923. }
  924. }
  925. public void testInvalidTreeNameContainsSlash() {
  926. final StringBuilder b = new StringBuilder();
  927. entry(b, "100644 a/b");
  928. final byte[] data = Constants.encodeASCII(b.toString());
  929. try {
  930. checker.checkTree(data);
  931. fail("incorrectly accepted an invalid tree");
  932. } catch (CorruptObjectException e) {
  933. assertEquals("name contains '/'", e.getMessage());
  934. }
  935. }
  936. public void testInvalidTreeNameIsEmpty() {
  937. final StringBuilder b = new StringBuilder();
  938. entry(b, "100644 ");
  939. final byte[] data = Constants.encodeASCII(b.toString());
  940. try {
  941. checker.checkTree(data);
  942. fail("incorrectly accepted an invalid tree");
  943. } catch (CorruptObjectException e) {
  944. assertEquals("zero length name", e.getMessage());
  945. }
  946. }
  947. public void testInvalidTreeNameIsDot() {
  948. final StringBuilder b = new StringBuilder();
  949. entry(b, "100644 .");
  950. final byte[] data = Constants.encodeASCII(b.toString());
  951. try {
  952. checker.checkTree(data);
  953. fail("incorrectly accepted an invalid tree");
  954. } catch (CorruptObjectException e) {
  955. assertEquals("invalid name '.'", e.getMessage());
  956. }
  957. }
  958. public void testInvalidTreeNameIsDotDot() {
  959. final StringBuilder b = new StringBuilder();
  960. entry(b, "100644 ..");
  961. final byte[] data = Constants.encodeASCII(b.toString());
  962. try {
  963. checker.checkTree(data);
  964. fail("incorrectly accepted an invalid tree");
  965. } catch (CorruptObjectException e) {
  966. assertEquals("invalid name '..'", e.getMessage());
  967. }
  968. }
  969. public void testInvalidTreeTruncatedInName() {
  970. final StringBuilder b = new StringBuilder();
  971. b.append("100644 b");
  972. final byte[] data = Constants.encodeASCII(b.toString());
  973. try {
  974. checker.checkTree(data);
  975. fail("incorrectly accepted an invalid tree");
  976. } catch (CorruptObjectException e) {
  977. assertEquals("truncated in name", e.getMessage());
  978. }
  979. }
  980. public void testInvalidTreeTruncatedInObjectId() {
  981. final StringBuilder b = new StringBuilder();
  982. b.append("100644 b\0\1\2");
  983. final byte[] data = Constants.encodeASCII(b.toString());
  984. try {
  985. checker.checkTree(data);
  986. fail("incorrectly accepted an invalid tree");
  987. } catch (CorruptObjectException e) {
  988. assertEquals("truncated in object id", e.getMessage());
  989. }
  990. }
  991. public void testInvalidTreeBadSorting1() {
  992. final StringBuilder b = new StringBuilder();
  993. entry(b, "100644 foobar");
  994. entry(b, "100644 fooaaa");
  995. final byte[] data = Constants.encodeASCII(b.toString());
  996. try {
  997. checker.checkTree(data);
  998. fail("incorrectly accepted an invalid tree");
  999. } catch (CorruptObjectException e) {
  1000. assertEquals("incorrectly sorted", e.getMessage());
  1001. }
  1002. }
  1003. public void testInvalidTreeBadSorting2() {
  1004. final StringBuilder b = new StringBuilder();
  1005. entry(b, "40000 a");
  1006. entry(b, "100644 a.c");
  1007. final byte[] data = Constants.encodeASCII(b.toString());
  1008. try {
  1009. checker.checkTree(data);
  1010. fail("incorrectly accepted an invalid tree");
  1011. } catch (CorruptObjectException e) {
  1012. assertEquals("incorrectly sorted", e.getMessage());
  1013. }
  1014. }
  1015. public void testInvalidTreeBadSorting3() {
  1016. final StringBuilder b = new StringBuilder();
  1017. entry(b, "100644 a0c");
  1018. entry(b, "40000 a");
  1019. final byte[] data = Constants.encodeASCII(b.toString());
  1020. try {
  1021. checker.checkTree(data);
  1022. fail("incorrectly accepted an invalid tree");
  1023. } catch (CorruptObjectException e) {
  1024. assertEquals("incorrectly sorted", e.getMessage());
  1025. }
  1026. }
  1027. public void testInvalidTreeDuplicateNames1() {
  1028. final StringBuilder b = new StringBuilder();
  1029. entry(b, "100644 a");
  1030. entry(b, "100644 a");
  1031. final byte[] data = Constants.encodeASCII(b.toString());
  1032. try {
  1033. checker.checkTree(data);
  1034. fail("incorrectly accepted an invalid tree");
  1035. } catch (CorruptObjectException e) {
  1036. assertEquals("duplicate entry names", e.getMessage());
  1037. }
  1038. }
  1039. public void testInvalidTreeDuplicateNames2() {
  1040. final StringBuilder b = new StringBuilder();
  1041. entry(b, "100644 a");
  1042. entry(b, "100755 a");
  1043. final byte[] data = Constants.encodeASCII(b.toString());
  1044. try {
  1045. checker.checkTree(data);
  1046. fail("incorrectly accepted an invalid tree");
  1047. } catch (CorruptObjectException e) {
  1048. assertEquals("duplicate entry names", e.getMessage());
  1049. }
  1050. }
  1051. public void testInvalidTreeDuplicateNames3() {
  1052. final StringBuilder b = new StringBuilder();
  1053. entry(b, "100644 a");
  1054. entry(b, "40000 a");
  1055. final byte[] data = Constants.encodeASCII(b.toString());
  1056. try {
  1057. checker.checkTree(data);
  1058. fail("incorrectly accepted an invalid tree");
  1059. } catch (CorruptObjectException e) {
  1060. assertEquals("duplicate entry names", e.getMessage());
  1061. }
  1062. }
  1063. public void testInvalidTreeDuplicateNames4() {
  1064. final StringBuilder b = new StringBuilder();
  1065. entry(b, "100644 a");
  1066. entry(b, "100644 a.c");
  1067. entry(b, "100644 a.d");
  1068. entry(b, "100644 a.e");
  1069. entry(b, "40000 a");
  1070. entry(b, "100644 zoo");
  1071. final byte[] data = Constants.encodeASCII(b.toString());
  1072. try {
  1073. checker.checkTree(data);
  1074. fail("incorrectly accepted an invalid tree");
  1075. } catch (CorruptObjectException e) {
  1076. assertEquals("duplicate entry names", e.getMessage());
  1077. }
  1078. }
  1079. private static void entry(final StringBuilder b, final String modeName) {
  1080. b.append(modeName);
  1081. b.append('\0');
  1082. for (int i = 0; i < Constants.OBJECT_ID_LENGTH; i++)
  1083. b.append((char) i);
  1084. }
  1085. }