1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/url_request/url_fetcher_response_writer.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/scoped_temp_dir.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/run_loop.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/base/io_buffer.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/base/net_errors.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/base/test_completion_callback.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "testing/platform_test.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace net { 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kData[] = "Hello!"; 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class URLFetcherStringWriterTest : public PlatformTest { 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetUp() OVERRIDE { 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) writer_.reset(new URLFetcherStringWriter); 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) buf_ = new StringIOBuffer(kData); 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<URLFetcherStringWriter> writer_; 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<StringIOBuffer> buf_; 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(URLFetcherStringWriterTest, Basic) { 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int rv = 0; 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Initialize(), Write() and Finish(). 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestCompletionCallback callback; 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Initialize(callback.callback()); 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback.GetResult(rv)); 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Write(buf_.get(), buf_->size(), callback.callback()); 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(buf_->size(), callback.GetResult(rv)); 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Finish(callback.callback()); 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback.GetResult(rv)); 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify the result. 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(kData, writer_->data()); 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Initialize() again to reset. 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Initialize(callback.callback()); 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback.GetResult(rv)); 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(writer_->data().empty()); 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class URLFetcherFileWriterTest : public PlatformTest { 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetUp() OVERRIDE { 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) file_path_ = temp_dir_.path().AppendASCII("test.txt"); 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) writer_.reset(new URLFetcherFileWriter( 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoopProxy::current(), file_path_)); 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) buf_ = new StringIOBuffer(kData); 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ScopedTempDir temp_dir_; 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath file_path_; 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<URLFetcherFileWriter> writer_; 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<StringIOBuffer> buf_; 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(URLFetcherFileWriterTest, WriteToFile) { 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int rv = 0; 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Initialize(), Write() and Finish(). 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestCompletionCallback callback; 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Initialize(callback.callback()); 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback.GetResult(rv)); 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Write(buf_.get(), buf_->size(), callback.callback()); 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(buf_->size(), callback.GetResult(rv)); 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Finish(callback.callback()); 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback.GetResult(rv)); 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify the result. 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(file_path_.value(), writer_->file_path().value()); 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string file_contents; 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents)); 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(kData, file_contents); 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Destroy the writer. File should be deleted. 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) writer_.reset(); 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(base::PathExists(file_path_)); 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(URLFetcherFileWriterTest, InitializeAgain) { 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int rv = 0; 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Initialize(), Write() and Finish(). 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestCompletionCallback callback; 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Initialize(callback.callback()); 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback.GetResult(rv)); 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Write(buf_.get(), buf_->size(), callback.callback()); 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(buf_->size(), callback.GetResult(rv)); 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Finish(callback.callback()); 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback.GetResult(rv)); 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify the result. 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string file_contents; 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents)); 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(kData, file_contents); 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Initialize() again to reset. Write different data. 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string data2 = "Bye!"; 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<StringIOBuffer> buf2(new StringIOBuffer(data2)); 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Initialize(callback.callback()); 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback.GetResult(rv)); 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Write(buf2.get(), buf2->size(), callback.callback()); 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(buf2->size(), callback.GetResult(rv)); 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Finish(callback.callback()); 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback.GetResult(rv)); 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify the result. 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) file_contents.clear(); 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents)); 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(data2, file_contents); 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(URLFetcherFileWriterTest, DisownFile) { 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int rv = 0; 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Initialize() and Finish() to create a file. 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestCompletionCallback callback; 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Initialize(callback.callback()); 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback.GetResult(rv)); 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Finish(callback.callback()); 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback.GetResult(rv)); 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Disown file. 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) writer_->DisownFile(); 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // File is not deleted even after the writer gets destroyed. 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) writer_.reset(); 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(base::PathExists(file_path_)); 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class URLFetcherFileWriterTemporaryFileTest : public PlatformTest { 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetUp() OVERRIDE { 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) writer_.reset(new URLFetcherFileWriter( 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoopProxy::current(), base::FilePath())); 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) buf_ = new StringIOBuffer(kData); 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<URLFetcherFileWriter> writer_; 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<StringIOBuffer> buf_; 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(URLFetcherFileWriterTemporaryFileTest, WriteToTemporaryFile) { 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int rv = 0; 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Initialize(), Write() and Finish(). 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestCompletionCallback callback; 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Initialize(callback.callback()); 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback.GetResult(rv)); 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Write(buf_.get(), buf_->size(), callback.callback()); 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(buf_->size(), callback.GetResult(rv)); 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = writer_->Finish(callback.callback()); 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback.GetResult(rv)); 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify the result. 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string file_contents; 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents)); 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(kData, file_contents); 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Destroy the writer. File should be deleted. 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::FilePath file_path = writer_->file_path(); 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) writer_.reset(); 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(base::PathExists(file_path)); 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace net 181