fakefs 0.4.3 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,7 @@ module FakeFS
3
3
  extend self
4
4
 
5
5
  def dir_levels
6
- @dir_levels ||= []
6
+ @dir_levels ||= ['/']
7
7
  end
8
8
 
9
9
  def fs
@@ -36,9 +36,11 @@ module FakeFS
36
36
  parts = path_parts(normalize_path(path))
37
37
 
38
38
  d = parts[0...-1].inject(fs) do |dir, part|
39
+ assert_dir dir[part] if dir[part]
39
40
  dir[part] ||= FakeDir.new(part, dir)
40
41
  end
41
42
 
43
+ assert_dir d
42
44
  object.name = parts.last
43
45
  object.parent = d
44
46
  d[parts.last] ||= object
@@ -47,21 +49,21 @@ module FakeFS
47
49
  # copies directories and files from the real filesystem
48
50
  # into our fake one
49
51
  def clone(path, target = nil)
50
- path = File.expand_path(path)
52
+ path = RealFile.expand_path(path)
51
53
  pattern = File.join(path, '**', '*')
52
54
  files = RealFile.file?(path) ? [path] : [path] + RealDir.glob(pattern, RealFile::FNM_DOTMATCH)
53
55
 
54
56
  files.each do |f|
55
57
  target_path = target ? f.gsub(path, target) : f
56
- if RealFile.file?(f)
58
+ if RealFile.symlink?(f)
59
+ FileUtils.ln_s(RealFile.readlink(f), f)
60
+ elsif RealFile.file?(f)
57
61
  FileUtils.mkdir_p(File.dirname(f))
58
62
  File.open(target_path, File::WRITE_ONLY) do |g|
59
63
  g.print RealFile.open(f){|h| h.read }
60
64
  end
61
65
  elsif RealFile.directory?(f)
62
66
  FileUtils.mkdir_p(target_path)
63
- elsif RealFile.symlink?(f)
64
- FileUtils.ln_s()
65
67
  end
66
68
  end
67
69
  end
@@ -91,15 +93,15 @@ module FakeFS
91
93
 
92
94
  def normalize_path(path)
93
95
  if Pathname.new(path).absolute?
94
- File.expand_path(path)
96
+ RealFile.expand_path(path)
95
97
  else
96
98
  parts = dir_levels + [path]
97
- File.expand_path(File.join(*parts))
99
+ RealFile.expand_path(parts.inject {|base, part| Pathname(base) + part }.to_s)
98
100
  end
99
101
  end
100
102
 
101
103
  def current_dir
102
- find(normalize_path('.'))
104
+ find('.')
103
105
  end
104
106
 
105
107
  private
@@ -107,7 +109,7 @@ module FakeFS
107
109
  def drop_root(path_parts)
108
110
  # we need to remove parts from root dir at least for windows and jruby
109
111
  return path_parts if path_parts.nil? || path_parts.empty?
110
- root = File.expand_path('/').split(File::SEPARATOR).first
112
+ root = RealFile.expand_path('/').split(File::SEPARATOR).first
111
113
  path_parts.shift if path_parts.first == root
112
114
  path_parts
113
115
  end
@@ -145,5 +147,9 @@ module FakeFS
145
147
  children = dir.entries.select{|f| f.is_a? FakeDir}
146
148
  ([dir] + children + children.map{|c| directories_under(c)}).flatten.uniq
147
149
  end
150
+
151
+ def assert_dir(dir)
152
+ raise Errno::EEXIST, dir.name unless dir.is_a?(FakeDir)
153
+ end
148
154
  end
149
155
  end
@@ -1,15 +1,21 @@
1
1
  module FakeFS
2
- class FileTest
3
- def self.exist?(file_name)
2
+ module FileTest
3
+ extend self
4
+
5
+ def exist?(file_name)
4
6
  File.exist?(file_name)
5
7
  end
6
8
 
7
- def self.directory?(file_name)
9
+ def directory?(file_name)
8
10
  File.directory?(file_name)
9
11
  end
10
12
 
11
- def self.file?(file_name)
13
+ def file?(file_name)
12
14
  File.file?(file_name)
13
15
  end
16
+
17
+ def writable?(file_name)
18
+ File.writable?(file_name)
19
+ end
14
20
  end
15
21
  end
@@ -16,8 +16,8 @@ module FakeFS
16
16
  list.each do |path|
17
17
  parent = path.split('/')
18
18
  parent.pop
