Home | History | Annotate | Download | only in test
      1 
      2 #include "cs_config.h"
      3 #include <unistd.h>
      4 #include <stdlib.h>
      5 #include <stdio.h>
      6 #include <string.h>
      7 #include <sys/wait.h>
      8 
      9 #include "util/neo_misc.h"
     10 #include "util/neo_err.h"
     11 #include "util/neo_net.h"
     12 #include "util/ulist.h"
     13 #include "util/neo_rand.h"
     14 
     15 #define TEST_PORT 46032
     16 #define COUNT 10000
     17 
     18 typedef struct _rand_thing {
     19   int is_num;
     20   int n;
     21   char *s;
     22 } RAND_THING;
     23 
     24 
     25 NEOERR *client_proc(int port, ULIST *stuff)
     26 {
     27   NEOERR *err;
     28   NSOCK *nsock;
     29   int x;
     30   RAND_THING *thing;
     31 
     32   sleep(1);
     33   ne_warn("[c] Connecting to port %d", port);
     34   err = ne_net_connect(&nsock, "localhost", port, 10, 10);
     35   if (err) return nerr_pass(err);
     36 
     37   ne_warn("[c] Connected.");
     38 
     39   do
     40   {
     41     err = ne_net_write_int(nsock, uListLength(stuff));
     42     if (err) break;
     43 
     44     for (x = 0; x < uListLength(stuff); x++)
     45     {
     46       err = uListGet(stuff, x, (void *)&thing);
     47       if (err) break;
     48       if (thing->is_num)
     49       {
     50 	err = ne_net_write_int(nsock, thing->n);
     51 	/* ne_warn("[c] Sending %d", thing->n); */
     52       }
     53       else
     54       {
     55 	err = ne_net_write_str(nsock, thing->s);
     56 	/* ne_warn("[c] Sending %s", thing->s); */
     57       }
     58       if (err) break;
     59     }
     60   } while (0);
     61 
     62   ne_net_close(&nsock);
     63   return nerr_pass(err);
     64 }
     65 
     66 NEOERR *server_proc(int port, ULIST *stuff)
     67 {
     68   NEOERR *err;
     69   int server;
     70   NSOCK *nsock;
     71   int x, i;
     72   RAND_THING *thing;
     73   char *s;
     74 
     75   ne_warn("[s] Listening on port %d", port);
     76   err = ne_net_listen(port, &server);
     77   if (err) return nerr_pass(err);
     78 
     79   err = ne_net_accept(&nsock, server, 10);
     80   if (err) return nerr_pass(err);
     81 
     82   ne_warn("[s] Connection.");
     83 
     84   do {
     85     err = ne_net_read_int(nsock, &x);
     86     if (err) break;
     87 
     88     if (x != uListLength(stuff))
     89     {
     90       err = nerr_raise(NERR_ASSERT, "Incoming length is not equal to expected length: %d != %d", x, uListLength(stuff));
     91       break;
     92     }
     93 
     94     for (x = 0; x < uListLength(stuff); x++)
     95     {
     96       err = uListGet(stuff, x, (void *)&thing);
     97       if (err) break;
     98       if (thing->is_num)
     99       {
    100 	err = ne_net_read_int(nsock, &i);
    101 	if (err) break;
    102 	/* ne_warn("[s] Received %d", i); */
    103 	if (thing->n != i)
    104 	{
    105 	  err = nerr_raise(NERR_ASSERT, "Incoming %d number is not equal to expected: %d != %d", x, i, thing->n);
    106 	  break;
    107 	}
    108       }
    109       else
    110       {
    111 	err = ne_net_read_str_alloc(nsock, &s, NULL);
    112 	if (err) break;
    113 	/* ne_warn("[s] Received %s", s); */
    114 	if (strcmp(s, thing->s))
    115 	{
    116 	  err = nerr_raise(NERR_ASSERT, "Incoming %d string is not equal to expected: '%s' != '%s'", x, s, thing->s);
    117 	  break;
    118 	}
    119 	free(s);
    120       }
    121       printf("\rs");
    122     }
    123   } while (0);
    124   ne_net_close(&nsock);
    125 
    126   return nerr_pass(err);
    127 }
    128 
    129 NEOERR *run_test(void)
    130 {
    131   NEOERR *err;
    132   ULIST *stuff;
    133   char word[64000];
    134   RAND_THING *thing;
    135   pid_t child;
    136   int x;
    137 
    138   ne_warn("starting net_test");
    139   ne_warn("generating random list");
    140 
    141   err = uListInit(&stuff, COUNT, 0);
    142   if (err) return nerr_pass(err);
    143   for (x = 0; x < COUNT; x++)
    144   {
    145     thing = (RAND_THING *) calloc(1, sizeof(RAND_THING));
    146     if (neo_rand(100) > 50)
    147     {
    148       thing->is_num = 1;
    149       thing->n = neo_rand(1000000);
    150     }
    151     else
    152     {
    153       neo_rand_word(word, sizeof(word));
    154       thing->s = strdup(word);
    155     }
    156     err = uListAppend(stuff, thing);
    157     if (err) return nerr_pass(err);
    158   }
    159 
    160   child = fork();
    161   if (!child)
    162   {
    163     /* child */
    164     return nerr_pass(client_proc(TEST_PORT, stuff));
    165   }
    166   /* parent */
    167   err = server_proc(TEST_PORT, stuff);
    168 
    169   if (!err) waitpid(child, NULL, 0);
    170   return nerr_pass(err);
    171 }
    172 
    173 int main(int argc, char **argv)
    174 {
    175   NEOERR *err;
    176 
    177   nerr_init();
    178   err = run_test();
    179   if (err)
    180   {
    181       nerr_log_error(err);
    182       return -1;
    183   }
    184   return 0;
    185 }
    186