Index: util/file/file_io_test.cc |
diff --git a/util/file/file_io_test.cc b/util/file/file_io_test.cc |
index 5719dccb084ad15afc835cbf435780f01247d82f..29cf320444e9c6b1bc1a7e57857744310a246202 100644 |
--- a/util/file/file_io_test.cc |
+++ b/util/file/file_io_test.cc |
@@ -19,13 +19,100 @@ |
#include "base/files/file_path.h" |
#include "gtest/gtest.h" |
#include "test/errors.h" |
+#include "test/file.h" |
#include "test/scoped_temp_dir.h" |
+#include "util/misc/implicit_cast.h" |
#include "util/thread/thread.h" |
namespace crashpad { |
namespace test { |
namespace { |
+TEST(FileIO, OpenFileForWrite) { |
+ ScopedTempDir temp_dir; |
+ base::FilePath file_path_1 = |
+ temp_dir.path().Append(FILE_PATH_LITERAL("file_1")); |
+ ASSERT_FALSE(FileExists(file_path_1)); |
+ |
+ ScopedFileHandle |
+ file_handle(LoggingOpenFileForWrite(file_path_1, |
+ FileWriteMode::kReuseOrFail, |
+ FilePermissions::kWorldReadable)); |
+ EXPECT_EQ(kInvalidFileHandle, file_handle); |
+ EXPECT_FALSE(FileExists(file_path_1)); |
+ |
+ file_handle.reset(LoggingOpenFileForWrite(file_path_1, |
+ FileWriteMode::kCreateOrFail, |
+ FilePermissions::kWorldReadable)); |
+ EXPECT_NE(kInvalidFileHandle, file_handle); |
+ EXPECT_TRUE(FileExists(file_path_1)); |
+ EXPECT_EQ(0, FileSize(file_path_1)); |
+ |
+ file_handle.reset(LoggingOpenFileForWrite(file_path_1, |
+ FileWriteMode::kReuseOrCreate, |
+ FilePermissions::kWorldReadable)); |
+ EXPECT_NE(kInvalidFileHandle, file_handle); |
+ EXPECT_TRUE(FileExists(file_path_1)); |
+ EXPECT_EQ(0, FileSize(file_path_1)); |
+ |
+ const char data = '%'; |
+ EXPECT_TRUE(LoggingWriteFile(file_handle.get(), &data, sizeof(data))); |
+ |
+ // Close file_handle to ensure that the write is flushed to disk. |
+ file_handle.reset(); |
+ EXPECT_EQ(implicit_cast<FileOffset>(sizeof(data)), FileSize(file_path_1)); |
+ |
+ file_handle.reset(LoggingOpenFileForWrite(file_path_1, |
+ FileWriteMode::kReuseOrCreate, |
+ FilePermissions::kWorldReadable)); |
+ EXPECT_NE(kInvalidFileHandle, file_handle); |
+ EXPECT_TRUE(FileExists(file_path_1)); |
+ EXPECT_EQ(implicit_cast<FileOffset>(sizeof(data)), FileSize(file_path_1)); |
+ |
+ file_handle.reset(LoggingOpenFileForWrite(file_path_1, |
+ FileWriteMode::kCreateOrFail, |
+ FilePermissions::kWorldReadable)); |
+ EXPECT_EQ(kInvalidFileHandle, file_handle); |
+ EXPECT_TRUE(FileExists(file_path_1)); |
+ EXPECT_EQ(implicit_cast<FileOffset>(sizeof(data)), FileSize(file_path_1)); |
+ |
+ file_handle.reset(LoggingOpenFileForWrite(file_path_1, |
+ FileWriteMode::kReuseOrFail, |
+ FilePermissions::kWorldReadable)); |
+ EXPECT_NE(kInvalidFileHandle, file_handle); |
+ EXPECT_TRUE(FileExists(file_path_1)); |
+ EXPECT_EQ(implicit_cast<FileOffset>(sizeof(data)), FileSize(file_path_1)); |
+ |
+ file_handle.reset(LoggingOpenFileForWrite(file_path_1, |
+ FileWriteMode::kTruncateOrCreate, |
+ FilePermissions::kWorldReadable)); |
+ EXPECT_NE(kInvalidFileHandle, file_handle); |
+ EXPECT_TRUE(FileExists(file_path_1)); |
+ EXPECT_EQ(0, FileSize(file_path_1)); |
+ |
+ base::FilePath file_path_2 = |
+ temp_dir.path().Append(FILE_PATH_LITERAL("file_2")); |
+ ASSERT_FALSE(FileExists(file_path_2)); |
+ |
+ file_handle.reset(LoggingOpenFileForWrite(file_path_2, |
+ FileWriteMode::kTruncateOrCreate, |
+ FilePermissions::kWorldReadable)); |
+ EXPECT_NE(kInvalidFileHandle, file_handle); |
+ EXPECT_TRUE(FileExists(file_path_2)); |
+ EXPECT_EQ(0, FileSize(file_path_2)); |
+ |
+ base::FilePath file_path_3 = |
+ temp_dir.path().Append(FILE_PATH_LITERAL("file_3")); |
+ ASSERT_FALSE(FileExists(file_path_3)); |
+ |
+ file_handle.reset(LoggingOpenFileForWrite(file_path_3, |
+ FileWriteMode::kReuseOrCreate, |
+ FilePermissions::kWorldReadable)); |
+ EXPECT_NE(kInvalidFileHandle, file_handle); |
+ EXPECT_TRUE(FileExists(file_path_3)); |
+ EXPECT_EQ(0, FileSize(file_path_3)); |
+} |
+ |
enum class ReadOrWrite : bool { |
kRead, |
kWrite, |