| 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" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 protected: | 36 protected: |
| 37 base::MessageLoop message_loop_; | 37 base::MessageLoop message_loop_; |
| 38 std::unique_ptr<StreamRegistry> registry_; | 38 std::unique_ptr<StreamRegistry> registry_; |
| 39 | 39 |
| 40 private: | 40 private: |
| 41 int producing_seed_key_; | 41 int producing_seed_key_; |
| 42 }; | 42 }; |
| 43 | 43 |
| 44 class TestStreamReader : public StreamReadObserver { | 44 class TestStreamReader : public StreamReadObserver { |
| 45 public: | 45 public: |
| 46 TestStreamReader() : buffer_(new net::GrowableIOBuffer()), completed_(false) { | 46 TestStreamReader() : buffer_(new net::GrowableIOBuffer()) {} |
| 47 } | |
| 48 ~TestStreamReader() override {} | 47 ~TestStreamReader() override {} |
| 49 | 48 |
| 50 void Read(Stream* stream) { | 49 void Read(Stream* stream) { |
| 51 const size_t kBufferSize = 32768; | 50 const size_t kBufferSize = 32768; |
| 52 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); | 51 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); |
| 53 | 52 |
| 54 int bytes_read = 0; | 53 int bytes_read = 0; |
| 55 while (true) { | 54 while (true) { |
| 56 Stream::StreamState state = | 55 Stream::StreamState state = |
| 57 stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read); | 56 stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read); |
| 58 switch (state) { | 57 switch (state) { |
| 59 case Stream::STREAM_HAS_DATA: | 58 case Stream::STREAM_HAS_DATA: |
| 60 // TODO(tyoshino): Move these expectations to the beginning of Read() | 59 // TODO(tyoshino): Move these expectations to the beginning of Read() |
| 61 // method once Stream::Finalize() is fixed. | 60 // method once Stream::Finalize() is fixed. |
| 62 EXPECT_FALSE(completed_); | 61 EXPECT_FALSE(completed_); |
| 63 break; | 62 break; |
| 64 case Stream::STREAM_COMPLETE: | 63 case Stream::STREAM_COMPLETE: |
| 65 completed_ = true; | 64 completed_ = true; |
| 66 return; | 65 return; |
| 67 case Stream::STREAM_EMPTY: | 66 case Stream::STREAM_EMPTY: |
| 68 EXPECT_FALSE(completed_); | 67 EXPECT_FALSE(completed_); |
| 69 return; | 68 return; |
| 70 case Stream::STREAM_ABORTED: | 69 case Stream::STREAM_ABORTED: |
| 70 aborted_ = true; |
| 71 EXPECT_FALSE(completed_); | 71 EXPECT_FALSE(completed_); |
| 72 return; | 72 return; |
| 73 } | 73 } |
| 74 size_t old_capacity = buffer_->capacity(); | 74 size_t old_capacity = buffer_->capacity(); |
| 75 buffer_->SetCapacity(old_capacity + bytes_read); | 75 buffer_->SetCapacity(old_capacity + bytes_read); |
| 76 memcpy(buffer_->StartOfBuffer() + old_capacity, | 76 memcpy(buffer_->StartOfBuffer() + old_capacity, |
| 77 buffer->data(), bytes_read); | 77 buffer->data(), bytes_read); |
| 78 } | 78 } |
| 79 } | 79 } |
| 80 | 80 |
| 81 void OnDataAvailable(Stream* stream) override { Read(stream); } | 81 void OnDataAvailable(Stream* stream) override { Read(stream); } |
| 82 | 82 |
| 83 scoped_refptr<net::GrowableIOBuffer> buffer() { return buffer_; } | 83 scoped_refptr<net::GrowableIOBuffer> buffer() { return buffer_; } |
| 84 | 84 |
| 85 bool completed() const { | 85 bool completed() const { return completed_; } |
| 86 return completed_; | 86 bool aborted() const { return aborted_; } |
| 87 } | |
| 88 | 87 |
| 89 private: | 88 private: |
| 90 scoped_refptr<net::GrowableIOBuffer> buffer_; | 89 scoped_refptr<net::GrowableIOBuffer> buffer_; |
| 91 bool completed_; | 90 bool completed_ = false; |
| 91 bool aborted_ = false; |
| 92 }; | 92 }; |
| 93 | 93 |
| 94 class TestStreamWriter : public StreamWriteObserver { | 94 class TestStreamWriter : public StreamWriteObserver { |
| 95 public: | 95 public: |
| 96 TestStreamWriter() {} | 96 TestStreamWriter() {} |
| 97 ~TestStreamWriter() override {} | 97 ~TestStreamWriter() override {} |
| 98 | 98 |
| 99 void Write(Stream* stream, | 99 void Write(Stream* stream, |
| 100 scoped_refptr<net::IOBuffer> buffer, | 100 scoped_refptr<net::IOBuffer> buffer, |
| 101 size_t buffer_size) { | 101 size_t buffer_size) { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 writer.Write(stream.get(), buffer, kBufferSize); | 197 writer.Write(stream.get(), buffer, kBufferSize); |
| 198 stream->Finalize(); | 198 stream->Finalize(); |
| 199 base::RunLoop().RunUntilIdle(); | 199 base::RunLoop().RunUntilIdle(); |
| 200 EXPECT_TRUE(reader.completed()); | 200 EXPECT_TRUE(reader.completed()); |
| 201 | 201 |
| 202 ASSERT_EQ(reader.buffer()->capacity(), kBufferSize); | 202 ASSERT_EQ(reader.buffer()->capacity(), kBufferSize); |
| 203 for (int i = 0; i < kBufferSize; i++) | 203 for (int i = 0; i < kBufferSize; i++) |
| 204 EXPECT_EQ(buffer->data()[i], reader.buffer()->data()[i]); | 204 EXPECT_EQ(buffer->data()[i], reader.buffer()->data()[i]); |
| 205 } | 205 } |
| 206 | 206 |
| 207 TEST_F(StreamTest, Abort) { |
| 208 TestStreamReader reader; |
| 209 TestStreamWriter writer; |
| 210 |
| 211 GURL url("blob://stream"); |
| 212 scoped_refptr<Stream> stream(new Stream(registry_.get(), &writer, url)); |
| 213 EXPECT_TRUE(stream->SetReadObserver(&reader)); |
| 214 |
| 215 stream->Abort(); |
| 216 base::RunLoop().RunUntilIdle(); |
| 217 EXPECT_FALSE(reader.completed()); |
| 218 EXPECT_TRUE(reader.aborted()); |
| 219 } |
| 220 |
| 207 // Test that even if a reader receives an empty buffer, once TransferData() | 221 // Test that even if a reader receives an empty buffer, once TransferData() |
| 208 // method is called on it with |source_complete| = true, following Read() calls | 222 // method is called on it with |source_complete| = true, following Read() calls |
| 209 // on it never returns STREAM_EMPTY. Together with StreamTest.Stream above, this | 223 // on it never returns STREAM_EMPTY. Together with StreamTest.Stream above, this |
| 210 // guarantees that Reader::Read() call returns only STREAM_HAS_DATA | 224 // guarantees that Reader::Read() call returns only STREAM_HAS_DATA |
| 211 // or STREAM_COMPLETE in |data_available_callback_| call corresponding to | 225 // or STREAM_COMPLETE in |data_available_callback_| call corresponding to |
| 212 // Writer::Close(). | 226 // Writer::Close(). |
| 213 TEST_F(StreamTest, ClosedReaderDoesNotReturnStreamEmpty) { | 227 TEST_F(StreamTest, ClosedReaderDoesNotReturnStreamEmpty) { |
| 214 TestStreamReader reader; | 228 TestStreamReader reader; |
| 215 TestStreamWriter writer; | 229 TestStreamWriter writer; |
| 216 | 230 |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 TEST_F(StreamTest, AbortPendingStream) { | 390 TEST_F(StreamTest, AbortPendingStream) { |
| 377 TestStreamWriter writer; | 391 TestStreamWriter writer; |
| 378 | 392 |
| 379 GURL url("blob://stream"); | 393 GURL url("blob://stream"); |
| 380 registry_->AbortPendingStream(url); | 394 registry_->AbortPendingStream(url); |
| 381 scoped_refptr<Stream> stream1(new Stream(registry_.get(), &writer, url)); | 395 scoped_refptr<Stream> stream1(new Stream(registry_.get(), &writer, url)); |
| 382 ASSERT_EQ(nullptr, registry_->GetStream(url).get()); | 396 ASSERT_EQ(nullptr, registry_->GetStream(url).get()); |
| 383 } | 397 } |
| 384 | 398 |
| 385 } // namespace content | 399 } // namespace content |
| OLD | NEW |