Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(217)

Side by Side Diff: net/url_request/url_fetcher_response_writer_unittest.cc

Issue 2425673006: Make URLFetcherFileWriter::Finish() skip closing file when there is an error (Closed)
Patch Set: Fix another subclass Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/url_request/url_fetcher_response_writer.h" 5 #include "net/url_request/url_fetcher_response_writer.h"
6 6
7 #include "base/files/file_util.h" 7 #include "base/files/file_util.h"
8 #include "base/files/scoped_temp_dir.h" 8 #include "base/files/scoped_temp_dir.h"
9 #include "base/run_loop.h" 9 #include "base/run_loop.h"
10 #include "base/threading/thread_task_runner_handle.h" 10 #include "base/threading/thread_task_runner_handle.h"
(...skipping 26 matching lines...) Expand all
37 }; 37 };
38 38
39 TEST_F(URLFetcherStringWriterTest, Basic) { 39 TEST_F(URLFetcherStringWriterTest, Basic) {
40 int rv = 0; 40 int rv = 0;
41 // Initialize(), Write() and Finish(). 41 // Initialize(), Write() and Finish().
42 TestCompletionCallback callback; 42 TestCompletionCallback callback;
43 rv = writer_->Initialize(callback.callback()); 43 rv = writer_->Initialize(callback.callback());
44 EXPECT_THAT(callback.GetResult(rv), IsOk()); 44 EXPECT_THAT(callback.GetResult(rv), IsOk());
45 rv = writer_->Write(buf_.get(), buf_->size(), callback.callback()); 45 rv = writer_->Write(buf_.get(), buf_->size(), callback.callback());
46 EXPECT_EQ(buf_->size(), callback.GetResult(rv)); 46 EXPECT_EQ(buf_->size(), callback.GetResult(rv));
47 rv = writer_->Finish(callback.callback()); 47 rv = writer_->Finish(OK, callback.callback());
48 EXPECT_THAT(callback.GetResult(rv), IsOk()); 48 EXPECT_THAT(callback.GetResult(rv), IsOk());
49 49
50 // Verify the result. 50 // Verify the result.
51 EXPECT_EQ(kData, writer_->data()); 51 EXPECT_EQ(kData, writer_->data());
52 52
53 // Initialize() again to reset. 53 // Initialize() again to reset.
54 rv = writer_->Initialize(callback.callback()); 54 rv = writer_->Initialize(callback.callback());
55 EXPECT_THAT(callback.GetResult(rv), IsOk()); 55 EXPECT_THAT(callback.GetResult(rv), IsOk());
56 EXPECT_TRUE(writer_->data().empty()); 56 EXPECT_TRUE(writer_->data().empty());
57 } 57 }
(...skipping 15 matching lines...) Expand all
73 }; 73 };
74 74
75 TEST_F(URLFetcherFileWriterTest, WriteToFile) { 75 TEST_F(URLFetcherFileWriterTest, WriteToFile) {
76 int rv = 0; 76 int rv = 0;
77 // Initialize(), Write() and Finish(). 77 // Initialize(), Write() and Finish().
78 TestCompletionCallback callback; 78 TestCompletionCallback callback;
79 rv = writer_->Initialize(callback.callback()); 79 rv = writer_->Initialize(callback.callback());
80 EXPECT_THAT(callback.GetResult(rv), IsOk()); 80 EXPECT_THAT(callback.GetResult(rv), IsOk());
81 rv = writer_->Write(buf_.get(), buf_->size(), callback.callback()); 81 rv = writer_->Write(buf_.get(), buf_->size(), callback.callback());
82 EXPECT_EQ(buf_->size(), callback.GetResult(rv)); 82 EXPECT_EQ(buf_->size(), callback.GetResult(rv));
83 rv = writer_->Finish(callback.callback()); 83 rv = writer_->Finish(OK, callback.callback());
84 EXPECT_THAT(callback.GetResult(rv), IsOk()); 84 EXPECT_THAT(callback.GetResult(rv), IsOk());
85 85
86 // Verify the result. 86 // Verify the result.
87 EXPECT_EQ(file_path_.value(), writer_->file_path().value()); 87 EXPECT_EQ(file_path_.value(), writer_->file_path().value());
88 std::string file_contents; 88 std::string file_contents;
89 EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents)); 89 EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents));
90 EXPECT_EQ(kData, file_contents); 90 EXPECT_EQ(kData, file_contents);
91 91
92 // Destroy the writer. File should be deleted. 92 // Destroy the writer. File should be deleted.
93 writer_.reset(); 93 writer_.reset();
94 base::RunLoop().RunUntilIdle(); 94 base::RunLoop().RunUntilIdle();
95 EXPECT_FALSE(base::PathExists(file_path_)); 95 EXPECT_FALSE(base::PathExists(file_path_));
96 } 96 }
97 97
98 TEST_F(URLFetcherFileWriterTest, InitializeAgain) { 98 TEST_F(URLFetcherFileWriterTest, InitializeAgain) {
99 int rv = 0; 99 int rv = 0;
100 // Initialize(), Write() and Finish(). 100 // Initialize(), Write() and Finish().
101 TestCompletionCallback callback; 101 TestCompletionCallback callback;
102 rv = writer_->Initialize(callback.callback()); 102 rv = writer_->Initialize(callback.callback());
103 EXPECT_THAT(callback.GetResult(rv), IsOk()); 103 EXPECT_THAT(callback.GetResult(rv), IsOk());
104 rv = writer_->Write(buf_.get(), buf_->size(), callback.callback()); 104 rv = writer_->Write(buf_.get(), buf_->size(), callback.callback());
105 EXPECT_EQ(buf_->size(), callback.GetResult(rv)); 105 EXPECT_EQ(buf_->size(), callback.GetResult(rv));
106 rv = writer_->Finish(callback.callback()); 106 rv = writer_->Finish(OK, callback.callback());
107 EXPECT_THAT(callback.GetResult(rv), IsOk()); 107 EXPECT_THAT(callback.GetResult(rv), IsOk());
108 108
109 // Verify the result. 109 // Verify the result.
110 std::string file_contents; 110 std::string file_contents;
111 EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents)); 111 EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents));
112 EXPECT_EQ(kData, file_contents); 112 EXPECT_EQ(kData, file_contents);
113 113
114 // Initialize() again to reset. Write different data. 114 // Initialize() again to reset. Write different data.
115 const std::string data2 = "Bye!"; 115 const std::string data2 = "Bye!";
116 scoped_refptr<StringIOBuffer> buf2(new StringIOBuffer(data2)); 116 scoped_refptr<StringIOBuffer> buf2(new StringIOBuffer(data2));
117 117
118 rv = writer_->Initialize(callback.callback()); 118 rv = writer_->Initialize(callback.callback());
119 EXPECT_THAT(callback.GetResult(rv), IsOk()); 119 EXPECT_THAT(callback.GetResult(rv), IsOk());
120 rv = writer_->Write(buf2.get(), buf2->size(), callback.callback()); 120 rv = writer_->Write(buf2.get(), buf2->size(), callback.callback());
121 EXPECT_EQ(buf2->size(), callback.GetResult(rv)); 121 EXPECT_EQ(buf2->size(), callback.GetResult(rv));
122 rv = writer_->Finish(callback.callback()); 122 rv = writer_->Finish(OK, callback.callback());
123 EXPECT_THAT(callback.GetResult(rv), IsOk()); 123 EXPECT_THAT(callback.GetResult(rv), IsOk());
124 124
125 // Verify the result. 125 // Verify the result.
126 file_contents.clear(); 126 file_contents.clear();
127 EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents)); 127 EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents));
128 EXPECT_EQ(data2, file_contents); 128 EXPECT_EQ(data2, file_contents);
129 } 129 }
130 130
131 TEST_F(URLFetcherFileWriterTest, FinishWhileWritePending) {
132 int rv = 0;
133 // Initialize(), Write() and Finish().
134 TestCompletionCallback callback;
135 rv = writer_->Initialize(callback.callback());
136 EXPECT_THAT(callback.GetResult(rv), IsOk());
137 TestCompletionCallback callback2;
138 rv = writer_->Write(buf_.get(), buf_->size(), callback2.callback());
139 EXPECT_EQ(ERR_IO_PENDING, rv);
140 TestCompletionCallback callback3;
141 rv = writer_->Finish(ERR_FAILED, callback3.callback());
142 EXPECT_EQ(OK, rv);
143
144 // Write() should finish asynchronously.
145 EXPECT_THAT(callback2.GetResult(rv), IsOk());
mmenke 2016/10/19 14:18:40 I don't think we want the callback to be invoked h
xunjieli 2016/10/19 15:19:28 Done. Changed implementation to cancel pending cal
146 base::RunLoop().RunUntilIdle();
147 // Verify the result.
148 EXPECT_FALSE(base::PathExists(file_path_));
149 }
150
151 TEST_F(URLFetcherFileWriterTest, FinishWhileOpenPending) {
152 int rv = 0;
153 // Initialize() and Finish().
154 TestCompletionCallback callback;
155 rv = writer_->Initialize(callback.callback());
156 EXPECT_EQ(ERR_IO_PENDING, rv);
157 TestCompletionCallback callback2;
158 rv = writer_->Finish(ERR_FAILED, callback2.callback());
159 EXPECT_EQ(OK, rv);
160
161 // Initialize() should finish asynchronously.
162 EXPECT_THAT(callback.GetResult(rv), IsOk());
163 base::RunLoop().RunUntilIdle();
164 // Verify the result.
165 EXPECT_FALSE(base::PathExists(file_path_));
166 }
167
168 TEST_F(URLFetcherFileWriterTest, InitializeAgainAfterFinishWithError) {
169 int rv = 0;
170 // Initialize(), Write() and Finish().
171 TestCompletionCallback callback;
172 rv = writer_->Initialize(callback.callback());
173 EXPECT_THAT(callback.GetResult(rv), IsOk());
174 TestCompletionCallback callback2;
175 rv = writer_->Write(buf_.get(), buf_->size(), callback2.callback());
176 EXPECT_EQ(ERR_IO_PENDING, rv);
177 TestCompletionCallback callback3;
178 rv = writer_->Finish(ERR_FAILED, callback3.callback());
179 EXPECT_EQ(OK, rv);
180 // Wait for Write() to complete.
181 EXPECT_THAT(callback.GetResult(rv), IsOk());
182
183 // Initialize() again and wait for it to complete.
184 rv = writer_->Initialize(callback.callback());
185 EXPECT_THAT(callback.GetResult(rv), IsOk());
186 // Verify the result.
187 EXPECT_TRUE(base::PathExists(file_path_));
188 }
189
131 TEST_F(URLFetcherFileWriterTest, DisownFile) { 190 TEST_F(URLFetcherFileWriterTest, DisownFile) {
132 int rv = 0; 191 int rv = 0;
133 // Initialize() and Finish() to create a file. 192 // Initialize() and Finish() to create a file.
134 TestCompletionCallback callback; 193 TestCompletionCallback callback;
135 rv = writer_->Initialize(callback.callback()); 194 rv = writer_->Initialize(callback.callback());
136 EXPECT_THAT(callback.GetResult(rv), IsOk()); 195 EXPECT_THAT(callback.GetResult(rv), IsOk());
137 rv = writer_->Finish(callback.callback()); 196 rv = writer_->Finish(OK, callback.callback());
138 EXPECT_THAT(callback.GetResult(rv), IsOk()); 197 EXPECT_THAT(callback.GetResult(rv), IsOk());
139 198
140 // Disown file. 199 // Disown file.
141 writer_->DisownFile(); 200 writer_->DisownFile();
142 201
143 // File is not deleted even after the writer gets destroyed. 202 // File is not deleted even after the writer gets destroyed.
144 writer_.reset(); 203 writer_.reset();
145 base::RunLoop().RunUntilIdle(); 204 base::RunLoop().RunUntilIdle();
146 EXPECT_TRUE(base::PathExists(file_path_)); 205 EXPECT_TRUE(base::PathExists(file_path_));
147 } 206 }
(...skipping 11 matching lines...) Expand all
159 }; 218 };
160 219
161 TEST_F(URLFetcherFileWriterTemporaryFileTest, WriteToTemporaryFile) { 220 TEST_F(URLFetcherFileWriterTemporaryFileTest, WriteToTemporaryFile) {
162 int rv = 0; 221 int rv = 0;
163 // Initialize(), Write() and Finish(). 222 // Initialize(), Write() and Finish().
164 TestCompletionCallback callback; 223 TestCompletionCallback callback;
165 rv = writer_->Initialize(callback.callback()); 224 rv = writer_->Initialize(callback.callback());
166 EXPECT_THAT(callback.GetResult(rv), IsOk()); 225 EXPECT_THAT(callback.GetResult(rv), IsOk());
167 rv = writer_->Write(buf_.get(), buf_->size(), callback.callback()); 226 rv = writer_->Write(buf_.get(), buf_->size(), callback.callback());
168 EXPECT_EQ(buf_->size(), callback.GetResult(rv)); 227 EXPECT_EQ(buf_->size(), callback.GetResult(rv));
169 rv = writer_->Finish(callback.callback()); 228 rv = writer_->Finish(OK, callback.callback());
170 EXPECT_THAT(callback.GetResult(rv), IsOk()); 229 EXPECT_THAT(callback.GetResult(rv), IsOk());
171 230
172 // Verify the result. 231 // Verify the result.
173 std::string file_contents; 232 std::string file_contents;
174 EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents)); 233 EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents));
175 EXPECT_EQ(kData, file_contents); 234 EXPECT_EQ(kData, file_contents);
176 235
177 // Destroy the writer. File should be deleted. 236 // Destroy the writer. File should be deleted.
178 const base::FilePath file_path = writer_->file_path(); 237 const base::FilePath file_path = writer_->file_path();
179 writer_.reset(); 238 writer_.reset();
180 base::RunLoop().RunUntilIdle(); 239 base::RunLoop().RunUntilIdle();
181 EXPECT_FALSE(base::PathExists(file_path)); 240 EXPECT_FALSE(base::PathExists(file_path));
182 } 241 }
183 242
184 } // namespace net 243 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698