diff --git a/lib/fakefs/file.rb b/lib/fakefs/file.rb index 65f6e0a0..6c03f74c 100644 --- a/lib/fakefs/file.rb +++ b/lib/fakefs/file.rb @@ -172,13 +172,18 @@ def self.stat(file) File::Stat.new(file) end + def self.lstat(file) + File::Stat.new(file, true) + end + class Stat - def initialize(file) + def initialize(file, __lstat = false) if !File.exists?(file) raise(Errno::ENOENT, "No such file or directory - #{file}") end - @file = file + @file = file + @__lstat = __lstat end def symlink? @@ -194,7 +199,11 @@ def nlink end def size - File.size(@file) + if @__lstat && symlink? + FileSystem.find(@file).target.size + else + File.size(@file) + end end end @@ -236,7 +245,11 @@ def read_nonblock(maxlen, outbuf = nil) end def stat - raise NotImplementedError + self.class.stat(@path) + end + + def lstat + self.class.lstat(@path) end def sysseek(position, whence = SEEK_SET) @@ -278,10 +291,6 @@ def flock(locking_constant) raise NotImplementedError end - def lstat - raise NotImplementedError - end - def mtime raise NotImplementedError end diff --git a/test/fake/file/lstat_test.rb b/test/fake/file/lstat_test.rb new file mode 100644 index 00000000..4b018385 --- /dev/null +++ b/test/fake/file/lstat_test.rb @@ -0,0 +1,59 @@ +require "test_helper" + +class FileStat < Test::Unit::TestCase + def setup + FakeFS.activate! + FakeFS::FileSystem.clear + end + + def teardown + FakeFS.deactivate! + end + + def test_calling_lstat_should_create_a_new_file_stat_object + File.open("foo", "w") do |f| + f << "bar" + end + + File.open("foo") do |f| + assert_equal File::Stat, f.lstat.class + end + end + + def test_lstat_should_use_correct_file + File.open("bar", "w") do |f| + f << "1" + end + + File.open("bar") do |f| + assert_equal 1, f.lstat.size + end + end + + def test_lstat_should_report_on_symlink_itself + File.open("foo", "w") { |f| f << "some content" } + File.symlink "foo", "my_symlink" + + assert_not_equal File.lstat("my_symlink").size, File.lstat("foo").size + end + + def test_should_report_on_symlink_itself_with_size_instance_method + File.open("foo", "w") { |f| f << "some content" } + File.symlink "foo", "my_symlink" + + file = File.open("foo") + symlink = File.open("my_symlink") + + assert_not_equal file.lstat.size, symlink.lstat.size + end + + def test_symlink_size_is_size_of_path_pointed_to + File.open("a", "w") { |x| x << "foobarbazfoobarbaz" } + File.symlink "a", "one_char_symlink" + assert_equal 1, File.lstat("one_char_symlink").size + + File.open("ab", "w") { |x| x << "foobarbazfoobarbaz" } + File.symlink "ab", "two_char_symlink" + assert_equal 2, File.lstat("two_char_symlink").size + end +end \ No newline at end of file diff --git a/test/fake/file/stat_test.rb b/test/fake/file/stat_test.rb new file mode 100644 index 00000000..6e6e54c7 --- /dev/null +++ b/test/fake/file/stat_test.rb @@ -0,0 +1,39 @@ +require "test_helper" + +class FileStat < Test::Unit::TestCase + def setup + FakeFS.activate! + FakeFS::FileSystem.clear + end + + def teardown + FakeFS.deactivate! + end + + def test_calling_stat_should_create_a_new_file_stat_object + File.open("foo", "w") do |f| + f << "bar" + end + + File.open("foo") do |f| + assert_equal File::Stat, f.stat.class + end + end + + def test_stat_should_use_correct_file + File.open("bar", "w") do |f| + f << "1" + end + + File.open("bar") do |f| + assert_equal 1, f.stat.size + end + end + + def test_stat_should_report_on_symlink_pointer + File.open("foo", "w") { |f| f << "some content" } + File.symlink "foo", "my_symlink" + + assert_equal File.stat("my_symlink").size, File.stat("foo").size + end +end \ No newline at end of file