Chromium Code Reviews| Index: content/browser/fileapi/fileapi_message_filter_unittest.cc |
| diff --git a/content/browser/fileapi/fileapi_message_filter_unittest.cc b/content/browser/fileapi/fileapi_message_filter_unittest.cc |
| index 4266941380010d72bddae83b573aa33f1f54e09e..07cf7ab5f240b466ab678b0b840841b3cb8c1c48 100644 |
| --- a/content/browser/fileapi/fileapi_message_filter_unittest.cc |
| +++ b/content/browser/fileapi/fileapi_message_filter_unittest.cc |
| @@ -8,14 +8,17 @@ |
| #include <vector> |
| #include "base/memory/ref_counted.h" |
| +#include "base/memory/shared_memory.h" |
| #include "base/message_loop/message_loop.h" |
| #include "content/browser/fileapi/chrome_blob_storage_context.h" |
| +#include "content/browser/streams/stream_registry.h" |
| #include "content/common/fileapi/webblob_messages.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/common/common_param_traits.h" |
| #include "content/public/test/mock_render_process_host.h" |
| #include "content/public/test/test_browser_context.h" |
| #include "content/public/test/test_browser_thread.h" |
| +#include "net/base/io_buffer.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "webkit/browser/blob/blob_storage_controller.h" |
| #include "webkit/browser/fileapi/file_system_context.h" |
| @@ -24,6 +27,17 @@ |
| namespace content { |
| +namespace { |
| + |
| +const char kFakeBlobInternalUrlSpec[] = |
| + "blob:blobinternal%3A///dc83ede4-9bbd-453b-be2e-60fd623fcc93"; |
| +const char kFakeBlobInternalUrlSpec2[] = |
| + "blob:blobinternal%3A///d28ae2e7-d233-4dda-9598-d135fe5d403e"; |
| + |
| +const char kFakeContentType[] = "fake/type"; |
| + |
| +} // namespace |
| + |
| class FileAPIMessageFilterTest : public testing::Test { |
| public: |
| FileAPIMessageFilterTest() |
| @@ -34,6 +48,25 @@ class FileAPIMessageFilterTest : public testing::Test { |
| virtual void SetUp() OVERRIDE { |
| file_system_context_ = |
| fileapi::CreateFileSystemContextForTesting(NULL, base::FilePath()); |
| + stream_context_ = StreamContext::GetFor(&browser_context_); |
| + blob_storage_context_ = ChromeBlobStorageContext::GetFor(&browser_context_); |
| + |
| + filter_ = new FileAPIMessageFilter( |
| + 0 /* process_id */, |
| + browser_context_.GetRequestContext(), |
| + file_system_context_.get(), |
| + blob_storage_context_, |
| + stream_context_); |
| + |
| + // Complete initialization. |
| + message_loop_.RunUntilIdle(); |
| + } |
| + |
| + // To test via OnMessageReceived(const IPC::Message&) which is called by the |
| + // channel proxy. Since OnMessageReceived is hidden on FileAPIMessageFilter, |
| + // cast it. |
| + IPC::ChannelProxy::MessageFilter* GetUpcastedFilter() { |
| + return static_cast<IPC::ChannelProxy::MessageFilter*>(filter_.get()); |
|
kinuko
2013/07/23 13:57:23
nit: since we almost always call OnMessageReceived
tyoshino (SeeGerritForStatus)
2013/07/24 12:14:20
Done.
|
| } |
| base::MessageLoop message_loop_; |
| @@ -41,51 +74,198 @@ class FileAPIMessageFilterTest : public testing::Test { |
| TestBrowserContext browser_context_; |
| scoped_refptr<fileapi::FileSystemContext> file_system_context_; |
| + StreamContext* stream_context_; |
| + ChromeBlobStorageContext* blob_storage_context_; |
| + |
| + scoped_refptr<FileAPIMessageFilter> filter_; |
| }; |
| TEST_F(FileAPIMessageFilterTest, BuildEmptyBlob) { |
| - scoped_refptr<FileAPIMessageFilter> filter( |
| - new FileAPIMessageFilter( |
| - 0 /* process_id */, |
| - browser_context_.GetRequestContext(), |
| - file_system_context_.get(), |
| - ChromeBlobStorageContext::GetFor(&browser_context_))); |
| - |
| - // Complete initialization. |
| - message_loop_.RunUntilIdle(); |
| - |
| webkit_blob::BlobStorageController* controller = |
| - ChromeBlobStorageContext::GetFor(&browser_context_)->controller(); |
| + blob_storage_context_->controller(); |
| const GURL kUrl("blob:foobar"); |
| const GURL kDifferentUrl("blob:barfoo"); |
| - const std::string kContentType = "fake/type"; |
| EXPECT_EQ(NULL, controller->GetBlobDataFromUrl(kUrl)); |
| - // Test via OnMessageReceived(const IPC::Message&) which is called by the |
| - // channel proxy. Since OnMessageReceived is hidden on FileAPIMessageFilter, |
| - // cast it. |
| - IPC::ChannelProxy::MessageFilter* casted_filter = |
| - static_cast<IPC::ChannelProxy::MessageFilter*>(filter.get()); |
| - |
| BlobHostMsg_StartBuildingBlob start_message(kUrl); |
| - EXPECT_TRUE(casted_filter->OnMessageReceived(start_message)); |
| + EXPECT_TRUE(GetUpcastedFilter()->OnMessageReceived(start_message)); |
| // Blob is still being built. Nothing should be returned. |
| EXPECT_EQ(NULL, controller->GetBlobDataFromUrl(kUrl)); |
| - BlobHostMsg_FinishBuildingBlob finish_message(kUrl, kContentType); |
| - EXPECT_TRUE(casted_filter->OnMessageReceived(finish_message)); |
| + BlobHostMsg_FinishBuildingBlob finish_message(kUrl, kFakeContentType); |
| + EXPECT_TRUE(GetUpcastedFilter()->OnMessageReceived(finish_message)); |
| // Now, Blob is built. |
| webkit_blob::BlobData* blob_data = controller->GetBlobDataFromUrl(kUrl); |
| ASSERT_FALSE(blob_data == NULL); |
| EXPECT_EQ(0U, blob_data->items().size()); |
| - EXPECT_EQ(kContentType, blob_data->content_type()); |
| + EXPECT_EQ(kFakeContentType, blob_data->content_type()); |
| // Nothing should be returned for a URL we didn't use. |
| EXPECT_TRUE(controller->GetBlobDataFromUrl(kDifferentUrl) == NULL); |
| } |
| +TEST_F(FileAPIMessageFilterTest, BuildEmptyStream) { |
| + StreamRegistry* stream_registry = stream_context_->registry(); |
| + |
| + webkit_blob::BlobStorageController* blob_controller = |
| + blob_storage_context_->controller(); |
| + |
| + const GURL kUrl(kFakeBlobInternalUrlSpec); |
| + const GURL kDifferentUrl("blob:barfoo"); |
| + |
| + EXPECT_EQ(NULL, stream_registry->GetStream(kUrl).get()); |
| + EXPECT_EQ(NULL, blob_controller->GetBlobDataFromUrl(kUrl)); |
| + |
| + BlobHostMsg_StartBuildingStream start_message(kUrl, kFakeContentType); |
| + EXPECT_TRUE(GetUpcastedFilter()->OnMessageReceived(start_message)); |
| + |
| + const int kBufferSize = 10; |
| + scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); |
| + int bytes_read = 0; |
| + |
| + scoped_refptr<Stream> stream = stream_registry->GetStream(kUrl); |
| + // Stream becomes available for read right after registration. |
| + ASSERT_FALSE(stream.get() == NULL); |
| + EXPECT_EQ(Stream::STREAM_EMPTY, |
| + stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read)); |
| + EXPECT_EQ(0, bytes_read); |
| + stream = NULL; |
| + |
| + BlobHostMsg_FinishBuildingStream finish_message(kUrl); |
| + EXPECT_TRUE(GetUpcastedFilter()->OnMessageReceived(finish_message)); |
| + |
| + // Blob controller shouldn't be affected. |
| + EXPECT_EQ(NULL, blob_controller->GetBlobDataFromUrl(kUrl)); |
| + |
| + stream = stream_registry->GetStream(kUrl); |
| + ASSERT_FALSE(stream.get() == NULL); |
| + EXPECT_EQ(Stream::STREAM_EMPTY, |
| + stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read)); |
| + EXPECT_EQ(0, bytes_read); |
| + |
| + // Run loop to finish transfer. |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_EQ(Stream::STREAM_COMPLETE, |
| + stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read)); |
| + EXPECT_EQ(0, bytes_read); |
| + |
| + // Nothing should be returned for a URL we didn't use. |
| + EXPECT_TRUE(stream_registry->GetStream(kDifferentUrl).get() == NULL); |
| +} |
| + |
| +TEST_F(FileAPIMessageFilterTest, BuildNonEmptyStream) { |
| + StreamRegistry* stream_registry = stream_context_->registry(); |
| + |
| + const GURL kUrl(kFakeBlobInternalUrlSpec); |
| + |
| + EXPECT_EQ(NULL, stream_registry->GetStream(kUrl).get()); |
| + |
| + BlobHostMsg_StartBuildingStream start_message(kUrl, kFakeContentType); |
| + EXPECT_TRUE(GetUpcastedFilter()->OnMessageReceived(start_message)); |
| + |
| + webkit_blob::BlobData::Item item; |
| + const std::string kFakeData = "foobarbaz"; |
| + item.SetToBytes(kFakeData.data(), kFakeData.size()); |
| + BlobHostMsg_AppendBlobDataItemToBlobOrStream append_message(kUrl, item); |
| + EXPECT_TRUE(GetUpcastedFilter()->OnMessageReceived(append_message)); |
| + |
| + BlobHostMsg_FinishBuildingStream finish_message(kUrl); |
| + EXPECT_TRUE(GetUpcastedFilter()->OnMessageReceived(finish_message)); |
| + |
| + // Run loop to finish transfer and commit finalize command. |
| + message_loop_.RunUntilIdle(); |
| + |
| + scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kFakeData.size())); |
| + int bytes_read = 0; |
| + |
| + scoped_refptr<Stream> stream = stream_registry->GetStream(kUrl); |
| + ASSERT_FALSE(stream.get() == NULL); |
| + |
| + EXPECT_EQ(Stream::STREAM_HAS_DATA, |
| + stream->ReadRawData(buffer.get(), kFakeData.size(), &bytes_read)); |
| + EXPECT_EQ(kFakeData.size(), static_cast<size_t>(bytes_read)); |
| + EXPECT_EQ(kFakeData, std::string(buffer->data(), bytes_read)); |
| + |
| + EXPECT_EQ(Stream::STREAM_COMPLETE, |
| + stream->ReadRawData(buffer.get(), kFakeData.size(), &bytes_read)); |
| + EXPECT_EQ(0, bytes_read); |
| +} |
| + |
| +TEST_F(FileAPIMessageFilterTest, BuildStreamWithSharedMemory) { |
| + StreamRegistry* stream_registry = stream_context_->registry(); |
| + |
| + const GURL kUrl(kFakeBlobInternalUrlSpec); |
| + |
| + EXPECT_EQ(NULL, stream_registry->GetStream(kUrl).get()); |
| + |
| + BlobHostMsg_StartBuildingStream start_message(kUrl, kFakeContentType); |
| + EXPECT_TRUE(GetUpcastedFilter()->OnMessageReceived(start_message)); |
| + |
| + const std::string kFakeData = "foobarbaz"; |
| + |
| + scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory); |
| + ASSERT_TRUE(shared_memory->CreateAndMapAnonymous(kFakeData.size())); |
| + memcpy(shared_memory->memory(), kFakeData.data(), kFakeData.size()); |
| + BlobHostMsg_SyncAppendSharedMemoryToBlobOrStream append_message( |
| + kUrl, shared_memory->handle(), kFakeData.size()); |
| + EXPECT_TRUE(GetUpcastedFilter()->OnMessageReceived(append_message)); |
| + |
| + BlobHostMsg_FinishBuildingStream finish_message(kUrl); |
| + EXPECT_TRUE(GetUpcastedFilter()->OnMessageReceived(finish_message)); |
| + |
| + // Run loop to finish transfer and commit finalize command. |
| + message_loop_.RunUntilIdle(); |
| + |
| + scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kFakeData.size())); |
| + int bytes_read = 0; |
| + |
| + scoped_refptr<Stream> stream = stream_registry->GetStream(kUrl); |
| + ASSERT_FALSE(stream.get() == NULL); |
| + |
| + EXPECT_EQ(Stream::STREAM_HAS_DATA, |
| + stream->ReadRawData(buffer.get(), kFakeData.size(), &bytes_read)); |
| + EXPECT_EQ(kFakeData.size(), static_cast<size_t>(bytes_read)); |
| + EXPECT_EQ(kFakeData, std::string(buffer->data(), bytes_read)); |
| + |
| + EXPECT_EQ(Stream::STREAM_COMPLETE, |
| + stream->ReadRawData(buffer.get(), kFakeData.size(), &bytes_read)); |
| + EXPECT_EQ(0, bytes_read); |
| +} |
| + |
| +TEST_F(FileAPIMessageFilterTest, BuildStreamAndCallOnChannelClosing) { |
| + StreamRegistry* stream_registry = stream_context_->registry(); |
| + |
| + const GURL kUrl(kFakeBlobInternalUrlSpec); |
| + |
| + BlobHostMsg_StartBuildingStream start_message(kUrl, kFakeContentType); |
| + EXPECT_TRUE(GetUpcastedFilter()->OnMessageReceived(start_message)); |
| + |
| + ASSERT_FALSE(stream_registry->GetStream(kUrl).get() == NULL); |
| + |
| + filter_->OnChannelClosing(); |
| + |
| + ASSERT_EQ(NULL, stream_registry->GetStream(kUrl).get()); |
| +} |
| + |
| +TEST_F(FileAPIMessageFilterTest, CloneStream) { |
| + StreamRegistry* stream_registry = stream_context_->registry(); |
| + |
| + const GURL kUrl(kFakeBlobInternalUrlSpec); |
| + const GURL kDestUrl(kFakeBlobInternalUrlSpec2); |
| + |
| + BlobHostMsg_StartBuildingStream start_message(kUrl, kFakeContentType); |
| + EXPECT_TRUE(GetUpcastedFilter()->OnMessageReceived(start_message)); |
| + |
| + BlobHostMsg_CloneBlobOrStream clone_message(kDestUrl, kUrl); |
| + EXPECT_TRUE(GetUpcastedFilter()->OnMessageReceived(clone_message)); |
| + |
| + ASSERT_FALSE(stream_registry->GetStream(kUrl).get() == NULL); |
| + ASSERT_FALSE(stream_registry->GetStream(kDestUrl).get() == NULL); |
| +} |
| + |
| } // namespace fileapi |