15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)// Unit tests for event trace controller. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <objbase.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <initguid.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/files/file_path.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/files/file_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/files/scoped_temp_dir.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/process/process.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/strings/stringprintf.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/event_trace_controller.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/event_trace_provider.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_handle.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace win { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEFINE_GUID(kGuidNull, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ULONG kTestProviderFlags = 0xCAFEBABE; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestingProvider: public EtwTraceProvider { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TestingProvider(const GUID& provider_name) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : EtwTraceProvider(provider_name) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_event_.Set(::CreateEvent(NULL, TRUE, FALSE, NULL)); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForCallback() { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::WaitForSingleObject(callback_event_.Get(), INFINITE); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::ResetEvent(callback_event_.Get()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnEventsEnabled() { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::SetEvent(callback_event_.Get()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PostEventsDisabled() { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::SetEvent(callback_event_.Get()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedHandle callback_event_; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestingProvider); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(EtwTracePropertiesTest, Initialization) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EtwTraceProperties prop; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_TRACE_PROPERTIES* p = prop.get(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0u, p->Wnode.BufferSize); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, p->Wnode.ProviderId); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, p->Wnode.HistoricalContext); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(kGuidNull == p->Wnode.Guid); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->Wnode.ClientContext); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WNODE_FLAG_TRACED_GUID, p->Wnode.Flags); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->BufferSize); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->MinimumBuffers); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->MaximumBuffers); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->MaximumFileSize); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->LogFileMode); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->FlushTimer); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->EnableFlags); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->AgeLimit); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->NumberOfBuffers); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->FreeBuffers); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->EventsLost); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->BuffersWritten); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->LogBuffersLost); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->RealTimeBuffersLost); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, p->LoggerThreadId); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0u, p->LogFileNameOffset); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0u, p->LoggerNameOffset); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(EtwTracePropertiesTest, Strings) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EtwTraceProperties prop; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_STREQ(L"", prop.GetLoggerFileName()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_STREQ(L"", prop.GetLoggerName()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring name(1023, L'A'); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_HRESULT_SUCCEEDED(prop.SetLoggerFileName(name.c_str())); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_HRESULT_SUCCEEDED(prop.SetLoggerName(name.c_str())); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_STREQ(name.c_str(), prop.GetLoggerFileName()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_STREQ(name.c_str(), prop.GetLoggerName()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring name2(1024, L'A'); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_HRESULT_FAILED(prop.SetLoggerFileName(name2.c_str())); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_HRESULT_FAILED(prop.SetLoggerName(name2.c_str())); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EtwTraceControllerTest : public testing::Test { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EtwTraceControllerTest() 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : session_name_( 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringPrintf(L"TestSession-%d", Process::Current().pid())) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EtwTraceProperties ignore; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EtwTraceController::Stop(session_name_.c_str(), &ignore); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allocate a new provider name GUID for each test. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_HRESULT_SUCCEEDED(::CoCreateGuid(&test_provider_)); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EtwTraceProperties prop; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EtwTraceController::Stop(session_name_.c_str(), &prop); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GUID test_provider_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring session_name_; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EtwTraceControllerTest, Initialize) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EtwTraceController controller; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, controller.session()); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(L"", controller.session_name()); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EtwTraceControllerTest, StartRealTimeSession) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EtwTraceController controller; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = controller.StartRealtimeSession(session_name_.c_str(), 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100 * 1024); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hr == E_ACCESSDENIED) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "You must be an administrator to run this test on Vista"; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL != controller.session()); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(session_name_.c_str(), controller.session_name()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_HRESULT_SUCCEEDED(controller.Stop(NULL)); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, controller.session()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(L"", controller.session_name()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EtwTraceControllerTest, StartFileSession) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedTempDir temp_dir; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath temp; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.path(), &temp)); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EtwTraceController controller; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = controller.StartFileSession(session_name_.c_str(), 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp.value().c_str()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hr == E_ACCESSDENIED) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "You must be an administrator to run this test on Vista"; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DeleteFile(temp, false); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL != controller.session()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(session_name_.c_str(), controller.session_name()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_HRESULT_SUCCEEDED(controller.Stop(NULL)); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, controller.session()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(L"", controller.session_name()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DeleteFile(temp, false); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EtwTraceControllerTest, EnableDisable) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProvider provider(test_provider_); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, provider.Register()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, provider.session_handle()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EtwTraceController controller; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = controller.StartRealtimeSession(session_name_.c_str(), 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100 * 1024); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hr == E_ACCESSDENIED) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "You must be an administrator to run this test on Vista"; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_HRESULT_SUCCEEDED(controller.EnableProvider(test_provider_, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_LEVEL_VERBOSE, kTestProviderFlags)); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider.WaitForCallback(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TRACE_LEVEL_VERBOSE, provider.enable_level()); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTestProviderFlags, provider.enable_flags()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_HRESULT_SUCCEEDED(controller.DisableProvider(test_provider_)); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider.WaitForCallback(); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, provider.enable_level()); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, provider.enable_flags()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, provider.Unregister()); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enable the provider again, before registering. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_HRESULT_SUCCEEDED(controller.EnableProvider(test_provider_, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_LEVEL_VERBOSE, kTestProviderFlags)); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register the provider again, the settings above 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should take immediate effect. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, provider.Register()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TRACE_LEVEL_VERBOSE, provider.enable_level()); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTestProviderFlags, provider.enable_flags()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_HRESULT_SUCCEEDED(controller.Stop(NULL)); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider.WaitForCallback(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Session should have wound down. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, provider.enable_level()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, provider.enable_flags()); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace win 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)