1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome_frame/registry_watcher.h"
6
7#include "base/synchronization/waitable_event.h"
8#include "base/time/time.h"
9#include "base/win/registry.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12using base::win::RegKey;
13
14const wchar_t kTestRoot[] = L"CFRegistryWatcherTest";
15const wchar_t kTestWindowClass[] = L"TestWndClass";
16const wchar_t kTestWindowName[] = L"TestWndName";
17
18// Give notifications 30 seconds to stick. Hopefully long enough to avoid
19// flakiness.
20const int64 kWaitSeconds = 30;
21
22class RegistryWatcherUnittest : public testing::Test {
23 public:
24  void SetUp() {
25    // Create a temporary key for testing
26    temp_key_.Open(HKEY_CURRENT_USER, L"", KEY_QUERY_VALUE);
27    temp_key_.DeleteKey(kTestRoot);
28    ASSERT_NE(ERROR_SUCCESS, temp_key_.Open(HKEY_CURRENT_USER,
29                                            kTestRoot,
30                                            KEY_READ));
31    ASSERT_EQ(ERROR_SUCCESS,
32        temp_key_.Create(HKEY_CURRENT_USER, kTestRoot, KEY_READ));
33
34    reg_change_count_ = 0;
35  }
36
37  void TearDown() {
38    // Clean up the temporary key
39    temp_key_.Open(HKEY_CURRENT_USER, L"", KEY_QUERY_VALUE);
40    ASSERT_EQ(ERROR_SUCCESS, temp_key_.DeleteKey(kTestRoot));
41    temp_key_.Close();
42
43    reg_change_count_ = 0;
44  }
45
46  static void WaitCallback() {
47    reg_change_count_++;
48    event_.Signal();
49  }
50
51 protected:
52  RegKey temp_key_;
53  static unsigned int reg_change_count_;
54  static base::WaitableEvent event_;
55};
56
57unsigned int RegistryWatcherUnittest::reg_change_count_ = 0;
58base::WaitableEvent RegistryWatcherUnittest::event_(
59    false,   // auto reset
60    false);  // initially unsignalled
61
62TEST_F(RegistryWatcherUnittest, Basic) {
63  RegistryWatcher watcher(HKEY_CURRENT_USER,
64                          kTestRoot,
65                          &RegistryWatcherUnittest::WaitCallback);
66  ASSERT_TRUE(watcher.StartWatching());
67  EXPECT_EQ(0, reg_change_count_);
68
69  EXPECT_EQ(ERROR_SUCCESS, temp_key_.CreateKey(L"foo", KEY_ALL_ACCESS));
70  EXPECT_TRUE(event_.TimedWait(base::TimeDelta::FromSeconds(kWaitSeconds)));
71  EXPECT_EQ(1, reg_change_count_);
72}
73