• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2021 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14 
15 #define PW_LOG_MODULE_NAME "log module name!"
16 
17 // Configure the module so that the test runs against known values.
18 #undef PW_LOG_TOKENIZED_LEVEL_BITS
19 #undef PW_LOG_TOKENIZED_MODULE_BITS
20 #undef PW_LOG_TOKENIZED_FLAG_BITS
21 #undef PW_LOG_TOKENIZED_LINE_BITS
22 
23 #define PW_LOG_TOKENIZED_LEVEL_BITS 3
24 #define PW_LOG_TOKENIZED_MODULE_BITS 16
25 #define PW_LOG_TOKENIZED_FLAG_BITS 2
26 #define PW_LOG_TOKENIZED_LINE_BITS 11
27 
28 #include "pw_log_tokenized/log_tokenized.h"
29 
30 #include "gtest/gtest.h"
31 #include "pw_log_tokenized_private/test_utils.h"
32 
33 namespace pw::log_tokenized {
34 namespace {
35 
TEST(LogTokenized,FormatString)36 TEST(LogTokenized, FormatString) {
37   PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_PAYLOAD(63, 1023, "hello %d", 1);
38   EXPECT_STREQ(last_log.format_string,
39                "■msg♦hello %d■module♦log module name!■file♦" __FILE__);
40 }
41 
42 constexpr uintptr_t kModuleToken =
43     PW_TOKENIZER_STRING_TOKEN(PW_LOG_MODULE_NAME) &
44     ((1u << PW_LOG_TOKENIZED_MODULE_BITS) - 1);
45 
TEST(LogTokenized,LogMetadata_LevelTooLarge_Clamps)46 TEST(LogTokenized, LogMetadata_LevelTooLarge_Clamps) {
47   auto check_metadata = [] {
48     Metadata metadata = Metadata(last_log.metadata);
49     EXPECT_EQ(metadata.level(), 7u);
50     EXPECT_EQ(metadata.flags(), 0u);
51     EXPECT_EQ(metadata.module(), kModuleToken);
52     EXPECT_TRUE(metadata.line_number() == 55u || metadata.line_number() == 45u);
53   };
54 
55   PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_PAYLOAD(8, 0, "hello");
56   check_metadata();
57 
58   pw_log_tokenized_Test_LogMetadata_LevelTooLarge_Clamps();
59   check_metadata();
60 }
61 
TEST(LogTokenized,LogMetadata_TooManyFlags_Truncates)62 TEST(LogTokenized, LogMetadata_TooManyFlags_Truncates) {
63   auto check_metadata = [] {
64     Metadata metadata = Metadata(last_log.metadata);
65     EXPECT_EQ(metadata.level(), 1u);
66     EXPECT_EQ(metadata.flags(), 0b11u);
67     EXPECT_EQ(metadata.module(), kModuleToken);
68     EXPECT_TRUE(metadata.line_number() == 71u || metadata.line_number() == 49u);
69   };
70 
71   PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_PAYLOAD(1, 0xFFFFFFFF, "hello");
72   check_metadata();
73 
74   pw_log_tokenized_Test_LogMetadata_TooManyFlags_Truncates();
75   check_metadata();
76 }
77 
TEST(LogTokenized,LogMetadata_VariousValues)78 TEST(LogTokenized, LogMetadata_VariousValues) {
79   auto check_metadata = [] {
80     Metadata metadata = Metadata(last_log.metadata);
81     EXPECT_EQ(metadata.level(), 6u);
82     EXPECT_EQ(metadata.flags(), 3u);
83     EXPECT_EQ(metadata.module(), kModuleToken);
84     EXPECT_EQ(last_log.arg_count, 1u);
85     EXPECT_TRUE(metadata.line_number() == 88u || metadata.line_number() == 53u);
86   };
87 
88   PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_PAYLOAD(6, 3, "hello%s", "?");
89   check_metadata();
90 
91   pw_log_tokenized_Test_LogMetadata_LogMetadata_VariousValues();
92   check_metadata();
93 }
94 
TEST(LogTokenized,LogMetadata_Zero)95 TEST(LogTokenized, LogMetadata_Zero) {
96   auto check_metadata = [] {
97     Metadata metadata = Metadata(last_log.metadata);
98     EXPECT_EQ(metadata.level(), 0u);
99     EXPECT_EQ(metadata.flags(), 0u);
100     EXPECT_EQ(metadata.module(), kModuleToken);
101     EXPECT_EQ(last_log.arg_count, 0u);
102     EXPECT_TRUE(metadata.line_number() == 106u ||
103                 metadata.line_number() == 57u);
104   };
105 
106   PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_PAYLOAD(0, 0, "hello");
107   check_metadata();
108 
109   pw_log_tokenized_Test_LogMetadata_LogMetadata_Zero();
110   check_metadata();
111 }
112 
TEST(LogTokenized,LogMetadata_MaxValues)113 TEST(LogTokenized, LogMetadata_MaxValues) {
114 #line 2047
115   PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_PAYLOAD(7, 3, "hello %d", 1);
116 
117   Metadata metadata = Metadata(last_log.metadata);
118   EXPECT_EQ(metadata.line_number(), 2047u);
119   EXPECT_EQ(metadata.level(), 7u);
120   EXPECT_EQ(metadata.flags(), 3u);
121   EXPECT_EQ(metadata.module(), kModuleToken);
122   EXPECT_EQ(last_log.arg_count, 1u);
123 }
124 
TEST(LogTokenized,LogMetadata_LineNumberTooLarge_IsZero)125 TEST(LogTokenized, LogMetadata_LineNumberTooLarge_IsZero) {
126 #line 2048  // At 11 bits, the largest representable line is 2047
127   PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_PAYLOAD(7, 3, "hello %d", 1);
128   EXPECT_EQ(Metadata(last_log.metadata).line_number(), 0u);
129 
130 #line 2049
131   PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_PAYLOAD(7, 3, "hello %d", 1);
132   EXPECT_EQ(Metadata(last_log.metadata).line_number(), 0u);
133 
134 #line 99999
135   PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_PAYLOAD(7, 3, "hello %d", 1);
136   EXPECT_EQ(Metadata(last_log.metadata).line_number(), 0u);
137 }
138 
139 }  // namespace
140 }  // namespace pw::log_tokenized
141