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