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

Side by Side Diff: chrome_elf/blacklist/test/blacklist_test.cc

Issue 2861793003: [chrome_elf] blacklist flaky tests (Closed)
Patch Set: No asserts when holding global mutex. Created 3 years, 7 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/environment.h" 9 #include "base/environment.h"
10 #include "base/files/file.h" 10 #include "base/files/file.h"
11 #include "base/files/file_path.h" 11 #include "base/files/file_path.h"
12 #include "base/files/scoped_temp_dir.h" 12 #include "base/files/scoped_temp_dir.h"
13 #include "base/i18n/case_conversion.h" 13 #include "base/i18n/case_conversion.h"
14 #include "base/macros.h" 14 #include "base/macros.h"
15 #include "base/path_service.h" 15 #include "base/path_service.h"
16 #include "base/scoped_native_library.h" 16 #include "base/scoped_native_library.h"
17 #include "base/strings/string16.h" 17 #include "base/strings/string16.h"
18 #include "base/strings/string_number_conversions.h" 18 #include "base/strings/string_number_conversions.h"
19 #include "base/strings/utf_string_conversions.h" 19 #include "base/strings/utf_string_conversions.h"
20 #include "base/test/test_reg_util_win.h" 20 #include "base/test/test_reg_util_win.h"
21 #include "base/test/test_timeouts.h"
21 #include "base/win/registry.h" 22 #include "base/win/registry.h"
22 #include "chrome/common/chrome_version.h" 23 #include "chrome/common/chrome_version.h"
23 #include "chrome/install_static/install_util.h" 24 #include "chrome/install_static/install_util.h"
24 #include "chrome_elf/blacklist/blacklist.h" 25 #include "chrome_elf/blacklist/blacklist.h"
25 #include "chrome_elf/chrome_elf_constants.h" 26 #include "chrome_elf/chrome_elf_constants.h"
26 #include "chrome_elf/nt_registry/nt_registry.h" 27 #include "chrome_elf/nt_registry/nt_registry.h"
27 #include "testing/gtest/include/gtest/gtest.h" 28 #include "testing/gtest/include/gtest/gtest.h"
28 29
29 const wchar_t kTestDllName1[] = L"blacklist_test_dll_1.dll"; 30 const wchar_t kTestDllName1[] = L"blacklist_test_dll_1.dll";
30 const wchar_t kTestDllName2[] = L"blacklist_test_dll_2.dll"; 31 const wchar_t kTestDllName2[] = L"blacklist_test_dll_2.dll";
31 const wchar_t kTestDllName3[] = L"blacklist_test_dll_3.dll"; 32 const wchar_t kTestDllName3[] = L"blacklist_test_dll_3.dll";
32 33
33 const wchar_t kDll2Beacon[] = L"{F70A0100-2889-4629-9B44-610FE5C73231}"; 34 const wchar_t kDll2Beacon[] = L"{F70A0100-2889-4629-9B44-610FE5C73231}";
34 const wchar_t kDll3Beacon[] = L"{9E056AEC-169E-400c-B2D0-5A07E3ACE2EB}"; 35 const wchar_t kDll3Beacon[] = L"{9E056AEC-169E-400c-B2D0-5A07E3ACE2EB}";
35 36
36 extern const wchar_t* kEnvVars[]; 37 extern const wchar_t* kEnvVars[];
37 38
38 namespace { 39 namespace {
39 40
41 // Timeouts for synchronization.
42 #define event_timeout \
robertshield 2017/05/05 13:04:43 nit, mildly prefer: kEventTimeout or EVENT_TIMEOUT
grt (UTC plus 2) 2017/05/05 13:11:47 if this can't be a true constant owing to TestTime
43 static_cast<DWORD>((TestTimeouts::action_timeout()).InMillisecondsRoundedUp())
44
45 const wchar_t* g_blacklist_test_mutex = L"ChromeElfBlacklistTestMutex";
grt (UTC plus 2) 2017/05/05 13:11:47 also from the nit factory: constexpr wchar_t g_bl
46
40 // Functions we need from blacklist_test_main_dll.dll 47 // Functions we need from blacklist_test_main_dll.dll
41 typedef bool (*TestDll_AddDllToBlacklistFunction)(const wchar_t* dll_name); 48 typedef bool (*TestDll_AddDllToBlacklistFunction)(const wchar_t* dll_name);
42 typedef int (*TestDll_BlacklistSizeFunction)(); 49 typedef int (*TestDll_BlacklistSizeFunction)();
43 typedef void (*TestDll_BlockedDllFunction)(size_t blocked_index); 50 typedef void (*TestDll_BlockedDllFunction)(size_t blocked_index);
44 typedef int (*TestDll_GetBlacklistIndexFunction)(const wchar_t* dll_name); 51 typedef int (*TestDll_GetBlacklistIndexFunction)(const wchar_t* dll_name);
45 typedef bool (*TestDll_IsBlacklistInitializedFunction)(); 52 typedef bool (*TestDll_IsBlacklistInitializedFunction)();
46 typedef bool (*TestDll_RemoveDllFromBlacklistFunction)(const wchar_t* dll_name); 53 typedef bool (*TestDll_RemoveDllFromBlacklistFunction)(const wchar_t* dll_name);
47 typedef bool (*TestDll_SuccessfullyBlockedFunction)( 54 typedef bool (*TestDll_SuccessfullyBlockedFunction)(
48 const wchar_t** blocked_dlls, 55 const wchar_t** blocked_dlls,
49 int* size); 56 int* size);
(...skipping 16 matching lines...) Expand all
66 {kTestDllName3, kDll3Beacon} 73 {kTestDllName3, kDll3Beacon}
67 }; 74 };
68 75
69 class BlacklistTest : public testing::Test { 76 class BlacklistTest : public testing::Test {
70 protected: 77 protected:
71 BlacklistTest() : override_manager_(), num_initially_blocked_(0) { 78 BlacklistTest() : override_manager_(), num_initially_blocked_(0) {
72 } 79 }
73 80
74 void CheckBlacklistedDllsNotLoaded() { 81 void CheckBlacklistedDllsNotLoaded() {
75 base::FilePath current_dir; 82 base::FilePath current_dir;
76 ASSERT_TRUE(PathService::Get(base::DIR_EXE, &current_dir)); 83 EXPECT_TRUE(PathService::Get(base::DIR_EXE, &current_dir));
77 84
78 for (size_t i = 0; i < arraysize(test_data); ++i) { 85 for (size_t i = 0; i < arraysize(test_data); ++i) {
79 // Ensure that the dll has not been loaded both by inspecting the handle 86 // Ensure that the dll has not been loaded both by inspecting the handle
80 // returned by LoadLibrary and by looking for an environment variable that 87 // returned by LoadLibrary and by looking for an environment variable that
81 // is set when the DLL's entry point is called. 88 // is set when the DLL's entry point is called.
82 base::ScopedNativeLibrary dll_blacklisted( 89 base::ScopedNativeLibrary dll_blacklisted(
83 current_dir.Append(test_data[i].dll_name)); 90 current_dir.Append(test_data[i].dll_name));
84 EXPECT_FALSE(dll_blacklisted.is_valid()); 91 EXPECT_FALSE(dll_blacklisted.is_valid());
85 EXPECT_EQ(0u, ::GetEnvironmentVariable(test_data[i].dll_beacon, NULL, 0)); 92 EXPECT_EQ(0u, ::GetEnvironmentVariable(test_data[i].dll_beacon, NULL, 0));
86 dll_blacklisted.Reset(NULL); 93 dll_blacklisted.Reset(NULL);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 // The number of dlls initially blocked by the blacklist. 136 // The number of dlls initially blocked by the blacklist.
130 int num_initially_blocked_; 137 int num_initially_blocked_;
131 138
132 private: 139 private:
133 // This function puts registry-key redirection paths into 140 // This function puts registry-key redirection paths into
134 // process-specific environment variables, for our test DLLs to access. 141 // process-specific environment variables, for our test DLLs to access.
135 // This will only work as long as the IPC is within the same process. 142 // This will only work as long as the IPC is within the same process.
136 void IpcOverrides() { 143 void IpcOverrides() {
137 base::string16 temp = nt::GetTestingOverride(nt::HKCU); 144 base::string16 temp = nt::GetTestingOverride(nt::HKCU);
138 if (!temp.empty()) 145 if (!temp.empty())
139 ASSERT_TRUE(::SetEnvironmentVariableW(L"hkcu_override", temp.c_str())); 146 EXPECT_TRUE(::SetEnvironmentVariableW(L"hkcu_override", temp.c_str()));
140 temp = nt::GetTestingOverride(nt::HKLM); 147 temp = nt::GetTestingOverride(nt::HKLM);
141 if (!temp.empty()) 148 if (!temp.empty())
142 ASSERT_TRUE(::SetEnvironmentVariableW(L"hklm_override", temp.c_str())); 149 EXPECT_TRUE(::SetEnvironmentVariableW(L"hklm_override", temp.c_str()));
143 } 150 }
144 151
145 void SetUp() override { 152 void SetUp() override {
146 base::string16 temp; 153 base::string16 temp;
147 ASSERT_NO_FATAL_FAILURE( 154 EXPECT_NO_FATAL_FAILURE(
148 override_manager_.OverrideRegistry(HKEY_CURRENT_USER, &temp)); 155 override_manager_.OverrideRegistry(HKEY_CURRENT_USER, &temp));
149 ASSERT_TRUE(nt::SetTestingOverride(nt::HKCU, temp)); 156 EXPECT_TRUE(nt::SetTestingOverride(nt::HKCU, temp));
150 157
151 // Make the override path available to our test DLL. 158 // Make the override path available to our test DLL.
152 IpcOverrides(); 159 IpcOverrides();
153 160
154 // Load the main test Dll now. 161 // Load the main test Dll now.
155 // Note: this has to happen after we set up the registry overrides. 162 // Note: this has to happen after we set up the registry overrides.
156 HMODULE dll = nullptr; 163 HMODULE dll = nullptr;
157 dll = ::LoadLibraryW(L"blacklist_test_main_dll.dll"); 164 dll = ::LoadLibraryW(L"blacklist_test_main_dll.dll");
158 if (!dll) 165 if (!dll)
159 return; 166 return;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 206
200 // Find out how many dlls were blocked before the test starts. 207 // Find out how many dlls were blocked before the test starts.
201 TestDll_SuccessfullyBlocked(NULL, &num_initially_blocked_); 208 TestDll_SuccessfullyBlocked(NULL, &num_initially_blocked_);
202 } 209 }
203 210
204 void TearDown() override { 211 void TearDown() override {
205 TestDll_RemoveDllFromBlacklist(kTestDllName1); 212 TestDll_RemoveDllFromBlacklist(kTestDllName1);
206 TestDll_RemoveDllFromBlacklist(kTestDllName2); 213 TestDll_RemoveDllFromBlacklist(kTestDllName2);
207 TestDll_RemoveDllFromBlacklist(kTestDllName3); 214 TestDll_RemoveDllFromBlacklist(kTestDllName3);
208 215
209 ASSERT_TRUE(nt::SetTestingOverride(nt::HKCU, base::string16())); 216 EXPECT_TRUE(nt::SetTestingOverride(nt::HKCU, base::string16()));
210 } 217 }
211 }; 218 };
212 219
213 TEST_F(BlacklistTest, Beacon) { 220 TEST_F(BlacklistTest, Beacon) {
221 HANDLE mutex = ::CreateMutexW(NULL, FALSE, g_blacklist_test_mutex);
222 EXPECT_TRUE(mutex != NULL);
223 DWORD timeout = ::IsDebuggerPresent() ? INFINITE : event_timeout;
224 EXPECT_EQ(WAIT_OBJECT_0, ::WaitForSingleObject(mutex, timeout));
225
214 // Ensure that the beacon state starts off 'running' for this version. 226 // Ensure that the beacon state starts off 'running' for this version.
215 LONG result = blacklist_registry_key_->WriteValue( 227 LONG result = blacklist_registry_key_->WriteValue(
216 blacklist::kBeaconState, blacklist::BLACKLIST_SETUP_RUNNING); 228 blacklist::kBeaconState, blacklist::BLACKLIST_SETUP_RUNNING);
217 EXPECT_EQ(ERROR_SUCCESS, result); 229 EXPECT_EQ(ERROR_SUCCESS, result);
218 230
219 result = blacklist_registry_key_->WriteValue(blacklist::kBeaconVersion, 231 result = blacklist_registry_key_->WriteValue(blacklist::kBeaconVersion,
220 TEXT(CHROME_VERSION_STRING)); 232 TEXT(CHROME_VERSION_STRING));
221 EXPECT_EQ(ERROR_SUCCESS, result); 233 EXPECT_EQ(ERROR_SUCCESS, result);
222 234
223 // First call should find the beacon and reset it. 235 // First call should find the beacon and reset it.
224 EXPECT_TRUE(blacklist::ResetBeacon()); 236 EXPECT_TRUE(blacklist::ResetBeacon());
225 237
226 // First call should succeed as the beacon is enabled. 238 // First call should succeed as the beacon is enabled.
227 EXPECT_TRUE(blacklist::LeaveSetupBeacon()); 239 EXPECT_TRUE(blacklist::LeaveSetupBeacon());
240
241 EXPECT_TRUE(::ReleaseMutex(mutex));
242 EXPECT_TRUE(::CloseHandle(mutex));
228 } 243 }
229 244
230 TEST_F(BlacklistTest, AddAndRemoveModules) { 245 TEST_F(BlacklistTest, AddAndRemoveModules) {
246 HANDLE mutex = ::CreateMutexW(NULL, FALSE, g_blacklist_test_mutex);
247 EXPECT_TRUE(mutex != NULL);
248 DWORD timeout = ::IsDebuggerPresent() ? INFINITE : event_timeout;
249 EXPECT_EQ(WAIT_OBJECT_0, ::WaitForSingleObject(mutex, timeout));
250
231 EXPECT_TRUE(TestDll_AddDllToBlacklist(L"foo.dll")); 251 EXPECT_TRUE(TestDll_AddDllToBlacklist(L"foo.dll"));
232 // Adding the same item twice should be idempotent. 252 // Adding the same item twice should be idempotent.
233 EXPECT_TRUE(TestDll_AddDllToBlacklist(L"foo.dll")); 253 EXPECT_TRUE(TestDll_AddDllToBlacklist(L"foo.dll"));
234 EXPECT_TRUE(TestDll_RemoveDllFromBlacklist(L"foo.dll")); 254 EXPECT_TRUE(TestDll_RemoveDllFromBlacklist(L"foo.dll"));
235 EXPECT_FALSE(TestDll_RemoveDllFromBlacklist(L"foo.dll")); 255 EXPECT_FALSE(TestDll_RemoveDllFromBlacklist(L"foo.dll"));
236 256
237 // Increase the blacklist size by 1 to include the NULL pointer 257 // Increase the blacklist size by 1 to include the NULL pointer
238 // that marks the end. 258 // that marks the end.
239 int empty_spaces = 259 int empty_spaces =
240 blacklist::kTroublesomeDllsMaxCount - (TestDll_BlacklistSize() + 1); 260 blacklist::kTroublesomeDllsMaxCount - (TestDll_BlacklistSize() + 1);
241 std::vector<base::string16> added_dlls; 261 std::vector<base::string16> added_dlls;
242 added_dlls.reserve(empty_spaces); 262 added_dlls.reserve(empty_spaces);
243 for (int i = 0; i < empty_spaces; ++i) { 263 for (int i = 0; i < empty_spaces; ++i) {
244 added_dlls.push_back(base::IntToString16(i) + L".dll"); 264 added_dlls.push_back(base::IntToString16(i) + L".dll");
245 EXPECT_TRUE(TestDll_AddDllToBlacklist(added_dlls[i].c_str())) << i; 265 EXPECT_TRUE(TestDll_AddDllToBlacklist(added_dlls[i].c_str())) << i;
246 } 266 }
247 EXPECT_FALSE(TestDll_AddDllToBlacklist(L"overflow.dll")); 267 EXPECT_FALSE(TestDll_AddDllToBlacklist(L"overflow.dll"));
248 for (int i = 0; i < empty_spaces; ++i) { 268 for (int i = 0; i < empty_spaces; ++i) {
249 EXPECT_TRUE(TestDll_RemoveDllFromBlacklist(added_dlls[i].c_str())) << i; 269 EXPECT_TRUE(TestDll_RemoveDllFromBlacklist(added_dlls[i].c_str())) << i;
250 } 270 }
251 EXPECT_FALSE(TestDll_RemoveDllFromBlacklist(added_dlls[0].c_str())); 271 EXPECT_FALSE(TestDll_RemoveDllFromBlacklist(added_dlls[0].c_str()));
252 EXPECT_FALSE( 272 EXPECT_FALSE(
253 TestDll_RemoveDllFromBlacklist(added_dlls[empty_spaces - 1].c_str())); 273 TestDll_RemoveDllFromBlacklist(added_dlls[empty_spaces - 1].c_str()));
274
275 EXPECT_TRUE(::ReleaseMutex(mutex));
276 EXPECT_TRUE(::CloseHandle(mutex));
254 } 277 }
255 278
256 TEST_F(BlacklistTest, SuccessfullyBlocked) { 279 TEST_F(BlacklistTest, SuccessfullyBlocked) {
280 HANDLE mutex = ::CreateMutexW(NULL, FALSE, g_blacklist_test_mutex);
281 EXPECT_TRUE(mutex != NULL);
282 DWORD timeout = ::IsDebuggerPresent() ? INFINITE : event_timeout;
283 EXPECT_EQ(WAIT_OBJECT_0, ::WaitForSingleObject(mutex, timeout));
284
257 // Add 5 news dlls to blacklist. 285 // Add 5 news dlls to blacklist.
258 const int kDesiredBlacklistSize = 1; 286 const int kDesiredBlacklistSize = 1;
259 std::vector<base::string16> dlls_to_block; 287 std::vector<base::string16> dlls_to_block;
260 for (int i = 0; i < kDesiredBlacklistSize; ++i) { 288 for (int i = 0; i < kDesiredBlacklistSize; ++i) {
261 dlls_to_block.push_back(base::IntToString16(i) + L".dll"); 289 dlls_to_block.push_back(base::IntToString16(i) + L".dll");
262 ASSERT_TRUE(TestDll_AddDllToBlacklist(dlls_to_block[i].c_str())); 290 EXPECT_TRUE(TestDll_AddDllToBlacklist(dlls_to_block[i].c_str()));
263 } 291 }
264 292
265 // Block the dlls, one at a time, and ensure SuccesfullyBlocked correctly 293 // Block the dlls, one at a time, and ensure SuccesfullyBlocked correctly
266 // passes the list of blocked dlls. 294 // passes the list of blocked dlls.
267 for (int i = 0; i < kDesiredBlacklistSize; ++i) { 295 for (int i = 0; i < kDesiredBlacklistSize; ++i) {
268 TestDll_BlockedDll(TestDll_GetBlacklistIndex(dlls_to_block[i].c_str())); 296 TestDll_BlockedDll(TestDll_GetBlacklistIndex(dlls_to_block[i].c_str()));
269 297
270 int size = 0; 298 int size = 0;
271 TestDll_SuccessfullyBlocked(NULL, &size); 299 TestDll_SuccessfullyBlocked(NULL, &size);
272 ASSERT_EQ(num_initially_blocked_ + i + 1, size); 300 EXPECT_EQ(num_initially_blocked_ + i + 1, size);
273 301
274 std::vector<const wchar_t*> blocked_dlls(size); 302 std::vector<const wchar_t*> blocked_dlls(size);
275 TestDll_SuccessfullyBlocked(&(blocked_dlls[0]), &size); 303 TestDll_SuccessfullyBlocked(&(blocked_dlls[0]), &size);
276 ASSERT_EQ(num_initially_blocked_ + i + 1, size); 304 EXPECT_EQ(num_initially_blocked_ + i + 1, size);
277 305
278 for (int j = 0; j <= i; ++j) { 306 for (int j = 0; j <= i; ++j) {
279 EXPECT_STREQ(blocked_dlls[num_initially_blocked_ + j], 307 EXPECT_STREQ(blocked_dlls[num_initially_blocked_ + j],
280 dlls_to_block[j].c_str()); 308 dlls_to_block[j].c_str());
281 } 309 }
282 } 310 }
283 311
284 // Remove the dlls from the blacklist now that we are done. 312 // Remove the dlls from the blacklist now that we are done.
285 for (const auto& dll : dlls_to_block) { 313 for (const auto& dll : dlls_to_block) {
286 EXPECT_TRUE(TestDll_RemoveDllFromBlacklist(dll.c_str())); 314 EXPECT_TRUE(TestDll_RemoveDllFromBlacklist(dll.c_str()));
287 } 315 }
316
317 EXPECT_TRUE(::ReleaseMutex(mutex));
318 EXPECT_TRUE(::CloseHandle(mutex));
288 } 319 }
289 320
290 // Disabled due to flakiness. https://crbug.com/711651. 321 TEST_F(BlacklistTest, LoadBlacklistedLibrary) {
291 TEST_F(BlacklistTest, DISABLED_LoadBlacklistedLibrary) { 322 HANDLE mutex = ::CreateMutexW(NULL, FALSE, g_blacklist_test_mutex);
323 EXPECT_TRUE(mutex != NULL);
324 DWORD timeout = ::IsDebuggerPresent() ? INFINITE : event_timeout;
325 EXPECT_EQ(WAIT_OBJECT_0, ::WaitForSingleObject(mutex, timeout));
326
292 base::FilePath current_dir; 327 base::FilePath current_dir;
293 ASSERT_TRUE(PathService::Get(base::DIR_EXE, &current_dir)); 328 EXPECT_TRUE(PathService::Get(base::DIR_EXE, &current_dir));
294 329
295 // Ensure that the blacklist is loaded. 330 // Ensure that the blacklist is loaded.
296 ASSERT_TRUE(TestDll_IsBlacklistInitialized()); 331 EXPECT_TRUE(TestDll_IsBlacklistInitialized());
297 332
298 // Test that an un-blacklisted DLL can load correctly. 333 // Test that an un-blacklisted DLL can load correctly.
299 base::ScopedNativeLibrary dll1(current_dir.Append(kTestDllName1)); 334 base::ScopedNativeLibrary dll1(current_dir.Append(kTestDllName1));
300 EXPECT_TRUE(dll1.is_valid()); 335 EXPECT_TRUE(dll1.is_valid());
301 dll1.Reset(NULL); 336 dll1.Reset(NULL);
302 337
303 int num_blocked_dlls = 0; 338 int num_blocked_dlls = 0;
304 TestDll_SuccessfullyBlocked(NULL, &num_blocked_dlls); 339 TestDll_SuccessfullyBlocked(NULL, &num_blocked_dlls);
305 EXPECT_EQ(num_initially_blocked_, num_blocked_dlls); 340 EXPECT_EQ(num_initially_blocked_, num_blocked_dlls);
306 341
307 // Add all DLLs to the blacklist then check they are blocked. 342 // Add all DLLs to the blacklist then check they are blocked.
308 for (size_t i = 0; i < arraysize(test_data); ++i) { 343 for (size_t i = 0; i < arraysize(test_data); ++i) {
309 EXPECT_TRUE(TestDll_AddDllToBlacklist(test_data[i].dll_name)); 344 EXPECT_TRUE(TestDll_AddDllToBlacklist(test_data[i].dll_name));
310 } 345 }
311 CheckBlacklistedDllsNotLoaded(); 346 CheckBlacklistedDllsNotLoaded();
347
348 EXPECT_TRUE(::ReleaseMutex(mutex));
349 EXPECT_TRUE(::CloseHandle(mutex));
312 } 350 }
313 351
314 void TestResetBeacon(std::unique_ptr<base::win::RegKey>& key, 352 void TestResetBeacon(std::unique_ptr<base::win::RegKey>& key,
315 DWORD input_state, 353 DWORD input_state,
316 DWORD expected_output_state) { 354 DWORD expected_output_state) {
317 LONG result = key->WriteValue(blacklist::kBeaconState, input_state); 355 LONG result = key->WriteValue(blacklist::kBeaconState, input_state);
318 EXPECT_EQ(ERROR_SUCCESS, result); 356 EXPECT_EQ(ERROR_SUCCESS, result);
319 357
320 EXPECT_TRUE(blacklist::ResetBeacon()); 358 EXPECT_TRUE(blacklist::ResetBeacon());
321 DWORD blacklist_state = blacklist::BLACKLIST_STATE_MAX; 359 DWORD blacklist_state = blacklist::BLACKLIST_STATE_MAX;
322 result = key->ReadValueDW(blacklist::kBeaconState, &blacklist_state); 360 result = key->ReadValueDW(blacklist::kBeaconState, &blacklist_state);
323 EXPECT_EQ(ERROR_SUCCESS, result); 361 EXPECT_EQ(ERROR_SUCCESS, result);
324 EXPECT_EQ(expected_output_state, blacklist_state); 362 EXPECT_EQ(expected_output_state, blacklist_state);
325 } 363 }
326 364
327 TEST_F(BlacklistTest, ResetBeacon) { 365 TEST_F(BlacklistTest, ResetBeacon) {
366 HANDLE mutex = ::CreateMutexW(NULL, FALSE, g_blacklist_test_mutex);
367 EXPECT_TRUE(mutex != NULL);
368 DWORD timeout = ::IsDebuggerPresent() ? INFINITE : event_timeout;
369 EXPECT_EQ(WAIT_OBJECT_0, ::WaitForSingleObject(mutex, timeout));
370
328 // Ensure that ResetBeacon resets properly on successful runs and not on 371 // Ensure that ResetBeacon resets properly on successful runs and not on
329 // failed or disabled runs. 372 // failed or disabled runs.
330 TestResetBeacon(blacklist_registry_key_, 373 TestResetBeacon(blacklist_registry_key_,
331 blacklist::BLACKLIST_SETUP_RUNNING, 374 blacklist::BLACKLIST_SETUP_RUNNING,
332 blacklist::BLACKLIST_ENABLED); 375 blacklist::BLACKLIST_ENABLED);
333 376
334 TestResetBeacon(blacklist_registry_key_, 377 TestResetBeacon(blacklist_registry_key_,
335 blacklist::BLACKLIST_SETUP_FAILED, 378 blacklist::BLACKLIST_SETUP_FAILED,
336 blacklist::BLACKLIST_SETUP_FAILED); 379 blacklist::BLACKLIST_SETUP_FAILED);
337 380
338 TestResetBeacon(blacklist_registry_key_, 381 TestResetBeacon(blacklist_registry_key_,
339 blacklist::BLACKLIST_DISABLED, 382 blacklist::BLACKLIST_DISABLED,
340 blacklist::BLACKLIST_DISABLED); 383 blacklist::BLACKLIST_DISABLED);
384
385 EXPECT_TRUE(::ReleaseMutex(mutex));
386 EXPECT_TRUE(::CloseHandle(mutex));
341 } 387 }
342 388
343 TEST_F(BlacklistTest, SetupFailed) { 389 TEST_F(BlacklistTest, SetupFailed) {
390 HANDLE mutex = ::CreateMutexW(NULL, FALSE, g_blacklist_test_mutex);
391 EXPECT_TRUE(mutex != NULL);
392 DWORD timeout = ::IsDebuggerPresent() ? INFINITE : event_timeout;
393 EXPECT_EQ(WAIT_OBJECT_0, ::WaitForSingleObject(mutex, timeout));
394
344 // Ensure that when the number of failed tries reaches the maximum allowed, 395 // Ensure that when the number of failed tries reaches the maximum allowed,
345 // the blacklist state is set to failed. 396 // the blacklist state is set to failed.
346 LONG result = blacklist_registry_key_->WriteValue( 397 LONG result = blacklist_registry_key_->WriteValue(
347 blacklist::kBeaconState, blacklist::BLACKLIST_SETUP_RUNNING); 398 blacklist::kBeaconState, blacklist::BLACKLIST_SETUP_RUNNING);
348 EXPECT_EQ(ERROR_SUCCESS, result); 399 EXPECT_EQ(ERROR_SUCCESS, result);
349 400
350 // Set the attempt count so that on the next failure the blacklist is 401 // Set the attempt count so that on the next failure the blacklist is
351 // disabled. 402 // disabled.
352 result = blacklist_registry_key_->WriteValue( 403 result = blacklist_registry_key_->WriteValue(
353 blacklist::kBeaconAttemptCount, blacklist::kBeaconMaxAttempts - 1); 404 blacklist::kBeaconAttemptCount, blacklist::kBeaconMaxAttempts - 1);
354 EXPECT_EQ(ERROR_SUCCESS, result); 405 EXPECT_EQ(ERROR_SUCCESS, result);
355 406
356 EXPECT_FALSE(blacklist::LeaveSetupBeacon()); 407 EXPECT_FALSE(blacklist::LeaveSetupBeacon());
357 408
358 DWORD attempt_count = 0; 409 DWORD attempt_count = 0;
359 blacklist_registry_key_->ReadValueDW(blacklist::kBeaconAttemptCount, 410 blacklist_registry_key_->ReadValueDW(blacklist::kBeaconAttemptCount,
360 &attempt_count); 411 &attempt_count);
361 EXPECT_EQ(attempt_count, blacklist::kBeaconMaxAttempts); 412 EXPECT_EQ(attempt_count, blacklist::kBeaconMaxAttempts);
362 413
363 DWORD blacklist_state = blacklist::BLACKLIST_STATE_MAX; 414 DWORD blacklist_state = blacklist::BLACKLIST_STATE_MAX;
364 result = blacklist_registry_key_->ReadValueDW(blacklist::kBeaconState, 415 result = blacklist_registry_key_->ReadValueDW(blacklist::kBeaconState,
365 &blacklist_state); 416 &blacklist_state);
366 EXPECT_EQ(ERROR_SUCCESS, result); 417 EXPECT_EQ(ERROR_SUCCESS, result);
367 EXPECT_EQ(blacklist_state, blacklist::BLACKLIST_SETUP_FAILED); 418 EXPECT_EQ(blacklist_state, blacklist::BLACKLIST_SETUP_FAILED);
419
420 EXPECT_TRUE(::ReleaseMutex(mutex));
421 EXPECT_TRUE(::CloseHandle(mutex));
368 } 422 }
369 423
370 TEST_F(BlacklistTest, SetupSucceeded) { 424 TEST_F(BlacklistTest, SetupSucceeded) {
425 HANDLE mutex = ::CreateMutexW(NULL, FALSE, g_blacklist_test_mutex);
426 EXPECT_TRUE(mutex != NULL);
427 DWORD timeout = ::IsDebuggerPresent() ? INFINITE : event_timeout;
428 EXPECT_EQ(WAIT_OBJECT_0, ::WaitForSingleObject(mutex, timeout));
429
371 // Starting with the enabled beacon should result in the setup running state 430 // Starting with the enabled beacon should result in the setup running state
372 // and the attempt counter reset to zero. 431 // and the attempt counter reset to zero.
373 LONG result = blacklist_registry_key_->WriteValue( 432 LONG result = blacklist_registry_key_->WriteValue(
374 blacklist::kBeaconState, blacklist::BLACKLIST_ENABLED); 433 blacklist::kBeaconState, blacklist::BLACKLIST_ENABLED);
375 EXPECT_EQ(ERROR_SUCCESS, result); 434 EXPECT_EQ(ERROR_SUCCESS, result);
376 result = blacklist_registry_key_->WriteValue(blacklist::kBeaconAttemptCount, 435 result = blacklist_registry_key_->WriteValue(blacklist::kBeaconAttemptCount,
377 blacklist::kBeaconMaxAttempts); 436 blacklist::kBeaconMaxAttempts);
378 EXPECT_EQ(ERROR_SUCCESS, result); 437 EXPECT_EQ(ERROR_SUCCESS, result);
379 438
380 EXPECT_TRUE(blacklist::LeaveSetupBeacon()); 439 EXPECT_TRUE(blacklist::LeaveSetupBeacon());
381 440
382 DWORD blacklist_state = blacklist::BLACKLIST_STATE_MAX; 441 DWORD blacklist_state = blacklist::BLACKLIST_STATE_MAX;
383 blacklist_registry_key_->ReadValueDW(blacklist::kBeaconState, 442 blacklist_registry_key_->ReadValueDW(blacklist::kBeaconState,
384 &blacklist_state); 443 &blacklist_state);
385 EXPECT_EQ(blacklist_state, blacklist::BLACKLIST_SETUP_RUNNING); 444 EXPECT_EQ(blacklist_state, blacklist::BLACKLIST_SETUP_RUNNING);
386 445
387 DWORD attempt_count = blacklist::kBeaconMaxAttempts; 446 DWORD attempt_count = blacklist::kBeaconMaxAttempts;
388 blacklist_registry_key_->ReadValueDW(blacklist::kBeaconAttemptCount, 447 blacklist_registry_key_->ReadValueDW(blacklist::kBeaconAttemptCount,
389 &attempt_count); 448 &attempt_count);
390 EXPECT_EQ(static_cast<DWORD>(0), attempt_count); 449 EXPECT_EQ(static_cast<DWORD>(0), attempt_count);
450
451 EXPECT_TRUE(::ReleaseMutex(mutex));
452 EXPECT_TRUE(::CloseHandle(mutex));
391 } 453 }
392 454
393 } // namespace 455 } // namespace
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698