static void event1 (struct lwes_emitter *emitter)
{
  struct lwes_event *event;
  int ret = 0;

  LWES_SHORT_STRING eventname = (LWES_SHORT_STRING)"TypeChecker";
  LWES_SHORT_STRING key01     = (LWES_SHORT_STRING)"aString";
  LWES_LONG_STRING  value01   = (LWES_LONG_STRING)"http://www.test.com";
  LWES_SHORT_STRING key02     = (LWES_SHORT_STRING)"aBoolean";
  LWES_BOOLEAN      value02   = (LWES_BOOLEAN)1;
  LWES_SHORT_STRING key03     = (LWES_SHORT_STRING)"anIPAddress";
  LWES_IP_ADDR      value03;
  LWES_SHORT_STRING key04     = (LWES_SHORT_STRING)"aUInt16";
  LWES_U_INT_16     value04   = (LWES_U_INT_16)65535;
  LWES_SHORT_STRING key05     = (LWES_SHORT_STRING)"anInt16";
  LWES_INT_16       value05   = (LWES_INT_16)-1;
  LWES_SHORT_STRING key06     = (LWES_SHORT_STRING)"aUInt32";
  LWES_U_INT_32     value06   = (LWES_U_INT_32)0xffffffffL;
  LWES_SHORT_STRING key07     = (LWES_SHORT_STRING)"anInt32";
  LWES_INT_32       value07   = (LWES_INT_32)-1;
  LWES_SHORT_STRING key08     = (LWES_SHORT_STRING)"aUInt64";
  LWES_U_INT_64     value08   = (LWES_U_INT_64)0xffffffffffffffffULL;
  LWES_SHORT_STRING key09     = (LWES_SHORT_STRING)"anInt64";
  LWES_INT_64       value09   = (LWES_INT_64)-1;

  /* set this one here since we need to call a function */
  value03.s_addr = inet_addr("224.0.0.100");
  /* create event */
  event  = lwes_event_create (NULL, eventname);
  MY_ASSERT (event != NULL);

  /* fill out event */
  ret = lwes_event_set_STRING   (event, key01, value01);
  MY_ASSERT ( ret == 1);
  ret = lwes_event_set_BOOLEAN  (event, key02, value02);
  MY_ASSERT ( ret == 2 );
  ret = lwes_event_set_IP_ADDR  (event, key03, value03);
  MY_ASSERT ( ret == 3 );
  ret = lwes_event_set_U_INT_16 (event, key04, value04);
  MY_ASSERT ( ret == 4 );
  ret = lwes_event_set_INT_16   (event, key05, value05);
  MY_ASSERT ( ret == 5 );
  ret = lwes_event_set_U_INT_32 (event, key06, value06);
  MY_ASSERT ( ret == 6 );
  ret = lwes_event_set_INT_32   (event, key07, value07);
  MY_ASSERT ( ret == 7 );
  ret = lwes_event_set_U_INT_64 (event, key08, value08);
  MY_ASSERT ( ret == 8 );
  ret = lwes_event_set_INT_64   (event, key09, value09);
  MY_ASSERT ( ret == 9 );

  /* now emit event */
  ret = lwes_emitter_emit (emitter, event);
  MY_ASSERT (ret == 0);

  /* now clean up */
  lwes_event_destroy (event);
}
static char *
test_event1 (void)
{
  struct lwes_event *event1;
  struct lwes_event_type_db *db = NULL;
  LWES_BYTE bytes[MAX_MSG_SIZE];
  int size1;
  LWES_LONG_STRING string1;
  LWES_LONG_STRING string2;
  LWES_IP_ADDR      ip_addr;
  char bigbuf[200];
  char *retbuf;
  char bigdirbuf[4048];
  char file[4100];

  assert (getcwd (bigdirbuf, 4048) != NULL);
  snprintf (file, 4100, "%s/test1.esf", bigdirbuf);

  ip_addr.s_addr = inet_addr ("127.0.0.1");

  db = lwes_event_type_db_create (file);
  assert (db != NULL);

  event1 = lwes_event_create_with_encoding (db, "Event1", encoding);
  assert ( event1 != NULL );

  /* use the max string size */
  string1 = random_ascii (10);
  string2 = random_ascii (50);
  assert (lwes_event_set_STRING   (event1, "st",       string1) == 2);
  assert (lwes_event_set_BOOLEAN  (event1, "t_bool",   1)       == 3);
  assert (lwes_event_set_INT_16   (event1, "t_int16",  1)       == 4);
  assert (lwes_event_set_U_INT_16 (event1, "t_uint16", 1)       == 5);
  assert (lwes_event_set_INT_32   (event1, "t_int32",  1)       == 6);
  assert (lwes_event_set_U_INT_32 (event1, "t_uint32", 1)       == 7);
  assert (lwes_event_set_INT_64   (event1, "t_int64",  1)       == 8);
  assert (lwes_event_set_U_INT_64 (event1, "t_uint64", 1)       == 9);
  assert (lwes_event_set_IP_ADDR  (event1, "t_ip_addr",ip_addr) == 10);
  assert (lwes_event_set_STRING   (event1, "t_string", string2) == 11);

  size1 = lwes_event_to_bytes (event1, bytes, MAX_MSG_SIZE, 0);

  sprintf (bigbuf, "Event1\t%d\n",size1);

  lwes_event_destroy (event1);
  lwes_event_type_db_destroy (db);
  free (string1);
  free (string2);

  retbuf = (char *) malloc (sizeof (char) * strlen (bigbuf) + 1);
  strcpy (retbuf, bigbuf);

  return retbuf;
}
static void emitter    (const char *ip, const int port, const char *iface)
{
  struct lwes_emitter *emitter;
  struct lwes_event *event;
  struct lwes_event_type_db *db = NULL;

/*  db = lwes_event_type_db_create ( (char*)esffile );
 * assert ( db != NULL );
 */

  /* test null safety */
  assert ( lwes_emitter_emit(NULL, NULL) == -1 );

  /* emit without heartbeat */
  emitter = lwes_emitter_create (ip, iface, port, 0, 60);
  assert ( emitter != NULL );
  assert (lwes_net_get_ttl (&(emitter->connection)) == 3);
  event  = lwes_event_create (db, eventname);
  assert ( event != NULL );

  assert ( lwes_event_set_STRING   (event, key01, value01) == 1 );
  assert ( lwes_event_set_BOOLEAN  (event, key02, value02) == 2 );
  assert ( lwes_event_set_IP_ADDR  (event, key03, value03) == 3 );
  assert ( lwes_event_set_U_INT_16 (event, key04, value04) == 4 );
  assert ( lwes_event_set_INT_16   (event, key05, value05) == 5 );
  assert ( lwes_event_set_U_INT_32 (event, key06, value06) == 6 );
  assert ( lwes_event_set_INT_32   (event, key07, value07) == 7 );
  assert ( lwes_event_set_U_INT_64 (event, key08, value08) == 8 );
  assert ( lwes_event_set_INT_64   (event, key09, value09) == 9 );

  assert ( lwes_emitter_emit(emitter,event) == 0 );

  lwes_event_destroy(event);
  lwes_emitter_destroy(emitter);
/*  lwes_event_type_db_destroy(db); */

  /* emit with heartbeat */
  emitter = lwes_emitter_create (ip, iface, port, 1, 2);
  assert ( emitter != NULL );
  event  = lwes_event_create (db, eventname);
  assert ( event != NULL );

  assert ( lwes_event_set_STRING   (event, key01, value01) == 1 );
  assert ( lwes_event_set_BOOLEAN  (event, key02, value02) == 2 );
  assert ( lwes_event_set_IP_ADDR  (event, key03, value03) == 3 );
  assert ( lwes_event_set_U_INT_16 (event, key04, value04) == 4 );
  assert ( lwes_event_set_INT_16   (event, key05, value05) == 5 );
  assert ( lwes_event_set_U_INT_32 (event, key06, value06) == 6 );
  assert ( lwes_event_set_INT_32   (event, key07, value07) == 7 );
  assert ( lwes_event_set_U_INT_64 (event, key08, value08) == 8 );
  assert ( lwes_event_set_INT_64   (event, key09, value09) == 9 );

  /* emit one */
  assert ( lwes_emitter_emit(emitter,event) == 0 );

  /* then pretend it's the future so we get a heartbeat */
  time_future = 10;
  assert ( lwes_emitter_emit(emitter,event) == 0 );
  time_future = 0;

  lwes_event_destroy(event);

  /* pretend its really really far in the future to see that freq is
     capped */
  time_future = 100000;
  lwes_emitter_destroy(emitter);
  time_future = 0;
}
static void emitter_to  (const char *ip,
                         const int port,
                         const char *iface,
                         const char *n_ip,
                         const int n_port,
                         const char *n_iface)
{
  struct lwes_emitter *emitter;
  struct lwes_event *event;
  struct lwes_event_type_db *db = NULL;

/* db = lwes_event_type_db_create ( (char*)esffile );
 * assert ( db != NULL );
 */

  /* emit without heartbeat */
  emitter = lwes_emitter_create (ip, iface, port, 0, 60);
  assert (emitter != NULL);
  assert (lwes_net_get_ttl (&(emitter->connection)) == 3);
  event  = lwes_event_create (db, eventname);
  assert (event != NULL);

  assert (lwes_event_set_STRING   (event, key01, value01) == 1);
  assert (lwes_event_set_BOOLEAN  (event, key02, value02) == 2 );
  assert (lwes_event_set_IP_ADDR  (event, key03, value03) == 3);
  assert (lwes_event_set_U_INT_16 (event, key04, value04) == 4);
  assert (lwes_event_set_INT_16   (event, key05, value05) == 5);
  assert (lwes_event_set_U_INT_32 (event, key06, value06) == 6);
  assert (lwes_event_set_INT_32   (event, key07, value07) == 7);
  assert (lwes_event_set_U_INT_64 (event, key08, value08) == 8);
  assert (lwes_event_set_INT_64   (event, key09, value09) == 9);

  assert (lwes_emitter_emitto ((char *) n_ip,
                               (char *) n_iface,
                               (int)    n_port,
                               emitter,
                               event) == 0);

  lwes_event_destroy(event);
  lwes_emitter_destroy(emitter);
/*  lwes_event_type_db_destroy(db); */

  /* emit with heartbeat */
  emitter = lwes_emitter_create (ip, iface, port, 1, 2);
  assert (emitter != NULL);
  event  = lwes_event_create (db, eventname);
  assert (event != NULL);

  assert (lwes_event_set_STRING   (event, key01, value01) == 1);
  assert (lwes_event_set_BOOLEAN  (event, key02, value02) == 2);
  assert (lwes_event_set_IP_ADDR  (event, key03, value03) == 3);
  assert (lwes_event_set_U_INT_16 (event, key04, value04) == 4);
  assert (lwes_event_set_INT_16   (event, key05, value05) == 5);
  assert (lwes_event_set_U_INT_32 (event, key06, value06) == 6);
  assert (lwes_event_set_INT_32   (event, key07, value07) == 7);
  assert (lwes_event_set_U_INT_64 (event, key08, value08) == 8);
  assert (lwes_event_set_INT_64   (event, key09, value09) == 9);

  assert (lwes_emitter_emitto ((char *) n_ip,
                               (char *) n_iface,
                               (int)    n_port,
                               emitter,
                               event) == 0);

  /* pretend its the future */
  time_future = 10;

  assert (lwes_emitter_emitto ((char *) n_ip,
                               (char *) n_iface,
                               (int)    n_port,
                               emitter,
                               event) == 0);

  lwes_event_destroy (event);

  /* pretend its the past to test the other edge case for freqency */
  time_past = 2000;
  lwes_emitter_destroy (emitter);
  time_past = 0;
}
int main (int   argc,
          char *argv[])
{
  const char *mcast_ip    = "224.1.1.11";
  const char *mcast_iface = NULL;
  int         mcast_port  = 12345;
  int         number      = 1;
  int         pad         = 0;
  int         seconds     = 1;
  int         pause       = 0;
  int         even        = 0;

  struct lwes_emitter * emitter;
  struct lwes_event *event;
  char *pad_string;

  /* turn off error messages, I'll handle them */
  opterr = 0;
  while (1)
    {
      char c = getopt (argc, argv, "m:p:i:n:s:x:b:eh");

      if (c == -1)
        {
          break;
        }

      switch (c)
        {
          case 'b':
            pause = atoi(optarg);

            break;

          case 'm':
            mcast_ip = optarg;

            break;

          case 'p':
            mcast_port = atoi(optarg);

            break;

          case 'n':
            number = atoi(optarg);

            break;

          case 's':
            seconds = atoi(optarg);
            break;

          case 'e':
            even = 1;
            break;

          case 'h':
            fprintf (stderr, "%s", help);

            return 1;

          case 'i':
            mcast_iface = optarg;

            break;

          case 'x':
            pad = atoi(optarg);
            break;

          default:
            fprintf (stderr,
                     "error: unrecognized command line option -%c\n", 
                     optopt);

            return 1;
        }
    }

  pad_string = NULL;
  if (pad > 0)
    {
      pad_string = malloc(pad+1);
      if (pad_string == NULL)
        {
          fprintf (stderr,
                   "Unable to allocate %d bytes for pad string\n",
                   pad);
          exit(1);
        }
      else
        {
          memset(pad_string, 'X', pad);
          pad_string[pad] = '\0';
        }
    }

  emitter = lwes_emitter_create ( (LWES_SHORT_STRING) mcast_ip,
                                  (LWES_SHORT_STRING) mcast_iface,
                                  (LWES_U_INT_32)     mcast_port,
                                  0,
                                  10 );

  assert (emitter != NULL);

  {
    int i,s,n;
    LWES_INT_64 start  = 0LL;
    LWES_INT_64 stop   = 0LL;

    for (s = 0, n = 0; s < seconds; ++s)
      {
        start = currentTimeMillisLongLong ();
        stop  = start;
        for (i = 0; i < number; ++i, ++n)
          {
            event  = lwes_event_create (NULL, "MyEvent");
            assert (event != NULL);

            assert
              (lwes_event_set_STRING   (event, "field", "hello world") == 1 );
            assert
              (lwes_event_set_INT_32   (event, "count", i) == 2);
            assert
              (lwes_event_set_INT_32   (event, "run", s) == 3);
            assert
              (lwes_event_set_STRING (event, "prog_id","12345") == 4);
            assert
              (lwes_event_set_INT_16 (event,"num", 2) == 5);
            assert
              (lwes_event_set_STRING (event,"k0", "a-key.count") == 6);
            assert
              (lwes_event_set_INT_16 (event,"v0", 1) == 7);
            assert
              (lwes_event_set_STRING (event,"k1", "b-key.count") == 8);
            assert
              (lwes_event_set_INT_16 (event,"v1", 2) == 9);
            assert
              (lwes_event_set_U_INT_64(event, "global_count", n) == 10);
            assert
              (lwes_event_set_INT_64 (event,"SentTime", stop) == 11);
            if (pad>0) {
              assert(lwes_event_set_STRING (event,"pad",pad_string) == 12);
            }

            assert (lwes_emitter_emit (emitter, event) == 0);

            lwes_event_destroy(event);
            stop = currentTimeMillisLongLong ();

            /* if we are going over our total time, bail out */
            if ((stop - start) >= 1000)
              {
                printf ("Was only able to emit %7d in 1 sec\n",i);
                break;
              }
            
            /* if we are attempting to send events evenly throughout
            the second, consider pausing briefly to get back on
            schedule */
            if (even)
              {
                const int delay_ms = (i*1000/number) - (stop-start);
                if (delay_ms > 0)
                  {
                    usleep (delay_ms*1000);
                  }
              }
          }
        {
          const int delay_ms = (1000 - (stop - start))*1000;
          if (delay_ms > 0) usleep (delay_ms);
        }
        {
          char timebuff[20];
          /* HH/MM/SS DD/MM/YYYY  */
          /* 12345678901234567890 */
          time_t start_time = time (NULL);

          strftime (timebuff, 20, "%H:%M:%S %d/%m/%Y", localtime (&start_time));

          printf ("%s : %7d\n", timebuff, i);
        }

        sleep (pause);
      }
    lwes_emitter_destroy(emitter);
    if (pad_string!=NULL) free(pad_string);
  }

  return 0;
}