From c082bbd13bbc64c4d30b61496e068306afbd823f Mon Sep 17 00:00:00 2001 From: Sree Harsha Totakura Date: Wed, 10 Apr 2013 09:33:35 +0000 Subject: - more test cases --- src/testbed/test_testbed_api_operations.c | 87 ++++++++++++++++++++++++++----- src/testbed/testbed_api_operations.c | 15 +++++- 2 files changed, 89 insertions(+), 13 deletions(-) diff --git a/src/testbed/test_testbed_api_operations.c b/src/testbed/test_testbed_api_operations.c index af3e68c20..3f556c88f 100644 --- a/src/testbed/test_testbed_api_operations.c +++ b/src/testbed/test_testbed_api_operations.c @@ -34,6 +34,12 @@ #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,10 +99,19 @@ 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 */ @@ -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 }; /** @@ -269,7 +304,26 @@ step (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 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); @@ -292,28 +346,28 @@ start_cb (void *cls) result = TEST_OP1_STARTED; GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == 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); 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); 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); 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,13 +417,12 @@ 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); break; case TEST_OP3_STARTED: GNUNET_assert (&op3 == cls); @@ -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; @@ -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; diff --git a/src/testbed/testbed_api_operations.c b/src/testbed/testbed_api_operations.c index fc5da29b5..72d1733c9 100644 --- a/src/testbed/testbed_api_operations.c +++ b/src/testbed/testbed_api_operations.c @@ -635,7 +635,7 @@ recheck_waiting (struct OperationQueue *opq) struct QueueEntry *entry2; entry = opq->wq_head; - while ( (NULL != entry) && (opq->active < opq->max_active) ) + while (NULL != entry) { entry2 = entry->next; check_readiness (entry->op); @@ -741,8 +741,20 @@ GNUNET_TESTBED_operation_begin_wait_ (struct GNUNET_TESTBED_Operation *op) void GNUNET_TESTBED_operation_inactivate_ (struct GNUNET_TESTBED_Operation *op) { + struct OperationQueue **queues; + size_t ms; + unsigned int nqueues; + unsigned int i; + GNUNET_assert (OP_STATE_STARTED == op->state); change_state (op, OP_STATE_INACTIVE); + nqueues = op->nqueues; + ms = sizeof (struct OperationQueue *) * nqueues; + queues = GNUNET_malloc (ms); + GNUNET_assert (NULL != (queues = memcpy (queues, op->queues, ms))); + for (i = 0; i < nqueues; i++) + recheck_waiting (queues[i]); + GNUNET_free (queues); } @@ -756,6 +768,7 @@ GNUNET_TESTBED_operation_inactivate_ (struct GNUNET_TESTBED_Operation *op) void GNUNET_TESTBED_operation_activate_ (struct GNUNET_TESTBED_Operation *op) { + GNUNET_assert (OP_STATE_INACTIVE == op->state); change_state (op, OP_STATE_STARTED); } -- cgit v1.2.3