OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include <include/v8-tracing.h> |
| 6 |
| 7 #include "src/list.h" |
| 8 #include "src/list-inl.h" |
| 9 #include "src/tracing/trace-event.h" |
| 10 #include "testing/gtest-support.h" |
| 11 |
| 12 |
| 13 #define GET_TRACE_OBJECTS_LIST \ |
| 14 mock_event_tracer->GetMockTraceObjects() |
| 15 |
| 16 #define GET_TRACE_OBJECT(Index) \ |
| 17 GET_TRACE_OBJECTS_LIST->at(Index) |
| 18 |
| 19 namespace v8 { |
| 20 namespace tracing_internals { |
| 21 |
| 22 struct MockTraceObject { |
| 23 char phase; |
| 24 const char* name; |
| 25 int numArgs; |
| 26 MockTraceObject(char phase, const char* name, int numArgs): |
| 27 phase(phase), name(name), numArgs(numArgs){} |
| 28 }; |
| 29 |
| 30 typedef internal::List<MockTraceObject*> MockTraceObjectList; |
| 31 |
| 32 class MockEventTracer : public v8::EventTracer { |
| 33 virtual v8::EventTracer::Handle AddTraceEvent( |
| 34 char phase, const uint8_t* categoryEnabledFlag, const char* name, |
| 35 uint64_t id, int numArgs, const char** argNames, const uint8_t* argTypes, |
| 36 const uint64_t* argValues, uint8_t flags) { |
| 37 MockTraceObject* to = new MockTraceObject(phase, name, numArgs); |
| 38 trace_object_list_.Add(to); |
| 39 return 0; |
| 40 } |
| 41 |
| 42 virtual void UpdateTraceEventDuration(const uint8_t* categoryEnabledFlag, |
| 43 const char* name, |
| 44 EventTracer::Handle handle) {} |
| 45 |
| 46 virtual const uint8_t* GetCategoryGroupEnabled(const char* name) { |
| 47 if (strcmp(name, "v8-cat")) { |
| 48 static uint8_t no = 0; |
| 49 return &no; |
| 50 } else { |
| 51 static uint8_t yes = 0x7; |
| 52 return &yes; |
| 53 } |
| 54 } |
| 55 |
| 56 virtual const char* GetCategoryGroupName(const uint8_t* categoryEnabledFlag) { |
| 57 static const char* dummy = "dummy"; |
| 58 return dummy; |
| 59 } |
| 60 |
| 61 MockTraceObjectList trace_object_list_; |
| 62 |
| 63 public: |
| 64 ~MockEventTracer() { |
| 65 for (int i = 0; i < trace_object_list_.length(); ++i) { |
| 66 delete trace_object_list_[i]; |
| 67 } |
| 68 trace_object_list_.Clear(); |
| 69 } |
| 70 |
| 71 MockTraceObjectList* GetMockTraceObjects() { |
| 72 return &trace_object_list_; |
| 73 } |
| 74 }; |
| 75 |
| 76 |
| 77 TEST(TraceEvent, TraceEventDisabledCategory) { |
| 78 MockEventTracer* mock_event_tracer = new MockEventTracer(); |
| 79 v8::EventTracer::SetInstance(mock_event_tracer); |
| 80 |
| 81 // Disabled category, will not add events. |
| 82 TRACE_EVENT_BEGIN0("cat", "e1"); |
| 83 TRACE_EVENT_END0("cat", "e1"); |
| 84 EXPECT_EQ(0, GET_TRACE_OBJECTS_LIST->length()); |
| 85 } |
| 86 |
| 87 |
| 88 TEST(TraceEvent, TraceEventNoArgs) { |
| 89 MockEventTracer* mock_event_tracer = new MockEventTracer(); |
| 90 v8::EventTracer::SetInstance(mock_event_tracer); |
| 91 |
| 92 // Enabled category will add 2 events. |
| 93 TRACE_EVENT_BEGIN0("v8-cat", "e1"); |
| 94 TRACE_EVENT_END0("v8-cat", "e1"); |
| 95 |
| 96 EXPECT_EQ(2, GET_TRACE_OBJECTS_LIST->length()); |
| 97 EXPECT_EQ('B', GET_TRACE_OBJECT(0)->phase); |
| 98 EXPECT_EQ("e1", GET_TRACE_OBJECT(0)->name); |
| 99 EXPECT_EQ(0, GET_TRACE_OBJECT(0)->numArgs); |
| 100 |
| 101 EXPECT_EQ('E', GET_TRACE_OBJECT(1)->phase); |
| 102 EXPECT_EQ("e1", GET_TRACE_OBJECT(1)->name); |
| 103 EXPECT_EQ(0, GET_TRACE_OBJECT(1)->numArgs); |
| 104 } |
| 105 |
| 106 |
| 107 TEST(TraceEvent, TraceEventWithOneArg) { |
| 108 MockEventTracer* mock_event_tracer = new MockEventTracer(); |
| 109 v8::EventTracer::SetInstance(mock_event_tracer); |
| 110 |
| 111 TRACE_EVENT_BEGIN1("v8-cat", "e1", "arg1", 42); |
| 112 TRACE_EVENT_END1("v8-cat", "e1", "arg1", 42); |
| 113 TRACE_EVENT_BEGIN1("v8-cat", "e2", "arg1", "abc"); |
| 114 TRACE_EVENT_END1("v8-cat", "e2", "arg1", "abc"); |
| 115 |
| 116 EXPECT_EQ(4, GET_TRACE_OBJECTS_LIST->length()); |
| 117 |
| 118 EXPECT_EQ(1, GET_TRACE_OBJECT(0)->numArgs); |
| 119 EXPECT_EQ(1, GET_TRACE_OBJECT(1)->numArgs); |
| 120 EXPECT_EQ(1, GET_TRACE_OBJECT(2)->numArgs); |
| 121 EXPECT_EQ(1, GET_TRACE_OBJECT(3)->numArgs); |
| 122 } |
| 123 |
| 124 |
| 125 TEST(TraceEvent, TraceEventWithTwoArgs) { |
| 126 MockEventTracer* mock_event_tracer = new MockEventTracer(); |
| 127 v8::EventTracer::SetInstance(mock_event_tracer); |
| 128 |
| 129 TRACE_EVENT_BEGIN2("v8-cat", "e1", "arg1", 42, "arg2", "abc"); |
| 130 TRACE_EVENT_END2("v8-cat", "e1", "arg1", 42, "arg2", "abc"); |
| 131 TRACE_EVENT_BEGIN2("v8-cat", "e2", "arg1", "abc", "arg2", 43); |
| 132 TRACE_EVENT_END2("v8-cat", "e2", "arg1", "abc", "arg2", 43); |
| 133 |
| 134 EXPECT_EQ(4, GET_TRACE_OBJECTS_LIST->length()); |
| 135 |
| 136 EXPECT_EQ(2, GET_TRACE_OBJECT(0)->numArgs); |
| 137 EXPECT_EQ(2, GET_TRACE_OBJECT(1)->numArgs); |
| 138 EXPECT_EQ(2, GET_TRACE_OBJECT(2)->numArgs); |
| 139 EXPECT_EQ(2, GET_TRACE_OBJECT(3)->numArgs); |
| 140 } |
| 141 |
| 142 } // namespace tracing_internals |
| 143 } // namespace v8 |
OLD | NEW |