From: "Steven Rostedt (VMware)" <rostedt@xxxxxxxxxxx> 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@xxxxxxxxxxx> --- utest/traceevent-utest.c | 54 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) 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); } -- 2.33.0