| 47 struct tree_node2 *children; |
47 struct tree_node2 *children; |
| 48 struct tree_node2 *last_child; |
48 struct tree_node2 *last_child; |
| 49 int data; |
49 int data; |
| 50 } tree_node2; |
50 } tree_node2; |
| 51 |
51 |
| |
52 typedef struct tree_node_file { |
| |
53 struct tree_node_file *parent; |
| |
54 struct tree_node_file *next; |
| |
55 struct tree_node_file *prev; |
| |
56 struct tree_node_file *children; |
| |
57 struct tree_node_file *last_child; |
| |
58 char const *path; |
| |
59 } tree_node_file; |
| |
60 |
| |
61 static void *create_tree_node_file( |
| |
62 void const *dptr, |
| |
63 void *allocator) { |
| |
64 if (allocator == NULL) allocator = cxDefaultAllocator; |
| |
65 |
| |
66 tree_node_file *node = cxMalloc(allocator, sizeof(tree_node_file)); |
| |
67 node->path = dptr; |
| |
68 |
| |
69 // intentionally write garbage into the pointers, it's part of the test |
| |
70 node->parent = (void *) 0xf00ba1; |
| |
71 node->next = (void *) 0xf00ba2; |
| |
72 node->prev = (void *) 0xf00ba3; |
| |
73 node->children = (void *) 0xf00ba4; |
| |
74 node->last_child = (void *) 0xf00ba5; |
| |
75 |
| |
76 return node; |
| |
77 } |
| |
78 |
| |
79 static int tree_node_file_search(void const *l, void const *r) { |
| |
80 tree_node_file const *left = l; |
| |
81 tree_node_file const *right = r; |
| |
82 size_t len1 = strlen(left->path); |
| |
83 size_t len2 = strlen(right->path); |
| |
84 if (len1 <= len2) { |
| |
85 if (memcmp(left->path, right->path, len1) == 0) { |
| |
86 return (int) (len2 - len1); |
| |
87 } else { |
| |
88 return -1; |
| |
89 } |
| |
90 } else { |
| |
91 return -1; |
| |
92 } |
| |
93 } |
| |
94 |
| 52 #define tree_node_layout \ |
95 #define tree_node_layout \ |
| 53 offsetof(tree_node, parent), offsetof(tree_node, children), -1, \ |
96 offsetof(tree_node, parent), offsetof(tree_node, children), -1, \ |
| 54 offsetof(tree_node, prev), offsetof(tree_node, next) |
97 offsetof(tree_node, prev), offsetof(tree_node, next) |
| 55 #define tree_node2_layout \ |
98 #define tree_node_full_layout(structname) \ |
| 56 offsetof(tree_node2, parent), offsetof(tree_node2, children),\ |
99 offsetof(structname, parent), offsetof(structname, children),\ |
| 57 offsetof(tree_node2, last_child), \ |
100 offsetof(structname, last_child), \ |
| 58 offsetof(tree_node2, prev), offsetof(tree_node2, next) |
101 offsetof(structname, prev), offsetof(structname, next) |
| |
102 #define tree_node2_layout tree_node_full_layout(tree_node2) |
| |
103 #define tree_node_file_layout tree_node_full_layout(tree_node_file) |
| 59 |
104 |
| 60 #define tree_children(type) offsetof(type, children), offsetof(type, next) |
105 #define tree_children(type) offsetof(type, children), offsetof(type, next) |
| 61 |
106 |
| 62 CX_TEST(test_tree_link_new_child) { |
107 CX_TEST(test_tree_link_new_child) { |
| 63 tree_node parent = {0}; |
108 tree_node parent = {0}; |
| 374 int r; |
419 int r; |
| 375 tree_node *n; |
420 tree_node *n; |
| 376 CX_TEST_DO { |
421 CX_TEST_DO { |
| 377 for (unsigned i = 0 ; i <= 10 ; i++) { |
422 for (unsigned i = 0 ; i <= 10 ; i++) { |
| 378 s = testdata[i]; |
423 s = testdata[i]; |
| 379 r = cx_tree_search(&root, &s, test_tree_search_function, |
424 r = cx_tree_search_data(&root, &s, test_tree_search_function, |
| 380 (void **) &n, tree_children(tree_node)); |
425 (void **) &n, tree_children(tree_node)); |
| 381 CX_TEST_ASSERT(r == 0); |
426 CX_TEST_ASSERT(r == 0); |
| 382 CX_TEST_ASSERT(n == testnodes[i]); |
427 CX_TEST_ASSERT(n == testnodes[i]); |
| 383 } |
428 } |
| 384 |
429 |
| 385 s = -5; |
430 s = -5; |
| 386 r = cx_tree_search(&root, &s, test_tree_search_function, |
431 r = cx_tree_search_data(&root, &s, test_tree_search_function, |
| 387 (void **) &n, tree_children(tree_node)); |
432 (void **) &n, tree_children(tree_node)); |
| 388 CX_TEST_ASSERT(r < 0); |
433 CX_TEST_ASSERT(r < 0); |
| 389 CX_TEST_ASSERT(n == NULL); |
434 CX_TEST_ASSERT(n == NULL); |
| 390 |
435 |
| 391 s = 26; |
436 s = 26; |
| 392 r = cx_tree_search(&root, &s, test_tree_search_function, |
437 r = cx_tree_search_data(&root, &s, test_tree_search_function, |
| 393 (void **) &n, tree_children(tree_node)); |
438 (void **) &n, tree_children(tree_node)); |
| 394 CX_TEST_ASSERT(r > 0); |
439 CX_TEST_ASSERT(r > 0); |
| 395 CX_TEST_ASSERT(n == &ba); |
440 CX_TEST_ASSERT(n == &ba); |
| 396 |
441 |
| 397 s = 35; |
442 s = 35; |
| 398 r = cx_tree_search(&root, &s, test_tree_search_function, |
443 r = cx_tree_search_data(&root, &s, test_tree_search_function, |
| 399 (void **) &n, tree_children(tree_node)); |
444 (void **) &n, tree_children(tree_node)); |
| 400 CX_TEST_ASSERT(r > 0); |
445 CX_TEST_ASSERT(r > 0); |
| 401 CX_TEST_ASSERT(n == &cb); |
446 CX_TEST_ASSERT(n == &cb); |
| 402 |
447 |
| 403 s = 38; |
448 s = 38; |
| 404 r = cx_tree_search(&root, &s, test_tree_search_function, |
449 r = cx_tree_search_data(&root, &s, test_tree_search_function, |
| 405 (void **) &n, tree_children(tree_node)); |
450 (void **) &n, tree_children(tree_node)); |
| 406 CX_TEST_ASSERT(r > 0); |
451 CX_TEST_ASSERT(r > 0); |
| 407 CX_TEST_ASSERT(n == &cba); |
452 CX_TEST_ASSERT(n == &cba); |
| 408 |
453 |
| 409 s = 42; |
454 s = 42; |
| 410 r = cx_tree_search(&root, &s, test_tree_search_function, |
455 r = cx_tree_search_data(&root, &s, test_tree_search_function, |
| 411 (void **) &n, tree_children(tree_node)); |
456 (void **) &n, tree_children(tree_node)); |
| 412 CX_TEST_ASSERT(r > 0); |
457 CX_TEST_ASSERT(r > 0); |
| 413 CX_TEST_ASSERT(n == &cc); |
458 CX_TEST_ASSERT(n == &cc); |
| 414 } |
459 } |
| 415 } |
460 } |
| 990 CX_TEST_ASSERT(cb.data == 0); |
1035 CX_TEST_ASSERT(cb.data == 0); |
| 991 CX_TEST_ASSERT(cc.data == 0); |
1036 CX_TEST_ASSERT(cc.data == 0); |
| 992 CX_TEST_ASSERT(cba.data == 0); |
1037 CX_TEST_ASSERT(cba.data == 0); |
| 993 } |
1038 } |
| 994 } |
1039 } |
| |
1040 |
| |
1041 CX_TEST(test_tree_add_one) { |
| |
1042 CxTestingAllocator talloc; |
| |
1043 cx_testing_allocator_init(&talloc); |
| |
1044 CxAllocator *alloc = &talloc.base; |
| |
1045 |
| |
1046 tree_node_file root = {0}; |
| |
1047 root.path = "/"; |
| |
1048 tree_node_file usr = {0}; |
| |
1049 usr.path = "/usr/"; |
| |
1050 cx_tree_link(&root, &usr, tree_node_file_layout); |
| |
1051 tree_node_file home = {0}; |
| |
1052 home.path = "/home/"; |
| |
1053 cx_tree_link(&root, &home, tree_node_file_layout); |
| |
1054 tree_node_file lib = {0}; |
| |
1055 lib.path = "/usr/lib/"; |
| |
1056 cx_tree_link(&usr, &lib, tree_node_file_layout); |
| |
1057 |
| |
1058 CX_TEST_DO { |
| |
1059 tree_node_file *foo; |
| |
1060 int result; |
| |
1061 result = cx_tree_add( |
| |
1062 "/home/foo/", |
| |
1063 tree_node_file_search, |
| |
1064 create_tree_node_file, alloc, |
| |
1065 (void **) &foo, &root, |
| |
1066 tree_node_file_layout |
| |
1067 ); |
| |
1068 CX_TEST_ASSERT(result == 0); |
| |
1069 CX_TEST_ASSERT(foo != NULL); |
| |
1070 char const *bar_path = "/home/foo/bar/"; |
| |
1071 void *failed; |
| |
1072 size_t added = cx_tree_add_array( |
| |
1073 bar_path, 1, sizeof(char const *), |
| |
1074 tree_node_file_search, |
| |
1075 create_tree_node_file, alloc, |
| |
1076 &failed, &root, |
| |
1077 tree_node_file_layout |
| |
1078 ); |
| |
1079 CX_TEST_ASSERT(added == 1); |
| |
1080 CX_TEST_ASSERT(failed == NULL); |
| |
1081 tree_node_file *bar = foo->children; |
| |
1082 CX_TEST_ASSERT(bar != NULL); |
| |
1083 CX_TEST_ASSERT(bar->parent == foo); |
| |
1084 CX_TEST_ASSERT(bar->path == bar_path); |
| |
1085 CX_TEST_ASSERT(foo->parent == &home); |
| |
1086 |
| |
1087 tree_node_file *new_node; |
| |
1088 result = cx_tree_add( |
| |
1089 "newroot", |
| |
1090 tree_node_file_search, |
| |
1091 create_tree_node_file, alloc, |
| |
1092 (void **) &new_node, &root, |
| |
1093 tree_node_file_layout |
| |
1094 ); |
| |
1095 CX_TEST_ASSERT(0 != result); |
| |
1096 CX_TEST_ASSERT(NULL != new_node); |
| |
1097 CX_TEST_ASSERT(new_node->children == NULL); |
| |
1098 CX_TEST_ASSERT(new_node->parent == NULL); |
| |
1099 |
| |
1100 CX_TEST_ASSERT(talloc.alloc_total == 3); |
| |
1101 |
| |
1102 cxFree(alloc, foo); |
| |
1103 cxFree(alloc, bar); |
| |
1104 cxFree(alloc, new_node); |
| |
1105 |
| |
1106 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
| |
1107 } |
| |
1108 cx_testing_allocator_destroy(&talloc); |
| |
1109 } |
| |
1110 |
| |
1111 CX_TEST(test_tree_add_one_existing) { |
| |
1112 CxTestingAllocator talloc; |
| |
1113 cx_testing_allocator_init(&talloc); |
| |
1114 CxAllocator *alloc = &talloc.base; |
| |
1115 |
| |
1116 tree_node_file root = {0}; |
| |
1117 root.path = "/"; |
| |
1118 tree_node_file usr = {0}; |
| |
1119 usr.path = "/usr/"; |
| |
1120 cx_tree_link(&root, &usr, tree_node_file_layout); |
| |
1121 tree_node_file home = {0}; |
| |
1122 home.path = "/home/"; |
| |
1123 cx_tree_link(&root, &home, tree_node_file_layout); |
| |
1124 tree_node_file lib = {0}; |
| |
1125 lib.path = "/usr/lib/"; |
| |
1126 cx_tree_link(&usr, &lib, tree_node_file_layout); |
| |
1127 |
| |
1128 CX_TEST_DO { |
| |
1129 tree_node_file *node; |
| |
1130 int result = cx_tree_add( |
| |
1131 "/usr/lib/", |
| |
1132 tree_node_file_search, |
| |
1133 create_tree_node_file, alloc, |
| |
1134 (void **) &node, &root, |
| |
1135 tree_node_file_layout |
| |
1136 ); |
| |
1137 CX_TEST_ASSERT(result == 0); |
| |
1138 CX_TEST_ASSERT(node != &lib); |
| |
1139 CX_TEST_ASSERT(node->prev == &lib); |
| |
1140 CX_TEST_ASSERT(lib.next == node); |
| |
1141 CX_TEST_ASSERT(node->parent == &usr); |
| |
1142 CX_TEST_ASSERT(talloc.alloc_total == 1); |
| |
1143 cxFree(alloc, node); |
| |
1144 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
| |
1145 } |
| |
1146 cx_testing_allocator_destroy(&talloc); |
| |
1147 } |
| |
1148 |
| |
1149 CX_TEST(test_tree_add_one_no_match) { |
| |
1150 tree_node_file root = {0}; |
| |
1151 root.path = "/mnt/"; |
| |
1152 |
| |
1153 CX_TEST_DO { |
| |
1154 tree_node_file *node = NULL; |
| |
1155 int result = cx_tree_add( |
| |
1156 "/usr/lib/", |
| |
1157 tree_node_file_search, |
| |
1158 create_tree_node_file, NULL, |
| |
1159 (void **) &node, &root, |
| |
1160 tree_node_file_layout |
| |
1161 ); |
| |
1162 CX_TEST_ASSERT(result != 0); |
| |
1163 CX_TEST_ASSERT(node != NULL); |
| |
1164 CX_TEST_ASSERT(node->parent == NULL); |
| |
1165 CX_TEST_ASSERT(node->children == NULL); |
| |
1166 free(node); |
| |
1167 node = NULL; |
| |
1168 size_t added = cx_tree_add_array( |
| |
1169 "/", 1, sizeof(char const *), |
| |
1170 tree_node_file_search, |
| |
1171 create_tree_node_file, NULL, |
| |
1172 (void **) &node, &root, |
| |
1173 tree_node_file_layout |
| |
1174 ); |
| |
1175 CX_TEST_ASSERT(added == 0); |
| |
1176 CX_TEST_ASSERT(node != NULL); |
| |
1177 CX_TEST_ASSERT(node->parent == NULL); |
| |
1178 CX_TEST_ASSERT(node->children == NULL); |
| |
1179 free(node); |
| |
1180 } |
| |
1181 } |
| |
1182 |
| |
1183 CX_TEST(test_tree_add_duplicate_root) { |
| |
1184 tree_node_file root = {0}; |
| |
1185 root.path = "/"; |
| |
1186 CX_TEST_DO { |
| |
1187 tree_node_file *node; |
| |
1188 int result = cx_tree_add( |
| |
1189 "/", |
| |
1190 tree_node_file_search, |
| |
1191 create_tree_node_file, NULL, |
| |
1192 (void **) &node, &root, |
| |
1193 tree_node_file_layout |
| |
1194 ); |
| |
1195 CX_TEST_ASSERT(result == 0); |
| |
1196 CX_TEST_ASSERT(root.children == node); |
| |
1197 CX_TEST_ASSERT(node->parent == &root); |
| |
1198 } |
| |
1199 } |
| |
1200 |
| |
1201 CX_TEST(test_tree_add_zero) { |
| |
1202 CxTestingAllocator talloc; |
| |
1203 cx_testing_allocator_init(&talloc); |
| |
1204 CxAllocator *alloc = &talloc.base; |
| |
1205 |
| |
1206 tree_node_file root = {0}; |
| |
1207 root.path = "/"; |
| |
1208 CX_TEST_DO { |
| |
1209 void *failed; |
| |
1210 |
| |
1211 size_t processed = cx_tree_add_array( |
| |
1212 (void *) 0xc0ffee, 0, sizeof(void *), |
| |
1213 tree_node_file_search, |
| |
1214 create_tree_node_file, alloc, |
| |
1215 &failed, &root, tree_node_file_layout |
| |
1216 ); |
| |
1217 CX_TEST_ASSERT(failed == NULL); |
| |
1218 CX_TEST_ASSERT(processed == 0); |
| |
1219 CX_TEST_ASSERT(talloc.alloc_total == 0); |
| |
1220 |
| |
1221 CxIterator iter = cxIterator(NULL, sizeof(void *), 0); |
| |
1222 processed = cx_tree_add_iter( |
| |
1223 cxIteratorRef(iter), |
| |
1224 tree_node_file_search, |
| |
1225 create_tree_node_file, alloc, |
| |
1226 &failed, &root, tree_node_file_layout |
| |
1227 ); |
| |
1228 CX_TEST_ASSERT(processed == 0); |
| |
1229 CX_TEST_ASSERT(failed == NULL); |
| |
1230 CX_TEST_ASSERT(talloc.alloc_total == 0); |
| |
1231 |
| |
1232 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
| |
1233 } |
| |
1234 cx_testing_allocator_destroy(&talloc); |
| |
1235 } |
| |
1236 |
| |
1237 CX_TEST(test_tree_add_many) { |
| |
1238 // adds many elements to an existing tree |
| |
1239 |
| |
1240 CxTestingAllocator talloc; |
| |
1241 cx_testing_allocator_init(&talloc); |
| |
1242 CxAllocator *alloc = &talloc.base; |
| |
1243 |
| |
1244 tree_node_file root = {0}; |
| |
1245 root.path = "/"; |
| |
1246 tree_node_file usr = {0}; |
| |
1247 usr.path = "/usr/"; |
| |
1248 cx_tree_link(&root, &usr, tree_node_file_layout); |
| |
1249 tree_node_file home = {0}; |
| |
1250 home.path = "/home/"; |
| |
1251 cx_tree_link(&root, &home, tree_node_file_layout); |
| |
1252 tree_node_file lib = {0}; |
| |
1253 lib.path = "/usr/lib/"; |
| |
1254 cx_tree_link(&usr, &lib, tree_node_file_layout); |
| |
1255 |
| |
1256 CX_TEST_DO { |
| |
1257 void *failed; |
| |
1258 |
| |
1259 char const *paths[] = { |
| |
1260 "/home/foo/", |
| |
1261 "/home/foo/bar", |
| |
1262 "/usr/lib64/", |
| |
1263 "/usr/lib/foo.so" |
| |
1264 }; |
| |
1265 |
| |
1266 size_t processed = cx_tree_add_array( |
| |
1267 paths, 4, sizeof(char const *), |
| |
1268 tree_node_file_search, |
| |
1269 create_tree_node_file, alloc, |
| |
1270 &failed, &root, tree_node_file_layout |
| |
1271 ); |
| |
1272 |
| |
1273 CX_TEST_ASSERT(failed == NULL); |
| |
1274 CX_TEST_ASSERT(processed == 4); |
| |
1275 CX_TEST_ASSERT(talloc.alloc_total == 4); |
| |
1276 |
| |
1277 CX_TEST_ASSERT(home.children == home.last_child); |
| |
1278 tree_node_file *foo = home.children; |
| |
1279 CX_TEST_ASSERT(foo != NULL && foo->path == paths[0]); |
| |
1280 CX_TEST_ASSERT(foo->children == foo->last_child); |
| |
1281 tree_node_file *bar = foo->children; |
| |
1282 CX_TEST_ASSERT(bar != NULL && bar->path == paths[1]); |
| |
1283 CX_TEST_ASSERT(usr.children != usr.last_child); |
| |
1284 tree_node_file *lib64 = usr.last_child; |
| |
1285 CX_TEST_ASSERT(lib64 != NULL); |
| |
1286 CX_TEST_ASSERT(lib64->path == paths[2]); |
| |
1287 CX_TEST_ASSERT(lib64->prev == &lib); |
| |
1288 CX_TEST_ASSERT(lib64->parent == &usr); |
| |
1289 CX_TEST_ASSERT(lib.children != NULL); |
| |
1290 tree_node_file *libfoo = lib.children; |
| |
1291 CX_TEST_ASSERT(libfoo != NULL && libfoo->path == paths[3]); |
| |
1292 |
| |
1293 cxFree(alloc, foo); |
| |
1294 cxFree(alloc, bar); |
| |
1295 cxFree(alloc, lib64); |
| |
1296 cxFree(alloc, libfoo); |
| |
1297 |
| |
1298 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
| |
1299 } |
| |
1300 cx_testing_allocator_destroy(&talloc); |
| |
1301 } |
| |
1302 |
| |
1303 CX_TEST(test_tree_add_many_with_dupl_and_no_match) { |
| |
1304 CxTestingAllocator talloc; |
| |
1305 cx_testing_allocator_init(&talloc); |
| |
1306 CxAllocator *alloc = &talloc.base; |
| |
1307 |
| |
1308 tree_node_file root = {0}; |
| |
1309 root.path = "/mnt/"; |
| |
1310 |
| |
1311 CX_TEST_DO { |
| |
1312 tree_node_file *failed; |
| |
1313 |
| |
1314 char const *paths[] = { |
| |
1315 "/mnt/sdcard/", |
| |
1316 "/mnt/foo/", |
| |
1317 "/mnt/sdcard/", |
| |
1318 "/home/", |
| |
1319 "/usr/" |
| |
1320 }; |
| |
1321 |
| |
1322 size_t processed = cx_tree_add_array( |
| |
1323 paths, 5, sizeof(char const *), |
| |
1324 tree_node_file_search, |
| |
1325 create_tree_node_file, alloc, |
| |
1326 (void **) &failed, &root, tree_node_file_layout |
| |
1327 ); |
| |
1328 |
| |
1329 CX_TEST_ASSERT(processed == 3); |
| |
1330 CX_TEST_ASSERT(failed != NULL); |
| |
1331 CX_TEST_ASSERT(failed->parent == NULL); |
| |
1332 CX_TEST_ASSERT(failed->children == NULL); |
| |
1333 CX_TEST_ASSERT(strcmp(failed->path, "/home/") == 0); |
| |
1334 cxFree(alloc, failed); |
| |
1335 |
| |
1336 CX_TEST_ASSERT(root.children != root.last_child); |
| |
1337 CX_TEST_ASSERT(strcmp(root.children->path, "/mnt/sdcard/") == 0); |
| |
1338 CX_TEST_ASSERT(strcmp(root.last_child->path, "/mnt/sdcard/") == 0); |
| |
1339 CX_TEST_ASSERT(strcmp(root.children->next->path, "/mnt/foo/") == 0); |
| |
1340 CX_TEST_ASSERT(strcmp(root.last_child->prev->path, "/mnt/foo/") == 0); |
| |
1341 |
| |
1342 CxTreeIterator iter = cx_tree_iterator( |
| |
1343 &root, true, |
| |
1344 offsetof(tree_node_file, children), |
| |
1345 offsetof(tree_node_file, next) |
| |
1346 ); |
| |
1347 cx_foreach(tree_node_file *, node, iter) { |
| |
1348 if (iter.exiting) { |
| |
1349 if (node != &root) { |
| |
1350 cxFree(alloc, node); |
| |
1351 } |
| |
1352 } |
| |
1353 } |
| |
1354 |
| |
1355 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
| |
1356 } |
| |
1357 cx_testing_allocator_destroy(&talloc); |
| |
1358 } |
| |
1359 |
| |
1360 static CX_TEST_SUBROUTINE(test_tree_add_create_from_array_impl, |
| |
1361 CxAllocator *alloc, char const **paths) { |
| |
1362 tree_node_file root = {0}; |
| |
1363 root.path = "/"; |
| |
1364 |
| |
1365 void *failed; |
| |
1366 size_t processed = cx_tree_add_array( |
| |
1367 paths, 10, sizeof(char const *), |
| |
1368 tree_node_file_search, |
| |
1369 create_tree_node_file, alloc, |
| |
1370 &failed, &root, tree_node_file_layout |
| |
1371 ); |
| |
1372 |
| |
1373 CX_TEST_ASSERT(failed == NULL); |
| |
1374 CX_TEST_ASSERT(processed == 10); |
| |
1375 |
| |
1376 char const *exp_order[] = { |
| |
1377 "/", |
| |
1378 "/usr/", |
| |
1379 "/usr/lib/", |
| |
1380 "/usr/lib/libbumm.so", |
| |
1381 "/home/", |
| |
1382 "/home/foo/", |
| |
1383 "/var/", |
| |
1384 "/var/www/", |
| |
1385 "/var/www/vhosts/", |
| |
1386 "/var/www/vhosts/live/", |
| |
1387 "/var/www/vhosts/live/htdocs/" |
| |
1388 }; |
| |
1389 unsigned exp_depth[] = { |
| |
1390 1, |
| |
1391 2, |
| |
1392 3, |
| |
1393 4, |
| |
1394 2, |
| |
1395 3, |
| |
1396 2, |
| |
1397 3, |
| |
1398 4, |
| |
1399 5, |
| |
1400 6 |
| |
1401 }; |
| |
1402 |
| |
1403 CxTreeIterator iter = cx_tree_iterator( |
| |
1404 &root, true, |
| |
1405 offsetof(tree_node_file, children), |
| |
1406 offsetof(tree_node_file, next) |
| |
1407 ); |
| |
1408 cx_foreach(tree_node_file *, node, iter) { |
| |
1409 if (iter.exiting) { |
| |
1410 if (node != &root) { |
| |
1411 cxFree(alloc, node); |
| |
1412 } |
| |
1413 } else { |
| |
1414 CX_TEST_ASSERT(iter.counter <= 11); |
| |
1415 CX_TEST_ASSERT(iter.depth == exp_depth[iter.counter - 1]); |
| |
1416 CX_TEST_ASSERT(strcmp(node->path, exp_order[iter.counter - 1]) == 0); |
| |
1417 } |
| |
1418 } |
| |
1419 } |
| |
1420 |
| |
1421 CX_TEST(test_tree_add_create_from_array) { |
| |
1422 // creates an entirely new tree from an array |
| |
1423 |
| |
1424 CxTestingAllocator talloc; |
| |
1425 cx_testing_allocator_init(&talloc); |
| |
1426 CxAllocator *alloc = &talloc.base; |
| |
1427 |
| |
1428 CX_TEST_DO { |
| |
1429 char const *paths[] = { |
| |
1430 "/usr/", |
| |
1431 "/home/", |
| |
1432 "/usr/lib/", |
| |
1433 "/usr/lib/libbumm.so", |
| |
1434 "/var/", |
| |
1435 "/var/www/", |
| |
1436 "/var/www/vhosts/", |
| |
1437 "/var/www/vhosts/live/", |
| |
1438 "/var/www/vhosts/live/htdocs/", |
| |
1439 "/home/foo/" |
| |
1440 }; |
| |
1441 |
| |
1442 char const *scrambled_paths[] = { |
| |
1443 "/usr/", |
| |
1444 "/home/", |
| |
1445 "/var/www/vhosts/live/", |
| |
1446 "/usr/lib/", |
| |
1447 "/var/", |
| |
1448 "/var/www/", |
| |
1449 "/usr/lib/libbumm.so", |
| |
1450 "/var/www/vhosts/", |
| |
1451 "/var/www/vhosts/live/htdocs/", |
| |
1452 "/home/foo/" |
| |
1453 }; |
| |
1454 |
| |
1455 // no matter how the original array is sorted, |
| |
1456 // the resulting tree should be the same |
| |
1457 CX_TEST_CALL_SUBROUTINE(test_tree_add_create_from_array_impl, alloc, |
| |
1458 paths); |
| |
1459 CX_TEST_CALL_SUBROUTINE(test_tree_add_create_from_array_impl, alloc, |
| |
1460 scrambled_paths); |
| |
1461 |
| |
1462 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
| |
1463 } |
| |
1464 cx_testing_allocator_destroy(&talloc); |
| |
1465 } |
| |
1466 |
| 995 |
1467 |
| 996 CxTestSuite *cx_test_suite_tree_low_level(void) { |
1468 CxTestSuite *cx_test_suite_tree_low_level(void) { |
| 997 CxTestSuite *suite = cx_test_suite_new("tree (low level)"); |
1469 CxTestSuite *suite = cx_test_suite_new("tree (low level)"); |
| 998 |
1470 |
| 999 cx_test_register(suite, test_tree_link_new_child); |
1471 cx_test_register(suite, test_tree_link_new_child); |