Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: base/etw_log_writer_unittest.cc

Issue 624713003: Keep only base/extractor.[cc|h]. (Closed) Base URL: https://chromium.googlesource.com/external/omaha.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/etw_log_writer.cc ('k') | base/event_handler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2010 Google Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 // ========================================================================
15 //
16 // ETW log writer unittests.
17
18 #include <atlbase.h>
19 #include <atlstr.h>
20 #include <atlsync.h>
21 #include "omaha/base/app_util.h"
22 #include "omaha/base/etw_log_writer.h"
23 #include "omaha/base/event_trace_consumer.h"
24 #include "omaha/base/event_trace_controller.h"
25 #include "omaha/testing/unit_test.h"
26
27
28 namespace {
29
30 using omaha::EtwEventType;
31 using omaha::EtwLogWriter;
32 using omaha::EtwTraceConsumerBase;
33 using testing::StrEq;
34
35 class TestConsumer : public EtwTraceConsumerBase<TestConsumer> {
36 public:
37 TestConsumer() {
38 EXPECT_EQ(NULL, s_current_);
39 s_current_ = this;
40 }
41
42 ~TestConsumer() {
43 EXPECT_TRUE(this == s_current_);
44 s_current_ = NULL;
45 }
46
47 MOCK_METHOD1(OnLogMessage, void(const char* msg));
48
49 void ProcessLogEvent(EtwEventType type, const void* data, size_t data_len) {
50 data_len; // Unused
51 if (type == EtwLogWriter::kLogMessageType) {
52 OnLogMessage(reinterpret_cast<const char*>(data));
53 } else if (type == EtwLogWriter::kLogMessageWithStackTraceType) {
54 const DWORD* depth = reinterpret_cast<const DWORD*>(data);
55 void* const* stack_trace = reinterpret_cast<void* const*>(depth + 1);
56 OnLogMessage(reinterpret_cast<const char*>(stack_trace + *depth));
57 } else {
58 FAIL() << "Unexpected message type " << type;
59 }
60 }
61
62 static void ProcessEvent(EVENT_TRACE* event) {
63 if (event->Header.Guid == EtwLogWriter::kLogEventId) {
64 s_current_->ProcessLogEvent(event->Header.Class.Type,
65 event->MofData,
66 event->MofLength);
67 }
68 }
69
70 private:
71 static TestConsumer* s_current_;
72 };
73
74 TestConsumer* TestConsumer::s_current_ = NULL;
75
76 const wchar_t kTestSessionName[] = L"EtwLogWriterTest Session";
77 // {AD914B7A-0C5F-426e-895C-58B125408125}
78 const GUID kTestProviderGuid = { 0xad914b7a, 0xc5f, 0x426e,
79 { 0x89, 0x5c, 0x58, 0xb1, 0x25, 0x40, 0x81, 0x25 } };
80
81 // Subclass to allow using a distinct provider GUID and overriding
82 // event handlers.
83 class TestingLogWriter: public EtwLogWriter {
84 public:
85 TestingLogWriter() : EtwLogWriter(kTestProviderGuid) {
86 EXPECT_TRUE(events_enabled_.Create(NULL, TRUE, FALSE, NULL));
87 EXPECT_TRUE(events_disabled_.Create(NULL, TRUE, FALSE, NULL));
88 }
89
90 void WaitUntilEnabled() {
91 // Wait for a the callback to hit, then reset the event.
92 EXPECT_EQ(WAIT_OBJECT_0,
93 ::WaitForSingleObject(events_enabled_, INFINITE));
94 EXPECT_TRUE(::ResetEvent(events_enabled_));
95 }
96
97 void WaitUntilDisabled() {
98 // Wait for a the callback to hit, then reset the event.
99 EXPECT_EQ(WAIT_OBJECT_0,
100 ::WaitForSingleObject(events_disabled_, INFINITE));
101 EXPECT_TRUE(::ResetEvent(events_disabled_));
102 }
103
104 ~TestingLogWriter() {
105 // We explicitly call Cleanup() here so that the ETW provider will
106 // be torn down before the CEvent destructors are called. We had
107 // issues with the test failing spuriously because the provider
108 // teardown is done on a separate thread, and would attempt to call
109 // OnEventsDisabled() after the event handles had been released.
110 // (http://b/2873205)
111
112 Cleanup();
113 }
114
115 protected:
116 // Override from EtwTraceProvider.
117 virtual void OnEventsEnabled() {
118 EtwLogWriter::OnEventsEnabled();
119 events_enabled_.Set();
120 }
121
122 virtual void OnEventsDisabled() {
123 EtwLogWriter::OnEventsDisabled();
124 events_disabled_.Set();
125 }
126
127 CEvent events_enabled_;
128 CEvent events_disabled_;
129 };
130
131 } // namespace
132
133 namespace omaha {
134
135 class EtwLogWriterTest: public testing::Test {
136 public:
137 EtwLogWriterTest() : counter_(0) {
138 }
139
140 virtual void SetUp() {
141 // Kill any dangling trace session.
142 EtwTraceProperties prop;
143 EtwTraceController::Stop(kTestSessionName, &prop);
144
145 // And create a session on a new temp file.
146 EXPECT_TRUE(::GetTempFileName(app_util::GetTempDir(), _T("tmp"), 0,
147 CStrBuf(temp_file_, MAX_PATH)));
148
149 EXPECT_HRESULT_SUCCEEDED(
150 controller_.StartFileSession(kTestSessionName, temp_file_, false));
151 }
152
153 virtual void TearDown() {
154 if (controller_.session() != NULL) {
155 EXPECT_HRESULT_SUCCEEDED(controller_.Stop(NULL));
156 EXPECT_TRUE(::DeleteFile(temp_file_));
157 }
158 }
159
160 // Asserts that enabling ETW logging at trace_level causes
161 // logging at log_level to be enabled.
162 void ExpectLogLevelEnabled(EtwEventLevel trace_level, LogLevel log_level) {
163 TestingLogWriter writer;
164 EXPECT_HRESULT_SUCCEEDED(
165 controller_.EnableProvider(kTestProviderGuid,
166 trace_level,
167 0xFFFFFFFF)) <<
168 _T("[trace level: ") << static_cast<uint16>(trace_level) <<
169 _T("][log level: ") << log_level << _T("]");
170 writer.WaitUntilEnabled();
171 EXPECT_EQ(true, writer.IsCatLevelEnabled(LC_LOGGING, log_level));
172 }
173
174 // Asserts that enabling ETW logging at trace_level causes
175 // logging at log_level to be disabled.
176 void ExpectLogLevelDisabled(EtwEventLevel trace_level, LogLevel log_level) {
177 TestingLogWriter writer;
178 EXPECT_HRESULT_SUCCEEDED(
179 controller_.EnableProvider(kTestProviderGuid,
180 trace_level,
181 0xFFFFFFFF)) <<
182 _T("[trace level: ") << static_cast<uint16>(trace_level) <<
183 _T("][log level: ") << log_level << _T("]");
184 writer.WaitUntilEnabled();
185 EXPECT_EQ(false, writer.IsCatLevelEnabled(LC_LOGGING, log_level));
186 }
187
188 void ExpectLogMessage(EtwEventLevel trace_level,
189 EtwEventFlags enable_bits,
190 LogLevel log_level,
191 LogCategory log_cat,
192 bool should_log) {
193 TestingLogWriter writer;
194 EXPECT_HRESULT_SUCCEEDED(
195 controller_.EnableProvider(kTestProviderGuid,
196 trace_level,
197 enable_bits)) <<
198 _T("[trace level: ") << static_cast<uint16>(trace_level) <<
199 _T("][flags: 0x") << std::hex << enable_bits << std::dec <<
200 _T("][log level: ") << log_level <<
201 _T("][category: ") << log_cat <<
202 _T("][should_log: ") << should_log << _T("]");
203 writer.WaitUntilEnabled();
204
205 CString message;
206 message.Format(L"[%d][%d][0x%08X][%d][%d]",
207 ++counter_, // Make each expectation call unique.
208 trace_level,
209 enable_bits,
210 log_level,
211 log_cat);
212 OutputInfo info(log_cat, log_level, L"[Prefix]", message);
213 writer.OutputMessage(&info);
214
215 CStringA expected_msg("[Prefix]");
216 expected_msg += message;
217 // Set up an expectation for zero or one calls with this string,
218 // depending whether should_log or not.
219 EXPECT_CALL(consumer_, OnLogMessage(StrEq(expected_msg.GetString())))
220 .Times(should_log ? 1 : 0);
221 }
222
223 void ConsumeAndRestartLog() {
224 EXPECT_HRESULT_SUCCEEDED(controller_.Stop(NULL));
225
226 EXPECT_HRESULT_SUCCEEDED(consumer_.OpenFileSession(temp_file_));
227 EXPECT_HRESULT_SUCCEEDED(consumer_.Consume());
228 EXPECT_HRESULT_SUCCEEDED(consumer_.Close());
229
230 EXPECT_TRUE(::DeleteFile(temp_file_));
231
232 // Restart the log collection.
233 EXPECT_HRESULT_SUCCEEDED(
234 controller_.StartFileSession(kTestSessionName, temp_file_, false));
235 }
236
237 protected:
238 EtwTraceController controller_;
239 TestConsumer consumer_;
240 CString temp_file_;
241 int counter_;
242 };
243
244 TEST_F(EtwLogWriterTest, ProviderNotEnabled) {
245 // Verify that everything is turned off when the provider is not enabled.
246 TestingLogWriter writer;
247
248 EXPECT_FALSE(writer.WantsToLogRegardless());
249 for (int cat = LC_LOGGING; cat < LC_MAX_CAT; ++cat) {
250 for (int level = LEVEL_FATALERROR; level < LEVEL_ALL; ++level) {
251 EXPECT_EQ(false, writer.IsCatLevelEnabled(static_cast<LogCategory>(cat),
252 static_cast<LogLevel>(level)));
253 }
254 }
255 }
256
257 TEST_F(EtwLogWriterTest, ProviderEnableFlags) {
258 // Test that various provider enable flags have the expected effect on
259 // IsCatLevelEnabled.
260 for (int cat = LC_LOGGING; cat < LC_MAX_CAT; ++cat) {
261 EtwEventFlags flags = 1 << (cat + 1);
262
263 TestingLogWriter writer;
264 EXPECT_HRESULT_SUCCEEDED(
265 controller_.EnableProvider(kTestProviderGuid,
266 TRACE_LEVEL_INFORMATION,
267 flags)) <<
268 _T("cat[") << cat << _T("]: 0x") << std::hex << flags;
269 writer.WaitUntilEnabled();
270
271 for (int probe = LC_LOGGING; probe < LC_MAX_CAT; ++probe) {
272 bool category_enabled = probe == cat;
273 EXPECT_EQ(category_enabled,
274 writer.IsCatLevelEnabled(static_cast<LogCategory>(probe),
275 LEVEL_ERROR));
276 }
277 }
278 }
279
280 // On Windows XP, it appears that 32 enable/disable trace level operations
281 // saturates some sort of a buffer, which causes the subsequent enable/disable
282 // operations to fail. To work around this, the following tests are chopped up
283 // into unnaturally small pieces.
284 TEST_F(EtwLogWriterTest, ProviderLevel) {
285 // Test that various trace levels have the expected effect on
286 // IsCatLevelEnabled.
287
288 // TRACE_LEVEL_NONE
289 ExpectLogLevelDisabled(TRACE_LEVEL_NONE, LEVEL_FATALERROR);
290 ExpectLogLevelDisabled(TRACE_LEVEL_NONE, LEVEL_ERROR);
291 ExpectLogLevelDisabled(TRACE_LEVEL_NONE, LE);
292 ExpectLogLevelDisabled(TRACE_LEVEL_NONE, LEVEL_WARNING);
293 ExpectLogLevelDisabled(TRACE_LEVEL_NONE, LW);
294 ExpectLogLevelDisabled(TRACE_LEVEL_NONE, L1);
295 ExpectLogLevelDisabled(TRACE_LEVEL_NONE, L2);
296 ExpectLogLevelDisabled(TRACE_LEVEL_NONE, L3);
297 ExpectLogLevelDisabled(TRACE_LEVEL_NONE, L4);
298 ExpectLogLevelDisabled(TRACE_LEVEL_NONE, L5);
299 ExpectLogLevelDisabled(TRACE_LEVEL_NONE, L6);
300 ConsumeAndRestartLog();
301
302 if (!ShouldRunLargeTest()) {
303 // This test takes about 6 seconds, so only run part of it by default.
304 return;
305 }
306
307 // TRACE_LEVEL_FATAL
308 ExpectLogLevelEnabled(TRACE_LEVEL_FATAL, LEVEL_FATALERROR);
309 ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, LEVEL_ERROR);
310 ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, LE);
311 ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, LEVEL_WARNING);
312 ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, LW);
313 ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, L1);
314 ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, L2);
315 ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, L3);
316 ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, L4);
317 ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, L5);
318 ExpectLogLevelDisabled(TRACE_LEVEL_FATAL, L6);
319 ConsumeAndRestartLog();
320
321 // TRACE_LEVEL_ERROR
322 ExpectLogLevelEnabled(TRACE_LEVEL_ERROR, LEVEL_FATALERROR);
323 ExpectLogLevelEnabled(TRACE_LEVEL_ERROR, LEVEL_ERROR);
324 ExpectLogLevelEnabled(TRACE_LEVEL_ERROR, LE);
325 ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, LEVEL_WARNING);
326 ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, LW);
327 ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, L1);
328 ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, L2);
329 ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, L3);
330 ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, L4);
331 ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, L5);
332 ExpectLogLevelDisabled(TRACE_LEVEL_ERROR, L6);
333 ConsumeAndRestartLog();
334
335 // TRACE_LEVEL_WARNING
336 ExpectLogLevelEnabled(TRACE_LEVEL_WARNING, LEVEL_FATALERROR);
337 ExpectLogLevelEnabled(TRACE_LEVEL_WARNING, LEVEL_ERROR);
338 ExpectLogLevelEnabled(TRACE_LEVEL_WARNING, LE);
339 ExpectLogLevelEnabled(TRACE_LEVEL_WARNING, LEVEL_WARNING);
340 ExpectLogLevelEnabled(TRACE_LEVEL_WARNING, LW);
341 ExpectLogLevelDisabled(TRACE_LEVEL_WARNING, L1);
342 ExpectLogLevelDisabled(TRACE_LEVEL_WARNING, L2);
343 ExpectLogLevelDisabled(TRACE_LEVEL_WARNING, L3);
344 ExpectLogLevelDisabled(TRACE_LEVEL_WARNING, L4);
345 ExpectLogLevelDisabled(TRACE_LEVEL_WARNING, L5);
346 ExpectLogLevelDisabled(TRACE_LEVEL_WARNING, L6);
347 ConsumeAndRestartLog();
348
349 // TRACE_LEVEL_INFORMATION
350 ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, LEVEL_FATALERROR);
351 ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, LEVEL_ERROR);
352 ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, LE);
353 ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, LEVEL_WARNING);
354 ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, LW);
355 ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, L1);
356 ExpectLogLevelEnabled(TRACE_LEVEL_INFORMATION, L2);
357 ExpectLogLevelDisabled(TRACE_LEVEL_INFORMATION, L3);
358 ExpectLogLevelDisabled(TRACE_LEVEL_INFORMATION, L4);
359 ExpectLogLevelDisabled(TRACE_LEVEL_INFORMATION, L5);
360 ExpectLogLevelDisabled(TRACE_LEVEL_INFORMATION, L6);
361 ConsumeAndRestartLog();
362
363 // TRACE_LEVEL_VERBOSE
364 ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, LEVEL_FATALERROR);
365 ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, LEVEL_ERROR);
366 ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, LE);
367 ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, LEVEL_WARNING);
368 ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, LW);
369 ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, L1);
370 ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, L2);
371 ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, L3);
372 ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, L4);
373 ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, L5);
374 ExpectLogLevelEnabled(TRACE_LEVEL_VERBOSE, L6);
375 }
376
377 TEST_F(EtwLogWriterTest, UpdateProviderLevel) {
378 // Test that changing ETW trace levels and flags causes a pre-existing
379 // ETWLogProvider to update its log levels per IsCatLevelEnabled.
380 TestingLogWriter writer;
381 for (int cat = LC_LOGGING; cat < LC_MAX_CAT; ++cat) {
382 EXPECT_FALSE(writer.IsCatLevelEnabled(static_cast<LogCategory>(cat),
383 LEVEL_WARNING));
384 }
385
386 // Turn logging on.
387 EXPECT_HRESULT_SUCCEEDED(
388 controller_.EnableProvider(kTestProviderGuid,
389 TRACE_LEVEL_INFORMATION,
390 0xFFFFFFFF));
391
392 // Wait for the callback to hit, then assert that logging is now enabled.
393 writer.WaitUntilEnabled();
394 for (int cat = LC_LOGGING; cat < LC_MAX_CAT; ++cat) {
395 EXPECT_TRUE(writer.IsCatLevelEnabled(static_cast<LogCategory>(cat),
396 LEVEL_WARNING));
397 }
398
399 // Turn down the enable mask, aka categories.
400 EXPECT_HRESULT_SUCCEEDED(
401 controller_.EnableProvider(kTestProviderGuid,
402 TRACE_LEVEL_INFORMATION,
403 0x0003)); // 3 is LC_LOGGING + stack traces.
404
405 // Wait for the callback to hit, then assert that logging is still enabled
406 // but only for the LC_LOGGING category.
407 writer.WaitUntilEnabled();
408 for (int cat = LC_LOGGING; cat < LC_MAX_CAT; ++cat) {
409 EXPECT_EQ(cat == LC_LOGGING,
410 writer.IsCatLevelEnabled(static_cast<LogCategory>(cat),
411 LEVEL_WARNING));
412 }
413
414 EXPECT_HRESULT_SUCCEEDED(controller_.DisableProvider(kTestProviderGuid));
415
416 // Wait for the callback to hit, then assert that logging is now disabled.
417 writer.WaitUntilDisabled();
418 for (int cat = LC_LOGGING; cat < LC_MAX_CAT; ++cat) {
419 EXPECT_FALSE(writer.IsCatLevelEnabled(static_cast<LogCategory>(cat),
420 LEVEL_WARNING));
421 }
422 }
423
424 TEST_F(EtwLogWriterTest, OutputMessageIsRobust) {
425 // Test that OutputMessage doesn't fall over on unexpected inputs.
426
427 // Turn logging on.
428 TestingLogWriter writer;
429 EXPECT_HRESULT_SUCCEEDED(
430 controller_.EnableProvider(kTestProviderGuid,
431 TRACE_LEVEL_INFORMATION,
432 0xFFFFFFFF));
433 writer.WaitUntilEnabled();
434
435 OutputInfo msg(LC_LOGGING, LW, L"TEST", NULL);
436 writer.OutputMessage(&msg);
437
438 msg.category = static_cast<LogCategory>(0xFF);
439 msg.level = static_cast<LogLevel>(0xFF);
440 msg.msg1 = NULL;
441 msg.msg2 = L"TEST";
442 writer.OutputMessage(&msg);
443 }
444
445 TEST_F(EtwLogWriterTest, OutputMessageOnlyLevelsEnabled) {
446 #define EXPECT_LOG(trace_level, enable_bits, log_level, log_cat) \
447 ExpectLogMessage(trace_level, enable_bits, log_level, log_cat, true);
448 #define EXPECT_NO_LOG(trace_level, enable_bits, log_level, log_cat) \
449 ExpectLogMessage(trace_level, enable_bits, log_level, log_cat, false);
450
451 // Try different levels at LC_LOGGING category.
452 EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, LEVEL_FATALERROR, LC_LOGGING);
453 EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, LEVEL_ERROR, LC_LOGGING);
454 EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, LE, LC_LOGGING);
455 EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, LEVEL_WARNING, LC_LOGGING);
456 EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, LW, LC_LOGGING);
457 EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, L1, LC_LOGGING);
458 EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, L2, LC_LOGGING);
459 EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, L3, LC_LOGGING);
460 EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, L4, LC_LOGGING);
461 EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, L5, LC_LOGGING);
462 EXPECT_NO_LOG(TRACE_LEVEL_NONE, 0x3, L6, LC_LOGGING);
463 ConsumeAndRestartLog();
464
465 if (!ShouldRunLargeTest()) {
466 // This test takes about 7 seconds, so only run part of it by default.
467 return;
468 }
469
470 EXPECT_LOG(TRACE_LEVEL_FATAL, 0x3, LEVEL_FATALERROR, LC_LOGGING);
471 EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, LEVEL_ERROR, LC_LOGGING);
472 EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, LE, LC_LOGGING);
473 EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, LEVEL_WARNING, LC_LOGGING);
474 EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, LW, LC_LOGGING);
475 EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, L1, LC_LOGGING);
476 EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, L2, LC_LOGGING);
477 EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, L3, LC_LOGGING);
478 EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, L4, LC_LOGGING);
479 EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, L5, LC_LOGGING);
480 EXPECT_NO_LOG(TRACE_LEVEL_FATAL, 0x3, L6, LC_LOGGING);
481 ConsumeAndRestartLog();
482
483 EXPECT_LOG(TRACE_LEVEL_ERROR, 0x3, LEVEL_FATALERROR, LC_LOGGING);
484 EXPECT_LOG(TRACE_LEVEL_ERROR, 0x3, LEVEL_ERROR, LC_LOGGING);
485 EXPECT_LOG(TRACE_LEVEL_ERROR, 0x3, LE, LC_LOGGING);
486 EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, LEVEL_WARNING, LC_LOGGING);
487 EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, LW, LC_LOGGING);
488 EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, L1, LC_LOGGING);
489 EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, L2, LC_LOGGING);
490 EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, L3, LC_LOGGING);
491 EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, L4, LC_LOGGING);
492 EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, L5, LC_LOGGING);
493 EXPECT_NO_LOG(TRACE_LEVEL_ERROR, 0x3, L6, LC_LOGGING);
494 ConsumeAndRestartLog();
495
496 EXPECT_LOG(TRACE_LEVEL_WARNING, 0x3, LEVEL_FATALERROR, LC_LOGGING);
497 EXPECT_LOG(TRACE_LEVEL_WARNING, 0x3, LEVEL_ERROR, LC_LOGGING);
498 EXPECT_LOG(TRACE_LEVEL_WARNING, 0x3, LE, LC_LOGGING);
499 EXPECT_LOG(TRACE_LEVEL_WARNING, 0x3, LEVEL_WARNING, LC_LOGGING);
500 EXPECT_LOG(TRACE_LEVEL_WARNING, 0x3, LW, LC_LOGGING);
501 EXPECT_NO_LOG(TRACE_LEVEL_WARNING, 0x3, L1, LC_LOGGING);
502 EXPECT_NO_LOG(TRACE_LEVEL_WARNING, 0x3, L2, LC_LOGGING);
503 EXPECT_NO_LOG(TRACE_LEVEL_WARNING, 0x3, L3, LC_LOGGING);
504 EXPECT_NO_LOG(TRACE_LEVEL_WARNING, 0x3, L4, LC_LOGGING);
505 EXPECT_NO_LOG(TRACE_LEVEL_WARNING, 0x3, L5, LC_LOGGING);
506 EXPECT_NO_LOG(TRACE_LEVEL_WARNING, 0x3, L6, LC_LOGGING);
507 ConsumeAndRestartLog();
508
509 EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, LEVEL_FATALERROR, LC_LOGGING);
510 EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, LEVEL_ERROR, LC_LOGGING);
511 EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, LE, LC_LOGGING);
512 EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, LEVEL_WARNING, LC_LOGGING);
513 EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, LW, LC_LOGGING);
514 EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, L1, LC_LOGGING);
515 EXPECT_LOG(TRACE_LEVEL_INFORMATION, 0x3, L2, LC_LOGGING);
516 EXPECT_NO_LOG(TRACE_LEVEL_INFORMATION, 0x3, L3, LC_LOGGING);
517 EXPECT_NO_LOG(TRACE_LEVEL_INFORMATION, 0x3, L4, LC_LOGGING);
518 EXPECT_NO_LOG(TRACE_LEVEL_INFORMATION, 0x3, L5, LC_LOGGING);
519 EXPECT_NO_LOG(TRACE_LEVEL_INFORMATION, 0x3, L6, LC_LOGGING);
520 ConsumeAndRestartLog();
521
522 EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, LEVEL_FATALERROR, LC_LOGGING);
523 EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, LEVEL_ERROR, LC_LOGGING);
524 EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, LE, LC_LOGGING);
525 EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, LEVEL_WARNING, LC_LOGGING);
526 EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, LW, LC_LOGGING);
527 EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, L1, LC_LOGGING);
528 EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, L2, LC_LOGGING);
529 EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, L3, LC_LOGGING);
530 EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, L4, LC_LOGGING);
531 EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, L5, LC_LOGGING);
532 EXPECT_LOG(TRACE_LEVEL_VERBOSE, 0x3, L6, LC_LOGGING);
533 ConsumeAndRestartLog();
534 }
535
536 TEST_F(EtwLogWriterTest, OutputMessageOnlyCategoriesEnabled) {
537 int max_cat = LC_MAX_CAT;
538 if (!ShouldRunLargeTest()) {
539 // This test takes about 12 seconds, so only run part of it by default.
540 max_cat = LC_LOGGING + 2; // Test combinations of the first two categories.
541 }
542
543 // Loop through categories.
544 for (int log_cat = LC_LOGGING; log_cat < max_cat; ++log_cat) {
545 for (int enable_cat = LC_LOGGING; enable_cat < max_cat; ++enable_cat) {
546 EtwEventFlags enable_bits =
547 EtwLogWriter::CategoryToEnableFlag(
548 static_cast<LogCategory>(enable_cat));
549
550 ExpectLogMessage(TRACE_LEVEL_VERBOSE,
551 enable_bits,
552 LEVEL_WARNING,
553 static_cast<LogCategory>(log_cat),
554 log_cat == enable_cat);
555 }
556
557 // Play the log for every log category, due to the ETW enable/disable
558 // restriction on Windows XP that's mentioned above.
559 ConsumeAndRestartLog();
560 }
561 }
562
563 } // namespace omaha
OLDNEW
« no previous file with comments | « base/etw_log_writer.cc ('k') | base/event_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698