don't run set with valgrind per default
[oweals/gnunet.git] / src / conversation / test_conversation_api_twocalls.c
index 71b8f758cb6b5b4b6fb73f97c2427483e61eef2c..7d2705e705ee94ab2e77663123ffb5cfe213aaf3 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2013 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2013 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 /**
  * @file conversation/test_conversation_api_twocalls.c
 
 #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 25)
 
-static int ok = 1;
+#define LOG(kind,...)                           \
+  GNUNET_log (kind, __VA_ARGS__)
+
+#define LOG_DEBUG(...)                          \
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
 
 static const struct GNUNET_CONFIGURATION_Handle *cfg;
 
@@ -69,18 +73,60 @@ static GNUNET_MICROPHONE_RecordedDataCallback phone_rdc;
 
 static void *phone_rdc_cls;
 
-static GNUNET_MICROPHONE_RecordedDataCallback call_rdc;
+static struct GNUNET_SCHEDULER_Task *phone_task;
+
+static struct GNUNET_SCHEDULER_Task *timeout_task;
+
+/**
+ * Variable for recognizing caller1
+ */
+static const char *caller1 = "caller1";
+
+/**
+ * Variable for recognizing caller2
+ */
+static const char *caller2 = "caller2";
+
+/**
+ * Variable for recognizing callee
+ */
+static const char *phone0 = "phone";
+
+
+#define CALLER1 &caller1
+#define CALLER2 &caller2
+#define PHONE0 &phone0
+
+#define CLS_STR(caller) (*((char **)caller))
+
+
+/**
+ * Did caller1 call finish successfully
+ */
+static int call1_finished;
+
+/**
+ * Did caller2 call finish successfully
+ */
+static int call2_finished;
+
+struct MicContext
+{
+  GNUNET_MICROPHONE_RecordedDataCallback rdc;
+
+  void *rdc_cls;
 
-static void *call_rdc_cls;
+  struct GNUNET_SCHEDULER_Task * call_task;
 
-static GNUNET_SCHEDULER_TaskIdentifier phone_task;
+};
 
-static GNUNET_SCHEDULER_TaskIdentifier call_task;
+static struct MicContext call1_mic_ctx;
+static struct MicContext call2_mic_ctx;
+//static struct MicContext phone_mic_ctx;
 
 
 static void
