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

Side by Side Diff: net/socket/websocket_endpoint_lock_manager_unittest.cc

Issue 885443002: Roll Chrome into Mojo. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Rebase to ToT mojo Created 5 years, 10 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 "net/socket/websocket_endpoint_lock_manager.h" 5 #include "net/socket/websocket_endpoint_lock_manager.h"
6 6
7 #include "base/message_loop/message_loop.h"
8 #include "base/run_loop.h"
9 #include "base/time/time.h"
7 #include "net/base/net_errors.h" 10 #include "net/base/net_errors.h"
8 #include "net/socket/next_proto.h" 11 #include "net/socket/next_proto.h"
9 #include "net/socket/socket_test_util.h" 12 #include "net/socket/socket_test_util.h"
10 #include "net/socket/stream_socket.h" 13 #include "net/socket/stream_socket.h"
11 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
12 15
13 namespace net { 16 namespace net {
14 17
15 namespace { 18 namespace {
16 19
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 CHECK(!called_); 85 CHECK(!called_);
83 called_ = true; 86 called_ = true;
84 } 87 }
85 88
86 bool called() const { return called_; } 89 bool called() const { return called_; }
87 90
88 private: 91 private:
89 bool called_; 92 bool called_;
90 }; 93 };
91 94
95 class BlockingWaiter : public FakeWaiter {
96 public:
97 void WaitForLock() {
98 while (!called()) {
99 run_loop_.Run();
100 }
101 }
102
103 void GotEndpointLock() override {
104 FakeWaiter::GotEndpointLock();
105 run_loop_.Quit();
106 }
107
108 private:
109 base::RunLoop run_loop_;
110 };
111
92 class WebSocketEndpointLockManagerTest : public ::testing::Test { 112 class WebSocketEndpointLockManagerTest : public ::testing::Test {
93 protected: 113 protected:
94 WebSocketEndpointLockManagerTest() 114 WebSocketEndpointLockManagerTest()
95 : instance_(WebSocketEndpointLockManager::GetInstance()) {} 115 : instance_(WebSocketEndpointLockManager::GetInstance()) {}
96 ~WebSocketEndpointLockManagerTest() override { 116 ~WebSocketEndpointLockManagerTest() override {
117 // Permit any pending asynchronous unlock operations to complete.
118 RunUntilIdle();
97 // If this check fails then subsequent tests may fail. 119 // If this check fails then subsequent tests may fail.
98 CHECK(instance_->IsEmpty()); 120 CHECK(instance_->IsEmpty());
99 } 121 }
100 122
101 WebSocketEndpointLockManager* instance() const { return instance_; } 123 WebSocketEndpointLockManager* instance() const { return instance_; }
102 124
103 IPEndPoint DummyEndpoint() { 125 IPEndPoint DummyEndpoint() {
104 IPAddressNumber ip_address_number; 126 IPAddressNumber ip_address_number;
105 CHECK(ParseIPLiteralToNumber("127.0.0.1", &ip_address_number)); 127 CHECK(ParseIPLiteralToNumber("127.0.0.1", &ip_address_number));
106 return IPEndPoint(ip_address_number, 80); 128 return IPEndPoint(ip_address_number, 80);
107 } 129 }
108 130
109 void UnlockDummyEndpoint(int times) { 131 void UnlockDummyEndpoint(int times) {
110 for (int i = 0; i < times; ++i) { 132 for (int i = 0; i < times; ++i) {
111 instance()->UnlockEndpoint(DummyEndpoint()); 133 instance()->UnlockEndpoint(DummyEndpoint());
134 RunUntilIdle();
112 } 135 }
113 } 136 }
114 137
138 static void RunUntilIdle() { base::RunLoop().RunUntilIdle(); }
139
115 WebSocketEndpointLockManager* const instance_; 140 WebSocketEndpointLockManager* const instance_;
141 ScopedWebSocketEndpointZeroUnlockDelay zero_unlock_delay_;
116 }; 142 };
117 143
118 TEST_F(WebSocketEndpointLockManagerTest, GetInstanceWorks) { 144 TEST_F(WebSocketEndpointLockManagerTest, GetInstanceWorks) {
119 // All the work is done by the test framework. 145 // All the work is done by the test framework.
120 } 146 }
121 147
122 TEST_F(WebSocketEndpointLockManagerTest, LockEndpointReturnsOkOnce) { 148 TEST_F(WebSocketEndpointLockManagerTest, LockEndpointReturnsOkOnce) {
123 FakeWaiter waiters[2]; 149 FakeWaiter waiters[2];
124 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0])); 150 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0]));
125 EXPECT_EQ(ERR_IO_PENDING, 151 EXPECT_EQ(ERR_IO_PENDING,
126 instance()->LockEndpoint(DummyEndpoint(), &waiters[1])); 152 instance()->LockEndpoint(DummyEndpoint(), &waiters[1]));
127 153
128 UnlockDummyEndpoint(2); 154 UnlockDummyEndpoint(2);
129 } 155 }
130 156
131 TEST_F(WebSocketEndpointLockManagerTest, GotEndpointLockNotCalledOnOk) { 157 TEST_F(WebSocketEndpointLockManagerTest, GotEndpointLockNotCalledOnOk) {
132 FakeWaiter waiter; 158 FakeWaiter waiter;
133 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiter)); 159 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiter));
160 RunUntilIdle();
134 EXPECT_FALSE(waiter.called()); 161 EXPECT_FALSE(waiter.called());
135 162
136 UnlockDummyEndpoint(1); 163 UnlockDummyEndpoint(1);
137 } 164 }
138 165
139 TEST_F(WebSocketEndpointLockManagerTest, GotEndpointLockNotCalledImmediately) { 166 TEST_F(WebSocketEndpointLockManagerTest, GotEndpointLockNotCalledImmediately) {
140 FakeWaiter waiters[2]; 167 FakeWaiter waiters[2];
141 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0])); 168 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0]));
142 EXPECT_EQ(ERR_IO_PENDING, 169 EXPECT_EQ(ERR_IO_PENDING,
143 instance()->LockEndpoint(DummyEndpoint(), &waiters[1])); 170 instance()->LockEndpoint(DummyEndpoint(), &waiters[1]));
171 RunUntilIdle();
144 EXPECT_FALSE(waiters[1].called()); 172 EXPECT_FALSE(waiters[1].called());
145 173
146 UnlockDummyEndpoint(2); 174 UnlockDummyEndpoint(2);
147 } 175 }
148 176
149 TEST_F(WebSocketEndpointLockManagerTest, GotEndpointLockCalledWhenUnlocked) { 177 TEST_F(WebSocketEndpointLockManagerTest, GotEndpointLockCalledWhenUnlocked) {
150 FakeWaiter waiters[2]; 178 FakeWaiter waiters[2];
151 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0])); 179 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0]));
152 EXPECT_EQ(ERR_IO_PENDING, 180 EXPECT_EQ(ERR_IO_PENDING,
153 instance()->LockEndpoint(DummyEndpoint(), &waiters[1])); 181 instance()->LockEndpoint(DummyEndpoint(), &waiters[1]));
154 instance()->UnlockEndpoint(DummyEndpoint()); 182 instance()->UnlockEndpoint(DummyEndpoint());
183 RunUntilIdle();
155 EXPECT_TRUE(waiters[1].called()); 184 EXPECT_TRUE(waiters[1].called());
156 185
157 UnlockDummyEndpoint(1); 186 UnlockDummyEndpoint(1);
158 } 187 }
159 188
160 TEST_F(WebSocketEndpointLockManagerTest, 189 TEST_F(WebSocketEndpointLockManagerTest,
161 EndpointUnlockedIfWaiterAlreadyDeleted) { 190 EndpointUnlockedIfWaiterAlreadyDeleted) {
162 FakeWaiter first_lock_holder; 191 FakeWaiter first_lock_holder;
163 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &first_lock_holder)); 192 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &first_lock_holder));
164 193
165 { 194 {
166 FakeWaiter short_lived_waiter; 195 FakeWaiter short_lived_waiter;
167 EXPECT_EQ(ERR_IO_PENDING, 196 EXPECT_EQ(ERR_IO_PENDING,
168 instance()->LockEndpoint(DummyEndpoint(), &short_lived_waiter)); 197 instance()->LockEndpoint(DummyEndpoint(), &short_lived_waiter));
169 } 198 }
170 199
171 instance()->UnlockEndpoint(DummyEndpoint()); 200 instance()->UnlockEndpoint(DummyEndpoint());
201 RunUntilIdle();
172 202
173 FakeWaiter second_lock_holder; 203 FakeWaiter second_lock_holder;
174 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &second_lock_holder)); 204 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &second_lock_holder));
175 205
176 UnlockDummyEndpoint(1); 206 UnlockDummyEndpoint(1);
177 } 207 }
178 208
179 TEST_F(WebSocketEndpointLockManagerTest, RememberSocketWorks) { 209 TEST_F(WebSocketEndpointLockManagerTest, RememberSocketWorks) {
180 FakeWaiter waiters[2]; 210 FakeWaiter waiters[2];
181 FakeStreamSocket dummy_socket; 211 FakeStreamSocket dummy_socket;
182 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0])); 212 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0]));
183 EXPECT_EQ(ERR_IO_PENDING, 213 EXPECT_EQ(ERR_IO_PENDING,
184 instance()->LockEndpoint(DummyEndpoint(), &waiters[1])); 214 instance()->LockEndpoint(DummyEndpoint(), &waiters[1]));
185 215
186 instance()->RememberSocket(&dummy_socket, DummyEndpoint()); 216 instance()->RememberSocket(&dummy_socket, DummyEndpoint());
187 instance()->UnlockSocket(&dummy_socket); 217 instance()->UnlockSocket(&dummy_socket);
218 RunUntilIdle();
188 EXPECT_TRUE(waiters[1].called()); 219 EXPECT_TRUE(waiters[1].called());
189 220
190 UnlockDummyEndpoint(1); 221 UnlockDummyEndpoint(1);
191 } 222 }
192 223
193 // UnlockEndpoint() should cause any sockets remembered for this endpoint 224 // UnlockEndpoint() should cause any sockets remembered for this endpoint
194 // to be forgotten. 225 // to be forgotten.
195 TEST_F(WebSocketEndpointLockManagerTest, SocketAssociationForgottenOnUnlock) { 226 TEST_F(WebSocketEndpointLockManagerTest, SocketAssociationForgottenOnUnlock) {
196 FakeWaiter waiter; 227 FakeWaiter waiter;
197 FakeStreamSocket dummy_socket; 228 FakeStreamSocket dummy_socket;
198 229
199 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiter)); 230 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiter));
200 instance()->RememberSocket(&dummy_socket, DummyEndpoint()); 231 instance()->RememberSocket(&dummy_socket, DummyEndpoint());
201 instance()->UnlockEndpoint(DummyEndpoint()); 232 instance()->UnlockEndpoint(DummyEndpoint());
233 RunUntilIdle();
202 EXPECT_TRUE(instance()->IsEmpty()); 234 EXPECT_TRUE(instance()->IsEmpty());
203 } 235 }
204 236
205 // When ownership of the endpoint is passed to a new waiter, the new waiter can 237 // When ownership of the endpoint is passed to a new waiter, the new waiter can
206 // call RememberSocket() again. 238 // call RememberSocket() again.
207 TEST_F(WebSocketEndpointLockManagerTest, NextWaiterCanCallRememberSocketAgain) { 239 TEST_F(WebSocketEndpointLockManagerTest, NextWaiterCanCallRememberSocketAgain) {
208 FakeWaiter waiters[2]; 240 FakeWaiter waiters[2];
209 FakeStreamSocket dummy_sockets[2]; 241 FakeStreamSocket dummy_sockets[2];
210 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0])); 242 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0]));
211 EXPECT_EQ(ERR_IO_PENDING, 243 EXPECT_EQ(ERR_IO_PENDING,
212 instance()->LockEndpoint(DummyEndpoint(), &waiters[1])); 244 instance()->LockEndpoint(DummyEndpoint(), &waiters[1]));
213 245
214 instance()->RememberSocket(&dummy_sockets[0], DummyEndpoint()); 246 instance()->RememberSocket(&dummy_sockets[0], DummyEndpoint());
215 instance()->UnlockEndpoint(DummyEndpoint()); 247 instance()->UnlockEndpoint(DummyEndpoint());
248 RunUntilIdle();
216 EXPECT_TRUE(waiters[1].called()); 249 EXPECT_TRUE(waiters[1].called());
217 instance()->RememberSocket(&dummy_sockets[1], DummyEndpoint()); 250 instance()->RememberSocket(&dummy_sockets[1], DummyEndpoint());
218 251
219 UnlockDummyEndpoint(1); 252 UnlockDummyEndpoint(1);
220 } 253 }
221 254
255 // Calling UnlockSocket() after UnlockEndpoint() does nothing.
256 TEST_F(WebSocketEndpointLockManagerTest,
257 UnlockSocketAfterUnlockEndpointDoesNothing) {
258 FakeWaiter waiters[3];
259 FakeStreamSocket dummy_socket;
260
261 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0]));
262 EXPECT_EQ(ERR_IO_PENDING,
263 instance()->LockEndpoint(DummyEndpoint(), &waiters[1]));
264 EXPECT_EQ(ERR_IO_PENDING,
265 instance()->LockEndpoint(DummyEndpoint(), &waiters[2]));
266 instance()->RememberSocket(&dummy_socket, DummyEndpoint());
267 instance()->UnlockEndpoint(DummyEndpoint());
268 instance()->UnlockSocket(&dummy_socket);
269 RunUntilIdle();
270 EXPECT_TRUE(waiters[1].called());
271 EXPECT_FALSE(waiters[2].called());
272
273 UnlockDummyEndpoint(2);
274 }
275
276 // UnlockEndpoint() should always be asynchronous.
277 TEST_F(WebSocketEndpointLockManagerTest, UnlockEndpointIsAsynchronous) {
278 FakeWaiter waiters[2];
279 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0]));
280 EXPECT_EQ(ERR_IO_PENDING,
281 instance()->LockEndpoint(DummyEndpoint(), &waiters[1]));
282
283 instance()->UnlockEndpoint(DummyEndpoint());
284 EXPECT_FALSE(waiters[1].called());
285 RunUntilIdle();
286 EXPECT_TRUE(waiters[1].called());
287
288 UnlockDummyEndpoint(1);
289 }
290
291 // UnlockEndpoint() should normally have a delay.
292 TEST_F(WebSocketEndpointLockManagerTest, UnlockEndpointIsDelayed) {
293 using base::TimeTicks;
294
295 const base::TimeDelta unlock_delay = base::TimeDelta::FromMilliseconds(1);
296 instance()->SetUnlockDelayForTesting(unlock_delay);
297 FakeWaiter fake_waiter;
298 BlockingWaiter blocking_waiter;
299 EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &fake_waiter));
300 EXPECT_EQ(ERR_IO_PENDING,
301 instance()->LockEndpoint(DummyEndpoint(), &blocking_waiter));
302
303 TimeTicks before_unlock = TimeTicks::Now();
304 instance()->UnlockEndpoint(DummyEndpoint());
305 RunUntilIdle();
306 EXPECT_FALSE(blocking_waiter.called());
307 blocking_waiter.WaitForLock();
308 TimeTicks after_unlock = TimeTicks::Now();
309 EXPECT_GE(after_unlock - before_unlock, unlock_delay);
310 instance()->SetUnlockDelayForTesting(base::TimeDelta());
311 UnlockDummyEndpoint(1);
312 }
313
222 } // namespace 314 } // namespace
223 315
224 } // namespace net 316 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/websocket_endpoint_lock_manager.cc ('k') | net/socket/websocket_transport_client_socket_pool_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698