commit aaf79eb4d334fb5e1f98d0a68b3a30dde983325a
Author: George Kadianakis <desnacked(a)riseup.net>
Date: Mon Jul 29 15:59:59 2013 +0200
Write unit tests for configure_proxy().
---
src/or/transports.c | 4 +--
src/or/transports.h | 2 ++
src/test/test_pt.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 74 insertions(+), 3 deletions(-)
diff --git a/src/or/transports.c b/src/or/transports.c
index 604d9fc..3aced21 100644
--- a/src/or/transports.c
+++ b/src/or/transports.c
@@ -106,8 +106,6 @@ static void managed_proxy_destroy(managed_proxy_t *mp,
int also_terminate_process);
static void handle_finished_proxy(managed_proxy_t *mp);
-static int 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)
@@ -590,7 +588,7 @@ pt_configure_remaining_proxies(void)
* Return 1 if the transport configuration finished, and return 0
* otherwise (if we still have more configuring to do for this
* proxy). */
-static int
+STATIC int
configure_proxy(managed_proxy_t *mp)
{
int configuration_finished = 0;
diff --git a/src/or/transports.h b/src/or/transports.h
index cc3e018..7f180a6 100644
--- a/src/or/transports.h
+++ b/src/or/transports.h
@@ -111,6 +111,8 @@ 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 int configure_proxy(managed_proxy_t *mp);
+
#endif
#endif
diff --git a/src/test/test_pt.c b/src/test/test_pt.c
index 16daa28..6648326 100644
--- a/src/test/test_pt.c
+++ b/src/test/test_pt.c
@@ -5,9 +5,11 @@
#include "orconfig.h"
#define PT_PRIVATE
+#define UTIL_PRIVATE
#include "or.h"
#include "transports.h"
#include "circuitbuild.h"
+#include "util.h"
#include "test.h"
static void
@@ -153,12 +155,81 @@ test_pt_protocol(void)
tor_free(mp);
}
+#ifdef _WIN32
+static smartlist_t *
+tor_get_lines_from_handle_replacement(HANDLE *handle,
+ enum stream_status *stream_status_out)
+#else
+static smartlist_t *
+tor_get_lines_from_handle_replacement(FILE *handle,
+ enum stream_status *stream_status_out)
+#endif
+{
+ (void) handle;
+ (void) stream_status_out;
+ static int times_called = 0;
+
+ smartlist_t *retval_sl = smartlist_new();
+
+ /* 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)
+{
+ return;
+}
+
+/* Test the configure_proxy() function. */
+static void
+test_pt_configure_proxy(void *arg)
+{
+ (void) arg;
+ int i;
+ managed_proxy_t *mp = NULL;
+
+ MOCK(tor_get_lines_from_handle,
+ tor_get_lines_from_handle_replacement);
+ MOCK(tor_process_handle_destroy,
+ tor_process_handle_destroy_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));
+
+ /* 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:
+ 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),
+ { "configure_proxy",test_pt_configure_proxy, TT_FORK,
+ NULL, NULL },
END_OF_TESTCASES
};