}
END_TEST
-START_TEST(test_collisions)
-{
- /*
- * Request
- *
- * 1. rsync://a.b.c/d/e/f/
- * 2. https://x.y.z/m/n/o.notification -> rsync://a.b.c/d/e/f/
- *
- * - None validates
- * - rsync validates
- * - https validates
- * - Both validate
- */
-
- struct sia_uris sias;
-
- ck_assert_int_eq(0, hash_setup());
- ck_assert_int_eq(0, relax_ng_init());
-
- setup_test();
-
- printf("==== 1 ====\n");
-
- /* Context: rsync */
- sias.caRepository = "rsync://a.b.c/mod/rpp1";
- sias.rpkiManifest = "rsync://a.b.c/mod/rpp1/m.mft";
- sias.rpkiNotify = NULL;
-
- rsync_counter = https_counter = 0;
- ck_assert_int_eq(0, cache_download_alt(&sias, okay, NULL));
- ck_assert_uint_eq(1, rsync_counter);
- ck_assert_uint_eq(0, https_counter);
-
- cache_print();
-
- /*
- * Context: notification "https://a.b.c/d/notification.xml".
- * Both point to the same caRepository (RPP).
- *
- * This is either two benign RPPs coexisting (likely because of key
- * rollover), or one malicious RPP is trying to overwrite the other.
- *
- * So they need to be cached separately. We cannot reuse the RPP simply
- * because the caRepositories are identical.
- */
- sias.rpkiNotify = "https://a.b.c/d/notification.xml";
-
- dls[0] = NHDR("12") NSS("https://a.b.c/d/snapshot.xml",
- "d880c0e3136695636f73f8fb6340245182f4b19bd4b092679b9002ad427dc380")
- NTAIL;
- dls[1] = SHDR("12") PBLSH("rsync://a.b.c/mod/rpp1/m.mft",
- "ZXhhbXBsZTE=") STAIL;
- dls[2] = NULL;
-
- rsync_counter = https_counter = 0;
- ck_assert_int_eq(0, cache_download_alt(&sias, okay, NULL));
- ck_assert_uint_eq(0, rsync_counter);
- ck_assert_uint_eq(2, https_counter);
-
- cache_print();
-
- // XXX
-}
-
-START_TEST(test_dots)
-{
- setup_test();
-
- run_dl_https("https://a.b.c/d", 0, 1);
- ck_cache_https(
- hnode(HE2UP,
- hnode(HO2UP("a.b.c"),
- hftnode(HO2UP("a.b.c/d"), HFULL, "tmp/tmp/0", NULL), NULL), NULL));
-
- run_dl_https("https://a.b.c/d/.", 0, 0);
- ck_cache_https(
- hnode(HE2UP,
- hnode(HO2UP("a.b.c"),
- hftnode(HO2UP("a.b.c/d"), HFULL, "tmp/tmp/0", NULL), NULL), NULL));
-
- run_dl_https("https://a.b.c/d/e/..", 0, 0);
- ck_cache_https(
- hnode(HE2UP,
- hnode(HO2UP("a.b.c"),
- hftnode(HO2UP("a.b.c/d"), HFULL, "tmp/tmp/0", NULL), NULL), NULL));
-
- run_dl_https("https://a.b.c/./d/../e", 0, 1);
- ck_cache_https(
- hnode(HE2UP,
- hnode(HO2UP("a.b.c"),
- hftnode(HO2UP("a.b.c/d"), HFULL, "tmp/tmp/0", NULL),
- hftnode(HO2UP("a.b.c/e"), HFULL, "tmp/tmp/1", NULL), NULL), NULL));
-
- cleanup_test();
-}
-END_TEST
-
-START_TEST(test_tal_json)
-{
- json_t *json;
- char *str;
-
- setup_test();
-
- ck_assert_int_eq(0, system("rm -rf tmp/"));
- ck_assert_int_eq(0, system("mkdir -p tmp"));
-
- add_node(cache, NODE("rsync://a.b.c/d", 0, 1, 0));
- add_node(cache, NODE("rsync://a.b.c/e", 1, 0, 0));
- add_node(cache, NODE("rsync://x.y.z/e", 0, 1, 0));
- add_node(cache, NODE("https://a/b", 1, 1, 0));
- add_node(cache, node("https://a/c", 0, 0, 1, 0, 1));
-
- json = build_tal_json(cache);
- ck_assert_int_eq(0, json_dump_file(json, "tmp/" TAL_METAFILE, JSON_COMPACT));
-
- str = json_dumps(json, /* JSON_INDENT(4) */ JSON_COMPACT);
- json_decref(json);
-
- ck_assert_str_eq(
- "[{\"type\":\"RPP\",\"url\":\"rsync://a.b.c/d\",\"attempt-timestamp\":\"1970-01-01T00:00:00Z\",\"attempt-result\":0,\"success-timestamp\":\"1970-01-01T00:00:00Z\"},"
- "{\"type\":\"RPP\",\"url\":\"rsync://a.b.c/e\",\"attempt-timestamp\":\"1970-01-01T00:00:00Z\",\"attempt-result\":1},"
- "{\"type\":\"RPP\",\"url\":\"rsync://x.y.z/e\",\"attempt-timestamp\":\"1970-01-01T00:00:00Z\",\"attempt-result\":0,\"success-timestamp\":\"1970-01-01T00:00:00Z\"},"
- "{\"type\":\"TA (HTTP)\",\"url\":\"https://a/b\",\"attempt-timestamp\":\"1970-01-01T00:00:00Z\",\"attempt-result\":1,\"success-timestamp\":\"1970-01-01T00:00:00Z\"},"
- "{\"type\":\"RRDP Notification\",\"url\":\"https://a/c\",\"attempt-timestamp\":\"1970-01-01T00:00:00Z\",\"attempt-result\":0,\"success-timestamp\":\"1970-01-01T00:00:00Z\"}]",
- str);
- free(str);
-
- cache_reset(cache);
-
- load_tal_json(cache);
- ck_assert_ptr_ne(NULL, cache->ht);
-
- ck_cache(
- NODE("rsync://a.b.c/d", 0, 1, 0),
- NODE("rsync://a.b.c/e", 1, 0, 0),
- NODE("rsync://x.y.z/e", 0, 1, 0),
- NODE("https://a/b", 1, 1, 0),
- NODE("https://a/c", 0, 1, 0),
- NULL);
-
- cleanup_test();
-}
-END_TEST
-
-static void
-prepare_map_list(struct map_list *maps, ...)
-{
- char const *str;
- enum map_type type;
- struct cache_mapping *map;
- va_list args;
-
- maps_init(maps);
-
- va_start(args, maps);
- while ((str = va_arg(args, char const *)) != NULL) {
- if (url_is_https(str))
- type = MAP_HTTP;
- else if (url_is_rsync(str))
- type = MAP_RSYNC;
- else
- ck_abort_msg("Bad protocol: %s", str);
- ck_assert_int_eq(0, map_create(&map, type, str));
- maps_add(maps, map);
- }
- va_end(args);
-}
-
-#define PREPARE_MAP_LIST(maps, ...) prepare_map_list(maps, ##__VA_ARGS__, NULL)
-
-START_TEST(test_recover)
-{
- struct map_list maps;
-
- setup_test();
-
- /* Query on empty database */
- PREPARE_MAP_LIST(&maps, "rsync://a.b.c/d", "https://a.b.c/d");
- ck_assert_ptr_eq(NULL, cache_recover(cache, &maps));
- maps_cleanup(&maps);
-
- /* Only first URI is cached */
- cache_reset(cache);
- run_cache_download("rsync://a/b/c", 0, 1, 0);
-
- PREPARE_MAP_LIST(&maps, "rsync://a/b/c", "https://d/e", "https://f");
- ck_assert_ptr_eq(maps.array[0], cache_recover(cache, &maps));
- maps_cleanup(&maps);
-
- /* Only second URI is cached */
- cache_reset(cache);
- run_cache_download("https://d/e", 0, 0, 1);
-
- PREPARE_MAP_LIST(&maps, "rsync://a/b/c", "https://d/e", "https://f");
- ck_assert_ptr_eq(maps.array[1], cache_recover(cache, &maps));
- maps_cleanup(&maps);
-
- /* Only third URI is cached */
- cache_reset(cache);
- run_cache_download("https://f", 0, 0, 1);
-
- PREPARE_MAP_LIST(&maps, "rsync://a/b/c", "https://d/e", "https://f");
- ck_assert_ptr_eq(maps.array[2], cache_recover(cache, &maps));
- maps_cleanup(&maps);
-
- /* None was cached */
- cache_reset(cache);
- run_cache_download("rsync://d/e", 0, 1, 0);
-
- PREPARE_MAP_LIST(&maps, "rsync://a/b/c", "https://d/e", "https://f");
- ck_assert_ptr_eq(NULL, cache_recover(cache, &maps));
- maps_cleanup(&maps);
-
- /*
- * At present, cache_recover() can only be called after all of a
- * download's URLs yielded failure.
- * However, node.error can still be zero. This happens when the download
- * was successful, but the RRDP code wasn't able to expand the snapshot
- * or deltas.
- */
- cache_reset(cache);
-
- add_node(cache, node("rsync/a/1", 100, 0, 1, 100, 0));
- add_node(cache, node("rsync/a/2", 100, 1, 1, 100, 0));
- add_node(cache, node("rsync/a/3", 200, 0, 1, 100, 0));
- add_node(cache, node("rsync/a/4", 200, 1, 1, 100, 0));
- add_node(cache, node("rsync/a/5", 100, 0, 1, 200, 0));
- add_node(cache, node("rsync/a/6", 100, 1, 1, 200, 0));
- add_node(cache, node("rsync/b/1", 100, 0, 0, 100, 0));
- add_node(cache, node("rsync/b/2", 100, 1, 0, 100, 0));
- add_node(cache, node("rsync/b/3", 200, 0, 0, 100, 0));
- add_node(cache, node("rsync/b/4", 200, 1, 0, 100, 0));
- add_node(cache, node("rsync/b/5", 100, 0, 0, 200, 0));
- add_node(cache, node("rsync/b/6", 100, 1, 0, 200, 0));
-
- /* Multiple successful caches: Prioritize the most recent one */
- PREPARE_MAP_LIST(&maps, "rsync://a/1", "rsync://a/3", "rsync://a/5");
- ck_assert_ptr_eq(maps.array[2], cache_recover(cache, &maps));
- maps_cleanup(&maps);
-
- PREPARE_MAP_LIST(&maps, "rsync://a/5", "rsync://a/1", "rsync://a/3");
- ck_assert_ptr_eq(maps.array[0], cache_recover(cache, &maps));
- maps_cleanup(&maps);
-
- /* No successful caches: No viable candidates */
- PREPARE_MAP_LIST(&maps, "rsync://b/2", "rsync://b/4", "rsync://b/6");
- ck_assert_ptr_eq(NULL, cache_recover(cache, &maps));
- maps_cleanup(&maps);
-
- /* Status: CNF_SUCCESS is better than 0. */
- PREPARE_MAP_LIST(&maps, "rsync://b/1", "rsync://a/1");
- ck_assert_ptr_eq(maps.array[1], cache_recover(cache, &maps));
- maps_cleanup(&maps);
-
- /*
- * If CNF_SUCCESS && error, Fort will probably run into a problem
- * reading the cached directory, because it's either outdated or
- * recently corrupted.
- * But it should still TRY to read it, as there's a chance the
- * outdatedness is not that severe.
- */
- PREPARE_MAP_LIST(&maps, "rsync://a/2", "rsync://b/2");
- ck_assert_ptr_eq(maps.array[0], cache_recover(cache, &maps));
- maps_cleanup(&maps);
-
- /* Parents of downloaded nodes */
- PREPARE_MAP_LIST(&maps, "rsync://a", "rsync://b");
- ck_assert_ptr_eq(NULL, cache_recover(cache, &maps));
- maps_cleanup(&maps);
-
- /* Try them all at the same time */
- PREPARE_MAP_LIST(&maps,
- "rsync://a", "rsync://a/1", "rsync://a/2", "rsync://a/3",
- "rsync://a/4", "rsync://a/5", "rsync://a/6",
- "rsync://b", "rsync://b/1", "rsync://b/2", "rsync://b/3",
- "rsync://b/4", "rsync://b/5", "rsync://b/6",
- "rsync://e/1");
- ck_assert_ptr_eq(maps.array[5], cache_recover(cache, &maps));
- maps_cleanup(&maps);
-
- cleanup_test();
-}
-END_TEST
-
/* Boilerplate */
-static Suite *thread_pool_suite(void)
+static Suite *cache_suite(void)
{
Suite *suite;
- TCase *rsync, *https, *rrdp, *mix, *dot, *meta, *recover;
+ TCase *rsync, *https, *rrdp;
rsync = tcase_create("rsync");
tcase_add_test(rsync, test_cache_download_rsync);
rrdp = tcase_create("rrdp");
tcase_add_test(rrdp, test_rrdp_commit);
- mix = tcase_create("mix");
- tcase_add_test(https, test_collisions);
-
- dot = tcase_create("dot");
- tcase_add_test(dot, test_dots);
-
- meta = tcase_create(TAL_METAFILE);
- tcase_add_test(meta, test_tal_json);
-
- recover = tcase_create("recover");
- tcase_add_test(recover, test_recover);
-
suite = suite_create("local-cache");
suite_add_tcase(suite, rsync);
suite_add_tcase(suite, https);
suite_add_tcase(suite, rrdp);
- suite_add_tcase(suite, mix);
- suite_add_tcase(suite, dot);
- suite_add_tcase(suite, meta);
- suite_add_tcase(suite, recover);
return suite;
}
SRunner *runner;
int tests_failed;
- suite = thread_pool_suite();
+ suite = cache_suite();
dls[0] = "Fort\n";
runner = srunner_create(suite);
+++ /dev/null
-#include <check.h>
-
-#include "alloc.c"
-#include "mock.c"
-#include "types/path.c"
-#include "types/url.c"
-
-static char deleted[16][6];
-static unsigned int dn;
-
-static void
-__delete_node_cb(struct cache_node const *node)
-{
- strcpy(deleted[dn++], node->name);
-}
-
-START_TEST(test_delete)
-{
- struct cache_node *root, *a, *b;
-
- a = rnode(RO2UP("a"), NULL);
- dn = 0;
- cachent_delete(a);
- ck_assert_uint_eq(1, dn);
- ck_assert_str_eq("a", deleted[0]);
-
- a = rnode(RO2UP("a"), NULL);
- root = rnode(RE2UP, a, NULL);
- dn = 0;
- cachent_delete(a);
- ck_assert_ptr_eq(NULL, root->children);
- ck_assert_uint_eq(1, dn);
- ck_assert_str_eq("a", deleted[0]);
-
- dn = 0;
- cachent_delete(root);
- ck_assert_uint_eq(1, dn);
- ck_assert_str_eq("rsync", deleted[0]);
-
- b = rnode(RO2UP("a/b"),
- rnode(RO2UP("a/b/c"), NULL),
- rnode(RO2UP("a/b/d"), NULL),
- rnode(RO2UP("a/b/e"), NULL),
- rnode(RO2UP("a/b/f"), NULL), NULL);
- a = rnode(RO2UP("a"),
- b,
- rnode(RO2UP("a/g"),
- rnode(RO2UP("a/g/h"),
- rnode(RO2UP("a/g/h/i"), NULL), NULL),
- rnode(RO2UP("a/g/j"),
- rnode(RO2UP("a/g/j/k"), NULL), NULL),
- rnode(RO2UP("a/g/l"),
- rnode(RO2UP("a/g/l/m"), NULL), NULL),
- rnode(RO2UP("a/g/n"),
- rnode(RO2UP("a/g/n/o"), NULL), NULL), NULL), NULL);
- root = rnode(RE2UP, a, NULL);
-
- dn = 0;
- cachent_delete(b);
- ck_assert_int_eq(1, HASH_COUNT(a->children));
- ck_assert_str_eq("c", deleted[0]);
- ck_assert_str_eq("d", deleted[1]);
- ck_assert_str_eq("e", deleted[2]);
- ck_assert_str_eq("f", deleted[3]);
- ck_assert_str_eq("b", deleted[4]);
-
- dn = 0;
- cachent_delete(a);
- ck_assert_int_eq(0, HASH_COUNT(root->children));
- ck_assert_str_eq("i", deleted[0]);
- ck_assert_str_eq("h", deleted[1]);
- ck_assert_str_eq("k", deleted[2]);
- ck_assert_str_eq("j", deleted[3]);
- ck_assert_str_eq("m", deleted[4]);
- ck_assert_str_eq("l", deleted[5]);
- ck_assert_str_eq("o", deleted[6]);
- ck_assert_str_eq("n", deleted[7]);
- ck_assert_str_eq("g", deleted[8]);
- ck_assert_str_eq("a", deleted[9]);
-
- dn = 0;
- cachent_delete(root);
- ck_assert_uint_eq(1, dn);
- ck_assert_str_eq("rsync", deleted[0]);
-}
-END_TEST
-
-static char const *expected[32];
-static unsigned int e;
-
-static bool
-ck_traverse_cb(struct cache_node *node)
-{
- ck_assert_str_eq(expected[e++], node->path);
- return true;
-}
-
-static void
-ck_traverse(struct cache_node *root, ...)
-{
- char const *path;
- unsigned int p = 0;
- va_list args;
-
- va_start(args, root);
- while ((path = va_arg(args, char const *)) != NULL)
- expected[p++] = path;
- va_end(args);
- expected[p] = NULL;
-
- e = 0;
- cachent_traverse(root, ck_traverse_cb);
- ck_assert_uint_eq(p, e);
-
- cachent_delete(root);
-}
-
-START_TEST(test_traverse)
-{
- struct cache_node *root;
-
- root = NULL;
- ck_traverse(root, NULL);
-
- root = rnode(RO2UP("a"), NULL);
- ck_traverse(root, "tmp/rsync/a", NULL);
-
- root = rnode(RO2UP("a"),
- rnode(RO2UP("a/b"), NULL), NULL);
- ck_traverse(root, "tmp/rsync/a", "tmp/rsync/a/b", NULL);
-
- root = rnode(RO2UP("a"),
- rnode(RO2UP("a/b"),
- rnode(RO2UP("a/b/c"), NULL), NULL), NULL);
- ck_traverse(root,
- "tmp/rsync/a",
- "tmp/rsync/a/b",
- "tmp/rsync/a/b/c", NULL);
-
- root = rnode(RO2UP("a"),
- rnode(RO2UP("a/b"),
- rnode(RO2UP("a/b/c"), NULL),
- rnode(RO2UP("a/b/d"), NULL), NULL), NULL);
- ck_traverse(root,
- "tmp/rsync/a",
- "tmp/rsync/a/b",
- "tmp/rsync/a/b/c",
- "tmp/rsync/a/b/d", NULL);
-
- root = rnode(RO2UP("a"),
- rnode(RO2UP("a/b"),
- rnode(RO2UP("a/b/c"), NULL),
- rnode(RO2UP("a/b/d"), NULL), NULL),
- rnode(RO2UP("a/e"), NULL), NULL);
- ck_traverse(root,
- "tmp/rsync/a",
- "tmp/rsync/a/b",
- "tmp/rsync/a/b/c",
- "tmp/rsync/a/b/d",
- "tmp/rsync/a/e", NULL);
-
- root = rnode(RO2UP("a"),
- rnode(RO2UP("a/b"), NULL),
- rnode(RO2UP("a/c"),
- rnode(RO2UP("a/c/d"), NULL),
- rnode(RO2UP("a/c/e"), NULL), NULL), NULL);
- ck_traverse(root,
- "tmp/rsync/a",
- "tmp/rsync/a/b",
- "tmp/rsync/a/c",
- "tmp/rsync/a/c/d",
- "tmp/rsync/a/c/e", NULL);
-
- root = rnode(RO2UP("a"),
- rnode(RO2UP("a/b"),
- rnode(RO2UP("a/b/c"), NULL),
- rnode(RO2UP("a/b/d"), NULL), NULL),
- rnode(RO2UP("a/e"),
- rnode(RO2UP("a/e/f"), NULL),
- rnode(RO2UP("a/e/g"), NULL), NULL), NULL);
- ck_traverse(root,
- "tmp/rsync/a",
- "tmp/rsync/a/b",
- "tmp/rsync/a/b/c",
- "tmp/rsync/a/b/d",
- "tmp/rsync/a/e",
- "tmp/rsync/a/e/f",
- "tmp/rsync/a/e/g", NULL);
-
- root = rnode(RO2UP("a"),
- rnode(RO2UP("a/b"),
- rnode(RO2UP("a/b/c"), NULL),
- rnode(RO2UP("a/b/d"), NULL),
- rnode(RO2UP("a/b/e"), NULL),
- rnode(RO2UP("a/b/f"), NULL), NULL),
- rnode(RO2UP("a/g"),
- rnode(RO2UP("a/g/h"),
- rnode(RO2UP("a/g/h/i"), NULL), NULL),
- rnode(RO2UP("a/g/j"),
- rnode(RO2UP("a/g/j/k"), NULL), NULL),
- rnode(RO2UP("a/g/l"),
- rnode(RO2UP("a/g/l/m"), NULL), NULL),
- rnode(RO2UP("a/g/n"),
- rnode(RO2UP("a/g/n/o"), NULL), NULL), NULL), NULL);
- ck_traverse(root,
- "tmp/rsync/a",
- "tmp/rsync/a/b",
- "tmp/rsync/a/b/c",
- "tmp/rsync/a/b/d",
- "tmp/rsync/a/b/e",
- "tmp/rsync/a/b/f",
- "tmp/rsync/a/g",
- "tmp/rsync/a/g/h",
- "tmp/rsync/a/g/h/i",
- "tmp/rsync/a/g/j",
- "tmp/rsync/a/g/j/k",
- "tmp/rsync/a/g/l",
- "tmp/rsync/a/g/l/m",
- "tmp/rsync/a/g/n",
- "tmp/rsync/a/g/n/o", NULL);
-}
-END_TEST
-
-START_TEST(test_provide)
-{
- struct cache_node *rsync, *abc, *d, *e, *f, *g, *h, *ee;
-
- rsync = cachent_root_rsync();
- ck_assert_ptr_ne(NULL, rsync);
- ck_assert_ptr_eq(NULL, rsync->parent);
- ck_assert_str_eq("rsync://", rsync->url);
- ck_assert_str_eq("tmp/rsync", rsync->path);
- ck_assert_str_eq("rsync", rsync->name);
-
- /* Create branch chain from root */
- e = cachent_provide(rsync, "rsync://a.b.c/d/e");
- ck_assert_ptr_ne(NULL, e);
- ck_assert_str_eq("rsync://a.b.c/d/e", e->url);
- ck_assert_str_eq("tmp/rsync/a.b.c/d/e", e->path);
- ck_assert_str_eq("e", e->name);
-
- d = e->parent;
- ck_assert_ptr_ne(NULL, d);
- ck_assert_str_eq("rsync://a.b.c/d", d->url);
- ck_assert_str_eq("tmp/rsync/a.b.c/d", d->path);
- ck_assert_str_eq("d", d->name);
-
- abc = d->parent;
- ck_assert_ptr_ne(NULL, abc);
- ck_assert_str_eq("rsync://a.b.c", abc->url);
- ck_assert_str_eq("tmp/rsync/a.b.c", abc->path);
- ck_assert_str_eq("a.b.c", abc->name);
-
- ck_assert_ptr_eq(rsync, abc->parent);
-
- /* Find leaf from root */
- ck_assert_ptr_eq(e, cachent_provide(rsync, "rsync://a.b.c/d/e"));
- /* Find branch from root */
- ck_assert_ptr_eq(d, cachent_provide(rsync, "rsync://a.b.c/d"));
- /* Find leaf from non-root ancestor */
- ck_assert_ptr_eq(e, cachent_provide(abc, "rsync://a.b.c/d/e"));
- /* Find branch from non-root ancestor */
- ck_assert_ptr_eq(d, cachent_provide(abc, "rsync://a.b.c/d"));
- /* Find selves */
- ck_assert_ptr_eq(NULL, cachent_provide(rsync, "rsync://")); /* Illegal */
- ck_assert_ptr_eq(abc, cachent_provide(abc, "rsync://a.b.c"));
- ck_assert_ptr_eq(e, cachent_provide(e, "rsync://a.b.c/d/e"));
-
- /* Some not normalized noise */
- ck_assert_ptr_eq(e, cachent_provide(e, "rsync://a.b.c/d/e////"));
- ck_assert_ptr_eq(e, cachent_provide(e, "rsync://a.b.c///d/./e//"));
- ck_assert_ptr_eq(e, cachent_provide(e, "rsync://a.b.c/d/f/../e/"));
-
- /* Create sibling from root */
- f = cachent_provide(rsync, "rsync://a.b.c/f");
- ck_assert_ptr_ne(NULL, f);
- ck_assert_ptr_eq(abc, f->parent);
- ck_assert_str_eq("rsync://a.b.c/f", f->url);
- ck_assert_str_eq("tmp/rsync/a.b.c/f", f->path);
- ck_assert_str_eq("f", f->name);
-
- /* Create more than one descendant from root */
- h = cachent_provide(rsync, "rsync://a.b.c/f/g/h");
- ck_assert_ptr_ne(NULL, h);
- ck_assert_str_eq("rsync://a.b.c/f/g/h", h->url);
- ck_assert_str_eq("tmp/rsync/a.b.c/f/g/h", h->path);
- ck_assert_str_eq("h", h->name);
-
- g = h->parent;
- ck_assert_ptr_ne(NULL, g);
- ck_assert_ptr_eq(f, g->parent);
- ck_assert_str_eq("rsync://a.b.c/f/g", g->url);
- ck_assert_str_eq("tmp/rsync/a.b.c/f/g", g->path);
- ck_assert_str_eq("g", g->name);
-
- /* Try to create a conflict by prefix */
- ee = cachent_provide(rsync, "rsync://a.b.c/d/ee");
- ck_assert_ptr_ne(e, ee);
- ck_assert_ptr_eq(d, ee->parent);
- ck_assert_str_eq("rsync://a.b.c/d/ee", ee->url);
- ck_assert_str_eq("tmp/rsync/a.b.c/d/ee", ee->path);
- ck_assert_str_eq("ee", ee->name);
- ck_assert_ptr_eq(e, cachent_provide(abc, "rsync://a.b.c/d/e"));
- ck_assert_ptr_eq(ee, cachent_provide(abc, "rsync://a.b.c/d/ee"));
-
- /* Prefixes don't match */
- ck_assert_ptr_eq(NULL, cachent_provide(d, "rsync://a.b.c/dd"));
- ck_assert_ptr_eq(NULL, cachent_provide(d, "rsync://a.b.c/f"));
- ck_assert_ptr_eq(NULL, cachent_provide(d, "rsync://a.b.c/d/../f"));
-
- cachent_delete(rsync);
-}
-END_TEST
-
-static Suite *thread_pool_suite(void)
-{
- Suite *suite;
- TCase *traverses, *provide;
-
- traverses = tcase_create("traverses");
- tcase_add_test(traverses, test_delete);
- tcase_add_test(traverses, test_traverse);
-
- provide = tcase_create("provide");
- tcase_add_test(provide, test_provide);
-
- suite = suite_create("cachent");
- suite_add_tcase(suite, traverses);
- suite_add_tcase(suite, provide);
-
- return suite;
-}
-
-int main(void)
-{
- Suite *suite;
- SRunner *runner;
- int tests_failed;
-
- suite = thread_pool_suite();
-
- runner = srunner_create(suite);
- srunner_run_all(runner, CK_NORMAL);
- tests_failed = srunner_ntests_failed(runner);
- srunner_free(runner);
-
- return (tests_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}