| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "base/waitable_event.h" | 5 #include "base/waitable_event.h" |
| 6 #include "googleurl/src/gurl.h" | 6 #include "googleurl/src/gurl.h" |
| 7 #include "net/base/net_errors.h" | 7 #include "net/base/net_errors.h" |
| 8 #include "net/base/test_completion_callback.h" | 8 #include "net/base/test_completion_callback.h" |
| 9 #include "net/proxy/proxy_info.h" | 9 #include "net/proxy/proxy_info.h" |
| 10 #include "net/proxy/single_threaded_proxy_resolver.h" | 10 #include "net/proxy/single_threaded_proxy_resolver.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 results->UseNamedProxy(query_url.host()); | 40 results->UseNamedProxy(query_url.host()); |
| 41 | 41 |
| 42 // Return a success code which represents the request's order. | 42 // Return a success code which represents the request's order. |
| 43 return request_count_++; | 43 return request_count_++; |
| 44 } | 44 } |
| 45 | 45 |
| 46 virtual void CancelRequest(RequestHandle request) { | 46 virtual void CancelRequest(RequestHandle request) { |
| 47 NOTREACHED(); | 47 NOTREACHED(); |
| 48 } | 48 } |
| 49 | 49 |
| 50 virtual void SetPacScriptByDataInternal(const std::string& bytes) { | 50 virtual int SetPacScript(const GURL& pac_url, |
| 51 const std::string& bytes, |
| 52 CompletionCallback* callback) { |
| 51 CheckIsOnWorkerThread(); | 53 CheckIsOnWorkerThread(); |
| 52 last_pac_bytes_ = bytes; | 54 last_pac_bytes_ = bytes; |
| 55 return OK; |
| 53 } | 56 } |
| 54 | 57 |
| 55 const std::string& last_pac_bytes() const { return last_pac_bytes_; } | 58 const std::string& last_pac_bytes() const { return last_pac_bytes_; } |
| 56 | 59 |
| 57 void SetResolveLatency(int latency_ms) { | 60 void SetResolveLatency(int latency_ms) { |
| 58 resolve_latency_ms_ = latency_ms; | 61 resolve_latency_ms_ = latency_ms; |
| 59 } | 62 } |
| 60 | 63 |
| 61 private: | 64 private: |
| 62 void CheckIsOnWorkerThread() { | 65 void CheckIsOnWorkerThread() { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 | 123 |
| 121 TEST(SingleThreadedProxyResolverTest, Basic) { | 124 TEST(SingleThreadedProxyResolverTest, Basic) { |
| 122 MockProxyResolver* mock = new MockProxyResolver; | 125 MockProxyResolver* mock = new MockProxyResolver; |
| 123 scoped_ptr<SingleThreadedProxyResolver> resolver( | 126 scoped_ptr<SingleThreadedProxyResolver> resolver( |
| 124 new SingleThreadedProxyResolver(mock)); | 127 new SingleThreadedProxyResolver(mock)); |
| 125 | 128 |
| 126 int rv; | 129 int rv; |
| 127 | 130 |
| 128 EXPECT_TRUE(resolver->expects_pac_bytes()); | 131 EXPECT_TRUE(resolver->expects_pac_bytes()); |
| 129 | 132 |
| 130 // Call SetPacScriptByData() -- we will make sure it reaches the sync resolver | 133 // Call SetPacScriptByData() -- verify that it reaches the synchronous |
| 131 // later on. | 134 // resolver. |
| 132 resolver->SetPacScriptByData("pac script bytes"); | 135 TestCompletionCallback set_script_callback; |
| 136 rv = resolver->SetPacScriptByData("pac script bytes", &set_script_callback); |
| 137 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 138 EXPECT_EQ(OK, set_script_callback.WaitForResult()); |
| 139 EXPECT_EQ("pac script bytes", mock->last_pac_bytes()); |
| 133 | 140 |
| 134 // Start request 0. | 141 // Start request 0. |
| 135 TestCompletionCallback callback0; | 142 TestCompletionCallback callback0; |
| 136 ProxyInfo results0; | 143 ProxyInfo results0; |
| 137 rv = resolver->GetProxyForURL( | 144 rv = resolver->GetProxyForURL( |
| 138 GURL("http://request0"), &results0, &callback0, NULL); | 145 GURL("http://request0"), &results0, &callback0, NULL); |
| 139 EXPECT_EQ(ERR_IO_PENDING, rv); | 146 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 140 | 147 |
| 141 // Wait for request 0 to finish. | 148 // Wait for request 0 to finish. |
| 142 rv = callback0.WaitForResult(); | 149 rv = callback0.WaitForResult(); |
| 143 EXPECT_EQ(0, rv); | 150 EXPECT_EQ(0, rv); |
| 144 EXPECT_EQ("PROXY request0:80", results0.ToPacString()); | 151 EXPECT_EQ("PROXY request0:80", results0.ToPacString()); |
| 145 | 152 |
| 146 // Verify that the data from SetPacScriptByData() reached the resolver. | |
| 147 // (Since we waited for the first request to complete, we are guaranteed | |
| 148 // that the earlier post completed). | |
| 149 EXPECT_EQ("pac script bytes", mock->last_pac_bytes()); | |
| 150 | |
| 151 // Start 3 more requests (request1 to request3). | 153 // Start 3 more requests (request1 to request3). |
| 152 | 154 |
| 153 TestCompletionCallback callback1; | 155 TestCompletionCallback callback1; |
| 154 ProxyInfo results1; | 156 ProxyInfo results1; |
| 155 rv = resolver->GetProxyForURL( | 157 rv = resolver->GetProxyForURL( |
| 156 GURL("http://request1"), &results1, &callback1, NULL); | 158 GURL("http://request1"), &results1, &callback1, NULL); |
| 157 EXPECT_EQ(ERR_IO_PENDING, rv); | 159 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 158 | 160 |
| 159 TestCompletionCallback callback2; | 161 TestCompletionCallback callback2; |
| 160 ProxyInfo results2; | 162 ProxyInfo results2; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 | 304 |
| 303 // Give any posted tasks a chance to run (in case there is badness). | 305 // Give any posted tasks a chance to run (in case there is badness). |
| 304 MessageLoop::current()->RunAllPending(); | 306 MessageLoop::current()->RunAllPending(); |
| 305 | 307 |
| 306 // Check that none of the outstanding requests were completed. | 308 // Check that none of the outstanding requests were completed. |
| 307 EXPECT_FALSE(callback0.have_result()); | 309 EXPECT_FALSE(callback0.have_result()); |
| 308 EXPECT_FALSE(callback1.have_result()); | 310 EXPECT_FALSE(callback1.have_result()); |
| 309 EXPECT_FALSE(callback2.have_result()); | 311 EXPECT_FALSE(callback2.have_result()); |
| 310 } | 312 } |
| 311 | 313 |
| 314 // Cancel an outstanding call to SetPacScriptByData(). |
| 315 TEST(SingleThreadedProxyResolverTest, CancelSetPacScript) { |
| 316 BlockableProxyResolver* mock = new BlockableProxyResolver; |
| 317 scoped_ptr<SingleThreadedProxyResolver> resolver( |
| 318 new SingleThreadedProxyResolver(mock)); |
| 319 |
| 320 int rv; |
| 321 |
| 322 // Block the proxy resolver, so no request can complete. |
| 323 mock->Block(); |
| 324 |
| 325 // Start request 0. |
| 326 ProxyResolver::RequestHandle request0; |
| 327 TestCompletionCallback callback0; |
| 328 ProxyInfo results0; |
| 329 rv = resolver->GetProxyForURL( |
| 330 GURL("http://request0"), &results0, &callback0, &request0); |
| 331 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 332 |
| 333 // Wait until requests 0 reaches the worker thread. |
| 334 mock->WaitUntilBlocked(); |
| 335 |
| 336 TestCompletionCallback set_pac_script_callback; |
| 337 rv = resolver->SetPacScriptByData("data", &set_pac_script_callback); |
| 338 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 339 |
| 340 // Cancel the SetPacScriptByData request (it can't have finished yet, |
| 341 // since the single-thread is currently blocked). |
| 342 resolver->CancelSetPacScript(); |
| 343 |
| 344 // Start 1 more request. |
| 345 |
| 346 TestCompletionCallback callback1; |
| 347 ProxyInfo results1; |
| 348 rv = resolver->GetProxyForURL( |
| 349 GURL("http://request1"), &results1, &callback1, NULL); |
| 350 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 351 |
| 352 // Unblock the worker thread so the requests can continue running. |
| 353 mock->Unblock(); |
| 354 |
| 355 // Wait for requests 0 and 1 to finish. |
| 356 |
| 357 rv = callback0.WaitForResult(); |
| 358 EXPECT_EQ(0, rv); |
| 359 EXPECT_EQ("PROXY request0:80", results0.ToPacString()); |
| 360 |
| 361 rv = callback1.WaitForResult(); |
| 362 EXPECT_EQ(1, rv); |
| 363 EXPECT_EQ("PROXY request1:80", results1.ToPacString()); |
| 364 |
| 365 // The SetPacScript callback should never have been completed. |
| 366 EXPECT_FALSE(set_pac_script_callback.have_result()); |
| 367 } |
| 368 |
| 312 } // namespace | 369 } // namespace |
| 313 } // namespace net | 370 } // namespace net |
| OLD | NEW |