diff mbox series

[06/10] libtraceveent: Add testing of old dynamic string event layout

Message ID 20211216213956.13934-7-rostedt@goodmis.org (mailing list archive)
State Accepted
Commit d66f4d4969e78f35a566c6313dfa97e1b19944bc
Headers show
Series libtraceevent: Makefile updates fixes and unit tests | expand

Commit Message

Steven Rostedt Dec. 16, 2021, 9:39 p.m. UTC
From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>

When running against old trace.dat files, the output would not print
strings. This was due to a change that did not take into account the old
dynamic format that did not have strings as an array.

Add a unit test to cover this case so that it does not break again.

Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
---
 utest/traceevent-utest.c | 54 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 51 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/utest/traceevent-utest.c b/utest/traceevent-utest.c
index 2910b95d01e6..f4fdc86664ca 100644
--- a/utest/traceevent-utest.c
+++ b/utest/traceevent-utest.c
@@ -63,26 +63,72 @@  static char dyn_str_data[] = {
 };
 static void *dyn_str_event_data = (void *)dyn_str_data;
 
+static const char dyn_str_old_event[] =
+	"name: irq_handler_entry\n"
+	"ID: 2\n"
+	"format:\n"
+	"\tfield:unsigned short common_type;\toffset:0;\tsize:2;\n"
+	"\tfield:unsigned char common_flags;\toffset:2;\tsize:1;\n"
+	"\tfield:unsigned char common_preempt_count;\toffset:3;\tsize:1;\n"
+	"\tfield:int common_pid;\toffset:4;\tsize:4;\n"
+	"\n"
+        "\tfield:int irq;\toffset:8;\tsize:4;\n"
+        "\tfield:__data_loc name;\toffset:12;\tsize:2;\n"
+	"\n"
+	"print fmt: \"irq=%d handler=%s\", REC->irq, __get_str(name)\n";
+
+static char dyn_str_old_data[] = {
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+	/* common type */		2, 0x00,
+#else
+	/* common type */		0x00, 2
+#endif
+	/* common flags */		0x00,
+	/* common_preempt_count */	0x00,
+	/* common_pid */		0x00, 0x00, 0x00, 0x00,
+	/* irq */			0x00, 0x00, 0x00, 0x00,
+
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+	/* name : offset */		16, 0x00,
+#else
+	/* name : offset */		0x00, 16,
+#endif
+	/* padding */			0x00, 0x00,
+	/* name */			'h', 'e', 'l', 'l', 'o', '\0',
+	/* padding */			0x00, 0x00, 0x00
+};
+static void *dyn_str_old_event_data = (void *)dyn_str_old_data;
+
 static struct tep_handle *test_tep;
 static struct trace_seq *test_seq;
 static struct trace_seq seq_storage;
 
-static void test_parse_dyn_str_event(void)
+static void parse_dyn_str(const char *dyn_str, void *data)
 {
 	struct tep_format_field *field;
 	struct tep_event *event;
 
 	CU_TEST(tep_parse_format(test_tep, &event,
-				 dyn_str_event, strlen(dyn_str_event),
+				 dyn_str, strlen(dyn_str),
 				DYN_STR_EVENT_SYSTEM) == TEP_ERRNO__SUCCESS);
 
 	field = tep_find_any_field(event, DYN_STR_FIELD);
 	CU_TEST(field != NULL);
 	trace_seq_reset(test_seq);
-	tep_print_field(test_seq, dyn_str_event_data, field);
+	tep_print_field(test_seq, data, field);
 	CU_TEST(strcmp(test_seq->buffer, DYN_STRING) == 0);
 }
 
+static void test_parse_dyn_str_event(void)
+{
+	parse_dyn_str(dyn_str_event, dyn_str_event_data);
+}
+
+static void test_parse_dyn_str_old_event(void)
+{
+	parse_dyn_str(dyn_str_old_event, dyn_str_old_event_data);
+}
+
 static int test_suite_destroy(void)
 {
 	tep_free(test_tep);
@@ -111,4 +157,6 @@  void test_traceevent_lib(void)
 	}
 	CU_add_test(suite, "parse dynamic string event",
 		    test_parse_dyn_str_event);
+	CU_add_test(suite, "parse old dynamic string event",
+		    test_parse_dyn_str_old_event);
 }