| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 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 "net/http/http_pipelined_host_impl.h" | |
| 6 | |
| 7 #include "base/memory/scoped_ptr.h" | |
| 8 #include "net/http/http_pipelined_connection.h" | |
| 9 #include "net/http/http_pipelined_host_test_util.h" | |
| 10 #include "net/proxy/proxy_info.h" | |
| 11 #include "net/ssl/ssl_config_service.h" | |
| 12 #include "testing/gmock/include/gmock/gmock.h" | |
| 13 #include "testing/gtest/include/gtest/gtest.h" | |
| 14 | |
| 15 using testing::_; | |
| 16 using testing::NiceMock; | |
| 17 using testing::Ref; | |
| 18 using testing::Return; | |
| 19 using testing::ReturnNull; | |
| 20 | |
| 21 namespace net { | |
| 22 | |
| 23 namespace { | |
| 24 | |
| 25 ClientSocketHandle* kDummyConnection = | |
| 26 reinterpret_cast<ClientSocketHandle*>(84); | |
| 27 HttpPipelinedStream* kDummyStream = | |
| 28 reinterpret_cast<HttpPipelinedStream*>(42); | |
| 29 | |
| 30 class HttpPipelinedHostImplTest : public testing::Test { | |
| 31 public: | |
| 32 HttpPipelinedHostImplTest() | |
| 33 : key_(HostPortPair("host", 123)), | |
| 34 factory_(new MockPipelineFactory), // Owned by host_. | |
| 35 host_(new HttpPipelinedHostImpl(&delegate_, key_, factory_, | |
| 36 PIPELINE_CAPABLE)) { | |
| 37 } | |
| 38 | |
| 39 void SetCapability(HttpPipelinedHostCapability capability) { | |
| 40 factory_ = new MockPipelineFactory; | |
| 41 host_.reset(new HttpPipelinedHostImpl( | |
| 42 &delegate_, key_, factory_, capability)); | |
| 43 } | |
| 44 | |
| 45 MockPipeline* AddTestPipeline(int depth, bool usable, bool active) { | |
| 46 MockPipeline* pipeline = new MockPipeline(depth, usable, active); | |
| 47 EXPECT_CALL(*factory_, CreateNewPipeline(kDummyConnection, host_.get(), | |
| 48 MatchesOrigin(key_.origin()), | |
| 49 Ref(ssl_config_), Ref(proxy_info_), | |
| 50 Ref(net_log_), true, | |
| 51 kProtoSPDY3)) | |
| 52 .Times(1) | |
| 53 .WillOnce(Return(pipeline)); | |
| 54 EXPECT_CALL(*pipeline, CreateNewStream()) | |
| 55 .Times(1) | |
| 56 .WillOnce(Return(kDummyStream)); | |
| 57 EXPECT_EQ(kDummyStream, host_->CreateStreamOnNewPipeline( | |
| 58 kDummyConnection, ssl_config_, proxy_info_, net_log_, true, | |
| 59 kProtoSPDY3)); | |
| 60 return pipeline; | |
| 61 } | |
| 62 | |
| 63 void ClearTestPipeline(MockPipeline* pipeline) { | |
| 64 pipeline->SetState(0, true, true); | |
| 65 host_->OnPipelineHasCapacity(pipeline); | |
| 66 } | |
| 67 | |
| 68 NiceMock<MockHostDelegate> delegate_; | |
| 69 HttpPipelinedHost::Key key_; | |
| 70 MockPipelineFactory* factory_; | |
| 71 scoped_ptr<HttpPipelinedHostImpl> host_; | |
| 72 | |
| 73 SSLConfig ssl_config_; | |
| 74 ProxyInfo proxy_info_; | |
| 75 BoundNetLog net_log_; | |
| 76 }; | |
| 77 | |
| 78 TEST_F(HttpPipelinedHostImplTest, Delegate) { | |
| 79 EXPECT_TRUE(key_.origin().Equals(host_->GetKey().origin())); | |
| 80 } | |
| 81 | |
| 82 TEST_F(HttpPipelinedHostImplTest, OnUnusablePipelineHasCapacity) { | |
| 83 MockPipeline* pipeline = AddTestPipeline(0, false, true); | |
| 84 | |
| 85 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 86 .Times(0); | |
| 87 EXPECT_CALL(delegate_, OnHostIdle(host_.get())) | |
| 88 .Times(1); | |
| 89 host_->OnPipelineHasCapacity(pipeline); | |
| 90 } | |
| 91 | |
| 92 TEST_F(HttpPipelinedHostImplTest, OnUsablePipelineHasCapacity) { | |
| 93 MockPipeline* pipeline = AddTestPipeline(1, true, true); | |
| 94 | |
| 95 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 96 .Times(1); | |
| 97 EXPECT_CALL(delegate_, OnHostIdle(host_.get())) | |
| 98 .Times(0); | |
| 99 | |
| 100 host_->OnPipelineHasCapacity(pipeline); | |
| 101 | |
| 102 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 103 .Times(1); | |
| 104 EXPECT_CALL(delegate_, OnHostIdle(host_.get())) | |
| 105 .Times(1); | |
| 106 ClearTestPipeline(pipeline); | |
| 107 } | |
| 108 | |
| 109 TEST_F(HttpPipelinedHostImplTest, IgnoresUnusablePipeline) { | |
| 110 MockPipeline* pipeline = AddTestPipeline(1, false, true); | |
| 111 | |
| 112 EXPECT_FALSE(host_->IsExistingPipelineAvailable()); | |
| 113 EXPECT_EQ(NULL, host_->CreateStreamOnExistingPipeline()); | |
| 114 | |
| 115 ClearTestPipeline(pipeline); | |
| 116 } | |
| 117 | |
| 118 TEST_F(HttpPipelinedHostImplTest, IgnoresInactivePipeline) { | |
| 119 MockPipeline* pipeline = AddTestPipeline(1, true, false); | |
| 120 | |
| 121 EXPECT_FALSE(host_->IsExistingPipelineAvailable()); | |
| 122 EXPECT_EQ(NULL, host_->CreateStreamOnExistingPipeline()); | |
| 123 | |
| 124 ClearTestPipeline(pipeline); | |
| 125 } | |
| 126 | |
| 127 TEST_F(HttpPipelinedHostImplTest, IgnoresFullPipeline) { | |
| 128 MockPipeline* pipeline = AddTestPipeline( | |
| 129 HttpPipelinedHostImpl::max_pipeline_depth(), true, true); | |
| 130 | |
| 131 EXPECT_FALSE(host_->IsExistingPipelineAvailable()); | |
| 132 EXPECT_EQ(NULL, host_->CreateStreamOnExistingPipeline()); | |
| 133 | |
| 134 ClearTestPipeline(pipeline); | |
| 135 } | |
| 136 | |
| 137 TEST_F(HttpPipelinedHostImplTest, PicksLeastLoadedPipeline) { | |
| 138 MockPipeline* full_pipeline = AddTestPipeline( | |
| 139 HttpPipelinedHostImpl::max_pipeline_depth(), true, true); | |
| 140 MockPipeline* usable_pipeline = AddTestPipeline( | |
| 141 HttpPipelinedHostImpl::max_pipeline_depth() - 1, true, true); | |
| 142 MockPipeline* empty_pipeline = AddTestPipeline(0, true, true); | |
| 143 | |
| 144 EXPECT_TRUE(host_->IsExistingPipelineAvailable()); | |
| 145 EXPECT_CALL(*empty_pipeline, CreateNewStream()) | |
| 146 .Times(1) | |
| 147 .WillOnce(ReturnNull()); | |
| 148 EXPECT_EQ(NULL, host_->CreateStreamOnExistingPipeline()); | |
| 149 | |
| 150 ClearTestPipeline(full_pipeline); | |
| 151 ClearTestPipeline(usable_pipeline); | |
| 152 ClearTestPipeline(empty_pipeline); | |
| 153 } | |
| 154 | |
| 155 TEST_F(HttpPipelinedHostImplTest, OpensUpOnPipelineSuccess) { | |
| 156 SetCapability(PIPELINE_UNKNOWN); | |
| 157 MockPipeline* pipeline = AddTestPipeline(1, true, true); | |
| 158 | |
| 159 EXPECT_EQ(NULL, host_->CreateStreamOnExistingPipeline()); | |
| 160 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 161 .Times(1); | |
| 162 host_->OnPipelineFeedback(pipeline, HttpPipelinedConnection::OK); | |
| 163 | |
| 164 EXPECT_CALL(*pipeline, CreateNewStream()) | |
| 165 .Times(1) | |
| 166 .WillOnce(Return(kDummyStream)); | |
| 167 EXPECT_EQ(kDummyStream, host_->CreateStreamOnExistingPipeline()); | |
| 168 | |
| 169 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 170 .Times(1); | |
| 171 ClearTestPipeline(pipeline); | |
| 172 } | |
| 173 | |
| 174 TEST_F(HttpPipelinedHostImplTest, OpensAllPipelinesOnPipelineSuccess) { | |
| 175 SetCapability(PIPELINE_UNKNOWN); | |
| 176 MockPipeline* pipeline1 = AddTestPipeline(1, false, true); | |
| 177 MockPipeline* pipeline2 = AddTestPipeline(1, true, true); | |
| 178 | |
| 179 EXPECT_EQ(NULL, host_->CreateStreamOnExistingPipeline()); | |
| 180 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 181 .Times(1); | |
| 182 host_->OnPipelineFeedback(pipeline1, HttpPipelinedConnection::OK); | |
| 183 | |
| 184 EXPECT_CALL(*pipeline2, CreateNewStream()) | |
| 185 .Times(1) | |
| 186 .WillOnce(Return(kDummyStream)); | |
| 187 EXPECT_EQ(kDummyStream, host_->CreateStreamOnExistingPipeline()); | |
| 188 | |
| 189 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 190 .Times(2); | |
| 191 ClearTestPipeline(pipeline1); | |
| 192 ClearTestPipeline(pipeline2); | |
| 193 } | |
| 194 | |
| 195 TEST_F(HttpPipelinedHostImplTest, ShutsDownOnOldVersion) { | |
| 196 SetCapability(PIPELINE_UNKNOWN); | |
| 197 MockPipeline* pipeline = AddTestPipeline(1, true, true); | |
| 198 | |
| 199 EXPECT_EQ(NULL, host_->CreateStreamOnExistingPipeline()); | |
| 200 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 201 .Times(0); | |
| 202 EXPECT_CALL(delegate_, | |
| 203 OnHostDeterminedCapability(host_.get(), PIPELINE_INCAPABLE)) | |
| 204 .Times(1); | |
| 205 host_->OnPipelineFeedback(pipeline, | |
| 206 HttpPipelinedConnection::OLD_HTTP_VERSION); | |
| 207 | |
| 208 ClearTestPipeline(pipeline); | |
| 209 EXPECT_EQ(NULL, host_->CreateStreamOnNewPipeline( | |
| 210 kDummyConnection, ssl_config_, proxy_info_, net_log_, true, | |
| 211 kProtoSPDY3)); | |
| 212 } | |
| 213 | |
| 214 TEST_F(HttpPipelinedHostImplTest, ShutsDownOnAuthenticationRequired) { | |
| 215 SetCapability(PIPELINE_UNKNOWN); | |
| 216 MockPipeline* pipeline = AddTestPipeline(1, true, true); | |
| 217 | |
| 218 EXPECT_EQ(NULL, host_->CreateStreamOnExistingPipeline()); | |
| 219 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 220 .Times(0); | |
| 221 EXPECT_CALL(delegate_, | |
| 222 OnHostDeterminedCapability(host_.get(), PIPELINE_INCAPABLE)) | |
| 223 .Times(1); | |
| 224 host_->OnPipelineFeedback(pipeline, | |
| 225 HttpPipelinedConnection::AUTHENTICATION_REQUIRED); | |
| 226 | |
| 227 ClearTestPipeline(pipeline); | |
| 228 EXPECT_EQ(NULL, host_->CreateStreamOnNewPipeline( | |
| 229 kDummyConnection, ssl_config_, proxy_info_, net_log_, true, | |
| 230 kProtoSPDY3)); | |
| 231 } | |
| 232 | |
| 233 TEST_F(HttpPipelinedHostImplTest, ConnectionCloseHasNoEffect) { | |
| 234 SetCapability(PIPELINE_UNKNOWN); | |
| 235 MockPipeline* pipeline = AddTestPipeline(1, true, true); | |
| 236 | |
| 237 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 238 .Times(0); | |
| 239 EXPECT_CALL(delegate_, OnHostDeterminedCapability(host_.get(), _)) | |
| 240 .Times(0); | |
| 241 host_->OnPipelineFeedback(pipeline, | |
| 242 HttpPipelinedConnection::MUST_CLOSE_CONNECTION); | |
| 243 EXPECT_EQ(NULL, host_->CreateStreamOnExistingPipeline()); | |
| 244 | |
| 245 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 246 .Times(1); | |
| 247 ClearTestPipeline(pipeline); | |
| 248 } | |
| 249 | |
| 250 TEST_F(HttpPipelinedHostImplTest, SuccessesLeadToCapable) { | |
| 251 SetCapability(PIPELINE_UNKNOWN); | |
| 252 MockPipeline* pipeline = AddTestPipeline(1, true, true); | |
| 253 | |
| 254 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 255 .Times(1); | |
| 256 EXPECT_CALL(delegate_, | |
| 257 OnHostDeterminedCapability(host_.get(), PIPELINE_CAPABLE)) | |
| 258 .Times(1); | |
| 259 host_->OnPipelineFeedback(pipeline, HttpPipelinedConnection::OK); | |
| 260 | |
| 261 pipeline->SetState(3, true, true); | |
| 262 host_->OnPipelineFeedback(pipeline, HttpPipelinedConnection::OK); | |
| 263 host_->OnPipelineFeedback(pipeline, HttpPipelinedConnection::OK); | |
| 264 | |
| 265 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 266 .Times(1); | |
| 267 ClearTestPipeline(pipeline); | |
| 268 } | |
| 269 | |
| 270 TEST_F(HttpPipelinedHostImplTest, IgnoresSocketErrorOnFirstRequest) { | |
| 271 SetCapability(PIPELINE_UNKNOWN); | |
| 272 MockPipeline* pipeline = AddTestPipeline(1, true, true); | |
| 273 | |
| 274 EXPECT_CALL(delegate_, OnHostDeterminedCapability(host_.get(), _)) | |
| 275 .Times(0); | |
| 276 host_->OnPipelineFeedback(pipeline, | |
| 277 HttpPipelinedConnection::PIPELINE_SOCKET_ERROR); | |
| 278 | |
| 279 EXPECT_CALL(delegate_, OnHostHasAdditionalCapacity(host_.get())) | |
| 280 .Times(1); | |
| 281 host_->OnPipelineFeedback(pipeline, | |
| 282 HttpPipelinedConnection::OK); | |
| 283 | |
| 284 EXPECT_CALL(delegate_, | |
| 285 OnHostDeterminedCapability(host_.get(), PIPELINE_INCAPABLE)) | |
| 286 .Times(1); | |
| 287 host_->OnPipelineFeedback(pipeline, | |
| 288 HttpPipelinedConnection::PIPELINE_SOCKET_ERROR); | |
| 289 | |
| 290 ClearTestPipeline(pipeline); | |
| 291 } | |
| 292 | |
| 293 TEST_F(HttpPipelinedHostImplTest, HeedsSocketErrorOnFirstRequestWithPipeline) { | |
| 294 SetCapability(PIPELINE_UNKNOWN); | |
| 295 MockPipeline* pipeline = AddTestPipeline(2, true, true); | |
| 296 | |
| 297 EXPECT_CALL(delegate_, | |
| 298 OnHostDeterminedCapability(host_.get(), PIPELINE_INCAPABLE)) | |
| 299 .Times(1); | |
| 300 host_->OnPipelineFeedback(pipeline, | |
| 301 HttpPipelinedConnection::PIPELINE_SOCKET_ERROR); | |
| 302 | |
| 303 ClearTestPipeline(pipeline); | |
| 304 } | |
| 305 | |
| 306 } // anonymous namespace | |
| 307 | |
| 308 } // namespace net | |
| OLD | NEW |