fakefs 0.4.3 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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