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 38KB

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