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

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: Address comments and added tests 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
« no previous file with comments | « net/url_request/url_fetcher_response_writer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 rv = writer_->Write(buf_.get(), buf_->size(), callback.callback());
138 EXPECT_EQ(ERR_IO_PENDING, rv);
139 rv = writer_->Finish(ERR_FAILED, callback.callback());
140 EXPECT_EQ(OK, rv);
141
142 // Verify the result.
143 EXPECT_THAT(callback.GetResult(rv), IsOk());
144 base::RunLoop().RunUntilIdle();
145 EXPECT_FALSE(base::PathExists(file_path_));
146 }
147
148 TEST_F(URLFetcherFileWriterTest, FinishWhileOpenPending) {
149 int rv = 0;
150 // Initialize() and Finish().
151 TestCompletionCallback callback;
152 rv = writer_->Initialize(callback.callback());
153 EXPECT_EQ(ERR_IO_PENDING, rv);
154 rv = writer_->Finish(ERR_FAILED, callback.callback());
155 EXPECT_EQ(OK, rv);
156
157 // Verify the result.
158 EXPECT_THAT(callback.GetResult(rv), IsOk());
159 base::RunLoop().RunUntilIdle();
160 EXPECT_FALSE(base::PathExists(file_path_));
xunjieli 2016/10/18 21:18:08 Here's the line that fails. CloseAndDelete() is a
mmenke 2016/10/18 21:40:46 Should we just set owns file before each post task
xunjieli 2016/10/19 12:00:21 Done. Right I think that's equivalent and is bette
161 }
162
163 TEST_F(URLFetcherFileWriterTest, InitializeAgainAfterFinishWithError) {
164 int rv = 0;
165 // Initialize(), Write() and Finish().
166 TestCompletionCallback callback;
167 rv = writer_->Initialize(callback.callback());
168 EXPECT_THAT(callback.GetResult(rv), IsOk());
169 rv = writer_->Write(buf_.get(), buf_->size(), callback.callback());
170 EXPECT_EQ(ERR_IO_PENDING, rv);
171 rv = writer_->Finish(ERR_FAILED, callback.callback());
172 EXPECT_EQ(OK, rv);
173 // Wait for Write() to complete.
174 EXPECT_THAT(callback.GetResult(rv), IsOk());
xunjieli 2016/10/18 21:18:07 Will using the same TestCompletionCallback be a pr
mmenke 2016/10/18 21:40:46 We should use a different callback here - This sho
xunjieli 2016/10/19 12:00:21 Done.
175
176 // Verify the result.
177 rv = writer_->Initialize(callback.callback());
178 EXPECT_THAT(callback.GetResult(rv), IsOk());
179 EXPECT_TRUE(base::PathExists(file_path_));
180 }
181
131 TEST_F(URLFetcherFileWriterTest, DisownFile) { 182 TEST_F(URLFetcherFileWriterTest, DisownFile) {
132 int rv = 0; 183 int rv = 0;
133 // Initialize() and Finish() to create a file. 184 // Initialize() and Finish() to create a file.
134 TestCompletionCallback callback; 185 TestCompletionCallback callback;
135 rv = writer_->Initialize(callback.callback()); 186 rv = writer_->Initialize(callback.callback());
136 EXPECT_THAT(callback.GetResult(rv), IsOk()); 187 EXPECT_THAT(callback.GetResult(rv), IsOk());
137 rv = writer_->Finish(callback.callback()); 188 rv = writer_->Finish(OK, callback.callback());
138 EXPECT_THAT(callback.GetResult(rv), IsOk()); 189 EXPECT_THAT(callback.GetResult(rv), IsOk());
139 190
140 // Disown file. 191 // Disown file.
141 writer_->DisownFile(); 192 writer_->DisownFile();
142 193
143 // File is not deleted even after the writer gets destroyed. 194 // File is not deleted even after the writer gets destroyed.
144 writer_.reset(); 195 writer_.reset();
145 base::RunLoop().RunUntilIdle(); 196 base::RunLoop().RunUntilIdle();
146 EXPECT_TRUE(base::PathExists(file_path_)); 197 EXPECT_TRUE(base::PathExists(file_path_));
147 } 198 }
(...skipping 11 matching lines...) Expand all
159 }; 210 };
160 211
161 TEST_F(URLFetcherFileWriterTemporaryFileTest, WriteToTemporaryFile) { 212 TEST_F(URLFetcherFileWriterTemporaryFileTest, WriteToTemporaryFile) {
162 int rv = 0; 213 int rv = 0;
163 // Initialize(), Write() and Finish(). 214 // Initialize(), Write() and Finish().
164 TestCompletionCallback callback; 215 TestCompletionCallback callback;
165 rv = writer_->Initialize(callback.callback()); 216 rv = writer_->Initialize(callback.callback());
166 EXPECT_THAT(callback.GetResult(rv), IsOk()); 217 EXPECT_THAT(callback.GetResult(rv), IsOk());
167 rv = writer_->Write(buf_.get(), buf_->size(), callback.callback()); 218 rv = writer_->Write(buf_.get(), buf_->size(), callback.callback());
168 EXPECT_EQ(buf_->size(), callback.GetResult(rv)); 219 EXPECT_EQ(buf_->size(), callback.GetResult(rv));
169 rv = writer_->Finish(callback.callback()); 220 rv = writer_->Finish(OK, callback.callback());
170 EXPECT_THAT(callback.GetResult(rv), IsOk()); 221 EXPECT_THAT(callback.GetResult(rv), IsOk());
171 222
172 // Verify the result. 223 // Verify the result.
173 std::string file_contents; 224 std::string file_contents;
174 EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents)); 225 EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents));
175 EXPECT_EQ(kData, file_contents); 226 EXPECT_EQ(kData, file_contents);
176 227
177 // Destroy the writer. File should be deleted. 228 // Destroy the writer. File should be deleted.
178 const base::FilePath file_path = writer_->file_path(); 229 const base::FilePath file_path = writer_->file_path();
179 writer_.reset(); 230 writer_.reset();
180 base::RunLoop().RunUntilIdle(); 231 base::RunLoop().RunUntilIdle();
181 EXPECT_FALSE(base::PathExists(file_path)); 232 EXPECT_FALSE(base::PathExists(file_path));
182 } 233 }
183 234
184 } // namespace net 235 } // namespace net
OLDNEW
« no previous file with comments | « net/url_request/url_fetcher_response_writer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698