summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrediano Ziglio <freddy77@gmail.com>2020-09-30 19:05:10 +0100
committerFrediano Ziglio <freddy77@gmail.com>2021-02-22 09:11:40 +0000
commitc48140c493cf2f49b8a9c41af14f6892b7199c48 (patch)
treed5e2cbe99cae7a218acab06ccdaced2be53db4e1
parent6b662331f7bef5d9058029885184ea1f15e9ef0d (diff)
helper-fuzzer-demarshallers: Check also test demarshallers
Signed-off-by: Frediano Ziglio <freddy77@gmail.com> Acked-by: Victor Toso <victortoso@redhat.com>
-rw-r--r--tests/Makefile.am13
-rw-r--r--tests/helper-fuzzer-demarshallers.c22
-rw-r--r--tests/meson.build32
-rw-r--r--tests/test-marshallers.c24
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);