Forget to commit some files
[oweals/gnunet.git] / src / testbed / test_testbed_api_operations.c
index af3e68c20ad4c84f8e46d0c1de120fec77846043..73f3b7c3625b2c7f52d7f4a295d82d8cec71925d 100644 (file)
@@ -1,6 +1,6 @@
 /*
       This file is part of GNUnet
-      (C) 2008--2012 Christian Grothoff (and other contributing authors)
+      Copyright (C) 2008--2013 Christian Grothoff (and other contributing authors)
 
       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.
  */
 
 /**
 #define LOG(kind,...)                          \
   GNUNET_log (kind, __VA_ARGS__)
 
+/**
+ * Delay to start step task
+ */
+#define STEP_DELAY                                                      \
+  GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 500)
+
 /**
  * Queue A. Initially the max active is set to 2 and then reduced to 0 - this
  * should block op2 even after op1 has finished. Later the max active is set to
@@ -93,14 +99,23 @@ struct GNUNET_TESTBED_Operation *op7;
 
 /**
  * This operation is started after op6 is finished in step task.  It consumes 2
- * resources on both queues q1 and q1.
+ * resources on both queues q1 and q2.  This operation should evict op7.  After
+ * starting, it should be made inactive, active and inactive again in the step task.
  */
 struct GNUNET_TESTBED_Operation *op8;
 
+/**
+ * This opration is started after activating op8.  It should consume a resource
+ * on queues q1 and q2.  It should not be started until op8 is again made
+ * inactive at which point it should be released.  It can be released as soon as
+ * it begins.
+ */
+struct GNUNET_TESTBED_Operation *op9;
+
 /**
  * The delay task identifier
  */
-GNUNET_SCHEDULER_TaskIdentifier step_task;
+struct GNUNET_SCHEDULER_Task * step_task;
 
 
 /**
@@ -189,10 +204,30 @@ enum Test
    */
   TEST_OP8_STARTED,
 
+  /**
+   * op8 is inactive
+   */
+  TEST_OP8_INACTIVE_1,
+
+  /**
+   * op8 is active
+   */
+  TEST_OP8_ACTIVE,
+
   /**
    * op8 has been released
    */
-  TEST_OP8_RELEASED
+  TEST_OP8_RELEASED,
+
+  /**
+   * op9 has started
+   */
+  TEST_OP9_STARTED,
+
+  /**
+   * op9 has been released
+   */
+  TEST_OP9_RELEASED
 };
 
 /**
@@ -232,8 +267,8 @@ release_cb (void *cls);
 static void
 step (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-  GNUNET_assert (GNUNET_SCHEDULER_NO_TASK != step_task);
-  step_task = GNUNET_SCHEDULER_NO_TASK;
+  GNUNET_assert (NULL != step_task);
+  step_task = NULL;
   switch (result)
   {
   case TEST_OP1_STARTED:
@@ -261,15 +296,34 @@ step (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   case TEST_OP4_STARTED:
     GNUNET_TESTBED_operation_release_ (op4);
     break;
-  case TEST_OP6_RELEASED:    
-    op8 = GNUNET_TESTBED_operation_create_ (&op8, &start_cb, &release_cb);    
+  case TEST_OP6_RELEASED:
+    op8 = GNUNET_TESTBED_operation_create_ (&op8, &start_cb, &release_cb);
     GNUNET_TESTBED_operation_queue_insert2_ (q1, op8, 2);
     GNUNET_TESTBED_operation_queue_insert2_ (q2, op8, 2);
     result = TEST_OP8_WAITING;
     GNUNET_TESTBED_operation_begin_wait_ (op8);
     break;
   case TEST_OP8_STARTED:
-    GNUNET_TESTBED_operation_release_ (op8);
+    GNUNET_TESTBED_operation_inactivate_ (op8);
+    result = TEST_OP8_INACTIVE_1;
+    step_task = GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL);
+    break;
+  case TEST_OP8_INACTIVE_1:
+    GNUNET_TESTBED_operation_activate_ (op8);
+    result = TEST_OP8_ACTIVE;
+    op9 = GNUNET_TESTBED_operation_create_ (&op9, &start_cb, &release_cb);
+    GNUNET_TESTBED_operation_queue_insert2_ (q1, op9, 1);
+    GNUNET_TESTBED_operation_queue_insert2_ (q2, op9, 1);
+    GNUNET_TESTBED_operation_begin_wait_ (op9);
+    step_task = GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL);
+    break;
+  case TEST_OP8_ACTIVE:
+    GNUNET_TESTBED_operation_inactivate_ (op8);
+    /* op8 should be released by now due to above call */
+    GNUNET_assert (TEST_OP8_RELEASED == result);
+    break;
+  case TEST_OP9_STARTED:
+    GNUNET_TESTBED_operation_release_ (op9);
     break;
   default:
     GNUNET_assert (0);
