Chromium Code Reviews| Index: net/socket/web_socket_server_socket_unittest.cc |
| diff --git a/net/socket/web_socket_server_socket_unittest.cc b/net/socket/web_socket_server_socket_unittest.cc |
| index 476fc3329d451913df957077114f3c93e6464961..cabb4b9c922bcd733a8ccc0d9f5a4c51196c3579 100644 |
| --- a/net/socket/web_socket_server_socket_unittest.cc |
| +++ b/net/socket/web_socket_server_socket_unittest.cc |
| @@ -79,16 +79,22 @@ class TestingTransportSocket : public net::Socket { |
| net::DrainableIOBuffer* sample, net::DrainableIOBuffer* answer) |
| : sample_(sample), |
| answer_(answer), |
| - final_read_callback_(NULL), |
| + old_final_read_callback_(NULL), |
| method_factory_(this) { |
| } |
| ~TestingTransportSocket() { |
| - if (final_read_callback_) { |
| + if (old_final_read_callback_) { |
| MessageLoop::current()->PostTask(FROM_HERE, |
| method_factory_.NewRunnableMethod( |
| + &TestingTransportSocket::DoOldReadCallback, |
| + old_final_read_callback_, 0)); |
| + } else if (!final_read_callback_.is_null()) { |
| + MessageLoop::current()->PostTask( |
| + FROM_HERE, |
| + method_factory_.NewRunnableMethod( |
| &TestingTransportSocket::DoReadCallback, |
| - final_read_callback_, 0)); |
| + final_read_callback_, 0)); |
| } |
| } |
| @@ -98,7 +104,28 @@ class TestingTransportSocket : public net::Socket { |
| CHECK_GT(buf_len, 0); |
| int remaining = sample_->BytesRemaining(); |
| if (remaining < 1) { |
| - if (final_read_callback_) |
| + if (old_final_read_callback_ || !final_read_callback_.is_null()) |
| + return 0; |
| + old_final_read_callback_ = callback; |
| + return net::ERR_IO_PENDING; |
| + } |
| + int lot = GetRand(1, std::min(remaining, buf_len)); |
| + std::copy(sample_->data(), sample_->data() + lot, buf->data()); |
| + sample_->DidConsume(lot); |
| + if (GetRand(0, 1)) { |
| + return lot; |
| + } |
| + MessageLoop::current()->PostTask(FROM_HERE, |
| + method_factory_.NewRunnableMethod( |
| + &TestingTransportSocket::DoOldReadCallback, callback, lot)); |
| + return net::ERR_IO_PENDING; |
| + } |
| + virtual int Read(net::IOBuffer* buf, int buf_len, |
| + const net::CompletionCallback& callback) { |
| + CHECK_GT(buf_len, 0); |
| + int remaining = sample_->BytesRemaining(); |
| + if (remaining < 1) { |
| + if (old_final_read_callback_ || !final_read_callback_.is_null()) |
| return 0; |
| final_read_callback_ = callback; |
| return net::ERR_IO_PENDING; |
| @@ -144,16 +171,26 @@ class TestingTransportSocket : public net::Socket { |
| net::DrainableIOBuffer* answer() { return answer_.get(); } |
| - void DoReadCallback(net::OldCompletionCallback* callback, int result) { |
| + void DoOldReadCallback(net::OldCompletionCallback* callback, int result) { |
| if (result == 0 && !is_closed_) { |
| MessageLoop::current()->PostTask(FROM_HERE, |
| method_factory_.NewRunnableMethod( |
| - &TestingTransportSocket::DoReadCallback, callback, 0)); |
| + &TestingTransportSocket::DoOldReadCallback, callback, 0)); |
| } else { |
| if (callback) |
| callback->Run(result); |
| } |
| } |
| + void DoReadCallback(const net::CompletionCallback& callback, int result) { |
| + if (result == 0 && !is_closed_) { |
| + MessageLoop::current()->PostTask(FROM_HERE, |
| + method_factory_.NewRunnableMethod( |
| + &TestingTransportSocket::DoReadCallback, callback, 0)); |
| + } else { |
| + if (!callback.is_null()) |
| + callback.Run(result); |
| + } |
| + } |
| void DoWriteCallback(net::OldCompletionCallback* callback, int result) { |
| if (callback) |
| @@ -169,7 +206,8 @@ class TestingTransportSocket : public net::Socket { |
| scoped_refptr<net::DrainableIOBuffer> answer_; |
| // Final read callback to report zero (zero stands for EOF). |
| - net::OldCompletionCallback* final_read_callback_; |
| + net::OldCompletionCallback* old_final_read_callback_; |
| + net::CompletionCallback final_read_callback_; |
| ScopedRunnableMethodFactory<TestingTransportSocket> method_factory_; |
|
csilv
2011/12/07 00:03:48
could we update this to a WeakFactory and get rid
James Hawkins
2011/12/07 00:19:37
Prob best done in a followup CL.
|
| }; |