-phone_send (void *cls,
-            const struct GNUNET_SCHEDULER_TaskContext *tc)
+phone_send (void *cls)
 {
   char buf[32];
 
@@ -93,27 +139,26 @@ phone_send (void *cls,
 
 
 static void
-call_send (void *cls,
-           const struct GNUNET_SCHEDULER_TaskContext *tc)
+call_send (void *cls)
 {
+  struct MicContext *mc = cls;
   char buf[32];
 
-  GNUNET_assert (NULL != call_rdc);
+  GNUNET_assert (NULL != mc->rdc);
   GNUNET_snprintf (buf, sizeof (buf), "call");
-  call_rdc (call_rdc_cls, strlen (buf) + 1, buf);
-  call_task = GNUNET_SCHEDULER_add_delayed (FREQ,
-                                            &call_send, NULL);
+  mc->rdc (mc->rdc_cls, strlen (buf) + 1, buf);
+  mc->call_task = GNUNET_SCHEDULER_add_delayed (FREQ,
+                                                &call_send, mc);
 }
 
 
 static int
 enable_speaker (void *cls)
 {
-  const char *origin = cls;
+  const char *origin = CLS_STR (cls);
 
-  fprintf (stderr,
-           "Speaker %s enabled\n",
-           origin);
+  LOG_DEBUG ("Speaker %s enabled\n",
+             origin);
   return GNUNET_OK;
 }
 
@@ -121,11 +166,10 @@ enable_speaker (void *cls)
 static void
 disable_speaker (void *cls)
 {
-  const char *origin = cls;
+  const char *origin = CLS_STR (cls);
 
-  fprintf (stderr,
-           "Speaker %s disabled\n",
-           origin);
+  LOG_DEBUG ("Speaker %s disabled\n",
+             origin);
 }
 
 
@@ -143,15 +187,15 @@ play (void *cls,
     phone_i++;
   else
   {
-    fprintf (stderr,
-             "Received unexpected data %.*s\n",
-             (int) data_size,
-             (const char *) data);
+    LOG_DEBUG ("Received %u bytes of unexpected data `%.*s'\n",
+               (unsigned int) data_size,
+               (int) data_size,
+               (const char *) data);
   }
 
   if ( (20 < call_i) &&
        (20 < phone_i) &&
-       (NULL != call2) )
+       (CALLER2 == cls) )
   {
     /* time to hang up ... */
     GNUNET_CONVERSATION_call_stop (call2);
@@ -159,14 +203,18 @@ play (void *cls,
     /* reset counters */
     call_i = 0;
     phone_i = 0;
+    call2_finished = GNUNET_YES;
   }
   if ( (20 < call_i) &&
        (20 < phone_i) &&
-       (NULL != call1) )
+       (CALLER1 == cls) )
   {
     /* time to hang up ... */
     GNUNET_CONVERSATION_call_stop (call1);
     call1 = NULL;
+    call_i = 0;
+    phone_i = 0;
+    call1_finished = GNUNET_YES;
   }
 }
 
@@ -174,18 +222,27 @@ play (void *cls,
 static void
 destroy_speaker (void *cls)
 {
-  const char *origin = cls;
+  const char *origin = CLS_STR (cls);
 
-  fprintf (stderr, "Speaker %s destroyed\n", origin);
+  LOG_DEBUG ("Speaker %s destroyed\n", origin);
 }
 
 
-static struct GNUNET_SPEAKER_Handle call_speaker = {
+static struct GNUNET_SPEAKER_Handle call1_speaker = {
   &enable_speaker,
   &play,
   &disable_speaker,
   &destroy_speaker,
-  "caller"
+  CALLER1
+};
+
+
+static struct GNUNET_SPEAKER_Handle call2_speaker = {
+  &enable_speaker,
+  &play,
+  &disable_speaker,
+  &destroy_speaker,
+  CALLER2
 };
 
 
@@ -194,7 +251,7 @@ static struct GNUNET_SPEAKER_Handle phone_speaker = {
   &play,
   &disable_speaker,
   &destroy_speaker,
-  "phone"
+  PHONE0
 };
 
 
@@ -203,25 +260,24 @@ enable_mic (void *cls,
             GNUNET_MICROPHONE_RecordedDataCallback rdc,
             void *rdc_cls)
 {
-  const char *origin = cls;
+  const char *origin = CLS_STR (cls);
+  struct MicContext *mc;
 
-  fprintf (stderr,
-           "Mic %s enabled\n",
-           origin);
-  if (0 == strcmp (origin, "phone"))
+  LOG_DEBUG ("Mic %s enabled\n",
+             origin);
+  if (PHONE0 == cls)
   {
     phone_rdc = rdc;
     phone_rdc_cls = rdc_cls;
-    GNUNET_break (GNUNET_SCHEDULER_NO_TASK == phone_task);
+    GNUNET_break (NULL == phone_task);
     phone_task = GNUNET_SCHEDULER_add_now (&phone_send, NULL);
+    return GNUNET_OK;
   }
-  else
-  {
-    call_rdc = rdc;
-    call_rdc_cls = rdc_cls;
-    GNUNET_break (GNUNET_SCHEDULER_NO_TASK == call_task);
-    call_task = GNUNET_SCHEDULER_add_now (&call_send, NULL);
-  }
+  mc = (CALLER1 == cls) ? &call1_mic_ctx : &call2_mic_ctx;
+  mc->rdc = rdc;
+  mc->rdc_cls = rdc_cls;
+  GNUNET_break (NULL == mc->call_task);
+  mc->call_task = GNUNET_SCHEDULER_add_now (&call_send, mc);
   return GNUNET_OK;
 }
 
@@ -229,44 +285,50 @@ enable_mic (void *cls,
 static void
 disable_mic (void *cls)
 {
-  const char *origin = cls;
+  const char *origin = CLS_STR (cls);
+  struct MicContext *mc;
 
-  fprintf (stderr,
-           "Mic %s disabled\n",
-           origin);
-  if (0 == strcmp (origin, "phone"))
+  LOG_DEBUG ("Mic %s disabled\n",
+             origin);
+  if (PHONE0 == cls)
   {
     phone_rdc = NULL;
     phone_rdc_cls = NULL;
     GNUNET_SCHEDULER_cancel (phone_task);
-    phone_task = GNUNET_SCHEDULER_NO_TASK;
-  }
-  else
-  {
-    call_rdc = NULL;
-    call_rdc_cls = NULL;
-    GNUNET_SCHEDULER_cancel (call_task);
-    call_task = GNUNET_SCHEDULER_NO_TASK;
+    phone_task = NULL;
+    return;
   }
+  mc = (CALLER1 == cls) ? &call1_mic_ctx : &call2_mic_ctx;
+  mc->rdc = NULL;
+  mc->rdc_cls = NULL;
+  GNUNET_SCHEDULER_cancel (mc->call_task);
+  mc->call_task = NULL;
 }
 
 
 static void
 destroy_mic (void *cls)
 {
-  const char *origin = cls;
+  const char *origin = CLS_STR (cls);
 
-  fprintf (stderr,
-           "Mic %s destroyed\n",
-           origin);
+  LOG_DEBUG ("Mic %s destroyed\n",
+             origin);
 }
 
 
-static struct GNUNET_MICROPHONE_Handle call_mic = {
+static struct GNUNET_MICROPHONE_Handle call1_mic = {
   &enable_mic,
   &disable_mic,
   &destroy_mic,
-  "caller"
+  CALLER1
+};
+
+
+static struct GNUNET_MICROPHONE_Handle call2_mic = {
+  &enable_mic,
+  &disable_mic,
+  &destroy_mic,
+  CALLER2
 };
 
 
@@ -274,20 +336,38 @@ static struct GNUNET_MICROPHONE_Handle phone_mic = {
   &enable_mic,
   &disable_mic,
   &destroy_mic,
-  "phone"
+  PHONE0
 };
 
 
 /**
- * Signature of the main function of a task.
+ * Function run on timeout.
  *
  * @param cls closure
- * @param tc context information (why was this task triggered now)
  */
 static void
-end_test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+end_test (void *cls)
 {
+  timeout_task = NULL;
+  fprintf (stderr,
+           "Timeout!\n");
   GNUNET_SCHEDULER_shutdown ();
+}
+
+
+/**
+ * Function run on shutdown.
+ *
+ * @param cls closure
+ */
+static void
+do_shutdown (void *cls)
+{
+  if (NULL != timeout_task)
+  {
+    GNUNET_SCHEDULER_cancel (timeout_task);
+    timeout_task = NULL;
+  }
   if (NULL != op)
   {
     GNUNET_IDENTITY_cancel (op);
@@ -335,7 +415,7 @@ caller_event_handler (void *cls,
   {
   case GNUNET_CONVERSATION_EC_CALLER_SUSPEND:
   case GNUNET_CONVERSATION_EC_CALLER_RESUME:
-    fprintf (stderr, "Unexpected caller code: %d\n", code);
+    LOG (GNUNET_ERROR_TYPE_WARNING, "Unexpected caller code: %d\n", code);
     break;
   }
 }
@@ -345,12 +425,10 @@ static void
 phone_event_handler (void *cls,
                      enum GNUNET_CONVERSATION_PhoneEventCode code,
                      struct GNUNET_CONVERSATION_Caller *caller,
-                     const char *caller_id)
+                     const struct GNUNET_CRYPTO_EcdsaPublicKey *caller_id)
 {
   const char *cid;
 
-  GNUNET_break (0 == strcmp (caller_id,
-                             gns_caller_id));
   switch (code)
   {
   case GNUNET_CONVERSATION_EC_PHONE_RING:
@@ -388,12 +466,11 @@ phone_event_handler (void *cls,
     {
       active_caller1 = NULL;
       GNUNET_break (NULL == active_caller2);
-      ok = 0;
       GNUNET_SCHEDULER_shutdown ();
     }
     break;
   default:
-    fprintf (stderr, "Unexpected phone code: %d\n", code);
+    LOG (GNUNET_ERROR_TYPE_WARNING, "Unexpected phone code: %d\n", code);
     break;
   }
 }
@@ -410,16 +487,31 @@ call_event_handler (void *cls,
   case GNUNET_CONVERSATION_EC_CALL_RINGING:
     break;
   case GNUNET_CONVERSATION_EC_CALL_PICKED_UP:
+    LOG_DEBUG ("Call %s picked\n", cid);
     break;
   case GNUNET_CONVERSATION_EC_CALL_GNS_FAIL:
+    LOG_DEBUG ("Call %s GNS lookup failed \n", cid);
+    break;
   case GNUNET_CONVERSATION_EC_CALL_HUNG_UP:
+    LOG_DEBUG ("Call %s hungup\n", cid);
     if (0 == strcmp (cid, "call1"))
       call1 = NULL;
     else
       call2 = NULL;
     break;
   case GNUNET_CONVERSATION_EC_CALL_SUSPENDED:
+    LOG_DEBUG ("Call %s suspended\n", cid);
+    break;
   case GNUNET_CONVERSATION_EC_CALL_RESUMED:
+    LOG_DEBUG ("Call %s resumed\n", cid);
+    break;
+  case GNUNET_CONVERSATION_EC_CALL_ERROR:
+    GNUNET_break (0);
+    if (0 == strcmp (cid, "call1"))
+      call1 = NULL;
+    else
+      call2 = NULL;
+    GNUNET_SCHEDULER_shutdown ();
     break;
   }
 }
@@ -492,17 +584,19 @@ identity_cb (void *cls,
                      "%s",
                      GNUNET_GNSRECORD_pkey_to_zkey (&pub));
     call1 = GNUNET_CONVERSATION_call_start (cfg,
+                                            ego,
                                             ego,
                                             gns_name,
-                                            &call_speaker,
-                                            &call_mic,
+                                            &call1_speaker,
+                                            &call1_mic,
                                             &call_event_handler,
                                             (void *) "call1");
     call2 = GNUNET_CONVERSATION_call_start (cfg,
+                                            ego,
                                             ego,
                                             gns_name,
-                                            &call_speaker,
-                                            &call_mic,
+                                            &call2_speaker,
+                                            &call2_mic,
                                             &call_event_handler,
                                             (void *) "call2");
     return;
@@ -525,8 +619,11 @@ run (void *cls,
      struct GNUNET_TESTING_Peer *peer)
 {
   cfg = c;
-  GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_test,
-                                NULL);
+  timeout_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
+                                               &end_test,
+                                               NULL);
+  GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
+                                 NULL);
   id = GNUNET_IDENTITY_connect (cfg,
                                 &identity_cb,
                                 NULL);
@@ -538,11 +635,14 @@ run (void *cls,
 int
 main (int argc, char *argv[])
 {
+
   if (0 != GNUNET_TESTING_peer_run ("test_conversation_api_twocalls",
                                    "test_conversation.conf",
                                    &run, NULL))
     return 1;
-  return ok;
+  if (call1_finished && call2_finished)
+    return 0;
+  return 1;
 }
 
 /* end of test_conversation_api_twocalls.c */