| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <memory> | 5 #include <memory> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 class ArcBridgeTest : public testing::Test, public ArcBridgeService::Observer { | 27 class ArcBridgeTest : public testing::Test, public ArcBridgeService::Observer { |
| 28 public: | 28 public: |
| 29 ArcBridgeTest() : ready_(false) {} | 29 ArcBridgeTest() : ready_(false) {} |
| 30 ~ArcBridgeTest() override {} | 30 ~ArcBridgeTest() override {} |
| 31 | 31 |
| 32 void OnBridgeReady() override { | 32 void OnBridgeReady() override { |
| 33 state_ = ArcBridgeService::State::READY; | 33 state_ = ArcBridgeService::State::READY; |
| 34 ready_ = true; | 34 ready_ = true; |
| 35 } | 35 } |
| 36 | 36 |
| 37 void OnBridgeStopped() override { | 37 void OnBridgeStopped(ArcBridgeService::StopReason stop_reason) override { |
| 38 state_ = ArcBridgeService::State::STOPPED; | 38 state_ = ArcBridgeService::State::STOPPED; |
| 39 stop_reason_ = stop_reason; |
| 39 message_loop_.PostTask(FROM_HERE, message_loop_.QuitWhenIdleClosure()); | 40 message_loop_.PostTask(FROM_HERE, message_loop_.QuitWhenIdleClosure()); |
| 40 } | 41 } |
| 41 | 42 |
| 42 bool ready() const { return ready_; } | 43 bool ready() const { return ready_; } |
| 43 ArcBridgeService::State state() const { return state_; } | 44 ArcBridgeService::State state() const { return state_; } |
| 44 | 45 |
| 45 protected: | 46 protected: |
| 46 std::unique_ptr<ArcBridgeServiceImpl> service_; | 47 std::unique_ptr<ArcBridgeServiceImpl> service_; |
| 47 std::unique_ptr<FakeArcBridgeInstance> instance_; | 48 std::unique_ptr<FakeArcBridgeInstance> instance_; |
| 49 ArcBridgeService::StopReason stop_reason_; |
| 48 | 50 |
| 49 private: | 51 private: |
| 50 void SetUp() override { | 52 void SetUp() override { |
| 51 chromeos::DBusThreadManager::Initialize(); | 53 chromeos::DBusThreadManager::Initialize(); |
| 52 | 54 |
| 53 ready_ = false; | 55 ready_ = false; |
| 54 state_ = ArcBridgeService::State::STOPPED; | 56 state_ = ArcBridgeService::State::STOPPED; |
| 57 stop_reason_ = ArcBridgeService::StopReason::SHUTDOWN; |
| 55 | 58 |
| 56 instance_.reset(new FakeArcBridgeInstance()); | 59 instance_.reset(new FakeArcBridgeInstance()); |
| 57 service_.reset(new ArcBridgeServiceImpl( | 60 service_.reset(new ArcBridgeServiceImpl( |
| 58 base::MakeUnique<FakeArcBridgeBootstrap>(instance_.get()))); | 61 base::MakeUnique<FakeArcBridgeBootstrap>(instance_.get()))); |
| 59 | 62 |
| 60 service_->AddObserver(this); | 63 service_->AddObserver(this); |
| 61 } | 64 } |
| 62 | 65 |
| 63 void TearDown() override { | 66 void TearDown() override { |
| 64 service_->RemoveObserver(this); | 67 service_->RemoveObserver(this); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 | 125 |
| 123 service_->SetAvailable(true); | 126 service_->SetAvailable(true); |
| 124 service_->HandleStartup(); | 127 service_->HandleStartup(); |
| 125 instance_->WaitForInitCall(); | 128 instance_->WaitForInitCall(); |
| 126 ASSERT_EQ(ArcBridgeService::State::READY, state()); | 129 ASSERT_EQ(ArcBridgeService::State::READY, state()); |
| 127 ASSERT_EQ(1, instance_->init_calls()); | 130 ASSERT_EQ(1, instance_->init_calls()); |
| 128 | 131 |
| 129 // Simulate a connection loss. | 132 // Simulate a connection loss. |
| 130 service_->DisableReconnectDelayForTesting(); | 133 service_->DisableReconnectDelayForTesting(); |
| 131 service_->OnChannelClosed(); | 134 service_->OnChannelClosed(); |
| 132 instance_->SimulateCrash(); | 135 instance_->Stop(ArcBridgeService::StopReason::CRASH); |
| 133 instance_->WaitForInitCall(); | 136 instance_->WaitForInitCall(); |
| 134 ASSERT_EQ(ArcBridgeService::State::READY, state()); | 137 ASSERT_EQ(ArcBridgeService::State::READY, state()); |
| 135 ASSERT_EQ(2, instance_->init_calls()); | 138 ASSERT_EQ(2, instance_->init_calls()); |
| 136 | 139 |
| 137 service_->Shutdown(); | 140 service_->Shutdown(); |
| 138 ASSERT_EQ(ArcBridgeService::State::STOPPED, state()); | 141 ASSERT_EQ(ArcBridgeService::State::STOPPED, state()); |
| 139 } | 142 } |
| 140 | 143 |
| 144 // Makes sure OnBridgeStopped is called on stop. |
| 145 TEST_F(ArcBridgeTest, OnBridgeStopped) { |
| 146 ASSERT_FALSE(ready()); |
| 147 |
| 148 service_->DisableReconnectDelayForTesting(); |
| 149 service_->SetAvailable(true); |
| 150 service_->HandleStartup(); |
| 151 instance_->WaitForInitCall(); |
| 152 ASSERT_EQ(ArcBridgeService::State::READY, state()); |
| 153 |
| 154 // Simulate boot failure. |
| 155 service_->OnChannelClosed(); |
| 156 instance_->Stop(ArcBridgeService::StopReason::GENERIC_BOOT_FAILURE); |
| 157 instance_->WaitForInitCall(); |
| 158 ASSERT_EQ(ArcBridgeService::StopReason::GENERIC_BOOT_FAILURE, stop_reason_); |
| 159 ASSERT_EQ(ArcBridgeService::State::READY, state()); |
| 160 |
| 161 // Simulate crash. |
| 162 service_->OnChannelClosed(); |
| 163 instance_->Stop(ArcBridgeService::StopReason::CRASH); |
| 164 instance_->WaitForInitCall(); |
| 165 ASSERT_EQ(ArcBridgeService::StopReason::CRASH, stop_reason_); |
| 166 ASSERT_EQ(ArcBridgeService::State::READY, state()); |
| 167 |
| 168 // Graceful shutdown. |
| 169 service_->Shutdown(); |
| 170 ASSERT_EQ(ArcBridgeService::StopReason::SHUTDOWN, stop_reason_); |
| 171 ASSERT_EQ(ArcBridgeService::State::STOPPED, state()); |
| 172 } |
| 173 |
| 141 // Removing the same observer more than once should be okay. | 174 // Removing the same observer more than once should be okay. |
| 142 TEST_F(ArcBridgeTest, RemoveObserverTwice) { | 175 TEST_F(ArcBridgeTest, RemoveObserverTwice) { |
| 143 ASSERT_FALSE(ready()); | 176 ASSERT_FALSE(ready()); |
| 144 service_->RemoveObserver(this); | 177 service_->RemoveObserver(this); |
| 145 // The teardown method will also remove |this|. | 178 // The teardown method will also remove |this|. |
| 146 } | 179 } |
| 147 | 180 |
| 148 // Removing an unknown observer should be allowed. | 181 // Removing an unknown observer should be allowed. |
| 149 TEST_F(ArcBridgeTest, RemoveUnknownObserver) { | 182 TEST_F(ArcBridgeTest, RemoveUnknownObserver) { |
| 150 ASSERT_FALSE(ready()); | 183 ASSERT_FALSE(ready()); |
| 151 auto dummy_observer = base::MakeUnique<DummyObserver>(); | 184 auto dummy_observer = base::MakeUnique<DummyObserver>(); |
| 152 service_->RemoveObserver(dummy_observer.get()); | 185 service_->RemoveObserver(dummy_observer.get()); |
| 153 } | 186 } |
| 154 | 187 |
| 155 } // namespace arc | 188 } // namespace arc |
| OLD | NEW |