X-Git-Url: http://git.meshlink.io/?p=meshlink;a=blobdiff_plain;f=test%2Fimport-export.c;h=5d37146fd09502d8711f70a592033124462c8879;hp=17beaaf0ea8e6a665088cb4de36baf8956d22ecd;hb=3febbb4453f5c6b0286e7e3c68a5dbcec975b6fd;hpb=9f9925cb0726874c5d1f4fc266df54c0437a4660 diff --git a/test/import-export.c b/test/import-export.c index 17beaaf0..5d37146f 100644 --- a/test/import-export.c +++ b/test/import-export.c @@ -1,97 +1,121 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif + #include #include #include #include +#include +#include #include "meshlink.h" +#include "utils.h" -volatile bool bar_reachable = false; +struct sync_flag bar_reachable; void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) { - if(!strcmp(node->name, "bar")) - bar_reachable = reachable; + (void)mesh; + + if(reachable && !strcmp(node->name, "bar")) { + set_sync_flag(&bar_reachable, true); + } } -int main(int argc, char *argv[]) { +int main() { + meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb); + // Open two new meshlink instance. - meshlink_handle_t *mesh1 = meshlink_open("import_export_conf.1", "foo"); - if(!mesh1) { - fprintf(stderr, "Could not initialize configuration for foo\n"); - return 1; - } + assert(meshlink_destroy("import_export_conf.1")); + assert(meshlink_destroy("import_export_conf.2")); - meshlink_handle_t *mesh2 = meshlink_open("import_export_conf.2", "bar"); - if(!mesh2) { - fprintf(stderr, "Could not initialize configuration for bar\n"); - return 1; - } + meshlink_handle_t *mesh1 = meshlink_open("import_export_conf.1", "foo", "import-export", DEV_CLASS_BACKBONE); + assert(mesh1); + + meshlink_handle_t *mesh2 = meshlink_open("import_export_conf.2", "bar", "import-export", DEV_CLASS_BACKBONE); + assert(mesh2); + + // Disable local discovery + + meshlink_enable_discovery(mesh1, false); + meshlink_enable_discovery(mesh2, false); // Import and export both side's data - meshlink_add_address(mesh1, "localhost"); - meshlink_add_address(mesh2, "localhost"); + assert(meshlink_set_canonical_address(mesh1, meshlink_get_self(mesh1), "localhost", NULL)); + assert(meshlink_set_canonical_address(mesh2, meshlink_get_self(mesh2), "localhost", NULL)); char *data = meshlink_export(mesh1); - if(!data) { - fprintf(stderr, "Foo could not export its configuration\n"); - return 1; - } - - if(!meshlink_import(mesh2, data)) { - fprintf(stderr, "Bar could not import foo's configuration\n"); - return 1; - } + assert(data); + assert(meshlink_import(mesh2, data)); free(data); data = meshlink_export(mesh2); - if(!data) { - fprintf(stderr, "Bar could not export its configuration\n"); - return 1; - } + assert(data); + assert(meshlink_import(mesh1, data)); - if(!meshlink_import(mesh1, data)) { - fprintf(stderr, "Foo could not import bar's configuration\n"); - return 1; - } - + // Check that importing twice is fine + assert(meshlink_import(mesh1, data)); free(data); + // Check that importing garbage is not fine + assert(!meshlink_import(mesh1, "Garbage\n")); + + // Check that foo knows bar, but that it is not reachable. + + time_t last_reachable; + time_t last_unreachable; + meshlink_node_t *bar = meshlink_get_node(mesh1, "bar"); + assert(bar); + assert(!meshlink_get_node_reachability(mesh1, bar, &last_reachable, &last_unreachable)); + assert(!last_reachable); + assert(!last_unreachable); + // Start both instances meshlink_set_node_status_cb(mesh1, status_cb); - - if(!meshlink_start(mesh1)) { - fprintf(stderr, "Foo could not start\n"); - return 1; - } - if(!meshlink_start(mesh2)) { - fprintf(stderr, "Bar could not start\n"); - return 1; - } + assert(meshlink_start(mesh1)); + assert(meshlink_start(mesh2)); // Wait for the two to connect. - for(int i = 0; i < 20; i++) { + assert(wait_sync_flag(&bar_reachable, 20)); + + // Wait for UDP communication to become possible. + + int pmtu = meshlink_get_pmtu(mesh2, meshlink_get_node(mesh2, "bar")); + + for(int i = 0; i < 10 && !pmtu; i++) { sleep(1); - if(bar_reachable) - break; + pmtu = meshlink_get_pmtu(mesh2, meshlink_get_node(mesh2, "bar")); } - if(!bar_reachable) { - fprintf(stderr, "Bar not reachable for foo after 20 seconds\n"); - return 1; - } + assert(pmtu); - // Clean up. + // Check that we now have reachability information + + assert(meshlink_get_node_reachability(mesh1, bar, &last_reachable, &last_unreachable)); + assert(last_reachable); + assert(!last_unreachable); + + // Stop the meshes. - meshlink_stop(mesh2); meshlink_stop(mesh1); + meshlink_stop(mesh2); + + // Check that bar is no longer reachable + + assert(!meshlink_get_node_reachability(mesh1, bar, &last_reachable, &last_unreachable)); + assert(last_reachable); + assert(last_unreachable); + assert(last_reachable <= last_unreachable); + + // Clean up. + meshlink_close(mesh2); meshlink_close(mesh1); - - return 0; }