// Copyright 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 "chrome_frame/scoped_initialization_manager.h" #include "gmock/gmock.h" #include "gtest/gtest.h" using ::testing::InSequence; // Initialization traits that delegate to a registered delegate instance. class TestInitializationTraits { public: class Delegate { public: virtual void Initialize() = 0; virtual void Shutdown() = 0; }; static void SetDelegate(Delegate* delegate) { delegate_ = delegate; } static void Initialize() { ASSERT_TRUE(delegate_ != NULL); delegate_->Initialize(); } static void Shutdown() { ASSERT_TRUE(delegate_ != NULL); delegate_->Shutdown(); } private: static Delegate* delegate_; }; TestInitializationTraits::Delegate* TestInitializationTraits::delegate_ = NULL; // A mock delegate for use in tests. class MockInitializationTraitsDelegate : public TestInitializationTraits::Delegate { public: MOCK_METHOD0(Initialize, void()); MOCK_METHOD0(Shutdown, void()); }; // A test fixture that sets up a mock traits delegate for use in tests. class ScopedInitializationManagerTest : public ::testing::Test { protected: // A manager type that will invoke methods typedef chrome_frame::ScopedInitializationManager<TestInitializationTraits> TestScopedInitializationManager; virtual void SetUp() OVERRIDE { TestInitializationTraits::SetDelegate(&mock_traits_delegate_); } virtual void TearDown() OVERRIDE { TestInitializationTraits::SetDelegate(NULL); } MockInitializationTraitsDelegate mock_traits_delegate_; }; // Test that Initialize and Shutdown are called in order for the simple case. TEST_F(ScopedInitializationManagerTest, InitializeAndShutdown) { { InSequence dummy; EXPECT_CALL(mock_traits_delegate_, Initialize()); EXPECT_CALL(mock_traits_delegate_, Shutdown()); } TestScopedInitializationManager test_manager; } // Test that Initialize and Shutdown are called in order only once despite // multiple instances. TEST_F(ScopedInitializationManagerTest, InitializeAndShutdownOnlyOnce) { { InSequence dummy; EXPECT_CALL(mock_traits_delegate_, Initialize()); EXPECT_CALL(mock_traits_delegate_, Shutdown()); } TestScopedInitializationManager test_manager_1; TestScopedInitializationManager test_manager_2; TestScopedInitializationManager test_manager_3; }