| OLD | NEW |
| 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 "base/files/file_proxy.h" | 5 #include "base/files/file_proxy.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/files/file.h" | 13 #include "base/files/file.h" |
| 14 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" |
| 15 #include "base/files/scoped_temp_dir.h" | 15 #include "base/files/scoped_temp_dir.h" |
| 16 #include "base/macros.h" | 16 #include "base/macros.h" |
| 17 #include "base/memory/weak_ptr.h" | 17 #include "base/memory/weak_ptr.h" |
| 18 #include "base/run_loop.h" |
| 18 #include "base/threading/thread.h" | 19 #include "base/threading/thread.h" |
| 19 #include "base/threading/thread_restrictions.h" | 20 #include "base/threading/thread_restrictions.h" |
| 20 #include "build/build_config.h" | 21 #include "build/build_config.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 22 | 23 |
| 23 namespace base { | 24 namespace base { |
| 24 | 25 |
| 25 class FileProxyTest : public testing::Test { | 26 class FileProxyTest : public testing::Test { |
| 26 public: | 27 public: |
| 27 FileProxyTest() | 28 FileProxyTest() |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 error_ = error; | 74 error_ = error; |
| 74 bytes_written_ = bytes_written; | 75 bytes_written_ = bytes_written; |
| 75 MessageLoop::current()->QuitWhenIdle(); | 76 MessageLoop::current()->QuitWhenIdle(); |
| 76 } | 77 } |
| 77 | 78 |
| 78 protected: | 79 protected: |
| 79 void CreateProxy(uint32_t flags, FileProxy* proxy) { | 80 void CreateProxy(uint32_t flags, FileProxy* proxy) { |
| 80 proxy->CreateOrOpen( | 81 proxy->CreateOrOpen( |
| 81 test_path(), flags, | 82 test_path(), flags, |
| 82 Bind(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr())); | 83 Bind(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr())); |
| 83 MessageLoop::current()->Run(); | 84 RunLoop().Run(); |
| 84 EXPECT_TRUE(proxy->IsValid()); | 85 EXPECT_TRUE(proxy->IsValid()); |
| 85 } | 86 } |
| 86 | 87 |
| 87 TaskRunner* file_task_runner() const { | 88 TaskRunner* file_task_runner() const { |
| 88 return file_thread_.task_runner().get(); | 89 return file_thread_.task_runner().get(); |
| 89 } | 90 } |
| 90 const FilePath& test_dir_path() const { return dir_.path(); } | 91 const FilePath& test_dir_path() const { return dir_.path(); } |
| 91 const FilePath test_path() const { return dir_.path().AppendASCII("test"); } | 92 const FilePath test_path() const { return dir_.path().AppendASCII("test"); } |
| 92 | 93 |
| 93 ScopedTempDir dir_; | 94 ScopedTempDir dir_; |
| 94 MessageLoopForIO message_loop_; | 95 MessageLoopForIO message_loop_; |
| 95 Thread file_thread_; | 96 Thread file_thread_; |
| 96 | 97 |
| 97 File::Error error_; | 98 File::Error error_; |
| 98 FilePath path_; | 99 FilePath path_; |
| 99 File::Info file_info_; | 100 File::Info file_info_; |
| 100 std::vector<char> buffer_; | 101 std::vector<char> buffer_; |
| 101 int bytes_written_; | 102 int bytes_written_; |
| 102 WeakPtrFactory<FileProxyTest> weak_factory_; | 103 WeakPtrFactory<FileProxyTest> weak_factory_; |
| 103 }; | 104 }; |
| 104 | 105 |
| 105 TEST_F(FileProxyTest, CreateOrOpen_Create) { | 106 TEST_F(FileProxyTest, CreateOrOpen_Create) { |
| 106 FileProxy proxy(file_task_runner()); | 107 FileProxy proxy(file_task_runner()); |
| 107 proxy.CreateOrOpen( | 108 proxy.CreateOrOpen( |
| 108 test_path(), | 109 test_path(), |
| 109 File::FLAG_CREATE | File::FLAG_READ, | 110 File::FLAG_CREATE | File::FLAG_READ, |
| 110 Bind(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr())); | 111 Bind(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr())); |
| 111 MessageLoop::current()->Run(); | 112 RunLoop().Run(); |
| 112 | 113 |
| 113 EXPECT_EQ(File::FILE_OK, error_); | 114 EXPECT_EQ(File::FILE_OK, error_); |
| 114 EXPECT_TRUE(proxy.IsValid()); | 115 EXPECT_TRUE(proxy.IsValid()); |
| 115 EXPECT_TRUE(proxy.created()); | 116 EXPECT_TRUE(proxy.created()); |
| 116 EXPECT_TRUE(PathExists(test_path())); | 117 EXPECT_TRUE(PathExists(test_path())); |
| 117 } | 118 } |
| 118 | 119 |
| 119 TEST_F(FileProxyTest, CreateOrOpen_Open) { | 120 TEST_F(FileProxyTest, CreateOrOpen_Open) { |
| 120 // Creates a file. | 121 // Creates a file. |
| 121 base::WriteFile(test_path(), NULL, 0); | 122 base::WriteFile(test_path(), NULL, 0); |
| 122 ASSERT_TRUE(PathExists(test_path())); | 123 ASSERT_TRUE(PathExists(test_path())); |
| 123 | 124 |
| 124 // Opens the created file. | 125 // Opens the created file. |
| 125 FileProxy proxy(file_task_runner()); | 126 FileProxy proxy(file_task_runner()); |
| 126 proxy.CreateOrOpen( | 127 proxy.CreateOrOpen( |
| 127 test_path(), | 128 test_path(), |
| 128 File::FLAG_OPEN | File::FLAG_READ, | 129 File::FLAG_OPEN | File::FLAG_READ, |
| 129 Bind(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr())); | 130 Bind(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr())); |
| 130 MessageLoop::current()->Run(); | 131 RunLoop().Run(); |
| 131 | 132 |
| 132 EXPECT_EQ(File::FILE_OK, error_); | 133 EXPECT_EQ(File::FILE_OK, error_); |
| 133 EXPECT_TRUE(proxy.IsValid()); | 134 EXPECT_TRUE(proxy.IsValid()); |
| 134 EXPECT_FALSE(proxy.created()); | 135 EXPECT_FALSE(proxy.created()); |
| 135 } | 136 } |
| 136 | 137 |
| 137 TEST_F(FileProxyTest, CreateOrOpen_OpenNonExistent) { | 138 TEST_F(FileProxyTest, CreateOrOpen_OpenNonExistent) { |
| 138 FileProxy proxy(file_task_runner()); | 139 FileProxy proxy(file_task_runner()); |
| 139 proxy.CreateOrOpen( | 140 proxy.CreateOrOpen( |
| 140 test_path(), | 141 test_path(), |
| 141 File::FLAG_OPEN | File::FLAG_READ, | 142 File::FLAG_OPEN | File::FLAG_READ, |
| 142 Bind(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr())); | 143 Bind(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr())); |
| 143 MessageLoop::current()->Run(); | 144 RunLoop().Run(); |
| 144 EXPECT_EQ(File::FILE_ERROR_NOT_FOUND, error_); | 145 EXPECT_EQ(File::FILE_ERROR_NOT_FOUND, error_); |
| 145 EXPECT_FALSE(proxy.IsValid()); | 146 EXPECT_FALSE(proxy.IsValid()); |
| 146 EXPECT_FALSE(proxy.created()); | 147 EXPECT_FALSE(proxy.created()); |
| 147 EXPECT_FALSE(PathExists(test_path())); | 148 EXPECT_FALSE(PathExists(test_path())); |
| 148 } | 149 } |
| 149 | 150 |
| 150 TEST_F(FileProxyTest, CreateOrOpen_AbandonedCreate) { | 151 TEST_F(FileProxyTest, CreateOrOpen_AbandonedCreate) { |
| 151 bool prev = ThreadRestrictions::SetIOAllowed(false); | 152 bool prev = ThreadRestrictions::SetIOAllowed(false); |
| 152 { | 153 { |
| 153 FileProxy proxy(file_task_runner()); | 154 FileProxy proxy(file_task_runner()); |
| 154 proxy.CreateOrOpen( | 155 proxy.CreateOrOpen( |
| 155 test_path(), | 156 test_path(), |
| 156 File::FLAG_CREATE | File::FLAG_READ, | 157 File::FLAG_CREATE | File::FLAG_READ, |
| 157 Bind(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr())); | 158 Bind(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr())); |
| 158 } | 159 } |
| 159 MessageLoop::current()->Run(); | 160 RunLoop().Run(); |
| 160 ThreadRestrictions::SetIOAllowed(prev); | 161 ThreadRestrictions::SetIOAllowed(prev); |
| 161 | 162 |
| 162 EXPECT_TRUE(PathExists(test_path())); | 163 EXPECT_TRUE(PathExists(test_path())); |
| 163 } | 164 } |
| 164 | 165 |
| 165 TEST_F(FileProxyTest, Close) { | 166 TEST_F(FileProxyTest, Close) { |
| 166 // Creates a file. | 167 // Creates a file. |
| 167 FileProxy proxy(file_task_runner()); | 168 FileProxy proxy(file_task_runner()); |
| 168 CreateProxy(File::FLAG_CREATE | File::FLAG_WRITE, &proxy); | 169 CreateProxy(File::FLAG_CREATE | File::FLAG_WRITE, &proxy); |
| 169 | 170 |
| 170 #if defined(OS_WIN) | 171 #if defined(OS_WIN) |
| 171 // This fails on Windows if the file is not closed. | 172 // This fails on Windows if the file is not closed. |
| 172 EXPECT_FALSE(base::Move(test_path(), test_dir_path().AppendASCII("new"))); | 173 EXPECT_FALSE(base::Move(test_path(), test_dir_path().AppendASCII("new"))); |
| 173 #endif | 174 #endif |
| 174 | 175 |
| 175 proxy.Close(Bind(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr())); | 176 proxy.Close(Bind(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr())); |
| 176 MessageLoop::current()->Run(); | 177 RunLoop().Run(); |
| 177 EXPECT_EQ(File::FILE_OK, error_); | 178 EXPECT_EQ(File::FILE_OK, error_); |
| 178 EXPECT_FALSE(proxy.IsValid()); | 179 EXPECT_FALSE(proxy.IsValid()); |
| 179 | 180 |
| 180 // Now it should pass on all platforms. | 181 // Now it should pass on all platforms. |
| 181 EXPECT_TRUE(base::Move(test_path(), test_dir_path().AppendASCII("new"))); | 182 EXPECT_TRUE(base::Move(test_path(), test_dir_path().AppendASCII("new"))); |
| 182 } | 183 } |
| 183 | 184 |
| 184 TEST_F(FileProxyTest, CreateTemporary) { | 185 TEST_F(FileProxyTest, CreateTemporary) { |
| 185 { | 186 { |
| 186 FileProxy proxy(file_task_runner()); | 187 FileProxy proxy(file_task_runner()); |
| 187 proxy.CreateTemporary( | 188 proxy.CreateTemporary( |
| 188 0 /* additional_file_flags */, | 189 0 /* additional_file_flags */, |
| 189 Bind(&FileProxyTest::DidCreateTemporary, weak_factory_.GetWeakPtr())); | 190 Bind(&FileProxyTest::DidCreateTemporary, weak_factory_.GetWeakPtr())); |
| 190 MessageLoop::current()->Run(); | 191 RunLoop().Run(); |
| 191 | 192 |
| 192 EXPECT_TRUE(proxy.IsValid()); | 193 EXPECT_TRUE(proxy.IsValid()); |
| 193 EXPECT_EQ(File::FILE_OK, error_); | 194 EXPECT_EQ(File::FILE_OK, error_); |
| 194 EXPECT_TRUE(PathExists(path_)); | 195 EXPECT_TRUE(PathExists(path_)); |
| 195 | 196 |
| 196 // The file should be writable. | 197 // The file should be writable. |
| 197 proxy.Write(0, "test", 4, | 198 proxy.Write(0, "test", 4, |
| 198 Bind(&FileProxyTest::DidWrite, weak_factory_.GetWeakPtr())); | 199 Bind(&FileProxyTest::DidWrite, weak_factory_.GetWeakPtr())); |
| 199 MessageLoop::current()->Run(); | 200 RunLoop().Run(); |
| 200 EXPECT_EQ(File::FILE_OK, error_); | 201 EXPECT_EQ(File::FILE_OK, error_); |
| 201 EXPECT_EQ(4, bytes_written_); | 202 EXPECT_EQ(4, bytes_written_); |
| 202 } | 203 } |
| 203 | 204 |
| 204 // Make sure the written data can be read from the returned path. | 205 // Make sure the written data can be read from the returned path. |
| 205 std::string data; | 206 std::string data; |
| 206 EXPECT_TRUE(ReadFileToString(path_, &data)); | 207 EXPECT_TRUE(ReadFileToString(path_, &data)); |
| 207 EXPECT_EQ("test", data); | 208 EXPECT_EQ("test", data); |
| 208 | 209 |
| 209 // Make sure we can & do delete the created file to prevent leaks on the bots. | 210 // Make sure we can & do delete the created file to prevent leaks on the bots. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 228 // Setup. | 229 // Setup. |
| 229 ASSERT_EQ(4, base::WriteFile(test_path(), "test", 4)); | 230 ASSERT_EQ(4, base::WriteFile(test_path(), "test", 4)); |
| 230 File::Info expected_info; | 231 File::Info expected_info; |
| 231 GetFileInfo(test_path(), &expected_info); | 232 GetFileInfo(test_path(), &expected_info); |
| 232 | 233 |
| 233 // Run. | 234 // Run. |
| 234 FileProxy proxy(file_task_runner()); | 235 FileProxy proxy(file_task_runner()); |
| 235 CreateProxy(File::FLAG_OPEN | File::FLAG_READ, &proxy); | 236 CreateProxy(File::FLAG_OPEN | File::FLAG_READ, &proxy); |
| 236 proxy.GetInfo( | 237 proxy.GetInfo( |
| 237 Bind(&FileProxyTest::DidGetFileInfo, weak_factory_.GetWeakPtr())); | 238 Bind(&FileProxyTest::DidGetFileInfo, weak_factory_.GetWeakPtr())); |
| 238 MessageLoop::current()->Run(); | 239 RunLoop().Run(); |
| 239 | 240 |
| 240 // Verify. | 241 // Verify. |
| 241 EXPECT_EQ(File::FILE_OK, error_); | 242 EXPECT_EQ(File::FILE_OK, error_); |
| 242 EXPECT_EQ(expected_info.size, file_info_.size); | 243 EXPECT_EQ(expected_info.size, file_info_.size); |
| 243 EXPECT_EQ(expected_info.is_directory, file_info_.is_directory); | 244 EXPECT_EQ(expected_info.is_directory, file_info_.is_directory); |
| 244 EXPECT_EQ(expected_info.is_symbolic_link, file_info_.is_symbolic_link); | 245 EXPECT_EQ(expected_info.is_symbolic_link, file_info_.is_symbolic_link); |
| 245 EXPECT_EQ(expected_info.last_modified, file_info_.last_modified); | 246 EXPECT_EQ(expected_info.last_modified, file_info_.last_modified); |
| 246 EXPECT_EQ(expected_info.creation_time, file_info_.creation_time); | 247 EXPECT_EQ(expected_info.creation_time, file_info_.creation_time); |
| 247 } | 248 } |
| 248 | 249 |
| 249 TEST_F(FileProxyTest, Read) { | 250 TEST_F(FileProxyTest, Read) { |
| 250 // Setup. | 251 // Setup. |
| 251 const char expected_data[] = "bleh"; | 252 const char expected_data[] = "bleh"; |
| 252 int expected_bytes = arraysize(expected_data); | 253 int expected_bytes = arraysize(expected_data); |
| 253 ASSERT_EQ(expected_bytes, | 254 ASSERT_EQ(expected_bytes, |
| 254 base::WriteFile(test_path(), expected_data, expected_bytes)); | 255 base::WriteFile(test_path(), expected_data, expected_bytes)); |
| 255 | 256 |
| 256 // Run. | 257 // Run. |
| 257 FileProxy proxy(file_task_runner()); | 258 FileProxy proxy(file_task_runner()); |
| 258 CreateProxy(File::FLAG_OPEN | File::FLAG_READ, &proxy); | 259 CreateProxy(File::FLAG_OPEN | File::FLAG_READ, &proxy); |
| 259 | 260 |
| 260 proxy.Read(0, 128, Bind(&FileProxyTest::DidRead, weak_factory_.GetWeakPtr())); | 261 proxy.Read(0, 128, Bind(&FileProxyTest::DidRead, weak_factory_.GetWeakPtr())); |
| 261 MessageLoop::current()->Run(); | 262 RunLoop().Run(); |
| 262 | 263 |
| 263 // Verify. | 264 // Verify. |
| 264 EXPECT_EQ(File::FILE_OK, error_); | 265 EXPECT_EQ(File::FILE_OK, error_); |
| 265 EXPECT_EQ(expected_bytes, static_cast<int>(buffer_.size())); | 266 EXPECT_EQ(expected_bytes, static_cast<int>(buffer_.size())); |
| 266 for (size_t i = 0; i < buffer_.size(); ++i) { | 267 for (size_t i = 0; i < buffer_.size(); ++i) { |
| 267 EXPECT_EQ(expected_data[i], buffer_[i]); | 268 EXPECT_EQ(expected_data[i], buffer_[i]); |
| 268 } | 269 } |
| 269 } | 270 } |
| 270 | 271 |
| 271 TEST_F(FileProxyTest, WriteAndFlush) { | 272 TEST_F(FileProxyTest, WriteAndFlush) { |
| 272 FileProxy proxy(file_task_runner()); | 273 FileProxy proxy(file_task_runner()); |
| 273 CreateProxy(File::FLAG_CREATE | File::FLAG_WRITE, &proxy); | 274 CreateProxy(File::FLAG_CREATE | File::FLAG_WRITE, &proxy); |
| 274 | 275 |
| 275 const char data[] = "foo!"; | 276 const char data[] = "foo!"; |
| 276 int data_bytes = arraysize(data); | 277 int data_bytes = arraysize(data); |
| 277 proxy.Write(0, data, data_bytes, | 278 proxy.Write(0, data, data_bytes, |
| 278 Bind(&FileProxyTest::DidWrite, weak_factory_.GetWeakPtr())); | 279 Bind(&FileProxyTest::DidWrite, weak_factory_.GetWeakPtr())); |
| 279 MessageLoop::current()->Run(); | 280 RunLoop().Run(); |
| 280 EXPECT_EQ(File::FILE_OK, error_); | 281 EXPECT_EQ(File::FILE_OK, error_); |
| 281 EXPECT_EQ(data_bytes, bytes_written_); | 282 EXPECT_EQ(data_bytes, bytes_written_); |
| 282 | 283 |
| 283 // Flush the written data. (So that the following read should always | 284 // Flush the written data. (So that the following read should always |
| 284 // succeed. On some platforms it may work with or without this flush.) | 285 // succeed. On some platforms it may work with or without this flush.) |
| 285 proxy.Flush(Bind(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr())); | 286 proxy.Flush(Bind(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr())); |
| 286 MessageLoop::current()->Run(); | 287 RunLoop().Run(); |
| 287 EXPECT_EQ(File::FILE_OK, error_); | 288 EXPECT_EQ(File::FILE_OK, error_); |
| 288 | 289 |
| 289 // Verify the written data. | 290 // Verify the written data. |
| 290 char buffer[10]; | 291 char buffer[10]; |
| 291 EXPECT_EQ(data_bytes, base::ReadFile(test_path(), buffer, data_bytes)); | 292 EXPECT_EQ(data_bytes, base::ReadFile(test_path(), buffer, data_bytes)); |
| 292 for (int i = 0; i < data_bytes; ++i) { | 293 for (int i = 0; i < data_bytes; ++i) { |
| 293 EXPECT_EQ(data[i], buffer[i]); | 294 EXPECT_EQ(data[i], buffer[i]); |
| 294 } | 295 } |
| 295 } | 296 } |
| 296 | 297 |
| 297 #if defined(OS_ANDROID) | 298 #if defined(OS_ANDROID) |
| 298 // Flaky on Android, see http://crbug.com/489602 | 299 // Flaky on Android, see http://crbug.com/489602 |
| 299 #define MAYBE_SetTimes DISABLED_SetTimes | 300 #define MAYBE_SetTimes DISABLED_SetTimes |
| 300 #else | 301 #else |
| 301 #define MAYBE_SetTimes SetTimes | 302 #define MAYBE_SetTimes SetTimes |
| 302 #endif | 303 #endif |
| 303 TEST_F(FileProxyTest, MAYBE_SetTimes) { | 304 TEST_F(FileProxyTest, MAYBE_SetTimes) { |
| 304 FileProxy proxy(file_task_runner()); | 305 FileProxy proxy(file_task_runner()); |
| 305 CreateProxy( | 306 CreateProxy( |
| 306 File::FLAG_CREATE | File::FLAG_WRITE | File::FLAG_WRITE_ATTRIBUTES, | 307 File::FLAG_CREATE | File::FLAG_WRITE | File::FLAG_WRITE_ATTRIBUTES, |
| 307 &proxy); | 308 &proxy); |
| 308 | 309 |
| 309 Time last_accessed_time = Time::Now() - TimeDelta::FromDays(12345); | 310 Time last_accessed_time = Time::Now() - TimeDelta::FromDays(12345); |
| 310 Time last_modified_time = Time::Now() - TimeDelta::FromHours(98765); | 311 Time last_modified_time = Time::Now() - TimeDelta::FromHours(98765); |
| 311 | 312 |
| 312 proxy.SetTimes(last_accessed_time, last_modified_time, | 313 proxy.SetTimes(last_accessed_time, last_modified_time, |
| 313 Bind(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr())); | 314 Bind(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr())); |
| 314 MessageLoop::current()->Run(); | 315 RunLoop().Run(); |
| 315 EXPECT_EQ(File::FILE_OK, error_); | 316 EXPECT_EQ(File::FILE_OK, error_); |
| 316 | 317 |
| 317 File::Info info; | 318 File::Info info; |
| 318 GetFileInfo(test_path(), &info); | 319 GetFileInfo(test_path(), &info); |
| 319 | 320 |
| 320 // The returned values may only have the seconds precision, so we cast | 321 // The returned values may only have the seconds precision, so we cast |
| 321 // the double values to int here. | 322 // the double values to int here. |
| 322 EXPECT_EQ(static_cast<int>(last_modified_time.ToDoubleT()), | 323 EXPECT_EQ(static_cast<int>(last_modified_time.ToDoubleT()), |
| 323 static_cast<int>(info.last_modified.ToDoubleT())); | 324 static_cast<int>(info.last_modified.ToDoubleT())); |
| 324 EXPECT_EQ(static_cast<int>(last_accessed_time.ToDoubleT()), | 325 EXPECT_EQ(static_cast<int>(last_accessed_time.ToDoubleT()), |
| 325 static_cast<int>(info.last_accessed.ToDoubleT())); | 326 static_cast<int>(info.last_accessed.ToDoubleT())); |
| 326 } | 327 } |
| 327 | 328 |
| 328 TEST_F(FileProxyTest, SetLength_Shrink) { | 329 TEST_F(FileProxyTest, SetLength_Shrink) { |
| 329 // Setup. | 330 // Setup. |
| 330 const char kTestData[] = "0123456789"; | 331 const char kTestData[] = "0123456789"; |
| 331 ASSERT_EQ(10, base::WriteFile(test_path(), kTestData, 10)); | 332 ASSERT_EQ(10, base::WriteFile(test_path(), kTestData, 10)); |
| 332 File::Info info; | 333 File::Info info; |
| 333 GetFileInfo(test_path(), &info); | 334 GetFileInfo(test_path(), &info); |
| 334 ASSERT_EQ(10, info.size); | 335 ASSERT_EQ(10, info.size); |
| 335 | 336 |
| 336 // Run. | 337 // Run. |
| 337 FileProxy proxy(file_task_runner()); | 338 FileProxy proxy(file_task_runner()); |
| 338 CreateProxy(File::FLAG_OPEN | File::FLAG_WRITE, &proxy); | 339 CreateProxy(File::FLAG_OPEN | File::FLAG_WRITE, &proxy); |
| 339 proxy.SetLength(7, | 340 proxy.SetLength(7, |
| 340 Bind(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr())); | 341 Bind(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr())); |
| 341 MessageLoop::current()->Run(); | 342 RunLoop().Run(); |
| 342 | 343 |
| 343 // Verify. | 344 // Verify. |
| 344 GetFileInfo(test_path(), &info); | 345 GetFileInfo(test_path(), &info); |
| 345 ASSERT_EQ(7, info.size); | 346 ASSERT_EQ(7, info.size); |
| 346 | 347 |
| 347 char buffer[7]; | 348 char buffer[7]; |
| 348 EXPECT_EQ(7, base::ReadFile(test_path(), buffer, 7)); | 349 EXPECT_EQ(7, base::ReadFile(test_path(), buffer, 7)); |
| 349 int i = 0; | 350 int i = 0; |
| 350 for (; i < 7; ++i) | 351 for (; i < 7; ++i) |
| 351 EXPECT_EQ(kTestData[i], buffer[i]); | 352 EXPECT_EQ(kTestData[i], buffer[i]); |
| 352 } | 353 } |
| 353 | 354 |
| 354 TEST_F(FileProxyTest, SetLength_Expand) { | 355 TEST_F(FileProxyTest, SetLength_Expand) { |
| 355 // Setup. | 356 // Setup. |
| 356 const char kTestData[] = "9876543210"; | 357 const char kTestData[] = "9876543210"; |
| 357 ASSERT_EQ(10, base::WriteFile(test_path(), kTestData, 10)); | 358 ASSERT_EQ(10, base::WriteFile(test_path(), kTestData, 10)); |
| 358 File::Info info; | 359 File::Info info; |
| 359 GetFileInfo(test_path(), &info); | 360 GetFileInfo(test_path(), &info); |
| 360 ASSERT_EQ(10, info.size); | 361 ASSERT_EQ(10, info.size); |
| 361 | 362 |
| 362 // Run. | 363 // Run. |
| 363 FileProxy proxy(file_task_runner()); | 364 FileProxy proxy(file_task_runner()); |
| 364 CreateProxy(File::FLAG_OPEN | File::FLAG_WRITE, &proxy); | 365 CreateProxy(File::FLAG_OPEN | File::FLAG_WRITE, &proxy); |
| 365 proxy.SetLength(53, | 366 proxy.SetLength(53, |
| 366 Bind(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr())); | 367 Bind(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr())); |
| 367 MessageLoop::current()->Run(); | 368 RunLoop().Run(); |
| 368 | 369 |
| 369 // Verify. | 370 // Verify. |
| 370 GetFileInfo(test_path(), &info); | 371 GetFileInfo(test_path(), &info); |
| 371 ASSERT_EQ(53, info.size); | 372 ASSERT_EQ(53, info.size); |
| 372 | 373 |
| 373 char buffer[53]; | 374 char buffer[53]; |
| 374 EXPECT_EQ(53, base::ReadFile(test_path(), buffer, 53)); | 375 EXPECT_EQ(53, base::ReadFile(test_path(), buffer, 53)); |
| 375 int i = 0; | 376 int i = 0; |
| 376 for (; i < 10; ++i) | 377 for (; i < 10; ++i) |
| 377 EXPECT_EQ(kTestData[i], buffer[i]); | 378 EXPECT_EQ(kTestData[i], buffer[i]); |
| 378 for (; i < 53; ++i) | 379 for (; i < 53; ++i) |
| 379 EXPECT_EQ(0, buffer[i]); | 380 EXPECT_EQ(0, buffer[i]); |
| 380 } | 381 } |
| 381 | 382 |
| 382 } // namespace base | 383 } // namespace base |
| OLD | NEW |