Index: third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp |
diff --git a/third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp b/third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp |
index 37bc9934dcae6ad8c2a1ac8db5c0731a631c46f4..769fc35bd6edb91f511a79dd37a88c618123d164 100644 |
--- a/third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp |
+++ b/third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp |
@@ -34,6 +34,7 @@ public: |
~BodyStreamBufferTest() override {} |
protected: |
+ ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } |
ExecutionContext* executionContext() { return &m_page->document(); } |
OwnPtr<DummyPageHolder> m_page; |
@@ -264,6 +265,46 @@ TEST_F(BodyStreamBufferTest, LoaderShouldBeKeptAliveByBodyStreamBuffer) |
checkpoint.Call(2); |
} |
+// TODO(hiroshige): Merge this class into MockFetchDataConsumerHandle. |
+class MockFetchDataConsumerHandleWithMockDestructor : public DataConsumerHandleTestUtil::MockFetchDataConsumerHandle { |
+public: |
+ static PassOwnPtr<::testing::StrictMock<MockFetchDataConsumerHandleWithMockDestructor>> create() { return adoptPtr(new ::testing::StrictMock<MockFetchDataConsumerHandleWithMockDestructor>); } |
+ |
+ ~MockFetchDataConsumerHandleWithMockDestructor() override |
+ { |
+ destruct(); |
+ } |
+ |
+ MOCK_METHOD0(destruct, void()); |
+}; |
+ |
+TEST_F(BodyStreamBufferTest, SourceHandleAndReaderShouldBeDestructedWhenCanceled) |
+{ |
+ ScriptState::Scope scope(scriptState()); |
+ using MockHandle = MockFetchDataConsumerHandleWithMockDestructor; |
+ using MockReader = DataConsumerHandleTestUtil::MockFetchDataConsumerReader; |
+ OwnPtr<MockHandle> handle = MockHandle::create(); |
+ OwnPtr<MockReader> reader = MockReader::create(); |
+ |
+ Checkpoint checkpoint; |
+ InSequence s; |
+ |
+ EXPECT_CALL(*handle, obtainReaderInternal(_)).WillOnce(::testing::Return(reader.get())); |
+ EXPECT_CALL(checkpoint, Call(1)); |
+ EXPECT_CALL(*reader, destruct()); |
+ EXPECT_CALL(*handle, destruct()); |
+ EXPECT_CALL(checkpoint, Call(2)); |
+ |
+ // |reader| is adopted by |obtainReader|. |
+ ASSERT_TRUE(reader.leakPtr()); |
+ |
+ BodyStreamBuffer* buffer = new BodyStreamBuffer(handle.release()); |
+ checkpoint.Call(1); |
+ ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason")); |
+ buffer->cancelSource(scriptState(), reason); |
+ checkpoint.Call(2); |
+} |
+ |
} // namespace |
} // namespace blink |