19
- raise Errno::ENOENT, "No such file or directory - #{path}" unless parent.join == "" || parent.join == "." || FileSystem.find(parent.join('/'))
20
- raise Errno::EEXIST, "File exists - #{path}" if FileSystem.find(path)
19
+ raise Errno::ENOENT, path unless parent.join == "" || parent.join == "." || FileSystem.find(parent.join('/'))
20
+ raise Errno::EEXIST, path if FileSystem.find(path)
21
21
  FileSystem.add(path, FakeDir.new)
22
22
  end
23
23
  end
@@ -27,7 +27,7 @@ module FakeFS
27
27
  list.each do |l|
28
28
  parent = l.split('/')
29
29
  parent.pop
30
- raise Errno::ENOENT, "No such file or directory - #{l}" unless parent.join == "" || FileSystem.find(parent.join('/'))
30
+ raise Errno::ENOENT, l unless parent.join == "" || FileSystem.find(parent.join('/'))
31
31
  raise Errno::ENOENT, l unless FileSystem.find(l)
32
32
  raise Errno::ENOTEMPTY, l unless FileSystem.find(l).empty?
33
33
  rm(l)
@@ -67,11 +67,17 @@ module FakeFS
67
67
 
68
68
  alias_method :symlink, :ln_s
69
69
 
70
- def cp(src, dest)
70
+ def cp(src, dest, options={})
71
71
  if src.is_a?(Array) && !File.directory?(dest)
72
72
  raise Errno::ENOTDIR, dest
73
73
  end
74
74
 
75
+ # handle `verbose' flag
76
+ RealFileUtils.cp src, dest, options.merge(:noop => true)
77
+
78
+ # handle `noop' flag
79
+ return if options[:noop]
80
+
75
81
  Array(src).each do |src|
76
82
  dst_file = FileSystem.find(dest)
77
83
  src_file = FileSystem.find(src)
@@ -91,6 +97,8 @@ module FakeFS
91
97
  FileSystem.add(dest, src_file.entry.clone)
92
98
  end
93
99
  end
100
+
101
+ return nil
94
102
  end
95
103
 
96
104
  alias_method :copy, :cp
@@ -101,6 +109,12 @@ module FakeFS
101
109
  end
102
110
 
103
111
  def cp_r(src, dest, options={})
112
+ # handle `verbose' flag
113
+ RealFileUtils.cp_r src, dest, options.merge(:noop => true)
114
+
115
+ # handle `noop' flag
116
+ return if options[:noop]
117
+
104
118
  Array(src).each do |src|
105
119
  # This error sucks, but it conforms to the original Ruby
106
120
  # method.
@@ -128,19 +142,35 @@ module FakeFS
128
142
  FileSystem.add(dest, dir.entry.clone)
129
143
  end
130
144
  end
145
+
146
+ return nil
131
147
  end
132
148
 
133
149
  def mv(src, dest, options={})
150
+ # handle `verbose' flag
151
+ RealFileUtils.mv src, dest, options.merge(:noop => true)
152
+
153
+ # handle `noop' flag
154
+ return if options[:noop]
155
+
134
156
  Array(src).each do |path|
135
157
  if target = FileSystem.find(path)
136
158
  dest_path = File.directory?(dest) ? File.join(dest, File.basename(path)) : dest
137
- FileSystem.delete(dest_path)
138
- FileSystem.add(dest_path, target.entry.clone)
139
- FileSystem.delete(path)
159
+ if File.directory?(dest_path)
160
+ raise Errno::EEXIST, dest_path unless options[:force]
161
+ elsif File.directory?(File.dirname(dest_path))
162
+ FileSystem.delete(dest_path)
163
+ FileSystem.add(dest_path, target.entry.clone)
164
+ FileSystem.delete(path)
165
+ else
166
+ raise Errno::ENOENT, dest_path unless options[:force]
167
+ end
140
168
  else
141
169
  raise Errno::ENOENT, path
142
170
  end
143
171
  end
172
+
173
+ return nil
144
174
  end
145
175
 
146
176
  alias_method :move, :mv
@@ -1,6 +1,6 @@
1
1
  module FakeFS
2
2
  module Version
3
- VERSION = "0.4.3"
3
+ VERSION = "0.5.0"
4
4
 
5
5
  def self.to_s
6
6
  VERSION
