OLD | NEW |
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 "content/browser/fileapi/fileapi_message_filter.h" | 5 #include "content/browser/fileapi/fileapi_message_filter.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 0 /* process_id */, | 68 0 /* process_id */, |
69 browser_context_.GetRequestContext(), | 69 browser_context_.GetRequestContext(), |
70 file_system_context_.get(), | 70 file_system_context_.get(), |
71 blob_storage_context_, | 71 blob_storage_context_, |
72 stream_context_); | 72 stream_context_); |
73 | 73 |
74 // Complete initialization. | 74 // Complete initialization. |
75 message_loop_.RunUntilIdle(); | 75 message_loop_.RunUntilIdle(); |
76 } | 76 } |
77 | 77 |
78 // Tests via OnMessageReceived(const IPC::Message&). The channel proxy calls | |
79 // this method. | |
80 bool InvokeOnMessageReceived(const IPC::Message& message) { | |
81 bool message_was_ok; | |
82 return filter_->OnMessageReceived(message, &message_was_ok); | |
83 } | |
84 | |
85 base::MessageLoop message_loop_; | 78 base::MessageLoop message_loop_; |
86 TestBrowserThread io_browser_thread_; | 79 TestBrowserThread io_browser_thread_; |
87 | 80 |
88 TestBrowserContext browser_context_; | 81 TestBrowserContext browser_context_; |
89 scoped_refptr<fileapi::FileSystemContext> file_system_context_; | 82 scoped_refptr<fileapi::FileSystemContext> file_system_context_; |
90 StreamContext* stream_context_; | 83 StreamContext* stream_context_; |
91 ChromeBlobStorageContext* blob_storage_context_; | 84 ChromeBlobStorageContext* blob_storage_context_; |
92 | 85 |
93 scoped_refptr<FileAPIMessageFilter> filter_; | 86 scoped_refptr<FileAPIMessageFilter> filter_; |
94 }; | 87 }; |
95 | 88 |
96 TEST_F(FileAPIMessageFilterTest, CloseChannelWithInflightRequest) { | 89 TEST_F(FileAPIMessageFilterTest, CloseChannelWithInflightRequest) { |
97 scoped_refptr<FileAPIMessageFilter> filter( | 90 scoped_refptr<FileAPIMessageFilter> filter( |
98 new FileAPIMessageFilter( | 91 new FileAPIMessageFilter( |
99 0 /* process_id */, | 92 0 /* process_id */, |
100 browser_context_.GetRequestContext(), | 93 browser_context_.GetRequestContext(), |
101 file_system_context_.get(), | 94 file_system_context_.get(), |
102 ChromeBlobStorageContext::GetFor(&browser_context_), | 95 ChromeBlobStorageContext::GetFor(&browser_context_), |
103 StreamContext::GetFor(&browser_context_))); | 96 StreamContext::GetFor(&browser_context_))); |
104 filter->OnChannelConnected(0); | 97 filter->OnChannelConnected(0); |
105 | 98 |
106 // Complete initialization. | 99 // Complete initialization. |
107 message_loop_.RunUntilIdle(); | 100 message_loop_.RunUntilIdle(); |
108 | 101 |
109 int request_id = 0; | 102 int request_id = 0; |
110 const GURL kUrl("filesystem:http://example.com/temporary/foo"); | 103 const GURL kUrl("filesystem:http://example.com/temporary/foo"); |
111 FileSystemHostMsg_ReadMetadata read_metadata(request_id++, kUrl); | 104 FileSystemHostMsg_ReadMetadata read_metadata(request_id++, kUrl); |
112 bool message_was_ok; | 105 EXPECT_TRUE(filter->OnMessageReceived(read_metadata)); |
113 EXPECT_TRUE(filter->OnMessageReceived(read_metadata, &message_was_ok)); | |
114 | 106 |
115 // Close the filter while it has inflight request. | 107 // Close the filter while it has inflight request. |
116 filter->OnChannelClosing(); | 108 filter->OnChannelClosing(); |
117 | 109 |
118 // This shouldn't cause DCHECK failure. | 110 // This shouldn't cause DCHECK failure. |
119 message_loop_.RunUntilIdle(); | 111 message_loop_.RunUntilIdle(); |
120 } | 112 } |
121 | 113 |
122 TEST_F(FileAPIMessageFilterTest, MultipleFilters) { | 114 TEST_F(FileAPIMessageFilterTest, MultipleFilters) { |
123 scoped_refptr<FileAPIMessageFilter> filter1( | 115 scoped_refptr<FileAPIMessageFilter> filter1( |
(...skipping 12 matching lines...) Expand all Loading... |
136 StreamContext::GetFor(&browser_context_))); | 128 StreamContext::GetFor(&browser_context_))); |
137 filter1->OnChannelConnected(0); | 129 filter1->OnChannelConnected(0); |
138 filter2->OnChannelConnected(1); | 130 filter2->OnChannelConnected(1); |
139 | 131 |
140 // Complete initialization. | 132 // Complete initialization. |
141 message_loop_.RunUntilIdle(); | 133 message_loop_.RunUntilIdle(); |
142 | 134 |
143 int request_id = 0; | 135 int request_id = 0; |
144 const GURL kUrl("filesystem:http://example.com/temporary/foo"); | 136 const GURL kUrl("filesystem:http://example.com/temporary/foo"); |
145 FileSystemHostMsg_ReadMetadata read_metadata(request_id++, kUrl); | 137 FileSystemHostMsg_ReadMetadata read_metadata(request_id++, kUrl); |
146 bool message_was_ok; | 138 EXPECT_TRUE(filter1->OnMessageReceived(read_metadata)); |
147 EXPECT_TRUE(filter1->OnMessageReceived(read_metadata, &message_was_ok)); | |
148 | 139 |
149 // Close the other filter before the request for filter1 is processed. | 140 // Close the other filter before the request for filter1 is processed. |
150 filter2->OnChannelClosing(); | 141 filter2->OnChannelClosing(); |
151 | 142 |
152 // This shouldn't cause DCHECK failure. | 143 // This shouldn't cause DCHECK failure. |
153 message_loop_.RunUntilIdle(); | 144 message_loop_.RunUntilIdle(); |
154 } | 145 } |
155 | 146 |
156 TEST_F(FileAPIMessageFilterTest, BuildEmptyStream) { | 147 TEST_F(FileAPIMessageFilterTest, BuildEmptyStream) { |
157 StreamRegistry* stream_registry = stream_context_->registry(); | 148 StreamRegistry* stream_registry = stream_context_->registry(); |
158 | 149 |
159 const GURL kUrl(kFakeBlobInternalUrlSpec); | 150 const GURL kUrl(kFakeBlobInternalUrlSpec); |
160 const GURL kDifferentUrl("blob:barfoo"); | 151 const GURL kDifferentUrl("blob:barfoo"); |
161 | 152 |
162 EXPECT_EQ(NULL, stream_registry->GetStream(kUrl).get()); | 153 EXPECT_EQ(NULL, stream_registry->GetStream(kUrl).get()); |
163 | 154 |
164 StreamHostMsg_StartBuilding start_message(kUrl, kFakeContentType); | 155 StreamHostMsg_StartBuilding start_message(kUrl, kFakeContentType); |
165 EXPECT_TRUE(InvokeOnMessageReceived(start_message)); | 156 EXPECT_TRUE(filter_->OnMessageReceived(start_message)); |
166 | 157 |
167 const int kBufferSize = 10; | 158 const int kBufferSize = 10; |
168 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); | 159 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); |
169 int bytes_read = 0; | 160 int bytes_read = 0; |
170 | 161 |
171 scoped_refptr<Stream> stream = stream_registry->GetStream(kUrl); | 162 scoped_refptr<Stream> stream = stream_registry->GetStream(kUrl); |
172 // Stream becomes available for read right after registration. | 163 // Stream becomes available for read right after registration. |
173 ASSERT_FALSE(stream.get() == NULL); | 164 ASSERT_FALSE(stream.get() == NULL); |
174 EXPECT_EQ(Stream::STREAM_EMPTY, | 165 EXPECT_EQ(Stream::STREAM_EMPTY, |
175 stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read)); | 166 stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read)); |
176 EXPECT_EQ(0, bytes_read); | 167 EXPECT_EQ(0, bytes_read); |
177 stream = NULL; | 168 stream = NULL; |
178 | 169 |
179 StreamHostMsg_FinishBuilding finish_message(kUrl); | 170 StreamHostMsg_FinishBuilding finish_message(kUrl); |
180 EXPECT_TRUE(InvokeOnMessageReceived(finish_message)); | 171 EXPECT_TRUE(filter_->OnMessageReceived(finish_message)); |
181 | 172 |
182 stream = stream_registry->GetStream(kUrl); | 173 stream = stream_registry->GetStream(kUrl); |
183 ASSERT_FALSE(stream.get() == NULL); | 174 ASSERT_FALSE(stream.get() == NULL); |
184 EXPECT_EQ(Stream::STREAM_EMPTY, | 175 EXPECT_EQ(Stream::STREAM_EMPTY, |
185 stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read)); | 176 stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read)); |
186 EXPECT_EQ(0, bytes_read); | 177 EXPECT_EQ(0, bytes_read); |
187 | 178 |
188 // Run loop to finish transfer. | 179 // Run loop to finish transfer. |
189 message_loop_.RunUntilIdle(); | 180 message_loop_.RunUntilIdle(); |
190 | 181 |
191 EXPECT_EQ(Stream::STREAM_COMPLETE, | 182 EXPECT_EQ(Stream::STREAM_COMPLETE, |
192 stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read)); | 183 stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read)); |
193 EXPECT_EQ(0, bytes_read); | 184 EXPECT_EQ(0, bytes_read); |
194 | 185 |
195 // Nothing should be returned for a URL we didn't use. | 186 // Nothing should be returned for a URL we didn't use. |
196 EXPECT_TRUE(stream_registry->GetStream(kDifferentUrl).get() == NULL); | 187 EXPECT_TRUE(stream_registry->GetStream(kDifferentUrl).get() == NULL); |
197 } | 188 } |
198 | 189 |
199 TEST_F(FileAPIMessageFilterTest, BuildNonEmptyStream) { | 190 TEST_F(FileAPIMessageFilterTest, BuildNonEmptyStream) { |
200 StreamRegistry* stream_registry = stream_context_->registry(); | 191 StreamRegistry* stream_registry = stream_context_->registry(); |
201 | 192 |
202 const GURL kUrl(kFakeBlobInternalUrlSpec); | 193 const GURL kUrl(kFakeBlobInternalUrlSpec); |
203 | 194 |
204 EXPECT_EQ(NULL, stream_registry->GetStream(kUrl).get()); | 195 EXPECT_EQ(NULL, stream_registry->GetStream(kUrl).get()); |
205 | 196 |
206 StreamHostMsg_StartBuilding start_message(kUrl, kFakeContentType); | 197 StreamHostMsg_StartBuilding start_message(kUrl, kFakeContentType); |
207 EXPECT_TRUE(InvokeOnMessageReceived(start_message)); | 198 EXPECT_TRUE(filter_->OnMessageReceived(start_message)); |
208 | 199 |
209 webkit_blob::BlobData::Item item; | 200 webkit_blob::BlobData::Item item; |
210 const std::string kFakeData = "foobarbaz"; | 201 const std::string kFakeData = "foobarbaz"; |
211 item.SetToBytes(kFakeData.data(), kFakeData.size()); | 202 item.SetToBytes(kFakeData.data(), kFakeData.size()); |
212 StreamHostMsg_AppendBlobDataItem append_message(kUrl, item); | 203 StreamHostMsg_AppendBlobDataItem append_message(kUrl, item); |
213 EXPECT_TRUE(InvokeOnMessageReceived(append_message)); | 204 EXPECT_TRUE(filter_->OnMessageReceived(append_message)); |
214 | 205 |
215 StreamHostMsg_FinishBuilding finish_message(kUrl); | 206 StreamHostMsg_FinishBuilding finish_message(kUrl); |
216 EXPECT_TRUE(InvokeOnMessageReceived(finish_message)); | 207 EXPECT_TRUE(filter_->OnMessageReceived(finish_message)); |
217 | 208 |
218 // Run loop to finish transfer and commit finalize command. | 209 // Run loop to finish transfer and commit finalize command. |
219 message_loop_.RunUntilIdle(); | 210 message_loop_.RunUntilIdle(); |
220 | 211 |
221 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kFakeData.size())); | 212 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kFakeData.size())); |
222 int bytes_read = 0; | 213 int bytes_read = 0; |
223 | 214 |
224 scoped_refptr<Stream> stream = stream_registry->GetStream(kUrl); | 215 scoped_refptr<Stream> stream = stream_registry->GetStream(kUrl); |
225 ASSERT_FALSE(stream.get() == NULL); | 216 ASSERT_FALSE(stream.get() == NULL); |
226 | 217 |
(...skipping 14 matching lines...) Expand all Loading... |
241 | 232 |
242 EXPECT_EQ(NULL, stream_registry->GetStream(kUrl).get()); | 233 EXPECT_EQ(NULL, stream_registry->GetStream(kUrl).get()); |
243 | 234 |
244 // For win, we need to set valid PID to the filter. | 235 // For win, we need to set valid PID to the filter. |
245 // OnAppendSharedMemoryToStream passes the peer process's handle to | 236 // OnAppendSharedMemoryToStream passes the peer process's handle to |
246 // SharedMemory's constructor. If it's incorrect, DuplicateHandle won't work | 237 // SharedMemory's constructor. If it's incorrect, DuplicateHandle won't work |
247 // correctly. | 238 // correctly. |
248 filter_->set_peer_pid_for_testing(base::Process::Current().pid()); | 239 filter_->set_peer_pid_for_testing(base::Process::Current().pid()); |
249 | 240 |
250 StreamHostMsg_StartBuilding start_message(kUrl, kFakeContentType); | 241 StreamHostMsg_StartBuilding start_message(kUrl, kFakeContentType); |
251 EXPECT_TRUE(InvokeOnMessageReceived(start_message)); | 242 EXPECT_TRUE(filter_->OnMessageReceived(start_message)); |
252 | 243 |
253 const std::string kFakeData = "foobarbaz"; | 244 const std::string kFakeData = "foobarbaz"; |
254 | 245 |
255 scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory); | 246 scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory); |
256 ASSERT_TRUE(shared_memory->CreateAndMapAnonymous(kFakeData.size())); | 247 ASSERT_TRUE(shared_memory->CreateAndMapAnonymous(kFakeData.size())); |
257 memcpy(shared_memory->memory(), kFakeData.data(), kFakeData.size()); | 248 memcpy(shared_memory->memory(), kFakeData.data(), kFakeData.size()); |
258 StreamHostMsg_SyncAppendSharedMemory append_message( | 249 StreamHostMsg_SyncAppendSharedMemory append_message( |
259 kUrl, shared_memory->handle(), kFakeData.size()); | 250 kUrl, shared_memory->handle(), kFakeData.size()); |
260 EXPECT_TRUE(InvokeOnMessageReceived(append_message)); | 251 EXPECT_TRUE(filter_->OnMessageReceived(append_message)); |
261 | 252 |
262 StreamHostMsg_FinishBuilding finish_message(kUrl); | 253 StreamHostMsg_FinishBuilding finish_message(kUrl); |
263 EXPECT_TRUE(InvokeOnMessageReceived(finish_message)); | 254 EXPECT_TRUE(filter_->OnMessageReceived(finish_message)); |
264 | 255 |
265 // Run loop to finish transfer and commit finalize command. | 256 // Run loop to finish transfer and commit finalize command. |
266 message_loop_.RunUntilIdle(); | 257 message_loop_.RunUntilIdle(); |
267 | 258 |
268 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kFakeData.size())); | 259 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kFakeData.size())); |
269 int bytes_read = 0; | 260 int bytes_read = 0; |
270 | 261 |
271 scoped_refptr<Stream> stream = stream_registry->GetStream(kUrl); | 262 scoped_refptr<Stream> stream = stream_registry->GetStream(kUrl); |
272 ASSERT_FALSE(stream.get() == NULL); | 263 ASSERT_FALSE(stream.get() == NULL); |
273 | 264 |
274 EXPECT_EQ(Stream::STREAM_HAS_DATA, | 265 EXPECT_EQ(Stream::STREAM_HAS_DATA, |
275 stream->ReadRawData(buffer.get(), kFakeData.size(), &bytes_read)); | 266 stream->ReadRawData(buffer.get(), kFakeData.size(), &bytes_read)); |
276 EXPECT_EQ(kFakeData.size(), static_cast<size_t>(bytes_read)); | 267 EXPECT_EQ(kFakeData.size(), static_cast<size_t>(bytes_read)); |
277 EXPECT_EQ(kFakeData, std::string(buffer->data(), bytes_read)); | 268 EXPECT_EQ(kFakeData, std::string(buffer->data(), bytes_read)); |
278 | 269 |
279 EXPECT_EQ(Stream::STREAM_COMPLETE, | 270 EXPECT_EQ(Stream::STREAM_COMPLETE, |
280 stream->ReadRawData(buffer.get(), kFakeData.size(), &bytes_read)); | 271 stream->ReadRawData(buffer.get(), kFakeData.size(), &bytes_read)); |
281 EXPECT_EQ(0, bytes_read); | 272 EXPECT_EQ(0, bytes_read); |
282 } | 273 } |
283 | 274 |
284 TEST_F(FileAPIMessageFilterTest, BuildStreamAndCallOnChannelClosing) { | 275 TEST_F(FileAPIMessageFilterTest, BuildStreamAndCallOnChannelClosing) { |
285 StreamRegistry* stream_registry = stream_context_->registry(); | 276 StreamRegistry* stream_registry = stream_context_->registry(); |
286 | 277 |
287 const GURL kUrl(kFakeBlobInternalUrlSpec); | 278 const GURL kUrl(kFakeBlobInternalUrlSpec); |
288 | 279 |
289 StreamHostMsg_StartBuilding start_message(kUrl, kFakeContentType); | 280 StreamHostMsg_StartBuilding start_message(kUrl, kFakeContentType); |
290 EXPECT_TRUE(InvokeOnMessageReceived(start_message)); | 281 EXPECT_TRUE(filter_->OnMessageReceived(start_message)); |
291 | 282 |
292 ASSERT_FALSE(stream_registry->GetStream(kUrl).get() == NULL); | 283 ASSERT_FALSE(stream_registry->GetStream(kUrl).get() == NULL); |
293 | 284 |
294 filter_->OnChannelClosing(); | 285 filter_->OnChannelClosing(); |
295 | 286 |
296 ASSERT_EQ(NULL, stream_registry->GetStream(kUrl).get()); | 287 ASSERT_EQ(NULL, stream_registry->GetStream(kUrl).get()); |
297 } | 288 } |
298 | 289 |
299 TEST_F(FileAPIMessageFilterTest, CloneStream) { | 290 TEST_F(FileAPIMessageFilterTest, CloneStream) { |
300 StreamRegistry* stream_registry = stream_context_->registry(); | 291 StreamRegistry* stream_registry = stream_context_->registry(); |
301 | 292 |
302 const GURL kUrl(kFakeBlobInternalUrlSpec); | 293 const GURL kUrl(kFakeBlobInternalUrlSpec); |
303 const GURL kDestUrl(kFakeBlobInternalUrlSpec2); | 294 const GURL kDestUrl(kFakeBlobInternalUrlSpec2); |
304 | 295 |
305 StreamHostMsg_StartBuilding start_message(kUrl, kFakeContentType); | 296 StreamHostMsg_StartBuilding start_message(kUrl, kFakeContentType); |
306 EXPECT_TRUE(InvokeOnMessageReceived(start_message)); | 297 EXPECT_TRUE(filter_->OnMessageReceived(start_message)); |
307 | 298 |
308 StreamHostMsg_Clone clone_message(kDestUrl, kUrl); | 299 StreamHostMsg_Clone clone_message(kDestUrl, kUrl); |
309 EXPECT_TRUE(InvokeOnMessageReceived(clone_message)); | 300 EXPECT_TRUE(filter_->OnMessageReceived(clone_message)); |
310 | 301 |
311 ASSERT_FALSE(stream_registry->GetStream(kUrl).get() == NULL); | 302 ASSERT_FALSE(stream_registry->GetStream(kUrl).get() == NULL); |
312 ASSERT_FALSE(stream_registry->GetStream(kDestUrl).get() == NULL); | 303 ASSERT_FALSE(stream_registry->GetStream(kDestUrl).get() == NULL); |
313 } | 304 } |
314 | 305 |
315 } // namespace content | 306 } // namespace content |
OLD | NEW |