OLD | NEW |
| (Empty) |
1 // Copyright 2007-2009 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 | |
17 #include <stdio.h> | |
18 #include <stdarg.h> | |
19 | |
20 #include "base/basictypes.h" | |
21 #include "omaha/base/constants.h" | |
22 #include "omaha/base/error.h" | |
23 #include "omaha/base/reg_key.h" | |
24 #include "omaha/base/vistautil.h" | |
25 #include "omaha/common/event_logger.h" | |
26 #include "omaha/testing/unit_test.h" | |
27 | |
28 namespace omaha { | |
29 | |
30 class EventLoggerTest : public testing::Test { | |
31 protected: | |
32 virtual void SetUp() { | |
33 EXPECT_SUCCEEDED(RegKey::DeleteKey(kRegistryHiveOverrideRoot, true)); | |
34 OverrideRegistryHives(kRegistryHiveOverrideRoot); | |
35 | |
36 // Enable logging of events. | |
37 DWORD log_events = LOG_EVENT_LEVEL_ALL; | |
38 EXPECT_SUCCEEDED(RegKey::SetValue(MACHINE_REG_UPDATE_DEV, | |
39 kRegValueEventLogLevel, log_events)); | |
40 } | |
41 | |
42 virtual void TearDown() { | |
43 RestoreRegistryHives(); | |
44 EXPECT_SUCCEEDED(RegKey::DeleteKey(kRegistryHiveOverrideRoot, true)); | |
45 } | |
46 }; | |
47 | |
48 TEST_F(EventLoggerTest, AddEventSource) { | |
49 if (!vista_util::IsUserAdmin()) { | |
50 std::wcout << _T("\tTest did not run because the user is not an admin.") | |
51 << std::endl; | |
52 return; | |
53 } | |
54 | |
55 // Registers the "Google Update" event source for the "Application" log | |
56 EXPECT_SUCCEEDED(EventLogger::AddEventSource(EventLogger::kSourceName, | |
57 _T("path"))); | |
58 | |
59 const TCHAR key_name[] = _T("HKLM\\SYSTEM\\CurrentControlSet\\Services\\") | |
60 _T("EventLog\\Application\\") | |
61 _T(OMAHA_APP_NAME_ANSI); | |
62 EXPECT_TRUE(RegKey::HasKey(key_name)); | |
63 | |
64 CString s; | |
65 EXPECT_SUCCEEDED(RegKey::GetValue(key_name, _T("EventMessageFile"), &s)); | |
66 EXPECT_STREQ(s.GetString(), _T("path")); | |
67 | |
68 DWORD types(0); | |
69 EXPECT_SUCCEEDED(RegKey::GetValue(key_name, _T("TypesSupported"), &types)); | |
70 EXPECT_EQ(types, | |
71 EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE); | |
72 | |
73 // Removes the "OmahaUnitTest" event source. | |
74 EXPECT_SUCCEEDED(EventLogger::RemoveEventSource(EventLogger::kSourceName)); | |
75 EXPECT_FALSE(RegKey::HasKey(key_name)); | |
76 EXPECT_TRUE(RegKey::HasKey( | |
77 _T("HKLM\\SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application"))); | |
78 } | |
79 | |
80 TEST_F(EventLoggerTest, ReportEvent) { | |
81 if (!vista_util::IsUserAdmin()) { | |
82 std::wcout << _T("\tTest did not run because the user is not an admin.") | |
83 << std::endl; | |
84 return; | |
85 } | |
86 | |
87 EXPECT_SUCCEEDED(EventLogger::AddEventSource(EventLogger::kSourceName, | |
88 _T("path"))); | |
89 | |
90 const TCHAR* strings[] = {_T("foo"), _T("bar")}; | |
91 byte buf[] = {0xaa, 0x55, 0}; | |
92 | |
93 const int kEventId = 100; | |
94 EXPECT_SUCCEEDED(EventLogger::ReportEvent(EventLogger::kSourceName, | |
95 EVENTLOG_WARNING_TYPE, | |
96 0, | |
97 kEventId, | |
98 arraysize(strings), | |
99 strings, | |
100 arraysize(buf), | |
101 buf)); | |
102 // Read the record at the top to do a brief sanity check. | |
103 const size_t kBufferSize = 1024 * 64; | |
104 byte buffer[kBufferSize] = {0}; | |
105 EVENTLOGRECORD* rec = reinterpret_cast<EVENTLOGRECORD*>(buffer); | |
106 rec->Length = kBufferSize; | |
107 EXPECT_SUCCEEDED(EventLogger::ReadLastEvent(EventLogger::kSourceName, rec)); | |
108 EXPECT_EQ(rec->EventID, kEventId); | |
109 EXPECT_EQ(rec->EventType, EVENTLOG_WARNING_TYPE); | |
110 EXPECT_EQ(rec->EventCategory, 0); | |
111 EXPECT_EQ(rec->NumStrings, 2); | |
112 const TCHAR* src = reinterpret_cast<const TCHAR*>( | |
113 reinterpret_cast<byte*>(rec) + sizeof EVENTLOGRECORD); | |
114 EXPECT_STREQ(src, EventLogger::kSourceName); | |
115 const TCHAR* s2 = (LPTSTR) ((LPBYTE) rec + rec->StringOffset); | |
116 EXPECT_SUCCEEDED(EventLogger::RemoveEventSource(EventLogger::kSourceName)); | |
117 } | |
118 | |
119 TEST_F(EventLoggerTest, LogEvent_LoggingDisabled) { | |
120 // Disable logging. | |
121 EXPECT_SUCCEEDED(RegKey::SetValue(MACHINE_REG_UPDATE_DEV, | |
122 kRegValueEventLogLevel, | |
123 static_cast<DWORD>(0))); | |
124 | |
125 const size_t kBufferSize = 1024 * 64; | |
126 byte buffer[kBufferSize] = {0}; | |
127 EVENTLOGRECORD* rec = reinterpret_cast<EVENTLOGRECORD*>(buffer); | |
128 rec->Length = kBufferSize; | |
129 EXPECT_SUCCEEDED(EventLogger::ReadLastEvent(EventLogger::kSourceName, rec)); | |
130 int record_number = rec->RecordNumber; | |
131 | |
132 // Logging is disabled, expect no event is logged. | |
133 LogEvent(EVENTLOG_INFORMATION_TYPE, 10); | |
134 rec->Length = kBufferSize; | |
135 EXPECT_SUCCEEDED(EventLogger::ReadLastEvent(EventLogger::kSourceName, rec)); | |
136 EXPECT_EQ(record_number, rec->RecordNumber); | |
137 } | |
138 | |
139 TEST_F(EventLoggerTest, LogEvent) { | |
140 const size_t kBufferSize = 1024 * 64; | |
141 byte buffer[kBufferSize] = {0}; | |
142 EVENTLOGRECORD* rec = reinterpret_cast<EVENTLOGRECORD*>(buffer); | |
143 | |
144 LogEvent(EVENTLOG_INFORMATION_TYPE, 10); | |
145 rec->Length = kBufferSize; | |
146 EXPECT_SUCCEEDED(EventLogger::ReadLastEvent(EventLogger::kSourceName, rec)); | |
147 EXPECT_EQ(10, rec->EventID); | |
148 | |
149 LogEvent(EVENTLOG_INFORMATION_TYPE, 11, _T("s1")); | |
150 rec->Length = kBufferSize; | |
151 EXPECT_SUCCEEDED(EventLogger::ReadLastEvent(EventLogger::kSourceName, rec)); | |
152 EXPECT_EQ(11, rec->EventID); | |
153 | |
154 LogEvent(EVENTLOG_INFORMATION_TYPE, 12, _T("s1"), _T("s2")); | |
155 rec->Length = kBufferSize; | |
156 EXPECT_SUCCEEDED(EventLogger::ReadLastEvent(EventLogger::kSourceName, rec)); | |
157 EXPECT_EQ(12, rec->EventID); | |
158 } | |
159 | |
160 TEST_F(EventLoggerTest, LogEventContext) { | |
161 const size_t kBufferSize = 1024 * 64; | |
162 byte buffer[kBufferSize] = {0}; | |
163 EVENTLOGRECORD* rec = reinterpret_cast<EVENTLOGRECORD*>(buffer); | |
164 | |
165 LogEventContext(EVENTLOG_INFORMATION_TYPE, 20, _T("foo")); | |
166 rec->Length = kBufferSize; | |
167 EXPECT_SUCCEEDED(EventLogger::ReadLastEvent(EventLogger::kSourceName, rec)); | |
168 EXPECT_EQ(20, rec->EventID); | |
169 | |
170 LogEventContext(EVENTLOG_INFORMATION_TYPE, 21, _T("s1"), _T("bar")); | |
171 rec->Length = kBufferSize; | |
172 EXPECT_SUCCEEDED(EventLogger::ReadLastEvent(EventLogger::kSourceName, rec)); | |
173 EXPECT_EQ(21, rec->EventID); | |
174 | |
175 LogEventContext(EVENTLOG_INFORMATION_TYPE, 22, | |
176 _T("s1"), _T("s2"), _T("foobar")); | |
177 rec->Length = kBufferSize; | |
178 EXPECT_SUCCEEDED(EventLogger::ReadLastEvent(EventLogger::kSourceName, rec)); | |
179 EXPECT_EQ(22, rec->EventID); | |
180 } | |
181 | |
182 } // namespace omaha | |
OLD | NEW |