From c48140c493cf2f49b8a9c41af14f6892b7199c48 Mon Sep 17 00:00:00 2001 From: Frediano Ziglio Date: Wed, 30 Sep 2020 19:05:10 +0100 Subject: helper-fuzzer-demarshallers: Check also test demarshallers Signed-off-by: Frediano Ziglio Acked-by: Victor Toso --- tests/Makefile.am | 13 +++++++++---- tests/helper-fuzzer-demarshallers.c | 22 ++++++++++++++++++---- tests/meson.build | 32 +++++++++++++++++++++++++++----- tests/test-marshallers.c | 24 ++++++++++++++---------- 4 files changed, 68 insertions(+), 23 deletions(-) diff --git a/tests/Makefile.am b/tests/Makefile.am index be40bc4..69f6734 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -96,6 +96,7 @@ test_utils_LDADD = \ noinst_PROGRAMS += helper_fuzzer_demarshallers helper_fuzzer_demarshallers_SOURCES = \ helper-fuzzer-demarshallers.c \ + generated_test_demarshallers.c \ $(NULL) helper_fuzzer_demarshallers_CFLAGS = \ -I$(top_srcdir) \ @@ -132,14 +133,18 @@ MARSHALLERS_DEPS = \ # Note despite being autogenerated these are not part of CLEANFILES, they are # actually a part of EXTRA_DIST, to avoid the need for pyparser by end users generated_test_marshallers.c: $(srcdir)/test-marshallers.proto $(MARSHALLERS_DEPS) - $(AM_V_GEN)$(PYTHON) $(top_srcdir)/spice_codegen.py --generate-marshallers --server --include test-marshallers.h $< $@ >/dev/null + $(AM_V_GEN)$(PYTHON) $(top_srcdir)/spice_codegen.py --suffix=_test \ + --generate-marshallers --server --include test-marshallers.h $< $@ >/dev/null generated_test_marshallers.h: $(srcdir)/test-marshallers.proto $(MARSHALLERS_DEPS) - $(AM_V_GEN)$(PYTHON) $(top_srcdir)/spice_codegen.py --generate-marshallers --server --include test-marshallers.h -H $< $@ >/dev/null + $(AM_V_GEN)$(PYTHON) $(top_srcdir)/spice_codegen.py --suffix=_test \ + --generate-marshallers --server --include test-marshallers.h -H $< $@ >/dev/null generated_test_demarshallers.c: $(srcdir)/test-marshallers.proto $(MARSHALLERS_DEPS) - $(AM_V_GEN)$(PYTHON) $(top_srcdir)/spice_codegen.py --generate-demarshallers --client --include test-marshallers.h \ + $(AM_V_GEN)$(PYTHON) $(top_srcdir)/spice_codegen.py --suffix=_test \ + --generate-demarshallers --client --include test-marshallers.h \ --generated-declaration-file generated_test_messages.h $< $@ >/dev/null generated_test_enums.h: $(srcdir)/test-marshallers.proto $(MARSHALLERS_DEPS) - $(AM_V_GEN)$(PYTHON) $(top_srcdir)/spice_codegen.py -e $< $@ >/dev/null + $(AM_V_GEN)$(PYTHON) $(top_srcdir)/spice_codegen.py --suffix=_test \ + -e $< $@ >/dev/null EXTRA_DIST = \ $(TEST_MARSHALLERS) \ diff --git a/tests/helper-fuzzer-demarshallers.c b/tests/helper-fuzzer-demarshallers.c index c8e49ce..99c67e9 100644 --- a/tests/helper-fuzzer-demarshallers.c +++ b/tests/helper-fuzzer-demarshallers.c @@ -48,7 +48,7 @@ spice_parse_t(uint8_t *message_start, uint8_t *message_end, uint32_t channel, uint16_t message_type, SPICE_GNUC_UNUSED int minor, size_t *size_out, message_destructor_t *free_message); -spice_parse_t spice_parse_msg, spice_parse_reply; +spice_parse_t spice_parse_msg, spice_parse_reply, spice_parse_msg_test; int main(int argc, char **argv) { @@ -78,9 +78,23 @@ int main(int argc, char **argv) uint8_t channel; READ(channel); - // Low bit select client or server - spice_parse_t *parse_func = channel & 1 ? spice_parse_reply : spice_parse_msg; - channel >>= 1; + // Low bits select client/server and test + spice_parse_t *parse_func; + switch (channel & 3) { + case 0: + parse_func = spice_parse_reply; + break; + case 1: + parse_func = spice_parse_msg; + break; + case 3: + parse_func = spice_parse_msg_test; + break; + default: + fclose(f); + return 1; + } + channel >>= 2; uint16_t type; READ(type); diff --git a/tests/meson.build b/tests/meson.build index c5df468..debce75 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -24,25 +24,46 @@ if spice_common_generate_client_code or spice_common_generate_server_code test_proto = files('test-marshallers.proto') test_marshallers_sources = ['test-marshallers.c', 'test-marshallers.h'] + generated_marshallers = [] targets = [ - ['test_marshallers', test_proto, 'generated_test_marshallers.c', ['--generate-marshallers', '--server', '--include', 'test-marshallers.h', '@INPUT@', '@OUTPUT@']], - ['test_marshallers_h', test_proto, 'generated_test_marshallers.h', ['--generate-marshallers', '--server', '--include', 'test-marshallers.h', '-H', '@INPUT@', '@OUTPUT@']], + ['test_marshallers', test_proto, 'generated_test_marshallers.c', [ + '--suffix=_test', + '--generate-marshallers', + '--server', + '--include', 'test-marshallers.h', + '@INPUT@', '@OUTPUT@' + ]], + ['test_marshallers_h', test_proto, 'generated_test_marshallers.h', [ + '--suffix=_test', + '--generate-marshallers', + '--server', + '--include', 'test-marshallers.h', + '-H', + '@INPUT@', '@OUTPUT@' + ]], ['test_demarshallers', test_proto, 'generated_test_demarshallers.c', [ + '--suffix=_test', '--generate-demarshallers', '--client', '--include', 'test-marshallers.h', '--generated-declaration-file', 'generated_test_messages.h', '@INPUT@', '@OUTPUT@' ]], - ['test_enums_h', test_proto, 'generated_test_enums.h', ['-e', '@INPUT@', '@OUTPUT@']], + ['test_enums_h', test_proto, 'generated_test_enums.h', [ + '--suffix=_test', + '-e', + '@INPUT@', '@OUTPUT@' + ]], ] foreach t : targets cmd = [python, spice_codegen] + t[3] - test_marshallers_sources += custom_target(t[0], input: t[1], output : t[2], command: cmd, depend_files : spice_codegen_files) + generated_marshallers += custom_target(t[0], input: t[1], output : t[2], command: cmd, depend_files : spice_codegen_files) endforeach + test_marshallers_sources += generated_marshallers + test('test_marshallers', executable('test_marshallers', test_marshallers_sources, dependencies : spice_common_dep, @@ -64,7 +85,8 @@ endif # helper_fuzzer_demarshallers # if spice_common_generate_client_code and spice_common_generate_server_code - executable('helper_fuzzer_demarshallers', 'helper-fuzzer-demarshallers.c', + executable('helper_fuzzer_demarshallers', + ['helper-fuzzer-demarshallers.c'] + generated_marshallers, dependencies : [tests_deps, spice_common_server_dep, spice_common_client_dep], install : false) endif diff --git a/tests/test-marshallers.c b/tests/test-marshallers.c index d8c34d6..579483b 100644 --- a/tests/test-marshallers.c +++ b/tests/test-marshallers.c @@ -30,6 +30,9 @@ #define NUM_CHANNELS 3u +spice_parse_channel_func_t +spice_get_server_channel_parser_test(uint32_t channel, unsigned int *max_message_type); + static void test_overflow(SpiceMarshaller *m) { SpiceMsgChannels *msg; @@ -63,7 +66,7 @@ static void test_overflow(SpiceMarshaller *m) *((uint32_t *) data) = 0x80000002u; // extract the message - func = spice_get_server_channel_parser(SPICE_CHANNEL_MAIN, &max_message_type); + func = spice_get_server_channel_parser_test(SPICE_CHANNEL_MAIN, &max_message_type); g_assert_nonnull(func); out = func(data, data+len, SPICE_MSG_MAIN_CHANNELS_LIST, 0, &len, &free_output); g_assert_null(out); @@ -86,9 +89,9 @@ static uint8_t expected_data[] = { 123, /* dummy byte */ }; typedef void (*message_destructor_t)(uint8_t *message); -uint8_t * spice_parse_msg(uint8_t *message_start, uint8_t *message_end, - uint32_t channel, uint16_t message_type, int minor, - size_t *size_out, message_destructor_t *free_message); +uint8_t * spice_parse_msg_test(uint8_t *message_start, uint8_t *message_end, + uint32_t channel, uint16_t message_type, int minor, + size_t *size_out, message_destructor_t *free_message); static void test_zerolen1(void) { @@ -110,8 +113,8 @@ static void test_zerolen1(void) // demarshal array with @zero_terminated data SpiceMsgMainZeroLen1 *msg = (SpiceMsgMainZeroLen1 *) - spice_parse_msg(data, data + sizeof(data), SPICE_CHANNEL_MAIN, SPICE_MSG_MAIN_ZEROLEN1, - 0, &msg_len, &free_message); + spice_parse_msg_test(data, data + sizeof(data), SPICE_CHANNEL_MAIN, SPICE_MSG_MAIN_ZEROLEN1, + 0, &msg_len, &free_message); g_assert_nonnull(msg); g_assert_cmpmem(msg->txt1, 5, "data", 5); @@ -156,8 +159,9 @@ int main(void) // test demarshaller msg = (SpiceMsgMainShortDataSubMarshall *) - spice_parse_msg(data, data + len, SPICE_CHANNEL_MAIN, SPICE_MSG_MAIN_SHORTDATASUBMARSHALL, - 0, &msg_len, &free_message); + spice_parse_msg_test(data, data + len, SPICE_CHANNEL_MAIN, + SPICE_MSG_MAIN_SHORTDATASUBMARSHALL, + 0, &msg_len, &free_message); g_assert_nonnull(msg); g_assert_cmpint(msg->dummy_byte, ==, 123); @@ -191,8 +195,8 @@ int main(void) len = 4; data = g_new0(uint8_t, len); memset(data, 0, len); - msg = (SpiceMsgMainShortDataSubMarshall *) spice_parse_msg(data, data + len, 1, 3, 0, - &msg_len, &free_message); + msg = (SpiceMsgMainShortDataSubMarshall *) spice_parse_msg_test(data, data + len, 1, 3, 0, + &msg_len, &free_message); g_assert_null(msg); g_free(data); -- cgit v1.2.3