2 * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
3 * Copyright (C) 2008, Google Inc.
7 * Redistribution and use in source and binary forms, with or
8 * without modification, are permitted provided that the following
11 * - Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
14 * - Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer in the documentation and/or other materials provided
17 * with the distribution.
19 * - Neither the name of the Git Development Community nor the
20 * names of its contributors may be used to endorse or promote
21 * products derived from this software without specific prior
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
25 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
26 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
27 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
29 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
34 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
36 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 package org
.spearce
.jgit
.lib
;
41 import junit
.framework
.TestCase
;
43 import org
.spearce
.jgit
.errors
.CorruptObjectException
;
45 public class ObjectCheckerTest
extends TestCase
{
46 private ObjectChecker checker
;
48 protected void setUp() throws Exception
{
50 checker
= new ObjectChecker();
53 public void testInvalidType() {
55 checker
.check(Constants
.OBJ_BAD
, new byte[0]);
56 fail("Did not throw CorruptObjectException");
57 } catch (CorruptObjectException e
) {
58 final String m
= e
.getMessage();
59 assertEquals("Invalid object type: " + Constants
.OBJ_BAD
, m
);
63 public void testCheckBlob() throws CorruptObjectException
{
64 // Any blob should pass...
65 checker
.checkBlob(new byte[0]);
66 checker
.checkBlob(new byte[1]);
68 checker
.check(Constants
.OBJ_BLOB
, new byte[0]);
69 checker
.check(Constants
.OBJ_BLOB
, new byte[1]);
72 public void testValidCommitNoParent() throws CorruptObjectException
{
73 final StringBuilder b
= new StringBuilder();
76 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
79 b
.append("author A. U. Thor <author@localhost> 1 +0000\n");
80 b
.append("committer A. U. Thor <author@localhost> 1 +0000\n");
82 final byte[] data
= Constants
.encodeASCII(b
.toString());
83 checker
.checkCommit(data
);
84 checker
.check(Constants
.OBJ_COMMIT
, data
);
87 public void testValidCommitBlankAuthor() throws CorruptObjectException
{
88 final StringBuilder b
= new StringBuilder();
91 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
94 b
.append("author <> 0 +0000\n");
95 b
.append("committer <> 0 +0000\n");
97 final byte[] data
= Constants
.encodeASCII(b
.toString());
98 checker
.checkCommit(data
);
99 checker
.check(Constants
.OBJ_COMMIT
, data
);
102 public void testValidCommit1Parent() throws CorruptObjectException
{
103 final StringBuilder b
= new StringBuilder();
106 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
110 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
113 b
.append("author A. U. Thor <author@localhost> 1 +0000\n");
114 b
.append("committer A. U. Thor <author@localhost> 1 +0000\n");
116 final byte[] data
= Constants
.encodeASCII(b
.toString());
117 checker
.checkCommit(data
);
118 checker
.check(Constants
.OBJ_COMMIT
, data
);
121 public void testValidCommit2Parent() throws CorruptObjectException
{
122 final StringBuilder b
= new StringBuilder();
125 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
129 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
133 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
136 b
.append("author A. U. Thor <author@localhost> 1 +0000\n");
137 b
.append("committer A. U. Thor <author@localhost> 1 +0000\n");
139 final byte[] data
= Constants
.encodeASCII(b
.toString());
140 checker
.checkCommit(data
);
141 checker
.check(Constants
.OBJ_COMMIT
, data
);
144 public void testValidCommit128Parent() throws CorruptObjectException
{
145 final StringBuilder b
= new StringBuilder();
148 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
151 for (int i
= 0; i
< 128; i
++) {
153 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
157 b
.append("author A. U. Thor <author@localhost> 1 +0000\n");
158 b
.append("committer A. U. Thor <author@localhost> 1 +0000\n");
160 final byte[] data
= Constants
.encodeASCII(b
.toString());
161 checker
.checkCommit(data
);
162 checker
.check(Constants
.OBJ_COMMIT
, data
);
165 public void testValidCommitNormalTime() throws CorruptObjectException
{
166 final StringBuilder b
= new StringBuilder();
167 final String when
= "1222757360 -0730";
170 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
173 b
.append("author A. U. Thor <author@localhost> " + when
+ "\n");
174 b
.append("committer A. U. Thor <author@localhost> " + when
+ "\n");
176 final byte[] data
= Constants
.encodeASCII(b
.toString());
177 checker
.checkCommit(data
);
178 checker
.check(Constants
.OBJ_COMMIT
, data
);
181 public void testInvalidCommitNoTree1() {
182 final StringBuilder b
= new StringBuilder();
185 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
188 final byte[] data
= Constants
.encodeASCII(b
.toString());
190 checker
.checkCommit(data
);
191 fail("Did not catch corrupt object");
192 } catch (CorruptObjectException e
) {
193 assertEquals("no tree header", e
.getMessage());
197 public void testInvalidCommitNoTree2() {
198 final StringBuilder b
= new StringBuilder();
201 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
204 final byte[] data
= Constants
.encodeASCII(b
.toString());
206 checker
.checkCommit(data
);
207 fail("Did not catch corrupt object");
208 } catch (CorruptObjectException e
) {
209 assertEquals("no tree header", e
.getMessage());
213 public void testInvalidCommitNoTree3() {
214 final StringBuilder b
= new StringBuilder();
217 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
220 final byte[] data
= Constants
.encodeASCII(b
.toString());
222 checker
.checkCommit(data
);
223 fail("Did not catch corrupt object");
224 } catch (CorruptObjectException e
) {
225 assertEquals("no tree header", e
.getMessage());
229 public void testInvalidCommitNoTree4() {
230 final StringBuilder b
= new StringBuilder();
233 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
236 final byte[] data
= Constants
.encodeASCII(b
.toString());
238 checker
.checkCommit(data
);
239 fail("Did not catch corrupt object");
240 } catch (CorruptObjectException e
) {
241 assertEquals("no tree header", e
.getMessage());
245 public void testInvalidCommitInvalidTree1() {
246 final StringBuilder b
= new StringBuilder();
249 b
.append("zzzzfa841874ccc9f2ef7c48d0c76226f89b7189");
252 final byte[] data
= Constants
.encodeASCII(b
.toString());
254 checker
.checkCommit(data
);
255 fail("Did not catch corrupt object");
256 } catch (CorruptObjectException e
) {
257 assertEquals("invalid tree", e
.getMessage());
261 public void testInvalidCommitInvalidTree2() {
262 final StringBuilder b
= new StringBuilder();
265 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
268 final byte[] data
= Constants
.encodeASCII(b
.toString());
270 checker
.checkCommit(data
);
271 fail("Did not catch corrupt object");
272 } catch (CorruptObjectException e
) {
273 assertEquals("invalid tree", e
.getMessage());
277 public void testInvalidCommitInvalidTree3() {
278 final StringBuilder b
= new StringBuilder();
284 final byte[] data
= Constants
.encodeASCII(b
.toString());
286 checker
.checkCommit(data
);
287 fail("Did not catch corrupt object");
288 } catch (CorruptObjectException e
) {
289 assertEquals("invalid tree", e
.getMessage());
293 public void testInvalidCommitInvalidTree4() {
294 final StringBuilder b
= new StringBuilder();
297 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
300 final byte[] data
= Constants
.encodeASCII(b
.toString());
302 checker
.checkCommit(data
);
303 fail("Did not catch corrupt object");
304 } catch (CorruptObjectException e
) {
305 assertEquals("invalid tree", e
.getMessage());
309 public void testInvalidCommitInvalidParent1() {
310 final StringBuilder b
= new StringBuilder();
313 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
319 final byte[] data
= Constants
.encodeASCII(b
.toString());
321 checker
.checkCommit(data
);
322 fail("Did not catch corrupt object");
323 } catch (CorruptObjectException e
) {
324 assertEquals("invalid parent", e
.getMessage());
328 public void testInvalidCommitInvalidParent2() {
329 final StringBuilder b
= new StringBuilder();
332 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
336 b
.append("zzzzfa841874ccc9f2ef7c48d0c76226f89b7189");
339 final byte[] data
= Constants
.encodeASCII(b
.toString());
341 checker
.checkCommit(data
);
342 fail("Did not catch corrupt object");
343 } catch (CorruptObjectException e
) {
344 assertEquals("invalid parent", e
.getMessage());
348 public void testInvalidCommitInvalidParent3() {
349 final StringBuilder b
= new StringBuilder();
352 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
356 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
359 final byte[] data
= Constants
.encodeASCII(b
.toString());
361 checker
.checkCommit(data
);
362 fail("Did not catch corrupt object");
363 } catch (CorruptObjectException e
) {
364 assertEquals("invalid parent", e
.getMessage());
368 public void testInvalidCommitInvalidParent4() {
369 final StringBuilder b
= new StringBuilder();
372 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
376 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
379 final byte[] data
= Constants
.encodeASCII(b
.toString());
381 checker
.checkCommit(data
);
382 fail("Did not catch corrupt object");
383 } catch (CorruptObjectException e
) {
384 assertEquals("invalid parent", e
.getMessage());
388 public void testInvalidCommitInvalidParent5() {
389 final StringBuilder b
= new StringBuilder();
392 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
395 b
.append("parent\t");
396 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
399 final byte[] data
= Constants
.encodeASCII(b
.toString());
401 checker
.checkCommit(data
);
402 fail("Did not catch corrupt object");
403 } catch (CorruptObjectException e
) {
404 // Yes, really, we complain about author not being
405 // found as the invalid parent line wasn't consumed.
406 assertEquals("no author", e
.getMessage());
410 public void testInvalidCommitNoAuthor() {
411 final StringBuilder b
= new StringBuilder();
414 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
417 b
.append("committer A. U. Thor <author@localhost> 1 +0000\n");
419 final byte[] data
= Constants
.encodeASCII(b
.toString());
421 checker
.checkCommit(data
);
422 fail("Did not catch corrupt object");
423 } catch (CorruptObjectException e
) {
424 // Yes, really, we complain about author not being
425 // found as the invalid parent line wasn't consumed.
426 assertEquals("no author", e
.getMessage());
430 public void testInvalidCommitNoCommitter1() {
431 final StringBuilder b
= new StringBuilder();
434 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
437 b
.append("author A. U. Thor <author@localhost> 1 +0000\n");
439 final byte[] data
= Constants
.encodeASCII(b
.toString());
441 checker
.checkCommit(data
);
442 fail("Did not catch corrupt object");
443 } catch (CorruptObjectException e
) {
444 // Yes, really, we complain about author not being
445 // found as the invalid parent line wasn't consumed.
446 assertEquals("no committer", e
.getMessage());
450 public void testInvalidCommitNoCommitter2() {
451 final StringBuilder b
= new StringBuilder();
454 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
457 b
.append("author A. U. Thor <author@localhost> 1 +0000\n");
460 final byte[] data
= Constants
.encodeASCII(b
.toString());
462 checker
.checkCommit(data
);
463 fail("Did not catch corrupt object");
464 } catch (CorruptObjectException e
) {
465 // Yes, really, we complain about author not being
466 // found as the invalid parent line wasn't consumed.
467 assertEquals("no committer", e
.getMessage());
471 public void testInvalidCommitInvalidAuthor1() {
472 final StringBuilder b
= new StringBuilder();
475 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
478 b
.append("author A. U. Thor <foo 1 +0000\n");
480 final byte[] data
= Constants
.encodeASCII(b
.toString());
482 checker
.checkCommit(data
);
483 fail("Did not catch corrupt object");
484 } catch (CorruptObjectException e
) {
485 // Yes, really, we complain about author not being
486 // found as the invalid parent line wasn't consumed.
487 assertEquals("invalid author", e
.getMessage());
491 public void testInvalidCommitInvalidAuthor2() {
492 final StringBuilder b
= new StringBuilder();
495 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
498 b
.append("author A. U. Thor foo> 1 +0000\n");
500 final byte[] data
= Constants
.encodeASCII(b
.toString());
502 checker
.checkCommit(data
);
503 fail("Did not catch corrupt object");
504 } catch (CorruptObjectException e
) {
505 // Yes, really, we complain about author not being
506 // found as the invalid parent line wasn't consumed.
507 assertEquals("invalid author", e
.getMessage());
511 public void testInvalidCommitInvalidAuthor3() {
512 final StringBuilder b
= new StringBuilder();
515 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
518 b
.append("author 1 +0000\n");
520 final byte[] data
= Constants
.encodeASCII(b
.toString());
522 checker
.checkCommit(data
);
523 fail("Did not catch corrupt object");
524 } catch (CorruptObjectException e
) {
525 // Yes, really, we complain about author not being
526 // found as the invalid parent line wasn't consumed.
527 assertEquals("invalid author", e
.getMessage());
531 public void testInvalidCommitInvalidAuthor4() {
532 final StringBuilder b
= new StringBuilder();
535 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
538 b
.append("author a <b> +0000\n");
540 final byte[] data
= Constants
.encodeASCII(b
.toString());
542 checker
.checkCommit(data
);
543 fail("Did not catch corrupt object");
544 } catch (CorruptObjectException e
) {
545 // Yes, really, we complain about author not being
546 // found as the invalid parent line wasn't consumed.
547 assertEquals("invalid author", e
.getMessage());
551 public void testInvalidCommitInvalidAuthor5() {
552 final StringBuilder b
= new StringBuilder();
555 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
558 b
.append("author a <b>\n");
560 final byte[] data
= Constants
.encodeASCII(b
.toString());
562 checker
.checkCommit(data
);
563 fail("Did not catch corrupt object");
564 } catch (CorruptObjectException e
) {
565 // Yes, really, we complain about author not being
566 // found as the invalid parent line wasn't consumed.
567 assertEquals("invalid author", e
.getMessage());
571 public void testInvalidCommitInvalidAuthor6() {
572 final StringBuilder b
= new StringBuilder();
575 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
578 b
.append("author a <b> z");
580 final byte[] data
= Constants
.encodeASCII(b
.toString());
582 checker
.checkCommit(data
);
583 fail("Did not catch corrupt object");
584 } catch (CorruptObjectException e
) {
585 // Yes, really, we complain about author not being
586 // found as the invalid parent line wasn't consumed.
587 assertEquals("invalid author", e
.getMessage());
591 public void testInvalidCommitInvalidAuthor7() {
592 final StringBuilder b
= new StringBuilder();
595 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
598 b
.append("author a <b> 1 z");
600 final byte[] data
= Constants
.encodeASCII(b
.toString());
602 checker
.checkCommit(data
);
603 fail("Did not catch corrupt object");
604 } catch (CorruptObjectException e
) {
605 // Yes, really, we complain about author not being
606 // found as the invalid parent line wasn't consumed.
607 assertEquals("invalid author", e
.getMessage());
611 public void testInvalidCommitInvalidCommitter() {
612 final StringBuilder b
= new StringBuilder();
615 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
618 b
.append("author a <b> 1 +0000\n");
619 b
.append("committer a <");
621 final byte[] data
= Constants
.encodeASCII(b
.toString());
623 checker
.checkCommit(data
);
624 fail("Did not catch corrupt object");
625 } catch (CorruptObjectException e
) {
626 // Yes, really, we complain about author not being
627 // found as the invalid parent line wasn't consumed.
628 assertEquals("invalid committer", e
.getMessage());
632 public void testValidTag() throws CorruptObjectException
{
633 final StringBuilder b
= new StringBuilder();
636 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
639 b
.append("type commit\n");
640 b
.append("tag test-tag\n");
641 b
.append("tagger A. U. Thor <author@localhost> 1 +0000\n");
643 final byte[] data
= Constants
.encodeASCII(b
.toString());
644 checker
.checkTag(data
);
645 checker
.check(Constants
.OBJ_TAG
, data
);
648 public void testInvalidTagNoObject1() {
649 final StringBuilder b
= new StringBuilder();
651 final byte[] data
= Constants
.encodeASCII(b
.toString());
653 checker
.checkTag(data
);
654 fail("incorrectly accepted invalid tag");
655 } catch (CorruptObjectException e
) {
656 assertEquals("no object header", e
.getMessage());
660 public void testInvalidTagNoObject2() {
661 final StringBuilder b
= new StringBuilder();
663 b
.append("object\t");
664 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
667 final byte[] data
= Constants
.encodeASCII(b
.toString());
669 checker
.checkTag(data
);
670 fail("incorrectly accepted invalid tag");
671 } catch (CorruptObjectException e
) {
672 assertEquals("no object header", e
.getMessage());
676 public void testInvalidTagNoObject3() {
677 final StringBuilder b
= new StringBuilder();
680 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
683 final byte[] data
= Constants
.encodeASCII(b
.toString());
685 checker
.checkTag(data
);
686 fail("incorrectly accepted invalid tag");
687 } catch (CorruptObjectException e
) {
688 assertEquals("no object header", e
.getMessage());
692 public void testInvalidTagNoObject4() {
693 final StringBuilder b
= new StringBuilder();
696 b
.append("zz9bfa841874ccc9f2ef7c48d0c76226f89b7189");
699 final byte[] data
= Constants
.encodeASCII(b
.toString());
701 checker
.checkTag(data
);
702 fail("incorrectly accepted invalid tag");
703 } catch (CorruptObjectException e
) {
704 assertEquals("invalid object", e
.getMessage());
708 public void testInvalidTagNoObject5() {
709 final StringBuilder b
= new StringBuilder();
712 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
715 final byte[] data
= Constants
.encodeASCII(b
.toString());
717 checker
.checkTag(data
);
718 fail("incorrectly accepted invalid tag");
719 } catch (CorruptObjectException e
) {
720 assertEquals("invalid object", e
.getMessage());
724 public void testInvalidTagNoObject6() {
725 final StringBuilder b
= new StringBuilder();
730 final byte[] data
= Constants
.encodeASCII(b
.toString());
732 checker
.checkTag(data
);
733 fail("incorrectly accepted invalid tag");
734 } catch (CorruptObjectException e
) {
735 assertEquals("invalid object", e
.getMessage());
739 public void testInvalidTagNoType1() {
740 final StringBuilder b
= new StringBuilder();
743 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
746 final byte[] data
= Constants
.encodeASCII(b
.toString());
748 checker
.checkTag(data
);
749 fail("incorrectly accepted invalid tag");
750 } catch (CorruptObjectException e
) {
751 assertEquals("no type header", e
.getMessage());
755 public void testInvalidTagNoType2() {
756 final StringBuilder b
= new StringBuilder();
759 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
762 b
.append("type\tcommit\n");
764 final byte[] data
= Constants
.encodeASCII(b
.toString());
766 checker
.checkTag(data
);
767 fail("incorrectly accepted invalid tag");
768 } catch (CorruptObjectException e
) {
769 assertEquals("no type header", e
.getMessage());
773 public void testInvalidTagNoType3() {
774 final StringBuilder b
= new StringBuilder();
777 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
780 b
.append("tpye commit\n");
782 final byte[] data
= Constants
.encodeASCII(b
.toString());
784 checker
.checkTag(data
);
785 fail("incorrectly accepted invalid tag");
786 } catch (CorruptObjectException e
) {
787 assertEquals("no type header", e
.getMessage());
791 public void testInvalidTagNoType4() {
792 final StringBuilder b
= new StringBuilder();
795 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
798 b
.append("type commit");
800 final byte[] data
= Constants
.encodeASCII(b
.toString());
802 checker
.checkTag(data
);
803 fail("incorrectly accepted invalid tag");
804 } catch (CorruptObjectException e
) {
805 assertEquals("no tag header", e
.getMessage());
809 public void testInvalidTagNoTagHeader1() {
810 final StringBuilder b
= new StringBuilder();
813 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
816 b
.append("type commit\n");
818 final byte[] data
= Constants
.encodeASCII(b
.toString());
820 checker
.checkTag(data
);
821 fail("incorrectly accepted invalid tag");
822 } catch (CorruptObjectException e
) {
823 assertEquals("no tag header", e
.getMessage());
827 public void testInvalidTagNoTagHeader2() {
828 final StringBuilder b
= new StringBuilder();
831 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
834 b
.append("type commit\n");
835 b
.append("tag\tfoo\n");
837 final byte[] data
= Constants
.encodeASCII(b
.toString());
839 checker
.checkTag(data
);
840 fail("incorrectly accepted invalid tag");
841 } catch (CorruptObjectException e
) {
842 assertEquals("no tag header", e
.getMessage());
846 public void testInvalidTagNoTagHeader3() {
847 final StringBuilder b
= new StringBuilder();
850 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
853 b
.append("type commit\n");
854 b
.append("tga foo\n");
856 final byte[] data
= Constants
.encodeASCII(b
.toString());
858 checker
.checkTag(data
);
859 fail("incorrectly accepted invalid tag");
860 } catch (CorruptObjectException e
) {
861 assertEquals("no tag header", e
.getMessage());
865 public void testInvalidTagNoTagHeader4() {
866 final StringBuilder b
= new StringBuilder();
869 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
872 b
.append("type commit\n");
875 final byte[] data
= Constants
.encodeASCII(b
.toString());
877 checker
.checkTag(data
);
878 fail("incorrectly accepted invalid tag");
879 } catch (CorruptObjectException e
) {
880 assertEquals("no tagger header", e
.getMessage());
884 public void testInvalidTagNoTaggerHeader1() {
885 final StringBuilder b
= new StringBuilder();
888 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
891 b
.append("type commit\n");
892 b
.append("tag foo\n");
894 final byte[] data
= Constants
.encodeASCII(b
.toString());
896 checker
.checkTag(data
);
897 fail("incorrectly accepted invalid tag");
898 } catch (CorruptObjectException e
) {
899 assertEquals("no tagger header", e
.getMessage());
903 public void testInvalidTagInvalidTaggerHeader1() {
904 final StringBuilder b
= new StringBuilder();
907 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
910 b
.append("type commit\n");
911 b
.append("tag foo\n");
912 b
.append("tagger \n");
914 final byte[] data
= Constants
.encodeASCII(b
.toString());
916 checker
.checkTag(data
);
917 fail("incorrectly accepted invalid tag");
918 } catch (CorruptObjectException e
) {
919 assertEquals("invalid tagger", e
.getMessage());
923 public void testInvalidTagInvalidTaggerHeader3() {
924 final StringBuilder b
= new StringBuilder();
927 b
.append("be9bfa841874ccc9f2ef7c48d0c76226f89b7189");
930 b
.append("type commit\n");
931 b
.append("tag foo\n");
932 b
.append("tagger a < 1 +000\n");
934 final byte[] data
= Constants
.encodeASCII(b
.toString());
936 checker
.checkTag(data
);
937 fail("incorrectly accepted invalid tag");
938 } catch (CorruptObjectException e
) {
939 assertEquals("invalid tagger", e
.getMessage());
943 public void testValidEmptyTree() throws CorruptObjectException
{
944 checker
.checkTree(new byte[0]);
945 checker
.check(Constants
.OBJ_TREE
, new byte[0]);
948 public void testValidTree1() throws CorruptObjectException
{
949 final StringBuilder b
= new StringBuilder();
950 entry(b
, "100644 regular-file");
951 final byte[] data
= Constants
.encodeASCII(b
.toString());
952 checker
.checkTree(data
);
955 public void testValidTree2() throws CorruptObjectException
{
956 final StringBuilder b
= new StringBuilder();
957 entry(b
, "100755 executable");
958 final byte[] data
= Constants
.encodeASCII(b
.toString());
959 checker
.checkTree(data
);
962 public void testValidTree3() throws CorruptObjectException
{
963 final StringBuilder b
= new StringBuilder();
964 entry(b
, "40000 tree");
965 final byte[] data
= Constants
.encodeASCII(b
.toString());
966 checker
.checkTree(data
);
969 public void testValidTree4() throws CorruptObjectException
{
970 final StringBuilder b
= new StringBuilder();
971 entry(b
, "120000 symlink");
972 final byte[] data
= Constants
.encodeASCII(b
.toString());
973 checker
.checkTree(data
);
976 public void testValidTree5() throws CorruptObjectException
{
977 final StringBuilder b
= new StringBuilder();
978 entry(b
, "160000 git link");
979 final byte[] data
= Constants
.encodeASCII(b
.toString());
980 checker
.checkTree(data
);
983 public void testValidTree6() throws CorruptObjectException
{
984 final StringBuilder b
= new StringBuilder();
985 entry(b
, "100644 .a");
986 final byte[] data
= Constants
.encodeASCII(b
.toString());
987 checker
.checkTree(data
);
990 public void testValidTreeSorting1() throws CorruptObjectException
{
991 final StringBuilder b
= new StringBuilder();
992 entry(b
, "100644 fooaaa");
993 entry(b
, "100755 foobar");
994 final byte[] data
= Constants
.encodeASCII(b
.toString());
995 checker
.checkTree(data
);
998 public void testValidTreeSorting2() throws CorruptObjectException
{
999 final StringBuilder b
= new StringBuilder();
1000 entry(b
, "100755 fooaaa");
1001 entry(b
, "100644 foobar");
1002 final byte[] data
= Constants
.encodeASCII(b
.toString());
1003 checker
.checkTree(data
);
1006 public void testValidTreeSorting3() throws CorruptObjectException
{
1007 final StringBuilder b
= new StringBuilder();
1008 entry(b
, "40000 a");
1009 entry(b
, "100644 b");
1010 final byte[] data
= Constants
.encodeASCII(b
.toString());
1011 checker
.checkTree(data
);
1014 public void testValidTreeSorting4() throws CorruptObjectException
{
1015 final StringBuilder b
= new StringBuilder();
1016 entry(b
, "100644 a");
1017 entry(b
, "40000 b");
1018 final byte[] data
= Constants
.encodeASCII(b
.toString());
1019 checker
.checkTree(data
);
1022 public void testValidTreeSorting5() throws CorruptObjectException
{
1023 final StringBuilder b
= new StringBuilder();
1024 entry(b
, "100644 a.c");
1025 entry(b
, "40000 a");
1026 entry(b
, "100644 a0c");
1027 final byte[] data
= Constants
.encodeASCII(b
.toString());
1028 checker
.checkTree(data
);
1031 public void testValidTreeSorting6() throws CorruptObjectException
{
1032 final StringBuilder b
= new StringBuilder();
1033 entry(b
, "40000 a");
1034 entry(b
, "100644 apple");
1035 final byte[] data
= Constants
.encodeASCII(b
.toString());
1036 checker
.checkTree(data
);
1039 public void testValidTreeSorting7() throws CorruptObjectException
{
1040 final StringBuilder b
= new StringBuilder();
1041 entry(b
, "40000 an orang");
1042 entry(b
, "40000 an orange");
1043 final byte[] data
= Constants
.encodeASCII(b
.toString());
1044 checker
.checkTree(data
);
1047 public void testValidTreeSorting8() throws CorruptObjectException
{
1048 final StringBuilder b
= new StringBuilder();
1049 entry(b
, "100644 a");
1050 entry(b
, "100644 a0c");
1051 entry(b
, "100644 b");
1052 final byte[] data
= Constants
.encodeASCII(b
.toString());
1053 checker
.checkTree(data
);
1056 public void testInvalidTreeModeStartsWithZero1() {
1057 final StringBuilder b
= new StringBuilder();
1059 final byte[] data
= Constants
.encodeASCII(b
.toString());
1061 checker
.checkTree(data
);
1062 fail("incorrectly accepted an invalid tree");
1063 } catch (CorruptObjectException e
) {
1064 assertEquals("mode starts with '0'", e
.getMessage());
1068 public void testInvalidTreeModeStartsWithZero2() {
1069 final StringBuilder b
= new StringBuilder();
1070 entry(b
, "0100644 a");
1071 final byte[] data
= Constants
.encodeASCII(b
.toString());
1073 checker
.checkTree(data
);
1074 fail("incorrectly accepted an invalid tree");
1075 } catch (CorruptObjectException e
) {
1076 assertEquals("mode starts with '0'", e
.getMessage());
1080 public void testInvalidTreeModeStartsWithZero3() {
1081 final StringBuilder b
= new StringBuilder();
1082 entry(b
, "040000 a");
1083 final byte[] data
= Constants
.encodeASCII(b
.toString());
1085 checker
.checkTree(data
);
1086 fail("incorrectly accepted an invalid tree");
1087 } catch (CorruptObjectException e
) {
1088 assertEquals("mode starts with '0'", e
.getMessage());
1092 public void testInvalidTreeModeNotOctal1() {
1093 final StringBuilder b
= new StringBuilder();
1095 final byte[] data
= Constants
.encodeASCII(b
.toString());
1097 checker
.checkTree(data
);
1098 fail("incorrectly accepted an invalid tree");
1099 } catch (CorruptObjectException e
) {
1100 assertEquals("invalid mode character", e
.getMessage());
1104 public void testInvalidTreeModeNotOctal2() {
1105 final StringBuilder b
= new StringBuilder();
1107 final byte[] data
= Constants
.encodeASCII(b
.toString());
1109 checker
.checkTree(data
);
1110 fail("incorrectly accepted an invalid tree");
1111 } catch (CorruptObjectException e
) {
1112 assertEquals("invalid mode character", e
.getMessage());
1116 public void testInvalidTreeModeNotSupportedMode1() {
1117 final StringBuilder b
= new StringBuilder();
1119 final byte[] data
= Constants
.encodeASCII(b
.toString());
1121 checker
.checkTree(data
);
1122 fail("incorrectly accepted an invalid tree");
1123 } catch (CorruptObjectException e
) {
1124 assertEquals("invalid mode 1", e
.getMessage());
1128 public void testInvalidTreeModeNotSupportedMode2() {
1129 final StringBuilder b
= new StringBuilder();
1130 entry(b
, "170000 a");
1131 final byte[] data
= Constants
.encodeASCII(b
.toString());
1133 checker
.checkTree(data
);
1134 fail("incorrectly accepted an invalid tree");
1135 } catch (CorruptObjectException e
) {
1136 assertEquals("invalid mode " + 0170000, e
.getMessage());
1140 public void testInvalidTreeModeMissingName() {
1141 final StringBuilder b
= new StringBuilder();
1143 final byte[] data
= Constants
.encodeASCII(b
.toString());
1145 checker
.checkTree(data
);
1146 fail("incorrectly accepted an invalid tree");
1147 } catch (CorruptObjectException e
) {
1148 assertEquals("truncated in mode", e
.getMessage());
1152 public void testInvalidTreeNameContainsSlash() {
1153 final StringBuilder b
= new StringBuilder();
1154 entry(b
, "100644 a/b");
1155 final byte[] data
= Constants
.encodeASCII(b
.toString());
1157 checker
.checkTree(data
);
1158 fail("incorrectly accepted an invalid tree");
1159 } catch (CorruptObjectException e
) {
1160 assertEquals("name contains '/'", e
.getMessage());
1164 public void testInvalidTreeNameIsEmpty() {
1165 final StringBuilder b
= new StringBuilder();
1166 entry(b
, "100644 ");
1167 final byte[] data
= Constants
.encodeASCII(b
.toString());
1169 checker
.checkTree(data
);
1170 fail("incorrectly accepted an invalid tree");
1171 } catch (CorruptObjectException e
) {
1172 assertEquals("zero length name", e
.getMessage());
1176 public void testInvalidTreeNameIsDot() {
1177 final StringBuilder b
= new StringBuilder();
1178 entry(b
, "100644 .");
1179 final byte[] data
= Constants
.encodeASCII(b
.toString());
1181 checker
.checkTree(data
);
1182 fail("incorrectly accepted an invalid tree");
1183 } catch (CorruptObjectException e
) {
1184 assertEquals("invalid name '.'", e
.getMessage());
1188 public void testInvalidTreeNameIsDotDot() {
1189 final StringBuilder b
= new StringBuilder();
1190 entry(b
, "100644 ..");
1191 final byte[] data
= Constants
.encodeASCII(b
.toString());
1193 checker
.checkTree(data
);
1194 fail("incorrectly accepted an invalid tree");
1195 } catch (CorruptObjectException e
) {
1196 assertEquals("invalid name '..'", e
.getMessage());
1200 public void testInvalidTreeTruncatedInName() {
1201 final StringBuilder b
= new StringBuilder();
1202 b
.append("100644 b");
1203 final byte[] data
= Constants
.encodeASCII(b
.toString());
1205 checker
.checkTree(data
);
1206 fail("incorrectly accepted an invalid tree");
1207 } catch (CorruptObjectException e
) {
1208 assertEquals("truncated in name", e
.getMessage());
1212 public void testInvalidTreeTruncatedInObjectId() {
1213 final StringBuilder b
= new StringBuilder();
1214 b
.append("100644 b\0\1\2");
1215 final byte[] data
= Constants
.encodeASCII(b
.toString());
1217 checker
.checkTree(data
);
1218 fail("incorrectly accepted an invalid tree");
1219 } catch (CorruptObjectException e
) {
1220 assertEquals("truncated in object id", e
.getMessage());
1224 public void testInvalidTreeBadSorting1() {
1225 final StringBuilder b
= new StringBuilder();
1226 entry(b
, "100644 foobar");
1227 entry(b
, "100644 fooaaa");
1228 final byte[] data
= Constants
.encodeASCII(b
.toString());
1230 checker
.checkTree(data
);
1231 fail("incorrectly accepted an invalid tree");
1232 } catch (CorruptObjectException e
) {
1233 assertEquals("incorrectly sorted", e
.getMessage());
1237 public void testInvalidTreeBadSorting2() {
1238 final StringBuilder b
= new StringBuilder();
1239 entry(b
, "40000 a");
1240 entry(b
, "100644 a.c");
1241 final byte[] data
= Constants
.encodeASCII(b
.toString());
1243 checker
.checkTree(data
);
1244 fail("incorrectly accepted an invalid tree");
1245 } catch (CorruptObjectException e
) {
1246 assertEquals("incorrectly sorted", e
.getMessage());
1250 public void testInvalidTreeBadSorting3() {
1251 final StringBuilder b
= new StringBuilder();
1252 entry(b
, "100644 a0c");
1253 entry(b
, "40000 a");
1254 final byte[] data
= Constants
.encodeASCII(b
.toString());
1256 checker
.checkTree(data
);
1257 fail("incorrectly accepted an invalid tree");
1258 } catch (CorruptObjectException e
) {
1259 assertEquals("incorrectly sorted", e
.getMessage());
1263 public void testInvalidTreeDuplicateNames1() {
1264 final StringBuilder b
= new StringBuilder();
1265 entry(b
, "100644 a");
1266 entry(b
, "100644 a");
1267 final byte[] data
= Constants
.encodeASCII(b
.toString());
1269 checker
.checkTree(data
);
1270 fail("incorrectly accepted an invalid tree");
1271 } catch (CorruptObjectException e
) {
1272 assertEquals("duplicate entry names", e
.getMessage());
1276 public void testInvalidTreeDuplicateNames2() {
1277 final StringBuilder b
= new StringBuilder();
1278 entry(b
, "100644 a");
1279 entry(b
, "100755 a");
1280 final byte[] data
= Constants
.encodeASCII(b
.toString());
1282 checker
.checkTree(data
);
1283 fail("incorrectly accepted an invalid tree");
1284 } catch (CorruptObjectException e
) {
1285 assertEquals("duplicate entry names", e
.getMessage());
1289 public void testInvalidTreeDuplicateNames3() {
1290 final StringBuilder b
= new StringBuilder();
1291 entry(b
, "100644 a");
1292 entry(b
, "40000 a");
1293 final byte[] data
= Constants
.encodeASCII(b
.toString());
1295 checker
.checkTree(data
);
1296 fail("incorrectly accepted an invalid tree");
1297 } catch (CorruptObjectException e
) {
1298 assertEquals("duplicate entry names", e
.getMessage());
1302 public void testInvalidTreeDuplicateNames4() {
1303 final StringBuilder b
= new StringBuilder();
1304 entry(b
, "100644 a");
1305 entry(b
, "100644 a.c");
1306 entry(b
, "100644 a.d");
1307 entry(b
, "100644 a.e");
1308 entry(b
, "40000 a");
1309 entry(b
, "100644 zoo");
1310 final byte[] data
= Constants
.encodeASCII(b
.toString());
1312 checker
.checkTree(data
);
1313 fail("incorrectly accepted an invalid tree");
1314 } catch (CorruptObjectException e
) {
1315 assertEquals("duplicate entry names", e
.getMessage());
1319 private static void entry(final StringBuilder b
, final String modeName
) {
1322 for (int i
= 0; i
< Constants
.OBJECT_ID_LENGTH
; i
++)