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.

ObjectCheckerTest.java 37KB

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