OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "base/message_loop.h" | |
6 #include "base/test/test_simple_task_runner.h" | |
7 #include "content/browser/streams/stream.h" | |
8 #include "content/browser/streams/stream_read_observer.h" | |
9 #include "content/browser/streams/stream_registry.h" | |
10 #include "content/browser/streams/stream_write_observer.h" | |
11 #include "testing/gtest/include/gtest/gtest.h" | |
12 | |
kinuko
2013/03/08 07:04:19
Can we put this entire code in namespace content?
Zachary Kuznia
2013/03/08 07:18:13
Done.
| |
13 class StreamTest : public testing::Test { | |
14 public: | |
15 StreamTest() | |
16 : producing_seed_key_(0) { | |
kinuko
2013/03/08 07:04:19
nit: looks like this can be in one line
Zachary Kuznia
2013/03/08 07:18:13
Done.
| |
17 } | |
18 | |
19 virtual void SetUp() OVERRIDE { | |
20 registry_.reset(new content::StreamRegistry()); | |
21 } | |
22 | |
23 // Create a new IO buffer of the given |buffer_size|. Details of the | |
24 // contents of the created buffer will be kept, and can be validated | |
25 // by ValidateIOBuffer. | |
kinuko
2013/03/08 07:04:19
This ValidateIOBuffer doesn't exist?
Zachary Kuznia
2013/03/08 07:18:13
Fixed the comment.
| |
26 scoped_refptr<net::IOBuffer> NewIOBuffer(size_t buffer_size) { | |
27 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(buffer_size)); | |
28 char *bufferp = buffer->data(); | |
29 for (size_t i = 0; i < buffer_size; i++) | |
30 bufferp[i] = (i + producing_seed_key_) % (1 << sizeof(char)); | |
31 pointer_queue_.push_back(bufferp); | |
32 length_queue_.push_back(buffer_size); | |
33 ++producing_seed_key_; | |
34 return buffer; | |
35 } | |
36 | |
37 protected: | |
38 MessageLoop message_loop_; | |
39 scoped_ptr<content::StreamRegistry> registry_; | |
40 | |
41 private: | |
42 int producing_seed_key_; | |
43 std::deque<char*> pointer_queue_; | |
44 std::deque<size_t> length_queue_; | |
45 }; | |
46 | |
47 class TestStreamReader : public content::StreamReadObserver { | |
48 public: | |
49 TestStreamReader() : buffer_(new net::GrowableIOBuffer()) { | |
50 } | |
51 virtual ~TestStreamReader() {} | |
52 | |
53 void Read(content::Stream* stream) { | |
54 const size_t kBufferSize = 32768; | |
55 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); | |
56 | |
57 int bytes_read = 0; | |
58 while (stream->ReadRawData(buffer, kBufferSize, &bytes_read) == | |
59 content::Stream::STREAM_HAS_DATA) { | |
60 size_t old_capacity = buffer_->capacity(); | |
61 buffer_->SetCapacity(old_capacity + bytes_read); | |
62 memcpy(buffer_->data() + old_capacity, buffer->data(), bytes_read); | |
63 } | |
64 } | |
65 | |
66 virtual void OnDataAvailable(content::Stream* stream) OVERRIDE { | |
67 Read(stream); | |
68 } | |
69 | |
70 scoped_refptr<net::GrowableIOBuffer> buffer() { return buffer_; } | |
71 | |
72 private: | |
73 scoped_refptr<net::GrowableIOBuffer> buffer_; | |
74 }; | |
75 | |
76 class TestStreamWriter : public content::StreamWriteObserver { | |
77 public: | |
78 TestStreamWriter() {} | |
79 virtual ~TestStreamWriter() {} | |
80 | |
81 void Write(content::Stream* stream, | |
82 scoped_refptr<net::IOBuffer> buffer, | |
83 size_t buffer_size) { | |
84 stream->AddData(buffer, buffer_size); | |
85 } | |
86 | |
87 virtual void OnSpaceAvailable(content::Stream* stream) OVERRIDE { | |
88 } | |
89 }; | |
90 | |
91 TEST_F(StreamTest, SetReadObserver) { | |
92 TestStreamReader reader; | |
93 TestStreamWriter writer; | |
94 | |
95 GURL url("blob://stream"); | |
96 scoped_refptr<content::Stream> stream( | |
97 new content::Stream(registry_.get(), &writer, GURL(), url)); | |
98 EXPECT_TRUE(stream->SetReadObserver(&reader)); | |
99 } | |
100 | |
101 TEST_F(StreamTest, SetReadObserver_SecondFails) { | |
102 TestStreamReader reader1; | |
103 TestStreamReader reader2; | |
104 TestStreamWriter writer; | |
105 | |
106 GURL url("blob://stream"); | |
107 scoped_refptr<content::Stream> stream( | |
108 new content::Stream(registry_.get(), &writer, GURL(), url)); | |
109 EXPECT_TRUE(stream->SetReadObserver(&reader1)); | |
110 EXPECT_FALSE(stream->SetReadObserver(&reader2)); | |
111 } | |
112 | |
113 TEST_F(StreamTest, SetReadObserver_TwoReaders) { | |
114 TestStreamReader reader1; | |
115 TestStreamReader reader2; | |
116 TestStreamWriter writer; | |
117 | |
118 GURL url("blob://stream"); | |
119 scoped_refptr<content::Stream> stream( | |
120 new content::Stream(registry_.get(), &writer, GURL(), url)); | |
121 EXPECT_TRUE(stream->SetReadObserver(&reader1)); | |
122 | |
123 // Once the first read observer is removed, a new one can be added. | |
124 stream->RemoveReadObserver(&reader1); | |
125 EXPECT_TRUE(stream->SetReadObserver(&reader2)); | |
126 } | |
127 | |
128 TEST_F(StreamTest, Stream) { | |
129 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | |
130 new base::TestSimpleTaskRunner()); | |
kinuko
2013/03/08 07:04:19
Not used? (Here and below)
Zachary Kuznia
2013/03/08 07:18:13
Done.
| |
131 | |
132 TestStreamReader reader; | |
133 TestStreamWriter writer; | |
134 | |
135 GURL url("blob://stream"); | |
136 scoped_refptr<content::Stream> stream( | |
137 new content::Stream(registry_.get(), &writer, GURL(), url)); | |
138 EXPECT_TRUE(stream->SetReadObserver(&reader)); | |
139 | |
140 int buffer_size = 1000000; | |
141 scoped_refptr<net::IOBuffer> buffer(NewIOBuffer(buffer_size)); | |
142 writer.Write(stream, buffer, buffer_size); | |
143 stream->Finalize(); | |
144 reader.Read(stream); | |
145 MessageLoop::current()->RunUntilIdle(); | |
146 | |
147 ASSERT_EQ(reader.buffer()->capacity(), buffer_size); | |
148 ASSERT_EQ(0, memcmp(buffer->data(), | |
149 reader.buffer()->data(), | |
150 buffer_size)); | |
151 } | |
152 | |
153 TEST_F(StreamTest, GetStream) { | |
154 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | |
155 new base::TestSimpleTaskRunner()); | |
156 | |
157 TestStreamWriter writer; | |
158 | |
159 GURL url("blob://stream"); | |
160 scoped_refptr<content::Stream> stream1( | |
161 new content::Stream(registry_.get(), &writer, GURL(), url)); | |
162 | |
163 scoped_refptr<content::Stream> stream2 = registry_->GetStream(url); | |
164 ASSERT_EQ(stream1, stream2); | |
165 } | |
166 | |
167 TEST_F(StreamTest, GetStream_Missing) { | |
168 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | |
169 new base::TestSimpleTaskRunner()); | |
170 | |
171 TestStreamWriter writer; | |
172 | |
173 GURL url1("blob://stream"); | |
174 scoped_refptr<content::Stream> stream1( | |
175 new content::Stream(registry_.get(), &writer, GURL(), url1)); | |
176 | |
177 GURL url2("blob://stream2"); | |
178 scoped_refptr<content::Stream> stream2 = registry_->GetStream(url2); | |
179 ASSERT_FALSE(stream2); | |
180 } | |
181 | |
182 TEST_F(StreamTest, CloneStream) { | |
183 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | |
184 new base::TestSimpleTaskRunner()); | |
185 | |
186 TestStreamWriter writer; | |
187 | |
188 GURL url1("blob://stream"); | |
189 scoped_refptr<content::Stream> stream1( | |
190 new content::Stream(registry_.get(), &writer, GURL(), url1)); | |
191 | |
192 GURL url2("blob://stream2"); | |
193 ASSERT_TRUE(registry_->CloneStream(url2, url1)); | |
194 scoped_refptr<content::Stream> stream2 = registry_->GetStream(url2); | |
195 ASSERT_EQ(stream1, stream2); | |
196 } | |
197 | |
198 TEST_F(StreamTest, CloneStream_Missing) { | |
199 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | |
200 new base::TestSimpleTaskRunner()); | |
201 | |
202 TestStreamWriter writer; | |
203 | |
204 GURL url1("blob://stream"); | |
205 scoped_refptr<content::Stream> stream1( | |
206 new content::Stream(registry_.get(), &writer, GURL(), url1)); | |
207 | |
208 GURL url2("blob://stream2"); | |
209 GURL url3("blob://stream3"); | |
210 ASSERT_FALSE(registry_->CloneStream(url2, url3)); | |
211 scoped_refptr<content::Stream> stream2 = registry_->GetStream(url2); | |
212 ASSERT_FALSE(stream2); | |
213 } | |
214 | |
215 TEST_F(StreamTest, UnregisterStream) { | |
216 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | |
217 new base::TestSimpleTaskRunner()); | |
218 | |
219 TestStreamWriter writer; | |
220 | |
221 GURL url("blob://stream"); | |
222 scoped_refptr<content::Stream> stream1( | |
223 new content::Stream(registry_.get(), &writer, GURL(), url)); | |
224 | |
225 registry_->UnregisterStream(url); | |
226 scoped_refptr<content::Stream> stream2 = registry_->GetStream(url); | |
227 ASSERT_FALSE(stream2); | |
228 } | |
229 | |
OLD | NEW |