OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |