From a3a1765207418e6ec41a33971c2eb88c23f30de8 Mon Sep 17 00:00:00 2001 From: Karolina Bober Date: Fri, 22 Jul 2022 15:20:58 +0200 Subject: [PATCH] test: add function parsing markers passed by pmreorder --- src/test/pmreorder_stack/pmreorder0.log.match | 51 +++++++++++++++++++ src/test/pmreorder_stack/pmreorder_stack.c | 39 +++++++++----- src/test/unittest/unittest.h | 48 ++++++++++++++++- 3 files changed, 125 insertions(+), 13 deletions(-) diff --git a/src/test/pmreorder_stack/pmreorder0.log.match b/src/test/pmreorder_stack/pmreorder0.log.match index 0f66ca5ad2d..c6c0fec264c 100644 --- a/src/test/pmreorder_stack/pmreorder0.log.match +++ b/src/test/pmreorder_stack/pmreorder0.log.match @@ -46,6 +46,57 @@ Store [3]: WARNING:pmreorder:File $(nW)/testfile (base: 0x$(nW), size: 0x$(nW)) inconsistent WARNING:pmreorder:Call trace: +WARNING:pmreorder:File $(nW)/testfile (base: 0x$(nW), size: 0x$(nW)) inconsistent +WARNING:pmreorder:Call trace: +Store [0]: + by $(nW): write_fields (pmreorder_stack.c:$(N)) + by $(nW): main (pmreorder_stack.c:$(N)) + +WARNING:pmreorder:File $(nW)/testfile (base: 0x$(nW), size: 0x$(nW)) inconsistent +WARNING:pmreorder:Call trace: +Store [0]: + by $(nW): write_fields (pmreorder_stack.c:$(N)) + by $(nW): main (pmreorder_stack.c:$(N)) +Store [1]: + by $(nW): write_fields (pmreorder_stack.c:$(N)) + by $(nW): main (pmreorder_stack.c:$(N)) + +WARNING:pmreorder:File $(nW)/testfile (base: 0x$(nW), size: 0x$(nW)) inconsistent +WARNING:pmreorder:Call trace: +Store [0]: + by $(nW): write_fields (pmreorder_stack.c:$(N)) + by $(nW): main (pmreorder_stack.c:$(N)) +Store [1]: + by $(nW): write_fields (pmreorder_stack.c:$(N)) + by $(nW): main (pmreorder_stack.c:$(N)) +Store [2]: + by $(nW): write_fields (pmreorder_stack.c:$(N)) + by $(nW): main (pmreorder_stack.c:$(N)) + +WARNING:pmreorder:File $(nW)/testfile (base: 0x$(nW), size: 0x$(nW)) inconsistent +WARNING:pmreorder:Call trace: +Store [0]: + by $(nW): write_fields (pmreorder_stack.c:$(N)) + by $(nW): main (pmreorder_stack.c:$(N)) +Store [1]: + by $(nW): write_fields (pmreorder_stack.c:$(N)) + by $(nW): main (pmreorder_stack.c:$(N)) +Store [2]: + by $(nW): write_fields (pmreorder_stack.c:$(N)) + by $(nW): main (pmreorder_stack.c:$(N)) +Store [3]: + by $(nW): write_fields (pmreorder_stack.c:$(N)) + by $(nW): main (pmreorder_stack.c:$(N)) + +WARNING:pmreorder:File $(nW)/testfile (base: 0x$(nW), size: 0x$(nW)) inconsistent +WARNING:pmreorder:Call trace: + +WARNING:pmreorder:File $(nW)/testfile (base: 0x$(nW), size: 0x$(nW)) inconsistent +WARNING:pmreorder:Call trace: +Store [0]: + by $(nW): write_fields (pmreorder_stack.c:$(N)) + by $(nW): main (pmreorder_stack.c:$(N)) + WARNING:pmreorder:File $(nW)/testfile (base: 0x$(nW), size: 0x$(nW)) inconsistent WARNING:pmreorder:Call trace: Store [0]: diff --git a/src/test/pmreorder_stack/pmreorder_stack.c b/src/test/pmreorder_stack/pmreorder_stack.c index de740f8af97..18cb4a31ee2 100644 --- a/src/test/pmreorder_stack/pmreorder_stack.c +++ b/src/test/pmreorder_stack/pmreorder_stack.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -/* Copyright 2018-2019, Intel Corporation */ +/* Copyright 2018-2022, Intel Corporation */ /* * pmreorder_stack.c -- unit test for engines pmreorder stack @@ -35,14 +35,13 @@ struct fields { }; /* - * write_fields -- (internal) write data in a consistent manner. + * write_fields -- (internal) write data in a inconsistent manner. */ -static void -write_fields(struct fields *fieldsp) +static void write_fields(struct fields *fieldsp, struct markers sm) { - VALGRIND_EMIT_LOG("FIELDS_PACK_TWO.BEGIN"); + VALGRIND_EMIT_LOG(sm.markers[0]); - VALGRIND_EMIT_LOG("FIELDS_PACK_ONE.BEGIN"); + VALGRIND_EMIT_LOG(sm.markers[1]); fieldsp->a = 1; fieldsp->b = 1; @@ -50,7 +49,7 @@ write_fields(struct fields *fieldsp) fieldsp->d = 1; pmem_persist(&fieldsp->a, sizeof(int) * 4); - VALGRIND_EMIT_LOG("FIELDS_PACK_ONE.END"); + VALGRIND_EMIT_LOG(sm.markers[2]); fieldsp->e = 1; fieldsp->f = 1; @@ -58,8 +57,6 @@ write_fields(struct fields *fieldsp) fieldsp->h = 1; pmem_persist(&fieldsp->e, sizeof(int) * 4); - VALGRIND_EMIT_LOG("FIELDS_PACK_TWO.END"); - fieldsp->i = 1; fieldsp->j = 1; fieldsp->k = 1; @@ -71,12 +68,23 @@ write_fields(struct fields *fieldsp) * check_consistency -- (internal) check struct fields consistency. */ static int -check_consistency(struct fields *fieldsp) +check_consistency(struct fields *fieldsp, struct markers sm) { int consistency = 1; if (fieldsp->e == 1 && fieldsp->f == 0) consistency = 0; + struct markers *log = get_markers(os_getenv("PMREORDER_MARKERS")); + if (log) { + if (log->markers_no != sm.markers_no) + consistency = 1; + else { + for (int i = 0; i < (int)log->markers_no; i++) + consistency &= strcmp(log->markers[i], sm.markers[i]); + } + } + + delete_markers(log); return consistency; } @@ -103,16 +111,23 @@ main(int argc, char *argv[]) char opt = argv[1][0]; + char *logs[] = {"FIELDS_PACK_TWO.BEGIN", "FIELDS_PACK_ONE.BEGIN", + "FIELDS_PACK_ONE.END", "FIELDS_PACK_TWO.END"}; + + struct markers stack_markers; + stack_markers.markers_no = 4; + stack_markers.markers = logs; + /* clear the struct to get a consistent start state for writing */ if (strchr("w", opt)) pmem_memset_persist(fieldsp, 0, sizeof(*fieldsp)); switch (opt) { case 'w': - write_fields(fieldsp); + write_fields(fieldsp, stack_markers); break; case 'c': - return check_consistency(fieldsp); + return check_consistency(fieldsp, stack_markers); default: UT_FATAL("Unrecognized option %c", opt); } diff --git a/src/test/unittest/unittest.h b/src/test/unittest/unittest.h index 3a55cf22928..b65bf7255bf 100644 --- a/src/test/unittest/unittest.h +++ b/src/test/unittest/unittest.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright 2014-2020, Intel Corporation */ +/* Copyright 2014-2022, Intel Corporation */ /* * unittest.h -- the mundane stuff shared by all unit tests @@ -668,6 +668,11 @@ struct test_case { int (*func)(const struct test_case *tc, int argc, char *argv[]); }; +struct markers { + unsigned markers_no; + char **markers; +}; + /* * get_tc -- return test case of specified name */ @@ -750,6 +755,47 @@ if (off != sizeof(type))\ STR(type), last, STR(type), sizeof(type), off);\ } while (0) +/* + * get_markers - return list of the markers passed by pmreorder + */ +static inline struct markers * +get_markers(char *input) +{ + if (!input) + return NULL; + + struct markers *log = malloc(sizeof(struct markers)); + char *delim = "|"; + + log->markers_no = 1; + for (char *s = input; *s != '\0'; s++) + if (strncmp(s, delim, strlen(delim)) == 0) + log->markers_no++; + log->markers = malloc(log->markers_no * sizeof(char *)); + + char *token = strtok(input, delim); + int i = 0; + + while (token != NULL) { + log->markers[i] = malloc(strlen(token) * sizeof(char)); + strncpy(log->markers[i], token, strlen(token)); + i++; + printf(" %s\n", token); + token = strtok(NULL, delim); + } + + return log; +} + +static inline void +delete_markers(struct markers *log) +{ + for (unsigned i = 0; i < log->markers_no; i++) + free(log->markers[i]); + free(log->markers); + free(log); +} + /* * AddressSanitizer */