Loading src/or/control.c +11 −47 Original line number Diff line number Diff line Loading @@ -52,41 +52,6 @@ * finished authentication and is accepting commands. */ #define STATE_IS_OPEN(s) ((s) == CONTROL_CONN_STATE_OPEN) /* Recognized asynchronous event types. It's okay to expand this list * because it is used both as a list of v0 event types, and as indices * into the bitfield to determine which controllers want which events. */ #define EVENT_MIN_ 0x0001 #define EVENT_CIRCUIT_STATUS 0x0001 #define EVENT_STREAM_STATUS 0x0002 #define EVENT_OR_CONN_STATUS 0x0003 #define EVENT_BANDWIDTH_USED 0x0004 #define EVENT_CIRCUIT_STATUS_MINOR 0x0005 #define EVENT_NEW_DESC 0x0006 #define EVENT_DEBUG_MSG 0x0007 #define EVENT_INFO_MSG 0x0008 #define EVENT_NOTICE_MSG 0x0009 #define EVENT_WARN_MSG 0x000A #define EVENT_ERR_MSG 0x000B #define EVENT_ADDRMAP 0x000C // #define EVENT_AUTHDIR_NEWDESCS 0x000D #define EVENT_DESCCHANGED 0x000E // #define EVENT_NS 0x000F #define EVENT_STATUS_CLIENT 0x0010 #define EVENT_STATUS_SERVER 0x0011 #define EVENT_STATUS_GENERAL 0x0012 #define EVENT_GUARD 0x0013 #define EVENT_STREAM_BANDWIDTH_USED 0x0014 #define EVENT_CLIENTS_SEEN 0x0015 #define EVENT_NEWCONSENSUS 0x0016 #define EVENT_BUILDTIMEOUT_SET 0x0017 #define EVENT_SIGNAL 0x0018 #define EVENT_CONF_CHANGED 0x0019 #define EVENT_TRANSPORT_LAUNCHED 0x0020 #define EVENT_MAX_ 0x0020 /* If EVENT_MAX_ ever hits 0x0040, we need to make the mask into a * different structure. */ /** Bitfield: The bit 1<<e is set if <b>any</b> open control * connection is interested in events of type <b>e</b>. We use this * so that we can decide to skip generating event messages that nobody Loading Loading @@ -132,15 +97,6 @@ static uint8_t *authentication_cookie = NULL; * of this so we can respond to getinfo status/bootstrap-phase queries. */ static char last_sent_bootstrap_message[BOOTSTRAP_MSG_LEN]; /** Flag for event_format_t. Indicates that we should use the one standard format. */ #define ALL_FORMATS 1 /** Bit field of flags to select how to format a controller event. Recognized * flag is ALL_FORMATS. */ typedef int event_format_t; static void connection_printf_to_buf(control_connection_t *conn, const char *format, ...) CHECK_PRINTF(2,3); Loading Loading @@ -594,9 +550,9 @@ send_control_done(control_connection_t *conn) * * The EXTENDED_FORMAT and NONEXTENDED_FORMAT flags behave similarly with * respect to the EXTENDED_EVENTS feature. */ static void send_control_event_string(uint16_t event, event_format_t which, const char *msg) MOCK_IMPL(STATIC void, send_control_event_string,(uint16_t event, event_format_t which, const char *msg)) { smartlist_t *conns = get_connection_array(); (void)which; Loading Loading @@ -4763,3 +4719,11 @@ control_free_all(void) tor_free(authentication_cookie); } #ifdef TOR_UNIT_TESTS /* For testing: change the value of global_event_mask */ void control_testing_set_global_event_mask(uint64_t mask) { global_event_mask = mask; } #endif src/or/control.h +52 −0 Original line number Diff line number Diff line Loading @@ -96,9 +96,61 @@ void control_event_transport_launched(const char *mode, void control_free_all(void); #ifdef CONTROL_PRIVATE /* Recognized asynchronous event types. It's okay to expand this list * because it is used both as a list of v0 event types, and as indices * into the bitfield to determine which controllers want which events. */ #define EVENT_MIN_ 0x0001 #define EVENT_CIRCUIT_STATUS 0x0001 #define EVENT_STREAM_STATUS 0x0002 #define EVENT_OR_CONN_STATUS 0x0003 #define EVENT_BANDWIDTH_USED 0x0004 #define EVENT_CIRCUIT_STATUS_MINOR 0x0005 #define EVENT_NEW_DESC 0x0006 #define EVENT_DEBUG_MSG 0x0007 #define EVENT_INFO_MSG 0x0008 #define EVENT_NOTICE_MSG 0x0009 #define EVENT_WARN_MSG 0x000A #define EVENT_ERR_MSG 0x000B #define EVENT_ADDRMAP 0x000C /* Exposed above */ // #define EVENT_AUTHDIR_NEWDESCS 0x000D #define EVENT_DESCCHANGED 0x000E /* Exposed above */ // #define EVENT_NS 0x000F #define EVENT_STATUS_CLIENT 0x0010 #define EVENT_STATUS_SERVER 0x0011 #define EVENT_STATUS_GENERAL 0x0012 #define EVENT_GUARD 0x0013 #define EVENT_STREAM_BANDWIDTH_USED 0x0014 #define EVENT_CLIENTS_SEEN 0x0015 #define EVENT_NEWCONSENSUS 0x0016 #define EVENT_BUILDTIMEOUT_SET 0x0017 #define EVENT_SIGNAL 0x0018 #define EVENT_CONF_CHANGED 0x0019 #define EVENT_TRANSPORT_LAUNCHED 0x0020 #define EVENT_MAX_ 0x0020 /* If EVENT_MAX_ ever hits 0x0040, we need to make the mask into a * different structure. */ /* Used only by control.c and test.c */ STATIC size_t write_escaped_data(const char *data, size_t len, char **out); STATIC size_t read_escaped_data(const char *data, size_t len, char **out); /** Flag for event_format_t. Indicates that we should use the one standard format. (Other formats previous existed, and are now deprecated) */ #define ALL_FORMATS 1 /** Bit field of flags to select how to format a controller event. Recognized * flag is ALL_FORMATS. */ typedef int event_format_t; #ifdef TOR_UNIT_TESTS MOCK_DECL(STATIC void, send_control_event_string,(uint16_t event, event_format_t which, const char *msg)); void control_testing_set_global_event_mask(uint64_t mask); #endif #endif #endif Loading src/test/test_pt.c +44 −0 Original line number Diff line number Diff line Loading @@ -7,9 +7,11 @@ #define PT_PRIVATE #define UTIL_PRIVATE #define STATEFILE_PRIVATE #define CONTROL_PRIVATE #include "or.h" #include "config.h" #include "confparse.h" #include "control.h" #include "transports.h" #include "circuitbuild.h" #include "util.h" Loading Loading @@ -318,6 +320,22 @@ get_or_state_replacement(void) return dummy_state; } static int controlevent_n = 0; static uint16_t controlevent_event = 0; static smartlist_t *controlevent_msgs = NULL; static void send_control_event_string_replacement(uint16_t event, event_format_t which, const char *msg) { (void) which; ++controlevent_n; controlevent_event = event; if (!controlevent_msgs) controlevent_msgs = smartlist_new(); smartlist_add(controlevent_msgs, tor_strdup(msg)); } /* Test the configure_proxy() function. */ static void test_pt_configure_proxy(void *arg) Loading @@ -334,6 +352,10 @@ test_pt_configure_proxy(void *arg) tor_process_handle_destroy_replacement); MOCK(get_or_state, get_or_state_replacement); MOCK(send_control_event_string, send_control_event_string_replacement); control_testing_set_global_event_mask(EVENT_TRANSPORT_LAUNCHED); mp = tor_malloc(sizeof(managed_proxy_t)); mp->conf_state = PT_PROTO_ACCEPTING_METHODS; Loading Loading @@ -364,6 +386,21 @@ test_pt_configure_proxy(void *arg) /* check the mp state */ test_assert(mp->conf_state == PT_PROTO_COMPLETED); tt_int_op(controlevent_n, ==, 5); tt_int_op(controlevent_event, ==, EVENT_TRANSPORT_LAUNCHED); tt_int_op(smartlist_len(controlevent_msgs), ==, 5); smartlist_sort_strings(controlevent_msgs); tt_str_op(smartlist_get(controlevent_msgs, 0), ==, "650 TRANSPORT_LAUNCHED server mock1 127.0.0.1 5551\r\n"); tt_str_op(smartlist_get(controlevent_msgs, 1), ==, "650 TRANSPORT_LAUNCHED server mock2 127.0.0.1 5552\r\n"); tt_str_op(smartlist_get(controlevent_msgs, 2), ==, "650 TRANSPORT_LAUNCHED server mock3 127.0.0.1 5553\r\n"); tt_str_op(smartlist_get(controlevent_msgs, 3), ==, "650 TRANSPORT_LAUNCHED server mock4 127.0.0.1 5554\r\n"); tt_str_op(smartlist_get(controlevent_msgs, 4), ==, "650 TRANSPORT_LAUNCHED server mock5 127.0.0.1 5555\r\n"); { /* check that the transport info were saved properly in the tor state */ config_line_t *transport_in_state = NULL; smartlist_t *transport_info_sl = smartlist_new(); Loading @@ -389,6 +426,13 @@ test_pt_configure_proxy(void *arg) tor_free(dummy_state); UNMOCK(tor_get_lines_from_handle); UNMOCK(tor_process_handle_destroy); UNMOCK(get_or_state); UNMOCK(send_control_event_string); if (controlevent_msgs) { SMARTLIST_FOREACH(controlevent_msgs, char *, cp, tor_free(cp)); smartlist_free(controlevent_msgs); controlevent_msgs = NULL; } } #define PT_LEGACY(name) \ Loading Loading
src/or/control.c +11 −47 Original line number Diff line number Diff line Loading @@ -52,41 +52,6 @@ * finished authentication and is accepting commands. */ #define STATE_IS_OPEN(s) ((s) == CONTROL_CONN_STATE_OPEN) /* Recognized asynchronous event types. It's okay to expand this list * because it is used both as a list of v0 event types, and as indices * into the bitfield to determine which controllers want which events. */ #define EVENT_MIN_ 0x0001 #define EVENT_CIRCUIT_STATUS 0x0001 #define EVENT_STREAM_STATUS 0x0002 #define EVENT_OR_CONN_STATUS 0x0003 #define EVENT_BANDWIDTH_USED 0x0004 #define EVENT_CIRCUIT_STATUS_MINOR 0x0005 #define EVENT_NEW_DESC 0x0006 #define EVENT_DEBUG_MSG 0x0007 #define EVENT_INFO_MSG 0x0008 #define EVENT_NOTICE_MSG 0x0009 #define EVENT_WARN_MSG 0x000A #define EVENT_ERR_MSG 0x000B #define EVENT_ADDRMAP 0x000C // #define EVENT_AUTHDIR_NEWDESCS 0x000D #define EVENT_DESCCHANGED 0x000E // #define EVENT_NS 0x000F #define EVENT_STATUS_CLIENT 0x0010 #define EVENT_STATUS_SERVER 0x0011 #define EVENT_STATUS_GENERAL 0x0012 #define EVENT_GUARD 0x0013 #define EVENT_STREAM_BANDWIDTH_USED 0x0014 #define EVENT_CLIENTS_SEEN 0x0015 #define EVENT_NEWCONSENSUS 0x0016 #define EVENT_BUILDTIMEOUT_SET 0x0017 #define EVENT_SIGNAL 0x0018 #define EVENT_CONF_CHANGED 0x0019 #define EVENT_TRANSPORT_LAUNCHED 0x0020 #define EVENT_MAX_ 0x0020 /* If EVENT_MAX_ ever hits 0x0040, we need to make the mask into a * different structure. */ /** Bitfield: The bit 1<<e is set if <b>any</b> open control * connection is interested in events of type <b>e</b>. We use this * so that we can decide to skip generating event messages that nobody Loading Loading @@ -132,15 +97,6 @@ static uint8_t *authentication_cookie = NULL; * of this so we can respond to getinfo status/bootstrap-phase queries. */ static char last_sent_bootstrap_message[BOOTSTRAP_MSG_LEN]; /** Flag for event_format_t. Indicates that we should use the one standard format. */ #define ALL_FORMATS 1 /** Bit field of flags to select how to format a controller event. Recognized * flag is ALL_FORMATS. */ typedef int event_format_t; static void connection_printf_to_buf(control_connection_t *conn, const char *format, ...) CHECK_PRINTF(2,3); Loading Loading @@ -594,9 +550,9 @@ send_control_done(control_connection_t *conn) * * The EXTENDED_FORMAT and NONEXTENDED_FORMAT flags behave similarly with * respect to the EXTENDED_EVENTS feature. */ static void send_control_event_string(uint16_t event, event_format_t which, const char *msg) MOCK_IMPL(STATIC void, send_control_event_string,(uint16_t event, event_format_t which, const char *msg)) { smartlist_t *conns = get_connection_array(); (void)which; Loading Loading @@ -4763,3 +4719,11 @@ control_free_all(void) tor_free(authentication_cookie); } #ifdef TOR_UNIT_TESTS /* For testing: change the value of global_event_mask */ void control_testing_set_global_event_mask(uint64_t mask) { global_event_mask = mask; } #endif
src/or/control.h +52 −0 Original line number Diff line number Diff line Loading @@ -96,9 +96,61 @@ void control_event_transport_launched(const char *mode, void control_free_all(void); #ifdef CONTROL_PRIVATE /* Recognized asynchronous event types. It's okay to expand this list * because it is used both as a list of v0 event types, and as indices * into the bitfield to determine which controllers want which events. */ #define EVENT_MIN_ 0x0001 #define EVENT_CIRCUIT_STATUS 0x0001 #define EVENT_STREAM_STATUS 0x0002 #define EVENT_OR_CONN_STATUS 0x0003 #define EVENT_BANDWIDTH_USED 0x0004 #define EVENT_CIRCUIT_STATUS_MINOR 0x0005 #define EVENT_NEW_DESC 0x0006 #define EVENT_DEBUG_MSG 0x0007 #define EVENT_INFO_MSG 0x0008 #define EVENT_NOTICE_MSG 0x0009 #define EVENT_WARN_MSG 0x000A #define EVENT_ERR_MSG 0x000B #define EVENT_ADDRMAP 0x000C /* Exposed above */ // #define EVENT_AUTHDIR_NEWDESCS 0x000D #define EVENT_DESCCHANGED 0x000E /* Exposed above */ // #define EVENT_NS 0x000F #define EVENT_STATUS_CLIENT 0x0010 #define EVENT_STATUS_SERVER 0x0011 #define EVENT_STATUS_GENERAL 0x0012 #define EVENT_GUARD 0x0013 #define EVENT_STREAM_BANDWIDTH_USED 0x0014 #define EVENT_CLIENTS_SEEN 0x0015 #define EVENT_NEWCONSENSUS 0x0016 #define EVENT_BUILDTIMEOUT_SET 0x0017 #define EVENT_SIGNAL 0x0018 #define EVENT_CONF_CHANGED 0x0019 #define EVENT_TRANSPORT_LAUNCHED 0x0020 #define EVENT_MAX_ 0x0020 /* If EVENT_MAX_ ever hits 0x0040, we need to make the mask into a * different structure. */ /* Used only by control.c and test.c */ STATIC size_t write_escaped_data(const char *data, size_t len, char **out); STATIC size_t read_escaped_data(const char *data, size_t len, char **out); /** Flag for event_format_t. Indicates that we should use the one standard format. (Other formats previous existed, and are now deprecated) */ #define ALL_FORMATS 1 /** Bit field of flags to select how to format a controller event. Recognized * flag is ALL_FORMATS. */ typedef int event_format_t; #ifdef TOR_UNIT_TESTS MOCK_DECL(STATIC void, send_control_event_string,(uint16_t event, event_format_t which, const char *msg)); void control_testing_set_global_event_mask(uint64_t mask); #endif #endif #endif Loading
src/test/test_pt.c +44 −0 Original line number Diff line number Diff line Loading @@ -7,9 +7,11 @@ #define PT_PRIVATE #define UTIL_PRIVATE #define STATEFILE_PRIVATE #define CONTROL_PRIVATE #include "or.h" #include "config.h" #include "confparse.h" #include "control.h" #include "transports.h" #include "circuitbuild.h" #include "util.h" Loading Loading @@ -318,6 +320,22 @@ get_or_state_replacement(void) return dummy_state; } static int controlevent_n = 0; static uint16_t controlevent_event = 0; static smartlist_t *controlevent_msgs = NULL; static void send_control_event_string_replacement(uint16_t event, event_format_t which, const char *msg) { (void) which; ++controlevent_n; controlevent_event = event; if (!controlevent_msgs) controlevent_msgs = smartlist_new(); smartlist_add(controlevent_msgs, tor_strdup(msg)); } /* Test the configure_proxy() function. */ static void test_pt_configure_proxy(void *arg) Loading @@ -334,6 +352,10 @@ test_pt_configure_proxy(void *arg) tor_process_handle_destroy_replacement); MOCK(get_or_state, get_or_state_replacement); MOCK(send_control_event_string, send_control_event_string_replacement); control_testing_set_global_event_mask(EVENT_TRANSPORT_LAUNCHED); mp = tor_malloc(sizeof(managed_proxy_t)); mp->conf_state = PT_PROTO_ACCEPTING_METHODS; Loading Loading @@ -364,6 +386,21 @@ test_pt_configure_proxy(void *arg) /* check the mp state */ test_assert(mp->conf_state == PT_PROTO_COMPLETED); tt_int_op(controlevent_n, ==, 5); tt_int_op(controlevent_event, ==, EVENT_TRANSPORT_LAUNCHED); tt_int_op(smartlist_len(controlevent_msgs), ==, 5); smartlist_sort_strings(controlevent_msgs); tt_str_op(smartlist_get(controlevent_msgs, 0), ==, "650 TRANSPORT_LAUNCHED server mock1 127.0.0.1 5551\r\n"); tt_str_op(smartlist_get(controlevent_msgs, 1), ==, "650 TRANSPORT_LAUNCHED server mock2 127.0.0.1 5552\r\n"); tt_str_op(smartlist_get(controlevent_msgs, 2), ==, "650 TRANSPORT_LAUNCHED server mock3 127.0.0.1 5553\r\n"); tt_str_op(smartlist_get(controlevent_msgs, 3), ==, "650 TRANSPORT_LAUNCHED server mock4 127.0.0.1 5554\r\n"); tt_str_op(smartlist_get(controlevent_msgs, 4), ==, "650 TRANSPORT_LAUNCHED server mock5 127.0.0.1 5555\r\n"); { /* check that the transport info were saved properly in the tor state */ config_line_t *transport_in_state = NULL; smartlist_t *transport_info_sl = smartlist_new(); Loading @@ -389,6 +426,13 @@ test_pt_configure_proxy(void *arg) tor_free(dummy_state); UNMOCK(tor_get_lines_from_handle); UNMOCK(tor_process_handle_destroy); UNMOCK(get_or_state); UNMOCK(send_control_event_string); if (controlevent_msgs) { SMARTLIST_FOREACH(controlevent_msgs, char *, cp, tor_free(cp)); smartlist_free(controlevent_msgs); controlevent_msgs = NULL; } } #define PT_LEGACY(name) \ Loading