#include "cs_config.h" #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/wait.h> #include "util/neo_misc.h" #include "util/neo_err.h" #include "util/neo_net.h" #include "util/ulist.h" #include "util/neo_rand.h" #define TEST_PORT 46032 #define COUNT 10000 typedef struct _rand_thing { int is_num; int n; char *s; } RAND_THING; NEOERR *client_proc(int port, ULIST *stuff) { NEOERR *err; NSOCK *nsock; int x; RAND_THING *thing; sleep(1); ne_warn("[c] Connecting to port %d", port); err = ne_net_connect(&nsock, "localhost", port, 10, 10); if (err) return nerr_pass(err); ne_warn("[c] Connected."); do { err = ne_net_write_int(nsock, uListLength(stuff)); if (err) break; for (x = 0; x < uListLength(stuff); x++) { err = uListGet(stuff, x, (void *)&thing); if (err) break; if (thing->is_num) { err = ne_net_write_int(nsock, thing->n); /* ne_warn("[c] Sending %d", thing->n); */ } else { err = ne_net_write_str(nsock, thing->s); /* ne_warn("[c] Sending %s", thing->s); */ } if (err) break; } } while (0); ne_net_close(&nsock); return nerr_pass(err); } NEOERR *server_proc(int port, ULIST *stuff) { NEOERR *err; int server; NSOCK *nsock; int x, i; RAND_THING *thing; char *s; ne_warn("[s] Listening on port %d", port); err = ne_net_listen(port, &server); if (err) return nerr_pass(err); err = ne_net_accept(&nsock, server, 10); if (err) return nerr_pass(err); ne_warn("[s] Connection."); do { err = ne_net_read_int(nsock, &x); if (err) break; if (x != uListLength(stuff)) { err = nerr_raise(NERR_ASSERT, "Incoming length is not equal to expected length: %d != %d", x, uListLength(stuff)); break; } for (x = 0; x < uListLength(stuff); x++) { err = uListGet(stuff, x, (void *)&thing); if (err) break; if (thing->is_num) { err = ne_net_read_int(nsock, &i); if (err) break; /* ne_warn("[s] Received %d", i); */ if (thing->n != i) { err = nerr_raise(NERR_ASSERT, "Incoming %d number is not equal to expected: %d != %d", x, i, thing->n); break; } } else { err = ne_net_read_str_alloc(nsock, &s, NULL); if (err) break; /* ne_warn("[s] Received %s", s); */ if (strcmp(s, thing->s)) { err = nerr_raise(NERR_ASSERT, "Incoming %d string is not equal to expected: '%s' != '%s'", x, s, thing->s); break; } free(s); } printf("\rs"); } } while (0); ne_net_close(&nsock); return nerr_pass(err); } NEOERR *run_test(void) { NEOERR *err; ULIST *stuff; char word[64000]; RAND_THING *thing; pid_t child; int x; ne_warn("starting net_test"); ne_warn("generating random list"); err = uListInit(&stuff, COUNT, 0); if (err) return nerr_pass(err); for (x = 0; x < COUNT; x++) { thing = (RAND_THING *) calloc(1, sizeof(RAND_THING)); if (neo_rand(100) > 50) { thing->is_num = 1; thing->n = neo_rand(1000000); } else { neo_rand_word(word, sizeof(word)); thing->s = strdup(word); } err = uListAppend(stuff, thing); if (err) return nerr_pass(err); } child = fork(); if (!child) { /* child */ return nerr_pass(client_proc(TEST_PORT, stuff)); } /* parent */ err = server_proc(TEST_PORT, stuff); if (!err) waitpid(child, NULL, 0); return nerr_pass(err); } int main(int argc, char **argv) { NEOERR *err; nerr_init(); err = run_test(); if (err) { nerr_log_error(err); return -1; } return 0; }