trace_event_win_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <strstream>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/at_exit.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event_win.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/event_trace_consumer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/event_trace_controller.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/event_trace_provider.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <initguid.h>  // NOLINT - must be last include.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace debug {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyNumber;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InSequence;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Ge;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Le;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::NotNull;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::EtwEventType;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::EtwTraceConsumerBase;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::EtwTraceController;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::EtwTraceProperties;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Data for unittests traces.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kEmpty[] = "";
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kName[] = "unittest.trace_name";
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtra[] = "UnittestDummyExtraString";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* kId = kName;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kTestSessionName[] = L"TraceEvent unittest session";
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(BufferStartsWith, str, "Buffer starts with") {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return memcmp(arg, str.c_str(), str.length()) == 0;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Duplicated from <evntrace.h> to fix link problems.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEFINE_GUID( /* 68fdd900-4a3e-11d1-84f4-0000f80464e3 */
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kEventTraceGuid,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x68fdd900,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x4a3e,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x11d1,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x84, 0xf4, 0x00, 0x00, 0xf8, 0x04, 0x64, 0xe3);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestEventConsumer: public EtwTraceConsumerBase<TestEventConsumer> {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestEventConsumer() {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(current_ == NULL);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_ = this;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~TestEventConsumer() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(current_ == this);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_ = NULL;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD4(Event, void(REFGUID event_class,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      EtwEventType event_type,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      size_t buf_len,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const void* buf));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void ProcessEvent(EVENT_TRACE* event) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(current_ != NULL);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_->Event(event->Header.Guid,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    event->Header.Class.Type,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    event->MofLength,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    event->MofData);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TestEventConsumer* current_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestEventConsumer* TestEventConsumer::current_ = NULL;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TraceEventWinTest: public testing::Test {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventWinTest() {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUp() {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_xp = win::GetVersion() < base::win::VERSION_VISTA;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (is_xp) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Tear down any dangling session from an earlier failing test.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EtwTraceProperties ignore;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EtwTraceController::Stop(kTestSessionName, &ignore);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Resurrect and initialize the TraceLog singleton instance.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // On Vista and better, we need the provider registered before we
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // start the private, in-proc session, but on XP we need the global
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // session created and the provider enabled before we register our
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // provider.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TraceEventETWProvider* tracelog = NULL;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!is_xp) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TraceEventETWProvider::Resurrect();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracelog = TraceEventETWProvider::GetInstance();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(tracelog != NULL);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_FALSE(tracelog->IsTracing());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create the log file.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(file_util::CreateTemporaryFile(&log_file_));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a private log session on the file.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EtwTraceProperties prop;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_HRESULT_SUCCEEDED(prop.SetLoggerFileName(log_file_.value().c_str()));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EVENT_TRACE_PROPERTIES& p = *prop.get();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p.Wnode.ClientContext = 1;  // QPC timer accuracy.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p.LogFileMode = EVENT_TRACE_FILE_MODE_SEQUENTIAL;   // Sequential log.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // On Vista and later, we create a private in-process log session, because
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // otherwise we'd need administrator privileges. Unfortunately we can't
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // do the same on XP and better, because the semantics of a private
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // logger session are different, and the IN_PROC flag is not supported.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!is_xp) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p.LogFileMode |= EVENT_TRACE_PRIVATE_IN_PROC |  // In-proc for non-admin.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EVENT_TRACE_PRIVATE_LOGGER_MODE;  // Process-private log.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p.MaximumFileSize = 100;  // 100M file size.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p.FlushTimer = 1;  // 1 second flush lag.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_HRESULT_SUCCEEDED(controller_.Start(kTestSessionName, &prop));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Enable the TraceLog provider GUID.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_HRESULT_SUCCEEDED(
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        controller_.EnableProvider(kChromeTraceProviderName,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   TRACE_LEVEL_INFORMATION,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   0));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (is_xp) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TraceEventETWProvider::Resurrect();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracelog = TraceEventETWProvider::GetInstance();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(tracelog != NULL);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracelog->IsTracing());
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TearDown() {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EtwTraceProperties prop;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (controller_.session() != 0)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_HRESULT_SUCCEEDED(controller_.Stop(&prop));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!log_file_.value().empty())
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_util::Delete(log_file_, false);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectEvent(REFGUID guid,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   EtwEventType type,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const char* name,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   size_t name_len,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const void* id,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const char* extra,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   size_t extra_len) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Build the trace event buffer we expect will result from this.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::stringbuf str;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    str.sputn(name, name_len + 1);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    str.sputn(reinterpret_cast<const char*>(&id), sizeof(id));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    str.sputn(extra, extra_len + 1);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // And set up the expectation for the event callback.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(consumer_, Event(guid,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 type,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 testing::Ge(str.str().length()),
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 BufferStartsWith(str.str())));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectPlayLog() {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ignore EventTraceGuid events.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(consumer_, Event(kEventTraceGuid, _, _, _))
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(AnyNumber());
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PlayLog() {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EtwTraceProperties prop;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_HRESULT_SUCCEEDED(controller_.Flush(&prop));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_HRESULT_SUCCEEDED(controller_.Stop(&prop));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_HRESULT_SUCCEEDED(
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        consumer_.OpenFileSession(log_file_.value().c_str()));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_HRESULT_SUCCEEDED(consumer_.Consume());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We want our singleton torn down after each test.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShadowingAtExitManager at_exit_manager_;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EtwTraceController controller_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath log_file_;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestEventConsumer consumer_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventWinTest, TraceLog) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectPlayLog();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The events should arrive in the same sequence as the expects.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence in_sequence;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Full argument version, passing lengths explicitly.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventETWProvider::Trace(kName,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        strlen(kName),
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        TRACE_EVENT_PHASE_BEGIN,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        kId,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        kExtra,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        strlen(kExtra));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectEvent(kTraceEventClass32,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kTraceEventTypeBegin,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kName, strlen(kName),
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kId,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kExtra, strlen(kExtra));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Const char* version.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventETWProvider::Trace(static_cast<const char*>(kName),
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        TRACE_EVENT_PHASE_END,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        kId,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        static_cast<const char*>(kExtra));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectEvent(kTraceEventClass32,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kTraceEventTypeEnd,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kName, strlen(kName),
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kId,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kExtra, strlen(kExtra));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // std::string extra version.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventETWProvider::Trace(static_cast<const char*>(kName),
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        TRACE_EVENT_PHASE_INSTANT,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        kId,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        std::string(kExtra));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectEvent(kTraceEventClass32,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kTraceEventTypeInstant,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kName, strlen(kName),
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kId,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kExtra, strlen(kExtra));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test for sanity on NULL inputs.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventETWProvider::Trace(NULL,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        0,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        TRACE_EVENT_PHASE_BEGIN,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        kId,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        NULL,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        0);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectEvent(kTraceEventClass32,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kTraceEventTypeBegin,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kEmpty, 0,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kId,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kEmpty, 0);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventETWProvider::Trace(NULL,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        -1,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        TRACE_EVENT_PHASE_END,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        kId,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        NULL,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        -1);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectEvent(kTraceEventClass32,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kTraceEventTypeEnd,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kEmpty, 0,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kId,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kEmpty, 0);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PlayLog();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventWinTest, Macros) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectPlayLog();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The events should arrive in the same sequence as the expects.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence in_sequence;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRACE_EVENT_BEGIN_ETW(kName, kId, kExtra);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectEvent(kTraceEventClass32,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kTraceEventTypeBegin,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kName, strlen(kName),
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kId,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kExtra, strlen(kExtra));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRACE_EVENT_END_ETW(kName, kId, kExtra);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectEvent(kTraceEventClass32,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kTraceEventTypeEnd,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kName, strlen(kName),
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kId,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kExtra, strlen(kExtra));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRACE_EVENT_INSTANT_ETW(kName, kId, kExtra);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectEvent(kTraceEventClass32,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kTraceEventTypeInstant,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kName, strlen(kName),
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kId,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kExtra, strlen(kExtra));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PlayLog();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace debug
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
317