commit 904a58d10f144b95a689b35c88f6780371243da8
Merge: d5a5a6a 8a0eedb
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Wed Jul 31 13:51:15 2013 -0400
Merge branch 'bug9288_rebased'
Conflicts:
src/test/test_pt.c
changes/bug9288 | 4 +++
src/common/util.c | 10 +++---
src/common/util.h | 21 ++++++------
src/or/statefile.c | 4 +--
src/or/statefile.h | 2 +-
src/or/transports.c | 28 +++++++++-------
src/or/transports.h | 2 ++
src/test/test_pt.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++
8 files changed, 131 insertions(+), 29 deletions(-)
diff --cc src/or/transports.c
index 15faa98,0bd024f..62cc1a8
--- a/src/or/transports.c
+++ b/src/or/transports.c
@@@ -102,9 -102,10 +102,7 @@@ create_managed_proxy_environment(const
static INLINE int proxy_configuration_finished(const managed_proxy_t *mp);
-static void managed_proxy_destroy(managed_proxy_t *mp,
- int also_terminate_process);
-
static void handle_finished_proxy(managed_proxy_t *mp);
- static void configure_proxy(managed_proxy_t *mp);
-
static void parse_method_error(const char *line, int is_server_method);
#define parse_server_method_error(l) parse_method_error(l, 1)
#define parse_client_method_error(l) parse_method_error(l, 0)
diff --cc src/or/transports.h
index 1c6fc41,7f180a6..7b524f2
--- a/src/or/transports.h
+++ b/src/or/transports.h
@@@ -113,14 -110,9 +113,16 @@@ STATIC int parse_smethod_line(const cha
STATIC int parse_version(const char *line, managed_proxy_t *mp);
STATIC void parse_env_error(const char *line);
STATIC void handle_proxy_line(const char *line, managed_proxy_t *mp);
+STATIC char *get_transport_options_for_server_proxy(const managed_proxy_t *mp);
+
+STATIC void managed_proxy_destroy(managed_proxy_t *mp,
+ int also_terminate_process);
+
+STATIC managed_proxy_t *managed_proxy_create(const smartlist_t *transport_list,
+ char **proxy_argv, int is_server);
+ STATIC int configure_proxy(managed_proxy_t *mp);
+
#endif
#endif
diff --cc src/test/test_pt.c
index ac97cf9,afa4917..f969457
--- a/src/test/test_pt.c
+++ b/src/test/test_pt.c
@@@ -5,11 -5,12 +5,14 @@@
#include "orconfig.h"
#define PT_PRIVATE
+ #define UTIL_PRIVATE
#include "or.h"
+#include "config.h"
+#include "confparse.h"
#include "transports.h"
#include "circuitbuild.h"
+ #include "util.h"
+ #include "statefile.h"
#include "test.h"
static void
@@@ -224,61 -156,98 +227,147 @@@ test_pt_protocol(void
tor_free(mp);
}
+static void
+test_pt_get_extrainfo_string(void *arg)
+{
+ managed_proxy_t *mp1 = NULL, *mp2 = NULL;
+ char **argv1, **argv2;
+ smartlist_t *t1 = smartlist_new(), *t2 = smartlist_new();
+ int r;
+ char *s = NULL;
+ (void) arg;
+
+ argv1 = tor_malloc_zero(sizeof(char*)*3);
+ argv1[0] = tor_strdup("ewige");
+ argv1[1] = tor_strdup("Blumenkraft");
+ argv1[2] = NULL;
+ argv2 = tor_malloc_zero(sizeof(char*)*4);
+ argv2[0] = tor_strdup("und");
+ argv2[1] = tor_strdup("ewige");
+ argv2[2] = tor_strdup("Schlangenkraft");
+ argv2[3] = NULL;
+
+ mp1 = managed_proxy_create(t1, argv1, 1);
+ mp2 = managed_proxy_create(t2, argv2, 1);
+
+ r = parse_smethod_line("SMETHOD hagbard 127.0.0.1:5555", mp1);
+ tt_int_op(r, ==, 0);
+ r = parse_smethod_line("SMETHOD celine 127.0.0.1:1723 ARGS:card=no-enemy",
+ mp2);
+ tt_int_op(r, ==, 0);
+
+ /* Force these proxies to look "completed" or they won't generate output. */
+ mp1->conf_state = mp2->conf_state = PT_PROTO_COMPLETED;
+
+ s = pt_get_extra_info_descriptor_string();
+ tt_assert(s);
+ tt_str_op(s, ==,
+ "transport hagbard 127.0.0.1:5555\n"
+ "transport celine 127.0.0.1:1723 card=no-enemy\n");
+
+ done:
+ /* XXXX clean up better */
+ smartlist_free(t1);
+ smartlist_free(t2);
+ tor_free(s);
+}
+
+ #ifdef _WIN32
+ #define STDIN_HANDLE HANDLE
+ #else
+ #define STDIN_HANDLE FILE
+ #endif
+
+ static smartlist_t *
+ tor_get_lines_from_handle_replacement(STDIN_HANDLE *handle,
+ enum stream_status *stream_status_out)
+ {
+ static int times_called = 0;
+ smartlist_t *retval_sl = smartlist_new();
+
+ (void) handle;
+ (void) stream_status_out;
+
+ /* Generate some dummy CMETHOD lines the first 5 times. The 6th
+ time, send 'CMETHODS DONE' to finish configuring the proxy. */
+ if (times_called++ != 5) {
+ smartlist_add_asprintf(retval_sl, "CMETHOD mock%d socks5 127.0.0.1:555%d",
+ times_called, times_called);
+ } else {
+ smartlist_add(retval_sl, tor_strdup("CMETHODS DONE"));
+ }
+
+ return retval_sl;
+ }
+
+ /* NOP mock */
+ static void
+ tor_process_handle_destroy_replacement(process_handle_t *process_handle,
+ int also_terminate_process)
+ {
+ (void) process_handle;
+ (void) also_terminate_process;
+ }
+
+ static or_state_t *dummy_state = NULL;
+
+ static or_state_t *
+ get_or_state_replacement(void)
+ {
+ return dummy_state;
+ }
+
+ /* Test the configure_proxy() function. */
+ static void
+ test_pt_configure_proxy(void *arg)
+ {
+ int i;
+ managed_proxy_t *mp = NULL;
+ (void) arg;
+
+ dummy_state = tor_malloc_zero(sizeof(or_state_t));
+
+ MOCK(tor_get_lines_from_handle,
+ tor_get_lines_from_handle_replacement);
+ MOCK(tor_process_handle_destroy,
+ tor_process_handle_destroy_replacement);
+ MOCK(get_or_state,
+ get_or_state_replacement);
+
+ mp = tor_malloc(sizeof(managed_proxy_t));
+ mp->conf_state = PT_PROTO_ACCEPTING_METHODS;
+ mp->transports = smartlist_new();
+ mp->transports_to_launch = smartlist_new();
+ mp->process_handle = tor_malloc_zero(sizeof(process_handle_t));
+ mp->argv = tor_malloc_zero(sizeof(char*)*2);
+ mp->argv[0] = tor_strdup("<testcase>");
+
+ /* Test the return value of configure_proxy() by calling it some
+ times while it is uninitialized and then finally finalizing its
+ configuration. */
+ for (i = 0 ; i < 5 ; i++) {
+ test_assert(configure_proxy(mp) == 0);
+ }
+ test_assert(configure_proxy(mp) == 1);
+
+ done:
+ tor_free(dummy_state);
+ UNMOCK(tor_get_lines_from_handle);
+ UNMOCK(tor_process_handle_destroy);
+ }
+
#define PT_LEGACY(name) \
{ #name, legacy_test_helper, 0, &legacy_setup, test_pt_ ## name }
struct testcase_t pt_tests[] = {
PT_LEGACY(parsing),
PT_LEGACY(protocol),
+ { "get_transport_options", test_pt_get_transport_options, TT_FORK,
+ NULL, NULL },
+ { "get_extrainfo_string", test_pt_get_extrainfo_string, TT_FORK,
+ NULL, NULL },
+ { "configure_proxy",test_pt_configure_proxy, TT_FORK,
+ NULL, NULL },
END_OF_TESTCASES
};