| 939 | } |
| 940 | |
| 941 | void GenericFileSystemTest::TestOpenOutputStream(FileSystem* fs) { |
| 942 | std::shared_ptr<io::OutputStream> stream; |
| 943 | |
| 944 | ASSERT_OK_AND_ASSIGN(stream, fs->OpenOutputStream("abc")); |
| 945 | ASSERT_OK_AND_EQ(0, stream->Tell()); |
| 946 | ASSERT_FALSE(stream->closed()); |
| 947 | ASSERT_OK(stream->Close()); |
| 948 | ASSERT_TRUE(stream->closed()); |
| 949 | AssertAllDirs(fs, {}); |
| 950 | AssertAllFiles(fs, {"abc"}); |
| 951 | AssertFileContents(fs, "abc", ""); |
| 952 | |
| 953 | // Parent does not exist |
| 954 | if (!have_implicit_directories()) { |
| 955 | ASSERT_RAISES(IOError, fs->OpenOutputStream("AB/def")); |
| 956 | } |
| 957 | AssertAllDirs(fs, {}); |
| 958 | AssertAllFiles(fs, {"abc"}); |
| 959 | |
| 960 | // Several writes |
| 961 | ASSERT_OK(fs->CreateDir("CD")); |
| 962 | ASSERT_OK_AND_ASSIGN(stream, fs->OpenOutputStream("CD/ghi")); |
| 963 | ASSERT_OK(stream->Write("some ")); |
| 964 | ASSERT_OK(stream->Write(Buffer::FromString("data"))); |
| 965 | ASSERT_OK_AND_EQ(9, stream->Tell()); |
| 966 | ASSERT_OK(stream->Close()); |
| 967 | AssertAllDirs(fs, {"CD"}); |
| 968 | AssertAllFiles(fs, {"CD/ghi", "abc"}); |
| 969 | AssertFileContents(fs, "CD/ghi", "some data"); |
| 970 | |
| 971 | // Overwrite |
| 972 | ASSERT_OK_AND_ASSIGN(stream, fs->OpenOutputStream("CD/ghi")); |
| 973 | ASSERT_OK(stream->Write("overwritten")); |
| 974 | ASSERT_OK(stream->Close()); |
| 975 | AssertAllDirs(fs, {"CD"}); |
| 976 | AssertAllFiles(fs, {"CD/ghi", "abc"}); |
| 977 | AssertFileContents(fs, "CD/ghi", "overwritten"); |
| 978 | |
| 979 | ASSERT_RAISES(Invalid, stream->Write("x")); // Stream is closed |
| 980 | |
| 981 | // Trailing slash rejected |
| 982 | ASSERT_RAISES(IOError, fs->OpenOutputStream("CD/ghi/")); |
| 983 | |
| 984 | // Storing metadata along file |
| 985 | auto metadata = KeyValueMetadata::Make({"Content-Type", "Content-Language"}, |
| 986 | {"x-arrow/filesystem-test", "fr_FR"}); |
| 987 | ASSERT_OK_AND_ASSIGN(stream, fs->OpenOutputStream("jkl", metadata)); |
| 988 | ASSERT_OK(stream->Write("data")); |
| 989 | ASSERT_OK(stream->Close()); |
| 990 | ASSERT_OK_AND_ASSIGN(auto input, fs->OpenInputStream("jkl")); |
| 991 | ASSERT_OK_AND_ASSIGN(auto got_metadata, input->ReadMetadata()); |
| 992 | if (have_file_metadata()) { |
| 993 | ASSERT_NE(got_metadata, nullptr); |
| 994 | ASSERT_GE(got_metadata->size(), 2); |
| 995 | ASSERT_OK_AND_EQ("x-arrow/filesystem-test", got_metadata->Get("Content-Type")); |
| 996 | } else { |
| 997 | if (got_metadata) { |
| 998 | ASSERT_EQ(got_metadata->size(), 0); |
nothing calls this directly
no test coverage detected