/* ** Authors: ** Rama Alebouyeh ( rama[at]cs.ucsb.edu ) ** Matthew Allen ( msa[at]cs.ucsb.edu ) */ #include #include #include "chimera.h" #include "cashmere.h" #define USAGE "newtest [ -j bootstrap:port ] port key msgtype" #define OPTSTR "j:" extern char *optarg; extern int optind; int msgtype = 0; ChimeraState *state; #define TEST_CHAT 15 void test_fwd (Key ** kp, Message ** mp, ChimeraHost ** hp) { Key *k = *kp; Message *m = *mp; ChimeraHost *h = *hp; fprintf (stderr, "Routing %s (%s) to %s via %s:%d\n", (m->type == TEST_CHAT) ? ("CHAT") : ("JOIN"), m->payload, k->keystr, h->name, h->port); } void test_del (Key * k, Message * msg) { if (msg->type == CASHMERE_MESSAGE) { log_message (state->log, LOG_CASHMERE, "calling process_cashmere_message in test file\n"); process_cashmere_message (state, msg, msg->type); } else if (msg->type == CASHMERE_GROUP_BROADCAST_MESSAGE || msg->type == CASHMERE_REPLY_GROUP_BROADCAST_MESSAGE) { log_message (state->log, LOG_CASHMERE, "calling group_broadcast in test file\n"); process_group_broadcast_message (state, msg, msg->type); } } void test_update (Key * k, ChimeraHost * h, int joined) { if (joined) { fprintf (stderr, "Node %s:%s:%d joined neighbor set\n", k->keystr, h->name, h->port); } else { fprintf (stderr, "Node %s:%s:%d leaving neighbor set\n", k->keystr, h->name, h->port); } } int main (int argc, char **argv) { int opt; char *hn = NULL; int port, joinport; ChimeraHost *host = NULL; char tmp[256]; Key key, keyinput; int i, j; while ((opt = getopt (argc, argv, OPTSTR)) != EOF) { switch ((char) opt) { case 'j': for (i = 0; optarg[i] != ':' && i < strlen (optarg); i++); optarg[i] = 0; hn = optarg; sscanf (optarg + (i + 1), "%d", &joinport); break; default: fprintf (stderr, "invalid option %c\n", (char) opt); fprintf (stderr, "usage: %s\n", USAGE); exit (1); } } if ((argc - optind) != 3) { fprintf (stderr, "usage: %s\n", USAGE); exit (1); } port = atoi (argv[optind]); str_to_key (argv[optind + 1], &keyinput); msgtype = atoi (argv[optind + 2]); state = chimera_init (port); if (state == NULL) { fprintf (stderr, "unable to initialize chimera \n"); exit (1); } if (hn != NULL) { host = host_get (state, hn, joinport); } chimera_setkey (state, keyinput); chimera_register (state, CASHMERE_MESSAGE, 1); chimera_register (state, CASHMERE_GROUP_BROADCAST_MESSAGE, 1); chimera_register (state, CASHMERE_REPLY_GROUP_BROADCAST_MESSAGE, 1); char networkdebug[256], routingdebug[256]; // sprintf(networkdebug, "LOG_NETWORKDEBUG_%s", keyinput.keystr); sprintf (routingdebug, "LOG_ROUTING_%s", keyinput.keystr); // FILE *networklogfp= fopen(networkdebug, "w"); FILE *routingfp = fopen (routingdebug, "w"); log_direct (state->log, LOG_ROUTING, routingfp); // log_direct(state->log, LOG_NETWORKDEBUG, networklogfp); char cashmeredebug[256]; sprintf (cashmeredebug, "LOG_CASHMERE%s", keyinput.keystr); FILE *cashmerefp = fopen (cashmeredebug, "w"); log_direct (state->log, LOG_CASHMERE, cashmerefp); cashmere_init (state); chimera_deliver (state, test_del); /*char networkdebug[256], routingdebug[256]; sprintf(networkdebug, "LOG_NETWORKDEBUG_%s", keyinput.keystr); sprintf(routingdebug, "LOG_ROUTING_%s", keyinput.keystr); FILE *networklogfp= fopen(networkdebug, "w"); FILE *routingfp= fopen(routingdebug, "w"); log_direct(state->log, LOG_ROUTING, routingfp); log_direct(state->log, LOG_NETWORKDEBUG, networklogfp); */ log_direct (state->log, LOG_WARN, stderr); //log_direct(state->log, LOG_ROUTING, stderr); chimera_join (state, host); if (msgtype == 1) { fprintf (stderr, "** send messages to key with command **\n"); while (fgets (tmp, 256, stdin) != NULL) { if (strlen (tmp) > 2) { for (i = 0; tmp[i] != '\n'; i++); tmp[i] = 0; for (i = 0; tmp[i] != ' ' && i < strlen (tmp); i++); tmp[i] = 0; i++; fprintf (stderr, "the key is %s and the string is %s \n", tmp, tmp + i); str_to_key (tmp, &key); fprintf (stderr, "sending key:%s data:%s len:%d\n", key.keystr, tmp + i, strlen (tmp + i)); cashmere_send (state, key, strlen (tmp + i) + 1, tmp + i); } } } else { while (1) { sleep (100); } } }