@@ -0,0 +1,17 @@
1
+ require 'find'
2
+ require 'fakefs/spec_helpers'
3
+
4
+ RSpec.configure do |c|
5
+ c.mock_with(:rspec)
6
+ c.include(FakeFS::SpecHelpers, :fakefs => true)
7
+ end
8
+
9
+ if RUBY_VERSION >= '2.1'
10
+ describe 'Find.find', :fakefs => true do
11
+ it 'does not give an ArgumentError' do
12
+ FileUtils.mkdir_p('/tmp/foo')
13
+ found = Find.find('/tmp').to_a
14
+ expect(found).to eq(%w(/tmp /tmp/foo))
15
+ end
16
+ end
17
+ end
data/test/fakefs_test.rb CHANGED
@@ -68,6 +68,21 @@ class FakeFSTest < Test::Unit::TestCase
68
68
  end
69
69
  end
70
70
 
71
+ def test_raises_error_when_creating_a_new_dir_over_existing_file
72
+ File.open("file", "w") {|f| f << "This is a file, not a directory." }
73
+
74
+ assert_raise Errno::EEXIST do
75
+ FileUtils.mkdir_p("file/subdir")
76
+ end
77
+
78
+ FileUtils.mkdir("dir")
79
+ File.open("dir/subfile", "w") {|f| f << "This is a file inside a directory." }
80
+
81
+ assert_raise Errno::EEXIST do
82
+ FileUtils.mkdir_p("dir/subfile/subdir")
83
+ end
84
+ end
85
+
71
86
  def test_can_create_directories_with_mkpath
72
87
  FileUtils.mkpath("/path/to/dir")
73
88
  assert_kind_of FakeDir, FileSystem.fs['path']['to']['dir']
@@ -520,6 +535,14 @@ class FakeFSTest < Test::Unit::TestCase
520
535
  assert_equal 9, File.size(path)
521
536
  end
522
537
 
538
+ def test_can_get_correct_size_for_files_with_multibyte_characters
539
+ path = 'file.txt'
540
+ File.open(path, 'wb') do |f|
541
+ f << "Y\xC3\xA1da" # Yáda
542
+ end
543
+ assert_equal 5, File.size(path)
544
+ end
545
+
523
546
  def test_can_check_if_file_has_size?
524
547
  path = 'file.txt'
525
548
  File.open(path, 'w') do |f|
@@ -564,20 +587,22 @@ class FakeFSTest < Test::Unit::TestCase
564
587
  end
565
588
  end
566
589
 
567
- def test_can_set_mtime_on_new_file_touch_with_param
568
- time = Time.new(2002, 10, 31, 2, 2, 2, "+02:00")
569
- FileUtils.touch("foo.txt", :mtime => time)
590
+ if RUBY_VERSION >= "1.9"
591
+ def test_can_set_mtime_on_new_file_touch_with_param
592
+ time = Time.new(2002, 10, 31, 2, 2, 2, "+02:00")
593
+ FileUtils.touch("foo.txt", :mtime => time)
570
594
 
571
- assert_equal File.mtime("foo.txt"), time
572
- end
595
+ assert_equal File.mtime("foo.txt"), time
596
+ end
573
597
 
574
- def test_can_set_mtime_on_existing_file_touch_with_param
575
- FileUtils.touch("foo.txt")
598
+ def test_can_set_mtime_on_existing_file_touch_with_param
599
+ FileUtils.touch("foo.txt")
576
600
 
577
- time = Time.new(2002, 10, 31, 2, 2, 2, "+02:00")
578
- FileUtils.touch("foo.txt", :mtime => time)
601
+ time = Time.new(2002, 10, 31, 2, 2, 2, "+02:00")
602
+ FileUtils.touch("foo.txt", :mtime => time)
579
603
 
580
- assert_equal File.mtime("foo.txt"), time
604
+ assert_equal File.mtime("foo.txt"), time
605
+ end
581
606
  end
582
607
 
583
608
  def test_can_return_mtime_on_existing_file
@@ -981,11 +1006,32 @@ class FakeFSTest < Test::Unit::TestCase
981
1006
  end
982
1007
  end
983
1008
 
984
- def test_file_utils_cp_r_takes_ignored_options
1009
+ def test_file_utils_cp_allows_verbose_option
1010
+ File.open('foo', 'w') {|f| f << 'TEST' }
1011
+ assert_equal "cp foo bar\n", capture_stderr { FileUtils.cp 'foo', 'bar', :verbose => true }
1012
+ end
1013
+
1014
+ def test_file_utils_cp_allows_noop_option
1015
+ File.open('foo', 'w') {|f| f << 'TEST' }
1016
+ FileUtils.cp 'foo', 'bar', :noop => true
1017
+ assert !File.exist?('bar'), 'does not actually copy'
1018
+ end
1019
+
1020
+ def test_file_utils_cp_raises_on_invalid_option
1021
+ assert_raises ArgumentError do
1022
+ FileUtils.cp 'foo', 'bar', :whatisthis => "I don't know"
1023
+ end
1024
+ end
1025
+
1026
+ def test_file_utils_cp_r_allows_verbose_option
985
1027
  FileUtils.touch "/foo"
