24 #include <gtest/gtest.h>
58 void ValidateJsonArraySize(
const Json&
array,
size_t expected) {
67 void ValidateChannelTraceData(
const Json& json,
68 size_t num_events_logged_expected,
69 size_t actual_num_events_expected) {
72 Json& num_events_logged_json =
object[
"numEventsLogged"];
74 size_t num_events_logged =
static_cast<size_t>(
75 strtol(num_events_logged_json.string_value().c_str(),
nullptr, 0));
76 ASSERT_EQ(num_events_logged, num_events_logged_expected);
77 Json& start_time_json =
object[
"creationTimestamp"];
79 ValidateJsonArraySize(
object[
"events"], actual_num_events_expected);
82 void AddSimpleTrace(ChannelTrace* tracer) {
83 tracer->AddTraceEvent(ChannelTrace::Severity::Info,
88 void ValidateChannelTraceCustom(ChannelTrace* tracer,
size_t num_events_logged,
89 size_t num_events_expected) {
90 Json json = tracer->RenderJson();
94 ValidateChannelTraceData(json, num_events_logged, num_events_expected);
97 void ValidateChannelTrace(ChannelTrace* tracer,
size_t num_events_logged) {
98 ValidateChannelTraceCustom(tracer, num_events_logged, num_events_logged);
101 class ChannelFixture {
103 explicit ChannelFixture(
int max_tracer_event_memory) {
106 max_tracer_event_memory);
127 TEST(ChannelTracerTest, BasicTest) {
130 AddSimpleTrace(&tracer);
131 AddSimpleTrace(&tracer);
136 ValidateChannelTrace(&tracer, 4);
137 AddSimpleTrace(&tracer);
138 AddSimpleTrace(&tracer);
139 ValidateChannelTrace(&tracer, 6);
140 AddSimpleTrace(&tracer);
141 AddSimpleTrace(&tracer);
142 AddSimpleTrace(&tracer);
143 AddSimpleTrace(&tracer);
144 ValidateChannelTrace(&tracer, 10);
150 TEST(ChannelTracerTest, ComplexTest) {
153 AddSimpleTrace(&tracer);
154 AddSimpleTrace(&tracer);
160 ChannelTrace::Severity::Info,
162 ValidateChannelTrace(&tracer, 3);
163 AddSimpleTrace(sc1_peer.
trace());
164 AddSimpleTrace(sc1_peer.
trace());
165 AddSimpleTrace(sc1_peer.
trace());
166 ValidateChannelTrace(sc1_peer.
trace(), 3);
167 AddSimpleTrace(sc1_peer.
trace());
168 AddSimpleTrace(sc1_peer.
trace());
169 AddSimpleTrace(sc1_peer.
trace());
170 ValidateChannelTrace(sc1_peer.
trace(), 6);
171 AddSimpleTrace(&tracer);
172 AddSimpleTrace(&tracer);
173 ValidateChannelTrace(&tracer, 5);
178 ChannelTrace::Severity::Info,
181 ChannelTrace::Severity::Warning,
183 ValidateChannelTrace(&tracer, 7);
184 AddSimpleTrace(&tracer);
185 AddSimpleTrace(&tracer);
186 AddSimpleTrace(&tracer);
187 AddSimpleTrace(&tracer);
188 AddSimpleTrace(&tracer);
189 AddSimpleTrace(&tracer);
197 TEST(ChannelTracerTest, TestNesting) {
200 AddSimpleTrace(&tracer);
201 AddSimpleTrace(&tracer);
202 ValidateChannelTrace(&tracer, 2);
208 ChannelTrace::Severity::Info,
210 ValidateChannelTrace(&tracer, 3);
211 AddSimpleTrace(sc1_peer.
trace());
218 ChannelTrace::Severity::Info,
220 ValidateChannelTrace(&tracer, 3);
221 AddSimpleTrace(conn1_peer.
trace());
222 AddSimpleTrace(&tracer);
223 AddSimpleTrace(&tracer);
224 ValidateChannelTrace(&tracer, 5);
225 ValidateChannelTrace(conn1_peer.
trace(), 1);
230 ChannelTrace::Severity::Info,
235 ChannelTrace::Severity::Warning,
237 AddSimpleTrace(&tracer);
238 ValidateChannelTrace(&tracer, 8);
244 TEST(ChannelTracerTest, TestSmallMemoryLimit) {
249 const int kSmallMemoryLimit = 1;
251 AddSimpleTrace(&tracer);
252 AddSimpleTrace(&tracer);
257 ValidateChannelTraceCustom(&tracer, 4, 0);
258 AddSimpleTrace(&tracer);
259 AddSimpleTrace(&tracer);
260 ValidateChannelTraceCustom(&tracer, 6, 0);
261 AddSimpleTrace(&tracer);
262 AddSimpleTrace(&tracer);
263 AddSimpleTrace(&tracer);
264 AddSimpleTrace(&tracer);
265 ValidateChannelTraceCustom(&tracer, 10, 0);
268 TEST(ChannelTracerTest, TestEviction) {
271 const int kNumEvents = 5;
273 for (
int i = 1;
i <= kNumEvents; ++
i) {
274 AddSimpleTrace(&tracer);
275 ValidateChannelTrace(&tracer,
i);
279 for (
int i = 1;
i <= kNumEvents; ++
i) {
280 AddSimpleTrace(&tracer);
281 ValidateChannelTraceCustom(&tracer, kNumEvents +
i, kNumEvents);
285 TEST(ChannelTracerTest, TestMultipleEviction) {
288 const int kNumEvents = 5;
290 for (
int i = 1;
i <= kNumEvents; ++
i) {
291 AddSimpleTrace(&tracer);
292 ValidateChannelTrace(&tracer,
i);
298 ChannelTrace::Severity::Info,
300 "long enough string to trigger a multiple eviction"));
301 ValidateChannelTraceCustom(&tracer, kNumEvents + 1, kNumEvents - 1);
304 TEST(ChannelTracerTest, TestTotalEviction) {
307 const int kNumEvents = 5;
309 for (
int i = 1;
i <= kNumEvents; ++
i) {
310 AddSimpleTrace(&tracer);
311 ValidateChannelTrace(&tracer,
i);
316 tracer.
AddTraceEvent(ChannelTrace::Severity::Info, huge_slice);
317 ValidateChannelTraceCustom(&tracer, kNumEvents + 1, 0);
324 int main(
int argc,
char** argv) {