X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=test%2Fchannels-udp.c;h=40d5605de17f1502f1caeb6b23639811ab6a74fb;hb=4b6c01b1d5383b1a7417244a31ad4652aab2d5db;hp=383c824edf064ce9fa7ec6ade2990fbe1554efd0;hpb=9e8e77dba3462c4a7f7e758ade4d16bc669fc4a7;p=meshlink diff --git a/test/channels-udp.c b/test/channels-udp.c index 383c824e..40d5605d 100644 --- a/test/channels-udp.c +++ b/test/channels-udp.c @@ -1,3 +1,7 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif + #include #include #include @@ -16,26 +20,9 @@ struct client { meshlink_handle_t *mesh; meshlink_channel_t *channel; size_t received; + bool got_large_packet; }; -static void log_cb(meshlink_handle_t *mesh, meshlink_log_level_t level, const char *text) { - static struct timeval tv0; - struct timeval tv; - - if(tv0.tv_sec == 0) { - gettimeofday(&tv0, NULL); - } - - gettimeofday(&tv, NULL); - fprintf(stderr, "%u.%.03u ", (unsigned int)(tv.tv_sec - tv0.tv_sec), (unsigned int)tv.tv_usec / 1000); - - if(mesh) { - fprintf(stderr, "(%s) ", mesh->name); - } - - fprintf(stderr, "[%d] %s\n", level, text); -} - static void server_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) { (void)data; @@ -48,8 +35,6 @@ static void server_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *chann for(int i = 0; i < 3; i++) { if(c[i] == channel) { c[i] = NULL; - fprintf(stderr, "server received channel %d closure from %s\n", i, channel->node->name); - meshlink_channel_close(mesh, channel); } @@ -68,19 +53,21 @@ static void client_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *chann (void)data; // We expect always the same amount of data from the server. - assert(len == 1000); assert(mesh->priv); struct client *client = mesh->priv; + assert(len == 512 || len == 65536); client->received += len; + + if(len == 65536) { + client->got_large_packet = true; + } } static void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) { assert(mesh->priv); struct client *client = mesh->priv; - assert(reachable); - - if(!strcmp(node->name, "server")) { + if(reachable && !strcmp(node->name, "server")) { assert(!client->channel); client->channel = meshlink_channel_open_ex(mesh, node, 1, client_receive_cb, NULL, 0, MESHLINK_CHANNEL_UDP); assert(client->channel); @@ -100,7 +87,6 @@ static bool accept_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint for(int i = 0; i < 3; i++) { if(c[i] == NULL) { - fprintf(stderr, "server accepted channel %d from %s\n", i, channel->node->name); c[i] = channel; if(i == 2) { @@ -114,16 +100,20 @@ static bool accept_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint return false; } -int main() { - //meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb); +int main(void) { + init_sync_flag(&accept_flag); + init_sync_flag(&close_flag); + + meshlink_set_log_cb(NULL, MESHLINK_WARNING, log_cb); - // Open two new meshlink instance. + // Open four new meshlink instance, the server and three peers. const char *names[3] = {"foo", "bar", "baz"}; struct client clients[3]; meshlink_channel_t *channels[3] = {NULL, NULL, NULL}; memset(clients, 0, sizeof(clients)); + assert(meshlink_destroy("channels_udp_conf.0")); meshlink_handle_t *server = meshlink_open("channels_udp_conf.0", "server", "channels-udp", DEV_CLASS_BACKBONE); assert(server); meshlink_enable_discovery(server, false); @@ -134,6 +124,7 @@ int main() { for(int i = 0; i < 3; i++) { char dir[100]; snprintf(dir, sizeof(dir), "channels_udp_conf.%d", i + 1); + assert(meshlink_destroy(dir)); clients[i].mesh = meshlink_open(dir, names[i], "channels-udp", DEV_CLASS_STATIONARY); assert(clients[i].mesh); clients[i].mesh->priv = &clients[i]; @@ -152,9 +143,22 @@ int main() { assert(clients[i].channel); } + // Check that we can send up to 65535 bytes without errors + + char large_data[65536] = ""; + + for(int i = 0; i < 3; i++) { + assert(meshlink_channel_send(server, channels[i], large_data, sizeof(large_data) + 1) == -1); + assert(meshlink_channel_send(server, channels[i], large_data, sizeof(large_data)) == sizeof(large_data)); + } + + // Assert that packets larger than 64 kiB are not allowed + + assert(meshlink_channel_send(server, channels[0], large_data, 65537) == -1); + // Stream packets from server to clients for 5 seconds at 40 Mbps (1 kB * 500 Hz) - char data[1000]; + char data[512]; memset(data, 'U', sizeof(data)); for(int j = 0; j < 2500; j++) { @@ -163,7 +167,7 @@ int main() { } const struct timespec req = {0, 2000000}; - clock_nanosleep(CLOCK_MONOTONIC, 0, &req, NULL); + nanosleep(&req, NULL); } // Let the clients close the channels @@ -182,8 +186,9 @@ int main() { } for(int i = 0; i < 3; i++) { - assert(clients[i].received >= 2400000); - assert(clients[i].received <= 2500000); + assert(clients[i].received >= 1000000); + assert(clients[i].received <= 1345536); + assert(clients[i].got_large_packet); } // Clean up.