test-istream-jsonstr.c revision bcb4e51a409d94ae670de96afb8483a4f7855294
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2016-2018 Dovecot authors, see the included COPYING file */
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainenstatic const struct {
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainen { "foo\\\\\\\"\\b\\f\\n\\r\\t\\u0001\\uffff\"",
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainen "foo\\\"\b\f\n\r\t\001\xEF\xBF\xBF", 0 },
c3393007354b7ab607449fea0c3d7088193ab208Aki Tuomi { "\\ud801\\udc37\"", "\xf0\x90\x90\xb7", 0 }, /* valid codepoint */
c3393007354b7ab607449fea0c3d7088193ab208Aki Tuomi { "\\ud801", "", EPIPE }, /* high surrogate alone */
c3393007354b7ab607449fea0c3d7088193ab208Aki Tuomi { "\\udced\\udc37\"", "", EINVAL }, /* low surrogate before high */
c3393007354b7ab607449fea0c3d7088193ab208Aki Tuomi { "\\ud8011\\udc37\"", "", EINVAL }, /* has extra 1 in middle */
c3393007354b7ab607449fea0c3d7088193ab208Aki Tuomi { "hello \\udc37\"", "hello ", EINVAL }, /* low surrogate before high with valid prefix*/
c3393007354b7ab607449fea0c3d7088193ab208Aki Tuomi { "hello \\ud801", "hello ", EPIPE }, /* high surrogate alone with valid prefix */
c3393007354b7ab607449fea0c3d7088193ab208Aki Tuomi { "\\uabcg", "", EINVAL }, /* invalid hex value */
07ca0c75daa9da0bd6ef987b5c3622d83fe2fe7eTimo Sirainenrun_test_buffer(const char *json_input, const char *output, int stream_errno,
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainen const unsigned char *data;
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainen input_data = test_istream_create_data(json_input, json_input_len);
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainen test_istream_set_allow_eof(input_data, FALSE);
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainen test_istream_set_size(input_data, json_input_len);
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainen test_assert(input->stream_errno == stream_errno);
07ca0c75daa9da0bd6ef987b5c3622d83fe2fe7eTimo Sirainenrun_test(const char *json_input, const char *output, int stream_errno)
07ca0c75daa9da0bd6ef987b5c3622d83fe2fe7eTimo Sirainen run_test_buffer(json_input, output, stream_errno, i);
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainenstatic void test_istream_jsonstr_autoretry(void)
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainen const size_t json_input_len = strlen(json_input);
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainen input_data = test_istream_create_data(json_input, json_input_len);
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainen test_istream_set_size(input_data, json_input_len);
c3393007354b7ab607449fea0c3d7088193ab208Aki Tuomi input_data = test_istream_create_data(json_input, json_input_len);
c3393007354b7ab607449fea0c3d7088193ab208Aki Tuomi test_istream_set_size(input_data, json_input_len);
c3393007354b7ab607449fea0c3d7088193ab208Aki Tuomi test_assert(memcmp(i_stream_get_data(input, &len), output, I_MIN(len, strlen(output))) == 0 &&
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainen unsigned int i;
ddf9529d37056f8817825f6265c27d8070123013Timo Sirainen test_begin(t_strdup_printf("istream-jsonstr %u", i+1));