[tor-commits] [stegotorus/master] Make 'embed' testable with test_tl (removing globals).
zwol at torproject.org
zwol at torproject.org
Fri Jul 20 23:17:07 UTC 2012
commit 7d121a79b8acbaf1f42807266bac91da1774edd0
Author: Zack Weinberg <zackw at panix.com>
Date: Thu Mar 29 18:54:28 2012 -0700
Make 'embed' testable with test_tl (removing globals).
It still doesn't *work*, but now we have a chance of pinning down why.
One bug flushed out of chop.cc already.
---
Makefile.am | 1 +
src/audit-globals.sh | 3 -
src/protocol/chop.cc | 4 +-
src/steg/embed.cc | 101 ++++++++++++++++++++++---------------------------
src/test/test_tl.py | 10 ++++-
5 files changed, 57 insertions(+), 62 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 377e37f..6ba1b51 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -131,6 +131,7 @@ check-local:
$(AM_V_at) ./unittests
if INTEGRATION_TESTS
@echo --- Integration tests ---
+ [ -e traces ] || ln -s $(srcdir)/traces .
$(AM_V_at) $(PYTHON) -m unittest discover -s $(srcdir)/src/test -p 'test_*.py' -v
else
@echo !!! Integration tests skipped !!!
diff --git a/src/audit-globals.sh b/src/audit-globals.sh
index 99739b3..1768640 100644
--- a/src/audit-globals.sh
+++ b/src/audit-globals.sh
@@ -46,9 +46,6 @@ sed '
/^crypt init_crypto()::initialized$/d
# These are grandfathered; they need to be removed.
- /^steg\/embed embed_init$/d
- /^steg\/embed embed_num_traces$/d
- /^steg\/embed embed_traces$/d
/^steg\/http has_peer_name$/d
/^steg\/http peername$/d
/^steg\/payloads payload_count$/d
diff --git a/src/protocol/chop.cc b/src/protocol/chop.cc
index 06346b7..27e03ab 100644
--- a/src/protocol/chop.cc
+++ b/src/protocol/chop.cc
@@ -771,7 +771,9 @@ chop_circuit_t::send_targeted(chop_conn_t *conn, size_t blocksize)
size_t avail = evbuffer_get_length(xmit_pending);
opcode_t op = op_DAT;
- if (avail > SECTION_LEN)
+ if (avail > blocksize - MIN_BLOCK_SIZE)
+ avail = blocksize - MIN_BLOCK_SIZE;
+ else if (avail > SECTION_LEN)
avail = SECTION_LEN;
else if (upstream_eof && !sent_fin)
// this block will carry the last byte of real data to be sent in
diff --git a/src/steg/embed.cc b/src/steg/embed.cc
index 6559bf7..f24c210 100644
--- a/src/steg/embed.cc
+++ b/src/steg/embed.cc
@@ -4,32 +4,34 @@
#include "steg.h"
#include "rng.h"
+#include <errno.h>
#include <event2/buffer.h>
-#include <event2/event.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <time.h>
+#include <vector>
+
+using std::vector;
namespace {
struct trace_t {
- int num_pkt; // number of packets in trace
- short *pkt_sizes; // packet sizes (positive = client->server)
- int *pkt_times; // packet inter-arrival times
+ vector<short> pkt_sizes; // packet sizes (positive = client->server)
+ vector<int> pkt_times; // packet inter-arrival times
};
struct embed_steg_config_t : steg_config_t {
bool is_clientside;
+ vector<trace_t> traces;
STEG_CONFIG_DECLARE_METHODS(embed);
+
+ size_t get_random_trace() const;
};
struct embed_steg_t : steg_t {
embed_steg_config_t *config;
conn_t *conn;
- int cur_idx; // current trace index
+ int cur_idx; // current trace index
trace_t *cur; // current trace
- int cur_pkt; // current packet in the trace
+ int cur_pkt; // current packet in the trace
struct timeval last_pkt; // time at which last packet was sent/received
embed_steg_t(embed_steg_config_t *cf, conn_t *cn);
@@ -46,10 +48,6 @@ namespace {
STEG_DEFINE_MODULE(embed);
-static int embed_init = 0; // whether traces are initialized
-static int embed_num_traces; // number of traces
-static trace_t *embed_traces; // global array of all traces
-
static int
millis_since(struct timeval *last)
{
@@ -66,6 +64,32 @@ embed_steg_config_t::embed_steg_config_t(config_t *cfg)
: steg_config_t(cfg),
is_clientside(cfg->mode != LSN_SIMPLE_SERVER)
{
+ // read in traces to use for connections
+ FILE *trace_file = fopen("traces/embed.txt", "r");
+ if (!trace_file)
+ log_abort("opening traces/embed.txt: %s", strerror(errno));
+
+ int num_traces;
+ if (fscanf(trace_file, "%d", &num_traces) < 1)
+ log_abort("couldn't read number of traces");
+
+ traces.resize(num_traces);
+
+ for (vector<trace_t>::iterator p = traces.begin(); p != traces.end(); ++p) {
+ int num_pkt;
+ if (fscanf(trace_file, "%d", &num_pkt) < 1)
+ log_abort("couldn't read number of packets in trace %ld",
+ p - traces.begin());
+
+ p->pkt_sizes.resize(num_pkt);
+ p->pkt_times.resize(num_pkt);
+ for (int i = 0; i < num_pkt; i++)
+ if (fscanf(trace_file, "%hd %d", &p->pkt_sizes[i], &p->pkt_times[i]) < 1)
+ log_abort("couldn't read trace entry %ld/%d",
+ p - traces.begin(), i);
+ }
+
+ log_debug("read %d traces", num_traces);
}
embed_steg_config_t::~embed_steg_config_t()
@@ -78,50 +102,17 @@ embed_steg_config_t::steg_create(conn_t *conn)
return new embed_steg_t(this, conn);
}
-static void
-init_embed_traces()
-{
- // read in traces to use for connections
- FILE *trace_file = fopen("traces/embed.txt", "r");
- if (fscanf(trace_file, "%d", &embed_num_traces) < 1) {
- log_abort("couldn't read number of traces to use -- exiting");
- exit(1);
- }
- embed_traces = (trace_t *)xmalloc(sizeof(trace_t) * embed_num_traces);
- for (int i = 0; i < embed_num_traces; i++) {
- int num_pkt;
- if (fscanf(trace_file, "%d", &num_pkt) < 1) {
- log_abort("couldn't read number of packets to use -- exiting");
- exit(1);
- }
- embed_traces[i].num_pkt = num_pkt;
- embed_traces[i].pkt_sizes = (short *)xmalloc(sizeof(short) * num_pkt);
- embed_traces[i].pkt_times = (int *)xmalloc(sizeof(int) * num_pkt);
- for (int j = 0; j < embed_traces[i].num_pkt; j++) {
- if (fscanf(trace_file, "%hd %d",
- &embed_traces[i].pkt_sizes[j],
- &embed_traces[i].pkt_times[j]) < 1) {
- log_abort("couldn't read numbers of packet size and times to use -- exiting");
- exit(1);
- }
- }
- }
- log_debug("read %d traces to use", embed_num_traces);
-
- embed_init = 1;
-}
-
-static int
-get_random_trace()
+size_t
+embed_steg_config_t::get_random_trace() const
{
- return rng_int(embed_num_traces);
+ return rng_int(traces.size());
}
bool
embed_steg_t::advance_packet()
{
cur_pkt++;
- return cur_pkt == cur->num_pkt;
+ return cur_pkt == int(cur->pkt_sizes.size());
}
short
@@ -146,18 +137,16 @@ bool
embed_steg_t::is_finished()
{
if (cur_idx == -1) return true;
- return cur_pkt >= cur->num_pkt;
+ return cur_pkt >= int(cur->pkt_sizes.size());
}
embed_steg_t::embed_steg_t(embed_steg_config_t *cf, conn_t *cn)
: config(cf), conn(cn)
{
- if (!embed_init) init_embed_traces();
-
cur_idx = -1;
if (config->is_clientside) {
- cur_idx = get_random_trace();
- cur = &embed_traces[cur_idx];
+ cur_idx = config->get_random_trace();
+ cur = &config->traces[cur_idx];
cur_pkt = 0;
}
gettimeofday(&last_pkt, NULL);
@@ -243,7 +232,7 @@ embed_steg_t::receive(struct evbuffer *dest)
// if we are receiving the first packet of the trace, read the index
if (cur_idx == -1) {
if (evbuffer_remove(source, &cur_idx, 4) != 4) return -1;
- cur = &embed_traces[cur_idx];
+ cur = &config->traces[cur_idx];
cur_pkt = 0;
pkt_size += 4;
diff --git a/src/test/test_tl.py b/src/test/test_tl.py
index 6d632f8..9987c7d 100644
--- a/src/test/test_tl.py
+++ b/src/test/test_tl.py
@@ -78,8 +78,14 @@ class TimelineTest(object):
"127.0.0.1:5010","nosteg_rr","127.0.0.1:5011","nosteg_rr",
))
- # NOTE: 'embed' steg presently cannot be tested using this system
- # because it runs out of trace data before any of the tests complete.
+ # buggy, disabled
+ #def test_embed(self):
+ # self.doTest("chop",
+ # ("chop", "server", "127.0.0.1:5001",
+ # "127.0.0.1:5010","embed",
+ # "chop", "client", "127.0.0.1:4999",
+ # "127.0.0.1:5010","embed",
+ # ))
# NOTE: 'http' steg presently cannot be tested using this system
# because the trace pools are process-global rather than per-listener.
More information about the tor-commits
mailing list