diff options
4 files changed, 63 insertions, 26 deletions
diff --git a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc index c96dff0..65206db 100644 --- a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc +++ b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc @@ -56,7 +56,7 @@ IN_PROC_BROWSER_TEST_F(FileSystemProviderApiTest, ReadFile) { << message_; } -IN_PROC_BROWSER_TEST_F(FileSystemProviderApiTest, DISABLED_BigFile) { +IN_PROC_BROWSER_TEST_F(FileSystemProviderApiTest, BigFile) { ASSERT_TRUE(RunPlatformAppTestWithFlags("file_system_provider/big_file", kFlagLoadAsComponent)) << message_; diff --git a/content/browser/fileapi/blob_storage_context_unittest.cc b/content/browser/fileapi/blob_storage_context_unittest.cc index 9602b3a..29270b7 100644 --- a/content/browser/fileapi/blob_storage_context_unittest.cc +++ b/content/browser/fileapi/blob_storage_context_unittest.cc @@ -2,6 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "storage/browser/blob/blob_storage_context.h" + +#include <limits> +#include <string> + #include "base/files/file_path.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" @@ -11,24 +16,19 @@ #include "content/browser/fileapi/blob_storage_host.h" #include "storage/browser/blob/blob_data_builder.h" #include "storage/browser/blob/blob_data_handle.h" +#include "storage/browser/blob/blob_data_item.h" #include "storage/browser/blob/blob_data_snapshot.h" -#include "storage/browser/blob/blob_storage_context.h" #include "testing/gtest/include/gtest/gtest.h" using storage::BlobDataBuilder; using storage::BlobDataHandle; +using storage::BlobDataItem; using storage::BlobDataSnapshot; using storage::BlobStorageContext; using storage::DataElement; namespace content { - namespace { -// This is necessary to clean up the blobs after the handles are released. -void RunEventLoopTillIdle() { - base::RunLoop run_loop; - run_loop.RunUntilIdle(); -} void SetupBasicBlob(BlobStorageHost* host, const std::string& id) { EXPECT_TRUE(host->StartBuildingBlob(id)); @@ -38,6 +38,7 @@ void SetupBasicBlob(BlobStorageHost* host, const std::string& id) { EXPECT_TRUE(host->FinishBuildingBlob(id, "text/plain")); EXPECT_FALSE(host->StartBuildingBlob(id)); } + } // namespace TEST(BlobStorageContextTest, IncrementDecrementRef) { @@ -54,7 +55,7 @@ TEST(BlobStorageContextTest, IncrementDecrementRef) { blob_data_handle = context.GetBlobDataFromUUID(kId); EXPECT_TRUE(blob_data_handle); blob_data_handle.reset(); - RunEventLoopTillIdle(); + base::RunLoop().RunUntilIdle(); // Make sure its still there after inc/dec. EXPECT_TRUE(host.IncrementBlobRefCount(kId)); @@ -62,7 +63,7 @@ TEST(BlobStorageContextTest, IncrementDecrementRef) { blob_data_handle = context.GetBlobDataFromUUID(kId); EXPECT_TRUE(blob_data_handle); blob_data_handle.reset(); - RunEventLoopTillIdle(); + base::RunLoop().RunUntilIdle(); // Make sure it goes away in the end. EXPECT_TRUE(host.DecrementBlobRefCount(kId)); @@ -113,7 +114,7 @@ TEST(BlobStorageContextTest, BlobDataHandle) { // Should disappear after dropping both handles. blob_data_handle.reset(); another_handle.reset(); - RunEventLoopTillIdle(); + base::RunLoop().RunUntilIdle(); blob_data_handle = context.GetBlobDataFromUUID(kId); EXPECT_FALSE(blob_data_handle); @@ -147,11 +148,11 @@ TEST(BlobStorageContextTest, MemoryUsage) { EXPECT_EQ(10lu, context.memory_usage()); blob_data_handle.reset(); - RunEventLoopTillIdle(); + base::RunLoop().RunUntilIdle(); EXPECT_EQ(10lu, context.memory_usage()); blob_data_handle2.reset(); - RunEventLoopTillIdle(); + base::RunLoop().RunUntilIdle(); EXPECT_EQ(0lu, context.memory_usage()); } @@ -190,7 +191,7 @@ TEST(BlobStorageContextTest, AddFinishedBlob) { blob_data_handle.reset(); data2.reset(); - RunEventLoopTillIdle(); + base::RunLoop().RunUntilIdle(); blob_data_handle = context.GetBlobDataFromUUID(kId1); EXPECT_FALSE(blob_data_handle); @@ -205,7 +206,7 @@ TEST(BlobStorageContextTest, AddFinishedBlob) { scoped_ptr<BlobDataHandle> blob_data_handle3 = context.AddFinishedBlob(&builder3); blob_data_handle2.reset(); - RunEventLoopTillIdle(); + base::RunLoop().RunUntilIdle(); blob_data_handle2 = context.GetBlobDataFromUUID(kId2); EXPECT_FALSE(blob_data_handle2); @@ -222,7 +223,43 @@ TEST(BlobStorageContextTest, AddFinishedBlob) { blob_data_handle.reset(); blob_data_handle2.reset(); blob_data_handle3.reset(); - RunEventLoopTillIdle(); + base::RunLoop().RunUntilIdle(); +} + +TEST(BlobStorageContextTest, AddFinishedBlob_LargeOffset) { + // A value which does not fit in a 4-byte data type. Used to confirm that + // large values are supported on 32-bit Chromium builds. Regression test for: + // crbug.com/458122. + const uint64_t kLargeSize = std::numeric_limits<uint64_t>::max(); + + const uint64_t kBlobLength = 5; + const std::string kId1("id1"); + const std::string kId2("id2"); + base::MessageLoop fake_io_message_loop; + + BlobDataBuilder builder1(kId1); + builder1.AppendFileSystemFile(GURL(), 0, kLargeSize, base::Time::Now()); + + BlobDataBuilder builder2(kId2); + builder2.AppendBlob(kId1, kLargeSize - kBlobLength, kBlobLength); + + BlobStorageContext context; + scoped_ptr<BlobDataHandle> blob_data_handle1 = + context.AddFinishedBlob(&builder1); + scoped_ptr<BlobDataHandle> blob_data_handle2 = + context.AddFinishedBlob(&builder2); + + ASSERT_TRUE(blob_data_handle1); + ASSERT_TRUE(blob_data_handle2); + scoped_ptr<BlobDataSnapshot> data = blob_data_handle2->CreateSnapshot(); + ASSERT_EQ(1u, data->items().size()); + const scoped_refptr<BlobDataItem> item = data->items()[0]; + EXPECT_EQ(kLargeSize - kBlobLength, item->offset()); + EXPECT_EQ(kBlobLength, item->length()); + + blob_data_handle1.reset(); + blob_data_handle2.reset(); + base::RunLoop().RunUntilIdle(); } TEST(BlobStorageContextTest, CompoundBlobs) { @@ -276,7 +313,7 @@ TEST(BlobStorageContextTest, CompoundBlobs) { EXPECT_EQ(*data, canonicalized_blob_data2); blob_data_handle.reset(); - RunEventLoopTillIdle(); + base::RunLoop().RunUntilIdle(); } TEST(BlobStorageContextTest, PublicBlobUrls) { @@ -297,7 +334,7 @@ TEST(BlobStorageContextTest, PublicBlobUrls) { EXPECT_EQ(kId, blob_data_handle->uuid()); scoped_ptr<BlobDataSnapshot> data = blob_data_handle->CreateSnapshot(); blob_data_handle.reset(); - RunEventLoopTillIdle(); + base::RunLoop().RunUntilIdle(); // The url registration should keep the blob alive even after // explicit references are dropped. @@ -305,7 +342,7 @@ TEST(BlobStorageContextTest, PublicBlobUrls) { blob_data_handle = context.GetBlobDataFromPublicURL(kUrl); EXPECT_TRUE(blob_data_handle); blob_data_handle.reset(); - RunEventLoopTillIdle(); + base::RunLoop().RunUntilIdle(); // Finally get rid of the url registration and the blob. EXPECT_TRUE(host.RevokePublicBlobURL(kUrl)); diff --git a/storage/browser/blob/blob_storage_context.cc b/storage/browser/blob/blob_storage_context.cc index 5170ceb..b673930 100644 --- a/storage/browser/blob/blob_storage_context.cc +++ b/storage/browser/blob/blob_storage_context.cc @@ -375,8 +375,8 @@ bool BlobStorageContext::AppendAllocatedBlobItem( bool BlobStorageContext::AppendBlob( const std::string& target_blob_uuid, const InternalBlobData& blob, - size_t offset, - size_t length, + uint64_t offset, + uint64_t length, InternalBlobData::Builder* target_blob_builder) { DCHECK(length > 0); @@ -395,10 +395,10 @@ bool BlobStorageContext::AppendBlob( for (; iter != items.end() && length > 0; ++iter) { scoped_refptr<ShareableBlobDataItem> shareable_item = iter->get(); const BlobDataItem& item = *(shareable_item->item()); - size_t item_length = item.length(); + uint64_t item_length = item.length(); DCHECK_GT(item_length, offset); - size_t current_length = item_length - offset; - size_t new_length = current_length > length ? length : current_length; + uint64_t current_length = item_length - offset; + uint64_t new_length = current_length > length ? length : current_length; bool reusing_blob_item = offset == 0 && new_length == item.length(); UMA_HISTOGRAM_BOOLEAN("Storage.Blob.ReusedItem", reusing_blob_item); diff --git a/storage/browser/blob/blob_storage_context.h b/storage/browser/blob/blob_storage_context.h index 175e9002..cf73c8a 100644 --- a/storage/browser/blob/blob_storage_context.h +++ b/storage/browser/blob/blob_storage_context.h @@ -122,8 +122,8 @@ class STORAGE_EXPORT BlobStorageContext // have to split an item. bool AppendBlob(const std::string& target_blob_uuid, const InternalBlobData& blob, - size_t offset, - size_t length, + uint64_t offset, + uint64_t length, InternalBlobData::Builder* target_blob_data); bool IsInUse(const std::string& uuid); |