1 // Copyright (c) 2009 The Chromium 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 // 5 // Unit tests for event trace provider. 6 #include "base/event_trace_provider_win.h" 7 #include <new> 8 #include "testing/gtest/include/gtest/gtest.h" 9 #include <initguid.h> // NOLINT - has to be last 10 11 namespace { 12 13 // {7F0FD37F-FA3C-4cd6-9242-DF60967A2CB2} 14 DEFINE_GUID(kTestProvider, 15 0x7f0fd37f, 0xfa3c, 0x4cd6, 0x92, 0x42, 0xdf, 0x60, 0x96, 0x7a, 0x2c, 0xb2); 16 17 // {7F0FD37F-FA3C-4cd6-9242-DF60967A2CB2} 18 DEFINE_GUID(kTestEventClass, 19 0x7f0fd37f, 0xfa3c, 0x4cd6, 0x92, 0x42, 0xdf, 0x60, 0x96, 0x7a, 0x2c, 0xb2); 20 21 } // namespace 22 23 TEST(EtwTraceProviderTest, ToleratesPreCreateInvocations) { 24 // Because the trace provider is used in logging, it's important that 25 // it be possible to use static provider instances without regard to 26 // whether they've been constructed or destructed. 27 // The interface of the class is designed to tolerate this usage. 28 char buf[sizeof(EtwTraceProvider)] = {0}; 29 EtwTraceProvider& provider = reinterpret_cast<EtwTraceProvider&>(buf); 30 31 EXPECT_EQ(NULL, provider.registration_handle()); 32 EXPECT_EQ(NULL, provider.session_handle()); 33 EXPECT_EQ(0, provider.enable_flags()); 34 EXPECT_EQ(0, provider.enable_level()); 35 36 EXPECT_FALSE(provider.ShouldLog(TRACE_LEVEL_FATAL, 0xfffffff)); 37 38 // We expect these not to crash. 39 provider.Log(kTestEventClass, 0, TRACE_LEVEL_FATAL, "foo"); 40 provider.Log(kTestEventClass, 0, TRACE_LEVEL_FATAL, L"foo"); 41 42 EtwMofEvent<1> dummy(kTestEventClass, 0, TRACE_LEVEL_FATAL); 43 DWORD data = 0; 44 dummy.SetField(0, sizeof(data), &data); 45 provider.Log(dummy.get()); 46 47 // Placement-new the provider into our buffer. 48 new (buf) EtwTraceProvider(kTestProvider); 49 50 // Registration is now safe. 51 EXPECT_EQ(ERROR_SUCCESS, provider.Register()); 52 53 // Destruct the instance, this should unregister it. 54 provider.EtwTraceProvider::~EtwTraceProvider(); 55 56 // And post-destruction, all of the above should still be safe. 57 EXPECT_EQ(NULL, provider.registration_handle()); 58 EXPECT_EQ(NULL, provider.session_handle()); 59 EXPECT_EQ(0, provider.enable_flags()); 60 EXPECT_EQ(0, provider.enable_level()); 61 62 EXPECT_FALSE(provider.ShouldLog(TRACE_LEVEL_FATAL, 0xfffffff)); 63 64 // We expect these not to crash. 65 provider.Log(kTestEventClass, 0, TRACE_LEVEL_FATAL, "foo"); 66 provider.Log(kTestEventClass, 0, TRACE_LEVEL_FATAL, L"foo"); 67 provider.Log(dummy.get()); 68 } 69 70 TEST(EtwTraceProviderTest, Initialize) { 71 EtwTraceProvider provider(kTestProvider); 72 73 EXPECT_EQ(NULL, provider.registration_handle()); 74 EXPECT_EQ(NULL, provider.session_handle()); 75 EXPECT_EQ(0, provider.enable_flags()); 76 EXPECT_EQ(0, provider.enable_level()); 77 } 78 79 TEST(EtwTraceProviderTest, Register) { 80 EtwTraceProvider provider(kTestProvider); 81 82 ASSERT_EQ(ERROR_SUCCESS, provider.Register()); 83 EXPECT_NE(NULL, provider.registration_handle()); 84 ASSERT_EQ(ERROR_SUCCESS, provider.Unregister()); 85 EXPECT_EQ(NULL, provider.registration_handle()); 86 } 87 88 TEST(EtwTraceProviderTest, RegisterWithNoNameFails) { 89 EtwTraceProvider provider; 90 91 EXPECT_NE(ERROR_SUCCESS, provider.Register()); 92 } 93 94 TEST(EtwTraceProviderTest, Enable) { 95 EtwTraceProvider provider(kTestProvider); 96 97 ASSERT_EQ(ERROR_SUCCESS, provider.Register()); 98 EXPECT_NE(NULL, provider.registration_handle()); 99 100 // No session so far. 101 EXPECT_EQ(NULL, provider.session_handle()); 102 EXPECT_EQ(0, provider.enable_flags()); 103 EXPECT_EQ(0, provider.enable_level()); 104 105 ASSERT_EQ(ERROR_SUCCESS, provider.Unregister()); 106 EXPECT_EQ(NULL, provider.registration_handle()); 107 } 108