Index: base/etw_log_writer_unittest.cc |
diff --git a/base/etw_log_writer_unittest.cc b/base/etw_log_writer_unittest.cc |
deleted file mode 100644 |
index 0a5a0de769cf2006a9ac9d7857dd32a94ec2e080..0000000000000000000000000000000000000000 |
--- a/base/etw_log_writer_unittest.cc |
+++ /dev/null |
@@ -1,563 +0,0 @@ |
-// Copyright 2010 Google Inc. |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
-// ======================================================================== |
-// |
-// ETW log writer unittests. |
- |
-#include <atlbase.h> |
-#include <atlstr.h> |
-#include <atlsync.h> |
-#include "omaha/base/app_util.h" |
-#include "omaha/base/etw_log_writer.h" |
-#include "omaha/base/event_trace_consumer.h" |
-#include "omaha/base/event_trace_controller.h" |
-#include "omaha/testing/unit_test.h" |
- |
- |
-namespace { |
- |
-using omaha::EtwEventType; |
-using omaha::EtwLogWriter; |
-using omaha::EtwTraceConsumerBase; |
-using testing::StrEq; |
- |
-class TestConsumer : public EtwTraceConsumerBase<TestConsumer> { |
- public: |
- TestConsumer() { |
- EXPECT_EQ(NULL, s_current_); |
- s_current_ = this; |
- } |
- |
- ~TestConsumer() { |
- EXPECT_TRUE(this == s_current_); |
- s_current_ = NULL; |
- } |
- |
- MOCK_METHOD1(OnLogMessage, void(const char* msg)); |
- |
- void ProcessLogEvent(EtwEventType type, const void* data, size_t data_len) { |
- data_len; // Unused |
- if (type == EtwLogWriter::kLogMessageType) { |
- OnLogMessage(reinterpret_cast<const char*>(data)); |
- } else if (type == EtwLogWriter::kLogMessageWithStackTraceType) { |
- const DWORD* depth = reinterpret_cast<const DWORD*>(data); |
- void* const* stack_trace = reinterpret_cast<void* const*>(depth + 1); |
- OnLogMessage(reinterpret_cast<const char*>(stack_trace + *depth)); |
- } else { |
- FAIL() << "Unexpected message type " << type; |
- } |
- } |
- |
- static void ProcessEvent(EVENT_TRACE* event) { |
- if (event->Header.Guid == EtwLogWriter::kLogEventId) { |
- s_current_->ProcessLogEvent(event->Header.Class.Type, |
- event->MofData, |
- event->MofLength); |
- } |
- } |
- |
- private: |
- static TestConsumer* s_current_; |
-}; |
- |
-TestConsumer* TestConsumer::s_current_ = NULL; |
- |
-const wchar_t kTestSessionName[] = L"EtwLogWriterTest Session"; |
-// {AD914B7A-0C5F-426e-895C-58B125408125} |
-const GUID kTestProviderGuid = { 0xad914b7a, 0xc5f, 0x426e, |
- { 0x89, 0x5c, 0x58, 0xb1, 0x25, 0x40, 0x81, 0x25 } }; |
- |
-// Subclass to allow using a distinct provider GUID and overriding |
-// event handlers. |
-class TestingLogWriter: public EtwLogWriter { |
- public: |
- TestingLogWriter() : EtwLogWriter(kTestProviderGuid) { |
- EXPECT_TRUE(events_enabled_.Create(NULL, TRUE, FALSE, NULL)); |
- EXPECT_TRUE(events_disabled_.Create(NULL, TRUE, FALSE, NULL)); |
- } |
- |
- void WaitUntilEnabled() { |
- // Wait for a the callback to hit, then reset the event. |
- EXPECT_EQ(WAIT_OBJECT_0, |
- ::WaitForSingleObject(events_enabled_, INFINITE)); |
- EXPECT_TRUE(::ResetEvent(events_enabled_)); |
- } |
- |
- void WaitUntilDisabled() { |
- // Wait for a the callback to hit, then reset the event. |
- EXPECT_EQ(WAIT_OBJECT_0, |
- ::WaitForSingleObject(events_disabled_, INFINITE)); |
- EXPECT_TRUE(::ResetEvent(events_disabled_)); |
- } |
- |
- ~TestingLogWriter() { |
- // We explicitly call Cleanup() here so that the ETW provider will |
- // be torn down before the CEvent destructors are called. We had |
- // issues with the test failing spuriously because the provider |
- // teardown is done on a separate thread, and would attempt to call |
- // OnEventsDisabled() after the event handles had been released. |
- // (http://b/2873205) |
- |
- Cleanup(); |
- } |
- |
- protected: |
- // Override from EtwTraceProvider. |
- virtual void OnEventsEnabled() { |
- EtwLogWriter::OnEventsEnabled(); |
- events_enabled_.Set(); |
- } |
- |
- virtual void OnEventsDisabled() { |
- EtwLogWriter::OnEventsDisabled(); |
- events_disabled_.Set(); |
- } |
- |
- CEvent events_enabled_; |
- CEvent events_disabled_; |
-}; |
- |
-} // namespace |
- |
-namespace omaha { |
- |
-class EtwLogWriterTest: public testing::Test { |
- public: |
- EtwLogWriterTest() : counter_(0) { |
- } |
- |
- virtual void SetUp() { |
- // Kill any dangling trace session. |
- EtwTraceProperties prop; |
- EtwTraceController::Stop(kTestSessionName, &prop); |
- |
- // And create a session on a new temp file. |
- EXPECT_TRUE(::GetTempFileName(app_util::GetTempDir(), _T("tmp"), 0, |
- CStrBuf(temp_file_, MAX_PATH))); |
- |
- EXPECT_HRESULT_SUCCEEDED( |
- controller_.StartFileSession(kTestSessionName, temp_file_, false)); |
- } |
- |
- virtual void TearDown() { |
- if (controller_.session() != NULL) { |
- EXPECT_HRESULT_SUCCEEDED(controller_.Stop(NULL)); |
- EXPECT_TRUE(::DeleteFile(temp_file_)); |
- } |
- } |
- |
- // Asserts that enabling ETW logging at trace_level causes |
- // logging at log_level to be enabled. |
- void ExpectLogLevelEnabled(EtwEventLevel trace_level, LogLevel log_level) { |
- TestingLogWriter writer; |
- EXPECT_HRESULT_SUCCEEDED( |
- controller_.EnableProvider(kTestProviderGuid, |
- trace_level, |
- 0xFFFFFFFF)) << |
- _T("[trace level: ") << static_cast<uint16>(trace_level) << |
- _T("][log level: ") << log_level << _T("]"); |
- writer.WaitUntilEnabled(); |
- EXPECT_EQ(true, writer.IsCatLevelEnabled(LC_LOGGING, log_level)); |
- } |
- |
- // Asserts that enabling ETW logging at trace_level causes |
- // logging at log_level to be disabled. |
- void ExpectLogLevelDisabled(EtwEventLevel trace_level, LogLevel log_level) { |
- TestingLogWriter writer; |
- EXPECT_HRESULT_SUCCEEDED( |
- controller_.EnableProvider(kTestProviderGuid, |
- trace_level, |
- 0xFFFFFFFF)) << |
- _T("[trace level: ") << static_cast<uint16>(trace_level) << |
- _T("][log level: ") << log_level << _T("]"); |
- writer.WaitUntilEnabled(); |
- EXPECT_EQ(false, writer.IsCatLevelEnabled(LC_LOGGING, log_level)); |
- } |
- |
- void ExpectLogMessage(EtwEventLevel trace_level, |
- EtwEventFlags enable_bits, |
- LogLevel log_level, |
- LogCategory log_cat, |
- bool should_log) { |
- TestingLogWriter writer; |
- EXPECT_HRESULT_SUCCEEDED( |
- controller_.EnableProvider(kTestProviderGuid, |
- trace_level, |
- enable_bits)) << |
- _T("[trace level: ") << static_cast<uint16>(trace_level) << |
- _T("][flags: 0x") << std::hex << enable_bits << std::dec << |
- _T("][log level: ") << log_level << |
- _T("][category: ") << log_cat << |
- _T("][should_log: ") << should_log << _T("]"); |
- writer.WaitUntilEnabled(); |
- |
- CString message; |
- message.Format(L"[%d][%d][0x%08X][%d][%d]", |
- ++counter_, // Make each expectation call unique. |
- trace_level, |
- enable_bits, |
- log_level, |
- log_cat); |
- OutputInfo info(log_cat, log_level, L"[Prefix]", message); |
- writer.OutputMessage(&info); |
- |
- CStringA expected_msg("[Prefix]"); |
- expected_msg += message; |
- // Set up an expectation for zero or one calls with this string, |
- // depending whether should_log or not. |
- EXPECT_CALL(consumer_, OnLogMessage(StrEq(expected_msg.GetString()))) |
- .Times(should_log ? 1 : 0); |
- } |
- |
- void ConsumeAndRestartLog() { |
- EXPECT_HRESULT_SUCCEEDED(controller_.Stop(NULL)); |
- |
- EXPECT_HRESULT_SUCCEEDED(consumer_.OpenFileSession(temp_file_)); |
- EXPECT_HRESULT_SUCCEEDED(consumer_.Consume()); |
- EXPECT_HRESULT_SUCCEEDED(consumer_.Close()); |
- |
- EXPECT_TRUE(::DeleteFile(temp_file_)); |
- |
- // Restart the log collection. |
- EXPECT_HRESULT_SUCCEEDED( |
- controller_.StartFileSession(kTestSessionName, temp_file_, false)); |
- } |
- |
- protected: |
- EtwTraceController controller_; |
- TestConsumer consumer_; |
- CString temp_file_; |
- int counter_; |
-}; |
- |
-TEST_F(EtwLogWriterTest, ProviderNotEnabled) { |
- // Verify that everything is turned off when the provider is not enabled. |
- TestingLogWriter writer; |
- |
- EXPECT_FALSE(writer.WantsToLogRegardless()); |
- for (int cat = LC_LOGGING; cat < LC_MAX_CAT; ++cat) { |
- for (int level = LEVEL_FATALERROR; level < LEVEL_ALL; ++level) { |
- EXPECT_EQ(false, writer.IsCatLevelEnabled(static_cast<LogCategory>(cat), |
- static_cast<LogLevel>(level))); |
- } |
- } |
-} |
- |
-TEST_F(EtwLogWriterTest, ProviderEnableFlags) { |
- // Test that various provider enable flags have the expected effect on |
- // IsCatLevelEnabled. |
- for (int cat = LC_LOGGING; cat < LC_MAX_CAT; ++cat) { |
- EtwEventFlags flags = 1 << (cat + 1); |
- |
- TestingLogWriter writer; |
- EXPECT_HRESULT_SUCCEEDED( |
- controller_.EnableProvider(kTestProviderGuid, |
- TRACE_LEVEL_INFORMATION, |
- flags)) << |
- _T("cat[") << cat << _T("]: 0x") << std::hex << flags; |
- writer.WaitUntilEnabled(); |
- |
- for (int probe = LC_LOGGING; probe < LC_MAX_CAT; ++probe) { |
- bool category_enabled = probe == cat; |
- EXPECT_EQ(category_enabled, |
- writer.IsCatLevelEnabled(static_cast<LogCategory>(probe), |
- LEVEL_ERROR)); |
- } |
- } |
-} |
- |
-// On Windows XP, it appears that 32 enable/disable trace level operations |
-// saturates some sort of a buffer, which causes the subsequent enable/disable |
-// operations to fail. To work around this, the following tests are chopped up |
-// into unnaturally small pieces. |
-TEST_F(EtwLogWriterTest, ProviderLevel) { |
- // Test that various trace levels have the expected effect on |
- // IsCatLevelEnabled. |
- |
- // TRACE_LEVEL_NONE |
- ExpectLogLevelDisabled(TRACE_LEVEL_NONE, LEVEL_FATALERROR); |
- ExpectLogLevelDisabled(TRACE_LEVEL_NONE, LEVEL_ERROR); |
- ExpectLogLevelDisabled(TRACE_LEVEL_NONE, LE); |
- ExpectLogLevelDisabled(TRACE_LEVEL_NONE, LEVEL_WARNING); |
- ExpectLogLevelDisabled(TRACE_LEVEL_NONE, LW); |
- ExpectLogLevelDisabled(TRACE_LEVEL_NONE, L1); |
- ExpectLogLevelDisabled(TRACE_LEVEL_NONE, L2); |
- ExpectLogLevelDisabled(TRACE_LEVEL_NONE, L3); |
- ExpectLogLevelDisabled(TRACE_LEVEL_NONE, L4); |
- ExpectLogLevelDisabled(TRACE_LEVEL_NONE, L5); |
- ExpectLogLevelDisabled(TRACE_LEVEL_NONE, L6); |
- ConsumeAndRestartLog(); |
- |
- if (!ShouldRunLargeTest()) { |
- // This test takes about 6 seconds, so only run part of it by default. |
- return; |
- } |
- |
- // TRACE_LEVEL_FATAL |
- ExpectLogLevelEnabled(TRACE_LEVEL_FATAL, LEVEL_FATALERROR); |
- ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, LEVEL_ERROR); |
- ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, LE); |
- ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, LEVEL_WARNING); |
- ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, LW); |
- ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, L1); |
- ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, L2); |
- ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, L3); |
- ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, L4); |
- ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, L5); |
- ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, L6); |
- ConsumeAndRestartLog(); |
- |
- // TRACE_LEVEL_ERROR |
- ExpectLogLevelEnabled(TRACE_LEVEL_ERROR, LEVEL_FATALERROR); |
- ExpectLogLevelEnabled(TRACE_LEVEL_ERROR, LEVEL_ERROR); |
- ExpectLogLevelEnabled(TRACE_LEVEL_ERROR, LE); |
- ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, LEVEL_WARNING); |
- ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, LW); |
- ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, L1); |
- ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, L2); |
- ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, L3); |
- ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, L4); |
- ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, L5); |
- ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, L6); |
- ConsumeAndRestartLog(); |
- |
- // TRACE_LEVEL_WARNING |
- ExpectLogLevelEnabled(TRACE_LEVEL_WARNING, LEVEL_FATALERROR); |
- ExpectLogLevelEnabled(TRACE_LEVEL_WARNING, LEVEL_ERROR); |
- ExpectLogLevelEnabled(TRACE_LEVEL_WARNING, LE); |
- ExpectLogLevelEnabled(TRACE_LEVEL_WARNING, LEVEL_WARNING); |
- ExpectLogLevelEnabled(TRACE_LEVEL_WARNING, LW); |
- ExpectLogLevelDisabled(TRACE_LEVEL_WARNING, L1); |
- ExpectLogLevelDisabled(TRACE_LEVEL_WARNING, L2); |
- ExpectLogLevelDisabled(TRACE_LEVEL_WARNING, L3); |
- ExpectLogLevelDisabled(TRACE_LEVEL_WARNING, L4); |
- ExpectLogLevelDisabled(TRACE_LEVEL_WARNING, L5); |
- ExpectLogLevelDisabled(TRACE_LEVEL_WARNING, L6); |
- ConsumeAndRestartLog(); |
- |
- // TRACE_LEVEL_INFORMATION |
- ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, LEVEL_FATALERROR); |
- ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, LEVEL_ERROR); |
- ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, LE); |
- ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, LEVEL_WARNING); |
- ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, LW); |
- ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, L1); |
- ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, L2); |
- ExpectLogLevelDisabled(TRACE_LEVEL_INFORMATION, L3); |
- ExpectLogLevelDisabled(TRACE_LEVEL_INFORMATION, L4); |
- ExpectLogLevelDisabled(TRACE_LEVEL_INFORMATION, L5); |
- ExpectLogLevelDisabled(TRACE_LEVEL_INFORMATION, L6); |
- ConsumeAndRestartLog(); |
- |
- // TRACE_LEVEL_VERBOSE |
- ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, LEVEL_FATALERROR); |
- ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, LEVEL_ERROR); |
- ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, LE); |
- ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, LEVEL_WARNING); |
- ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, LW); |
- ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, L1); |
- ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, L2); |
- ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, L3); |
- ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, L4); |
- ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, L5); |
- ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, L6); |
-} |
- |
-TEST_F(EtwLogWriterTest, UpdateProviderLevel) { |
- // Test that changing ETW trace levels and flags causes a pre-existing |
- // ETWLogProvider to update its log levels per IsCatLevelEnabled. |
- TestingLogWriter writer; |
- for (int cat = LC_LOGGING; cat < LC_MAX_CAT; ++cat) { |
- EXPECT_FALSE(writer.IsCatLevelEnabled(static_cast<LogCategory>(cat), |
- LEVEL_WARNING)); |
- } |
- |
- // Turn logging on. |
- EXPECT_HRESULT_SUCCEEDED( |
- controller_.EnableProvider(kTestProviderGuid, |
- TRACE_LEVEL_INFORMATION, |
- 0xFFFFFFFF)); |
- |
- // Wait for the callback to hit, then assert that logging is now enabled. |
- writer.WaitUntilEnabled(); |
- for (int cat = LC_LOGGING; cat < LC_MAX_CAT; ++cat) { |
- EXPECT_TRUE(writer.IsCatLevelEnabled(static_cast<LogCategory>(cat), |
- LEVEL_WARNING)); |
- } |
- |
- // Turn down the enable mask, aka categories. |
- EXPECT_HRESULT_SUCCEEDED( |
- controller_.EnableProvider(kTestProviderGuid, |
- TRACE_LEVEL_INFORMATION, |
- 0x0003)); // 3 is LC_LOGGING + stack traces. |
- |
- // Wait for the callback to hit, then assert that logging is still enabled |
- // but only for the LC_LOGGING category. |
- writer.WaitUntilEnabled(); |
- for (int cat = LC_LOGGING; cat < LC_MAX_CAT; ++cat) { |
- EXPECT_EQ(cat == LC_LOGGING, |
- writer.IsCatLevelEnabled(static_cast<LogCategory>(cat), |
- LEVEL_WARNING)); |
- } |
- |
- EXPECT_HRESULT_SUCCEEDED(controller_.DisableProvider(kTestProviderGuid)); |
- |
- // Wait for the callback to hit, then assert that logging is now disabled. |
- writer.WaitUntilDisabled(); |
- for (int cat = LC_LOGGING; cat < LC_MAX_CAT; ++cat) { |
- EXPECT_FALSE(writer.IsCatLevelEnabled(static_cast<LogCategory>(cat), |
- LEVEL_WARNING)); |
- } |
-} |
- |
-TEST_F(EtwLogWriterTest, OutputMessageIsRobust) { |
- // Test that OutputMessage doesn't fall over on unexpected inputs. |
- |
- // Turn logging on. |
- TestingLogWriter writer; |
- EXPECT_HRESULT_SUCCEEDED( |
- controller_.EnableProvider(kTestProviderGuid, |
- TRACE_LEVEL_INFORMATION, |
- 0xFFFFFFFF)); |
- writer.WaitUntilEnabled(); |
- |
- OutputInfo msg(LC_LOGGING, LW, L"TEST", NULL); |
- writer.OutputMessage(&msg); |
- |
- msg.category = static_cast<LogCategory>(0xFF); |
- msg.level = static_cast<LogLevel>(0xFF); |
- msg.msg1 = NULL; |
- msg.msg2 = L"TEST"; |
- writer.OutputMessage(&msg); |
-} |
- |
-TEST_F(EtwLogWriterTest, OutputMessageOnlyLevelsEnabled) { |
-#define EXPECT_LOG(trace_level, enable_bits, log_level, log_cat) \ |
- ExpectLogMessage(trace_level, enable_bits, log_level, log_cat, true); |
-#define EXPECT_NO_LOG(trace_level, enable_bits, log_level, log_cat) \ |
- ExpectLogMessage(trace_level, enable_bits, log_level, log_cat, false); |
- |
- // Try different levels at LC_LOGGING category. |
- EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, LEVEL_FATALERROR, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, LEVEL_ERROR, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, LE, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, LEVEL_WARNING, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, LW, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, L1, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, L2, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, L3, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, L4, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, L5, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, L6, LC_LOGGING); |
- ConsumeAndRestartLog(); |
- |
- if (!ShouldRunLargeTest()) { |
- // This test takes about 7 seconds, so only run part of it by default. |
- return; |
- } |
- |
- EXPECT_LOG(TRACE_LEVEL_FATAL, 0x3, LEVEL_FATALERROR, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, LEVEL_ERROR, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, LE, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, LEVEL_WARNING, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, LW, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, L1, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, L2, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, L3, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, L4, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, L5, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, L6, LC_LOGGING); |
- ConsumeAndRestartLog(); |
- |
- EXPECT_LOG(TRACE_LEVEL_ERROR, 0x3, LEVEL_FATALERROR, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_ERROR, 0x3, LEVEL_ERROR, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_ERROR, 0x3, LE, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, LEVEL_WARNING, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, LW, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, L1, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, L2, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, L3, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, L4, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, L5, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, L6, LC_LOGGING); |
- ConsumeAndRestartLog(); |
- |
- EXPECT_LOG(TRACE_LEVEL_WARNING, 0x3, LEVEL_FATALERROR, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_WARNING, 0x3, LEVEL_ERROR, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_WARNING, 0x3, LE, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_WARNING, 0x3, LEVEL_WARNING, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_WARNING, 0x3, LW, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_WARNING, 0x3, L1, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_WARNING, 0x3, L2, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_WARNING, 0x3, L3, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_WARNING, 0x3, L4, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_WARNING, 0x3, L5, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_WARNING, 0x3, L6, LC_LOGGING); |
- ConsumeAndRestartLog(); |
- |
- EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, LEVEL_FATALERROR, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, LEVEL_ERROR, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, LE, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, LEVEL_WARNING, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, LW, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, L1, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, L2, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_INFORMATION, 0x3, L3, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_INFORMATION, 0x3, L4, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_INFORMATION, 0x3, L5, LC_LOGGING); |
- EXPECT_NO_LOG(TRACE_LEVEL_INFORMATION, 0x3, L6, LC_LOGGING); |
- ConsumeAndRestartLog(); |
- |
- EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, LEVEL_FATALERROR, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, LEVEL_ERROR, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, LE, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, LEVEL_WARNING, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, LW, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, L1, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, L2, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, L3, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, L4, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, L5, LC_LOGGING); |
- EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, L6, LC_LOGGING); |
- ConsumeAndRestartLog(); |
-} |
- |
-TEST_F(EtwLogWriterTest, OutputMessageOnlyCategoriesEnabled) { |
- int max_cat = LC_MAX_CAT; |
- if (!ShouldRunLargeTest()) { |
- // This test takes about 12 seconds, so only run part of it by default. |
- max_cat = LC_LOGGING + 2; // Test combinations of the first two categories. |
- } |
- |
- // Loop through categories. |
- for (int log_cat = LC_LOGGING; log_cat < max_cat; ++log_cat) { |
- for (int enable_cat = LC_LOGGING; enable_cat < max_cat; ++enable_cat) { |
- EtwEventFlags enable_bits = |
- EtwLogWriter::CategoryToEnableFlag( |
- static_cast<LogCategory>(enable_cat)); |
- |
- ExpectLogMessage(TRACE_LEVEL_VERBOSE, |
- enable_bits, |
- LEVEL_WARNING, |
- static_cast<LogCategory>(log_cat), |
- log_cat == enable_cat); |
- } |
- |
- // Play the log for every log category, due to the ETW enable/disable |
- // restriction on Windows XP that's mentioned above. |
- ConsumeAndRestartLog(); |
- } |
-} |
- |
-} // namespace omaha |