OLD | NEW |
| (Empty) |
1 // Copyright (c) 2006-2008 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 "base/string_util.h" | |
6 #include "net/http/winhttp_request_throttle.h" | |
7 #include "testing/gtest/include/gtest/gtest.h" | |
8 | |
9 namespace { | |
10 | |
11 // Converts an int i to an HINTERNET (void *) request handle. | |
12 HINTERNET RequestHandle(int i) { | |
13 return reinterpret_cast<HINTERNET>(static_cast<intptr_t>(i)); | |
14 } | |
15 | |
16 class MockRequestThrottle : public net::WinHttpRequestThrottle { | |
17 public: | |
18 MockRequestThrottle() : last_sent_request_(NULL) { } | |
19 | |
20 // The request handle of the last sent request. This allows us to determine | |
21 // whether a submitted request was sent or queued. | |
22 HINTERNET last_sent_request() const { return last_sent_request_; } | |
23 | |
24 protected: | |
25 virtual BOOL SendRequest(HINTERNET request_handle, | |
26 DWORD total_size, | |
27 DWORD_PTR context, | |
28 bool report_async_error) { | |
29 last_sent_request_ = request_handle; | |
30 return TRUE; | |
31 } | |
32 | |
33 private: | |
34 HINTERNET last_sent_request_; | |
35 | |
36 DISALLOW_EVIL_CONSTRUCTORS(MockRequestThrottle); | |
37 }; | |
38 | |
39 } // namespace | |
40 | |
41 namespace net { | |
42 | |
43 TEST(WinHttpRequestThrottleTest, OneServer) { | |
44 MockRequestThrottle throttle; | |
45 std::string server("http://www.foo.com"); | |
46 HINTERNET request_handle; | |
47 | |
48 // Submit 20 requests to the request throttle. | |
49 // Expected outcome: 6 requests should be in progress, and requests 7-20 | |
50 // should be queued. | |
51 for (int i = 1; i <= 20; i++) { | |
52 request_handle = RequestHandle(i); | |
53 EXPECT_TRUE(throttle.SubmitRequest(server, request_handle, 0, 0)); | |
54 if (i <= 6) | |
55 EXPECT_EQ(request_handle, throttle.last_sent_request()); | |
56 else | |
57 EXPECT_EQ(RequestHandle(6), throttle.last_sent_request()); | |
58 } | |
59 | |
60 // Notify the request throttle of the completion of 10 requests. | |
61 // Expected outcome: 6 requests should be in progress, and requests 17-20 | |
62 // should be queued. | |
63 for (int j = 0; j < 10; j++) { | |
64 throttle.NotifyRequestDone(server); | |
65 EXPECT_EQ(RequestHandle(7 + j), throttle.last_sent_request()); | |
66 } | |
67 | |
68 // Remove request 17, which is queued. | |
69 // Expected outcome: Requests 18-20 should remain queued. | |
70 request_handle = RequestHandle(17); | |
71 throttle.RemoveRequest(server, request_handle); | |
72 EXPECT_EQ(RequestHandle(16), throttle.last_sent_request()); | |
73 | |
74 // Remove request 16, which is in progress. | |
75 // Expected outcome: The request throttle should send request 18. | |
76 // Requests 19-20 should remained queued. | |
77 request_handle = RequestHandle(16); | |
78 throttle.RemoveRequest(server, request_handle); | |
79 EXPECT_EQ(RequestHandle(18), throttle.last_sent_request()); | |
80 | |
81 // Notify the request throttle of the completion of the remaining | |
82 // 8 requests. | |
83 for (int j = 0; j < 8; j++) { | |
84 throttle.NotifyRequestDone(server); | |
85 if (j < 2) | |
86 EXPECT_EQ(RequestHandle(19 + j), throttle.last_sent_request()); | |
87 else | |
88 EXPECT_EQ(RequestHandle(20), throttle.last_sent_request()); | |
89 } | |
90 } | |
91 | |
92 // Submit requests to a large number (> 64) of servers to force the garbage | |
93 // collection of idle PerServerThrottles. | |
94 TEST(WinHttpRequestThrottleTest, GarbageCollect) { | |
95 MockRequestThrottle throttle; | |
96 for (int i = 0; i < 150; i++) { | |
97 std::string server("http://www.foo"); | |
98 server.append(IntToString(i)); | |
99 server.append(".com"); | |
100 throttle.SubmitRequest(server, RequestHandle(1), 0, 0); | |
101 throttle.NotifyRequestDone(server); | |
102 if (i < 64) | |
103 EXPECT_EQ(i + 1, throttle.throttles_.size()); | |
104 else if (i < 129) | |
105 EXPECT_EQ(i - 64, throttle.throttles_.size()); | |
106 else | |
107 EXPECT_EQ(i - 129, throttle.throttles_.size()); | |
108 } | |
109 } | |
110 | |
111 } // namespace net | |
112 | |
OLD | NEW |