blob: 3c9db8266d6ca691baa2bbc123469c1dbbc97ba5 [file] [log] [blame]
# 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