From ddf9529d37056f8817825f6265c27d8070123013 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 23 Dec 2016 11:28:48 -0500 Subject: [PATCH] lib: Add istream-jsonstr unit test. --- src/lib/Makefile.am | 1 + src/lib/test-istream-jsonstr.c | 87 ++++++++++++++++++++++++++++++++++ src/lib/test-lib.inc | 1 + 3 files changed, 89 insertions(+) create mode 100644 src/lib/test-istream-jsonstr.c diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 5a7d19d4f8..8d195b26a0 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -340,6 +340,7 @@ test_lib_SOURCES = \ test-istream-concat.c \ test-istream-crlf.c \ test-istream-failure-at.c \ + test-istream-jsonstr.c \ test-istream-seekable.c \ test-istream-tee.c \ test-istream-unix.c \ diff --git a/src/lib/test-istream-jsonstr.c b/src/lib/test-istream-jsonstr.c new file mode 100644 index 0000000000..e4f163840a --- /dev/null +++ b/src/lib/test-istream-jsonstr.c @@ -0,0 +1,87 @@ +/* Copyright (c) 2016 Dovecot authors, see the included COPYING file */ + +#include "test-lib.h" +#include "str.h" +#include "istream-private.h" +#include "istream-jsonstr.h" + +static const struct { + const char *input; + const char *output; + int stream_errno; +} tests[] = { + { "foo\\\\\\\"\\b\\f\\n\\r\\t\\u0001\\uffff\"", + "foo\\\"\b\f\n\r\t\001\xEF\xBF\xBF", 0 }, + { "\"", "", 0 }, + { "foo\\?\"", "foo", EINVAL }, + { "foo\\?\"", "foo", EINVAL }, +}; + +static void +run_test(const char *json_input, const char *output, int stream_errno) +{ + size_t json_input_len = strlen(json_input); + struct istream *input_data, *input; + const unsigned char *data; + size_t i, size; + ssize_t ret = 0; + + input_data = test_istream_create_data(json_input, json_input_len); + test_istream_set_allow_eof(input_data, FALSE); + input = i_stream_create_jsonstr(input_data); + + for (i = 1; i < json_input_len; i++) { + test_istream_set_size(input_data, i); + while ((ret = i_stream_read(input)) > 0) ; + if (ret == -1 && stream_errno != 0) + break; + test_assert_idx(ret == 0, i); + } + test_istream_set_allow_eof(input_data, TRUE); + test_istream_set_size(input_data, json_input_len); + ret = i_stream_read(input); + while (ret > 0 && stream_errno != 0) + ret = i_stream_read(input); + test_assert(ret == -1); + test_assert(input->stream_errno == stream_errno); + + data = i_stream_get_data(input, &size); + test_assert(size == strlen(output)); + if (size > 0) + test_assert(memcmp(data, output, size) == 0); + i_stream_unref(&input); + i_stream_unref(&input_data); +} + +static void test_istream_jsonstr_autoretry(void) +{ + const char *json_input = "\\u0001\""; + const size_t json_input_len = strlen(json_input); + struct istream *input_data, *input; + + test_begin("istream-jsonstr autoretry"); + input_data = test_istream_create_data(json_input, json_input_len); + input = i_stream_create_jsonstr(input_data); + + test_istream_set_size(input_data, 2); + test_assert(i_stream_read(input_data) == 2); + test_istream_set_size(input_data, json_input_len); + test_assert(i_stream_read(input) == 1); + test_assert(i_stream_read(input) == -1); + + i_stream_unref(&input); + i_stream_unref(&input_data); + test_end(); +} + +void test_istream_jsonstr(void) +{ + unsigned int i; + + for (i = 0; i < N_ELEMENTS(tests); i++) { + test_begin(t_strdup_printf("istream-jsonstr %u", i+1)); + run_test(tests[i].input, tests[i].output, tests[i].stream_errno); + test_end(); + } + test_istream_jsonstr_autoretry(); +} diff --git a/src/lib/test-lib.inc b/src/lib/test-lib.inc index 10d6a8364a..e99348b9fa 100644 --- a/src/lib/test-lib.inc +++ b/src/lib/test-lib.inc @@ -32,6 +32,7 @@ TEST(test_istream_chain) TEST(test_istream_concat) TEST(test_istream_crlf) TEST(test_istream_failure_at) +TEST(test_istream_jsonstr) TEST(test_istream_seekable) TEST(test_istream_tee) TEST(test_istream_unix)