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

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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 { 44 {
45 m_page = DummyPageHolder::create(IntSize(1, 1)); 45 m_page = DummyPageHolder::create(IntSize(1, 1));
46 } 46 }
47 ~BodyStreamBufferTest() override {} 47 ~BodyStreamBufferTest() override {}
48 48
49 protected: 49 protected:
50 ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->doc ument().frame()); } 50 ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->doc ument().frame()); }
51 ExecutionContext* getExecutionContext() { return &m_page->document(); } 51 ExecutionContext* getExecutionContext() { return &m_page->document(); }
52 52
53 OwnPtr<DummyPageHolder> m_page; 53 OwnPtr<DummyPageHolder> m_page;
54
55 ScriptValue eval(const char* s)
56 {
57 v8::Local<v8::String> source;
58 v8::Local<v8::Script> script;
59 v8::MicrotasksScope microtasks(getScriptState()->isolate(), v8::Microtas ksScope::kDoNotRunMicrotasks);
60 if (!v8Call(v8::String::NewFromUtf8(getScriptState()->isolate(), s, v8:: NewStringType::kNormal), source)) {
61 ADD_FAILURE();
62 return ScriptValue();
63 }
64 if (!v8Call(v8::Script::Compile(getScriptState()->context(), source), sc ript)) {
65 ADD_FAILURE() << "Compilation fails";
66 return ScriptValue();
67 }
68 return ScriptValue(getScriptState(), script->Run(getScriptState()->conte xt()));
69 }
70 ScriptValue evalWithPrintingError(const char* s)
71 {
72 v8::TryCatch block(getScriptState()->isolate());
73 ScriptValue r = eval(s);
74 if (block.HasCaught()) {
75 ADD_FAILURE() << toCoreString(block.Exception()->ToString(getScriptS tate()->isolate())).utf8().data();
76 block.ReThrow();
77 }
78 return r;
79 }
54 }; 80 };
55 81
56 TEST_F(BodyStreamBufferTest, ReleaseHandle) 82 TEST_F(BodyStreamBufferTest, Tee)
57 { 83 {
58 OwnPtr<FetchDataConsumerHandle> handle = createFetchDataConsumerHandleFromWe bHandle(createWaitingDataConsumerHandle()); 84 Checkpoint checkpoint;
59 FetchDataConsumerHandle* rawHandle = handle.get(); 85 MockFetchDataLoaderClient* client1 = MockFetchDataLoaderClient::create();
60 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), std::move( handle)); 86 MockFetchDataLoaderClient* client2 = MockFetchDataLoaderClient::create();
61 87
62 EXPECT_FALSE(buffer->hasPendingActivity()); 88 InSequence s;
63 EXPECT_FALSE(buffer->isStreamLocked()); 89 EXPECT_CALL(checkpoint, Call(1));
64 EXPECT_FALSE(buffer->isStreamDisturbed()); 90 EXPECT_CALL(*client1, didFetchDataLoadedString(String("hello, world")));
65 EXPECT_TRUE(buffer->isStreamReadable()); 91 EXPECT_CALL(checkpoint, Call(2));
92 EXPECT_CALL(checkpoint, Call(3));
93 EXPECT_CALL(*client2, didFetchDataLoadedString(String("hello, world")));
94 EXPECT_CALL(checkpoint, Call(4));
66 95
67 OwnPtr<FetchDataConsumerHandle> handle2 = buffer->releaseHandle(); 96 OwnPtr<DataConsumerHandleTestUtil::ReplayingHandle> handle = DataConsumerHan dleTestUtil::ReplayingHandle::create();
97 handle->add(DataConsumerHandleTestUtil::Command(DataConsumerHandleTestUtil:: Command::Data, "hello, "));
98 handle->add(DataConsumerHandleTestUtil::Command(DataConsumerHandleTestUtil:: Command::Data, "world"));
99 handle->add(DataConsumerHandleTestUtil::Command(DataConsumerHandleTestUtil:: Command::Done));
100 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), createFetc hDataConsumerHandleFromWebHandle(std::move(handle)));
68 101
69 ASSERT_EQ(rawHandle, handle2.get()); 102 BodyStreamBuffer* new1;
103 BodyStreamBuffer* new2;
104 buffer->tee(&new1, &new2);
105
70 EXPECT_TRUE(buffer->isStreamLocked()); 106 EXPECT_TRUE(buffer->isStreamLocked());
71 EXPECT_TRUE(buffer->isStreamDisturbed()); 107 EXPECT_TRUE(buffer->isStreamDisturbed());
72 EXPECT_TRUE(buffer->isStreamClosed()); 108 EXPECT_FALSE(buffer->hasPendingActivity());
109
110 new1->startLoading(FetchDataLoader::createLoaderAsString(), client1);
111 checkpoint.Call(1);
112 testing::runPendingTasks();
113 checkpoint.Call(2);
114
115 new2->startLoading(FetchDataLoader::createLoaderAsString(), client2);
116 checkpoint.Call(3);
117 testing::runPendingTasks();
118 checkpoint.Call(4);
119 }
120
121 TEST_F(BodyStreamBufferTest, TeeFromHandleMadeFromStream)
122 {
123 ScriptState::Scope scope(getScriptState());
124 ScriptValue stream = evalWithPrintingError(
125 "stream = new ReadableStream({start: c => controller = c});"
126 "controller.enqueue(new Uint8Array([0x41, 0x42]));"
127 "controller.enqueue(new Uint8Array([0x55, 0x58]));"
128 "controller.close();"
129 "stream");
130 Checkpoint checkpoint;
131 MockFetchDataLoaderClient* client1 = MockFetchDataLoaderClient::create();
132 MockFetchDataLoaderClient* client2 = MockFetchDataLoaderClient::create();
133
134 InSequence s;
135 EXPECT_CALL(checkpoint, Call(1));
136 EXPECT_CALL(*client1, didFetchDataLoadedString(String("ABUX")));
137 EXPECT_CALL(checkpoint, Call(2));
138 EXPECT_CALL(checkpoint, Call(3));
139 EXPECT_CALL(*client2, didFetchDataLoadedString(String("ABUX")));
140 EXPECT_CALL(checkpoint, Call(4));
141
142 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), stream);
143
144 BodyStreamBuffer* new1;
145 BodyStreamBuffer* new2;
146 buffer->tee(&new1, &new2);
147
148 EXPECT_TRUE(buffer->isStreamLocked());
149 // Note that this behavior is slightly different from for the behavior of
150 // a BodyStreamBuffer made from a FetchDataConsumerHandle. See the above
151 // test. In this test, the stream will get disturbed when the microtask
152 // is performed.
153 // TODO(yhirano): A uniformed behavior is preferred.
154 EXPECT_FALSE(buffer->isStreamDisturbed());
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(std::move(dat a), size); 179 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(std::move(dat a), 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(), std::move( handle)); 499 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), std::move( handle));
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