1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (c) 2020, Oracle and/or its affiliates. */ 3 4 #include <test_progs.h> 5 6 #include "trace_printk.lskel.h" 7 8 #define TRACEBUF "/sys/kernel/debug/tracing/trace_pipe" 9 #define SEARCHMSG "testing,testing" 10 11 void serial_test_trace_printk(void) 12 { 13 struct trace_printk_lskel__bss *bss; 14 int err = 0, iter = 0, found = 0; 15 struct trace_printk_lskel *skel; 16 char *buf = NULL; 17 FILE *fp = NULL; 18 size_t buflen; 19 20 skel = trace_printk_lskel__open(); 21 if (!ASSERT_OK_PTR(skel, "trace_printk__open")) 22 return; 23 24 ASSERT_EQ(skel->rodata->fmt[0], 'T', "skel->rodata->fmt[0]"); 25 skel->rodata->fmt[0] = 't'; 26 27 err = trace_printk_lskel__load(skel); 28 if (!ASSERT_OK(err, "trace_printk__load")) 29 goto cleanup; 30 31 bss = skel->bss; 32 33 err = trace_printk_lskel__attach(skel); 34 if (!ASSERT_OK(err, "trace_printk__attach")) 35 goto cleanup; 36 37 fp = fopen(TRACEBUF, "r"); 38 if (!ASSERT_OK_PTR(fp, "fopen(TRACEBUF)")) 39 goto cleanup; 40 41 /* We do not want to wait forever if this test fails... */ 42 fcntl(fileno(fp), F_SETFL, O_NONBLOCK); 43 44 /* wait for tracepoint to trigger */ 45 usleep(1); 46 trace_printk_lskel__detach(skel); 47 48 if (!ASSERT_GT(bss->trace_printk_ran, 0, "bss->trace_printk_ran")) 49 goto cleanup; 50 51 if (!ASSERT_GT(bss->trace_printk_ret, 0, "bss->trace_printk_ret")) 52 goto cleanup; 53 54 /* verify our search string is in the trace buffer */ 55 while (getline(&buf, &buflen, fp) >= 0 || errno == EAGAIN) { 56 if (strstr(buf, SEARCHMSG) != NULL) 57 found++; 58 if (found == bss->trace_printk_ran) 59 break; 60 if (++iter > 1000) 61 break; 62 } 63 64 if (!ASSERT_EQ(found, bss->trace_printk_ran, "found")) 65 goto cleanup; 66 67 cleanup: 68 trace_printk_lskel__destroy(skel); 69 free(buf); 70 if (fp) 71 fclose(fp); 72 } 73