blob: 410db74f23942e5b0fb04cf38f219f228f00c19e [file] [log] [blame]
Robert Oliver81e6e3e2020-06-25 14:43:40 -04001// Copyright 2020 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_TRACE_MODULE_NAME "TST"
16
17#include "pw_trace_tokenized/trace_buffer.h"
18
19#include "gtest/gtest.h"
20#include "pw_trace/trace.h"
21
22TEST(TokenizedTrace, Simple) {
23 PW_TRACE_SET_ENABLED(true);
24 pw::trace::ClearBuffer();
25
26 PW_TRACE_INSTANT("Test");
27
28 // Check results
29 pw::ring_buffer::PrefixedEntryRingBuffer* buf = pw::trace::GetBuffer();
30
31 EXPECT_EQ(buf->EntryCount(), 1u);
32 const size_t expected_min_bytes_used =
33 1 /*varint size */ + 4 /*token*/ + 1 /* min varint time */;
34 const size_t expected_max_bytes_used = 1 /*varint size */ + 4 /*token*/ +
35 sizeof(PW_TRACE_TIME_TYPE) +
36 1 /* max varint time */;
37
38 EXPECT_GE(buf->TotalUsedBytes(), expected_min_bytes_used);
39 EXPECT_LE(buf->TotalUsedBytes(), expected_max_bytes_used);
40}
41
42TEST(TokenizedTrace, TraceId) {
43 PW_TRACE_SET_ENABLED(true);
44 pw::trace::ClearBuffer();
45
46 uint32_t trace_id = 256;
47 PW_TRACE_INSTANT("Test", "group", trace_id);
48
49 // Check results
50 pw::ring_buffer::PrefixedEntryRingBuffer* buf = pw::trace::GetBuffer();
51
52 EXPECT_EQ(buf->EntryCount(), 1u);
53 const size_t expected_min_bytes_used = 1 /*varint size */ + 4 /*token*/ +
54 1 /* min varint time */ +
55 2 /*varint trace id*/;
56 const size_t expected_max_bytes_used =
57 1 /*varint size */ + 4 /*token*/ + sizeof(PW_TRACE_TIME_TYPE) +
58 1 /* max varint time */ + 2 /*varint trace id*/;
59
60 EXPECT_GE(buf->TotalUsedBytes(), expected_min_bytes_used);
61 EXPECT_LE(buf->TotalUsedBytes(), expected_max_bytes_used);
62}
63
64TEST(TokenizedTrace, Data) {
65 PW_TRACE_SET_ENABLED(true);
66 pw::trace::ClearBuffer();
67
68 char data[] = "some test data";
69 PW_TRACE_INSTANT_DATA("Test", "test_data", data, sizeof(data));
70
71 // Check results
72 pw::ring_buffer::PrefixedEntryRingBuffer* buf = pw::trace::GetBuffer();
73
74 EXPECT_EQ(buf->EntryCount(), 1u);
75 const size_t expected_min_bytes_used =
76 1 /*varint size */ + 4 /*token*/ + 1 /* min varint time */ + sizeof(data);
77 const size_t expected_max_bytes_used = 1 /*varint size */ + 4 /*token*/ +
78 sizeof(PW_TRACE_TIME_TYPE) +
79 1 /* max varint time */ + sizeof(data);
80
81 EXPECT_GE(buf->TotalUsedBytes(), expected_min_bytes_used);
82 EXPECT_LE(buf->TotalUsedBytes(), expected_max_bytes_used);
83
84 std::byte value[expected_max_bytes_used];
85 size_t bytes_read = 0;
86 EXPECT_EQ(buf->PeekFront(std::span<std::byte>(value), &bytes_read),
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -080087 pw::OkStatus());
Robert Oliver81e6e3e2020-06-25 14:43:40 -040088
89 // read size is minus 1, since doesn't include varint size
90 EXPECT_GE(bytes_read, expected_min_bytes_used - 1);
91 EXPECT_LE(bytes_read, expected_max_bytes_used - 1);
92 EXPECT_STREQ(data,
93 reinterpret_cast<char*>(&value[bytes_read - sizeof(data)]));
94}
95
96TEST(TokenizedTrace, Clear) {
97 PW_TRACE_SET_ENABLED(true);
98 pw::trace::ClearBuffer();
99 pw::ring_buffer::PrefixedEntryRingBuffer* buf = pw::trace::GetBuffer();
100
101 PW_TRACE_INSTANT("Test");
102 EXPECT_EQ(buf->EntryCount(), 1u);
103 pw::trace::ClearBuffer();
104 EXPECT_EQ(buf->EntryCount(), 0u);
105}
106
107TEST(TokenizedTrace, Overflow) {
108 PW_TRACE_SET_ENABLED(true);
109 pw::trace::ClearBuffer();
110 pw::ring_buffer::PrefixedEntryRingBuffer* buf = pw::trace::GetBuffer();
111
112 // Add samples until entry count stops increasing.
113 uint32_t last_entry_count = 0;
114 size_t count = 0;
115 while (buf->EntryCount() == 0 || buf->EntryCount() > last_entry_count) {
116 last_entry_count = buf->EntryCount();
117 PW_TRACE_INSTANT_DATA("Test", "count", &count, sizeof(count));
118 count++;
119 }
120 // CHECK
121 size_t expected_count = 1; // skip first (since it was lost)
122 while (buf->EntryCount() > 0) {
123 std::byte value[PW_TRACE_BUFFER_MAX_BLOCK_SIZE_BYTES];
124 size_t bytes_read = 0;
125 EXPECT_EQ(buf->PeekFront(std::span<std::byte>(value), &bytes_read),
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800126 pw::OkStatus());
127 EXPECT_EQ(buf->PopFront(), pw::OkStatus());
Robert Oliver81e6e3e2020-06-25 14:43:40 -0400128 EXPECT_EQ(*reinterpret_cast<size_t*>(&value[bytes_read - sizeof(size_t)]),
129 expected_count);
130 expected_count++;
131 }
132
133 EXPECT_EQ(count, expected_count);
134}
135
136TEST(TokenizedTrace, BlockTooLarge) {
137 PW_TRACE_SET_ENABLED(true);
138 pw::trace::ClearBuffer();
139 pw::ring_buffer::PrefixedEntryRingBuffer* buf = pw::trace::GetBuffer();
140 uint8_t data[PW_TRACE_BUFFER_MAX_BLOCK_SIZE_BYTES];
141 PW_TRACE_INSTANT_DATA("Test", "data", data, sizeof(data));
142 EXPECT_EQ(buf->EntryCount(), 0u);
143}