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

Side by Side Diff: chrome/browser/devtools/devtools_network_controller_unittest.cc

Issue 342473004: DevTools: make network conditions emulation scoped (browser) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 6 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 <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
OLDNEW
« no previous file with comments | « chrome/browser/devtools/devtools_network_controller.cc ('k') | chrome/browser/devtools/devtools_network_interceptor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698