xref: /llvm-project/llvm/unittests/Support/TimeProfilerTest.cpp (revision 871f69f0b657a4c60d5ad26b5dc4cc2b1f0e5f3b)
1 //===- unittests/TimeProfilerTest.cpp - TimeProfiler tests ----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 // These are bare-minimum 'smoke' tests of the time profiler. Not tested:
9 //  - multi-threading
10 //  - 'Total' entries
11 //  - elision of short or ill-formed entries
12 //  - detail callback
13 //  - no calls to now() if profiling is disabled
14 //  - suppression of contributions to total entries for nested entries
15 //===----------------------------------------------------------------------===//
16 
17 #include "llvm/Support/TimeProfiler.h"
18 #include "gtest/gtest.h"
19 
20 using namespace llvm;
21 
22 namespace {
23 
24 void setupProfiler() {
25   timeTraceProfilerInitialize(/*TimeTraceGranularity=*/0, "test");
26 }
27 
28 std::string teardownProfiler() {
29   SmallVector<char, 1024> smallVector;
30   raw_svector_ostream os(smallVector);
31   timeTraceProfilerWrite(os);
32   timeTraceProfilerCleanup();
33   return os.str().str();
34 }
35 
36 TEST(TimeProfiler, Scope_Smoke) {
37   setupProfiler();
38 
39   { TimeTraceScope scope("event", "detail"); }
40 
41   std::string json = teardownProfiler();
42   ASSERT_TRUE(json.find(R"("name":"event")") != std::string::npos);
43   ASSERT_TRUE(json.find(R"("detail":"detail")") != std::string::npos);
44 }
45 
46 TEST(TimeProfiler, Begin_End_Smoke) {
47   setupProfiler();
48 
49   timeTraceProfilerBegin("event", "detail");
50   timeTraceProfilerEnd();
51 
52   std::string json = teardownProfiler();
53   ASSERT_TRUE(json.find(R"("name":"event")") != std::string::npos);
54   ASSERT_TRUE(json.find(R"("detail":"detail")") != std::string::npos);
55 }
56 
57 TEST(TimeProfiler, Async_Begin_End_Smoke) {
58   setupProfiler();
59 
60   auto *Profiler = timeTraceAsyncProfilerBegin("event", "detail");
61   timeTraceProfilerEnd(Profiler);
62 
63   std::string json = teardownProfiler();
64   ASSERT_TRUE(json.find(R"("name":"event")") != std::string::npos);
65   ASSERT_TRUE(json.find(R"("detail":"detail")") != std::string::npos);
66 }
67 
68 TEST(TimeProfiler, Begin_End_Disabled) {
69   // Nothing should be observable here. The test is really just making sure
70   // we've not got a stray nullptr deref.
71   timeTraceProfilerBegin("event", "detail");
72   timeTraceProfilerEnd();
73 }
74 
75 TEST(TimeProfiler, Instant_Add_Smoke) {
76   setupProfiler();
77 
78   timeTraceProfilerBegin("sync event", "sync detail");
79   timeTraceAddInstantEvent("instant event", [&] { return "instant detail"; });
80   timeTraceProfilerEnd();
81 
82   std::string json = teardownProfiler();
83   ASSERT_TRUE(json.find(R"("name":"sync event")") != std::string::npos);
84   ASSERT_TRUE(json.find(R"("detail":"sync detail")") != std::string::npos);
85   ASSERT_TRUE(json.find(R"("name":"instant event")") != std::string::npos);
86   ASSERT_TRUE(json.find(R"("detail":"instant detail")") != std::string::npos);
87 }
88 
89 TEST(TimeProfiler, Instant_Not_Added_Smoke) {
90   setupProfiler();
91 
92   timeTraceAddInstantEvent("instant event", [&] { return "instant detail"; });
93 
94   std::string json = teardownProfiler();
95   ASSERT_TRUE(json.find(R"("name":"instant event")") == std::string::npos);
96   ASSERT_TRUE(json.find(R"("detail":"instant detail")") == std::string::npos);
97 }
98 
99 } // namespace
100