1028
+ assert_equal "cp -r /foo /bar\n", capture_stderr { FileUtils.cp_r '/foo', '/bar', :verbose => true }
1029
+ end
986
1030
 
987
- FileUtils.cp_r '/foo', '/bar', :verbose => true
988
- assert_equal Dir.glob("/*").sort, ["/bar", "/foo"]
1031
+ def test_file_utils_cp_r_allows_noop_option
1032
+ FileUtils.touch "/foo"
1033
+ FileUtils.cp_r '/foo', '/bar', :noop => true
1034
+ assert !File.exist?('/bar'), 'does not actually copy'
989
1035
  end
990
1036
 
991
1037
  def test_dir_glob_handles_root
@@ -1085,8 +1131,17 @@ class FakeFSTest < Test::Unit::TestCase
1085
1131
  assert_equal 1, fp.pos
1086
1132
  end
1087
1133
 
1134
+ OMITTED_FILE_METHODS = [
1135
+ # omit methods from io/console
1136
+ :raw, :raw!, :cooked, :cooked!,
1137
+ :echo?, :echo=, :noecho,
1138
+ :winsize, :winsize=,
1139
+ :getch,
1140
+ :iflush, :ioflush, :oflush
1141
+ ]
1142
+
1088
1143
  def test_every_method_in_file_is_in_fake_fs_file
1089
- RealFile.instance_methods.each do |method_name|
1144
+ (RealFile.instance_methods - OMITTED_FILE_METHODS).each do |method_name|
1090
1145
  assert File.instance_methods.include?(method_name), "#{method_name} method is not available in File :("
1091
1146
  end
1092
1147
  end
@@ -1156,6 +1211,19 @@ class FakeFSTest < Test::Unit::TestCase
1156
1211
  assert_equal ['/path/me/foobar'], Dir.glob('/path/me/*').sort
1157
1212
  end
1158
1213
 
1214
+ def test_chdir_should_be_nestable_with_absolute_paths
1215
+ FileUtils.mkdir_p '/path/me'
1216
+ Dir.chdir '/path' do
1217
+ File.open('foo', 'w') { |f| f.write 'foo'}
1218
+ Dir.chdir '/path/me' do
1219
+ File.open('foobar', 'w') { |f| f.write 'foo'}
1220
+ end
1221
+ end
1222
+
1223
+ assert_equal ['/path/foo','/path/me'], Dir.glob('/path/*').sort
1224
+ assert_equal ['/path/me/foobar'], Dir.glob('/path/me/*').sort
1225
+ end
1226
+
1159
1227
  def test_chdir_should_flop_over_and_die_if_the_dir_doesnt_exist
1160
1228
  assert_raise(Errno::ENOENT) do
1161
1229
  Dir.chdir('/nope') do
@@ -1185,7 +1253,7 @@ class FakeFSTest < Test::Unit::TestCase
1185
1253
  rescue Errno::ENOENT
1186
1254
  end
1187
1255
 
1188
- assert_equal ['/path'], FileSystem.dir_levels
1256
+ assert_equal ['/', '/path'], FileSystem.dir_levels
1189
1257
  end
1190
1258
 
1191
1259
  assert_equal(['/path/foo', '/path/foobar'], Dir.glob('/path/*').sort)
@@ -1221,6 +1289,20 @@ class FakeFSTest < Test::Unit::TestCase
1221
1289
  assert_equal '/path/subdir', Dir.getwd
1222
1290
  end
1223
1291
 
1292
+ def test_current_dir_reflected_by_expand_path
1293
+ FileUtils.mkdir_p '/path'
1294
+ Dir.chdir '/path'
1295
+
1296
+ assert_equal '/path', File.expand_path('.')
1297
+ assert_equal '/path/foo', File.expand_path('foo')
1298
+
1299
+ FileUtils.mkdir_p 'subdir'
1300
+ Dir.chdir 'subdir'
1301
+
1302
+ assert_equal '/path/subdir', File.expand_path('.')
1303
+ assert_equal '/path/subdir/foo', File.expand_path('foo')
1304
+ end
1305
+
1224
1306
  def test_file_open_defaults_to_read
