bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2016-2018 Dovecot authors, see the included COPYING file */
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi#include "test-lib.h"
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi#include "str.h"
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi#include "ostream.h"
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi#include "ostream-escaped.h"
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi#include "json-parser.h"
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomistatic void test_ostream_escaped_json(void)
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi{
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi struct ostream *os_sink;
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi struct ostream *os_encode;
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi struct const_iovec iov[2];
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi string_t *str = t_str_new(64);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_begin("test_ostream_escaped_json()");
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi os_sink = o_stream_create_buffer(str);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi os_encode = o_stream_create_escaped(os_sink, ostream_escaped_json_format);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi /* test sending iovec */
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi iov[0].iov_base = "hello";
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi iov[0].iov_len = 5;
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi iov[1].iov_base = ", world";
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi iov[1].iov_len = 7;
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_assert(o_stream_sendv(os_encode, iov, 2) == 12);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_assert(os_encode->offset == 12);
bcab95c672604588f1645e4a52e43f52ee567593Timo Sirainen test_assert(os_sink->offset == 12);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_assert(strcmp(str_c(str), "hello, world") == 0);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi /* reset buffer */
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi str_truncate(str, 0); os_sink->offset = 0; os_encode->offset = 0;
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi /* test shrinking ostream-escaped's max buffer size */
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi o_stream_set_max_buffer_size(os_encode, 10);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi o_stream_set_max_buffer_size(os_sink, 100);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_assert(o_stream_send(os_encode, "\x15\x00!\x00\x15\x11" "123456", 12) == 12);
bcab95c672604588f1645e4a52e43f52ee567593Timo Sirainen test_assert(os_encode->offset == 12);
bcab95c672604588f1645e4a52e43f52ee567593Timo Sirainen test_assert(os_sink->offset == 2*6 + 1 + 3*6 + 6);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_assert(strcmp(str_c(str), "\\u0015\\u0000!\\u0000\\u0015\\u0011123456") == 0);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi /* reset buffer */
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi str_truncate(str, 0); os_sink->offset = 0; os_encode->offset = 0;
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi /* test shrinking sink's max buffer size */
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi o_stream_set_max_buffer_size(os_encode, 100);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi o_stream_set_max_buffer_size(os_sink, 10);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi const char *partial_input = "\x15!\x01?#&";
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi ssize_t ret = o_stream_send_str(os_encode, partial_input);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_assert(ret < 6);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi /* send the rest */
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi o_stream_set_max_buffer_size(os_sink, 100);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi ret += o_stream_send_str(os_encode, partial_input + ret);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_assert(ret == (ssize_t)strlen(partial_input));
bcab95c672604588f1645e4a52e43f52ee567593Timo Sirainen test_assert((ssize_t)os_encode->offset == ret);
bcab95c672604588f1645e4a52e43f52ee567593Timo Sirainen test_assert(os_sink->offset == str_len(str));
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_assert(strcmp(str_c(str), "\\u0015!\\u0001?#&") == 0);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi o_stream_unref(&os_encode);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi o_stream_unref(&os_sink);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_end();
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi}
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomistatic void test_ostream_escaped_hex(void)
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi{
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi struct ostream *os_sink;
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi struct ostream *os_encode;
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi string_t *str = t_str_new(64);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi os_sink = o_stream_create_buffer(str);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi os_encode = o_stream_create_escaped(os_sink, ostream_escaped_hex_format);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_begin("test_ostream_escaped_hex()");
2935863763d8655c2c23e52591f2cbfff54811a6Aki Tuomi test_assert(o_stream_send_str(os_encode, "hello, world") == 12);
16bb4836f0d3a3090e1e940bf7a362da726287bfAki Tuomi test_assert(o_stream_flush(os_encode) == 1);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_assert(strcmp(str_c(str), "68656c6c6f2c20776f726c64") == 0);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi o_stream_unref(&os_encode);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi o_stream_unref(&os_sink);
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_end();
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi}
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomivoid test_ostream_escaped(void) {
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_ostream_escaped_json();
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi test_ostream_escaped_hex();
662bb64be818407c6719a69780411f7ca8d6c96fAki Tuomi}