// Copyright (c) 2010 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/browser/sync/notifier/chrome_system_resources.h" #include <string> #include "base/callback.h" #include "base/message_loop.h" #include "base/tuple.h" #include "google/cacheinvalidation/invalidation-client.h" #include "chrome/browser/sync/notifier/state_writer.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace sync_notifier { namespace { using ::testing::_; using ::testing::SaveArg; class MockStateWriter : public StateWriter { public: MOCK_METHOD1(WriteState, void(const std::string&)); }; class MockClosure : public Callback0::Type { public: MOCK_METHOD1(RunWithParams, void(const Tuple0&)); }; class MockStorageCallback : public Callback1<bool>::Type { public: MOCK_METHOD1(RunWithParams, void(const Tuple1<bool>&)); }; class ChromeSystemResourcesTest : public testing::Test { protected: ChromeSystemResourcesTest() : chrome_system_resources_(&mock_state_writer_) {} virtual ~ChromeSystemResourcesTest() {} void ScheduleShouldNotRun() { { // Owned by ScheduleImmediately. MockClosure* should_not_run = new MockClosure(); EXPECT_CALL(*should_not_run, RunWithParams(_)).Times(0); chrome_system_resources_.ScheduleImmediately(should_not_run); } { // Owned by ScheduleOnListenerThread. MockClosure* should_not_run = new MockClosure(); EXPECT_CALL(*should_not_run, RunWithParams(_)).Times(0); chrome_system_resources_.ScheduleOnListenerThread(should_not_run); } { // Owned by ScheduleWithDelay. MockClosure* should_not_run = new MockClosure(); EXPECT_CALL(*should_not_run, RunWithParams(_)).Times(0); chrome_system_resources_.ScheduleWithDelay( invalidation::TimeDelta::FromSeconds(0), should_not_run); } } // Needed by |chrome_system_resources_|. MessageLoop message_loop_; MockStateWriter mock_state_writer_; ChromeSystemResources chrome_system_resources_; private: DISALLOW_COPY_AND_ASSIGN(ChromeSystemResourcesTest); }; // Make sure current_time() doesn't crash or leak. TEST_F(ChromeSystemResourcesTest, CurrentTime) { invalidation::Time current_time = chrome_system_resources_.current_time(); VLOG(1) << "current_time returned: " << current_time.ToInternalValue(); } // Make sure Log() doesn't crash or leak. TEST_F(ChromeSystemResourcesTest, Log) { chrome_system_resources_.Log(ChromeSystemResources::INFO_LEVEL, __FILE__, __LINE__, "%s %d", "test string", 5); } TEST_F(ChromeSystemResourcesTest, ScheduleBeforeStart) { ScheduleShouldNotRun(); chrome_system_resources_.StartScheduler(); } TEST_F(ChromeSystemResourcesTest, ScheduleAfterStop) { chrome_system_resources_.StartScheduler(); chrome_system_resources_.StopScheduler(); ScheduleShouldNotRun(); } TEST_F(ChromeSystemResourcesTest, ScheduleAndStop) { chrome_system_resources_.StartScheduler(); ScheduleShouldNotRun(); chrome_system_resources_.StopScheduler(); } TEST_F(ChromeSystemResourcesTest, ScheduleAndDestroy) { chrome_system_resources_.StartScheduler(); ScheduleShouldNotRun(); } TEST_F(ChromeSystemResourcesTest, ScheduleImmediately) { chrome_system_resources_.StartScheduler(); // Owned by ScheduleImmediately. MockClosure* mock_closure = new MockClosure(); EXPECT_CALL(*mock_closure, RunWithParams(_)); chrome_system_resources_.ScheduleImmediately(mock_closure); message_loop_.RunAllPending(); } TEST_F(ChromeSystemResourcesTest, ScheduleOnListenerThread) { chrome_system_resources_.StartScheduler(); // Owned by ScheduleOnListenerThread. MockClosure* mock_closure = new MockClosure(); EXPECT_CALL(*mock_closure, RunWithParams(_)); chrome_system_resources_.ScheduleOnListenerThread(mock_closure); EXPECT_FALSE(chrome_system_resources_.IsRunningOnInternalThread()); message_loop_.RunAllPending(); } TEST_F(ChromeSystemResourcesTest, ScheduleWithZeroDelay) { chrome_system_resources_.StartScheduler(); // Owned by ScheduleWithDelay. MockClosure* mock_closure = new MockClosure(); EXPECT_CALL(*mock_closure, RunWithParams(_)); chrome_system_resources_.ScheduleWithDelay( invalidation::TimeDelta::FromSeconds(0), mock_closure); message_loop_.RunAllPending(); } // TODO(akalin): Figure out how to test with a non-zero delay. TEST_F(ChromeSystemResourcesTest, WriteState) { chrome_system_resources_.StartScheduler(); EXPECT_CALL(mock_state_writer_, WriteState(_)); // Owned by WriteState. MockStorageCallback* mock_storage_callback = new MockStorageCallback(); Tuple1<bool> results(false); EXPECT_CALL(*mock_storage_callback, RunWithParams(_)) .WillOnce(SaveArg<0>(&results)); chrome_system_resources_.WriteState("state", mock_storage_callback); message_loop_.RunAllPending(); EXPECT_TRUE(results.a); } } // namespace } // namespace notifier