void command_setup_listener(channel_listener_t *listener) { tor_assert(listener); tor_assert(listener->state == CHANNEL_LISTENER_STATE_LISTENING); channel_listener_set_listener_fn(listener, command_handle_incoming_channel); }
static void test_channel_listener(void *arg) { int old_count; time_t now = time(NULL); channel_listener_t *chan = NULL; (void) arg; chan = tor_malloc_zero(sizeof(*chan)); tt_assert(chan); channel_init_listener(chan); tt_u64_op(chan->global_identifier, OP_EQ, 1); tt_int_op(chan->timestamp_created, OP_GE, now); chan->close = test_chan_listener_close; /* Register it. At this point, it is not open so it will be put in the * finished list. */ channel_listener_register(chan); tt_int_op(chan->registered, OP_EQ, 1); channel_listener_unregister(chan); /* Register it as listening now thus active. */ chan->state = CHANNEL_LISTENER_STATE_LISTENING; channel_listener_register(chan); tt_int_op(chan->registered, OP_EQ, 1); /* Set the listener function. */ channel_listener_set_listener_fn(chan, test_chan_listener_fn); tt_ptr_op(chan->listener, OP_EQ, test_chan_listener_fn); /* Put a channel in the listener incoming list and queue it. * function. By doing this, the listener() handler will be called. */ channel_t *in_chan = new_fake_channel(); old_count = test_chan_listener_fn_called; channel_listener_queue_incoming(chan, in_chan); free_fake_channel(in_chan); tt_int_op(test_chan_listener_fn_called, OP_EQ, old_count + 1); /* Put listener channel in CLOSING state. */ old_count = test_chan_listener_close_fn_called; channel_listener_mark_for_close(chan); tt_int_op(test_chan_listener_close_fn_called, OP_EQ, old_count + 1); channel_listener_change_state(chan, CHANNEL_LISTENER_STATE_CLOSED); /* Dump stats so we at least hit the code path. */ chan->describe_transport = test_chan_listener_describe_transport; /* There is a check for "now > timestamp_created" when dumping the stats so * make sure we go in. */ chan->timestamp_created = now - 10; channel_listener_dump_statistics(chan, LOG_INFO); done: channel_free_all(); }