]>
git.proxmox.com Git - libgit2.git/blob - tests/object/tree/parse.c
9d76a74f0c25539c5a404debf78ff46376d89fa8
1 #include "clar_libgit2.h"
6 "\xae\x90\xf1\x2e\xea\x69\x97\x29\xed\x24" \
7 "\x55\x5e\x40\xb9\xfd\x66\x9d\xa1\x2a\x12"
8 #define OID1_STR "ae90f12eea699729ed24555e40b9fd669da12a12"
11 "\xe8\xbf\xe5\xaf\x39\x57\x9a\x7e\x48\x98" \
12 "\xbb\x23\xf3\xa7\x6a\x72\xc3\x68\xce\xe6"
13 #define OID2_STR "e8bfe5af39579a7e4898bb23f3a76a72c368cee6"
21 static void assert_tree_parses(const char *data
, size_t datalen
,
22 expected_entry
*expected_entries
, size_t expected_nentries
)
28 datalen
= strlen(data
);
29 cl_git_pass(git_object__from_raw((git_object
**) &tree
, data
, datalen
, GIT_OBJECT_TREE
));
31 cl_assert_equal_i(git_tree_entrycount(tree
), expected_nentries
);
33 for (n
= 0; n
< expected_nentries
; n
++) {
34 expected_entry
*expected
= expected_entries
+ n
;
35 const git_tree_entry
*entry
;
38 cl_git_pass(git_oid_fromstr(&oid
, expected
->oid
));
40 cl_assert(entry
= git_tree_entry_byname(tree
, expected
->filename
));
41 cl_assert_equal_s(expected
->filename
, entry
->filename
);
42 cl_assert_equal_i(expected
->attr
, entry
->attr
);
43 cl_assert_equal_oid(&oid
, entry
->oid
);
46 git_object_free(&tree
->object
);
49 static void assert_tree_fails(const char *data
, size_t datalen
)
53 datalen
= strlen(data
);
54 cl_git_fail(git_object__from_raw(&object
, data
, datalen
, GIT_OBJECT_TREE
));
57 void test_object_tree_parse__single_blob_parses(void)
59 expected_entry entries
[] = {
60 { "foo", 0100644, OID1_STR
},
62 const char data
[] = "100644 foo\x00" OID1_HEX
;
64 assert_tree_parses(data
, ARRAY_SIZE(data
) - 1, entries
, ARRAY_SIZE(entries
));
67 void test_object_tree_parse__single_tree_parses(void)
69 expected_entry entries
[] = {
70 { "foo", 040000, OID1_STR
},
72 const char data
[] = "040000 foo\x00" OID1_HEX
;
74 assert_tree_parses(data
, ARRAY_SIZE(data
) - 1, entries
, ARRAY_SIZE(entries
));
77 void test_object_tree_parse__leading_filename_spaces_parse(void)
79 expected_entry entries
[] = {
80 { " bar", 0100644, OID1_STR
},
82 const char data
[] = "100644 bar\x00" OID1_HEX
;
84 assert_tree_parses(data
, ARRAY_SIZE(data
) - 1, entries
, ARRAY_SIZE(entries
));
87 void test_object_tree_parse__multiple_entries_parse(void)
89 expected_entry entries
[] = {
90 { "bar", 0100644, OID1_STR
},
91 { "foo", 040000, OID2_STR
},
94 "100644 bar\x00" OID1_HEX
95 "040000 foo\x00" OID2_HEX
;
97 assert_tree_parses(data
, ARRAY_SIZE(data
) - 1, entries
, ARRAY_SIZE(entries
));
100 void test_object_tree_parse__invalid_mode_fails(void)
102 const char data
[] = "10x644 bar\x00" OID1_HEX
;
103 assert_tree_fails(data
, ARRAY_SIZE(data
) - 1);
106 void test_object_tree_parse__missing_mode_fails(void)
108 const char data
[] = " bar\x00" OID1_HEX
;
109 assert_tree_fails(data
, ARRAY_SIZE(data
) - 1);
112 void test_object_tree_parse__mode_doesnt_cause_oob_read(void)
114 const char data
[] = "100644 bar\x00" OID1_HEX
;
115 assert_tree_fails(data
, 2);
117 * An oob-read would correctly parse the filename and
118 * later fail to parse the OID with a different error
121 cl_assert_equal_s(git_error_last()->message
, "failed to parse tree: missing space after filemode");
124 void test_object_tree_parse__unreasonably_large_mode_fails(void)
126 const char data
[] = "10000000000000000000000000 bar\x00" OID1_HEX
;
127 assert_tree_fails(data
, ARRAY_SIZE(data
) - 1);
130 void test_object_tree_parse__missing_filename_separator_fails(void)
132 const char data
[] = "100644bar\x00" OID1_HEX
;
133 assert_tree_fails(data
, ARRAY_SIZE(data
) - 1);
136 void test_object_tree_parse__missing_filename_terminator_fails(void)
138 const char data
[] = "100644 bar" OID1_HEX
;
139 assert_tree_fails(data
, ARRAY_SIZE(data
) - 1);
142 void test_object_tree_parse__empty_filename_fails(void)
144 const char data
[] = "100644 \x00" OID1_HEX
;
145 assert_tree_fails(data
, ARRAY_SIZE(data
) - 1);
148 void test_object_tree_parse__trailing_garbage_fails(void)
150 const char data
[] = "100644 bar\x00" OID1_HEX
"x";
151 assert_tree_fails(data
, ARRAY_SIZE(data
) - 1);
154 void test_object_tree_parse__leading_space_fails(void)
156 const char data
[] = " 100644 bar\x00" OID1_HEX
;
157 assert_tree_fails(data
, ARRAY_SIZE(data
) - 1);
160 void test_object_tree_parse__truncated_oid_fails(void)
162 const char data
[] = " 100644 bar\x00" OID1_HEX
;
163 assert_tree_fails(data
, ARRAY_SIZE(data
) - 2);