LCOV - code coverage report
Current view: top level - test/cctest - test-trace-event.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 113 113 100.0 %
Date: 2017-10-20 Functions: 19 21 90.5 %

          Line data    Source code
       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             : #include <stdlib.h>
       5             : #include <string.h>
       6             : 
       7             : #include "src/v8.h"
       8             : 
       9             : #include "test/cctest/cctest.h"
      10             : 
      11             : #include "src/tracing/trace-event.h"
      12             : 
      13             : #define GET_TRACE_OBJECTS_LIST platform.GetMockTraceObjects()
      14             : 
      15             : #define GET_TRACE_OBJECT(Index) GET_TRACE_OBJECTS_LIST->at(Index)
      16             : 
      17             : 
      18             : struct MockTraceObject {
      19             :   char phase;
      20             :   std::string name;
      21             :   uint64_t id;
      22             :   uint64_t bind_id;
      23             :   int num_args;
      24             :   unsigned int flags;
      25             :   MockTraceObject(char phase, std::string name, uint64_t id, uint64_t bind_id,
      26             :                   int num_args, int flags)
      27             :       : phase(phase),
      28             :         name(name),
      29             :         id(id),
      30             :         bind_id(bind_id),
      31             :         num_args(num_args),
      32         126 :         flags(flags) {}
      33             : };
      34             : 
      35             : typedef std::vector<MockTraceObject*> MockTraceObjectList;
      36             : 
      37             : class MockTracingController : public v8::TracingController {
      38             :  public:
      39          48 :   MockTracingController() = default;
      40          48 :   ~MockTracingController() {
      41         348 :     for (size_t i = 0; i < trace_object_list_.size(); ++i) {
      42         426 :       delete trace_object_list_[i];
      43             :     }
      44             :     trace_object_list_.clear();
      45          48 :   }
      46             : 
      47         126 :   uint64_t AddTraceEvent(
      48             :       char phase, const uint8_t* category_enabled_flag, const char* name,
      49             :       const char* scope, uint64_t id, uint64_t bind_id, int num_args,
      50             :       const char** arg_names, const uint8_t* arg_types,
      51             :       const uint64_t* arg_values,
      52             :       std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
      53             :       unsigned int flags) override {
      54             :     MockTraceObject* to = new MockTraceObject(phase, std::string(name), id,
      55         378 :                                               bind_id, num_args, flags);
      56         126 :     trace_object_list_.push_back(to);
      57         126 :     return 0;
      58             :   }
      59             : 
      60          42 :   void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
      61          42 :                                 const char* name, uint64_t handle) override {}
      62             : 
      63         138 :   const uint8_t* GetCategoryGroupEnabled(const char* name) override {
      64         138 :     if (strcmp(name, "v8-cat")) {
      65             :       static uint8_t no = 0;
      66             :       return &no;
      67             :     } else {
      68             :       static uint8_t yes = 0x7;
      69         126 :       return &yes;
      70             :     }
      71             :   }
      72             : 
      73             :   MockTraceObjectList* GetMockTraceObjects() { return &trace_object_list_; }
      74             : 
      75             :  private:
      76             :   MockTraceObjectList trace_object_list_;
      77             : 
      78             :   DISALLOW_COPY_AND_ASSIGN(MockTracingController);
      79             : };
      80             : 
      81             : class MockTracingPlatform : public TestPlatform {
      82             :  public:
      83          96 :   MockTracingPlatform() {
      84             :     // Now that it's completely constructed, make this the current platform.
      85          48 :     i::V8::SetPlatformForTesting(this);
      86          48 :   }
      87          96 :   virtual ~MockTracingPlatform() {}
      88             : 
      89         306 :   v8::TracingController* GetTracingController() override {
      90         306 :     return &tracing_controller_;
      91             :   }
      92             : 
      93             :   MockTraceObjectList* GetMockTraceObjects() {
      94             :     return tracing_controller_.GetMockTraceObjects();
      95             :   }
      96             : 
      97             :  private:
      98             :   MockTracingController tracing_controller_;
      99             : };
     100             : 
     101             : 
     102       23724 : TEST(TraceEventDisabledCategory) {
     103           6 :   MockTracingPlatform platform;
     104             : 
     105             :   // Disabled category, will not add events.
     106          12 :   TRACE_EVENT_BEGIN0("cat", "e1");
     107          12 :   TRACE_EVENT_END0("cat", "e1");
     108           6 :   CHECK(GET_TRACE_OBJECTS_LIST->empty());
     109           6 : }
     110             : 
     111             : 
     112       23724 : TEST(TraceEventNoArgs) {
     113           6 :   MockTracingPlatform platform;
     114             : 
     115             :   // Enabled category will add 2 events.
     116          12 :   TRACE_EVENT_BEGIN0("v8-cat", "e1");
     117          12 :   TRACE_EVENT_END0("v8-cat", "e1");
     118             : 
     119          12 :   CHECK_EQ(2, GET_TRACE_OBJECTS_LIST->size());
     120           6 :   CHECK_EQ('B', GET_TRACE_OBJECT(0)->phase);
     121          12 :   CHECK_EQ("e1", GET_TRACE_OBJECT(0)->name);
     122           6 :   CHECK_EQ(0, GET_TRACE_OBJECT(0)->num_args);
     123             : 
     124           6 :   CHECK_EQ('E', GET_TRACE_OBJECT(1)->phase);
     125          12 :   CHECK_EQ("e1", GET_TRACE_OBJECT(1)->name);
     126           6 :   CHECK_EQ(0, GET_TRACE_OBJECT(1)->num_args);
     127           6 : }
     128             : 
     129             : 
     130       23724 : TEST(TraceEventWithOneArg) {
     131           6 :   MockTracingPlatform platform;
     132             : 
     133          18 :   TRACE_EVENT_BEGIN1("v8-cat", "e1", "arg1", 42);
     134          18 :   TRACE_EVENT_END1("v8-cat", "e1", "arg1", 42);
     135          12 :   TRACE_EVENT_BEGIN1("v8-cat", "e2", "arg1", "abc");
     136          12 :   TRACE_EVENT_END1("v8-cat", "e2", "arg1", "abc");
     137             : 
     138          12 :   CHECK_EQ(4, GET_TRACE_OBJECTS_LIST->size());
     139             : 
     140           6 :   CHECK_EQ(1, GET_TRACE_OBJECT(0)->num_args);
     141           6 :   CHECK_EQ(1, GET_TRACE_OBJECT(1)->num_args);
     142           6 :   CHECK_EQ(1, GET_TRACE_OBJECT(2)->num_args);
     143           6 :   CHECK_EQ(1, GET_TRACE_OBJECT(3)->num_args);
     144           6 : }
     145             : 
     146             : 
     147       23724 : TEST(TraceEventWithTwoArgs) {
     148           6 :   MockTracingPlatform platform;
     149             : 
     150          18 :   TRACE_EVENT_BEGIN2("v8-cat", "e1", "arg1", 42, "arg2", "abc");
     151          18 :   TRACE_EVENT_END2("v8-cat", "e1", "arg1", 42, "arg2", "abc");
     152          18 :   TRACE_EVENT_BEGIN2("v8-cat", "e2", "arg1", "abc", "arg2", 43);
     153          18 :   TRACE_EVENT_END2("v8-cat", "e2", "arg1", "abc", "arg2", 43);
     154             : 
     155          12 :   CHECK_EQ(4, GET_TRACE_OBJECTS_LIST->size());
     156             : 
     157           6 :   CHECK_EQ(2, GET_TRACE_OBJECT(0)->num_args);
     158           6 :   CHECK_EQ(2, GET_TRACE_OBJECT(1)->num_args);
     159           6 :   CHECK_EQ(2, GET_TRACE_OBJECT(2)->num_args);
     160           6 :   CHECK_EQ(2, GET_TRACE_OBJECT(3)->num_args);
     161           6 : }
     162             : 
     163             : 
     164       23724 : TEST(ScopedTraceEvent) {
     165           6 :   MockTracingPlatform platform;
     166             : 
     167          18 :   { TRACE_EVENT0("v8-cat", "e"); }
     168             : 
     169          12 :   CHECK_EQ(1, GET_TRACE_OBJECTS_LIST->size());
     170           6 :   CHECK_EQ(0, GET_TRACE_OBJECT(0)->num_args);
     171             : 
     172          18 :   { TRACE_EVENT1("v8-cat", "e1", "arg1", "abc"); }
     173             : 
     174          12 :   CHECK_EQ(2, GET_TRACE_OBJECTS_LIST->size());
     175           6 :   CHECK_EQ(1, GET_TRACE_OBJECT(1)->num_args);
     176             : 
     177          24 :   { TRACE_EVENT2("v8-cat", "e1", "arg1", "abc", "arg2", 42); }
     178             : 
     179          12 :   CHECK_EQ(3, GET_TRACE_OBJECTS_LIST->size());
     180           6 :   CHECK_EQ(2, GET_TRACE_OBJECT(2)->num_args);
     181           6 : }
     182             : 
     183             : 
     184       23724 : TEST(TestEventWithFlow) {
     185           6 :   MockTracingPlatform platform;
     186             : 
     187             :   static uint64_t bind_id = 21;
     188             :   {
     189          18 :     TRACE_EVENT_WITH_FLOW0("v8-cat", "f1", bind_id, TRACE_EVENT_FLAG_FLOW_OUT);
     190             :   }
     191             :   {
     192          12 :     TRACE_EVENT_WITH_FLOW0(
     193             :         "v8-cat", "f2", bind_id,
     194           6 :         TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
     195             :   }
     196          18 :   { TRACE_EVENT_WITH_FLOW0("v8-cat", "f3", bind_id, TRACE_EVENT_FLAG_FLOW_IN); }
     197             : 
     198          12 :   CHECK_EQ(3, GET_TRACE_OBJECTS_LIST->size());
     199           6 :   CHECK_EQ(bind_id, GET_TRACE_OBJECT(0)->bind_id);
     200           6 :   CHECK_EQ(TRACE_EVENT_FLAG_FLOW_OUT, GET_TRACE_OBJECT(0)->flags);
     201           6 :   CHECK_EQ(bind_id, GET_TRACE_OBJECT(1)->bind_id);
     202           6 :   CHECK_EQ(TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
     203             :            GET_TRACE_OBJECT(1)->flags);
     204           6 :   CHECK_EQ(bind_id, GET_TRACE_OBJECT(2)->bind_id);
     205           6 :   CHECK_EQ(TRACE_EVENT_FLAG_FLOW_IN, GET_TRACE_OBJECT(2)->flags);
     206           6 : }
     207             : 
     208             : 
     209       23724 : TEST(TestEventWithId) {
     210           6 :   MockTracingPlatform platform;
     211             : 
     212             :   static uint64_t event_id = 21;
     213          12 :   TRACE_EVENT_ASYNC_BEGIN0("v8-cat", "a1", event_id);
     214          12 :   TRACE_EVENT_ASYNC_END0("v8-cat", "a1", event_id);
     215             : 
     216          12 :   CHECK_EQ(2, GET_TRACE_OBJECTS_LIST->size());
     217           6 :   CHECK_EQ(TRACE_EVENT_PHASE_ASYNC_BEGIN, GET_TRACE_OBJECT(0)->phase);
     218           6 :   CHECK_EQ(event_id, GET_TRACE_OBJECT(0)->id);
     219           6 :   CHECK_EQ(TRACE_EVENT_PHASE_ASYNC_END, GET_TRACE_OBJECT(1)->phase);
     220           6 :   CHECK_EQ(event_id, GET_TRACE_OBJECT(1)->id);
     221           6 : }
     222             : 
     223       23724 : TEST(TestEventInContext) {
     224           6 :   MockTracingPlatform platform;
     225             : 
     226             :   static uint64_t isolate_id = 0x20151021;
     227             :   {
     228          54 :     TRACE_EVENT_SCOPED_CONTEXT("v8-cat", "Isolate", isolate_id);
     229          18 :     TRACE_EVENT0("v8-cat", "e");
     230             :   }
     231             : 
     232          12 :   CHECK_EQ(3, GET_TRACE_OBJECTS_LIST->size());
     233           6 :   CHECK_EQ(TRACE_EVENT_PHASE_ENTER_CONTEXT, GET_TRACE_OBJECT(0)->phase);
     234          12 :   CHECK_EQ("Isolate", GET_TRACE_OBJECT(0)->name);
     235           6 :   CHECK_EQ(isolate_id, GET_TRACE_OBJECT(0)->id);
     236           6 :   CHECK_EQ(TRACE_EVENT_PHASE_COMPLETE, GET_TRACE_OBJECT(1)->phase);
     237          12 :   CHECK_EQ("e", GET_TRACE_OBJECT(1)->name);
     238           6 :   CHECK_EQ(TRACE_EVENT_PHASE_LEAVE_CONTEXT, GET_TRACE_OBJECT(2)->phase);
     239          12 :   CHECK_EQ("Isolate", GET_TRACE_OBJECT(2)->name);
     240           6 :   CHECK_EQ(isolate_id, GET_TRACE_OBJECT(2)->id);
     241       71160 : }

Generated by: LCOV version 1.10