1225
1307
  File.open('foo','w') { |f| f.write 'bar' }
1226
1308
  assert_equal 'bar', File.open('foo') { |f| f.read }
@@ -1277,6 +1359,46 @@ class FakeFSTest < Test::Unit::TestCase
1277
1359
  assert_equal('binky', File.open('destdir/baz') {|f| f.read })
1278
1360
  end
1279
1361
 
1362
+ def test_mv_accepts_verbose_option
1363
+ FileUtils.touch 'foo'
1364
+ assert_equal "mv foo bar\n", capture_stderr { FileUtils.mv 'foo', 'bar', :verbose => true }
1365
+ end
1366
+
1367
+ def test_mv_accepts_noop_option
1368
+ FileUtils.touch 'foo'
1369
+ FileUtils.mv 'foo', 'bar', :noop => true
1370
+ assert File.exist?('foo'), 'does not remove src'
1371
+ assert !File.exist?('bar'), 'does not create target'
1372
+ end
1373
+
1374
+ def test_mv_raises_when_moving_file_onto_directory
1375
+ FileUtils.mkdir_p 'dir/stuff'
1376
+ FileUtils.touch 'stuff'
1377
+ assert_raises Errno::EEXIST do
1378
+ FileUtils.mv 'stuff', 'dir'
1379
+ end
1380
+ end
1381
+
1382
+ def test_mv_raises_when_moving_to_non_existent_directory
1383
+ FileUtils.touch 'stuff'
1384
+ assert_raises Errno::ENOENT do
1385
+ FileUtils.mv 'stuff', '/this/path/is/not/here'
1386
+ end
1387
+ end
1388
+
1389
+ def test_mv_ignores_failures_when_using_force
1390
+ FileUtils.mkdir_p 'dir/stuff'
1391
+ FileUtils.touch %w[stuff other]
1392
+ FileUtils.mv %w[stuff other], 'dir', :force => true
1393
+ assert File.exist?('stuff'), 'failed move remains where it was'
1394
+ assert File.exist?('dir/other'), 'successful one is moved'
1395
+ assert !File.exist?('other'), 'successful one is moved'
1396
+
1397
+ FileUtils.mv 'stuff', '/this/path/is/not/here', :force => true
1398
+ assert File.exist?('stuff'), 'failed move remains where it was'
1399
+ assert !File.exist?('/this/path/is/not/here'), 'nothing is created for a failed move'
1400
+ end
1401
+
1280
1402
  def test_cp_actually_works
1281
1403
  File.open('foo', 'w') {|f| f.write 'bar' }
1282
1404
  FileUtils.cp('foo', 'baz')
@@ -1477,6 +1599,48 @@ class FakeFSTest < Test::Unit::TestCase
1477
1599
  act_on_real_fs { RealFileUtils.rm_rf(here('subdir')) }
1478
1600
  end
1479
1601
 
1602
+ def test_clone_with_file_symlinks
1603
+ original = here('subdir/test-file')
1604
+ symlink = here('subdir/test-file.txt')
1605
+
1606
+ act_on_real_fs do
1607
+ RealDir.mkdir(RealFile.dirname(original))
1608
+ RealFile.open(original, 'w') {|f| f << 'stuff' }
1609
+ RealFileUtils.ln_s original, symlink
1610
+ assert RealFile.symlink?(symlink), 'real symlink is in place'
1611
+ end
1612
+
1613
+ assert !File.exists?(original), 'file does not already exist'
1614
+
1615
+ FileSystem.clone(File.dirname(original))
1616
+ assert File.symlink?(symlink), 'symlinks are cloned as symlinks'
1617
+ assert_equal 'stuff', File.read(symlink)
1618
+ ensure
1619
+ act_on_real_fs { RealFileUtils.rm_rf File.dirname(original) }
1620
+ end
1621
+
1622
+ def test_clone_with_dir_symlinks
1623
+ original = here('subdir/dir')
1624
+ symlink = here('subdir/dir.link')
1625
+ original_file = File.join(original, 'test-file')
1626
+ symlink_file = File.join(symlink, 'test-file')
1627
+
1628
+ act_on_real_fs do
1629
+ RealFileUtils.mkdir_p(original)
1630
+ RealFile.open(original_file, 'w') {|f| f << 'stuff' }
1631
+ RealFileUtils.ln_s original, symlink
1632
+ assert RealFile.symlink?(symlink), 'real symlink is in place'
1633
+ end
1634
+
1635
+ assert !File.exists?(original_file), 'file does not already exist'
1636
+
1637
+ FileSystem.clone(File.dirname(original))
1638
+ assert File.symlink?(symlink), 'symlinks are cloned as symlinks'
1639
+ assert_equal 'stuff', File.read(symlink_file)
1640
+ ensure
1641
+ act_on_real_fs { RealFileUtils.rm_rf File.dirname(original) }
1642
+ end
1643
+
1480
1644
  def test_putting_a_dot_at_end_copies_the_contents
