/*
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
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;
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];
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;
}
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);
}
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);
/* 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;
}
}
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
};
&play,
&disable_speaker,
&destroy_speaker,
- "phone"
+ PHONE0
};
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;
}
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
};
&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);
{
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;
}
}
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:
{
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;
}
}
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;
}
}
"%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;
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);
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 */