OLD | NEW |
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 <string> | 5 #include <string> |
6 | 6 |
7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
11 #include "chrome/browser/devtools/devtools_network_conditions.h" | 11 #include "chrome/browser/devtools/devtools_network_conditions.h" |
12 #include "chrome/browser/devtools/devtools_network_controller.h" | 12 #include "chrome/browser/devtools/devtools_network_controller.h" |
13 #include "chrome/browser/devtools/devtools_network_transaction.h" | 13 #include "chrome/browser/devtools/devtools_network_transaction.h" |
14 #include "net/http/http_transaction_test_util.h" | 14 #include "net/http/http_transaction_test_util.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 #include "url/gurl.h" | 16 #include "url/gurl.h" |
17 | 17 |
18 namespace test { | 18 namespace test { |
19 | 19 |
20 const char kHttpDotCom[] = "http://dot.com"; | 20 const char kClientId[] = "42"; |
21 const char kHttpDotOrg[] = "http://dot.org"; | 21 const char kAnotherClientId[] = "24"; |
22 const char kCom[] = "com"; | |
23 | 22 |
24 class TestCallback { | 23 class TestCallback { |
25 public: | 24 public: |
26 TestCallback() : run_count_(0), value_(0) {} | 25 TestCallback() : run_count_(0), value_(0) {} |
27 void Run(int value) { | 26 void Run(int value) { |
28 run_count_++; | 27 run_count_++; |
29 value_ = value; | 28 value_ = value; |
30 } | 29 } |
31 int run_count() { return run_count_; } | 30 int run_count() { return run_count_; } |
32 int value() { return value_; } | 31 int value() { return value_; } |
33 | 32 |
34 private: | 33 private: |
35 int run_count_; | 34 int run_count_; |
36 int value_; | 35 int value_; |
37 }; | 36 }; |
38 | 37 |
39 class DevToolsNetworkControllerHelper { | 38 class DevToolsNetworkControllerHelper { |
40 public: | 39 public: |
41 DevToolsNetworkControllerHelper() : | 40 DevToolsNetworkControllerHelper() : |
42 completion_callback_( | 41 completion_callback_( |
43 base::Bind(&TestCallback::Run, base::Unretained(&callback_))), | 42 base::Bind(&TestCallback::Run, base::Unretained(&callback_))), |
44 mock_transaction_(kSimpleGET_Transaction), | 43 mock_transaction_(kSimpleGET_Transaction), |
45 buffer_(new net::IOBuffer(64)) { | 44 buffer_(new net::IOBuffer(64)) { |
46 mock_transaction_.test_mode = TEST_MODE_SYNC_NET_START; | 45 mock_transaction_.test_mode = TEST_MODE_SYNC_NET_START; |
47 mock_transaction_.url = kHttpDotCom; | 46 mock_transaction_.url = "http://dot.com"; |
| 47 mock_transaction_.request_headers = |
| 48 "X-DevTools-Emulate-Network-Conditions-Client-Id: 42\r\n"; |
48 AddMockTransaction(&mock_transaction_); | 49 AddMockTransaction(&mock_transaction_); |
49 | 50 |
50 scoped_ptr<net::HttpTransaction> network_transaction; | 51 scoped_ptr<net::HttpTransaction> network_transaction; |
51 network_layer_.CreateTransaction( | 52 network_layer_.CreateTransaction( |
52 net::DEFAULT_PRIORITY, &network_transaction); | 53 net::DEFAULT_PRIORITY, &network_transaction); |
53 transaction_.reset(new DevToolsNetworkTransaction( | 54 transaction_.reset(new DevToolsNetworkTransaction( |
54 &controller_, network_transaction.Pass())); | 55 &controller_, network_transaction.Pass())); |
55 } | 56 } |
56 | 57 |
57 net::HttpRequestInfo* GetRequest() { | 58 net::HttpRequestInfo* GetRequest() { |
58 if (!request_) | 59 if (!request_) |
59 request_.reset(new MockHttpRequest(mock_transaction_)); | 60 request_.reset(new MockHttpRequest(mock_transaction_)); |
60 return request_.get(); | 61 return request_.get(); |
61 } | 62 } |
62 | 63 |
63 void SetNetworkState(bool offline) { | 64 void SetNetworkState(const std::string id, bool offline) { |
64 std::vector<std::string> domains; | |
65 domains.push_back(kCom); | |
66 scoped_refptr<DevToolsNetworkConditions> conditions; | 65 scoped_refptr<DevToolsNetworkConditions> conditions; |
67 if (offline) | 66 if (offline) |
68 conditions = new DevToolsNetworkConditions(domains, 0.0); | 67 conditions = new DevToolsNetworkConditions(0, 0, 0); |
69 controller_.SetNetworkStateOnIO(conditions); | 68 controller_.SetNetworkStateOnIO(id, conditions); |
70 } | 69 } |
71 | 70 |
72 int Start() { | 71 int Start() { |
73 return transaction_->Start( | 72 return transaction_->Start( |
74 GetRequest(), completion_callback_, net::BoundNetLog()); | 73 GetRequest(), completion_callback_, net::BoundNetLog()); |
75 } | 74 } |
76 | 75 |
77 int Read() { | 76 int Read() { |
78 return transaction_->Read(buffer_.get(), 64, completion_callback_); | 77 return transaction_->Read(buffer_.get(), 64, completion_callback_); |
79 } | 78 } |
(...skipping 15 matching lines...) Expand all Loading... |
95 MockTransaction mock_transaction_; | 94 MockTransaction mock_transaction_; |
96 DevToolsNetworkController controller_; | 95 DevToolsNetworkController controller_; |
97 scoped_ptr<DevToolsNetworkTransaction> transaction_; | 96 scoped_ptr<DevToolsNetworkTransaction> transaction_; |
98 scoped_refptr<net::IOBuffer> buffer_; | 97 scoped_refptr<net::IOBuffer> buffer_; |
99 scoped_ptr<MockHttpRequest> request_; | 98 scoped_ptr<MockHttpRequest> request_; |
100 }; | 99 }; |
101 | 100 |
102 TEST(DevToolsNetworkControllerTest, SingleDisableEnable) { | 101 TEST(DevToolsNetworkControllerTest, SingleDisableEnable) { |
103 DevToolsNetworkControllerHelper helper; | 102 DevToolsNetworkControllerHelper helper; |
104 DevToolsNetworkController* controller = helper.controller(); | 103 DevToolsNetworkController* controller = helper.controller(); |
105 net::HttpRequestInfo* request = helper.GetRequest(); | 104 helper.Start(); |
106 | 105 |
107 EXPECT_FALSE(controller->ShouldFail(request)); | 106 EXPECT_FALSE(controller->ShouldFail(helper.transaction())); |
108 helper.SetNetworkState(true); | 107 helper.SetNetworkState(kClientId, true); |
109 EXPECT_TRUE(controller->ShouldFail(request)); | 108 EXPECT_TRUE(controller->ShouldFail(helper.transaction())); |
110 helper.SetNetworkState(false); | 109 helper.SetNetworkState(kClientId, false); |
111 EXPECT_FALSE(controller->ShouldFail(request)); | 110 EXPECT_FALSE(controller->ShouldFail(helper.transaction())); |
| 111 |
| 112 base::RunLoop().RunUntilIdle(); |
| 113 } |
| 114 |
| 115 TEST(DevToolsNetworkControllerTest, RealmIsolation) { |
| 116 DevToolsNetworkControllerHelper helper; |
| 117 DevToolsNetworkController* controller = helper.controller(); |
| 118 helper.Start(); |
| 119 |
| 120 EXPECT_FALSE(controller->ShouldFail(helper.transaction())); |
| 121 helper.SetNetworkState(kAnotherClientId, true); |
| 122 EXPECT_FALSE(controller->ShouldFail(helper.transaction())); |
| 123 helper.SetNetworkState(kClientId, true); |
| 124 EXPECT_TRUE(controller->ShouldFail(helper.transaction())); |
| 125 |
| 126 helper.SetNetworkState(kAnotherClientId, false); |
| 127 helper.SetNetworkState(kClientId, false); |
| 128 base::RunLoop().RunUntilIdle(); |
112 } | 129 } |
113 | 130 |
114 TEST(DevToolsNetworkControllerTest, FailOnStart) { | 131 TEST(DevToolsNetworkControllerTest, FailOnStart) { |
115 DevToolsNetworkControllerHelper helper; | 132 DevToolsNetworkControllerHelper helper; |
116 helper.SetNetworkState(true); | 133 helper.SetNetworkState(kClientId, true); |
117 | 134 |
118 int rv = helper.Start(); | 135 int rv = helper.Start(); |
119 EXPECT_EQ(rv, net::ERR_INTERNET_DISCONNECTED); | 136 EXPECT_EQ(rv, net::ERR_INTERNET_DISCONNECTED); |
120 | 137 |
121 base::RunLoop().RunUntilIdle(); | 138 base::RunLoop().RunUntilIdle(); |
122 EXPECT_EQ(helper.callback()->run_count(), 0); | 139 EXPECT_EQ(helper.callback()->run_count(), 0); |
| 140 |
| 141 helper.SetNetworkState(kClientId, false); |
123 } | 142 } |
124 | 143 |
125 TEST(DevToolsNetworkControllerTest, FailRunningTransaction) { | 144 TEST(DevToolsNetworkControllerTest, FailRunningTransaction) { |
126 DevToolsNetworkControllerHelper helper; | 145 DevToolsNetworkControllerHelper helper; |
127 TestCallback* callback = helper.callback(); | 146 TestCallback* callback = helper.callback(); |
128 | 147 |
129 int rv = helper.Start(); | 148 int rv = helper.Start(); |
130 EXPECT_EQ(rv, net::OK); | 149 EXPECT_EQ(rv, net::OK); |
131 | 150 |
132 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(64)); | 151 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(64)); |
133 rv = helper.Read(); | 152 rv = helper.Read(); |
134 EXPECT_EQ(rv, net::ERR_IO_PENDING); | 153 EXPECT_EQ(rv, net::ERR_IO_PENDING); |
135 EXPECT_EQ(callback->run_count(), 0); | 154 EXPECT_EQ(callback->run_count(), 0); |
136 | 155 |
137 helper.SetNetworkState(true); | 156 helper.SetNetworkState(kClientId, true); |
138 EXPECT_EQ(callback->run_count(), 1); | 157 EXPECT_EQ(callback->run_count(), 1); |
139 EXPECT_EQ(callback->value(), net::ERR_INTERNET_DISCONNECTED); | 158 EXPECT_EQ(callback->value(), net::ERR_INTERNET_DISCONNECTED); |
140 | 159 |
141 // Wait until HttpTrancation completes reading and invokes callback. | 160 // Wait until HttpTrancation completes reading and invokes callback. |
142 // DevToolsNetworkTransaction should ignore callback, because it has | 161 // DevToolsNetworkTransaction should ignore callback, because it has |
143 // reported network error already. | 162 // reported network error already. |
144 base::RunLoop().RunUntilIdle(); | 163 base::RunLoop().RunUntilIdle(); |
145 EXPECT_EQ(callback->run_count(), 1); | 164 EXPECT_EQ(callback->run_count(), 1); |
146 | 165 |
147 // Check that transaction in not failed second time. | 166 // Check that transaction in not failed second time. |
148 helper.SetNetworkState(false); | 167 helper.SetNetworkState(kClientId, false); |
149 helper.SetNetworkState(true); | 168 helper.SetNetworkState(kClientId, true); |
150 EXPECT_EQ(callback->run_count(), 1); | 169 EXPECT_EQ(callback->run_count(), 1); |
| 170 |
| 171 helper.SetNetworkState(kClientId, false); |
151 } | 172 } |
152 | 173 |
153 TEST(DevToolsNetworkControllerTest, ReadAfterFail) { | 174 TEST(DevToolsNetworkControllerTest, ReadAfterFail) { |
154 DevToolsNetworkControllerHelper helper; | 175 DevToolsNetworkControllerHelper helper; |
155 | 176 |
156 int rv = helper.Start(); | 177 int rv = helper.Start(); |
157 EXPECT_EQ(rv, net::OK); | 178 EXPECT_EQ(rv, net::OK); |
158 EXPECT_TRUE(helper.transaction()->request()); | 179 EXPECT_TRUE(helper.transaction()->request()); |
159 | 180 |
160 helper.SetNetworkState(true); | 181 helper.SetNetworkState(kClientId, true); |
161 EXPECT_TRUE(helper.transaction()->failed()); | 182 EXPECT_TRUE(helper.transaction()->failed()); |
162 | 183 |
163 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(64)); | 184 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(64)); |
164 rv = helper.Read(); | 185 rv = helper.Read(); |
165 EXPECT_EQ(rv, net::ERR_INTERNET_DISCONNECTED); | 186 EXPECT_EQ(rv, net::ERR_INTERNET_DISCONNECTED); |
166 | 187 |
167 // Check that callback is never invoked. | 188 // Check that callback is never invoked. |
168 base::RunLoop().RunUntilIdle(); | 189 base::RunLoop().RunUntilIdle(); |
169 EXPECT_EQ(helper.callback()->run_count(), 0); | 190 EXPECT_EQ(helper.callback()->run_count(), 0); |
| 191 |
| 192 helper.SetNetworkState(kClientId, false); |
170 } | 193 } |
171 | 194 |
172 TEST(DevToolsNetworkControllerTest, AllowsDevToolsRequests) { | 195 TEST(DevToolsNetworkControllerTest, AllowsDevToolsRequests) { |
173 DevToolsNetworkControllerHelper helper; | 196 DevToolsNetworkControllerHelper helper; |
174 helper.mock_transaction()->request_headers = | 197 helper.mock_transaction()->request_headers = |
| 198 "X-DevTools-Emulate-Network-Conditions-Client-Id: 42\r\n" |
175 "X-DevTools-Request-Initiator: frontend\r\n"; | 199 "X-DevTools-Request-Initiator: frontend\r\n"; |
176 DevToolsNetworkController* controller = helper.controller(); | 200 DevToolsNetworkController* controller = helper.controller(); |
177 net::HttpRequestInfo* request = helper.GetRequest(); | |
178 | 201 |
179 EXPECT_FALSE(controller->ShouldFail(request)); | 202 EXPECT_FALSE(controller->ShouldFail(helper.transaction())); |
180 helper.SetNetworkState(true); | 203 helper.SetNetworkState(kClientId, true); |
181 EXPECT_FALSE(controller->ShouldFail(request)); | 204 EXPECT_FALSE(controller->ShouldFail(helper.transaction())); |
182 } | |
183 | 205 |
184 TEST(DevToolsNetworkControllerTest, AllowsNotMatchingRequests) { | 206 helper.SetNetworkState(kClientId, false); |
185 DevToolsNetworkControllerHelper helper; | |
186 helper.mock_transaction()->url = kHttpDotOrg; | |
187 DevToolsNetworkController* controller = helper.controller(); | |
188 net::HttpRequestInfo* request = helper.GetRequest(); | |
189 | |
190 EXPECT_FALSE(controller->ShouldFail(request)); | |
191 helper.SetNetworkState(true); | |
192 EXPECT_FALSE(controller->ShouldFail(request)); | |
193 } | 207 } |
194 | 208 |
195 } // namespace test | 209 } // namespace test |
OLD | NEW |