Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Side by Side Diff: third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp

Issue 1969333002: [Fetch API] |(new Response(stream)).body| should return |stream| (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/fetch/BodyStreamBuffer.h" 5 #include "modules/fetch/BodyStreamBuffer.h"
6 6
7 #include "core/html/FormData.h" 7 #include "core/html/FormData.h"
8 #include "core/testing/DummyPageHolder.h" 8 #include "core/testing/DummyPageHolder.h"
9 #include "modules/fetch/DataConsumerHandleTestUtil.h" 9 #include "modules/fetch/DataConsumerHandleTestUtil.h"
10 #include "modules/fetch/FetchBlobDataConsumerHandle.h" 10 #include "modules/fetch/FetchBlobDataConsumerHandle.h"
(...skipping 20 matching lines...) Expand all
31 31
32 class FakeLoaderFactory : public FetchBlobDataConsumerHandle::LoaderFactory { 32 class FakeLoaderFactory : public FetchBlobDataConsumerHandle::LoaderFactory {
33 public: 33 public:
34 PassOwnPtr<ThreadableLoader> create(ExecutionContext&, ThreadableLoaderClien t*, const ThreadableLoaderOptions&, const ResourceLoaderOptions&) override 34 PassOwnPtr<ThreadableLoader> create(ExecutionContext&, ThreadableLoaderClien t*, const ThreadableLoaderOptions&, const ResourceLoaderOptions&) override
35 { 35 {
36 ASSERT_NOT_REACHED(); 36 ASSERT_NOT_REACHED();
37 return nullptr; 37 return nullptr;
38 } 38 }
39 }; 39 };
40 40
41 class EmptyClient : public FetchDataConsumerHandle::Client {
42 public:
43 void didGetReadable() override {}
44 };
tyoshino (SeeGerritForStatus) 2016/05/16 05:48:53 not used?
yhirano 2016/05/16 06:35:37 You're right. Thanks.
45
41 class BodyStreamBufferTest : public ::testing::Test { 46 class BodyStreamBufferTest : public ::testing::Test {
42 public: 47 public:
43 BodyStreamBufferTest() 48 BodyStreamBufferTest()
44 { 49 {
45 m_page = DummyPageHolder::create(IntSize(1, 1)); 50 m_page = DummyPageHolder::create(IntSize(1, 1));
46 } 51 }
47 ~BodyStreamBufferTest() override {} 52 ~BodyStreamBufferTest() override {}
48 53
49 protected: 54 protected:
50 ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->doc ument().frame()); } 55 ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->doc ument().frame()); }
51 ExecutionContext* getExecutionContext() { return &m_page->document(); } 56 ExecutionContext* getExecutionContext() { return &m_page->document(); }
52 57
53 OwnPtr<DummyPageHolder> m_page; 58 OwnPtr<DummyPageHolder> m_page;
59
60 ScriptValue eval(const char* s)
61 {
62 v8::Local<v8::String> source;
63 v8::Local<v8::Script> script;
64 v8::MicrotasksScope microtasks(getScriptState()->isolate(), v8::Microtas ksScope::kDoNotRunMicrotasks);
65 if (!v8Call(v8::String::NewFromUtf8(getScriptState()->isolate(), s, v8:: NewStringType::kNormal), source)) {
66 ADD_FAILURE();
67 return ScriptValue();
68 }
69 if (!v8Call(v8::Script::Compile(getScriptState()->context(), source), sc ript)) {
70 ADD_FAILURE() << "Compilation fails";
71 return ScriptValue();
72 }
73 return ScriptValue(getScriptState(), script->Run(getScriptState()->conte xt()));
74 }
75 ScriptValue evalWithPrintingError(const char* s)
76 {
77 v8::TryCatch block(getScriptState()->isolate());
78 ScriptValue r = eval(s);
79 if (block.HasCaught()) {
80 ADD_FAILURE() << toCoreString(block.Exception()->ToString(getScriptS tate()->isolate())).utf8().data();
81 block.ReThrow();
82 }
83 return r;
84 }
54 }; 85 };
55 86
56 TEST_F(BodyStreamBufferTest, ReleaseHandle) 87 TEST_F(BodyStreamBufferTest, Tee)
57 { 88 {
58 OwnPtr<FetchDataConsumerHandle> handle = createFetchDataConsumerHandleFromWe bHandle(createWaitingDataConsumerHandle()); 89 Checkpoint checkpoint;
59 FetchDataConsumerHandle* rawHandle = handle.get(); 90 MockFetchDataLoaderClient* client1 = MockFetchDataLoaderClient::create();
60 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), handle.rel ease()); 91 MockFetchDataLoaderClient* client2 = MockFetchDataLoaderClient::create();
61 92
62 EXPECT_FALSE(buffer->hasPendingActivity()); 93 InSequence s;
63 EXPECT_FALSE(buffer->isStreamLocked()); 94 EXPECT_CALL(checkpoint, Call(1));
64 EXPECT_FALSE(buffer->isStreamDisturbed()); 95 EXPECT_CALL(*client1, didFetchDataLoadedString(String("hello, world")));
65 EXPECT_TRUE(buffer->isStreamReadable()); 96 EXPECT_CALL(checkpoint, Call(2));
97 EXPECT_CALL(checkpoint, Call(3));
98 EXPECT_CALL(*client2, didFetchDataLoadedString(String("hello, world")));
99 EXPECT_CALL(checkpoint, Call(4));
66 100
67 OwnPtr<FetchDataConsumerHandle> handle2 = buffer->releaseHandle(); 101 OwnPtr<DataConsumerHandleTestUtil::ReplayingHandle> handle = DataConsumerHan dleTestUtil::ReplayingHandle::create();
102 handle->add(DataConsumerHandleTestUtil::Command(DataConsumerHandleTestUtil:: Command::Data, "hello, "));
103 handle->add(DataConsumerHandleTestUtil::Command(DataConsumerHandleTestUtil:: Command::Data, "world"));
104 handle->add(DataConsumerHandleTestUtil::Command(DataConsumerHandleTestUtil:: Command::Done));
105 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), createFetc hDataConsumerHandleFromWebHandle(std::move(handle)));
68 106
69 ASSERT_EQ(rawHandle, handle2.get()); 107 BodyStreamBuffer* new1;
108 BodyStreamBuffer* new2;
109 buffer->tee(&new1, &new2);
110
70 EXPECT_TRUE(buffer->isStreamLocked()); 111 EXPECT_TRUE(buffer->isStreamLocked());
71 EXPECT_TRUE(buffer->isStreamDisturbed()); 112 EXPECT_TRUE(buffer->isStreamDisturbed());
72 EXPECT_TRUE(buffer->isStreamClosed()); 113 EXPECT_FALSE(buffer->hasPendingActivity());
114
115 new1->startLoading(FetchDataLoader::createLoaderAsString(), client1);
116 checkpoint.Call(1);
117 testing::runPendingTasks();
118 checkpoint.Call(2);
119
120 new2->startLoading(FetchDataLoader::createLoaderAsString(), client2);
121 checkpoint.Call(3);
122 testing::runPendingTasks();
123 checkpoint.Call(4);
124 }
125
126 TEST_F(BodyStreamBufferTest, TeeFromHandleMadeFromStream)
127 {
128 ScriptState::Scope scope(getScriptState());
129 ScriptValue stream = evalWithPrintingError(
130 "stream = new ReadableStream({start: c => controller = c});"
131 "controller.enqueue(new Uint8Array([0x41, 0x42]));"
132 "controller.enqueue(new Uint8Array([0x55, 0x58]));"
133 "controller.close();"
134 "stream");
135 Checkpoint checkpoint;
136 MockFetchDataLoaderClient* client1 = MockFetchDataLoaderClient::create();
137 MockFetchDataLoaderClient* client2 = MockFetchDataLoaderClient::create();
138
139 InSequence s;
140 EXPECT_CALL(checkpoint, Call(1));
141 EXPECT_CALL(*client1, didFetchDataLoadedString(String("ABUX")));
142 EXPECT_CALL(checkpoint, Call(2));
143 EXPECT_CALL(checkpoint, Call(3));
144 EXPECT_CALL(*client2, didFetchDataLoadedString(String("ABUX")));
145 EXPECT_CALL(checkpoint, Call(4));
146
147 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), stream);
148
149 BodyStreamBuffer* new1;
150 BodyStreamBuffer* new2;
151 buffer->tee(&new1, &new2);
152
153 EXPECT_TRUE(buffer->isStreamLocked());
154 EXPECT_FALSE(buffer->isStreamDisturbed());
tyoshino (SeeGerritForStatus) 2016/05/16 05:48:53 Leave some TODO about this behavior?
yhirano 2016/05/16 06:35:37 Done.
155 EXPECT_FALSE(buffer->hasPendingActivity());
156
157 v8::MicrotasksScope::PerformCheckpoint(getScriptState()->isolate());
158
159 EXPECT_TRUE(buffer->isStreamLocked());
160 EXPECT_TRUE(buffer->isStreamDisturbed());
161 EXPECT_FALSE(buffer->hasPendingActivity());
162
163 new1->startLoading(FetchDataLoader::createLoaderAsString(), client1);
164 checkpoint.Call(1);
165 testing::runPendingTasks();
166 checkpoint.Call(2);
167
168 new2->startLoading(FetchDataLoader::createLoaderAsString(), client2);
169 checkpoint.Call(3);
170 testing::runPendingTasks();
171 checkpoint.Call(4);
73 } 172 }
74 173
75 TEST_F(BodyStreamBufferTest, DrainAsBlobDataHandle) 174 TEST_F(BodyStreamBufferTest, DrainAsBlobDataHandle)
76 { 175 {
77 OwnPtr<BlobData> data = BlobData::create(); 176 OwnPtr<BlobData> data = BlobData::create();
78 data->appendText("hello", false); 177 data->appendText("hello", false);
79 auto size = data->length(); 178 auto size = data->length();
80 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(data.release( ), size); 179 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(data.release( ), size);
81 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), FetchBlobD ataConsumerHandle::create(getExecutionContext(), blobDataHandle, new FakeLoaderF actory)); 180 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), FetchBlobD ataConsumerHandle::create(getExecutionContext(), blobDataHandle, new FakeLoaderF actory));
82 181
(...skipping 18 matching lines...) Expand all
101 EXPECT_FALSE(buffer->isStreamDisturbed()); 200 EXPECT_FALSE(buffer->isStreamDisturbed());
102 EXPECT_FALSE(buffer->hasPendingActivity()); 201 EXPECT_FALSE(buffer->hasPendingActivity());
103 202
104 EXPECT_FALSE(buffer->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader:: AllowBlobWithInvalidSize)); 203 EXPECT_FALSE(buffer->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader:: AllowBlobWithInvalidSize));
105 204
106 EXPECT_FALSE(buffer->isStreamLocked()); 205 EXPECT_FALSE(buffer->isStreamLocked());
107 EXPECT_FALSE(buffer->isStreamDisturbed()); 206 EXPECT_FALSE(buffer->isStreamDisturbed());
108 EXPECT_FALSE(buffer->hasPendingActivity()); 207 EXPECT_FALSE(buffer->hasPendingActivity());
109 } 208 }
110 209
210 TEST_F(BodyStreamBufferTest, DrainAsBlobFromBufferMadeFromBufferMadeFromStream)
211 {
212 ScriptState::Scope scope(getScriptState());
213 ScriptValue stream = evalWithPrintingError("new ReadableStream()");
214 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), stream);
215
216 EXPECT_FALSE(buffer->hasPendingActivity());
217 EXPECT_FALSE(buffer->isStreamLocked());
218 EXPECT_FALSE(buffer->isStreamDisturbed());
219 EXPECT_TRUE(buffer->isStreamReadable());
220
221 EXPECT_FALSE(buffer->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader:: AllowBlobWithInvalidSize));
222
223 EXPECT_FALSE(buffer->hasPendingActivity());
224 EXPECT_FALSE(buffer->isStreamLocked());
225 EXPECT_FALSE(buffer->isStreamDisturbed());
226 EXPECT_TRUE(buffer->isStreamReadable());
227 }
228
111 TEST_F(BodyStreamBufferTest, DrainAsFormData) 229 TEST_F(BodyStreamBufferTest, DrainAsFormData)
112 { 230 {
113 FormData* data = FormData::create(UTF8Encoding()); 231 FormData* data = FormData::create(UTF8Encoding());
114 data->append("name1", "value1"); 232 data->append("name1", "value1");
115 data->append("name2", "value2"); 233 data->append("name2", "value2");
116 RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData(); 234 RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData();
117 235
118 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), FetchFormD ataConsumerHandle::create(getExecutionContext(), inputFormData)); 236 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), FetchFormD ataConsumerHandle::create(getExecutionContext(), inputFormData));
119 237
120 EXPECT_FALSE(buffer->isStreamLocked()); 238 EXPECT_FALSE(buffer->isStreamLocked());
(...skipping 17 matching lines...) Expand all
138 EXPECT_FALSE(buffer->isStreamDisturbed()); 256 EXPECT_FALSE(buffer->isStreamDisturbed());
139 EXPECT_FALSE(buffer->hasPendingActivity()); 257 EXPECT_FALSE(buffer->hasPendingActivity());
140 258
141 EXPECT_FALSE(buffer->drainAsFormData()); 259 EXPECT_FALSE(buffer->drainAsFormData());
142 260
143 EXPECT_FALSE(buffer->isStreamLocked()); 261 EXPECT_FALSE(buffer->isStreamLocked());
144 EXPECT_FALSE(buffer->isStreamDisturbed()); 262 EXPECT_FALSE(buffer->isStreamDisturbed());
145 EXPECT_FALSE(buffer->hasPendingActivity()); 263 EXPECT_FALSE(buffer->hasPendingActivity());
146 } 264 }
147 265
266 TEST_F(BodyStreamBufferTest, DrainAsFormDataFromBufferMadeFromBufferMadeFromStre am)
267 {
268 ScriptState::Scope scope(getScriptState());
269 ScriptValue stream = evalWithPrintingError("new ReadableStream()");
270 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), stream);
271
272 EXPECT_FALSE(buffer->hasPendingActivity());
273 EXPECT_FALSE(buffer->isStreamLocked());
274 EXPECT_FALSE(buffer->isStreamDisturbed());
275 EXPECT_TRUE(buffer->isStreamReadable());
276
277 EXPECT_FALSE(buffer->drainAsFormData());
278
279 EXPECT_FALSE(buffer->hasPendingActivity());
280 EXPECT_FALSE(buffer->isStreamLocked());
281 EXPECT_FALSE(buffer->isStreamDisturbed());
282 EXPECT_TRUE(buffer->isStreamReadable());
283 }
284
148 TEST_F(BodyStreamBufferTest, LoadBodyStreamBufferAsArrayBuffer) 285 TEST_F(BodyStreamBufferTest, LoadBodyStreamBufferAsArrayBuffer)
149 { 286 {
150 Checkpoint checkpoint; 287 Checkpoint checkpoint;
151 MockFetchDataLoaderClient* client = MockFetchDataLoaderClient::create(); 288 MockFetchDataLoaderClient* client = MockFetchDataLoaderClient::create();
152 DOMArrayBuffer* arrayBuffer = nullptr; 289 DOMArrayBuffer* arrayBuffer = nullptr;
153 290
154 InSequence s; 291 InSequence s;
155 EXPECT_CALL(checkpoint, Call(1)); 292 EXPECT_CALL(checkpoint, Call(1));
156 EXPECT_CALL(*client, didFetchDataLoadedArrayBufferMock(_)).WillOnce(SaveArg< 0>(&arrayBuffer)); 293 EXPECT_CALL(*client, didFetchDataLoadedArrayBufferMock(_)).WillOnce(SaveArg< 0>(&arrayBuffer));
157 EXPECT_CALL(checkpoint, Call(2)); 294 EXPECT_CALL(checkpoint, Call(2));
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 367
231 checkpoint.Call(1); 368 checkpoint.Call(1);
232 testing::runPendingTasks(); 369 testing::runPendingTasks();
233 checkpoint.Call(2); 370 checkpoint.Call(2);
234 371
235 EXPECT_TRUE(buffer->isStreamLocked()); 372 EXPECT_TRUE(buffer->isStreamLocked());
236 EXPECT_TRUE(buffer->isStreamDisturbed()); 373 EXPECT_TRUE(buffer->isStreamDisturbed());
237 EXPECT_FALSE(buffer->hasPendingActivity()); 374 EXPECT_FALSE(buffer->hasPendingActivity());
238 } 375 }
239 376
240 TEST_F(BodyStreamBufferTest, ReleaseClosedHandle)
241 {
242 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), createFetc hDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle()));
243
244 EXPECT_TRUE(buffer->isStreamReadable());
245 testing::runPendingTasks();
246 EXPECT_TRUE(buffer->isStreamClosed());
247
248 EXPECT_FALSE(buffer->isStreamLocked());
249 EXPECT_FALSE(buffer->isStreamDisturbed());
250 EXPECT_FALSE(buffer->hasPendingActivity());
251 OwnPtr<FetchDataConsumerHandle> handle = buffer->releaseHandle();
252
253 EXPECT_TRUE(handle);
254 EXPECT_TRUE(buffer->isStreamLocked());
255 EXPECT_TRUE(buffer->isStreamDisturbed());
256 EXPECT_FALSE(buffer->hasPendingActivity());
257 }
258
259 TEST_F(BodyStreamBufferTest, LoadClosedHandle) 377 TEST_F(BodyStreamBufferTest, LoadClosedHandle)
260 { 378 {
261 Checkpoint checkpoint; 379 Checkpoint checkpoint;
262 MockFetchDataLoaderClient* client = MockFetchDataLoaderClient::create(); 380 MockFetchDataLoaderClient* client = MockFetchDataLoaderClient::create();
263 381
264 InSequence s; 382 InSequence s;
265 EXPECT_CALL(checkpoint, Call(1)); 383 EXPECT_CALL(checkpoint, Call(1));
266 EXPECT_CALL(*client, didFetchDataLoadedString(String(""))); 384 EXPECT_CALL(*client, didFetchDataLoadedString(String("")));
267 EXPECT_CALL(checkpoint, Call(2)); 385 EXPECT_CALL(checkpoint, Call(2));
268 386
(...skipping 14 matching lines...) Expand all
283 401
284 checkpoint.Call(1); 402 checkpoint.Call(1);
285 testing::runPendingTasks(); 403 testing::runPendingTasks();
286 checkpoint.Call(2); 404 checkpoint.Call(2);
287 405
288 EXPECT_TRUE(buffer->isStreamLocked()); 406 EXPECT_TRUE(buffer->isStreamLocked());
289 EXPECT_TRUE(buffer->isStreamDisturbed()); 407 EXPECT_TRUE(buffer->isStreamDisturbed());
290 EXPECT_FALSE(buffer->hasPendingActivity()); 408 EXPECT_FALSE(buffer->hasPendingActivity());
291 } 409 }
292 410
293 TEST_F(BodyStreamBufferTest, ReleaseErroredHandle)
294 {
295 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), createFetc hDataConsumerHandleFromWebHandle(createUnexpectedErrorDataConsumerHandle()));
296
297 EXPECT_TRUE(buffer->isStreamReadable());
298 testing::runPendingTasks();
299 EXPECT_TRUE(buffer->isStreamErrored());
300
301 EXPECT_FALSE(buffer->isStreamLocked());
302 EXPECT_FALSE(buffer->isStreamDisturbed());
303 EXPECT_FALSE(buffer->hasPendingActivity());
304 OwnPtr<FetchDataConsumerHandle> handle = buffer->releaseHandle();
305 EXPECT_TRUE(handle);
306 EXPECT_TRUE(buffer->isStreamLocked());
307 EXPECT_TRUE(buffer->isStreamDisturbed());
308 EXPECT_FALSE(buffer->hasPendingActivity());
309 }
310
311 TEST_F(BodyStreamBufferTest, LoadErroredHandle) 411 TEST_F(BodyStreamBufferTest, LoadErroredHandle)
312 { 412 {
313 Checkpoint checkpoint; 413 Checkpoint checkpoint;
314 MockFetchDataLoaderClient* client = MockFetchDataLoaderClient::create(); 414 MockFetchDataLoaderClient* client = MockFetchDataLoaderClient::create();
315 415
316 InSequence s; 416 InSequence s;
317 EXPECT_CALL(checkpoint, Call(1)); 417 EXPECT_CALL(checkpoint, Call(1));
318 EXPECT_CALL(*client, didFetchDataLoadFailed()); 418 EXPECT_CALL(*client, didFetchDataLoadFailed());
319 EXPECT_CALL(checkpoint, Call(2)); 419 EXPECT_CALL(checkpoint, Call(2));
320 420
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), handle.rel ease()); 499 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), handle.rel ease());
400 checkpoint.Call(1); 500 checkpoint.Call(1);
401 ScriptValue reason(getScriptState(), v8String(getScriptState()->isolate(), " reason")); 501 ScriptValue reason(getScriptState(), v8String(getScriptState()->isolate(), " reason"));
402 buffer->cancelSource(getScriptState(), reason); 502 buffer->cancelSource(getScriptState(), reason);
403 checkpoint.Call(2); 503 checkpoint.Call(2);
404 } 504 }
405 505
406 } // namespace 506 } // namespace
407 507
408 } // namespace blink 508 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698