1 | /** |
2 | * Copyright (c) Glow Contributors. See CONTRIBUTORS file. |
3 | * |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | * you may not use this file except in compliance with the License. |
6 | * You may obtain a copy of the License at |
7 | * |
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | * |
10 | * Unless required by applicable law or agreed to in writing, software |
11 | * distributed under the License is distributed on an "AS IS" BASIS, |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | * See the License for the specific language governing permissions and |
14 | * limitations under the License. |
15 | */ |
16 | |
17 | #include "glow/Runtime/TraceExporter.h" |
18 | |
19 | #include <gtest/gtest.h> |
20 | |
21 | #include <memory> |
22 | |
23 | using namespace glow; |
24 | |
25 | class MockTraceExporter : public TraceExporter { |
26 | std::shared_ptr<TraceExporterRegistry> traceExporterRegistry_; |
27 | bool enable_{false}; |
28 | |
29 | public: |
30 | MockTraceExporter() |
31 | : traceExporterRegistry_(TraceExporterRegistry::getInstance()) { |
32 | traceExporterRegistry_->registerTraceExporter(this); |
33 | |
34 | mergedTraceContext_ = std::make_unique<TraceContext>(TraceLevel::STANDARD); |
35 | } |
36 | |
37 | ~MockTraceExporter() override { |
38 | traceExporterRegistry_->revokeTraceExporter(this); |
39 | } |
40 | |
41 | bool shouldTrace() override { return enable_; } |
42 | |
43 | void enableTrace() { enable_ = true; } |
44 | |
45 | void disableTrace() { enable_ = false; } |
46 | |
47 | void exportTrace(TraceContext *tcontext) override { |
48 | // create a copy of trace events |
49 | mergedTraceContext_->copy(tcontext); |
50 | } |
51 | |
52 | std::unique_ptr<TraceContext> mergedTraceContext_; |
53 | }; |
54 | |
55 | TEST(TraceExporter, shouldTrace) { |
56 | |
57 | // if no trace exporter is registered should not have any side effects |
58 | auto traceExporter = TraceExporterRegistry::getInstance(); |
59 | EXPECT_FALSE(traceExporter->shouldTrace()); |
60 | |
61 | MockTraceExporter mockExporter; |
62 | |
63 | mockExporter.disableTrace(); |
64 | EXPECT_FALSE(traceExporter->shouldTrace()); |
65 | |
66 | mockExporter.enableTrace(); |
67 | EXPECT_TRUE(traceExporter->shouldTrace()); |
68 | |
69 | mockExporter.disableTrace(); |
70 | EXPECT_FALSE(traceExporter->shouldTrace()); |
71 | } |
72 | |
73 | TEST(TraceExporter, traceEvents) { |
74 | |
75 | auto traceExporter = TraceExporterRegistry::getInstance(); |
76 | MockTraceExporter mockExporter; |
77 | |
78 | TraceContext glowTrace{TraceLevel::STANDARD}; |
79 | |
80 | glowTrace.logTraceEvent("foo_function" , TraceLevel::RUNTIME, 'B'); |
81 | glowTrace.logTraceEvent("bar_function" , TraceLevel::RUNTIME, 'B'); |
82 | glowTrace.logTraceEvent("bar_function" , TraceLevel::RUNTIME, 'E'); |
83 | glowTrace.logTraceEvent("foo_function" , TraceLevel::RUNTIME, 'E'); |
84 | glowTrace.logCompleteTraceEvent("alice" , TraceLevel::RUNTIME, |
85 | TraceEvent::now() - 100); |
86 | |
87 | if (traceExporter->shouldTrace()) { |
88 | traceExporter->exportTrace(&glowTrace); |
89 | } |
90 | |
91 | mockExporter.enableTrace(); |
92 | if (traceExporter->shouldTrace()) { |
93 | traceExporter->exportTrace(&glowTrace); |
94 | } |
95 | |
96 | // add two traces |
97 | if (traceExporter->shouldTrace()) { |
98 | traceExporter->exportTrace(&glowTrace); |
99 | } |
100 | |
101 | auto traceEvents = mockExporter.mergedTraceContext_->getTraceEvents(); |
102 | EXPECT_EQ(traceEvents.size(), 10); |
103 | } |
104 | |