1481
1645
  FileUtils.mkdir_p 'subdir'
1482
1646
  Dir.chdir('subdir') { File.open('foo', 'w') { |f| f.write 'footext' } }
@@ -1774,6 +1938,26 @@ class FakeFSTest < Test::Unit::TestCase
1774
1938
  test.each { |t| assert yielded.include?(t) }
1775
1939
  end
1776
1940
 
1941
+ def test_directory_foreach_relative_paths
1942
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1943
+
1944
+ FileUtils.mkdir_p('/this/path/should/be/here')
1945
+
1946
+ test.each do |f|
1947
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1948
+ end
1949
+
1950
+ yielded = []
1951
+ Dir.chdir '/this/path/should/be' do
1952
+ Dir.foreach('here') do |dir|
1953
+ yielded << dir
1954
+ end
1955
+ end
1956
+
1957
+ assert yielded.size == test.size, 'wrong number of files yielded'
1958
+ test.each { |t| assert yielded.include?(t), "#{t} was not included in #{yielded.inspect}" }
1959
+ end
1960
+
1777
1961
  def test_directory_mkdir
1778
1962
  Dir.mkdir('/path')
1779
1963
  assert File.exists?('/path')
@@ -2129,6 +2313,16 @@ class FakeFSTest < Test::Unit::TestCase
2129
2313
  assert !FileTest.file?('/path/to/somedir')
2130
2314
  end
2131
2315
 
2316
+ def test_filetest_writable_returns_correct_values
2317
+ assert !FileTest.writable?('not-here.txt'), 'missing files are not writable'
2318
+
2319
+ FileUtils.touch 'here.txt'
2320
+ assert FileTest.writable?('here.txt'), 'existing files are writable'
2321
+
2322
+ FileUtils.mkdir 'dir'
2323
+ assert FileTest.writable?('dir'), 'directories are writable'
2324
+ end
2325
+
2132
2326
  def test_pathname_exists_returns_correct_value
2133
2327
  FileUtils.touch "foo"
2134
2328
  assert Pathname.new("foo").exist?
@@ -2256,10 +2450,10 @@ class FakeFSTest < Test::Unit::TestCase
2256
2450
 
2257
2451
  def test_file_umask
2258
2452
  assert_equal File.umask, RealFile.umask
2259
- File.umask(1234)
2453
+ File.umask(0740)
2260
2454
 
2261
2455
  assert_equal File.umask, RealFile.umask
2262
- assert_equal File.umask, 1234
2456
+ assert_equal File.umask, 0740
2263
2457
  end
2264
2458
 
2265
2459
  def test_file_stat_comparable
@@ -2388,5 +2582,15 @@ class FakeFSTest < Test::Unit::TestCase
2388
2582
  File.write('foo', 'bar', 3)
2389
2583
  assert_equal File.read('foo'), 'foobar'
2390
2584
  end
2585
+
2586
+ def test_can_read_binary_data_in_binary_mode
2587
+ File.open('foo', 'wb') { |f| f << "\u0000\u0000\u0000\u0003\u0000\u0003\u0000\xA3\u0000\u0000\u0000y\u0000\u0000\u0000\u0000\u0000" }
2588
+ assert_equal "\x00\x00\x00\x03\x00\x03\x00\xA3\x00\x00\x00y\x00\x00\x00\x00\x00", File.open("foo", "rb").read
2589
+ end
2590
+
2591
+ def test_can_read_binary_data_in_non_binary_mode
2592
+ File.open('foo_non_bin', 'wb') { |f| f << "\u0000\u0000\u0000\u0003\u0000\u0003\u0000\xA3\u0000\u0000\u0000y\u0000\u0000\u0000\u0000\u0000" }
2593
+ assert_equal "\x00\x00\x00\x03\x00\x03\x00\xA3\x00\x00\x00y\x00\x00\x00\x00\x00".force_encoding('UTF-8'), File.open("foo_non_bin", "r").read
2594
+ end
2391
2595
  end
2392
2596
  end