Index: chrome/browser/device_orientation/provider_unittest.cc |
=================================================================== |
--- chrome/browser/device_orientation/provider_unittest.cc (revision 75978) |
+++ chrome/browser/device_orientation/provider_unittest.cc (working copy) |
@@ -1,373 +0,0 @@ |
-// 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 <queue> |
- |
-#include "base/message_loop.h" |
-#include "base/synchronization/lock.h" |
-#include "base/task.h" |
-#include "chrome/browser/device_orientation/data_fetcher.h" |
-#include "chrome/browser/device_orientation/orientation.h" |
-#include "chrome/browser/device_orientation/provider.h" |
-#include "chrome/browser/device_orientation/provider_impl.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace device_orientation { |
-namespace { |
- |
-// Class for checking expectations on orientation updates from the Provider. |
-class UpdateChecker : public Provider::Observer { |
- public: |
- explicit UpdateChecker(int* expectations_count_ptr) |
- : expectations_count_ptr_(expectations_count_ptr) { |
- } |
- |
- // From Provider::Observer. |
- virtual void OnOrientationUpdate(const Orientation& orientation) { |
- ASSERT_FALSE(expectations_queue_.empty()); |
- |
- Orientation expected = expectations_queue_.front(); |
- expectations_queue_.pop(); |
- |
- EXPECT_EQ(expected.can_provide_alpha_, orientation.can_provide_alpha_); |
- EXPECT_EQ(expected.can_provide_beta_, orientation.can_provide_beta_); |
- EXPECT_EQ(expected.can_provide_gamma_, orientation.can_provide_gamma_); |
- if (expected.can_provide_alpha_) |
- EXPECT_EQ(expected.alpha_, orientation.alpha_); |
- if (expected.can_provide_beta_) |
- EXPECT_EQ(expected.beta_, orientation.beta_); |
- if (expected.can_provide_gamma_) |
- EXPECT_EQ(expected.gamma_, orientation.gamma_); |
- |
- --(*expectations_count_ptr_); |
- |
- if (*expectations_count_ptr_ == 0) { |
- MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
- } |
- } |
- |
- void AddExpectation(const Orientation& orientation) { |
- expectations_queue_.push(orientation); |
- ++(*expectations_count_ptr_); |
- } |
- |
- private: |
- // Set up by the test fixture, which then blocks while it is accessed |
- // from OnOrientationUpdate which is executed on the test fixture's |
- // message_loop_. |
- int* expectations_count_ptr_; |
- std::queue<Orientation> expectations_queue_; |
-}; |
- |
-// Class for injecting test orientation data into the Provider. |
-class MockOrientationFactory : public base::RefCounted<MockOrientationFactory> { |
- public: |
- MockOrientationFactory() { |
- EXPECT_FALSE(instance_); |
- instance_ = this; |
- } |
- |
- ~MockOrientationFactory() { |
- instance_ = NULL; |
- } |
- |
- static DataFetcher* CreateDataFetcher() { |
- EXPECT_TRUE(instance_); |
- return new MockDataFetcher(instance_); |
- } |
- |
- void SetOrientation(const Orientation& orientation) { |
- base::AutoLock auto_lock(lock_); |
- orientation_ = orientation; |
- } |
- |
- private: |
- // Owned by ProviderImpl. Holds a reference back to MockOrientationFactory. |
- class MockDataFetcher : public DataFetcher { |
- public: |
- explicit MockDataFetcher(MockOrientationFactory* orientation_factory) |
- : orientation_factory_(orientation_factory) { } |
- |
- // From DataFetcher. Called by the Provider. |
- virtual bool GetOrientation(Orientation* orientation) { |
- base::AutoLock auto_lock(orientation_factory_->lock_); |
- *orientation = orientation_factory_->orientation_; |
- return true; |
- } |
- |
- private: |
- scoped_refptr<MockOrientationFactory> orientation_factory_; |
- }; |
- |
- static MockOrientationFactory* instance_; |
- Orientation orientation_; |
- base::Lock lock_; |
-}; |
- |
-MockOrientationFactory* MockOrientationFactory::instance_; |
- |
-// Mock DataFetcher that always fails to provide any orientation data. |
-class FailingDataFetcher : public DataFetcher { |
- public: |
- // Factory method; passed to and called by the ProviderImpl. |
- static DataFetcher* Create() { |
- return new FailingDataFetcher(); |
- } |
- |
- // From DataFetcher. |
- virtual bool GetOrientation(Orientation* orientation) { |
- return false; |
- } |
- |
- private: |
- FailingDataFetcher() {} |
-}; |
- |
-class DeviceOrientationProviderTest : public testing::Test { |
- public: |
- DeviceOrientationProviderTest() |
- : pending_expectations_(0) { |
- } |
- |
- virtual void TearDown() { |
- provider_ = NULL; |
- |
- // Make sure it is really gone. |
- EXPECT_FALSE(Provider::GetInstanceForTests()); |
- |
- // Clean up in any case, so as to not break subsequent test. |
- Provider::SetInstanceForTests(NULL); |
- } |
- |
- // Initialize the test fixture with a ProviderImpl that uses the |
- // DataFetcherFactories in the null-terminated factories array. |
- void Init(ProviderImpl::DataFetcherFactory* factories) { |
- provider_ = new ProviderImpl(factories); |
- Provider::SetInstanceForTests(provider_); |
- } |
- |
- // Initialize the test fixture with a ProviderImpl that uses the |
- // DataFetcherFactory factory. |
- void Init(ProviderImpl::DataFetcherFactory factory) { |
- ProviderImpl::DataFetcherFactory factories[] = { factory, NULL }; |
- Init(factories); |
- } |
- |
- protected: |
- // Number of pending expectations. |
- int pending_expectations_; |
- |
- // Provider instance under test. |
- scoped_refptr<Provider> provider_; |
- |
- // Message loop for the test thread. |
- MessageLoop message_loop_; |
-}; |
- |
-TEST_F(DeviceOrientationProviderTest, FailingTest) { |
- Init(FailingDataFetcher::Create); |
- |
- scoped_ptr<UpdateChecker> checker_a( |
- new UpdateChecker(&pending_expectations_)); |
- scoped_ptr<UpdateChecker> checker_b( |
- new UpdateChecker(&pending_expectations_)); |
- |
- checker_a->AddExpectation(Orientation::Empty()); |
- provider_->AddObserver(checker_a.get()); |
- MessageLoop::current()->Run(); |
- |
- checker_b->AddExpectation(Orientation::Empty()); |
- provider_->AddObserver(checker_b.get()); |
- MessageLoop::current()->Run(); |
-} |
- |
-TEST_F(DeviceOrientationProviderTest, ProviderIsSingleton) { |
- Init(FailingDataFetcher::Create); |
- |
- scoped_refptr<Provider> provider_a(Provider::GetInstance()); |
- scoped_refptr<Provider> provider_b(Provider::GetInstance()); |
- |
- EXPECT_EQ(provider_a.get(), provider_b.get()); |
-} |
- |
-TEST_F(DeviceOrientationProviderTest, BasicPushTest) { |
- scoped_refptr<MockOrientationFactory> orientation_factory( |
- new MockOrientationFactory()); |
- Init(MockOrientationFactory::CreateDataFetcher); |
- const Orientation kTestOrientation(true, 1, true, 2, true, 3); |
- |
- scoped_ptr<UpdateChecker> checker(new UpdateChecker(&pending_expectations_)); |
- checker->AddExpectation(kTestOrientation); |
- orientation_factory->SetOrientation(kTestOrientation); |
- provider_->AddObserver(checker.get()); |
- MessageLoop::current()->Run(); |
- |
- provider_->RemoveObserver(checker.get()); |
-} |
- |
-TEST_F(DeviceOrientationProviderTest, MultipleObserversPushTest) { |
- scoped_refptr<MockOrientationFactory> orientation_factory( |
- new MockOrientationFactory()); |
- Init(MockOrientationFactory::CreateDataFetcher); |
- const Orientation kTestOrientations[] = { |
- Orientation(true, 1, true, 2, true, 3), |
- Orientation(true, 4, true, 5, true, 6), |
- Orientation(true, 7, true, 8, true, 9)}; |
- |
- scoped_ptr<UpdateChecker> checker_a( |
- new UpdateChecker(&pending_expectations_)); |
- scoped_ptr<UpdateChecker> checker_b( |
- new UpdateChecker(&pending_expectations_)); |
- scoped_ptr<UpdateChecker> checker_c( |
- new UpdateChecker(&pending_expectations_)); |
- |
- checker_a->AddExpectation(kTestOrientations[0]); |
- orientation_factory->SetOrientation(kTestOrientations[0]); |
- provider_->AddObserver(checker_a.get()); |
- MessageLoop::current()->Run(); |
- |
- checker_a->AddExpectation(kTestOrientations[1]); |
- checker_b->AddExpectation(kTestOrientations[0]); |
- checker_b->AddExpectation(kTestOrientations[1]); |
- orientation_factory->SetOrientation(kTestOrientations[1]); |
- provider_->AddObserver(checker_b.get()); |
- MessageLoop::current()->Run(); |
- |
- provider_->RemoveObserver(checker_a.get()); |
- checker_b->AddExpectation(kTestOrientations[2]); |
- checker_c->AddExpectation(kTestOrientations[1]); |
- checker_c->AddExpectation(kTestOrientations[2]); |
- orientation_factory->SetOrientation(kTestOrientations[2]); |
- provider_->AddObserver(checker_c.get()); |
- MessageLoop::current()->Run(); |
- |
- provider_->RemoveObserver(checker_b.get()); |
- provider_->RemoveObserver(checker_c.get()); |
-} |
- |
-TEST_F(DeviceOrientationProviderTest, ObserverNotRemoved) { |
- scoped_refptr<MockOrientationFactory> orientation_factory( |
- new MockOrientationFactory()); |
- Init(MockOrientationFactory::CreateDataFetcher); |
- const Orientation kTestOrientation(true, 1, true, 2, true, 3); |
- const Orientation kTestOrientation2(true, 4, true, 5, true, 6); |
- |
- scoped_ptr<UpdateChecker> checker(new UpdateChecker(&pending_expectations_)); |
- checker->AddExpectation(kTestOrientation); |
- orientation_factory->SetOrientation(kTestOrientation); |
- provider_->AddObserver(checker.get()); |
- MessageLoop::current()->Run(); |
- |
- checker->AddExpectation(kTestOrientation2); |
- orientation_factory->SetOrientation(kTestOrientation2); |
- MessageLoop::current()->Run(); |
- |
- // Note that checker is not removed. This should not be a problem. |
-} |
- |
-TEST_F(DeviceOrientationProviderTest, StartFailing) { |
- scoped_refptr<MockOrientationFactory> orientation_factory( |
- new MockOrientationFactory()); |
- Init(MockOrientationFactory::CreateDataFetcher); |
- const Orientation kTestOrientation(true, 1, true, 2, true, 3); |
- |
- scoped_ptr<UpdateChecker> checker_a(new UpdateChecker( |
- &pending_expectations_)); |
- scoped_ptr<UpdateChecker> checker_b(new UpdateChecker( |
- &pending_expectations_)); |
- |
- orientation_factory->SetOrientation(kTestOrientation); |
- checker_a->AddExpectation(kTestOrientation); |
- provider_->AddObserver(checker_a.get()); |
- MessageLoop::current()->Run(); |
- |
- checker_a->AddExpectation(Orientation::Empty()); |
- orientation_factory->SetOrientation(Orientation::Empty()); |
- MessageLoop::current()->Run(); |
- |
- checker_b->AddExpectation(Orientation::Empty()); |
- provider_->AddObserver(checker_b.get()); |
- MessageLoop::current()->Run(); |
- |
- provider_->RemoveObserver(checker_a.get()); |
- provider_->RemoveObserver(checker_b.get()); |
-} |
- |
-TEST_F(DeviceOrientationProviderTest, StartStopStart) { |
- scoped_refptr<MockOrientationFactory> orientation_factory( |
- new MockOrientationFactory()); |
- Init(MockOrientationFactory::CreateDataFetcher); |
- const Orientation kTestOrientation(true, 1, true, 2, true, 3); |
- const Orientation kTestOrientation2(true, 4, true, 5, true, 6); |
- |
- scoped_ptr<UpdateChecker> checker_a(new UpdateChecker( |
- &pending_expectations_)); |
- scoped_ptr<UpdateChecker> checker_b(new UpdateChecker( |
- &pending_expectations_)); |
- |
- checker_a->AddExpectation(kTestOrientation); |
- orientation_factory->SetOrientation(kTestOrientation); |
- provider_->AddObserver(checker_a.get()); |
- MessageLoop::current()->Run(); |
- |
- provider_->RemoveObserver(checker_a.get()); // This stops the Provider. |
- |
- checker_b->AddExpectation(kTestOrientation2); |
- orientation_factory->SetOrientation(kTestOrientation2); |
- provider_->AddObserver(checker_b.get()); |
- MessageLoop::current()->Run(); |
- |
- provider_->RemoveObserver(checker_b.get()); |
-} |
- |
-TEST_F(DeviceOrientationProviderTest, SignificantlyDifferent) { |
- scoped_refptr<MockOrientationFactory> orientation_factory( |
- new MockOrientationFactory()); |
- Init(MockOrientationFactory::CreateDataFetcher); |
- |
- // Values that should be well below or above the implementation's |
- // significane threshold. |
- const double kInsignificantDifference = 1e-6; |
- const double kSignificantDifference = 30; |
- const double kAlpha = 4, kBeta = 5, kGamma = 6; |
- |
- const Orientation first_orientation(true, kAlpha, true, kBeta, true, kGamma); |
- |
- const Orientation second_orientation(true, kAlpha + kInsignificantDifference, |
- true, kBeta + kInsignificantDifference, |
- true, kGamma + kInsignificantDifference); |
- |
- const Orientation third_orientation(true, kAlpha + kSignificantDifference, |
- true, kBeta + kSignificantDifference, |
- true, kGamma + kSignificantDifference); |
- |
- scoped_ptr<UpdateChecker> checker_a(new UpdateChecker( |
- &pending_expectations_)); |
- scoped_ptr<UpdateChecker> checker_b(new UpdateChecker( |
- &pending_expectations_)); |
- |
- |
- orientation_factory->SetOrientation(first_orientation); |
- checker_a->AddExpectation(first_orientation); |
- provider_->AddObserver(checker_a.get()); |
- MessageLoop::current()->Run(); |
- |
- // The observers should not see this insignificantly different orientation. |
- orientation_factory->SetOrientation(second_orientation); |
- checker_b->AddExpectation(first_orientation); |
- provider_->AddObserver(checker_b.get()); |
- MessageLoop::current()->Run(); |
- |
- orientation_factory->SetOrientation(third_orientation); |
- checker_a->AddExpectation(third_orientation); |
- checker_b->AddExpectation(third_orientation); |
- MessageLoop::current()->Run(); |
- |
- provider_->RemoveObserver(checker_a.get()); |
- provider_->RemoveObserver(checker_b.get()); |
-} |
- |
-} // namespace |
- |
-} // namespace device_orientation |