Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: content/renderer/screen_orientation/screen_orientation_dispatcher_unittest.cc

Issue 549603003: Create Mojo service for locking/unlocking screen orientation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Response to review, port unittest Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "screen_orientation_dispatcher.h" 5 #include "screen_orientation_dispatcher.h"
6 6
7 #include <list> 7 #include <list>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "content/common/screen_orientation_messages.h"
12 #include "content/public/test/test_utils.h" 11 #include "content/public/test/test_utils.h"
13 #include "ipc/ipc_test_sink.h"
14 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
15 #include "third_party/WebKit/public/platform/WebLockOrientationCallback.h" 13 #include "third_party/WebKit/public/platform/WebLockOrientationCallback.h"
16 14
17 namespace content { 15 namespace content {
18 16
19 // MockLockOrientationCallback is an implementation of 17 // MockLockOrientationCallback is an implementation of
20 // WebLockOrientationCallback and takes a LockOrientationResultHolder* as a 18 // WebLockOrientationCallback and takes a LockOrientationResultHolder* as a
21 // parameter when being constructed. The |results_| pointer is owned by the 19 // parameter when being constructed. The |results_| pointer is owned by the
22 // caller and not by the callback object. The intent being that as soon as the 20 // caller and not by the callback object. The intent being that as soon as the
23 // callback is resolved, it will be killed so we use the 21 // callback is resolved, it will be killed so we use the
(...skipping 22 matching lines...) Expand all
46 results_->failed_ = true; 44 results_->failed_ = true;
47 results_->error_ = error; 45 results_->error_ = error;
48 } 46 }
49 47
50 private: 48 private:
51 virtual ~MockLockOrientationCallback() {} 49 virtual ~MockLockOrientationCallback() {}
52 50
53 LockOrientationResultHolder* results_; 51 LockOrientationResultHolder* results_;
54 }; 52 };
55 53
56 class ScreenOrientationDispatcherWithSink : public ScreenOrientationDispatcher { 54 class MockScreenOrientationService : public ScreenOrientationService {
57 public: 55 public:
58 explicit ScreenOrientationDispatcherWithSink(IPC::TestSink* sink) 56 MockScreenOrientationService();
59 :ScreenOrientationDispatcher(NULL) , sink_(sink) { 57 virtual ~MockScreenOrientationService();
58
59 // ScreenOrientationService:
60 virtual void LockOrientation(
61 ScreenOrientationLockType lock_type,
62 const mojo::Callback<void(ScreenOrientationLockResult)>& callback)
63 OVERRIDE;
64 virtual void UnlockOrientation() OVERRIDE;
65
66 void RunLockResultCallback(ScreenOrientationLockResult result_type);
67 const mojo::Callback<void(ScreenOrientationLockResult)>&
68 on_result_callback() {
69 return on_result_callback_;
60 } 70 }
61 71
62 virtual bool Send(IPC::Message* message) OVERRIDE { 72 private:
63 return sink_->Send(message); 73 mojo::Callback<void(ScreenOrientationLockResult)> on_result_callback_;
64 } 74 };
65 75
66 IPC::TestSink* sink_; 76 MockScreenOrientationService::MockScreenOrientationService() {
67 }; 77 }
78
79 MockScreenOrientationService::~MockScreenOrientationService() {
80 }
81
82 void MockScreenOrientationService::LockOrientation(
83 ScreenOrientationLockType lock_type,
84 const mojo::Callback<void(ScreenOrientationLockResult)>& callback) {
85 on_result_callback_ = callback;
86 }
87
88 void MockScreenOrientationService::UnlockOrientation() {
89 }
90
91 void MockScreenOrientationService::RunLockResultCallback(
92 ScreenOrientationLockResult result_type) {
93 DCHECK(!on_result_callback_.is_null());
94 on_result_callback_.Run(result_type);
95 on_result_callback_ = mojo::Callback<void(ScreenOrientationLockResult)>();
96 }
68 97
69 class ScreenOrientationDispatcherTest : public testing::Test { 98 class ScreenOrientationDispatcherTest : public testing::Test {
70 protected: 99 protected:
71 virtual void SetUp() OVERRIDE { 100 virtual void SetUp() OVERRIDE {
72 dispatcher_.reset(new ScreenOrientationDispatcherWithSink(&sink_)); 101 dispatcher_.reset(
102 new ScreenOrientationDispatcher(&screen_orientation_service_));
73 } 103 }
74 104
75 int GetFirstLockRequestIdFromSink() { 105 virtual void TearDown() OVERRIDE {}
76 const IPC::Message* msg = sink().GetFirstMessageMatching(
77 ScreenOrientationHostMsg_LockRequest::ID);
78 EXPECT_TRUE(msg != NULL);
79
80 Tuple2<blink::WebScreenOrientationLockType,int> params;
81 ScreenOrientationHostMsg_LockRequest::Read(msg, &params);
82 return params.b;
83 }
84
85 IPC::TestSink& sink() {
86 return sink_;
87 }
88 106
89 void LockOrientation(blink::WebScreenOrientationLockType orientation, 107 void LockOrientation(blink::WebScreenOrientationLockType orientation,
90 blink::WebLockOrientationCallback* callback) { 108 blink::WebLockOrientationCallback* callback) {
91 dispatcher_->lockOrientation(orientation, callback); 109 dispatcher_->lockOrientation(orientation, callback);
92 } 110 }
93 111
94 void UnlockOrientation() { 112 void UnlockOrientation() {
95 dispatcher_->unlockOrientation(); 113 dispatcher_->unlockOrientation();
96 } 114 }
97 115
98 void OnMessageReceived(const IPC::Message& message) { 116 MockScreenOrientationService screen_orientation_service_;
99 dispatcher_->OnMessageReceived(message);
100 }
101
102 int routing_id() const {
103 // We return a fake routing_id() in the context of this test.
104 return 0;
105 }
106
107 IPC::TestSink sink_;
108 scoped_ptr<ScreenOrientationDispatcher> dispatcher_; 117 scoped_ptr<ScreenOrientationDispatcher> dispatcher_;
109 }; 118 };
110 119
111 // Test that calling lockOrientation() followed by unlockOrientation() cancel 120 // Test that calling lockOrientation() followed by unlockOrientation() cancel
112 // the lockOrientation(). 121 // the lockOrientation().
113 TEST_F(ScreenOrientationDispatcherTest, CancelPending_Unlocking) { 122 TEST_F(ScreenOrientationDispatcherTest, CancelPending_Unlocking) {
114 MockLockOrientationCallback::LockOrientationResultHolder callback_results; 123 MockLockOrientationCallback::LockOrientationResultHolder callback_results;
115 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary, 124 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary,
116 new MockLockOrientationCallback(&callback_results)); 125 new MockLockOrientationCallback(&callback_results));
117 UnlockOrientation(); 126 UnlockOrientation();
(...skipping 12 matching lines...) Expand all
130 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary, 139 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary,
131 new MockLockOrientationCallback(&callback_results)); 140 new MockLockOrientationCallback(&callback_results));
132 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary, 141 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary,
133 new MockLockOrientationCallback(&callback_results2)); 142 new MockLockOrientationCallback(&callback_results2));
134 143
135 EXPECT_FALSE(callback_results.succeeded_); 144 EXPECT_FALSE(callback_results.succeeded_);
136 EXPECT_TRUE(callback_results.failed_); 145 EXPECT_TRUE(callback_results.failed_);
137 EXPECT_EQ(blink::WebLockOrientationErrorCanceled, callback_results.error_); 146 EXPECT_EQ(blink::WebLockOrientationErrorCanceled, callback_results.error_);
138 } 147 }
139 148
140 // Test that when a LockError message is received, the request is set as failed 149 // Test that when a LockError message is received, the request is set as
141 // with the correct values. 150 // failed with the correct values.
142 TEST_F(ScreenOrientationDispatcherTest, LockRequest_Error) { 151 TEST_F(ScreenOrientationDispatcherTest, LockRequest_Error) {
143 std::list<blink::WebLockOrientationError> errors; 152 std::map<ScreenOrientationLockResult, blink::WebLockOrientationError> errors;
144 errors.push_back(blink::WebLockOrientationErrorNotAvailable); 153 errors[SCREEN_ORIENTATION_LOCK_RESULT_ERROR_NOT_AVAILABLE] =
145 errors.push_back( 154 blink::WebLockOrientationErrorNotAvailable;
146 blink::WebLockOrientationErrorFullScreenRequired); 155 errors[SCREEN_ORIENTATION_LOCK_RESULT_ERROR_FULLSCREEN_REQUIRED] =
147 errors.push_back(blink::WebLockOrientationErrorCanceled); 156 blink::WebLockOrientationErrorFullScreenRequired;
157 errors[SCREEN_ORIENTATION_LOCK_RESULT_ERROR_CANCELED] =
158 blink::WebLockOrientationErrorCanceled;
148 159
149 for (std::list<blink::WebLockOrientationError>::const_iterator 160 for (std::map<ScreenOrientationLockResult,
150 it = errors.begin(); it != errors.end(); ++it) { 161 blink::WebLockOrientationError>::const_iterator it =
162 errors.begin();
163 it != errors.end();
164 ++it) {
151 MockLockOrientationCallback::LockOrientationResultHolder callback_results; 165 MockLockOrientationCallback::LockOrientationResultHolder callback_results;
152 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary, 166 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary,
153 new MockLockOrientationCallback(&callback_results)); 167 new MockLockOrientationCallback(&callback_results));
154 168 screen_orientation_service_.RunLockResultCallback(it->first);
155 int request_id = GetFirstLockRequestIdFromSink();
156 OnMessageReceived(
157 ScreenOrientationMsg_LockError(routing_id(), request_id, *it));
158 169
159 EXPECT_FALSE(callback_results.succeeded_); 170 EXPECT_FALSE(callback_results.succeeded_);
160 EXPECT_TRUE(callback_results.failed_); 171 EXPECT_TRUE(callback_results.failed_);
161 EXPECT_EQ(*it, callback_results.error_); 172 EXPECT_EQ(it->second, callback_results.error_);
162
163 sink().ClearMessages();
164 } 173 }
165 } 174 }
166 175
167 // Test that when a LockSuccess message is received, the request is set as 176 // Test that when a LockSuccess message is received, the request is set as
168 // succeeded. 177 // succeeded.
169 TEST_F(ScreenOrientationDispatcherTest, LockRequest_Success) { 178 TEST_F(ScreenOrientationDispatcherTest, LockRequest_Success) {
170 MockLockOrientationCallback::LockOrientationResultHolder callback_results; 179 MockLockOrientationCallback::LockOrientationResultHolder callback_results;
171 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary, 180 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary,
172 new MockLockOrientationCallback(&callback_results)); 181 new MockLockOrientationCallback(&callback_results));
173 182
174 int request_id = GetFirstLockRequestIdFromSink(); 183 screen_orientation_service_.RunLockResultCallback(
175 OnMessageReceived(ScreenOrientationMsg_LockSuccess(routing_id(), 184 SCREEN_ORIENTATION_LOCK_RESULT_SUCCESS);
176 request_id));
177
178 EXPECT_TRUE(callback_results.succeeded_); 185 EXPECT_TRUE(callback_results.succeeded_);
179 EXPECT_FALSE(callback_results.failed_); 186 EXPECT_FALSE(callback_results.failed_);
180
181 sink().ClearMessages();
182 }
183
184 // Test an edge case: a LockSuccess is received but it matches no pending
185 // callback.
186 TEST_F(ScreenOrientationDispatcherTest, SuccessForUnknownRequest) {
187 MockLockOrientationCallback::LockOrientationResultHolder callback_results;
188 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary,
189 new MockLockOrientationCallback(&callback_results));
190
191 int request_id = GetFirstLockRequestIdFromSink();
192 OnMessageReceived(ScreenOrientationMsg_LockSuccess(routing_id(),
193 request_id + 1));
194
195 EXPECT_FALSE(callback_results.succeeded_);
196 EXPECT_FALSE(callback_results.failed_);
197 }
198
199 // Test an edge case: a LockError is received but it matches no pending
200 // callback.
201 TEST_F(ScreenOrientationDispatcherTest, ErrorForUnknownRequest) {
202 MockLockOrientationCallback::LockOrientationResultHolder callback_results;
203 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary,
204 new MockLockOrientationCallback(&callback_results));
205
206 int request_id = GetFirstLockRequestIdFromSink();
207 OnMessageReceived(ScreenOrientationMsg_LockError(
208 routing_id(), request_id + 1, blink::WebLockOrientationErrorCanceled));
209
210 EXPECT_FALSE(callback_results.succeeded_);
211 EXPECT_FALSE(callback_results.failed_);
212 } 187 }
213 188
214 // Test the following scenario: 189 // Test the following scenario:
215 // - request1 is received by the dispatcher; 190 // - request1 is received by the dispatcher;
216 // - request2 is received by the dispatcher; 191 // - request2 is received by the dispatcher;
217 // - request1 is rejected; 192 // - request1 is rejected;
218 // - request1 success response is received. 193 // - request1 success response is received.
219 // Expected: request1 is still rejected, request2 has not been set as succeeded. 194 // Expected: request1 is still rejected, request2 has not been set as succeeded.
220 TEST_F(ScreenOrientationDispatcherTest, RaceScenario) { 195 TEST_F(ScreenOrientationDispatcherTest, RaceScenario) {
221 MockLockOrientationCallback::LockOrientationResultHolder callback_results1; 196 MockLockOrientationCallback::LockOrientationResultHolder callback_results1;
222 MockLockOrientationCallback::LockOrientationResultHolder callback_results2; 197 MockLockOrientationCallback::LockOrientationResultHolder callback_results2;
223 198
224 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary, 199 LockOrientation(blink::WebScreenOrientationLockPortraitPrimary,
225 new MockLockOrientationCallback(&callback_results1)); 200 new MockLockOrientationCallback(&callback_results1));
226 int request_id1 = GetFirstLockRequestIdFromSink(); 201 mojo::Callback<void(ScreenOrientationLockResult)> service_callback1 =
202 screen_orientation_service_.on_result_callback();
227 203
228 LockOrientation(blink::WebScreenOrientationLockLandscapePrimary, 204 LockOrientation(blink::WebScreenOrientationLockLandscapePrimary,
229 new MockLockOrientationCallback(&callback_results2)); 205 new MockLockOrientationCallback(&callback_results2));
230 206
231 // callback_results1 must be rejected, tested in CancelPending_DoubleLock. 207 // callback_results1 must be rejected, tested in CancelPending_DoubleLock.
232 208
233 OnMessageReceived(ScreenOrientationMsg_LockSuccess(routing_id(), 209 service_callback1.Run(SCREEN_ORIENTATION_LOCK_RESULT_SUCCESS);
234 request_id1));
235 210
236 // First request is still rejected. 211 // First request is still rejected.
237 EXPECT_FALSE(callback_results1.succeeded_); 212 EXPECT_FALSE(callback_results1.succeeded_);
238 EXPECT_TRUE(callback_results1.failed_); 213 EXPECT_TRUE(callback_results1.failed_);
239 EXPECT_EQ(blink::WebLockOrientationErrorCanceled, callback_results1.error_); 214 EXPECT_EQ(blink::WebLockOrientationErrorCanceled, callback_results1.error_);
240 215
241 // Second request is still pending. 216 // Second request is still pending.
242 EXPECT_FALSE(callback_results2.succeeded_); 217 EXPECT_FALSE(callback_results2.succeeded_);
243 EXPECT_FALSE(callback_results2.failed_); 218 EXPECT_FALSE(callback_results2.failed_);
244 } 219 }
245 220
246 } // namespace content 221 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698