1*61c4878aSAndroid Build Coastguard Worker // Copyright 2021 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker #include "pw_log/proto_utils.h"
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker #include "pw_bytes/span.h"
18*61c4878aSAndroid Build Coastguard Worker #include "pw_containers/algorithm.h"
19*61c4878aSAndroid Build Coastguard Worker #include "pw_log/levels.h"
20*61c4878aSAndroid Build Coastguard Worker #include "pw_log/proto/log.pwpb.h"
21*61c4878aSAndroid Build Coastguard Worker #include "pw_protobuf/bytes_utils.h"
22*61c4878aSAndroid Build Coastguard Worker #include "pw_protobuf/decoder.h"
23*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
24*61c4878aSAndroid Build Coastguard Worker
25*61c4878aSAndroid Build Coastguard Worker namespace pw::log {
26*61c4878aSAndroid Build Coastguard Worker namespace {
27*61c4878aSAndroid Build Coastguard Worker
VerifyTokenizedLogEntry(pw::protobuf::Decoder & entry_decoder,pw::log_tokenized::Metadata expected_metadata,ConstByteSpan expected_tokenized_data,const int64_t expected_timestamp,ConstByteSpan expected_thread_name)28*61c4878aSAndroid Build Coastguard Worker void VerifyTokenizedLogEntry(pw::protobuf::Decoder& entry_decoder,
29*61c4878aSAndroid Build Coastguard Worker pw::log_tokenized::Metadata expected_metadata,
30*61c4878aSAndroid Build Coastguard Worker ConstByteSpan expected_tokenized_data,
31*61c4878aSAndroid Build Coastguard Worker const int64_t expected_timestamp,
32*61c4878aSAndroid Build Coastguard Worker ConstByteSpan expected_thread_name) {
33*61c4878aSAndroid Build Coastguard Worker ConstByteSpan tokenized_data;
34*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.Next().ok()); // message [tokenized]
35*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(entry_decoder.FieldNumber(),
36*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(log::pwpb::LogEntry::Fields::kMessage));
37*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.ReadBytes(&tokenized_data).ok());
38*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(std::memcmp(tokenized_data.data(),
39*61c4878aSAndroid Build Coastguard Worker expected_tokenized_data.data(),
40*61c4878aSAndroid Build Coastguard Worker expected_tokenized_data.size()) == 0);
41*61c4878aSAndroid Build Coastguard Worker
42*61c4878aSAndroid Build Coastguard Worker uint32_t line_level;
43*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.Next().ok()); // line_level
44*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(entry_decoder.FieldNumber(),
45*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(log::pwpb::LogEntry::Fields::kLineLevel));
46*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.ReadUint32(&line_level).ok());
47*61c4878aSAndroid Build Coastguard Worker
48*61c4878aSAndroid Build Coastguard Worker uint32_t line_number;
49*61c4878aSAndroid Build Coastguard Worker uint8_t level;
50*61c4878aSAndroid Build Coastguard Worker std::tie(line_number, level) = UnpackLineLevel(line_level);
51*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(expected_metadata.level(), level);
52*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(expected_metadata.line_number(), line_number);
53*61c4878aSAndroid Build Coastguard Worker
54*61c4878aSAndroid Build Coastguard Worker if (expected_metadata.flags() != 0) {
55*61c4878aSAndroid Build Coastguard Worker uint32_t flags;
56*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.Next().ok()); // flags
57*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(entry_decoder.FieldNumber(),
58*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(log::pwpb::LogEntry::Fields::kFlags));
59*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.ReadUint32(&flags).ok());
60*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(expected_metadata.flags(), flags);
61*61c4878aSAndroid Build Coastguard Worker }
62*61c4878aSAndroid Build Coastguard Worker
63*61c4878aSAndroid Build Coastguard Worker int64_t timestamp;
64*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.Next().ok()); // timestamp
65*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(
66*61c4878aSAndroid Build Coastguard Worker entry_decoder.FieldNumber() ==
67*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(log::pwpb::LogEntry::Fields::kTimestamp) ||
68*61c4878aSAndroid Build Coastguard Worker entry_decoder.FieldNumber() ==
69*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(
70*61c4878aSAndroid Build Coastguard Worker log::pwpb::LogEntry::Fields::kTimeSinceLastEntry));
71*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.ReadInt64(×tamp).ok());
72*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(expected_timestamp, timestamp);
73*61c4878aSAndroid Build Coastguard Worker
74*61c4878aSAndroid Build Coastguard Worker if (expected_metadata.module() != 0) {
75*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.Next().ok()); // module name
76*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(entry_decoder.FieldNumber(),
77*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(log::pwpb::LogEntry::Fields::kModule));
78*61c4878aSAndroid Build Coastguard Worker const Result<uint32_t> module =
79*61c4878aSAndroid Build Coastguard Worker protobuf::DecodeBytesToUint32(entry_decoder);
80*61c4878aSAndroid Build Coastguard Worker ASSERT_TRUE(module.ok());
81*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(expected_metadata.module(), module.value());
82*61c4878aSAndroid Build Coastguard Worker }
83*61c4878aSAndroid Build Coastguard Worker
84*61c4878aSAndroid Build Coastguard Worker if (!expected_thread_name.empty()) {
85*61c4878aSAndroid Build Coastguard Worker ConstByteSpan tokenized_thread_name;
86*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.Next().ok()); // thread [tokenized]
87*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(entry_decoder.FieldNumber(),
88*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(log::pwpb::LogEntry::Fields::kThread));
89*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.ReadBytes(&tokenized_thread_name).ok());
90*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(std::memcmp(tokenized_thread_name.data(),
91*61c4878aSAndroid Build Coastguard Worker expected_thread_name.data(),
92*61c4878aSAndroid Build Coastguard Worker expected_thread_name.size()) == 0);
93*61c4878aSAndroid Build Coastguard Worker }
94*61c4878aSAndroid Build Coastguard Worker }
95*61c4878aSAndroid Build Coastguard Worker
VerifyLogEntry(pw::protobuf::Decoder & entry_decoder,int expected_level,unsigned int expected_flags,std::string_view expected_module,std::string_view expected_thread_name,std::string_view expected_file_name,int expected_line_number,int64_t expected_ticks_since_epoch,std::string_view expected_message)96*61c4878aSAndroid Build Coastguard Worker void VerifyLogEntry(pw::protobuf::Decoder& entry_decoder,
97*61c4878aSAndroid Build Coastguard Worker int expected_level,
98*61c4878aSAndroid Build Coastguard Worker unsigned int expected_flags,
99*61c4878aSAndroid Build Coastguard Worker std::string_view expected_module,
100*61c4878aSAndroid Build Coastguard Worker std::string_view expected_thread_name,
101*61c4878aSAndroid Build Coastguard Worker std::string_view expected_file_name,
102*61c4878aSAndroid Build Coastguard Worker int expected_line_number,
103*61c4878aSAndroid Build Coastguard Worker int64_t expected_ticks_since_epoch,
104*61c4878aSAndroid Build Coastguard Worker std::string_view expected_message) {
105*61c4878aSAndroid Build Coastguard Worker std::string_view message;
106*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.Next().ok()); // message
107*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(entry_decoder.FieldNumber(),
108*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(log::pwpb::LogEntry::Fields::kMessage));
109*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.ReadString(&message).ok());
110*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(message, expected_message));
111*61c4878aSAndroid Build Coastguard Worker
112*61c4878aSAndroid Build Coastguard Worker uint32_t line_level;
113*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.Next().ok()); // line_level
114*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(entry_decoder.FieldNumber(),
115*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(log::pwpb::LogEntry::Fields::kLineLevel));
116*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.ReadUint32(&line_level).ok());
117*61c4878aSAndroid Build Coastguard Worker uint32_t line_number;
118*61c4878aSAndroid Build Coastguard Worker uint8_t level;
119*61c4878aSAndroid Build Coastguard Worker std::tie(line_number, level) = UnpackLineLevel(line_level);
120*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned int>(expected_line_number), line_number);
121*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(expected_level, level);
122*61c4878aSAndroid Build Coastguard Worker
123*61c4878aSAndroid Build Coastguard Worker if (expected_flags != 0) {
124*61c4878aSAndroid Build Coastguard Worker uint32_t flags;
125*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.Next().ok()); // flags
126*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(entry_decoder.FieldNumber(),
127*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(log::pwpb::LogEntry::Fields::kFlags));
128*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.ReadUint32(&flags).ok());
129*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(expected_flags, flags);
130*61c4878aSAndroid Build Coastguard Worker }
131*61c4878aSAndroid Build Coastguard Worker
132*61c4878aSAndroid Build Coastguard Worker int64_t timestamp;
133*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.Next().ok()); // timestamp
134*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(
135*61c4878aSAndroid Build Coastguard Worker entry_decoder.FieldNumber() ==
136*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(log::pwpb::LogEntry::Fields::kTimestamp) ||
137*61c4878aSAndroid Build Coastguard Worker entry_decoder.FieldNumber() ==
138*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(
139*61c4878aSAndroid Build Coastguard Worker log::pwpb::LogEntry::Fields::kTimeSinceLastEntry));
140*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.ReadInt64(×tamp).ok());
141*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(expected_ticks_since_epoch, timestamp);
142*61c4878aSAndroid Build Coastguard Worker
143*61c4878aSAndroid Build Coastguard Worker if (!expected_module.empty()) {
144*61c4878aSAndroid Build Coastguard Worker std::string_view module_name;
145*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.Next().ok()); // module
146*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(entry_decoder.FieldNumber(),
147*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(log::pwpb::LogEntry::Fields::kModule));
148*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.ReadString(&module_name).ok());
149*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(module_name, expected_module));
150*61c4878aSAndroid Build Coastguard Worker }
151*61c4878aSAndroid Build Coastguard Worker
152*61c4878aSAndroid Build Coastguard Worker if (!expected_file_name.empty()) {
153*61c4878aSAndroid Build Coastguard Worker std::string_view file_name;
154*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.Next().ok()); // file
155*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(entry_decoder.FieldNumber(),
156*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(log::pwpb::LogEntry::Fields::kFile));
157*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.ReadString(&file_name).ok());
158*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(file_name, expected_file_name));
159*61c4878aSAndroid Build Coastguard Worker }
160*61c4878aSAndroid Build Coastguard Worker
161*61c4878aSAndroid Build Coastguard Worker if (!expected_thread_name.empty()) {
162*61c4878aSAndroid Build Coastguard Worker std::string_view thread_name;
163*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.Next().ok()); // file
164*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(entry_decoder.FieldNumber(),
165*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>(log::pwpb::LogEntry::Fields::kThread));
166*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(entry_decoder.ReadString(&thread_name).ok());
167*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(thread_name, expected_thread_name));
168*61c4878aSAndroid Build Coastguard Worker }
169*61c4878aSAndroid Build Coastguard Worker }
170*61c4878aSAndroid Build Coastguard Worker
TEST(UtilsTest,LineLevelPacking)171*61c4878aSAndroid Build Coastguard Worker TEST(UtilsTest, LineLevelPacking) {
172*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t kExpectedLevel = PW_LOG_LEVEL_ERROR;
173*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kExpectedLine = 1234567;
174*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kExpectedLineLevel =
175*61c4878aSAndroid Build Coastguard Worker (kExpectedLine << PW_LOG_LEVEL_BITS) |
176*61c4878aSAndroid Build Coastguard Worker (kExpectedLevel & PW_LOG_LEVEL_BITMASK);
177*61c4878aSAndroid Build Coastguard Worker
178*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLineLevel, PackLineLevel(kExpectedLine, kExpectedLevel));
179*61c4878aSAndroid Build Coastguard Worker }
180*61c4878aSAndroid Build Coastguard Worker
TEST(UtilsTest,LineLevelUnpacking)181*61c4878aSAndroid Build Coastguard Worker TEST(UtilsTest, LineLevelUnpacking) {
182*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t kExpectedLevel = PW_LOG_LEVEL_ERROR;
183*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kExpectedLine = 1234567;
184*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kExpectedLineLevel =
185*61c4878aSAndroid Build Coastguard Worker (kExpectedLine << PW_LOG_LEVEL_BITS) |
186*61c4878aSAndroid Build Coastguard Worker (kExpectedLevel & PW_LOG_LEVEL_BITMASK);
187*61c4878aSAndroid Build Coastguard Worker
188*61c4878aSAndroid Build Coastguard Worker uint32_t line_number;
189*61c4878aSAndroid Build Coastguard Worker uint8_t level;
190*61c4878aSAndroid Build Coastguard Worker std::tie(line_number, level) = UnpackLineLevel(kExpectedLineLevel);
191*61c4878aSAndroid Build Coastguard Worker
192*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLine, line_number);
193*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLevel, level);
194*61c4878aSAndroid Build Coastguard Worker }
195*61c4878aSAndroid Build Coastguard Worker
TEST(UtilsTest,LineLevelPackAndUnpack)196*61c4878aSAndroid Build Coastguard Worker TEST(UtilsTest, LineLevelPackAndUnpack) {
197*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t kExpectedLevel = PW_LOG_LEVEL_ERROR;
198*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kExpectedLine = 1234567;
199*61c4878aSAndroid Build Coastguard Worker
200*61c4878aSAndroid Build Coastguard Worker uint32_t line_number;
201*61c4878aSAndroid Build Coastguard Worker uint8_t level;
202*61c4878aSAndroid Build Coastguard Worker std::tie(line_number, level) =
203*61c4878aSAndroid Build Coastguard Worker UnpackLineLevel(PackLineLevel(kExpectedLine, kExpectedLevel));
204*61c4878aSAndroid Build Coastguard Worker
205*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLine, line_number);
206*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLevel, level);
207*61c4878aSAndroid Build Coastguard Worker }
208*61c4878aSAndroid Build Coastguard Worker
TEST(UtilsTest,EncodeTokenizedLog)209*61c4878aSAndroid Build Coastguard Worker TEST(UtilsTest, EncodeTokenizedLog) {
210*61c4878aSAndroid Build Coastguard Worker constexpr std::byte kTokenizedData[1] = {std::byte(0x01)};
211*61c4878aSAndroid Build Coastguard Worker constexpr int64_t kExpectedTimestamp = 1;
212*61c4878aSAndroid Build Coastguard Worker constexpr std::byte kExpectedThreadName[1] = {std::byte(0x02)};
213*61c4878aSAndroid Build Coastguard Worker std::byte encode_buffer[32];
214*61c4878aSAndroid Build Coastguard Worker
215*61c4878aSAndroid Build Coastguard Worker pw::log_tokenized::Metadata metadata =
216*61c4878aSAndroid Build Coastguard Worker pw::log_tokenized::Metadata::Set<1, 2, 3, 4>();
217*61c4878aSAndroid Build Coastguard Worker
218*61c4878aSAndroid Build Coastguard Worker Result<ConstByteSpan> result = EncodeTokenizedLog(metadata,
219*61c4878aSAndroid Build Coastguard Worker kTokenizedData,
220*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
221*61c4878aSAndroid Build Coastguard Worker kExpectedThreadName,
222*61c4878aSAndroid Build Coastguard Worker encode_buffer);
223*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
224*61c4878aSAndroid Build Coastguard Worker
225*61c4878aSAndroid Build Coastguard Worker pw::protobuf::Decoder log_decoder(result.value());
226*61c4878aSAndroid Build Coastguard Worker VerifyTokenizedLogEntry(log_decoder,
227*61c4878aSAndroid Build Coastguard Worker metadata,
228*61c4878aSAndroid Build Coastguard Worker kTokenizedData,
229*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
230*61c4878aSAndroid Build Coastguard Worker kExpectedThreadName);
231*61c4878aSAndroid Build Coastguard Worker
232*61c4878aSAndroid Build Coastguard Worker result = EncodeTokenizedLog(metadata,
233*61c4878aSAndroid Build Coastguard Worker reinterpret_cast<const uint8_t*>(kTokenizedData),
234*61c4878aSAndroid Build Coastguard Worker sizeof(kTokenizedData),
235*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
236*61c4878aSAndroid Build Coastguard Worker kExpectedThreadName,
237*61c4878aSAndroid Build Coastguard Worker encode_buffer);
238*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
239*61c4878aSAndroid Build Coastguard Worker
240*61c4878aSAndroid Build Coastguard Worker log_decoder.Reset(result.value());
241*61c4878aSAndroid Build Coastguard Worker VerifyTokenizedLogEntry(log_decoder,
242*61c4878aSAndroid Build Coastguard Worker metadata,
243*61c4878aSAndroid Build Coastguard Worker kTokenizedData,
244*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
245*61c4878aSAndroid Build Coastguard Worker kExpectedThreadName);
246*61c4878aSAndroid Build Coastguard Worker }
247*61c4878aSAndroid Build Coastguard Worker
TEST(UtilsTest,EncodeTokenizedLog_EmptyFlags)248*61c4878aSAndroid Build Coastguard Worker TEST(UtilsTest, EncodeTokenizedLog_EmptyFlags) {
249*61c4878aSAndroid Build Coastguard Worker constexpr std::byte kTokenizedData[1] = {std::byte(0x01)};
250*61c4878aSAndroid Build Coastguard Worker constexpr int64_t kExpectedTimestamp = 1;
251*61c4878aSAndroid Build Coastguard Worker constexpr std::byte kExpectedThreadName[1] = {std::byte(0x02)};
252*61c4878aSAndroid Build Coastguard Worker std::byte encode_buffer[32];
253*61c4878aSAndroid Build Coastguard Worker
254*61c4878aSAndroid Build Coastguard Worker // Create an empty flags set.
255*61c4878aSAndroid Build Coastguard Worker pw::log_tokenized::Metadata metadata =
256*61c4878aSAndroid Build Coastguard Worker pw::log_tokenized::Metadata::Set<1, 2, 0, 4>();
257*61c4878aSAndroid Build Coastguard Worker
258*61c4878aSAndroid Build Coastguard Worker Result<ConstByteSpan> result = EncodeTokenizedLog(metadata,
259*61c4878aSAndroid Build Coastguard Worker kTokenizedData,
260*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
261*61c4878aSAndroid Build Coastguard Worker kExpectedThreadName,
262*61c4878aSAndroid Build Coastguard Worker encode_buffer);
263*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
264*61c4878aSAndroid Build Coastguard Worker
265*61c4878aSAndroid Build Coastguard Worker pw::protobuf::Decoder log_decoder(result.value());
266*61c4878aSAndroid Build Coastguard Worker VerifyTokenizedLogEntry(log_decoder,
267*61c4878aSAndroid Build Coastguard Worker metadata,
268*61c4878aSAndroid Build Coastguard Worker kTokenizedData,
269*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
270*61c4878aSAndroid Build Coastguard Worker kExpectedThreadName);
271*61c4878aSAndroid Build Coastguard Worker }
272*61c4878aSAndroid Build Coastguard Worker
TEST(UtilsTest,EncodeTokenizedLog_InsufficientSpace)273*61c4878aSAndroid Build Coastguard Worker TEST(UtilsTest, EncodeTokenizedLog_InsufficientSpace) {
274*61c4878aSAndroid Build Coastguard Worker constexpr std::byte kTokenizedData[1] = {std::byte(0x01)};
275*61c4878aSAndroid Build Coastguard Worker constexpr int64_t kExpectedTimestamp = 1;
276*61c4878aSAndroid Build Coastguard Worker constexpr std::byte kExpectedThreadName[1] = {std::byte(0x02)};
277*61c4878aSAndroid Build Coastguard Worker std::byte encode_buffer[1];
278*61c4878aSAndroid Build Coastguard Worker
279*61c4878aSAndroid Build Coastguard Worker pw::log_tokenized::Metadata metadata =
280*61c4878aSAndroid Build Coastguard Worker pw::log_tokenized::Metadata::Set<1, 2, 3, 4>();
281*61c4878aSAndroid Build Coastguard Worker
282*61c4878aSAndroid Build Coastguard Worker Result<ConstByteSpan> result = EncodeTokenizedLog(metadata,
283*61c4878aSAndroid Build Coastguard Worker kTokenizedData,
284*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
285*61c4878aSAndroid Build Coastguard Worker kExpectedThreadName,
286*61c4878aSAndroid Build Coastguard Worker encode_buffer);
287*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.status().IsResourceExhausted());
288*61c4878aSAndroid Build Coastguard Worker }
289*61c4878aSAndroid Build Coastguard Worker
TEST(UtilsTest,EncodeLog)290*61c4878aSAndroid Build Coastguard Worker TEST(UtilsTest, EncodeLog) {
291*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLevel = PW_LOG_LEVEL_INFO;
292*61c4878aSAndroid Build Coastguard Worker constexpr unsigned int kExpectedFlags = 2;
293*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedModule("TST");
294*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedThread("thread");
295*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedFile("proto_test.cc");
296*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLine = 14;
297*61c4878aSAndroid Build Coastguard Worker constexpr int64_t kExpectedTimestamp = 1;
298*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedMessage("msg");
299*61c4878aSAndroid Build Coastguard Worker std::byte encode_buffer[64];
300*61c4878aSAndroid Build Coastguard Worker
301*61c4878aSAndroid Build Coastguard Worker Result<ConstByteSpan> result = EncodeLog(kExpectedLevel,
302*61c4878aSAndroid Build Coastguard Worker kExpectedFlags,
303*61c4878aSAndroid Build Coastguard Worker kExpectedModule,
304*61c4878aSAndroid Build Coastguard Worker kExpectedThread,
305*61c4878aSAndroid Build Coastguard Worker kExpectedFile,
306*61c4878aSAndroid Build Coastguard Worker kExpectedLine,
307*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
308*61c4878aSAndroid Build Coastguard Worker kExpectedMessage,
309*61c4878aSAndroid Build Coastguard Worker encode_buffer);
310*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
311*61c4878aSAndroid Build Coastguard Worker
312*61c4878aSAndroid Build Coastguard Worker pw::protobuf::Decoder log_decoder(result.value());
313*61c4878aSAndroid Build Coastguard Worker VerifyLogEntry(log_decoder,
314*61c4878aSAndroid Build Coastguard Worker kExpectedLevel,
315*61c4878aSAndroid Build Coastguard Worker kExpectedFlags,
316*61c4878aSAndroid Build Coastguard Worker kExpectedModule,
317*61c4878aSAndroid Build Coastguard Worker kExpectedThread,
318*61c4878aSAndroid Build Coastguard Worker kExpectedFile,
319*61c4878aSAndroid Build Coastguard Worker kExpectedLine,
320*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
321*61c4878aSAndroid Build Coastguard Worker kExpectedMessage);
322*61c4878aSAndroid Build Coastguard Worker }
323*61c4878aSAndroid Build Coastguard Worker
TEST(UtilsTest,EncodeLog_EmptyFlags)324*61c4878aSAndroid Build Coastguard Worker TEST(UtilsTest, EncodeLog_EmptyFlags) {
325*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLevel = PW_LOG_LEVEL_INFO;
326*61c4878aSAndroid Build Coastguard Worker constexpr unsigned int kExpectedFlags = 0;
327*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedModule("TST");
328*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedThread("thread");
329*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedFile("proto_test.cc");
330*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLine = 14;
331*61c4878aSAndroid Build Coastguard Worker constexpr int64_t kExpectedTimestamp = 1;
332*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedMessage("msg");
333*61c4878aSAndroid Build Coastguard Worker std::byte encode_buffer[64];
334*61c4878aSAndroid Build Coastguard Worker
335*61c4878aSAndroid Build Coastguard Worker Result<ConstByteSpan> result = EncodeLog(kExpectedLevel,
336*61c4878aSAndroid Build Coastguard Worker kExpectedFlags,
337*61c4878aSAndroid Build Coastguard Worker kExpectedModule,
338*61c4878aSAndroid Build Coastguard Worker kExpectedThread,
339*61c4878aSAndroid Build Coastguard Worker kExpectedFile,
340*61c4878aSAndroid Build Coastguard Worker kExpectedLine,
341*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
342*61c4878aSAndroid Build Coastguard Worker kExpectedMessage,
343*61c4878aSAndroid Build Coastguard Worker encode_buffer);
344*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
345*61c4878aSAndroid Build Coastguard Worker
346*61c4878aSAndroid Build Coastguard Worker pw::protobuf::Decoder log_decoder(result.value());
347*61c4878aSAndroid Build Coastguard Worker VerifyLogEntry(log_decoder,
348*61c4878aSAndroid Build Coastguard Worker kExpectedLevel,
349*61c4878aSAndroid Build Coastguard Worker kExpectedFlags,
350*61c4878aSAndroid Build Coastguard Worker kExpectedModule,
351*61c4878aSAndroid Build Coastguard Worker kExpectedThread,
352*61c4878aSAndroid Build Coastguard Worker kExpectedFile,
353*61c4878aSAndroid Build Coastguard Worker kExpectedLine,
354*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
355*61c4878aSAndroid Build Coastguard Worker kExpectedMessage);
356*61c4878aSAndroid Build Coastguard Worker }
357*61c4878aSAndroid Build Coastguard Worker
TEST(UtilsTest,EncodeLog_EmptyFile)358*61c4878aSAndroid Build Coastguard Worker TEST(UtilsTest, EncodeLog_EmptyFile) {
359*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLevel = PW_LOG_LEVEL_INFO;
360*61c4878aSAndroid Build Coastguard Worker constexpr unsigned int kExpectedFlags = 0;
361*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedModule("TST");
362*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedThread("thread");
363*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedFile;
364*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLine = 14;
365*61c4878aSAndroid Build Coastguard Worker constexpr int64_t kExpectedTimestamp = 1;
366*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedMessage("msg");
367*61c4878aSAndroid Build Coastguard Worker std::byte encode_buffer[64];
368*61c4878aSAndroid Build Coastguard Worker
369*61c4878aSAndroid Build Coastguard Worker Result<ConstByteSpan> result = EncodeLog(kExpectedLevel,
370*61c4878aSAndroid Build Coastguard Worker kExpectedFlags,
371*61c4878aSAndroid Build Coastguard Worker kExpectedModule,
372*61c4878aSAndroid Build Coastguard Worker kExpectedThread,
373*61c4878aSAndroid Build Coastguard Worker kExpectedFile,
374*61c4878aSAndroid Build Coastguard Worker kExpectedLine,
375*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
376*61c4878aSAndroid Build Coastguard Worker kExpectedMessage,
377*61c4878aSAndroid Build Coastguard Worker encode_buffer);
378*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
379*61c4878aSAndroid Build Coastguard Worker
380*61c4878aSAndroid Build Coastguard Worker pw::protobuf::Decoder log_decoder(result.value());
381*61c4878aSAndroid Build Coastguard Worker VerifyLogEntry(log_decoder,
382*61c4878aSAndroid Build Coastguard Worker kExpectedLevel,
383*61c4878aSAndroid Build Coastguard Worker kExpectedFlags,
384*61c4878aSAndroid Build Coastguard Worker kExpectedModule,
385*61c4878aSAndroid Build Coastguard Worker kExpectedThread,
386*61c4878aSAndroid Build Coastguard Worker kExpectedFile,
387*61c4878aSAndroid Build Coastguard Worker kExpectedLine,
388*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
389*61c4878aSAndroid Build Coastguard Worker kExpectedMessage);
390*61c4878aSAndroid Build Coastguard Worker }
391*61c4878aSAndroid Build Coastguard Worker
TEST(UtilsTest,EncodeLog_EmptyModule)392*61c4878aSAndroid Build Coastguard Worker TEST(UtilsTest, EncodeLog_EmptyModule) {
393*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLevel = PW_LOG_LEVEL_INFO;
394*61c4878aSAndroid Build Coastguard Worker constexpr unsigned int kExpectedFlags = 3;
395*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedModule;
396*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedThread("thread");
397*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedFile("test.cc");
398*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLine = 14;
399*61c4878aSAndroid Build Coastguard Worker constexpr int64_t kExpectedTimestamp = 1;
400*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedMessage("msg");
401*61c4878aSAndroid Build Coastguard Worker std::byte encode_buffer[64];
402*61c4878aSAndroid Build Coastguard Worker
403*61c4878aSAndroid Build Coastguard Worker Result<ConstByteSpan> result = EncodeLog(kExpectedLevel,
404*61c4878aSAndroid Build Coastguard Worker kExpectedFlags,
405*61c4878aSAndroid Build Coastguard Worker kExpectedModule,
406*61c4878aSAndroid Build Coastguard Worker kExpectedThread,
407*61c4878aSAndroid Build Coastguard Worker kExpectedFile,
408*61c4878aSAndroid Build Coastguard Worker kExpectedLine,
409*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
410*61c4878aSAndroid Build Coastguard Worker kExpectedMessage,
411*61c4878aSAndroid Build Coastguard Worker encode_buffer);
412*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
413*61c4878aSAndroid Build Coastguard Worker
414*61c4878aSAndroid Build Coastguard Worker pw::protobuf::Decoder log_decoder(result.value());
415*61c4878aSAndroid Build Coastguard Worker VerifyLogEntry(log_decoder,
416*61c4878aSAndroid Build Coastguard Worker kExpectedLevel,
417*61c4878aSAndroid Build Coastguard Worker kExpectedFlags,
418*61c4878aSAndroid Build Coastguard Worker kExpectedModule,
419*61c4878aSAndroid Build Coastguard Worker kExpectedThread,
420*61c4878aSAndroid Build Coastguard Worker kExpectedFile,
421*61c4878aSAndroid Build Coastguard Worker kExpectedLine,
422*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
423*61c4878aSAndroid Build Coastguard Worker kExpectedMessage);
424*61c4878aSAndroid Build Coastguard Worker }
425*61c4878aSAndroid Build Coastguard Worker
TEST(UtilsTest,EncodeLog_EmptyThread)426*61c4878aSAndroid Build Coastguard Worker TEST(UtilsTest, EncodeLog_EmptyThread) {
427*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLevel = PW_LOG_LEVEL_INFO;
428*61c4878aSAndroid Build Coastguard Worker constexpr unsigned int kExpectedFlags = 2;
429*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedModule("TST");
430*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedThread;
431*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedFile("proto_test.cc");
432*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLine = 14;
433*61c4878aSAndroid Build Coastguard Worker constexpr int64_t kExpectedTimestamp = 1;
434*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedMessage("msg");
435*61c4878aSAndroid Build Coastguard Worker std::byte encode_buffer[64];
436*61c4878aSAndroid Build Coastguard Worker
437*61c4878aSAndroid Build Coastguard Worker Result<ConstByteSpan> result = EncodeLog(kExpectedLevel,
438*61c4878aSAndroid Build Coastguard Worker kExpectedFlags,
439*61c4878aSAndroid Build Coastguard Worker kExpectedModule,
440*61c4878aSAndroid Build Coastguard Worker kExpectedThread,
441*61c4878aSAndroid Build Coastguard Worker kExpectedFile,
442*61c4878aSAndroid Build Coastguard Worker kExpectedLine,
443*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
444*61c4878aSAndroid Build Coastguard Worker kExpectedMessage,
445*61c4878aSAndroid Build Coastguard Worker encode_buffer);
446*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
447*61c4878aSAndroid Build Coastguard Worker
448*61c4878aSAndroid Build Coastguard Worker pw::protobuf::Decoder log_decoder(result.value());
449*61c4878aSAndroid Build Coastguard Worker VerifyLogEntry(log_decoder,
450*61c4878aSAndroid Build Coastguard Worker kExpectedLevel,
451*61c4878aSAndroid Build Coastguard Worker kExpectedFlags,
452*61c4878aSAndroid Build Coastguard Worker kExpectedModule,
453*61c4878aSAndroid Build Coastguard Worker kExpectedThread,
454*61c4878aSAndroid Build Coastguard Worker kExpectedFile,
455*61c4878aSAndroid Build Coastguard Worker kExpectedLine,
456*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
457*61c4878aSAndroid Build Coastguard Worker kExpectedMessage);
458*61c4878aSAndroid Build Coastguard Worker }
459*61c4878aSAndroid Build Coastguard Worker
TEST(UtilsTest,EncodeLog_EmptyMessage)460*61c4878aSAndroid Build Coastguard Worker TEST(UtilsTest, EncodeLog_EmptyMessage) {
461*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLevel = PW_LOG_LEVEL_INFO;
462*61c4878aSAndroid Build Coastguard Worker constexpr unsigned int kExpectedFlags = 0;
463*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedModule;
464*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedThread;
465*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedFile;
466*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLine = 14;
467*61c4878aSAndroid Build Coastguard Worker constexpr int64_t kExpectedTimestamp = 1;
468*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedMessage;
469*61c4878aSAndroid Build Coastguard Worker std::byte encode_buffer[64];
470*61c4878aSAndroid Build Coastguard Worker
471*61c4878aSAndroid Build Coastguard Worker Result<ConstByteSpan> result = EncodeLog(kExpectedLevel,
472*61c4878aSAndroid Build Coastguard Worker kExpectedFlags,
473*61c4878aSAndroid Build Coastguard Worker kExpectedModule,
474*61c4878aSAndroid Build Coastguard Worker kExpectedThread,
475*61c4878aSAndroid Build Coastguard Worker kExpectedFile,
476*61c4878aSAndroid Build Coastguard Worker kExpectedLine,
477*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
478*61c4878aSAndroid Build Coastguard Worker kExpectedMessage,
479*61c4878aSAndroid Build Coastguard Worker encode_buffer);
480*61c4878aSAndroid Build Coastguard Worker
481*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.status().IsInvalidArgument());
482*61c4878aSAndroid Build Coastguard Worker }
483*61c4878aSAndroid Build Coastguard Worker
TEST(UtilsTest,EncodeLog_InsufficientSpace)484*61c4878aSAndroid Build Coastguard Worker TEST(UtilsTest, EncodeLog_InsufficientSpace) {
485*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLevel = PW_LOG_LEVEL_INFO;
486*61c4878aSAndroid Build Coastguard Worker constexpr unsigned int kExpectedFlags = 0;
487*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedModule;
488*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedThread;
489*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedFile;
490*61c4878aSAndroid Build Coastguard Worker constexpr int kExpectedLine = 14;
491*61c4878aSAndroid Build Coastguard Worker constexpr int64_t kExpectedTimestamp = 1;
492*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedMessage("msg");
493*61c4878aSAndroid Build Coastguard Worker std::byte encode_buffer[1];
494*61c4878aSAndroid Build Coastguard Worker
495*61c4878aSAndroid Build Coastguard Worker Result<ConstByteSpan> result = EncodeLog(kExpectedLevel,
496*61c4878aSAndroid Build Coastguard Worker kExpectedFlags,
497*61c4878aSAndroid Build Coastguard Worker kExpectedModule,
498*61c4878aSAndroid Build Coastguard Worker kExpectedThread,
499*61c4878aSAndroid Build Coastguard Worker kExpectedFile,
500*61c4878aSAndroid Build Coastguard Worker kExpectedLine,
501*61c4878aSAndroid Build Coastguard Worker kExpectedTimestamp,
502*61c4878aSAndroid Build Coastguard Worker kExpectedMessage,
503*61c4878aSAndroid Build Coastguard Worker encode_buffer);
504*61c4878aSAndroid Build Coastguard Worker
505*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.status().IsResourceExhausted());
506*61c4878aSAndroid Build Coastguard Worker }
507*61c4878aSAndroid Build Coastguard Worker
508*61c4878aSAndroid Build Coastguard Worker } // namespace
509*61c4878aSAndroid Build Coastguard Worker } // namespace pw::log
510