Index: net/http/http_network_transaction_unittest.cc |
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc |
index 617a6b50d7c22240a3073b48c7eb5c1eafa189dd..c60d6ecaea7e6b0360d2aeb48175a2aebe6b8455 100644 |
--- a/net/http/http_network_transaction_unittest.cc |
+++ b/net/http/http_network_transaction_unittest.cc |
@@ -7771,6 +7771,62 @@ TEST_P(HttpNetworkTransactionTest, UnreadableUploadFileAfterAuthRestart) { |
base::DeleteFile(temp_file, false); |
} |
+TEST_P(HttpNetworkTransactionTest, CancelDuringInitRequestBody) { |
+ class FakeUploadElementReader : public UploadElementReader { |
+ public: |
+ FakeUploadElementReader() {} |
+ virtual ~FakeUploadElementReader() {} |
+ |
+ const CompletionCallback& callback() const { return callback_; } |
+ |
+ // UploadElementReader overrides: |
+ virtual int Init(const CompletionCallback& callback) OVERRIDE { |
+ callback_ = callback; |
+ return ERR_IO_PENDING; |
+ } |
+ virtual uint64 GetContentLength() const OVERRIDE { return 0; } |
+ virtual uint64 BytesRemaining() const OVERRIDE { return 0; } |
+ virtual int Read(IOBuffer* buf, |
+ int buf_length, |
+ const CompletionCallback& callback) OVERRIDE { |
+ return ERR_FAILED; |
+ } |
+ |
+ private: |
+ CompletionCallback callback_; |
+ }; |
+ |
+ FakeUploadElementReader* fake_reader = new FakeUploadElementReader; |
+ ScopedVector<UploadElementReader> element_readers; |
+ element_readers.push_back(fake_reader); |
+ UploadDataStream upload_data_stream(element_readers.Pass(), 0); |
+ |
+ HttpRequestInfo request; |
+ request.method = "POST"; |
+ request.url = GURL("http://www.google.com/upload"); |
+ request.upload_data_stream = &upload_data_stream; |
+ request.load_flags = 0; |
+ |
+ scoped_ptr<HttpTransaction> trans( |
+ new HttpNetworkTransaction(DEFAULT_PRIORITY, |
+ CreateSession(&session_deps_))); |
+ |
+ StaticSocketDataProvider data; |
+ session_deps_.socket_factory->AddSocketDataProvider(&data); |
+ |
+ TestCompletionCallback callback; |
+ int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
+ EXPECT_EQ(ERR_IO_PENDING, rv); |
+ base::MessageLoop::current()->RunUntilIdle(); |
+ |
+ // Transaction is pending on request body initialization. |
+ ASSERT_FALSE(fake_reader->callback().is_null()); |
+ |
+ // Return Init()'s result after the transaction gets destroyed. |
+ trans.reset(); |
+ fake_reader->callback().Run(OK); // Should not crash. |
+} |
+ |
// Tests that changes to Auth realms are treated like auth rejections. |
TEST_P(HttpNetworkTransactionTest, ChangeAuthRealms) { |