diff options
author | alexeypa@chromium.org <alexeypa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-16 07:12:28 +0000 |
---|---|---|
committer | alexeypa@chromium.org <alexeypa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-16 07:12:28 +0000 |
commit | 49ef07f5658e38826922ce7f6a8a120852819ba3 (patch) | |
tree | c83985d60142e4769e5f6be16edb89e578d9d735 /remoting/host/config_file_watcher_unittest.cc | |
parent | 5a3b35906e0e6ce0c64e180267fe4c090511e59e (diff) | |
download | chromium_src-49ef07f5658e38826922ce7f6a8a120852819ba3.zip chromium_src-49ef07f5658e38826922ce7f6a8a120852819ba3.tar.gz chromium_src-49ef07f5658e38826922ce7f6a8a120852819ba3.tar.bz2 |
Added retry logic to ConfigFileWatcher to handle sharing violation errors on Windows.
Review URL: https://chromiumcodereview.appspot.com/12288014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@182948 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting/host/config_file_watcher_unittest.cc')
-rw-r--r-- | remoting/host/config_file_watcher_unittest.cc | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/remoting/host/config_file_watcher_unittest.cc b/remoting/host/config_file_watcher_unittest.cc new file mode 100644 index 0000000..507190c --- /dev/null +++ b/remoting/host/config_file_watcher_unittest.cc @@ -0,0 +1,138 @@ +// Copyright (c) 2013 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 "remoting/host/config_file_watcher.h" + +#include "base/file_path.h" +#include "base/file_util.h" +#include "base/message_loop.h" +#include "base/run_loop.h" +#include "remoting/base/auto_thread.h" +#include "remoting/base/auto_thread_task_runner.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gmock_mutant.h" +#include "testing/gtest/include/gtest/gtest.h" + +using testing::_; +using testing::AnyNumber; +using testing::Return; + +namespace remoting { + +namespace { + +class ConfigFileWatcherDelegate : public ConfigFileWatcher::Delegate { + public: + ConfigFileWatcherDelegate() {} + virtual ~ConfigFileWatcherDelegate() {} + + MOCK_METHOD1(OnConfigUpdated, void(const std::string&)); + MOCK_METHOD0(OnConfigWatcherError, void()); + + private: + DISALLOW_COPY_AND_ASSIGN(ConfigFileWatcherDelegate); +}; + +} // namespace + +class ConfigFileWatcherTest : public testing::Test { + public: + ConfigFileWatcherTest(); + virtual ~ConfigFileWatcherTest(); + + // testing::Test overrides + virtual void SetUp() OVERRIDE; + virtual void TearDown() OVERRIDE; + + // Stops the config file watcher. + void StopWatcher(); + + protected: + MessageLoop message_loop_; + base::RunLoop run_loop_; + + ConfigFileWatcherDelegate delegate_; + + // Path to the configuration file used. + base::FilePath config_file_; + + // The configuration file watcher that is being tested. + scoped_ptr<ConfigFileWatcher> watcher_; +}; + + +ConfigFileWatcherTest::ConfigFileWatcherTest() + : message_loop_(MessageLoop::TYPE_UI) { +} + +ConfigFileWatcherTest::~ConfigFileWatcherTest() { +} + +void ConfigFileWatcherTest::StopWatcher() { + watcher_.reset(); +} + +void ConfigFileWatcherTest::SetUp() { + // Arrange to run |message_loop_| until no components depend on it. + scoped_refptr<AutoThreadTaskRunner> task_runner = new AutoThreadTaskRunner( + message_loop_.message_loop_proxy(), run_loop_.QuitClosure()); + + scoped_refptr<AutoThreadTaskRunner> io_task_runner = + AutoThread::CreateWithType("IPC thread", task_runner, + MessageLoop::TYPE_IO); + + // Create an instance of the config watcher. + watcher_.reset( + new ConfigFileWatcher(task_runner, io_task_runner, &delegate_)); +} + +void ConfigFileWatcherTest::TearDown() { + // Delete the test file. + if (!config_file_.empty()) + file_util::Delete(config_file_, false); +} + +// Verifies that the initial notification is delivered. +TEST_F(ConfigFileWatcherTest, Basic) { + EXPECT_TRUE(file_util::CreateTemporaryFile(&config_file_)); + + std::string data("test"); + EXPECT_NE(file_util::WriteFile(config_file_, data.c_str(), + static_cast<int>(data.size())), -1); + + EXPECT_CALL(delegate_, OnConfigUpdated(_)) + .Times(1) + .WillOnce(InvokeWithoutArgs(this, &ConfigFileWatcherTest::StopWatcher)); + EXPECT_CALL(delegate_, OnConfigWatcherError()) + .Times(0); + + watcher_->Watch(config_file_); + run_loop_.Run(); +} + +MATCHER_P(EqualsString, s, "") { + return arg == s; +} + +// Verifies that an update notification is sent when the file is changed. +TEST_F(ConfigFileWatcherTest, Update) { + EXPECT_TRUE(file_util::CreateTemporaryFile(&config_file_)); + + EXPECT_CALL(delegate_, OnConfigUpdated(EqualsString("test"))) + .Times(1) + .WillOnce(InvokeWithoutArgs(this, &ConfigFileWatcherTest::StopWatcher)); + EXPECT_CALL(delegate_, OnConfigWatcherError()) + .Times(0); + + watcher_->Watch(config_file_); + + // Modify the watched file. + std::string data("test"); + EXPECT_NE(file_util::WriteFile(config_file_, data.c_str(), + static_cast<int>(data.size())), -1); + + run_loop_.Run(); +} + +} // namespace remoting |