summaryrefslogtreecommitdiffstats
path: root/src/arrow/c_glib/test/file-system-tests.rb
diff options
context:
space:
mode:
Diffstat (limited to 'src/arrow/c_glib/test/file-system-tests.rb')
-rw-r--r--src/arrow/c_glib/test/file-system-tests.rb383
1 files changed, 383 insertions, 0 deletions
diff --git a/src/arrow/c_glib/test/file-system-tests.rb b/src/arrow/c_glib/test/file-system-tests.rb
new file mode 100644
index 000000000..3c9db8266
--- /dev/null
+++ b/src/arrow/c_glib/test/file-system-tests.rb
@@ -0,0 +1,383 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+module FileSystemTests
+ private def all_entries
+ selector = Arrow::FileSelector.new
+ selector.base_dir = ""
+ selector.recursive = true
+ infos = @fs.get_file_infos_selector(selector)
+ infos.map {|info| [info.path, info.type.nick.to_sym]}.to_h
+ end
+
+ private def mkpath(path)
+ @fs.create_dir(path, true)
+ end
+
+ private def create_file(path, content=nil)
+ stream = @fs.open_output_stream(path)
+ stream.write(content) if content
+ stream.close
+ end
+
+ private def read_file(path)
+ stream = @fs.open_input_stream(path)
+ size = @fs.get_file_info(path).size
+ bytes = stream.read_bytes(size)
+ stream.close
+ bytes.to_s
+ end
+
+ private def file?(path)
+ info = @fs.get_file_info(path)
+ info.file?
+ rescue Arrow::Error::Io
+ false
+ end
+
+ private def directory?(path)
+ info = @fs.get_file_info(path)
+ info.dir?
+ rescue Arrow::Error::Io
+ false
+ end
+
+ def test_empty
+ assert { all_entries.empty? }
+ end
+
+ def test_create_dir
+ @fs.create_dir("AB/CD/EF", true) # recursive
+ @fs.create_dir("AB/GH", false) # non-recursive
+ assert_equal({
+ "AB" => :dir,
+ "AB/CD" => :dir,
+ "AB/CD/EF" => :dir,
+ "AB/GH" => :dir
+ },
+ all_entries)
+ end
+
+ def test_create_dir_with_nonexistent_parent
+ assert_raise(Arrow::Error::Io) do
+ @fs.create_dir("AB/GH/IJ", false) # non-recursive, parent doesn't exist
+ end
+ assert_equal({},
+ all_entries)
+ end
+
+ def test_create_dir_under_file
+ create_file("empty_file")
+ assert_raise(Arrow::Error::Io) do
+ @fs.create_dir(File.join("empty_file", "XY"), true)
+ end
+ assert_equal({"empty_file" => :file},
+ all_entries)
+ end
+
+ def test_delete_dir
+ mkpath("AB/CD/EF")
+ mkpath("AB/GH/IJ")
+ create_file("AB/abc")
+ create_file("AB/CD/def")
+ create_file("AB/CD/EF/ghi")
+
+ @fs.delete_dir("AB/CD")
+ @fs.delete_dir("AB/GH/IJ")
+
+ assert_equal({
+ "AB" => :dir,
+ "AB/GH" => :dir,
+ "AB/abc" => :file
+ },
+ all_entries)
+ end
+
+ def test_delete_dir_contents
+ mkpath("AB/CD/EF")
+ mkpath("AB/GH/IJ")
+ create_file("AB/abc")
+ create_file("AB/CD/def")
+ create_file("AB/CD/EF/ghi")
+
+ @fs.delete_dir_contents("AB/CD")
+ @fs.delete_dir_contents("AB/GH/IJ")
+
+ assert_equal({
+ "AB" => :dir,
+ "AB/CD" => :dir,
+ "AB/GH" => :dir,
+ "AB/GH/IJ" => :dir,
+ "AB/abc" => :file
+ },
+ all_entries)
+ end
+
+ def test_delete_file
+ mkpath("AB")
+ create_file("AB/def")
+ assert { file?("AB/def") }
+
+ @fs.delete_file("AB/def")
+ assert { not file?("AB/def") }
+ end
+
+ def test_delete_files
+ mkpath("AB")
+ create_file("abc")
+ {
+ def: 123,
+ ghi: 456,
+ jkl: 789,
+ mno: 789
+ }.each do |name, content|
+ create_file(File.join("AB", name.to_s), content.to_s)
+ end
+
+ assert_equal({
+ "AB" => :dir,
+ "AB/def" => :file,
+ "AB/ghi" => :file,
+ "AB/jkl" => :file,
+ "AB/mno" => :file,
+ "abc" => :file
+ },
+ all_entries)
+
+ @fs.delete_files(["abc", "AB/def"])
+ assert_equal({
+ "AB" => :dir,
+ "AB/ghi" => :file,
+ "AB/jkl" => :file,
+ "AB/mno" => :file
+ },
+ all_entries)
+ end
+
+ def test_move_file
+ mkpath("AB/CD")
+ mkpath("EF")
+ create_file("abc")
+ assert_equal({
+ "AB" => :dir,
+ "AB/CD" => :dir,
+ "EF" => :dir,
+ "abc" => :file
+ },
+ all_entries)
+
+ @fs.move("abc", "AB/CD/ghi")
+ assert_equal({
+ "AB" => :dir,
+ "AB/CD" => :dir,
+ "EF" => :dir,
+ "AB/CD/ghi" => :file
+ },
+ all_entries)
+ end
+
+ def move_dir_is_supported?
+ true
+ end
+
+ def test_move_dir
+ omit("move_dir is not allowed") unless move_dir_is_supported?
+
+ mkpath("AB/CD")
+ mkpath("EF")
+ assert_equal({
+ "AB" => :dir,
+ "AB/CD" => :dir,
+ "EF" => :dir
+ },
+ all_entries)
+
+ @fs.move("AB", "GH")
+ assert_equal({
+ "EF" => :dir,
+ "GH" => :dir,
+ "GH/CD" => :dir
+ },
+ all_entries)
+ end
+
+ def test_copy_file
+ mkpath("AB/CD")
+ mkpath("EF")
+ create_file("AB/abc", "data")
+ assert_equal({
+ "AB" => :dir,
+ "AB/CD" => :dir,
+ "EF" => :dir,
+ "AB/abc" => :file
+ },
+ all_entries)
+
+ @fs.copy_file("AB/abc", "def")
+ assert_equal({
+ "AB" => :dir,
+ "AB/CD" => :dir,
+ "EF" => :dir,
+ "AB/abc" => :file,
+ "def" => :file
+ },
+ all_entries)
+ assert_equal("data",
+ read_file("def"))
+ end
+
+ def test_get_file_info
+ mkpath("AB/CD")
+ create_file("AB/CD/ghi", "some data")
+
+ info = @fs.get_file_info("AB")
+ assert_equal(Arrow::FileType::DIR,
+ info.type)
+ assert_equal("AB",
+ info.base_name)
+ assert_equal(-1,
+ info.size)
+ assert do
+ info.mtime > 0
+ end
+
+ info = @fs.get_file_info("AB/CD/ghi")
+ assert_equal(Arrow::FileType::FILE,
+ info.type)
+ assert_equal("ghi",
+ info.base_name)
+ assert_equal(9,
+ info.size)
+ assert do
+ info.mtime > 0
+ end
+ end
+
+ def test_get_file_infos_paths
+ mkpath("AB/CD")
+ create_file("AB/CD/ghi", "some data")
+
+ infos = @fs.get_file_infos_paths(["AB", "AB/CD/ghi"])
+ assert_equal({
+ "AB" => -1,
+ "AB/CD/ghi" => 9
+ },
+ infos.map {|info| [info.path, info.size]}.to_h)
+ end
+
+ def test_get_file_infos_selector
+ mkpath("AB/CD")
+ create_file("abc", "data")
+ create_file("AB/def", "some data")
+ create_file("AB/CD/ghi", "some other data")
+
+ selector = Arrow::FileSelector.new
+ infos = @fs.get_file_infos_selector(selector)
+ assert_equal({
+ "AB" => -1,
+ "abc" => 4
+ },
+ infos.map {|info| [info.path, info.size]}.to_h)
+
+ selector.base_dir = "AB"
+ infos = @fs.get_file_infos_selector(selector)
+ assert_equal({
+ "AB/CD" => -1,
+ "AB/def" => 9
+ },
+ infos.map {|info| [info.path, info.size]}.to_h)
+ end
+
+ def test_get_file_infos_selector_with_recursion
+ mkpath("AB/CD")
+ create_file("abc", "data")
+ create_file("AB/def", "some data")
+ create_file("AB/CD/ghi", "some other data")
+
+ selector = Arrow::FileSelector.new
+ selector.recursive = true
+ infos = @fs.get_file_infos_selector(selector)
+ assert_equal({
+ "AB" => -1,
+ "AB/CD" => -1,
+ "AB/CD/ghi" => 15,
+ "AB/def" => 9,
+ "abc" => 4
+ },
+ infos.map {|info| [info.path, info.size]}.to_h)
+ end
+
+ def test_open_output_stream
+ assert { not file?("abc") }
+ stream = @fs.open_output_stream("abc")
+ assert_equal(0, stream.tell)
+ stream.write("some ")
+ stream.write("data")
+ stream.close
+ assert { file?("abc") }
+ assert_equal("some data",
+ read_file("abc"))
+
+ stream = @fs.open_output_stream("abc")
+ assert_equal(0, stream.tell)
+ stream.write("other data")
+ stream.close
+ assert { file?("abc") }
+ assert_equal("other data",
+ read_file("abc"))
+ end
+
+ def test_open_append_stream
+ assert { not file?("abc") }
+ stream = @fs.open_append_stream("abc")
+ assert_equal(0, stream.tell)
+ stream.write("some ")
+ stream.close
+ assert { file?("abc") }
+ assert_equal("some ",
+ read_file("abc"))
+
+ stream = @fs.open_append_stream("abc")
+ assert_equal(5, stream.tell)
+ stream.write("data")
+ stream.close
+ assert { file?("abc") }
+ assert_equal("some data",
+ read_file("abc"))
+ end
+
+ def test_open_input_stream
+ mkpath("AB")
+ create_file("AB/abc", "some data")
+
+ stream = @fs.open_input_stream("AB/abc")
+ bytes = stream.read_bytes(4)
+ assert_equal("some",
+ bytes.to_s)
+ stream.close
+ end
+
+ def test_open_input_file
+ create_file("ab", "some data")
+
+ stream = @fs.open_input_file("ab")
+ bytes = stream.read_at_bytes(5, 4)
+ assert_equal("data",
+ bytes.to_s)
+ stream.close
+ end
+end