| Index: net/socket/client_socket_pool_base_unittest.cc
|
| ===================================================================
|
| --- net/socket/client_socket_pool_base_unittest.cc (revision 90551)
|
| +++ net/socket/client_socket_pool_base_unittest.cc (working copy)
|
| @@ -45,12 +45,14 @@
|
|
|
| class MockClientSocket : public StreamSocket {
|
| public:
|
| - MockClientSocket() : connected_(false), was_used_to_convey_data_(false) {}
|
| + MockClientSocket() : connected_(false), was_used_to_convey_data_(false),
|
| + num_bytes_read_(0) {}
|
|
|
| // Socket methods:
|
| virtual int Read(
|
| - IOBuffer* /* buf */, int /* len */, CompletionCallback* /* callback */) {
|
| - return ERR_UNEXPECTED;
|
| + IOBuffer* /* buf */, int len, CompletionCallback* /* callback */) {
|
| + num_bytes_read_ += len;
|
| + return len;
|
| }
|
|
|
| virtual int Write(
|
| @@ -86,13 +88,22 @@
|
|
|
| virtual void SetSubresourceSpeculation() {}
|
| virtual void SetOmniboxSpeculation() {}
|
| - virtual bool WasEverUsed() const { return was_used_to_convey_data_; }
|
| + virtual bool WasEverUsed() const {
|
| + return was_used_to_convey_data_ || num_bytes_read_ > 0;
|
| + }
|
| virtual bool UsingTCPFastOpen() const { return false; }
|
| + virtual int64 NumBytesRead() const { return num_bytes_read_; }
|
| + virtual base::TimeDelta GetConnectTimeMicros() const {
|
| + static const base::TimeDelta kDummyConnectTimeMicros =
|
| + base::TimeDelta::FromMicroseconds(10);
|
| + return kDummyConnectTimeMicros; // Dummy value.
|
| + }
|
|
|
| private:
|
| bool connected_;
|
| BoundNetLog net_log_;
|
| bool was_used_to_convey_data_;
|
| + int num_bytes_read_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
|
| };
|
| @@ -604,6 +615,71 @@
|
| ClientSocketPoolTest test_base_;
|
| };
|
|
|
| +TEST_F(ClientSocketPoolBaseTest, AssignIdleSocketToGroup_WarmestSocket) {
|
| + CreatePool(4, 4);
|
| + net::SetSocketReusePolicy(0);
|
| +
|
| + EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
|
| + EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
|
| + EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
|
| + EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
|
| +
|
| + std::map<int, StreamSocket*> sockets_;
|
| + for (size_t i = 0; i < test_base_.requests_size(); i++) {
|
| + TestSocketRequest* req = test_base_.request(i);
|
| + StreamSocket* s = req->handle()->socket();
|
| + MockClientSocket* sock = static_cast<MockClientSocket*>(s);
|
| + CHECK(sock);
|
| + sockets_[i] = sock;
|
| + sock->Read(NULL, 1024 - i, NULL);
|
| + }
|
| +
|
| + ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
|
| +
|
| + EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
|
| + TestSocketRequest* req = test_base_.request(test_base_.requests_size() - 1);
|
| +
|
| + // First socket is warmest.
|
| + EXPECT_EQ(sockets_[0], req->handle()->socket());
|
| +
|
| + // Test that NumBytes are as expected.
|
| + EXPECT_EQ(1024, sockets_[0]->NumBytesRead());
|
| + EXPECT_EQ(1023, sockets_[1]->NumBytesRead());
|
| + EXPECT_EQ(1022, sockets_[2]->NumBytesRead());
|
| + EXPECT_EQ(1021, sockets_[3]->NumBytesRead());
|
| +
|
| + ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
|
| +}
|
| +
|
| +TEST_F(ClientSocketPoolBaseTest, AssignIdleSocketToGroup_LastAccessedSocket) {
|
| + CreatePool(4, 4);
|
| + net::SetSocketReusePolicy(2);
|
| +
|
| + EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
|
| + EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
|
| + EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
|
| + EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
|
| +
|
| + std::map<int, StreamSocket*> sockets_;
|
| + for (size_t i = 0; i < test_base_.requests_size(); i++) {
|
| + TestSocketRequest* req = test_base_.request(i);
|
| + StreamSocket* s = req->handle()->socket();
|
| + MockClientSocket* sock = static_cast<MockClientSocket*>(s);
|
| + CHECK(sock);
|
| + sockets_[i] = sock;
|
| + sock->Read(NULL, 1024 - i, NULL);
|
| + }
|
| +
|
| + ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
|
| +
|
| + EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
|
| + TestSocketRequest* req = test_base_.request(test_base_.requests_size() - 1);
|
| +
|
| + // Last socket is most recently accessed.
|
| + EXPECT_EQ(sockets_[3], req->handle()->socket());
|
| + ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
|
| +}
|
| +
|
| // Even though a timeout is specified, it doesn't time out on a synchronous
|
| // completion.
|
| TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
|
|
|