@@ -290,30 +344,30 @@ start_cb (void *cls)
   case TEST_INIT:
     GNUNET_assert (&op1 == cls);
     result = TEST_OP1_STARTED;
-    GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
+    GNUNET_assert (NULL == step_task);
     step_task =
-        GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL);
+        GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL);
     break;
   case TEST_PAUSE:
     GNUNET_assert (&op2 == cls);
     result = TEST_OP2_STARTED;
-    GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
+    GNUNET_assert (NULL == step_task);
     step_task =
-        GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL);
+        GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL);
     break;
   case TEST_OP2_RELEASED:
     GNUNET_assert (&op3 == cls);
     result = TEST_OP3_STARTED;
-    GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
+    GNUNET_assert (NULL == step_task);
     step_task =
-        GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL);
+        GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL);
     break;
   case TEST_OP3_RELEASED:
     GNUNET_assert (&op4 == cls);
     result = TEST_OP4_STARTED;
-    GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
+    GNUNET_assert (NULL == step_task);
     step_task =
-        GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL);
+        GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL);
     break;
   case TEST_OP4_RELEASED:
   {
@@ -331,7 +385,12 @@ start_cb (void *cls)
   case TEST_OP7_RELEASED:
     GNUNET_assert (&op8 == cls);
     result = TEST_OP8_STARTED;
-    step_task = GNUNET_SCHEDULER_add_now (&step, NULL);
+    step_task = GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL);
+    break;
+  case TEST_OP8_RELEASED:
+    GNUNET_assert (&op9 == cls);
+    result = TEST_OP9_STARTED;
+    step_task = GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL);
     break;
   default:
     GNUNET_assert (0);
@@ -358,23 +417,22 @@ release_cb (void *cls)
     result = TEST_OP1_RELEASED;
     op1 = NULL;
     step_task =
-        GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL);
+        GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL);
     break;
   case TEST_OP2_STARTED:
     GNUNET_assert (&op2 == cls);
     result = TEST_OP2_RELEASED;
-    GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
-    //step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL);
+    GNUNET_assert (NULL == step_task);
     break;
   case TEST_OP3_STARTED:
     GNUNET_assert (&op3 == cls);
     result = TEST_OP3_RELEASED;
-    GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
+    GNUNET_assert (NULL == step_task);
     break;
   case TEST_OP4_STARTED:
     GNUNET_assert (&op4 == cls);
     result = TEST_OP4_RELEASED;
-    GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
+    GNUNET_assert (NULL == step_task);
     op5 = GNUNET_TESTBED_operation_create_ (&op5, &start_cb, &release_cb);
     GNUNET_TESTBED_operation_queue_insert2_ (q1, op5, 1);
     GNUNET_TESTBED_operation_begin_wait_ (op5);
@@ -402,9 +460,13 @@ release_cb (void *cls)
     op7 = NULL;
     result = TEST_OP7_RELEASED;
     break;
-  case TEST_OP8_STARTED:
+  case TEST_OP8_ACTIVE:
     result = TEST_OP8_RELEASED;
     op8 = NULL;
+    break;
+  case TEST_OP9_STARTED:
+    GNUNET_assert (&op9 == cls);
+    result = TEST_OP9_RELEASED;
     GNUNET_TESTBED_operation_queue_destroy_ (q1);
     GNUNET_TESTBED_operation_queue_destroy_ (q2);
     q1 = NULL;
@@ -428,9 +490,9 @@ static void
 run (void *cls, char *const *args, const char *cfgfile,
      const struct GNUNET_CONFIGURATION_Handle *config)
 {
-  q1 = GNUNET_TESTBED_operation_queue_create_ (1);
+  q1 = GNUNET_TESTBED_operation_queue_create_ (OPERATION_QUEUE_TYPE_FIXED, 1);
   GNUNET_assert (NULL != q1);
-  q2 = GNUNET_TESTBED_operation_queue_create_ (2);
+  q2 = GNUNET_TESTBED_operation_queue_create_ (OPERATION_QUEUE_TYPE_FIXED, 2);
   GNUNET_assert (NULL != q2);
   op1 = GNUNET_TESTBED_operation_create_ (&op1, start_cb, release_cb);
   GNUNET_assert (NULL != op1);
@@ -461,7 +523,7 @@ main (int argc, char **argv)
       GNUNET_PROGRAM_run ((sizeof (argv2) / sizeof (char *)) - 1, argv2,
                           "test_testbed_api_operations", "nohelp", options,
                           &run, NULL);
-  if ((GNUNET_OK != ret) || (TEST_OP8_RELEASED != result))
+  if ((GNUNET_OK != ret) || (TEST_OP9_RELEASED != result))
     return 1;
   op1 = NULL;
   op2 = NULL;
@@ -471,6 +533,7 @@ main (int argc, char **argv)
   op6 = NULL;
   op7 = NULL;
   op8 = NULL;
+  op9 = NULL;
   q1 = NULL;
   q2 = NULL;
   return 0;