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