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

Side by Side Diff: content/browser/streams/stream_unittest.cc

Issue 2368913002: Fix stream errors that occur after a stream starts not propagating. (Closed)
Patch Set: review comments Created 4 years, 2 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
« no previous file with comments | « content/browser/streams/stream.cc ('k') | content/browser/streams/stream_url_request_job.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 <stddef.h> 5 #include <stddef.h>
6 6
7 #include "base/message_loop/message_loop.h" 7 #include "base/message_loop/message_loop.h"
8 #include "base/run_loop.h" 8 #include "base/run_loop.h"
9 #include "base/test/test_simple_task_runner.h" 9 #include "base/test/test_simple_task_runner.h"
10 #include "content/browser/streams/stream.h" 10 #include "content/browser/streams/stream.h"
11 #include "content/browser/streams/stream_read_observer.h" 11 #include "content/browser/streams/stream_read_observer.h"
12 #include "content/browser/streams/stream_register_observer.h" 12 #include "content/browser/streams/stream_register_observer.h"
13 #include "content/browser/streams/stream_registry.h" 13 #include "content/browser/streams/stream_registry.h"
14 #include "content/browser/streams/stream_write_observer.h" 14 #include "content/browser/streams/stream_write_observer.h"
15 #include "net/base/net_errors.h"
15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
16 17
17 namespace content { 18 namespace content {
18 19
19 class StreamTest : public testing::Test { 20 class StreamTest : public testing::Test {
20 public: 21 public:
21 StreamTest() : producing_seed_key_(0) {} 22 StreamTest() : producing_seed_key_(0) {}
22 23
23 void SetUp() override { registry_.reset(new StreamRegistry()); } 24 void SetUp() override { registry_.reset(new StreamRegistry()); }
24 25
(...skipping 30 matching lines...) Expand all
55 Stream::StreamState state = 56 Stream::StreamState state =
56 stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read); 57 stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read);
57 switch (state) { 58 switch (state) {
58 case Stream::STREAM_HAS_DATA: 59 case Stream::STREAM_HAS_DATA:
59 // TODO(tyoshino): Move these expectations to the beginning of Read() 60 // TODO(tyoshino): Move these expectations to the beginning of Read()
60 // method once Stream::Finalize() is fixed. 61 // method once Stream::Finalize() is fixed.
61 EXPECT_FALSE(completed_); 62 EXPECT_FALSE(completed_);
62 break; 63 break;
63 case Stream::STREAM_COMPLETE: 64 case Stream::STREAM_COMPLETE:
64 completed_ = true; 65 completed_ = true;
66 status_ = stream->GetStatus();
65 return; 67 return;
66 case Stream::STREAM_EMPTY: 68 case Stream::STREAM_EMPTY:
67 EXPECT_FALSE(completed_); 69 EXPECT_FALSE(completed_);
68 return; 70 return;
69 case Stream::STREAM_ABORTED: 71 case Stream::STREAM_ABORTED:
70 aborted_ = true; 72 aborted_ = true;
71 EXPECT_FALSE(completed_); 73 EXPECT_FALSE(completed_);
72 return; 74 return;
73 } 75 }
74 size_t old_capacity = buffer_->capacity(); 76 size_t old_capacity = buffer_->capacity();
75 buffer_->SetCapacity(old_capacity + bytes_read); 77 buffer_->SetCapacity(old_capacity + bytes_read);
76 memcpy(buffer_->StartOfBuffer() + old_capacity, 78 memcpy(buffer_->StartOfBuffer() + old_capacity,
77 buffer->data(), bytes_read); 79 buffer->data(), bytes_read);
78 } 80 }
79 } 81 }
80 82
81 void OnDataAvailable(Stream* stream) override { Read(stream); } 83 void OnDataAvailable(Stream* stream) override { Read(stream); }
82 84
83 scoped_refptr<net::GrowableIOBuffer> buffer() { return buffer_; } 85 scoped_refptr<net::GrowableIOBuffer> buffer() { return buffer_; }
84 86
85 bool completed() const { return completed_; } 87 bool completed() const { return completed_; }
86 bool aborted() const { return aborted_; } 88 bool aborted() const { return aborted_; }
89 int status() const { return status_; }
87 90
88 private: 91 private:
89 scoped_refptr<net::GrowableIOBuffer> buffer_; 92 scoped_refptr<net::GrowableIOBuffer> buffer_;
90 bool completed_ = false; 93 bool completed_ = false;
91 bool aborted_ = false; 94 bool aborted_ = false;
95 int status_ = 0;
92 }; 96 };
93 97
94 class TestStreamWriter : public StreamWriteObserver { 98 class TestStreamWriter : public StreamWriteObserver {
95 public: 99 public:
96 TestStreamWriter() {} 100 TestStreamWriter() {}
97 ~TestStreamWriter() override {} 101 ~TestStreamWriter() override {}
98 102
99 void Write(Stream* stream, 103 void Write(Stream* stream,
100 scoped_refptr<net::IOBuffer> buffer, 104 scoped_refptr<net::IOBuffer> buffer,
101 size_t buffer_size) { 105 size_t buffer_size) {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 TestStreamWriter writer; 192 TestStreamWriter writer;
189 193
190 GURL url("blob://stream"); 194 GURL url("blob://stream");
191 scoped_refptr<Stream> stream( 195 scoped_refptr<Stream> stream(
192 new Stream(registry_.get(), &writer, url)); 196 new Stream(registry_.get(), &writer, url));
193 EXPECT_TRUE(stream->SetReadObserver(&reader)); 197 EXPECT_TRUE(stream->SetReadObserver(&reader));
194 198
195 const int kBufferSize = 1000000; 199 const int kBufferSize = 1000000;
196 scoped_refptr<net::IOBuffer> buffer(NewIOBuffer(kBufferSize)); 200 scoped_refptr<net::IOBuffer> buffer(NewIOBuffer(kBufferSize));
197 writer.Write(stream.get(), buffer, kBufferSize); 201 writer.Write(stream.get(), buffer, kBufferSize);
198 stream->Finalize(); 202 stream->Finalize(net::OK);
199 base::RunLoop().RunUntilIdle(); 203 base::RunLoop().RunUntilIdle();
200 EXPECT_TRUE(reader.completed()); 204 EXPECT_TRUE(reader.completed());
205 EXPECT_EQ(net::OK, reader.status());
201 206
202 ASSERT_EQ(reader.buffer()->capacity(), kBufferSize); 207 ASSERT_EQ(reader.buffer()->capacity(), kBufferSize);
203 for (int i = 0; i < kBufferSize; i++) 208 for (int i = 0; i < kBufferSize; i++)
204 EXPECT_EQ(buffer->data()[i], reader.buffer()->data()[i]); 209 EXPECT_EQ(buffer->data()[i], reader.buffer()->data()[i]);
205 } 210 }
206 211
207 TEST_F(StreamTest, Abort) { 212 TEST_F(StreamTest, Abort) {
208 TestStreamReader reader; 213 TestStreamReader reader;
209 TestStreamWriter writer; 214 TestStreamWriter writer;
210 215
211 GURL url("blob://stream"); 216 GURL url("blob://stream");
212 scoped_refptr<Stream> stream(new Stream(registry_.get(), &writer, url)); 217 scoped_refptr<Stream> stream(new Stream(registry_.get(), &writer, url));
213 EXPECT_TRUE(stream->SetReadObserver(&reader)); 218 EXPECT_TRUE(stream->SetReadObserver(&reader));
214 219
215 stream->Abort(); 220 stream->Abort();
216 base::RunLoop().RunUntilIdle(); 221 base::RunLoop().RunUntilIdle();
217 EXPECT_FALSE(reader.completed()); 222 EXPECT_FALSE(reader.completed());
218 EXPECT_TRUE(reader.aborted()); 223 EXPECT_TRUE(reader.aborted());
219 } 224 }
220 225
226 TEST_F(StreamTest, Error) {
227 TestStreamReader reader;
228 TestStreamWriter writer;
229
230 GURL url("blob://stream");
231 scoped_refptr<Stream> stream(new Stream(registry_.get(), &writer, url));
232 EXPECT_TRUE(stream->SetReadObserver(&reader));
233
234 stream->Finalize(net::ERR_ACCESS_DENIED);
235 base::RunLoop().RunUntilIdle();
236 EXPECT_TRUE(reader.completed());
237 EXPECT_EQ(net::ERR_ACCESS_DENIED, reader.status());
238 }
239
221 // Test that even if a reader receives an empty buffer, once TransferData() 240 // Test that even if a reader receives an empty buffer, once TransferData()
222 // method is called on it with |source_complete| = true, following Read() calls 241 // method is called on it with |source_complete| = true, following Read() calls
223 // on it never returns STREAM_EMPTY. Together with StreamTest.Stream above, this 242 // on it never returns STREAM_EMPTY. Together with StreamTest.Stream above, this
224 // guarantees that Reader::Read() call returns only STREAM_HAS_DATA 243 // guarantees that Reader::Read() call returns only STREAM_HAS_DATA
225 // or STREAM_COMPLETE in |data_available_callback_| call corresponding to 244 // or STREAM_COMPLETE in |data_available_callback_| call corresponding to
226 // Writer::Close(). 245 // Writer::Close().
227 TEST_F(StreamTest, ClosedReaderDoesNotReturnStreamEmpty) { 246 TEST_F(StreamTest, ClosedReaderDoesNotReturnStreamEmpty) {
228 TestStreamReader reader; 247 TestStreamReader reader;
229 TestStreamWriter writer; 248 TestStreamWriter writer;
230 249
231 GURL url("blob://stream"); 250 GURL url("blob://stream");
232 scoped_refptr<Stream> stream( 251 scoped_refptr<Stream> stream(
233 new Stream(registry_.get(), &writer, url)); 252 new Stream(registry_.get(), &writer, url));
234 EXPECT_TRUE(stream->SetReadObserver(&reader)); 253 EXPECT_TRUE(stream->SetReadObserver(&reader));
235 254
236 const int kBufferSize = 0; 255 const int kBufferSize = 0;
237 scoped_refptr<net::IOBuffer> buffer(NewIOBuffer(kBufferSize)); 256 scoped_refptr<net::IOBuffer> buffer(NewIOBuffer(kBufferSize));
238 stream->AddData(buffer, kBufferSize); 257 stream->AddData(buffer, kBufferSize);
239 stream->Finalize(); 258 stream->Finalize(net::OK);
240 base::RunLoop().RunUntilIdle(); 259 base::RunLoop().RunUntilIdle();
241 EXPECT_TRUE(reader.completed()); 260 EXPECT_TRUE(reader.completed());
242 EXPECT_EQ(0, reader.buffer()->capacity()); 261 EXPECT_EQ(0, reader.buffer()->capacity());
262 EXPECT_EQ(net::OK, reader.status());
243 } 263 }
244 264
245 TEST_F(StreamTest, GetStream) { 265 TEST_F(StreamTest, GetStream) {
246 TestStreamWriter writer; 266 TestStreamWriter writer;
247 267
248 GURL url("blob://stream"); 268 GURL url("blob://stream");
249 scoped_refptr<Stream> stream1( 269 scoped_refptr<Stream> stream1(
250 new Stream(registry_.get(), &writer, url)); 270 new Stream(registry_.get(), &writer, url));
251 271
252 scoped_refptr<Stream> stream2 = registry_->GetStream(url); 272 scoped_refptr<Stream> stream2 = registry_->GetStream(url);
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 TEST_F(StreamTest, AbortPendingStream) { 410 TEST_F(StreamTest, AbortPendingStream) {
391 TestStreamWriter writer; 411 TestStreamWriter writer;
392 412
393 GURL url("blob://stream"); 413 GURL url("blob://stream");
394 registry_->AbortPendingStream(url); 414 registry_->AbortPendingStream(url);
395 scoped_refptr<Stream> stream1(new Stream(registry_.get(), &writer, url)); 415 scoped_refptr<Stream> stream1(new Stream(registry_.get(), &writer, url));
396 ASSERT_EQ(nullptr, registry_->GetStream(url).get()); 416 ASSERT_EQ(nullptr, registry_->GetStream(url).get());
397 } 417 }
398 418
399 } // namespace content 419 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/streams/stream.cc ('k') | content/browser/streams/stream_url_request_job.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698