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

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

Issue 2146773002: [Stream] Notify ReadObserver of Stream abortion (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix Created 4 years, 5 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 (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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698