11 #include "llvm/ADT/DenseMap.h" 12 #include "llvm/ADT/SmallString.h" 13 #include "llvm/Support/SourceMgr.h" 14 #include "llvm/Support/Threading.h" 15 #include "llvm/Support/YAMLParser.h" 16 #include "gmock/gmock.h" 17 #include "gtest/gtest.h" 24 if (arg->getType() != llvm::yaml::Node::NK_Scalar) {
25 *result_listener <<
"is a " << arg->getVerbatimTag();
28 llvm::SmallString<32> S;
29 return Val ==
static_cast<llvm::yaml::ScalarNode *
>(arg)->getValue(S);
34 bool VerifyObject(llvm::yaml::Node &N,
35 std::map<std::string, std::string>
Expected) {
36 auto *M = llvm::dyn_cast<llvm::yaml::MappingNode>(&N);
38 ADD_FAILURE() <<
"Not an object";
42 llvm::SmallString<32> Tmp;
43 for (
auto &Prop : *M) {
44 auto *K = llvm::dyn_cast_or_null<llvm::yaml::ScalarNode>(Prop.getKey());
47 std::string KS = K->getValue(Tmp).str();
48 auto I = Expected.find(KS);
49 if (I == Expected.end())
52 auto *V = llvm::dyn_cast_or_null<llvm::yaml::ScalarNode>(Prop.getValue());
54 ADD_FAILURE() << KS <<
" is not a string";
57 std::string VS = V->getValue(Tmp).str();
58 if (VS != I->second) {
59 ADD_FAILURE() << KS <<
" expected " << I->second <<
" but actual " << VS;
64 for (
const auto &P : Expected) {
65 ADD_FAILURE() << P.first <<
" missing, expected " << P.second;
71 TEST(TraceTest, SmokeTest) {
75 llvm::raw_string_ostream OS(JSON);
77 trace::Session Session(*JSONTracer);
79 trace::Span Tracer(
"A");
86 llvm::yaml::Stream Stream(JSON, SM);
87 auto Doc = Stream.begin();
88 ASSERT_NE(Doc, Stream.end());
89 auto *Root = llvm::dyn_cast_or_null<llvm::yaml::MappingNode>(Doc->getRoot());
90 ASSERT_NE(Root,
nullptr) <<
"Root should be an object";
93 llvm::SmallString<32> ThreadName;
94 get_thread_name(ThreadName);
95 bool ThreadsHaveNames = !ThreadName.empty();
101 auto Prop = Root->begin();
102 ASSERT_NE(Prop, Root->end()) <<
"Expected displayTimeUnit property";
103 ASSERT_THAT(Prop->getKey(), StringNode(
"displayTimeUnit"));
104 EXPECT_THAT(Prop->getValue(), StringNode(
"ns"));
105 ASSERT_NE(++Prop, Root->end()) <<
"Expected traceEvents property";
106 EXPECT_THAT(Prop->getKey(), StringNode(
"traceEvents"));
108 llvm::dyn_cast_or_null<llvm::yaml::SequenceNode>(Prop->getValue());
109 ASSERT_NE(Events,
nullptr) <<
"traceEvents should be an array";
110 auto Event = Events->begin();
111 ASSERT_NE(Event, Events->end()) <<
"Expected process name";
112 EXPECT_TRUE(VerifyObject(*Event, {{
"ph",
"M"}, {
"name",
"process_name"}}));
113 if (ThreadsHaveNames) {
114 ASSERT_NE(++Event, Events->end()) <<
"Expected thread name";
115 EXPECT_TRUE(VerifyObject(*Event, {{
"ph",
"M"}, {
"name",
"thread_name"}}));
117 ASSERT_NE(++Event, Events->end()) <<
"Expected log message";
118 EXPECT_TRUE(VerifyObject(*Event, {{
"ph",
"i"}, {
"name",
"Log"}}));
119 ASSERT_NE(++Event, Events->end()) <<
"Expected span end";
120 EXPECT_TRUE(VerifyObject(*Event, {{
"ph",
"X"}, {
"name",
"A"}}));
121 ASSERT_EQ(++Event, Events->end());
122 ASSERT_EQ(++Prop, Root->end());
TEST(BackgroundQueueTest, Priority)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
void log(const llvm::Twine &Message)
Records a single instant event, associated with the current thread.
std::unique_ptr< EventTracer > createJSONTracer(llvm::raw_ostream &OS, bool Pretty)
Create an instance of EventTracer that produces an output in the Trace Event format supported by Chro...
std::vector< const char * > Expected