| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include <memory> |
| 6 #include <vector> |
| 7 |
| 8 #include "ash/action_handler/action_handler_state_controller.h" |
| 9 #include "ash/action_handler/action_handler_state_observer.h" |
| 10 #include "ash/shell.h" |
| 11 #include "ash/test/ash_test_base.h" |
| 12 #include "base/macros.h" |
| 13 #include "base/memory/ptr_util.h" |
| 14 |
| 15 namespace ash { |
| 16 |
| 17 namespace { |
| 18 |
| 19 class ScopedTestStateObserver : public ActionHandlerStateObserver { |
| 20 public: |
| 21 explicit ScopedTestStateObserver(ActionHandlerStateController* controller) |
| 22 : state_controller_(controller) { |
| 23 state_controller_->AddObserver(this); |
| 24 } |
| 25 |
| 26 ~ScopedTestStateObserver() override { |
| 27 state_controller_->RemoveObserver(this); |
| 28 } |
| 29 |
| 30 void OnActionStateChanged(mojom::ActionHandlerAction action, |
| 31 mojom::ActionHandlerState state) override { |
| 32 ASSERT_EQ(mojom::ActionHandlerAction::kNewNote, action); |
| 33 |
| 34 observed_states_.push_back(state); |
| 35 } |
| 36 |
| 37 const std::vector<mojom::ActionHandlerState>& observed_states() const { |
| 38 return observed_states_; |
| 39 } |
| 40 |
| 41 void ClearObservedStates() { observed_states_.clear(); } |
| 42 |
| 43 private: |
| 44 ActionHandlerStateController* state_controller_; |
| 45 |
| 46 std::vector<mojom::ActionHandlerState> observed_states_; |
| 47 |
| 48 DISALLOW_COPY_AND_ASSIGN(ScopedTestStateObserver); |
| 49 }; |
| 50 |
| 51 class ScopedTestActionHandler : public mojom::ActionHandler { |
| 52 public: |
| 53 explicit ScopedTestActionHandler(ActionHandlerStateController* controller) |
| 54 : state_controller_(controller), binding_(this) { |
| 55 state_controller_->SetActionHandler(binding_.CreateInterfacePtrAndBind()); |
| 56 } |
| 57 |
| 58 ~ScopedTestActionHandler() override { |
| 59 state_controller_->SetActionHandler(nullptr); |
| 60 } |
| 61 |
| 62 void RequestHandleAction(ash::mojom::ActionHandlerAction action) override { |
| 63 ASSERT_EQ(mojom::ActionHandlerAction::kNewNote, action); |
| 64 |
| 65 LOG(ERROR) << "HANDLE ACTION"; |
| 66 action_requests_count_++; |
| 67 } |
| 68 |
| 69 int action_requests_count() const { return action_requests_count_; } |
| 70 |
| 71 void reset_action_requests_count() { action_requests_count_ = 0; } |
| 72 |
| 73 private: |
| 74 ActionHandlerStateController* state_controller_; |
| 75 mojo::Binding<ash::mojom::ActionHandler> binding_; |
| 76 |
| 77 int action_requests_count_ = 0; |
| 78 |
| 79 DISALLOW_COPY_AND_ASSIGN(ScopedTestActionHandler); |
| 80 }; |
| 81 |
| 82 class ActionHandlerStateControllerTest : public test::AshTestBase { |
| 83 public: |
| 84 ActionHandlerStateControllerTest() {} |
| 85 ~ActionHandlerStateControllerTest() override {} |
| 86 |
| 87 ActionHandlerStateController* GetController() { |
| 88 return Shell::Get()->action_handler_state_controller(); |
| 89 } |
| 90 |
| 91 private: |
| 92 DISALLOW_COPY_AND_ASSIGN(ActionHandlerStateControllerTest); |
| 93 }; |
| 94 |
| 95 } // namespace |
| 96 |
| 97 TEST_F(ActionHandlerStateControllerTest, NoActionHandler) { |
| 98 ActionHandlerStateController* controller = GetController(); |
| 99 ScopedTestStateObserver observer(controller); |
| 100 |
| 101 EXPECT_EQ(mojom::ActionHandlerState::kNotSupported, |
| 102 controller->GetState(mojom::ActionHandlerAction::kNewNote)); |
| 103 |
| 104 controller->UpdateActionState(mojom::ActionHandlerAction::kNewNote, |
| 105 mojom::ActionHandlerState::kAvailable); |
| 106 |
| 107 // The effective state should be |kNotSupported| as long as an action handler |
| 108 // is not set. |
| 109 EXPECT_EQ(mojom::ActionHandlerState::kNotSupported, |
| 110 controller->GetState(mojom::ActionHandlerAction::kNewNote)); |
| 111 EXPECT_EQ(0u, observer.observed_states().size()); |
| 112 |
| 113 // Adding action handler should update the controller state. |
| 114 std::unique_ptr<ScopedTestActionHandler> scoped_action_handler = |
| 115 base::MakeUnique<ScopedTestActionHandler>(controller); |
| 116 |
| 117 EXPECT_EQ(mojom::ActionHandlerState::kAvailable, |
| 118 controller->GetState(mojom::ActionHandlerAction::kNewNote)); |
| 119 // Effective state changed, so observer should be notified of it. |
| 120 ASSERT_EQ(1u, observer.observed_states().size()); |
| 121 EXPECT_EQ(mojom::ActionHandlerState::kAvailable, |
| 122 observer.observed_states()[0]); |
| 123 observer.ClearObservedStates(); |
| 124 |
| 125 // When action handler is reset, effective state should go back to |
| 126 // |kNotSupported|. |
| 127 scoped_action_handler.reset(); |
| 128 |
| 129 EXPECT_EQ(mojom::ActionHandlerState::kNotSupported, |
| 130 controller->GetState(mojom::ActionHandlerAction::kNewNote)); |
| 131 // Effective state changed, so observer should be notified of it. |
| 132 ASSERT_EQ(1u, observer.observed_states().size()); |
| 133 EXPECT_EQ(mojom::ActionHandlerState::kNotSupported, |
| 134 observer.observed_states()[0]); |
| 135 observer.ClearObservedStates(); |
| 136 } |
| 137 |
| 138 TEST_F(ActionHandlerStateControllerTest, StateChangesWithHandlerSet) { |
| 139 ActionHandlerStateController* controller = GetController(); |
| 140 |
| 141 ScopedTestStateObserver observer(controller); |
| 142 ScopedTestActionHandler action_handler(controller); |
| 143 |
| 144 controller->UpdateActionState(mojom::ActionHandlerAction::kNewNote, |
| 145 mojom::ActionHandlerState::kAvailable); |
| 146 EXPECT_EQ(mojom::ActionHandlerState::kAvailable, |
| 147 controller->GetState(mojom::ActionHandlerAction::kNewNote)); |
| 148 ASSERT_EQ(1u, observer.observed_states().size()); |
| 149 EXPECT_EQ(mojom::ActionHandlerState::kAvailable, |
| 150 observer.observed_states()[0]); |
| 151 observer.ClearObservedStates(); |
| 152 |
| 153 controller->UpdateActionState(mojom::ActionHandlerAction::kNewNote, |
| 154 mojom::ActionHandlerState::kAvailable); |
| 155 EXPECT_EQ(mojom::ActionHandlerState::kAvailable, |
| 156 controller->GetState(mojom::ActionHandlerAction::kNewNote)); |
| 157 // No real state change, so the observer should not be notified. |
| 158 ASSERT_EQ(0u, observer.observed_states().size()); |
| 159 |
| 160 controller->UpdateActionState(mojom::ActionHandlerAction::kNewNote, |
| 161 mojom::ActionHandlerState::kActive); |
| 162 EXPECT_EQ(mojom::ActionHandlerState::kActive, |
| 163 controller->GetState(mojom::ActionHandlerAction::kNewNote)); |
| 164 ASSERT_EQ(1u, observer.observed_states().size()); |
| 165 EXPECT_EQ(mojom::ActionHandlerState::kActive, observer.observed_states()[0]); |
| 166 observer.ClearObservedStates(); |
| 167 } |
| 168 |
| 169 TEST_F(ActionHandlerStateControllerTest, RequestAction) { |
| 170 ActionHandlerStateController* controller = GetController(); |
| 171 |
| 172 ScopedTestActionHandler action_handler(controller); |
| 173 |
| 174 EXPECT_EQ(0, action_handler.action_requests_count()); |
| 175 controller->RequestHandleAction(mojom::ActionHandlerAction::kNewNote); |
| 176 RunAllPendingInMessageLoop(); |
| 177 EXPECT_EQ(1, action_handler.action_requests_count()); |
| 178 } |
| 179 |
| 180 // Tests that there is no crash if handler is not set. |
| 181 TEST_F(ActionHandlerStateControllerTest, RequestActionWithNoHandler) { |
| 182 ActionHandlerStateController* controller = GetController(); |
| 183 controller->RequestHandleAction(mojom::ActionHandlerAction::kNewNote); |
| 184 } |
| 185 |
| 186 } // namespace ash |
| OLD | NEW |