blob: 7a843f47bead29348fa7604ae6acbfc2efbee30d [file] [log] [blame]
Wyatt Hepler21ab0f42021-03-15 09:38:11 -07001// Copyright 2021 The Pigweed Authors
Wyatt Heplercb725c12020-05-01 11:05:01 -07002//
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
Wyatt Hepler814b2aa2020-08-10 09:06:57 -070015#define PW_LOG_MODULE_NAME "This is the log module name!"
16
Wyatt Hepler21ab0f42021-03-15 09:38:11 -070017// Create a fake version of the tokenization macro.
18#undef PW_LOG_TOKENIZED_ENCODE_MESSAGE
19#define PW_LOG_TOKENIZED_ENCODE_MESSAGE(payload, message, ...) \
20 CaptureTokenizerArgs(payload, \
21 PW_MACRO_ARG_COUNT(__VA_ARGS__), \
22 message PW_COMMA_ARGS(__VA_ARGS__))
23
Wyatt Heplercb725c12020-05-01 11:05:01 -070024#include <cstring>
25#include <string_view>
Wyatt Hepler21ab0f42021-03-15 09:38:11 -070026#include <tuple>
Wyatt Heplercb725c12020-05-01 11:05:01 -070027
Wyatt Heplercb725c12020-05-01 11:05:01 -070028#include "gtest/gtest.h"
29#include "pw_log_tokenized/log_tokenized.h"
Wyatt Hepler21ab0f42021-03-15 09:38:11 -070030#include "pw_preprocessor/arguments.h"
31#include "pw_preprocessor/compiler.h"
Wyatt Heplercb725c12020-05-01 11:05:01 -070032
33namespace pw::log_tokenized {
34namespace {
35
Wyatt Hepler21ab0f42021-03-15 09:38:11 -070036struct {
37 Metadata metadata = Metadata(0);
38 const char* format_string = "";
39 size_t arg_count = 0;
40} last_log{};
Wyatt Heplercb725c12020-05-01 11:05:01 -070041
Wyatt Hepler21ab0f42021-03-15 09:38:11 -070042void CaptureTokenizerArgs(pw_tokenizer_Payload payload,
43 size_t arg_count,
44 const char* message,
45 ...) PW_PRINTF_FORMAT(3, 4);
46
47void CaptureTokenizerArgs(pw_tokenizer_Payload payload,
48 size_t arg_count,
49 const char* message,
50 ...) {
51 last_log.metadata = payload;
52 last_log.format_string = message;
53 last_log.arg_count = arg_count;
Wyatt Heplercb725c12020-05-01 11:05:01 -070054}
55
Wyatt Hepler814b2aa2020-08-10 09:06:57 -070056constexpr uintptr_t kModuleToken =
57 PW_TOKENIZER_STRING_TOKEN(PW_LOG_MODULE_NAME) &
Wyatt Hepler21ab0f42021-03-15 09:38:11 -070058 ((1u << PW_LOG_TOKENIZED_MODULE_BITS) - 1);
Wyatt Hepler814b2aa2020-08-10 09:06:57 -070059
Wyatt Heplercb725c12020-05-01 11:05:01 -070060constexpr Metadata test1 = Metadata::Set<0, 0, 0>();
61static_assert(test1.level() == 0);
62static_assert(test1.module() == 0);
63static_assert(test1.flags() == 0);
64
65constexpr Metadata test2 = Metadata::Set<3, 2, 1>();
66static_assert(test2.level() == 3);
67static_assert(test2.module() == 2);
68static_assert(test2.flags() == 1);
69
70constexpr Metadata test3 = Metadata::Set<63, 65535, 1023>();
71static_assert(test3.level() == 63);
72static_assert(test3.module() == 65535);
73static_assert(test3.flags() == 1023);
74
Wyatt Heplercb725c12020-05-01 11:05:01 -070075TEST(LogTokenized, LogMetadata_Zero) {
76 PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_PAYLOAD(0, 0, "hello");
Wyatt Hepler21ab0f42021-03-15 09:38:11 -070077 EXPECT_EQ(last_log.metadata.level(), 0u);
78 EXPECT_EQ(last_log.metadata.flags(), 0u);
79 EXPECT_EQ(last_log.metadata.module(), kModuleToken);
80 EXPECT_EQ(last_log.arg_count, 0u);
Wyatt Heplercb725c12020-05-01 11:05:01 -070081}
82
83TEST(LogTokenized, LogMetadata_DifferentValues) {
84 PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_PAYLOAD(55, 36, "hello%s", "?");
Wyatt Hepler21ab0f42021-03-15 09:38:11 -070085 EXPECT_EQ(last_log.metadata.level(), 55u);
86 EXPECT_EQ(last_log.metadata.flags(), 36u);
87 EXPECT_EQ(last_log.metadata.module(), kModuleToken);
88 EXPECT_EQ(last_log.arg_count, 1u);
Wyatt Heplercb725c12020-05-01 11:05:01 -070089}
90
91TEST(LogTokenized, LogMetadata_MaxValues) {
92 PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_PAYLOAD(63, 1023, "hello %d", 1);
Wyatt Hepler21ab0f42021-03-15 09:38:11 -070093 EXPECT_EQ(last_log.metadata.level(), 63u);
94 EXPECT_EQ(last_log.metadata.flags(), 1023u);
95 EXPECT_EQ(last_log.metadata.module(), kModuleToken);
96 EXPECT_EQ(last_log.arg_count, 1u);
Wyatt Heplercb725c12020-05-01 11:05:01 -070097}
98
Wyatt Heplercb725c12020-05-01 11:05:01 -070099} // namespace
100} // namespace pw::log_tokenized