test_end();
}
+static void test_message_decoder_partial_illegal_sequence2(void)
+{
+ struct message_decoder_context *ctx;
+ struct message_part part;
+ struct message_header_line hdr;
+ struct message_block input, output;
+
+ test_begin("message decoder partial illegal sequence 2");
+
+ i_zero(&part);
+ i_zero(&input);
+ memset(&output, 0xff, sizeof(output));
+ input.part = ∂
+
+ ctx = message_decoder_init(NULL, 0);
+
+ i_zero(&hdr);
+ hdr.name = "Content-Type";
+ hdr.name_len = strlen(hdr.name);
+ hdr.full_value = (const void *)"text/plain; charset=ISO-2022-JP";
+ hdr.full_value_len = strlen((const char *)hdr.full_value);
+ input.hdr = &hdr;
+ test_assert(message_decoder_decode_next_block(ctx, &input, &output));
+ test_assert(output.size == 0);
+
+ input.hdr = NULL;
+ test_assert(message_decoder_decode_next_block(ctx, &input, &output));
+
+ /* Incomplete encoding state change */
+ input.data = (const void *)"\x1b$";
+ input.size = strlen((const char *)input.data);
+ test_assert(message_decoder_decode_next_block(ctx, &input, &output));
+ test_assert(output.size == 0);
+
+ /* State sequence becomes invalid */
+ input.data = (const void *)"\x1b";
+ input.size = strlen((const char *)input.data);
+ test_assert(message_decoder_decode_next_block(ctx, &input, &output));
+ /* The initial invalid sequences become passthrough output */
+ test_assert(output.size == 2);
+ test_assert(memcmp(output.data, "\x1b$", 2) == 0);
+
+ /* Finish a valid encoding state change */
+ input.data = (const void *)"$B";
+ input.size = strlen((const char *)input.data);
+ test_assert(message_decoder_decode_next_block(ctx, &input, &output));
+ test_assert(output.size == 0);
+
+ message_decoder_deinit(&ctx);
+
+ test_end();
+}
+
+static void test_message_decoder_partial_illegal_sequence3(void)
+{
+ struct message_decoder_context *ctx;
+ struct message_part part;
+ struct message_header_line hdr;
+ struct message_block input, output;
+
+ test_begin("message decoder partial illegal sequence 3");
+
+ i_zero(&part);
+ i_zero(&input);
+ memset(&output, 0xff, sizeof(output));
+ input.part = ∂
+
+ ctx = message_decoder_init(NULL, 0);
+
+ i_zero(&hdr);
+ hdr.name = "Content-Type";
+ hdr.name_len = strlen(hdr.name);
+ hdr.full_value = (const void *)"text/plain; charset=ISO-2022-JP";
+ hdr.full_value_len = strlen((const char *)hdr.full_value);
+ input.hdr = &hdr;
+ test_assert(message_decoder_decode_next_block(ctx, &input, &output));
+ test_assert(output.size == 0);
+
+ input.hdr = NULL;
+ test_assert(message_decoder_decode_next_block(ctx, &input, &output));
+
+ /* Incomplete encoding state change */
+ input.data = (const void *)"\x1b$";
+ input.size = strlen((const char *)input.data);
+ test_assert(message_decoder_decode_next_block(ctx, &input, &output));
+ test_assert(output.size == 0);
+
+ /* Continue with an invalid state sequence, but which by itself
+ becomes a valid state change sequence. */
+ input.data = (const void *)"\x1b$B";
+ input.size = strlen((const char *)input.data);
+ test_assert(message_decoder_decode_next_block(ctx, &input, &output));
+ /* The initial invalid sequences become passthrough output */
+ test_assert(output.size == 2);
+ test_assert(memcmp(output.data, "\x1b$", 2) == 0);
+
+ message_decoder_deinit(&ctx);
+
+ test_end();
+}
+
static void test_message_decoder_multipart(void)
{
static const char test_message_input[] =
static void (*const test_functions[])(void) = {
test_message_decoder,
test_message_decoder_partial_illegal_sequence,
+ test_message_decoder_partial_illegal_sequence2,
+ test_message_decoder_partial_illegal_sequence3,
test_message_decoder_multipart,
test_message_decoder_current_content_type,
test_message_decoder_content_transfer_encoding,