// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome_frame/registry_watcher.h"
#include "base/synchronization/waitable_event.h"
#include "base/time/time.h"
#include "base/win/registry.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::win::RegKey;
const wchar_t kTestRoot[] = L"CFRegistryWatcherTest";
const wchar_t kTestWindowClass[] = L"TestWndClass";
const wchar_t kTestWindowName[] = L"TestWndName";
// Give notifications 30 seconds to stick. Hopefully long enough to avoid
// flakiness.
const int64 kWaitSeconds = 30;
class RegistryWatcherUnittest : public testing::Test {
public:
void SetUp() {
// Create a temporary key for testing
temp_key_.Open(HKEY_CURRENT_USER, L"", KEY_QUERY_VALUE);
temp_key_.DeleteKey(kTestRoot);
ASSERT_NE(ERROR_SUCCESS, temp_key_.Open(HKEY_CURRENT_USER,
kTestRoot,
KEY_READ));
ASSERT_EQ(ERROR_SUCCESS,
temp_key_.Create(HKEY_CURRENT_USER, kTestRoot, KEY_READ));
reg_change_count_ = 0;
}
void TearDown() {
// Clean up the temporary key
temp_key_.Open(HKEY_CURRENT_USER, L"", KEY_QUERY_VALUE);
ASSERT_EQ(ERROR_SUCCESS, temp_key_.DeleteKey(kTestRoot));
temp_key_.Close();
reg_change_count_ = 0;
}
static void WaitCallback() {
reg_change_count_++;
event_.Signal();
}
protected:
RegKey temp_key_;
static unsigned int reg_change_count_;
static base::WaitableEvent event_;
};
unsigned int RegistryWatcherUnittest::reg_change_count_ = 0;
base::WaitableEvent RegistryWatcherUnittest::event_(
false, // auto reset
false); // initially unsignalled
TEST_F(RegistryWatcherUnittest, Basic) {
RegistryWatcher watcher(HKEY_CURRENT_USER,
kTestRoot,
&RegistryWatcherUnittest::WaitCallback);
ASSERT_TRUE(watcher.StartWatching());
EXPECT_EQ(0, reg_change_count_);
EXPECT_EQ(ERROR_SUCCESS, temp_key_.CreateKey(L"foo", KEY_ALL_ACCESS));
EXPECT_TRUE(event_.TimedWait(base::TimeDelta::FromSeconds(kWaitSeconds)));
EXPECT_EQ(1, reg_change_count_);
}