[tor-commits] [tor/master] Test support for multiple compression backends in the buffer code.
nickm at torproject.org
nickm at torproject.org
Thu Apr 27 14:14:11 UTC 2017
commit e0a3819dcc5e0fa88da2c8edfb28c7db7a9d75e1
Author: Alexander Færøy <ahf at torproject.org>
Date: Thu Apr 27 13:52:33 2017 +0200
Test support for multiple compression backends in the buffer code.
This patch refactors the buffer compression tests to support multiple
comprssion backends.
See: https://bugs.torproject.org/22085
---
src/test/test_buffers.c | 146 +++++++++++++++++++++++++++---------------------
1 file changed, 83 insertions(+), 63 deletions(-)
diff --git a/src/test/test_buffers.c b/src/test/test_buffers.c
index 43582d1..bb24e7c 100644
--- a/src/test/test_buffers.c
+++ b/src/test/test_buffers.c
@@ -578,7 +578,62 @@ test_buffer_time_tracking(void *arg)
}
static void
-test_buffers_zlib_impl(int finalize_with_nil)
+test_buffers_compress_fin_at_chunk_end_impl(compress_method_t method,
+ compression_level_t level)
+{
+ char *msg = NULL;
+ char *contents = NULL;
+ char *expanded = NULL;
+ buf_t *buf = NULL;
+ tor_compress_state_t *compress_state = NULL;
+ size_t out_len, in_len;
+ size_t sz, headerjunk;
+
+ buf = buf_new_with_capacity(128); /* will round up */
+ sz = buf_get_default_chunk_size(buf);
+ msg = tor_malloc_zero(sz);
+
+ write_to_buf(msg, 1, buf);
+ tt_assert(buf->head);
+
+ /* Fill up the chunk so the compression stuff won't fit in one chunk. */
+ tt_uint_op(buf->head->memlen, OP_LT, sz);
+ headerjunk = buf->head->memlen - 7;
+ write_to_buf(msg, headerjunk-1, buf);
+ tt_uint_op(buf->head->datalen, OP_EQ, headerjunk);
+ tt_uint_op(buf_datalen(buf), OP_EQ, headerjunk);
+ /* Write an empty string, with finalization on. */
+ compress_state = tor_compress_new(1, method, level);
+ tt_int_op(write_to_buf_compress(buf, compress_state, "", 0, 1), OP_EQ, 0);
+
+ in_len = buf_datalen(buf);
+ contents = tor_malloc(in_len);
+
+ tt_int_op(fetch_from_buf(contents, in_len, buf), OP_EQ, 0);
+
+ tt_uint_op(in_len, OP_GT, headerjunk);
+
+ tt_int_op(0, OP_EQ, tor_uncompress(&expanded, &out_len,
+ contents + headerjunk,
+ in_len - headerjunk,
+ method, 1,
+ LOG_WARN));
+
+ tt_int_op(out_len, OP_EQ, 0);
+ tt_assert(expanded);
+
+ done:
+ buf_free(buf);
+ tor_compress_free(compress_state);
+ tor_free(contents);
+ tor_free(expanded);
+ tor_free(msg);
+}
+
+static void
+test_buffers_compress_impl(compress_method_t method,
+ compression_level_t level,
+ int finalize_with_nil)
{
char *msg = NULL;
char *contents = NULL;
@@ -589,7 +644,7 @@ test_buffers_zlib_impl(int finalize_with_nil)
int done;
buf = buf_new_with_capacity(128); /* will round up */
- compress_state = tor_compress_new(1, ZLIB_METHOD, HIGH_COMPRESSION);
+ compress_state = tor_compress_new(1, method, level);
msg = tor_malloc(512);
crypto_rand(msg, 512);
@@ -613,7 +668,7 @@ test_buffers_zlib_impl(int finalize_with_nil)
tt_int_op(0, OP_EQ, tor_uncompress(&expanded, &out_len,
contents, in_len,
- ZLIB_METHOD, 1,
+ method, 1,
LOG_WARN));
tt_int_op(out_len, OP_GE, 128);
@@ -632,69 +687,37 @@ test_buffers_zlib_impl(int finalize_with_nil)
}
static void
-test_buffers_zlib(void *arg)
+test_buffers_compress(void *arg)
{
(void) arg;
- test_buffers_zlib_impl(0);
-}
-static void
-test_buffers_zlib_fin_with_nil(void *arg)
-{
- (void) arg;
- test_buffers_zlib_impl(1);
-}
-
-static void
-test_buffers_zlib_fin_at_chunk_end(void *arg)
-{
- char *msg = NULL;
- char *contents = NULL;
- char *expanded = NULL;
- buf_t *buf = NULL;
- tor_compress_state_t *compress_state = NULL;
- size_t out_len, in_len;
- size_t sz, headerjunk;
- (void) arg;
-
- buf = buf_new_with_capacity(128); /* will round up */
- sz = buf_get_default_chunk_size(buf);
- msg = tor_malloc_zero(sz);
-
- write_to_buf(msg, 1, buf);
- tt_assert(buf->head);
-
- /* Fill up the chunk so the zlib stuff won't fit in one chunk. */
- tt_uint_op(buf->head->memlen, OP_LT, sz);
- headerjunk = buf->head->memlen - 7;
- write_to_buf(msg, headerjunk-1, buf);
- tt_uint_op(buf->head->datalen, OP_EQ, headerjunk);
- tt_uint_op(buf_datalen(buf), OP_EQ, headerjunk);
- /* Write an empty string, with finalization on. */
- compress_state = tor_compress_new(1, ZLIB_METHOD, HIGH_COMPRESSION);
- tt_int_op(write_to_buf_compress(buf, compress_state, "", 0, 1), OP_EQ, 0);
-
- in_len = buf_datalen(buf);
- contents = tor_malloc(in_len);
+ compress_method_t methods[] = {
+ GZIP_METHOD,
+ ZLIB_METHOD,
+ LZMA_METHOD,
+ ZSTD_METHOD
+ };
- tt_int_op(fetch_from_buf(contents, in_len, buf), OP_EQ, 0);
+ compression_level_t levels[] = {
+ BEST_COMPRESSION,
+ HIGH_COMPRESSION,
+ MEDIUM_COMPRESSION,
+ LOW_COMPRESSION
+ };
- tt_uint_op(in_len, OP_GT, headerjunk);
+ for (unsigned m = 0; m < ARRAY_LENGTH(methods); ++m) {
+ compress_method_t method = methods[m];
- tt_int_op(0, OP_EQ, tor_uncompress(&expanded, &out_len,
- contents + headerjunk,
- in_len - headerjunk,
- ZLIB_METHOD, 1,
- LOG_WARN));
+ if (! tor_compress_supports_method(method))
+ continue;
- tt_int_op(out_len, OP_EQ, 0);
- tt_assert(expanded);
+ for (unsigned l = 0; l < ARRAY_LENGTH(levels); ++l) {
+ compression_level_t level = levels[l];
- done:
- buf_free(buf);
- tor_compress_free(compress_state);
- tor_free(contents);
- tor_free(expanded);
- tor_free(msg);
+ test_buffers_compress_impl(method, level, 0);
+ test_buffers_compress_impl(method, level, 1);
+ test_buffers_compress_fin_at_chunk_end_impl(method, level);
+ }
+ }
}
static const uint8_t *tls_read_ptr;
@@ -821,10 +844,7 @@ struct testcase_t buffer_tests[] = {
{ "allocation_tracking", test_buffer_allocation_tracking, TT_FORK,
NULL, NULL },
{ "time_tracking", test_buffer_time_tracking, TT_FORK, NULL, NULL },
- { "zlib", test_buffers_zlib, TT_FORK, NULL, NULL },
- { "zlib_fin_with_nil", test_buffers_zlib_fin_with_nil, TT_FORK, NULL, NULL },
- { "zlib_fin_at_chunk_end", test_buffers_zlib_fin_at_chunk_end, TT_FORK,
- NULL, NULL},
+ { "compress", test_buffers_compress, TT_FORK, NULL, NULL },
{ "tls_read_mocked", test_buffers_tls_read_mocked, 0,
NULL, NULL },
{ "chunk_size", test_buffers_chunk_size, 0, NULL, NULL },
More information about the tor-commits
mailing list