Index: base/debug/trace_event_win_unittest.cc |
diff --git a/base/debug/trace_event_win_unittest.cc b/base/debug/trace_event_win_unittest.cc |
deleted file mode 100644 |
index 378264511a2c1525ba7ec56024c6b2751c3924a5..0000000000000000000000000000000000000000 |
--- a/base/debug/trace_event_win_unittest.cc |
+++ /dev/null |
@@ -1,319 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/debug/trace_event.h" |
- |
-#include <strstream> |
- |
-#include "base/at_exit.h" |
-#include "base/basictypes.h" |
-#include "base/debug/trace_event.h" |
-#include "base/debug/trace_event_win.h" |
-#include "base/files/file_util.h" |
-#include "base/win/event_trace_consumer.h" |
-#include "base/win/event_trace_controller.h" |
-#include "base/win/event_trace_provider.h" |
-#include "base/win/windows_version.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include <initguid.h> // NOLINT - must be last include. |
- |
-namespace base { |
-namespace debug { |
- |
-namespace { |
- |
-using testing::_; |
-using testing::AnyNumber; |
-using testing::InSequence; |
-using testing::Ge; |
-using testing::Le; |
-using testing::NotNull; |
- |
-using base::win::EtwEventType; |
-using base::win::EtwTraceConsumerBase; |
-using base::win::EtwTraceController; |
-using base::win::EtwTraceProperties; |
- |
-// Data for unittests traces. |
-const char kEmpty[] = ""; |
-const char kName[] = "unittest.trace_name"; |
-const char kExtra[] = "UnittestDummyExtraString"; |
-const void* kId = kName; |
- |
-const wchar_t kTestSessionName[] = L"TraceEvent unittest session"; |
- |
-MATCHER_P(BufferStartsWith, str, "Buffer starts with") { |
- return memcmp(arg, str.c_str(), str.length()) == 0; |
-} |
- |
-// Duplicated from <evntrace.h> to fix link problems. |
-DEFINE_GUID( /* 68fdd900-4a3e-11d1-84f4-0000f80464e3 */ |
- kEventTraceGuid, |
- 0x68fdd900, |
- 0x4a3e, |
- 0x11d1, |
- 0x84, 0xf4, 0x00, 0x00, 0xf8, 0x04, 0x64, 0xe3); |
- |
-class TestEventConsumer: public EtwTraceConsumerBase<TestEventConsumer> { |
- public: |
- TestEventConsumer() { |
- EXPECT_TRUE(current_ == NULL); |
- current_ = this; |
- } |
- |
- ~TestEventConsumer() { |
- EXPECT_TRUE(current_ == this); |
- current_ = NULL; |
- } |
- |
- MOCK_METHOD4(Event, void(REFGUID event_class, |
- EtwEventType event_type, |
- size_t buf_len, |
- const void* buf)); |
- |
- static void ProcessEvent(EVENT_TRACE* event) { |
- ASSERT_TRUE(current_ != NULL); |
- current_->Event(event->Header.Guid, |
- event->Header.Class.Type, |
- event->MofLength, |
- event->MofData); |
- } |
- |
- private: |
- static TestEventConsumer* current_; |
-}; |
- |
-TestEventConsumer* TestEventConsumer::current_ = NULL; |
- |
-class TraceEventWinTest: public testing::Test { |
- public: |
- TraceEventWinTest() { |
- } |
- |
- void SetUp() { |
- bool is_xp = win::GetVersion() < base::win::VERSION_VISTA; |
- |
- if (is_xp) { |
- // Tear down any dangling session from an earlier failing test. |
- EtwTraceProperties ignore; |
- EtwTraceController::Stop(kTestSessionName, &ignore); |
- } |
- |
- // Resurrect and initialize the TraceLog singleton instance. |
- // On Vista and better, we need the provider registered before we |
- // start the private, in-proc session, but on XP we need the global |
- // session created and the provider enabled before we register our |
- // provider. |
- TraceEventETWProvider* tracelog = NULL; |
- if (!is_xp) { |
- TraceEventETWProvider::Resurrect(); |
- tracelog = TraceEventETWProvider::GetInstance(); |
- ASSERT_TRUE(tracelog != NULL); |
- ASSERT_FALSE(tracelog->IsTracing()); |
- } |
- |
- // Create the log file. |
- ASSERT_TRUE(base::CreateTemporaryFile(&log_file_)); |
- |
- // Create a private log session on the file. |
- EtwTraceProperties prop; |
- ASSERT_HRESULT_SUCCEEDED(prop.SetLoggerFileName(log_file_.value().c_str())); |
- EVENT_TRACE_PROPERTIES& p = *prop.get(); |
- p.Wnode.ClientContext = 1; // QPC timer accuracy. |
- p.LogFileMode = EVENT_TRACE_FILE_MODE_SEQUENTIAL; // Sequential log. |
- |
- // On Vista and later, we create a private in-process log session, because |
- // otherwise we'd need administrator privileges. Unfortunately we can't |
- // do the same on XP and better, because the semantics of a private |
- // logger session are different, and the IN_PROC flag is not supported. |
- if (!is_xp) { |
- p.LogFileMode |= EVENT_TRACE_PRIVATE_IN_PROC | // In-proc for non-admin. |
- EVENT_TRACE_PRIVATE_LOGGER_MODE; // Process-private log. |
- } |
- |
- p.MaximumFileSize = 100; // 100M file size. |
- p.FlushTimer = 1; // 1 second flush lag. |
- ASSERT_HRESULT_SUCCEEDED(controller_.Start(kTestSessionName, &prop)); |
- |
- // Enable the TraceLog provider GUID. |
- ASSERT_HRESULT_SUCCEEDED( |
- controller_.EnableProvider(kChromeTraceProviderName, |
- TRACE_LEVEL_INFORMATION, |
- 0)); |
- |
- if (is_xp) { |
- TraceEventETWProvider::Resurrect(); |
- tracelog = TraceEventETWProvider::GetInstance(); |
- } |
- ASSERT_TRUE(tracelog != NULL); |
- EXPECT_TRUE(tracelog->IsTracing()); |
- } |
- |
- void TearDown() { |
- EtwTraceProperties prop; |
- if (controller_.session() != 0) |
- EXPECT_HRESULT_SUCCEEDED(controller_.Stop(&prop)); |
- |
- if (!log_file_.value().empty()) |
- base::DeleteFile(log_file_, false); |
- |
- // We want our singleton torn down after each test. |
- TraceLog::DeleteForTesting(); |
- } |
- |
- void ExpectEvent(REFGUID guid, |
- EtwEventType type, |
- const char* name, |
- size_t name_len, |
- const void* id, |
- const char* extra, |
- size_t extra_len) { |
- // Build the trace event buffer we expect will result from this. |
- std::stringbuf str; |
- str.sputn(name, name_len + 1); |
- str.sputn(reinterpret_cast<const char*>(&id), sizeof(id)); |
- str.sputn(extra, extra_len + 1); |
- |
- // And set up the expectation for the event callback. |
- EXPECT_CALL(consumer_, Event(guid, |
- type, |
- testing::Ge(str.str().length()), |
- BufferStartsWith(str.str()))); |
- } |
- |
- void ExpectPlayLog() { |
- // Ignore EventTraceGuid events. |
- EXPECT_CALL(consumer_, Event(kEventTraceGuid, _, _, _)) |
- .Times(AnyNumber()); |
- } |
- |
- void PlayLog() { |
- EtwTraceProperties prop; |
- EXPECT_HRESULT_SUCCEEDED(controller_.Flush(&prop)); |
- EXPECT_HRESULT_SUCCEEDED(controller_.Stop(&prop)); |
- ASSERT_HRESULT_SUCCEEDED( |
- consumer_.OpenFileSession(log_file_.value().c_str())); |
- |
- ASSERT_HRESULT_SUCCEEDED(consumer_.Consume()); |
- } |
- |
- private: |
- // We want our singleton torn down after each test. |
- ShadowingAtExitManager at_exit_manager_; |
- EtwTraceController controller_; |
- FilePath log_file_; |
- TestEventConsumer consumer_; |
-}; |
- |
-} // namespace |
- |
- |
-TEST_F(TraceEventWinTest, TraceLog) { |
- ExpectPlayLog(); |
- |
- // The events should arrive in the same sequence as the expects. |
- InSequence in_sequence; |
- |
- // Full argument version, passing lengths explicitly. |
- TraceEventETWProvider::Trace(kName, |
- strlen(kName), |
- TRACE_EVENT_PHASE_BEGIN, |
- kId, |
- kExtra, |
- strlen(kExtra)); |
- |
- ExpectEvent(kTraceEventClass32, |
- kTraceEventTypeBegin, |
- kName, strlen(kName), |
- kId, |
- kExtra, strlen(kExtra)); |
- |
- // Const char* version. |
- TraceEventETWProvider::Trace(static_cast<const char*>(kName), |
- TRACE_EVENT_PHASE_END, |
- kId, |
- static_cast<const char*>(kExtra)); |
- |
- ExpectEvent(kTraceEventClass32, |
- kTraceEventTypeEnd, |
- kName, strlen(kName), |
- kId, |
- kExtra, strlen(kExtra)); |
- |
- // std::string extra version. |
- TraceEventETWProvider::Trace(static_cast<const char*>(kName), |
- TRACE_EVENT_PHASE_INSTANT, |
- kId, |
- std::string(kExtra)); |
- |
- ExpectEvent(kTraceEventClass32, |
- kTraceEventTypeInstant, |
- kName, strlen(kName), |
- kId, |
- kExtra, strlen(kExtra)); |
- |
- |
- // Test for sanity on NULL inputs. |
- TraceEventETWProvider::Trace(NULL, |
- 0, |
- TRACE_EVENT_PHASE_BEGIN, |
- kId, |
- NULL, |
- 0); |
- |
- ExpectEvent(kTraceEventClass32, |
- kTraceEventTypeBegin, |
- kEmpty, 0, |
- kId, |
- kEmpty, 0); |
- |
- TraceEventETWProvider::Trace(NULL, |
- TraceEventETWProvider::kUseStrlen, |
- TRACE_EVENT_PHASE_END, |
- kId, |
- NULL, |
- TraceEventETWProvider::kUseStrlen); |
- |
- ExpectEvent(kTraceEventClass32, |
- kTraceEventTypeEnd, |
- kEmpty, 0, |
- kId, |
- kEmpty, 0); |
- |
- PlayLog(); |
-} |
- |
-TEST_F(TraceEventWinTest, Macros) { |
- ExpectPlayLog(); |
- |
- // The events should arrive in the same sequence as the expects. |
- InSequence in_sequence; |
- |
- TRACE_EVENT_BEGIN_ETW(kName, kId, kExtra); |
- ExpectEvent(kTraceEventClass32, |
- kTraceEventTypeBegin, |
- kName, strlen(kName), |
- kId, |
- kExtra, strlen(kExtra)); |
- |
- TRACE_EVENT_END_ETW(kName, kId, kExtra); |
- ExpectEvent(kTraceEventClass32, |
- kTraceEventTypeEnd, |
- kName, strlen(kName), |
- kId, |
- kExtra, strlen(kExtra)); |
- |
- TRACE_EVENT_INSTANT_ETW(kName, kId, kExtra); |
- ExpectEvent(kTraceEventClass32, |
- kTraceEventTypeInstant, |
- kName, strlen(kName), |
- kId, |
- kExtra, strlen(kExtra)); |
- |
- PlayLog(); |
-} |
- |
-} // namespace debug |
-} // namespace base |