|
@@ -61,8 +61,6 @@ static void scheduler_channel_doesnt_want_writes_mock(channel_t *ch);
|
|
|
static void test_channel_dumpstats(void *arg);
|
|
|
static void test_channel_incoming(void *arg);
|
|
|
static void test_channel_lifecycle(void *arg);
|
|
|
-static void test_channel_multi(void *arg);
|
|
|
-static void test_channel_queue_size(void *arg);
|
|
|
static void test_channel_write(void *arg);
|
|
|
|
|
|
static void
|
|
@@ -917,261 +915,6 @@ test_channel_lifecycle_2(void *arg)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
-static void
|
|
|
-test_channel_multi(void *arg)
|
|
|
-{
|
|
|
- channel_t *ch1 = NULL, *ch2 = NULL;
|
|
|
- uint64_t global_queue_estimate;
|
|
|
- cell_t *cell = NULL;
|
|
|
-
|
|
|
- (void)arg;
|
|
|
-
|
|
|
- /* Accept cells to lower layer */
|
|
|
- test_chan_accept_cells = 1;
|
|
|
- /* Use default overhead factor */
|
|
|
- test_overhead_estimate = 1.0;
|
|
|
-
|
|
|
- ch1 = new_fake_channel();
|
|
|
- tt_assert(ch1);
|
|
|
- ch2 = new_fake_channel();
|
|
|
- tt_assert(ch2);
|
|
|
-
|
|
|
- /* Initial queue size update */
|
|
|
- channel_update_xmit_queue_size(ch1);
|
|
|
- tt_u64_op(ch1->bytes_queued_for_xmit, OP_EQ, 0);
|
|
|
- channel_update_xmit_queue_size(ch2);
|
|
|
- tt_u64_op(ch2->bytes_queued_for_xmit, OP_EQ, 0);
|
|
|
- global_queue_estimate = channel_get_global_queue_estimate();
|
|
|
- tt_u64_op(global_queue_estimate, OP_EQ, 0);
|
|
|
-
|
|
|
- /* Queue some cells, check queue estimates */
|
|
|
- cell = tor_malloc_zero(sizeof(cell_t));
|
|
|
- make_fake_cell(cell);
|
|
|
- channel_write_cell(ch1, cell);
|
|
|
-
|
|
|
- cell = tor_malloc_zero(sizeof(cell_t));
|
|
|
- make_fake_cell(cell);
|
|
|
- channel_write_cell(ch2, cell);
|
|
|
-
|
|
|
- channel_update_xmit_queue_size(ch1);
|
|
|
- channel_update_xmit_queue_size(ch2);
|
|
|
- tt_u64_op(ch1->bytes_queued_for_xmit, OP_EQ, 0);
|
|
|
- tt_u64_op(ch2->bytes_queued_for_xmit, OP_EQ, 0);
|
|
|
- global_queue_estimate = channel_get_global_queue_estimate();
|
|
|
- tt_u64_op(global_queue_estimate, OP_EQ, 0);
|
|
|
-
|
|
|
- /* Stop accepting cells at lower layer */
|
|
|
- test_chan_accept_cells = 0;
|
|
|
-
|
|
|
- /* Queue some cells and check queue estimates */
|
|
|
- cell = tor_malloc_zero(sizeof(cell_t));
|
|
|
- make_fake_cell(cell);
|
|
|
- channel_write_cell(ch1, cell);
|
|
|
-
|
|
|
- channel_update_xmit_queue_size(ch1);
|
|
|
- tt_u64_op(ch1->bytes_queued_for_xmit, OP_EQ, 512);
|
|
|
- global_queue_estimate = channel_get_global_queue_estimate();
|
|
|
- tt_u64_op(global_queue_estimate, OP_EQ, 512);
|
|
|
-
|
|
|
- cell = tor_malloc_zero(sizeof(cell_t));
|
|
|
- make_fake_cell(cell);
|
|
|
- channel_write_cell(ch2, cell);
|
|
|
-
|
|
|
- channel_update_xmit_queue_size(ch2);
|
|
|
- tt_u64_op(ch2->bytes_queued_for_xmit, OP_EQ, 512);
|
|
|
- global_queue_estimate = channel_get_global_queue_estimate();
|
|
|
- tt_u64_op(global_queue_estimate, OP_EQ, 1024);
|
|
|
-
|
|
|
- /* Allow cells through again */
|
|
|
- test_chan_accept_cells = 1;
|
|
|
-
|
|
|
- /* Update and check queue sizes */
|
|
|
- channel_update_xmit_queue_size(ch1);
|
|
|
- channel_update_xmit_queue_size(ch2);
|
|
|
- tt_u64_op(ch1->bytes_queued_for_xmit, OP_EQ, 512);
|
|
|
- tt_u64_op(ch2->bytes_queued_for_xmit, OP_EQ, 0);
|
|
|
- global_queue_estimate = channel_get_global_queue_estimate();
|
|
|
- tt_u64_op(global_queue_estimate, OP_EQ, 512);
|
|
|
-
|
|
|
- /* Update and check queue sizes */
|
|
|
- channel_update_xmit_queue_size(ch1);
|
|
|
- channel_update_xmit_queue_size(ch2);
|
|
|
- tt_u64_op(ch1->bytes_queued_for_xmit, OP_EQ, 0);
|
|
|
- tt_u64_op(ch2->bytes_queued_for_xmit, OP_EQ, 0);
|
|
|
- global_queue_estimate = channel_get_global_queue_estimate();
|
|
|
- tt_u64_op(global_queue_estimate, OP_EQ, 0);
|
|
|
-
|
|
|
- /* Now block again */
|
|
|
- test_chan_accept_cells = 0;
|
|
|
-
|
|
|
- /* Queue some cells */
|
|
|
- cell = tor_malloc_zero(sizeof(cell_t));
|
|
|
- make_fake_cell(cell);
|
|
|
- channel_write_cell(ch1, cell);
|
|
|
-
|
|
|
- cell = tor_malloc_zero(sizeof(cell_t));
|
|
|
- make_fake_cell(cell);
|
|
|
- channel_write_cell(ch2, cell);
|
|
|
- cell = NULL;
|
|
|
-
|
|
|
- /* Check the estimates */
|
|
|
- channel_update_xmit_queue_size(ch1);
|
|
|
- channel_update_xmit_queue_size(ch2);
|
|
|
- tt_u64_op(ch1->bytes_queued_for_xmit, OP_EQ, 512);
|
|
|
- tt_u64_op(ch2->bytes_queued_for_xmit, OP_EQ, 512);
|
|
|
- global_queue_estimate = channel_get_global_queue_estimate();
|
|
|
- tt_u64_op(global_queue_estimate, OP_EQ, 1024);
|
|
|
-
|
|
|
- /* Now close channel 2; it should be subtracted from the global queue */
|
|
|
- MOCK(scheduler_release_channel, scheduler_release_channel_mock);
|
|
|
- channel_mark_for_close(ch2);
|
|
|
- UNMOCK(scheduler_release_channel);
|
|
|
-
|
|
|
- global_queue_estimate = channel_get_global_queue_estimate();
|
|
|
- tt_u64_op(global_queue_estimate, OP_EQ, 512);
|
|
|
-
|
|
|
- /*
|
|
|
- * Since the fake channels aren't registered, channel_free_all() can't
|
|
|
- * see them properly.
|
|
|
- */
|
|
|
- MOCK(scheduler_release_channel, scheduler_release_channel_mock);
|
|
|
- channel_mark_for_close(ch1);
|
|
|
- UNMOCK(scheduler_release_channel);
|
|
|
-
|
|
|
- global_queue_estimate = channel_get_global_queue_estimate();
|
|
|
- tt_u64_op(global_queue_estimate, OP_EQ, 0);
|
|
|
-
|
|
|
- /* Now free everything */
|
|
|
- MOCK(scheduler_release_channel, scheduler_release_channel_mock);
|
|
|
- channel_free_all();
|
|
|
- UNMOCK(scheduler_release_channel);
|
|
|
-
|
|
|
- done:
|
|
|
- free_fake_channel(ch1);
|
|
|
- free_fake_channel(ch2);
|
|
|
-
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
-static void
|
|
|
-test_channel_queue_size(void *arg)
|
|
|
-{
|
|
|
- channel_t *ch = NULL;
|
|
|
- cell_t *cell = NULL;
|
|
|
- int n, old_count;
|
|
|
- uint64_t global_queue_estimate;
|
|
|
-
|
|
|
- (void)arg;
|
|
|
-
|
|
|
- ch = new_fake_channel();
|
|
|
- tt_assert(ch);
|
|
|
-
|
|
|
- /* Initial queue size update */
|
|
|
- channel_update_xmit_queue_size(ch);
|
|
|
- tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 0);
|
|
|
- global_queue_estimate = channel_get_global_queue_estimate();
|
|
|
- tt_u64_op(global_queue_estimate, OP_EQ, 0);
|
|
|
-
|
|
|
- /* Test the call-through to our fake lower layer */
|
|
|
- n = channel_num_cells_writeable(ch);
|
|
|
- /* chan_test_num_cells_writeable() always returns 32 */
|
|
|
- tt_int_op(n, OP_EQ, 32);
|
|
|
-
|
|
|
- /*
|
|
|
- * Now we queue some cells and check that channel_num_cells_writeable()
|
|
|
- * adjusts properly
|
|
|
- */
|
|
|
-
|
|
|
- /* tell it not to accept cells */
|
|
|
- test_chan_accept_cells = 0;
|
|
|
- /* ...and keep it from trying to flush the queue */
|
|
|
- ch->state = CHANNEL_STATE_MAINT;
|
|
|
-
|
|
|
- /* Get a fresh cell */
|
|
|
- cell = tor_malloc_zero(sizeof(cell_t));
|
|
|
- make_fake_cell(cell);
|
|
|
-
|
|
|
- old_count = test_cells_written;
|
|
|
- channel_write_cell(ch, cell);
|
|
|
- /* Assert that it got queued, not written through, correctly */
|
|
|
- tt_int_op(test_cells_written, OP_EQ, old_count);
|
|
|
-
|
|
|
- /* Now check chan_test_num_cells_writeable() again */
|
|
|
- n = channel_num_cells_writeable(ch);
|
|
|
- /* Should return 0 since we're in CHANNEL_STATE_MAINT */
|
|
|
- tt_int_op(n, OP_EQ, 0);
|
|
|
-
|
|
|
- /* Update queue size estimates */
|
|
|
- channel_update_xmit_queue_size(ch);
|
|
|
- /* One cell, times an overhead factor of 1.0 */
|
|
|
- tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 512);
|
|
|
- /* Try a different overhead factor */
|
|
|
- test_overhead_estimate = 0.5;
|
|
|
- /* This one should be ignored since it's below 1.0 */
|
|
|
- channel_update_xmit_queue_size(ch);
|
|
|
- tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 512);
|
|
|
- /* Now try a larger one */
|
|
|
- test_overhead_estimate = 2.0;
|
|
|
- channel_update_xmit_queue_size(ch);
|
|
|
- tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 1024);
|
|
|
- /* Go back to 1.0 */
|
|
|
- test_overhead_estimate = 1.0;
|
|
|
- channel_update_xmit_queue_size(ch);
|
|
|
- tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 512);
|
|
|
- /* Check the global estimate too */
|
|
|
- global_queue_estimate = channel_get_global_queue_estimate();
|
|
|
- tt_u64_op(global_queue_estimate, OP_EQ, 512);
|
|
|
-
|
|
|
- /* Go to open */
|
|
|
- old_count = test_cells_written;
|
|
|
- channel_change_state_open(ch);
|
|
|
-
|
|
|
- /*
|
|
|
- * It should try to write, but we aren't accepting cells right now, so
|
|
|
- * it'll requeue
|
|
|
- */
|
|
|
- tt_int_op(test_cells_written, OP_EQ, old_count);
|
|
|
-
|
|
|
- /* Check the queue size again */
|
|
|
- channel_update_xmit_queue_size(ch);
|
|
|
- tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 512);
|
|
|
- global_queue_estimate = channel_get_global_queue_estimate();
|
|
|
- tt_u64_op(global_queue_estimate, OP_EQ, 512);
|
|
|
-
|
|
|
- /*
|
|
|
- * Now the cell is in the queue, and we're open, so we should get 31
|
|
|
- * writeable cells.
|
|
|
- */
|
|
|
- n = channel_num_cells_writeable(ch);
|
|
|
- tt_int_op(n, OP_EQ, 31);
|
|
|
-
|
|
|
- /* Accept cells again */
|
|
|
- test_chan_accept_cells = 1;
|
|
|
- /* ...and re-process the queue */
|
|
|
- old_count = test_cells_written;
|
|
|
- tt_int_op(test_cells_written, OP_EQ, old_count + 1);
|
|
|
-
|
|
|
- /* Should have 32 writeable now */
|
|
|
- n = channel_num_cells_writeable(ch);
|
|
|
- tt_int_op(n, OP_EQ, 32);
|
|
|
-
|
|
|
- /* Should have queue size estimate of zero */
|
|
|
- channel_update_xmit_queue_size(ch);
|
|
|
- tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 0);
|
|
|
- global_queue_estimate = channel_get_global_queue_estimate();
|
|
|
- tt_u64_op(global_queue_estimate, OP_EQ, 0);
|
|
|
-
|
|
|
- /* Okay, now we're done with this one */
|
|
|
- MOCK(scheduler_release_channel, scheduler_release_channel_mock);
|
|
|
- channel_mark_for_close(ch);
|
|
|
- UNMOCK(scheduler_release_channel);
|
|
|
-
|
|
|
- done:
|
|
|
- free_fake_channel(ch);
|
|
|
-
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
static void
|
|
|
test_channel_write(void *arg)
|
|
|
{
|
|
@@ -1399,8 +1142,6 @@ struct testcase_t channel_tests[] = {
|
|
|
{ "incoming", test_channel_incoming, TT_FORK, NULL, NULL },
|
|
|
{ "lifecycle", test_channel_lifecycle, TT_FORK, NULL, NULL },
|
|
|
{ "lifecycle_2", test_channel_lifecycle_2, TT_FORK, NULL, NULL },
|
|
|
- { "multi", test_channel_multi, TT_FORK, NULL, NULL },
|
|
|
- { "queue_size", test_channel_queue_size, TT_FORK, NULL, NULL },
|
|
|
{ "write", test_channel_write, TT_FORK, NULL, NULL },
|
|
|
{ "id_map", test_channel_id_map, TT_FORK, NULL, NULL },
|
|
|
END_OF_TESTCASES
|