diff options
Diffstat (limited to 'chromium/storage/browser/fileapi/file_writer_delegate_unittest.cc')
-rw-r--r-- | chromium/storage/browser/fileapi/file_writer_delegate_unittest.cc | 105 |
1 files changed, 80 insertions, 25 deletions
diff --git a/chromium/storage/browser/fileapi/file_writer_delegate_unittest.cc b/chromium/storage/browser/fileapi/file_writer_delegate_unittest.cc index fd25f1f7bdf..0b88688103e 100644 --- a/chromium/storage/browser/fileapi/file_writer_delegate_unittest.cc +++ b/chromium/storage/browser/fileapi/file_writer_delegate_unittest.cc @@ -106,8 +106,8 @@ class FileWriterDelegateTest : public PlatformTest { int64_t GetFileSizeOnDisk(const char* test_file_path) { // There might be in-flight flush/write. - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, - base::Bind(&base::DoNothing)); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&base::DoNothing)); base::RunLoop().RunUntilIdle(); FileSystemURL url = GetFileSystemURL(test_file_path); @@ -123,23 +123,28 @@ class FileWriterDelegateTest : public PlatformTest { kOrigin, kFileSystemType, base::FilePath().FromUTF8Unsafe(file_name)); } - FileWriterDelegate* CreateWriterDelegate(const char* test_file_path, - int64_t offset, - int64_t allowed_growth) { - storage::SandboxFileStreamWriter* writer = - new storage::SandboxFileStreamWriter( - file_system_context_.get(), - GetFileSystemURL(test_file_path), - offset, - *file_system_context_->GetUpdateObservers(kFileSystemType)); + std::unique_ptr<storage::SandboxFileStreamWriter> CreateWriter( + const char* test_file_path, + int64_t offset, + int64_t allowed_growth) { + auto writer = std::make_unique<storage::SandboxFileStreamWriter>( + file_system_context_.get(), GetFileSystemURL(test_file_path), offset, + *file_system_context_->GetUpdateObservers(kFileSystemType)); writer->set_default_quota(allowed_growth); - return new FileWriterDelegate( - std::unique_ptr<storage::FileStreamWriter>(writer), - storage::FlushPolicy::FLUSH_ON_COMPLETION); + return writer; + } + + std::unique_ptr<FileWriterDelegate> CreateWriterDelegate( + const char* test_file_path, + int64_t offset, + int64_t allowed_growth) { + auto writer = CreateWriter(test_file_path, offset, allowed_growth); + return std::make_unique<FileWriterDelegate>( + std::move(writer), storage::FlushPolicy::FLUSH_ON_COMPLETION); } FileWriterDelegate::DelegateWriteCallback GetWriteCallback(Result* result) { - return base::Bind(&Result::DidWrite, base::Unretained(result)); + return base::BindRepeating(&Result::DidWrite, base::Unretained(result)); } // Creates and sets up a FileWriterDelegate for writing the given |blob_url|, @@ -148,8 +153,8 @@ class FileWriterDelegateTest : public PlatformTest { const GURL& blob_url, int64_t offset, int64_t allowed_growth) { - file_writer_delegate_.reset( - CreateWriterDelegate(test_file_path, offset, allowed_growth)); + file_writer_delegate_ = + CreateWriterDelegate(test_file_path, offset, allowed_growth); request_ = empty_context_.CreateRequest(blob_url, net::DEFAULT_PRIORITY, file_writer_delegate_.get(), TRAFFIC_ANNOTATION_FOR_TESTS); @@ -189,8 +194,9 @@ class FileWriterDelegateTestJob : public net::URLRequestJob { void Start() override { base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(&FileWriterDelegateTestJob::NotifyHeadersComplete, - weak_factory_.GetWeakPtr())); + FROM_HERE, + base::BindOnce(&FileWriterDelegateTestJob::NotifyHeadersComplete, + weak_factory_.GetWeakPtr())); } int ReadRawData(net::IOBuffer* buf, int buf_size) override { @@ -233,8 +239,8 @@ class BlobURLRequestJobFactory : public net::URLRequestJobFactory { const std::string& scheme, net::URLRequest* request, net::NetworkDelegate* network_delegate) const override { - return new FileWriterDelegateTestJob( - request, network_delegate, *content_data_); + return new FileWriterDelegateTestJob(request, network_delegate, + *content_data_); } net::URLRequestJob* MaybeInterceptRedirect( @@ -274,7 +280,7 @@ void FileWriterDelegateTest::SetUp() { ASSERT_EQ(base::File::FILE_OK, AsyncFileTestHelper::CreateFile(file_system_context_.get(), GetFileSystemURL("test"))); - job_factory_.reset(new BlobURLRequestJobFactory(&content_)); + job_factory_ = std::make_unique<BlobURLRequestJobFactory>(&content_); empty_context_.set_job_factory(job_factory_.get()); } @@ -379,9 +385,9 @@ TEST_F(FileWriterDelegateTest, WriteSuccessWithoutQuotaLimitConcurrent) { PrepareForWrite("test", kBlobURL, 0, std::numeric_limits<int64_t>::max()); - // Credate another FileWriterDelegate for concurrent write. - file_writer_delegate2.reset( - CreateWriterDelegate("test2", 0, std::numeric_limits<int64_t>::max())); + // Create another FileWriterDelegate for concurrent write. + file_writer_delegate2 = + CreateWriterDelegate("test2", 0, std::numeric_limits<int64_t>::max()); request2 = empty_context_.CreateRequest(kBlobURL2, net::DEFAULT_PRIORITY, file_writer_delegate2.get(), TRAFFIC_ANNOTATION_FOR_TESTS); @@ -513,4 +519,53 @@ TEST_F(FileWriterDelegateTest, WritesWithQuotaAndOffset) { } } +class InterruptedFileWriterDelegate : public FileWriterDelegate { + public: + InterruptedFileWriterDelegate( + std::unique_ptr<storage::FileStreamWriter> file_writer, + storage::FlushPolicy flush_policy) + : FileWriterDelegate(std::move(file_writer), flush_policy) {} + ~InterruptedFileWriterDelegate() override = default; + + void OnDataReceived(int bytes_read) override { + // The base class will respond to OnDataReceived by performing an + // asynchronous write. Schedule a task now that will execute before the + // write completes which terminates the URLRequestJob. + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(IgnoreResult(&net::URLRequest::Cancel), + base::Unretained(request_))); + FileWriterDelegate::OnDataReceived(bytes_read); + } + + void set_request(net::URLRequest* request) { request_ = request; } + + private: + // The request is owned by the base class as a private member. + net::URLRequest* request_ = nullptr; +}; + +TEST_F(FileWriterDelegateTest, ReadFailureDuringAsyncWrite) { + const GURL kBlobURL("blob:async-fail"); + content_ = kData; + + auto writer = CreateWriter("test", 0, std::numeric_limits<int64_t>::max()); + auto file_writer_delegate = std::make_unique<InterruptedFileWriterDelegate>( + std::move(writer), storage::FlushPolicy::FLUSH_ON_COMPLETION); + auto request = empty_context_.CreateRequest(kBlobURL, net::DEFAULT_PRIORITY, + file_writer_delegate.get(), + TRAFFIC_ANNOTATION_FOR_TESTS); + file_writer_delegate->set_request(request.get()); + + Result result; + file_writer_delegate->Start(std::move(request), GetWriteCallback(&result)); + base::RunLoop().Run(); + + ASSERT_EQ(FileWriterDelegate::ERROR_WRITE_STARTED, result.write_status()); + file_writer_delegate_.reset(); + + // The write should still have flushed. + ASSERT_EQ(kDataSize, usage()); + EXPECT_EQ(GetFileSizeOnDisk("test"), usage()); +} + } // namespace content |