summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorsiggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-28 00:52:08 +0000
committersiggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-28 00:52:08 +0000
commite467ca3aac3a35b216c9caabee388685b1c2dbb0 (patch)
treef7434c29401d6b6b8dc86dadc1631fa273b11e08 /base
parent7acf9829abc48e5ba74306329119c1f138f476b6 (diff)
downloadchromium_src-e467ca3aac3a35b216c9caabee388685b1c2dbb0.zip
chromium_src-e467ca3aac3a35b216c9caabee388685b1c2dbb0.tar.gz
chromium_src-e467ca3aac3a35b216c9caabee388685b1c2dbb0.tar.bz2
Make ETW unittests shardable to quench flakyness on trybots.
Use a per-process ETW session name, and a per-test provider GUID to avoid name collisions under test sharding on trybots. R=thakis@chromium.org,jar@chromium.org BUG=111240 TEST=No more spurious failures on trybots. Review URL: http://codereview.chromium.org/9288075 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@119544 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r--base/win/event_trace_consumer_unittest.cc88
-rw-r--r--base/win/event_trace_controller_unittest.cc76
2 files changed, 110 insertions, 54 deletions
diff --git a/base/win/event_trace_consumer_unittest.cc b/base/win/event_trace_consumer_unittest.cc
index efbfdf9..dbf4ba9 100644
--- a/base/win/event_trace_consumer_unittest.cc
+++ b/base/win/event_trace_consumer_unittest.cc
@@ -1,16 +1,21 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
//
-// Unit tests for event trace consumer_ base class.
+// Unit tests for event trace consumer base class.
#include "base/win/event_trace_consumer.h"
#include <list>
+#include <objbase.h>
+
#include "base/basictypes.h"
#include "base/file_path.h"
#include "base/file_util.h"
#include "base/logging.h"
+#include "base/process.h"
+#include "base/scoped_temp_dir.h"
+#include "base/stringprintf.h"
#include "base/win/event_trace_controller.h"
#include "base/win/event_trace_provider.h"
#include "base/win/scoped_handle.h"
@@ -75,14 +80,31 @@ class TestConsumer: public EtwTraceConsumerBase<TestConsumer> {
base::win::ScopedHandle TestConsumer::sank_event_;
EventQueue TestConsumer::events_;
-const wchar_t* const kTestSessionName = L"TestLogSession";
-
class EtwTraceConsumerBaseTest: public testing::Test {
public:
+ EtwTraceConsumerBaseTest()
+ : session_name_(base::StringPrintf(L"TestSession-%d",
+ base::Process::Current().pid())) {
+ }
+
virtual void SetUp() {
+ // Cleanup any potentially dangling sessions.
+ EtwTraceProperties ignore;
+ EtwTraceController::Stop(session_name_.c_str(), &ignore);
+
+ // Allocate a new GUID for each provider test.
+ ASSERT_HRESULT_SUCCEEDED(::CoCreateGuid(&test_provider_));
+ }
+
+ virtual void TearDown() {
+ // Cleanup any potentially danging sessions.
EtwTraceProperties ignore;
- EtwTraceController::Stop(kTestSessionName, &ignore);
+ EtwTraceController::Stop(session_name_.c_str(), &ignore);
}
+
+ protected:
+ GUID test_provider_;
+ std::wstring session_name_;
};
} // namespace
@@ -94,26 +116,33 @@ TEST_F(EtwTraceConsumerBaseTest, Initialize) {
TEST_F(EtwTraceConsumerBaseTest, OpenRealtimeSucceedsWhenNoSession) {
TestConsumer consumer_;
- ASSERT_HRESULT_SUCCEEDED(consumer_.OpenRealtimeSession(kTestSessionName));
+ ASSERT_HRESULT_SUCCEEDED(
+ consumer_.OpenRealtimeSession(session_name_.c_str()));
}
TEST_F(EtwTraceConsumerBaseTest, ConsumerImmediateFailureWhenNoSession) {
TestConsumer consumer_;
- ASSERT_HRESULT_SUCCEEDED(consumer_.OpenRealtimeSession(kTestSessionName));
+ ASSERT_HRESULT_SUCCEEDED(
+ consumer_.OpenRealtimeSession(session_name_.c_str()));
ASSERT_HRESULT_FAILED(consumer_.Consume());
}
namespace {
-class EtwTraceConsumerRealtimeTest: public testing::Test {
+class EtwTraceConsumerRealtimeTest: public EtwTraceConsumerBaseTest {
public:
virtual void SetUp() {
- ASSERT_HRESULT_SUCCEEDED(consumer_.OpenRealtimeSession(kTestSessionName));
+ EtwTraceConsumerBaseTest::SetUp();
+
+ ASSERT_HRESULT_SUCCEEDED(
+ consumer_.OpenRealtimeSession(session_name_.c_str()));
}
virtual void TearDown() {
consumer_.Close();
+
+ EtwTraceConsumerBaseTest::TearDown();
}
DWORD ConsumerThread() {
@@ -177,15 +206,18 @@ class EtwTraceConsumerRealtimeTest: public testing::Test {
}
TestConsumer consumer_;
+ GUID test_provider_;
base::win::ScopedHandle consumer_ready_;
base::win::ScopedHandle consumer_thread_;
};
+
} // namespace
TEST_F(EtwTraceConsumerRealtimeTest, ConsumerReturnsWhenSessionClosed) {
EtwTraceController controller;
- HRESULT hr = controller.StartRealtimeSession(kTestSessionName, 100 * 1024);
+ HRESULT hr = controller.StartRealtimeSession(session_name_.c_str(),
+ 100 * 1024);
if (hr == E_ACCESSDENIED) {
VLOG(1) << "You must be an administrator to run this test on Vista";
return;
@@ -205,10 +237,6 @@ TEST_F(EtwTraceConsumerRealtimeTest, ConsumerReturnsWhenSessionClosed) {
namespace {
-// {036B8F65-8DF3-46e4-ABFC-6985C43D59BA}
-DEFINE_GUID(kTestProvider,
- 0x36b8f65, 0x8df3, 0x46e4, 0xab, 0xfc, 0x69, 0x85, 0xc4, 0x3d, 0x59, 0xba);
-
// {57E47923-A549-476f-86CA-503D57F59E62}
DEFINE_GUID(kTestEventType,
0x57e47923, 0xa549, 0x476f, 0x86, 0xca, 0x50, 0x3d, 0x57, 0xf5, 0x9e, 0x62);
@@ -217,16 +245,17 @@ DEFINE_GUID(kTestEventType,
TEST_F(EtwTraceConsumerRealtimeTest, ConsumeEvent) {
EtwTraceController controller;
- HRESULT hr = controller.StartRealtimeSession(kTestSessionName, 100 * 1024);
+ HRESULT hr = controller.StartRealtimeSession(session_name_.c_str(),
+ 100 * 1024);
if (hr == E_ACCESSDENIED) {
VLOG(1) << "You must be an administrator to run this test on Vista";
return;
}
- ASSERT_HRESULT_SUCCEEDED(controller.EnableProvider(kTestProvider,
+ ASSERT_HRESULT_SUCCEEDED(controller.EnableProvider(test_provider_,
TRACE_LEVEL_VERBOSE, 0xFFFFFFFF));
- EtwTraceProvider provider(kTestProvider);
+ EtwTraceProvider provider(test_provider_);
ASSERT_EQ(ERROR_SUCCESS, provider.Register());
// Start the consumer_.
@@ -248,43 +277,46 @@ namespace {
// We run events through a file session to assert that
// the content comes through.
-class EtwTraceConsumerDataTest: public testing::Test {
+class EtwTraceConsumerDataTest: public EtwTraceConsumerBaseTest {
public:
EtwTraceConsumerDataTest() {
}
virtual void SetUp() {
EtwTraceProperties prop;
- EtwTraceController::Stop(kTestSessionName, &prop);
- // Construct a temp file name.
- ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_));
+ EtwTraceController::Stop(session_name_.c_str(), &prop);
+
+ // Create a temp dir for this test.
+ ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+ // Construct a temp file name in our dir.
+ temp_file_ = temp_dir_.path().Append(L"test.etl");
}
virtual void TearDown() {
EXPECT_TRUE(file_util::Delete(temp_file_, false));
- EtwTraceProperties ignore;
- EtwTraceController::Stop(kTestSessionName, &ignore);
+
+ EtwTraceConsumerBaseTest::TearDown();
}
HRESULT LogEventToTempSession(PEVENT_TRACE_HEADER header) {
EtwTraceController controller;
// Set up a file session.
- HRESULT hr = controller.StartFileSession(kTestSessionName,
+ HRESULT hr = controller.StartFileSession(session_name_.c_str(),
temp_file_.value().c_str());
if (FAILED(hr))
return hr;
// Enable our provider.
- EXPECT_HRESULT_SUCCEEDED(controller.EnableProvider(kTestProvider,
+ EXPECT_HRESULT_SUCCEEDED(controller.EnableProvider(test_provider_,
TRACE_LEVEL_VERBOSE, 0xFFFFFFFF));
- EtwTraceProvider provider(kTestProvider);
+ EtwTraceProvider provider(test_provider_);
// Then register our provider, means we get a session handle immediately.
EXPECT_EQ(ERROR_SUCCESS, provider.Register());
// Trace the event, it goes to the temp file.
EXPECT_EQ(ERROR_SUCCESS, provider.Log(header));
- EXPECT_HRESULT_SUCCEEDED(controller.DisableProvider(kTestProvider));
+ EXPECT_HRESULT_SUCCEEDED(controller.DisableProvider(test_provider_));
EXPECT_HRESULT_SUCCEEDED(provider.Unregister());
EXPECT_HRESULT_SUCCEEDED(controller.Flush(NULL));
EXPECT_HRESULT_SUCCEEDED(controller.Stop(NULL));
@@ -323,6 +355,7 @@ class EtwTraceConsumerDataTest: public testing::Test {
}
EventQueue events_;
+ ScopedTempDir temp_dir_;
FilePath temp_file_;
};
@@ -342,6 +375,7 @@ TEST_F(EtwTraceConsumerDataTest, RoundTrip) {
VLOG(1) << "You must be an administrator to run this test on Vista";
return;
}
+ ASSERT_HRESULT_SUCCEEDED(hr) << "RoundTripEvent failed";
ASSERT_TRUE(NULL != trace);
ASSERT_EQ(sizeof(kData), trace->MofLength);
ASSERT_STREQ(kData, reinterpret_cast<const char*>(trace->MofData));
diff --git a/base/win/event_trace_controller_unittest.cc b/base/win/event_trace_controller_unittest.cc
index 78969d8..2e3a403 100644
--- a/base/win/event_trace_controller_unittest.cc
+++ b/base/win/event_trace_controller_unittest.cc
@@ -1,15 +1,18 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
//
// Unit tests for event trace controller.
-#include <initguid.h> // NOLINT.
+#include <objbase.h>
+#include <initguid.h>
#include "base/file_path.h"
#include "base/file_util.h"
#include "base/logging.h"
+#include "base/process.h"
#include "base/scoped_temp_dir.h"
+#include "base/stringprintf.h"
#include "base/sys_info.h"
#include "base/win/event_trace_controller.h"
#include "base/win/event_trace_provider.h"
@@ -22,12 +25,6 @@ using base::win::EtwTraceController;
using base::win::EtwTraceProvider;
using base::win::EtwTraceProperties;
-const wchar_t kTestSessionName[] = L"TestLogSession";
-
-// {0D236A42-CD18-4e3d-9975-DCEEA2106E05}
-DEFINE_GUID(kTestProvider,
- 0xd236a42, 0xcd18, 0x4e3d, 0x99, 0x75, 0xdc, 0xee, 0xa2, 0x10, 0x6e, 0x5);
-
DEFINE_GUID(kGuidNull,
0x0000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0);
@@ -60,12 +57,6 @@ class TestingProvider: public EtwTraceProvider {
} // namespace
-TEST(EtwTraceTest, Cleanup) {
- // Clean up potential leftover sessions from previous unsuccessful runs.
- EtwTraceProperties ignore;
- EtwTraceController::Stop(kTestSessionName, &ignore);
-}
-
TEST(EtwTracePropertiesTest, Initialization) {
EtwTraceProperties prop;
@@ -115,38 +106,68 @@ TEST(EtwTracePropertiesTest, Strings) {
ASSERT_HRESULT_FAILED(prop.SetLoggerName(name2.c_str()));
}
-TEST(EtwTraceControllerTest, Initialize) {
+namespace {
+
+class EtwTraceControllerTest : public testing::Test {
+ public:
+ EtwTraceControllerTest() : session_name_(
+ base::StringPrintf(L"TestSession-%d", base::Process::Current().pid())) {
+ }
+
+ virtual void SetUp() {
+ EtwTraceProperties ignore;
+ EtwTraceController::Stop(session_name_.c_str(), &ignore);
+
+ // Allocate a new provider name GUID for each test.
+ ASSERT_HRESULT_SUCCEEDED(::CoCreateGuid(&test_provider_));
+ }
+
+ virtual void TearDown() {
+ EtwTraceProperties prop;
+ EtwTraceController::Stop(session_name_.c_str(), &prop);
+ }
+
+ protected:
+ GUID test_provider_;
+ std::wstring session_name_;
+};
+
+} // namespace
+
+TEST_F(EtwTraceControllerTest, Initialize) {
EtwTraceController controller;
EXPECT_EQ(NULL, controller.session());
EXPECT_STREQ(L"", controller.session_name());
}
-TEST(EtwTraceControllerTest, StartRealTimeSession) {
+
+TEST_F(EtwTraceControllerTest, StartRealTimeSession) {
EtwTraceController controller;
- HRESULT hr = controller.StartRealtimeSession(kTestSessionName, 100 * 1024);
+ HRESULT hr = controller.StartRealtimeSession(session_name_.c_str(),
+ 100 * 1024);
if (hr == E_ACCESSDENIED) {
VLOG(1) << "You must be an administrator to run this test on Vista";
return;
}
EXPECT_TRUE(NULL != controller.session());
- EXPECT_STREQ(kTestSessionName, controller.session_name());
+ EXPECT_STREQ(session_name_.c_str(), controller.session_name());
EXPECT_HRESULT_SUCCEEDED(controller.Stop(NULL));
EXPECT_EQ(NULL, controller.session());
EXPECT_STREQ(L"", controller.session_name());
}
-TEST(EtwTraceControllerTest, StartFileSession) {
+TEST_F(EtwTraceControllerTest, StartFileSession) {
ScopedTempDir temp_dir;
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
FilePath temp;
ASSERT_TRUE(file_util::CreateTemporaryFileInDir(temp_dir.path(), &temp));
EtwTraceController controller;
- HRESULT hr = controller.StartFileSession(kTestSessionName,
+ HRESULT hr = controller.StartFileSession(session_name_.c_str(),
temp.value().c_str());
if (hr == E_ACCESSDENIED) {
VLOG(1) << "You must be an administrator to run this test on Vista";
@@ -155,7 +176,7 @@ TEST(EtwTraceControllerTest, StartFileSession) {
}
EXPECT_TRUE(NULL != controller.session());
- EXPECT_STREQ(kTestSessionName, controller.session_name());
+ EXPECT_STREQ(session_name_.c_str(), controller.session_name());
EXPECT_HRESULT_SUCCEEDED(controller.Stop(NULL));
EXPECT_EQ(NULL, controller.session());
@@ -163,20 +184,21 @@ TEST(EtwTraceControllerTest, StartFileSession) {
file_util::Delete(temp, false);
}
-TEST(EtwTraceControllerTest, EnableDisable) {
- TestingProvider provider(kTestProvider);
+TEST_F(EtwTraceControllerTest, EnableDisable) {
+ TestingProvider provider(test_provider_);
EXPECT_EQ(ERROR_SUCCESS, provider.Register());
EXPECT_EQ(NULL, provider.session_handle());
EtwTraceController controller;
- HRESULT hr = controller.StartRealtimeSession(kTestSessionName, 100 * 1024);
+ HRESULT hr = controller.StartRealtimeSession(session_name_.c_str(),
+ 100 * 1024);
if (hr == E_ACCESSDENIED) {
VLOG(1) << "You must be an administrator to run this test on Vista";
return;
}
- EXPECT_HRESULT_SUCCEEDED(controller.EnableProvider(kTestProvider,
+ EXPECT_HRESULT_SUCCEEDED(controller.EnableProvider(test_provider_,
TRACE_LEVEL_VERBOSE, kTestProviderFlags));
provider.WaitForCallback();
@@ -184,7 +206,7 @@ TEST(EtwTraceControllerTest, EnableDisable) {
EXPECT_EQ(TRACE_LEVEL_VERBOSE, provider.enable_level());
EXPECT_EQ(kTestProviderFlags, provider.enable_flags());
- EXPECT_HRESULT_SUCCEEDED(controller.DisableProvider(kTestProvider));
+ EXPECT_HRESULT_SUCCEEDED(controller.DisableProvider(test_provider_));
provider.WaitForCallback();
@@ -194,7 +216,7 @@ TEST(EtwTraceControllerTest, EnableDisable) {
EXPECT_EQ(ERROR_SUCCESS, provider.Unregister());
// Enable the provider again, before registering.
- EXPECT_HRESULT_SUCCEEDED(controller.EnableProvider(kTestProvider,
+ EXPECT_HRESULT_SUCCEEDED(controller.EnableProvider(test_provider_,
TRACE_LEVEL_VERBOSE, kTestProviderFlags));
// Register the provider again, the settings above