Software APIs
dbg_print_unittest.cc
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #include "sw/device/silicon_creator/lib/dbg_print.h"
6 
7 #include "gtest/gtest.h"
8 #include "sw/device/silicon_creator/lib/drivers/uart.h"
9 #include "sw/device/silicon_creator/lib/error.h"
10 
11 namespace dbg_printf_unittest {
12 // We don't use a mock here since it'd be overkill; expectations are easier
13 // to write on a global string, instead. This also produces a simpler error
14 // message instead of a tower of failed expectations.
15 static std::string *uart_buf = new std::string;
16 extern "C" void uart_putchar(uint8_t c) { uart_buf->push_back(c); }
17 
18 TEST(LogTest, PrintfFormatOnly) {
19  uart_buf->clear();
20  dbg_printf("A");
21  EXPECT_EQ(*uart_buf, "A");
22 
23  uart_buf->clear();
24  dbg_printf("1234567890\n");
25  EXPECT_EQ(*uart_buf, "1234567890\n");
26 }
27 
28 TEST(LogTest, PrintfChar) {
29  uart_buf->clear();
30  dbg_printf("%c", 'A');
31  EXPECT_EQ(*uart_buf, "A");
32 }
33 
34 TEST(LogTest, PrintfInt) {
35  uart_buf->clear();
36  dbg_printf("%d", 0);
37  EXPECT_EQ(*uart_buf, "0");
38 
39  uart_buf->clear();
40  dbg_printf("%d", -123);
41  EXPECT_EQ(*uart_buf, "-123");
42 
43  uart_buf->clear();
44  dbg_printf("%d", 12345);
45  EXPECT_EQ(*uart_buf, "12345");
46 }
47 
48 TEST(LogTest, PrintfUnsignedInt) {
49  uart_buf->clear();
50  dbg_printf("%u", 0);
51  EXPECT_EQ(*uart_buf, "0");
52 
53  uart_buf->clear();
54  dbg_printf("%u", 0xFFFFFFFF);
55  EXPECT_EQ(*uart_buf, "4294967295");
56 
57  uart_buf->clear();
58  dbg_printf("%u", 12345);
59  EXPECT_EQ(*uart_buf, "12345");
60 }
61 
62 TEST(LogTest, PrintfHex) {
63  uart_buf->clear();
64  dbg_printf("%x", 0xabcdef01);
65  EXPECT_EQ(*uart_buf, "abcdef01");
66 
67  uart_buf->clear();
68  dbg_printf("0x%x%x", 0x01020304, 0x05060708);
69  EXPECT_EQ(*uart_buf, "0x0102030405060708");
70 }
71 
72 TEST(LogTest, PrintfString) {
73  uart_buf->clear();
74  dbg_printf("Hello, %s!", "World");
75  EXPECT_EQ(*uart_buf, "Hello, World!");
76 
77  uart_buf->clear();
78  dbg_printf("%s%s", "Open", "Titan");
79  EXPECT_EQ(*uart_buf, "OpenTitan");
80 
81  uart_buf->clear();
82  dbg_printf("%s%s%s%s%s", "A", "", "B", "", "C");
83  EXPECT_EQ(*uart_buf, "ABC");
84 }
85 
86 TEST(LogTest, PutsString) {
87  uart_buf->clear();
88  dbg_puts("Hello, %s!");
89  // It should NOT be formatted.
90  EXPECT_EQ(*uart_buf, "Hello, %s!");
91 
92  uart_buf->clear();
93  dbg_puts("OpenTitan");
94  EXPECT_EQ(*uart_buf, "OpenTitan");
95 }
96 
97 TEST(LogTest, PrintfMix) {
98  uart_buf->clear();
99  dbg_printf("%s%x", "OpenTitan", 0x0000000a);
100  EXPECT_EQ(*uart_buf, "OpenTitan0000000a");
101 }
102 
103 TEST(LogTest, BadFormatSpecifier) {
104  // Disable compiler warnings about incorrect format strings so that we can
105  // test them (works for both clang and GCC).
106 #pragma GCC diagnostic push
107 #pragma GCC diagnostic ignored "-Wformat"
108 #pragma GCC diagnostic ignored "-Wformat-extra-args"
109  uart_buf->clear();
110  dbg_printf("%z", 0x0000000a);
111  EXPECT_EQ(*uart_buf, "%z");
112 
113  uart_buf->clear();
114  dbg_printf("abcd%");
115  EXPECT_EQ(*uart_buf, "abcd%");
116 
117  uart_buf->clear();
118  dbg_printf("abcd%%");
119  EXPECT_EQ(*uart_buf, "abcd%");
120 #pragma GCC diagnostic pop
121 }
122 
123 } // namespace dbg_printf_unittest