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

Side by Side Diff: chrome/browser/chromeos/drive/drive_file_stream_reader_unittest.cc

Issue 291483005: drive: Discard stream reader canceller as soon as the required data is obtained. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/chromeos/drive/drive_file_stream_reader.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 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 "chrome/browser/chromeos/drive/drive_file_stream_reader.h" 5 #include "chrome/browser/chromeos/drive/drive_file_stream_reader.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 class NetworkReaderProxyTest : public ::testing::Test { 103 class NetworkReaderProxyTest : public ::testing::Test {
104 protected: 104 protected:
105 NetworkReaderProxyTest() 105 NetworkReaderProxyTest()
106 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) { 106 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {
107 } 107 }
108 108
109 content::TestBrowserThreadBundle thread_bundle_; 109 content::TestBrowserThreadBundle thread_bundle_;
110 }; 110 };
111 111
112 TEST_F(NetworkReaderProxyTest, EmptyFile) { 112 TEST_F(NetworkReaderProxyTest, EmptyFile) {
113 NetworkReaderProxy proxy(0, 0, base::Bind(&base::DoNothing)); 113 NetworkReaderProxy proxy(0, 0, 0, base::Bind(&base::DoNothing));
114 114
115 net::TestCompletionCallback callback; 115 net::TestCompletionCallback callback;
116 const int kBufferSize = 10; 116 const int kBufferSize = 10;
117 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); 117 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize));
118 int result = proxy.Read(buffer.get(), kBufferSize, callback.callback()); 118 int result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
119 119
120 // For empty file, Read() should return 0 immediately. 120 // For empty file, Read() should return 0 immediately.
121 EXPECT_EQ(0, result); 121 EXPECT_EQ(0, result);
122 } 122 }
123 123
124 TEST_F(NetworkReaderProxyTest, Read) { 124 TEST_F(NetworkReaderProxyTest, Read) {
125 NetworkReaderProxy proxy(0, 10, base::Bind(&base::DoNothing)); 125 int cancel_called = 0;
126 {
127 NetworkReaderProxy proxy(0, 10, 10,
128 base::Bind(&IncrementCallback, &cancel_called));
129
130 net::TestCompletionCallback callback;
131 const int kBufferSize = 3;
132 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize));
133
134 // If no data is available yet, ERR_IO_PENDING should be returned.
135 int result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
136 EXPECT_EQ(net::ERR_IO_PENDING, result);
137
138 // And when the data is supplied, the callback will be called.
139 scoped_ptr<std::string> data(new std::string("abcde"));
140 proxy.OnGetContent(data.Pass());
141
142 // The returned data should be fit to the buffer size.
143 result = callback.GetResult(result);
144 EXPECT_EQ(3, result);
145 EXPECT_EQ("abc", std::string(buffer->data(), result));
146
147 // The next Read should return immediately because there is pending data
148 result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
149 EXPECT_EQ(2, result);
150 EXPECT_EQ("de", std::string(buffer->data(), result));
151
152 // Supply the data before calling Read operation.
153 data.reset(new std::string("fg"));
154 proxy.OnGetContent(data.Pass());
155 data.reset(new std::string("hij"));
156 proxy.OnGetContent(data.Pass()); // Now 10 bytes are supplied.
157
158 // The data should be concatenated if possible.
159 result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
160 EXPECT_EQ(3, result);
161 EXPECT_EQ("fgh", std::string(buffer->data(), result));
162
163 result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
164 EXPECT_EQ(2, result);
165 EXPECT_EQ("ij", std::string(buffer->data(), result));
166
167 // The whole data is read, so Read() should return 0 immediately by then.
168 result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
169 EXPECT_EQ(0, result);
170 }
171
172 // Proxy is deleted without any called to OnCompleted(). Even in the case,
173 // cancel callback should not be invoked.
174 EXPECT_EQ(0, cancel_called);
175 }
176
177 TEST_F(NetworkReaderProxyTest, ReadWithLimit) {
178 NetworkReaderProxy proxy(10, 10, 10, base::Bind(&base::DoNothing));
126 179
127 net::TestCompletionCallback callback; 180 net::TestCompletionCallback callback;
128 const int kBufferSize = 3; 181 const int kBufferSize = 3;
129 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize));
130
131 // If no data is available yet, ERR_IO_PENDING should be returned.
132 int result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
133 EXPECT_EQ(net::ERR_IO_PENDING, result);
134
135 // And when the data is supplied, the callback will be called.
136 scoped_ptr<std::string> data(new std::string("abcde"));
137 proxy.OnGetContent(data.Pass());
138
139 // The returned data should be fit to the buffer size.
140 result = callback.GetResult(result);
141 EXPECT_EQ(3, result);
142 EXPECT_EQ("abc", std::string(buffer->data(), result));
143
144 // The next Read should return immediately because there is pending data
145 result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
146 EXPECT_EQ(2, result);
147 EXPECT_EQ("de", std::string(buffer->data(), result));
148
149 // Supply the data before calling Read operation.
150 data.reset(new std::string("fg"));
151 proxy.OnGetContent(data.Pass());
152 data.reset(new std::string("hij"));
153 proxy.OnGetContent(data.Pass()); // Now 10 bytes are supplied.
154
155 // The data should be concatenated if possible.
156 result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
157 EXPECT_EQ(3, result);
158 EXPECT_EQ("fgh", std::string(buffer->data(), result));
159
160 result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
161 EXPECT_EQ(2, result);
162 EXPECT_EQ("ij", std::string(buffer->data(), result));
163
164 // The whole data is read, so Read() should return 0 immediately by then.
165 result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
166 EXPECT_EQ(0, result);
167 }
168
169 TEST_F(NetworkReaderProxyTest, ReadWithLimit) {
170 NetworkReaderProxy proxy(10, 10, base::Bind(&base::DoNothing));
171
172 net::TestCompletionCallback callback;
173 const int kBufferSize = 3;
174 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); 182 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize));
175 183
176 // If no data is available yet, ERR_IO_PENDING should be returned. 184 // If no data is available yet, ERR_IO_PENDING should be returned.
177 int result = proxy.Read(buffer.get(), kBufferSize, callback.callback()); 185 int result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
178 EXPECT_EQ(net::ERR_IO_PENDING, result); 186 EXPECT_EQ(net::ERR_IO_PENDING, result);
179 187
180 // And when the data is supplied, the callback will be called. 188 // And when the data is supplied, the callback will be called.
181 scoped_ptr<std::string> data(new std::string("abcde")); 189 scoped_ptr<std::string> data(new std::string("abcde"));
182 proxy.OnGetContent(data.Pass()); 190 proxy.OnGetContent(data.Pass());
183 data.reset(new std::string("fgh")); 191 data.reset(new std::string("fgh"));
(...skipping 25 matching lines...) Expand all
209 result = proxy.Read(buffer.get(), kBufferSize, callback.callback()); 217 result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
210 EXPECT_EQ(2, result); 218 EXPECT_EQ(2, result);
211 EXPECT_EQ("st", std::string(buffer->data(), result)); 219 EXPECT_EQ("st", std::string(buffer->data(), result));
212 220
213 // The whole data is read, so Read() should return 0 immediately by then. 221 // The whole data is read, so Read() should return 0 immediately by then.
214 result = proxy.Read(buffer.get(), kBufferSize, callback.callback()); 222 result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
215 EXPECT_EQ(0, result); 223 EXPECT_EQ(0, result);
216 } 224 }
217 225
218 TEST_F(NetworkReaderProxyTest, ErrorWithPendingCallback) { 226 TEST_F(NetworkReaderProxyTest, ErrorWithPendingCallback) {
219 NetworkReaderProxy proxy(0, 10, base::Bind(&base::DoNothing)); 227 NetworkReaderProxy proxy(0, 10, 10, base::Bind(&base::DoNothing));
220 228
221 net::TestCompletionCallback callback; 229 net::TestCompletionCallback callback;
222 const int kBufferSize = 3; 230 const int kBufferSize = 3;
223 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); 231 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize));
224 232
225 // Set pending callback. 233 // Set pending callback.
226 int result = proxy.Read(buffer.get(), kBufferSize, callback.callback()); 234 int result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
227 EXPECT_EQ(net::ERR_IO_PENDING, result); 235 EXPECT_EQ(net::ERR_IO_PENDING, result);
228 236
229 // Emulate that an error is found. The callback should be called internally. 237 // Emulate that an error is found. The callback should be called internally.
230 proxy.OnCompleted(FILE_ERROR_FAILED); 238 proxy.OnCompleted(FILE_ERROR_FAILED);
231 result = callback.GetResult(result); 239 result = callback.GetResult(result);
232 EXPECT_EQ(net::ERR_FAILED, result); 240 EXPECT_EQ(net::ERR_FAILED, result);
233 241
234 // The next Read call should also return the same error code. 242 // The next Read call should also return the same error code.
235 EXPECT_EQ(net::ERR_FAILED, 243 EXPECT_EQ(net::ERR_FAILED,
236 proxy.Read(buffer.get(), kBufferSize, callback.callback())); 244 proxy.Read(buffer.get(), kBufferSize, callback.callback()));
237 } 245 }
238 246
239 TEST_F(NetworkReaderProxyTest, ErrorWithPendingData) { 247 TEST_F(NetworkReaderProxyTest, ErrorWithPendingData) {
240 NetworkReaderProxy proxy(0, 10, base::Bind(&base::DoNothing)); 248 NetworkReaderProxy proxy(0, 10, 10, base::Bind(&base::DoNothing));
241 249
242 net::TestCompletionCallback callback; 250 net::TestCompletionCallback callback;
243 const int kBufferSize = 3; 251 const int kBufferSize = 3;
244 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); 252 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize));
245 253
246 // Supply the data before an error. 254 // Supply the data before an error.
247 scoped_ptr<std::string> data(new std::string("abcde")); 255 scoped_ptr<std::string> data(new std::string("abcde"));
248 proxy.OnGetContent(data.Pass()); 256 proxy.OnGetContent(data.Pass());
249 257
250 // Emulate that an error is found. 258 // Emulate that an error is found.
251 proxy.OnCompleted(FILE_ERROR_FAILED); 259 proxy.OnCompleted(FILE_ERROR_FAILED);
252 260
253 // The next Read call should return the error code, even if there is 261 // The next Read call should return the error code, even if there is
254 // pending data (the pending data should be released in OnCompleted. 262 // pending data (the pending data should be released in OnCompleted.
255 EXPECT_EQ(net::ERR_FAILED, 263 EXPECT_EQ(net::ERR_FAILED,
256 proxy.Read(buffer.get(), kBufferSize, callback.callback())); 264 proxy.Read(buffer.get(), kBufferSize, callback.callback()));
257 } 265 }
258 266
259 TEST_F(NetworkReaderProxyTest, CancelJob) { 267 TEST_F(NetworkReaderProxyTest, CancelJob) {
260 int num_called = 0; 268 int num_called = 0;
261 { 269 {
262 NetworkReaderProxy proxy( 270 NetworkReaderProxy proxy(
263 0, 0, base::Bind(&IncrementCallback, &num_called)); 271 0, 0, 0, base::Bind(&IncrementCallback, &num_called));
264 proxy.OnCompleted(FILE_ERROR_OK); 272 proxy.OnCompleted(FILE_ERROR_OK);
265 // Destroy the instance after the network operation is completed. 273 // Destroy the instance after the network operation is completed.
266 // The cancelling callback shouldn't be called. 274 // The cancelling callback shouldn't be called.
267 } 275 }
268 EXPECT_EQ(0, num_called); 276 EXPECT_EQ(0, num_called);
269 277
270 num_called = 0; 278 num_called = 0;
271 { 279 {
272 NetworkReaderProxy proxy( 280 NetworkReaderProxy proxy(
273 0, 0, base::Bind(&IncrementCallback, &num_called)); 281 0, 0, 0, base::Bind(&IncrementCallback, &num_called));
274 // Destroy the instance before the network operation is completed. 282 // Destroy the instance before the network operation is completed.
275 // The cancelling callback should be called. 283 // The cancelling callback should be called.
276 } 284 }
277 EXPECT_EQ(1, num_called); 285 EXPECT_EQ(1, num_called);
278 } 286 }
279 287
280 } // namespace internal 288 } // namespace internal
281 289
282 class DriveFileStreamReaderTest : public ::testing::Test { 290 class DriveFileStreamReaderTest : public ::testing::Test {
283 protected: 291 protected:
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 ASSERT_TRUE(entry); 559 ASSERT_TRUE(entry);
552 EXPECT_TRUE(reader->IsInitialized()); 560 EXPECT_TRUE(reader->IsInitialized());
553 561
554 // Read data from the reader, again. 562 // Read data from the reader, again.
555 std::string second_content; 563 std::string second_content;
556 ASSERT_EQ(net::OK, test_util::ReadAllData(reader.get(), &second_content)); 564 ASSERT_EQ(net::OK, test_util::ReadAllData(reader.get(), &second_content));
557 EXPECT_EQ(0u, second_content.size()); 565 EXPECT_EQ(0u, second_content.size());
558 } 566 }
559 567
560 } // namespace drive 568 } // namespace drive
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/drive/drive_file_stream_reader.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698