diff options
-rw-r--r-- | base/files/file_unittest.cc | 33 | ||||
-rw-r--r-- | base/files/file_win.cc | 27 |
2 files changed, 45 insertions, 15 deletions
diff --git a/base/files/file_unittest.cc b/base/files/file_unittest.cc index 18ba340..c0579ad 100644 --- a/base/files/file_unittest.cc +++ b/base/files/file_unittest.cc @@ -349,18 +349,17 @@ TEST(File, DISABLED_TouchGetInfo) { creation_time.ToInternalValue()); } -TEST(File, ReadFileAtCurrentPosition) { +TEST(File, ReadAtCurrentPosition) { base::ScopedTempDir temp_dir; ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); - FilePath file_path = - temp_dir.path().AppendASCII("read_file_at_current_position"); + FilePath file_path = temp_dir.path().AppendASCII("read_at_current_position"); File file(file_path, base::File::FLAG_CREATE | base::File::FLAG_READ | base::File::FLAG_WRITE); EXPECT_TRUE(file.IsValid()); const char kData[] = "test"; - const int kDataSize = arraysize(kData) - 1; + const int kDataSize = sizeof(kData) - 1; EXPECT_EQ(kDataSize, file.Write(0, kData, kDataSize)); EXPECT_EQ(0, file.Seek(base::File::FROM_BEGIN, 0)); @@ -371,8 +370,30 @@ TEST(File, ReadFileAtCurrentPosition) { EXPECT_EQ(kDataSize - first_chunk_size, file.ReadAtCurrentPos(buffer + first_chunk_size, kDataSize - first_chunk_size)); - EXPECT_EQ(std::string(buffer, buffer + kDataSize), - std::string(kData)); + EXPECT_EQ(std::string(buffer, buffer + kDataSize), std::string(kData)); +} + +TEST(File, WriteAtCurrentPosition) { + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + FilePath file_path = temp_dir.path().AppendASCII("write_at_current_position"); + File file(file_path, + base::File::FLAG_CREATE | base::File::FLAG_READ | + base::File::FLAG_WRITE); + EXPECT_TRUE(file.IsValid()); + + const char kData[] = "test"; + const int kDataSize = sizeof(kData) - 1; + + int first_chunk_size = kDataSize / 2; + EXPECT_EQ(first_chunk_size, file.WriteAtCurrentPos(kData, first_chunk_size)); + EXPECT_EQ(kDataSize - first_chunk_size, + file.WriteAtCurrentPos(kData + first_chunk_size, + kDataSize - first_chunk_size)); + + char buffer[kDataSize]; + EXPECT_EQ(kDataSize, file.Read(0, buffer, kDataSize)); + EXPECT_EQ(std::string(buffer, buffer + kDataSize), std::string(kData)); } #if defined(OS_WIN) diff --git a/base/files/file_win.cc b/base/files/file_win.cc index 3581fca..2bd69c7 100644 --- a/base/files/file_win.cc +++ b/base/files/file_win.cc @@ -139,7 +139,7 @@ int File::Read(int64 offset, char* data, int size) { overlapped.OffsetHigh = offset_li.HighPart; DWORD bytes_read; - if (::ReadFile(file_, data, size, &bytes_read, &overlapped) != 0) + if (::ReadFile(file_, data, size, &bytes_read, &overlapped)) return bytes_read; if (ERROR_HANDLE_EOF == GetLastError()) return 0; @@ -155,7 +155,7 @@ int File::ReadAtCurrentPos(char* data, int size) { return -1; DWORD bytes_read; - if (::ReadFile(file_, data, size, &bytes_read, NULL) != 0) + if (::ReadFile(file_, data, size, &bytes_read, NULL)) return bytes_read; if (ERROR_HANDLE_EOF == GetLastError()) return 0; @@ -184,14 +184,23 @@ int File::Write(int64 offset, const char* data, int size) { overlapped.OffsetHigh = offset_li.HighPart; DWORD bytes_written; - if (::WriteFile(file_, data, size, &bytes_written, &overlapped) != 0) + if (::WriteFile(file_, data, size, &bytes_written, &overlapped)) return bytes_written; return -1; } int File::WriteAtCurrentPos(const char* data, int size) { - NOTREACHED(); + base::ThreadRestrictions::AssertIOAllowed(); + DCHECK(IsValid()); + DCHECK(!async_); + if (size < 0) + return -1; + + DWORD bytes_written; + if (::WriteFile(file_, data, size, &bytes_written, NULL)) + return bytes_written; + return -1; } @@ -217,7 +226,7 @@ bool File::SetLength(int64 length) { LARGE_INTEGER file_pointer; LARGE_INTEGER zero; zero.QuadPart = 0; - if (::SetFilePointerEx(file_, zero, &file_pointer, FILE_CURRENT) == 0) + if (!::SetFilePointerEx(file_, zero, &file_pointer, FILE_CURRENT)) return false; LARGE_INTEGER length_li; @@ -233,8 +242,8 @@ bool File::SetLength(int64 length) { // TODO(rvargas): Emulating ftruncate details seem suspicious and it is not // promised by the interface (nor was promised by PlatformFile). See if this // implementation detail can be removed. - return ((::SetEndOfFile(file_) != 0) && - (::SetFilePointerEx(file_, file_pointer, NULL, FILE_BEGIN) != 0)); + return ((::SetEndOfFile(file_) != FALSE) && + (::SetFilePointerEx(file_, file_pointer, NULL, FILE_BEGIN) != FALSE)); } bool File::Flush() { @@ -250,7 +259,7 @@ bool File::SetTimes(Time last_access_time, Time last_modified_time) { FILETIME last_access_filetime = last_access_time.ToFileTime(); FILETIME last_modified_filetime = last_modified_time.ToFileTime(); return (::SetFileTime(file_, NULL, &last_access_filetime, - &last_modified_filetime) != 0); + &last_modified_filetime) != FALSE); } bool File::GetInfo(Info* info) { @@ -258,7 +267,7 @@ bool File::GetInfo(Info* info) { DCHECK(IsValid()); BY_HANDLE_FILE_INFORMATION file_info; - if (GetFileInformationByHandle(file_, &file_info) == 0) + if (!GetFileInformationByHandle(file_, &file_info)) return false; LARGE_INTEGER size; |