virtfs 0.0.1

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.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +8 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +154 -0
  8. data/Rakefile +5 -0
  9. data/lib/virtfs-nativefs-thick.rb +1 -0
  10. data/lib/virtfs-nativefs-thin.rb +1 -0
  11. data/lib/virtfs.rb +38 -0
  12. data/lib/virtfs/activation.rb +97 -0
  13. data/lib/virtfs/block_io.rb +140 -0
  14. data/lib/virtfs/byte_range.rb +71 -0
  15. data/lib/virtfs/context.rb +300 -0
  16. data/lib/virtfs/context_manager.rb +175 -0
  17. data/lib/virtfs/context_switch_class_methods.rb +96 -0
  18. data/lib/virtfs/delegate_module.rb +40 -0
  19. data/lib/virtfs/dir_instance_delegate.rb +3 -0
  20. data/lib/virtfs/exception.rb +13 -0
  21. data/lib/virtfs/file_instance_delegate.rb +3 -0
  22. data/lib/virtfs/file_modes_and_options.rb +293 -0
  23. data/lib/virtfs/find_class_methods.rb +106 -0
  24. data/lib/virtfs/io_buffer.rb +133 -0
  25. data/lib/virtfs/io_instance_delegate.rb +3 -0
  26. data/lib/virtfs/kernel.rb +146 -0
  27. data/lib/virtfs/nativefs/thick.rb +30 -0
  28. data/lib/virtfs/nativefs/thick/dir_class_methods.rb +38 -0
  29. data/lib/virtfs/nativefs/thick/file_class_methods.rb +178 -0
  30. data/lib/virtfs/nativefs/thin.rb +32 -0
  31. data/lib/virtfs/nativefs/thin/dir.rb +30 -0
  32. data/lib/virtfs/nativefs/thin/dir_class_methods.rb +41 -0
  33. data/lib/virtfs/nativefs/thin/file.rb +112 -0
  34. data/lib/virtfs/nativefs/thin/file_class_methods.rb +181 -0
  35. data/lib/virtfs/protofs/protofs.rb +7 -0
  36. data/lib/virtfs/protofs/protofs_base.rb +12 -0
  37. data/lib/virtfs/protofs/protofs_dir.rb +13 -0
  38. data/lib/virtfs/protofs/protofs_dir_class.rb +31 -0
  39. data/lib/virtfs/protofs/protofs_file.rb +27 -0
  40. data/lib/virtfs/protofs/protofs_file_class.rb +136 -0
  41. data/lib/virtfs/stat.rb +100 -0
  42. data/lib/virtfs/thin_dir_delegator.rb +79 -0
  43. data/lib/virtfs/thin_file_delegator.rb +77 -0
  44. data/lib/virtfs/thin_io_delegator_methods.rb +301 -0
  45. data/lib/virtfs/thin_io_delegator_methods_bufferio.rb +337 -0
  46. data/lib/virtfs/v_dir.rb +238 -0
  47. data/lib/virtfs/v_file.rb +480 -0
  48. data/lib/virtfs/v_io.rb +243 -0
  49. data/lib/virtfs/v_pathname.rb +128 -0
  50. data/lib/virtfs/version.rb +3 -0
  51. data/spec/activate_spec.rb +202 -0
  52. data/spec/chroot_spec.rb +120 -0
  53. data/spec/context_manager_class_spec.rb +246 -0
  54. data/spec/context_manager_instance_spec.rb +255 -0
  55. data/spec/context_spec.rb +335 -0
  56. data/spec/data/UTF-16LE-data.txt +0 -0
  57. data/spec/data/UTF-8-data.txt +212 -0
  58. data/spec/dir_class_spec.rb +506 -0
  59. data/spec/dir_instance_spec.rb +208 -0
  60. data/spec/file_class_spec.rb +2106 -0
  61. data/spec/file_instance_spec.rb +154 -0
  62. data/spec/file_modes_and_options_spec.rb +1556 -0
  63. data/spec/find_spec.rb +142 -0
  64. data/spec/io_bufferio_size_shared_examples.rb +371 -0
  65. data/spec/io_bufferio_size_spec.rb +861 -0
  66. data/spec/io_bufferio_spec.rb +801 -0
  67. data/spec/io_class_spec.rb +145 -0
  68. data/spec/io_instance_spec.rb +516 -0
  69. data/spec/kernel_spec.rb +285 -0
  70. data/spec/mount_spec.rb +186 -0
  71. data/spec/nativefs_local_root_spec.rb +132 -0
  72. data/spec/path_spec.rb +39 -0
  73. data/spec/spec_helper.rb +126 -0
  74. data/tasks/rspec.rake +3 -0
  75. data/tasks/yard.rake +7 -0
  76. data/test/UTF-8-demo.txt +212 -0
  77. data/test/bench.rb +18 -0
  78. data/test/bio_internal_test.rb +45 -0
  79. data/test/delegate_io.rb +31 -0
  80. data/test/delegate_module.rb +62 -0
  81. data/test/encode_test.rb +42 -0
  82. data/test/enoent_test.rb +30 -0
  83. data/test/namespace_test.rb +42 -0
  84. data/test/read_block_valid_encoding.rb +44 -0
  85. data/test/read_test.rb +78 -0
  86. data/test/stream_readers.rb +46 -0
  87. data/test/utf-16-demo.txt +0 -0
  88. data/test/utf8_to_utf16.rb +77 -0
  89. data/test/wrapper_test.rb +34 -0
  90. data/virtfs.gemspec +29 -0
  91. metadata +230 -0
@@ -0,0 +1,208 @@
1
+ require 'spec_helper'
2
+
3
+ describe VirtFS::VDir, "(#{$fs_interface} interface)" do
4
+ before(:all) do
5
+ @full_path = File.expand_path(__FILE__)
6
+ @rel_path = File.basename(@full_path)
7
+ @spec_dir = File.dirname(@full_path)
8
+ @this_dir = VfsRealDir.getwd
9
+ end
10
+
11
+ before(:each) do
12
+ reset_context
13
+ @root = File::SEPARATOR
14
+
15
+ @native_fs = nativefs_class.new
16
+ VirtFS.mount(@native_fs, @root)
17
+ end
18
+
19
+ describe "#close" do
20
+ it "should return nil" do
21
+ dir = VirtFS::VDir.new(@spec_dir)
22
+ expect(dir.close).to be_nil
23
+ end
24
+
25
+ it "should cause subsequent access to raise IOError: closed directory" do
26
+ dir = VirtFS::VDir.new(@spec_dir)
27
+ dir.close
28
+
29
+ expect { dir.close }.to raise_error(IOError, "closed directory")
30
+ expect { dir.each.to_a }.to raise_error(IOError, "closed directory")
31
+ expect { dir.pos = 0 }.to raise_error(IOError, "closed directory")
32
+ expect { dir.read }.to raise_error(IOError, "closed directory")
33
+ expect { dir.rewind }.to raise_error(IOError, "closed directory")
34
+ expect { dir.seek(0) }.to raise_error(IOError, "closed directory")
35
+ expect { dir.tell }.to raise_error(IOError, "closed directory")
36
+ end
37
+ end
38
+
39
+ describe "#each" do
40
+ it "should return an enum when no block is given" do
41
+ VirtFS::VDir.open(@spec_dir) { |dir| expect(dir.each).to be_kind_of(Enumerator) }
42
+ end
43
+
44
+ it "should return the directory object when block is given" do
45
+ VirtFS::VDir.open(@spec_dir) do |dir|
46
+ expect(dir.each { |f| true }).to eq(dir)
47
+ end
48
+ end
49
+
50
+ it "should enumerate the same files as the standard Dir method" do
51
+ VirtFS::VDir.open(@spec_dir) do |dir1|
52
+ VfsRealDir.open(@spec_dir) do |dir2|
53
+ expect(dir1.each.to_a).to match_array(dir2.each.to_a)
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ describe "#path #to_path" do
60
+ it "should return full path when opened with full path" do
61
+ VirtFS::VDir.open(@spec_dir) { |dir| expect(dir.path).to eq(@spec_dir) }
62
+ end
63
+
64
+ it "should return relative path when opened with relative path" do
65
+ parent, target_dir = VfsRealFile.split(@spec_dir)
66
+ VirtFS::VDir.chdir(parent)
67
+ VirtFS::VDir.open(target_dir) { |dir| expect(dir.path).to eq(target_dir) }
68
+ end
69
+ end
70
+
71
+ describe "#pos #tell" do
72
+ it "should return the same value when the current position hasn't changed" do
73
+ VirtFS::VDir.open(@spec_dir) do |dir|
74
+ expect(dir.pos).to eq(dir.pos)
75
+ end
76
+ end
77
+
78
+ it "should return a different value when the current position has changed" do
79
+ VirtFS::VDir.open(@spec_dir) do |dir|
80
+ pos1 = dir.pos
81
+ dir.read
82
+ expect(dir.pos).to_not eq(pos1)
83
+ end
84
+ end
85
+ end
86
+
87
+ describe "#pos=" do
88
+ it "should return the passed value" do
89
+ VirtFS::VDir.open(@spec_dir) do |dir|
90
+ (0..4).each { |p| expect(dir.pos = p).to eq(p) }
91
+ end
92
+ end
93
+
94
+ it "should change the position when given a value previously returned by #tell or #pos" do
95
+ VirtFS::VDir.open(@spec_dir) do |dir|
96
+ pos0 = dir.pos
97
+ dir.read
98
+ pos1 = dir.pos
99
+ expect(pos0).to_not eq(pos1)
100
+ expect(dir.pos).to eq(pos1)
101
+ dir.pos = pos0
102
+ expect(dir.pos).to eq(pos0)
103
+ end
104
+ end
105
+
106
+ #
107
+ # NOTE: This test fails when run under Fusion shared folders,
108
+ # but only for the thick interface. Passes on Travis.
109
+ #
110
+ it "should change the position for subsequent reads" do
111
+ reads_by_pos = {}
112
+ VirtFS::VDir.open(@spec_dir) do |dir|
113
+ reads_by_pos[dir.pos] = dir.read
114
+ dir.read
115
+ dir.read
116
+ reads_by_pos[dir.pos] = dir.read
117
+ dir.read
118
+ reads_by_pos[dir.pos] = dir.read
119
+
120
+ reads_by_pos.each do |p, r|
121
+ dir.pos = p
122
+ expect(dir.read).to eq(r)
123
+ end
124
+ end
125
+ end
126
+ end
127
+
128
+ describe "#read" do
129
+ it "should read successive directory entries, returning the same files as Dir#each" do
130
+ dir_entries = []
131
+ VirtFS::VDir.open(@spec_dir) do |dir|
132
+ while de = dir.read
133
+ dir_entries << de
134
+ end
135
+ end
136
+
137
+ VfsRealDir.open(@spec_dir) do |dir|
138
+ expect(dir.each.to_a).to match_array(dir_entries)
139
+ end
140
+ end
141
+
142
+ it "should return nil when at end of directory" do
143
+ VirtFS::VDir.open(@spec_dir) do |dir|
144
+ while (de = dir.read); end
145
+ expect(dir.read).to be_nil
146
+ end
147
+ end
148
+ end
149
+
150
+ describe "#rewind" do
151
+ it "should return the directory object" do
152
+ VirtFS::VDir.open(@spec_dir) do |dir|
153
+ expect(dir.rewind).to eq(dir)
154
+ end
155
+ end
156
+
157
+ it "should reset the current position so reading starts at the beginning" do
158
+ VirtFS::VDir.open(@spec_dir) do |dir|
159
+ first_entry = dir.read
160
+ while (de = dir.read); end
161
+ expect(dir.read).to be_nil
162
+ dir.rewind
163
+ expect(dir.read).to eq(first_entry)
164
+ end
165
+ end
166
+ end
167
+
168
+ describe "#seek" do
169
+ it "should return the directory object" do
170
+ VirtFS::VDir.open(@spec_dir) do |dir|
171
+ (0..4).each { |p| expect(dir.seek(p)).to eq(dir) }
172
+ end
173
+ end
174
+
175
+ it "should change the position when given a value previously returned by #tell or #pos" do
176
+ VirtFS::VDir.open(@spec_dir) do |dir|
177
+ pos0 = dir.tell
178
+ dir.read
179
+ pos1 = dir.tell
180
+ expect(pos0).to_not eq(pos1)
181
+ expect(dir.tell).to eq(pos1)
182
+ dir.seek(pos0)
183
+ expect(dir.tell).to eq(pos0)
184
+ end
185
+ end
186
+
187
+ #
188
+ # NOTE: This test fails when run under Fusion shared folders,
189
+ # but only for the thick interface. Passes on Travis.
190
+ #
191
+ it "should change the position for subsequent reads" do
192
+ reads_by_pos = {}
193
+ VirtFS::VDir.open(@spec_dir) do |dir|
194
+ reads_by_pos[dir.tell] = dir.read
195
+ dir.read
196
+ dir.read
197
+ reads_by_pos[dir.tell] = dir.read
198
+ dir.read
199
+ reads_by_pos[dir.tell] = dir.read
200
+
201
+ reads_by_pos.each do |p, r|
202
+ dir.seek(p)
203
+ expect(dir.read).to eq(r)
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,2106 @@
1
+ require 'spec_helper'
2
+
3
+ #
4
+ # Class methods.
5
+ #
6
+ describe VirtFS::VFile, "(#{$fs_interface} interface)" do
7
+ before(:all) do
8
+ @spec_name = VfsRealFile.basename(__FILE__, ".rb")
9
+ @temp_prefix = "#{@spec_name}-"
10
+ @this_dir = VfsRealDir.getwd
11
+ @root = File::SEPARATOR
12
+ @slink_path = temp_name(@temp_prefix, ".symlink")
13
+ end
14
+
15
+ before(:each) do
16
+ reset_context
17
+ @ext = ".rb"
18
+ @temp_file = Tempfile.new([@temp_prefix, @ext])
19
+ @data1 = "0123456789" * 4
20
+ @temp_file.write(@data1)
21
+ @temp_file.close
22
+ @full_path = @temp_file.path
23
+ @rel_path = File.basename(@full_path)
24
+ @parent_dir = File.dirname(@full_path)
25
+ VfsRealFile.chown(Process.uid, Process.gid, @full_path)
26
+
27
+ @ext2 = ".c"
28
+ @temp_file2 = Tempfile.new([@temp_prefix, @ext2])
29
+ @temp_file2.close
30
+ @full_path2 = @temp_file2.path
31
+ @rel_path2 = File.basename(@full_path2)
32
+ @parent_dir2 = File.dirname(@full_path2)
33
+ end
34
+
35
+ after(:each) do
36
+ @temp_file.delete
37
+ @temp_file2.delete
38
+ end
39
+
40
+ describe ".absolute_path" do
41
+ it "should return the same path as the standard File.absolute_path, when given a dirstring" do
42
+ expect(
43
+ VirtFS::VFile.absolute_path(@rel_path, @parent_dir)
44
+ ).to eq(
45
+ VfsRealFile.absolute_path(@rel_path, @parent_dir)
46
+ )
47
+ end
48
+
49
+ it "should return the same path as the standard File.absolute_path, when using pwd" do
50
+ VfsRealDir.chdir(@parent_dir) do
51
+ VirtFS.cwd = VfsRealDir.getwd
52
+ expect(VirtFS::VFile.absolute_path(@rel_path)).to eq(VfsRealFile.absolute_path(@rel_path))
53
+ end
54
+ end
55
+ end
56
+
57
+ describe ".atime" do
58
+ context "with no filesystems mounted" do
59
+ it "should raise Errno::ENOENT when given a nonexistent file" do
60
+ expect do
61
+ VirtFS::VFile.atime("nonexistent_file")
62
+ end.to raise_error(
63
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
64
+ )
65
+ end
66
+
67
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
68
+ expect do
69
+ VirtFS::VFile.atime(@full_path)
70
+ end.to raise_error(
71
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
72
+ )
73
+ end
74
+ end
75
+
76
+ context "with FS mounted on '/'" do
77
+ before(:each) do
78
+ @native_fs = nativefs_class.new
79
+ VirtFS.mount(@native_fs, @root)
80
+ end
81
+
82
+ it "should raise Errno::ENOENT when given a nonexistent file" do
83
+ expect do
84
+ VirtFS::VFile.atime("nonexistent_file")
85
+ end.to raise_error(
86
+ Errno::ENOENT, /No such file or directory/
87
+ )
88
+ end
89
+
90
+ it "should return the same value as the standard File.atime, when given a full path" do
91
+ expect(VirtFS::VFile.atime(@full_path)).to eq(VfsRealFile.atime(@full_path))
92
+ end
93
+
94
+ it "should return the same value as the standard File.atime, when given relative path" do
95
+ VfsRealDir.chdir(@parent_dir) do
96
+ VirtFS.dir_chdir(@parent_dir)
97
+ expect(VirtFS::VFile.atime(@rel_path)).to eq(VfsRealFile.atime(@rel_path))
98
+ end
99
+ end
100
+ end
101
+ end
102
+
103
+ describe ".basename" do
104
+ it "should return the same value as the standard File.basename" do
105
+ expect(VirtFS::VFile.basename(@full_path)).to eq(VfsRealFile.basename(@full_path))
106
+ end
107
+ end
108
+
109
+ describe ".blockdev?" do
110
+ context "with no filesystems mounted" do
111
+ it "should raise Errno::ENOENT when given a nonexistent file" do
112
+ expect do
113
+ VirtFS::VFile.blockdev?("nonexistent_file")
114
+ end.to raise_error(
115
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
116
+ )
117
+ end
118
+
119
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
120
+ expect do
121
+ VirtFS::VFile.blockdev?(@full_path)
122
+ end.to raise_error(
123
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
124
+ )
125
+ end
126
+ end
127
+
128
+ context "with FS mounted on '/'" do
129
+ before(:each) do
130
+ @native_fs = nativefs_class.new
131
+ VirtFS.mount(@native_fs, @root)
132
+ end
133
+
134
+ it "should return false when given a nonexistent file" do
135
+ expect(VirtFS::VFile.blockdev?("nonexistent_file")).to be false
136
+ end
137
+
138
+ it "should return false when given a non-blockdev file" do
139
+ expect(VirtFS::VFile.blockdev?(@full_path)).to be false
140
+ end
141
+
142
+ #
143
+ # The block_dev_file method fails to find a block device
144
+ # file in the Travis environment - disabling this test.
145
+ #
146
+ # it "should return true when given a blockdev file" do
147
+ # expect(bdev = block_dev_file).to_not eq(nil)
148
+ # expect(VirtFS::VFile.blockdev?(bdev)).to be true
149
+ # end
150
+ end
151
+ end
152
+
153
+ describe ".chardev?" do
154
+ context "with no filesystems mounted" do
155
+ it "should raise Errno::ENOENT when given a nonexistent file" do
156
+ expect do
157
+ VirtFS::VFile.chardev?("nonexistent_file")
158
+ end.to raise_error(
159
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
160
+ )
161
+ end
162
+
163
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
164
+ expect do
165
+ VirtFS::VFile.chardev?(@full_path)
166
+ end.to raise_error(
167
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
168
+ )
169
+ end
170
+ end
171
+
172
+ context "with FS mounted on '/'" do
173
+ before(:each) do
174
+ @native_fs = nativefs_class.new
175
+ VirtFS.mount(@native_fs, @root)
176
+ end
177
+
178
+ it "should return false when given a nonexistent file" do
179
+ expect(VirtFS::VFile.chardev?("nonexistent_file")).to be false
180
+ end
181
+
182
+ it "should return false when given a non-chardev file" do
183
+ expect(VirtFS::VFile.chardev?(@full_path)).to be false
184
+ end
185
+
186
+ it "should return true when given a chardev file" do
187
+ expect(cdev = char_dev_file).to_not eq(nil)
188
+ expect(VirtFS::VFile.chardev?(cdev)).to be true
189
+ end
190
+ end
191
+ end
192
+
193
+ describe ".chmod" do
194
+ context "with no filesystems mounted" do
195
+ it "should raise Errno::ENOENT when given a nonexistent file" do
196
+ expect do
197
+ VirtFS::VFile.chmod(0755, "nonexistent_file")
198
+ end.to raise_error(
199
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
200
+ )
201
+ end
202
+
203
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
204
+ expect do
205
+ VirtFS::VFile.chmod(0755, @full_path)
206
+ end.to raise_error(
207
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
208
+ )
209
+ end
210
+ end
211
+
212
+ context "with FS mounted on '/'" do
213
+ before(:each) do
214
+ @native_fs = nativefs_class.new
215
+ VirtFS.mount(@native_fs, @root)
216
+ end
217
+
218
+ it "should raise Errno::ENOENT when given a nonexistent file" do
219
+ expect do
220
+ VirtFS::VFile.chmod(0755, "nonexistent_file")
221
+ end.to raise_error(
222
+ Errno::ENOENT, /No such file or directory/
223
+ )
224
+ end
225
+
226
+ it "should return the number of files processed" do
227
+ expect(VirtFS::VFile.chmod(0777, @full_path)).to eq(1)
228
+ expect(VirtFS::VFile.chmod(0777, @full_path, @full_path2)).to eq(2)
229
+ end
230
+
231
+ it "should change the permission bits on an existing file" do
232
+ target_mode = 0755
233
+ expect(VfsRealFile.stat(@full_path).mode & 0777).to_not eq(target_mode)
234
+ VirtFS::VFile.chmod(target_mode, @full_path)
235
+ expect(VfsRealFile.stat(@full_path).mode & 0777).to eq(target_mode)
236
+ end
237
+ end
238
+ end
239
+
240
+ describe ".chown" do
241
+ before(:each) do
242
+ stat = VfsRealFile.stat(@full_path)
243
+ @owner = stat.uid
244
+ @group = stat.gid
245
+ end
246
+
247
+ context "with no filesystems mounted" do
248
+ it "should raise Errno::ENOENT when given a nonexistent file" do
249
+ expect do
250
+ VirtFS::VFile.chown(@owner, @group, "nonexistent_file")
251
+ end.to raise_error(
252
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
253
+ )
254
+ end
255
+
256
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
257
+ expect do
258
+ VirtFS::VFile.chown(@owner, @group, @full_path)
259
+ end.to raise_error(
260
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
261
+ )
262
+ end
263
+ end
264
+
265
+ context "with FS mounted on '/'" do
266
+ before(:each) do
267
+ @native_fs = nativefs_class.new
268
+ VirtFS.mount(@native_fs, @root)
269
+ end
270
+
271
+ it "should raise Errno::ENOENT when given a nonexistent file" do
272
+ expect do
273
+ VirtFS::VFile.chown(@owner, @group, "nonexistent_file")
274
+ end.to raise_error(
275
+ Errno::ENOENT, /No such file or directory/
276
+ )
277
+ end
278
+
279
+ it "should return the number of files processed" do
280
+ expect(VirtFS::VFile.chown(@owner, @group, @full_path)).to eq(1)
281
+ expect(VirtFS::VFile.chown(@owner, @group, @full_path, @full_path2)).to eq(2)
282
+ end
283
+ end
284
+ end
285
+
286
+ describe ".ctime" do
287
+ context "with no filesystems mounted" do
288
+ it "should raise Errno::ENOENT when given a nonexistent file" do
289
+ expect do
290
+ VirtFS::VFile.ctime("nonexistent_file")
291
+ end.to raise_error(
292
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
293
+ )
294
+ end
295
+
296
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
297
+ expect do
298
+ VirtFS::VFile.ctime(@full_path)
299
+ end.to raise_error(
300
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
301
+ )
302
+ end
303
+ end
304
+
305
+ context "with FS mounted on '/'" do
306
+ before(:each) do
307
+ @native_fs = nativefs_class.new
308
+ VirtFS.mount(@native_fs, @root)
309
+ end
310
+
311
+ it "should raise Errno::ENOENT when given a nonexistent file" do
312
+ expect do
313
+ VirtFS::VFile.ctime("nonexistent_file")
314
+ end.to raise_error(
315
+ Errno::ENOENT, /No such file or directory/
316
+ )
317
+ end
318
+
319
+ it "should return the same value as the standard File.ctime, when given a full path" do
320
+ expect(VirtFS::VFile.ctime(@full_path)).to eq(VfsRealFile.ctime(@full_path))
321
+ end
322
+
323
+ it "should return the same value as the standard File.ctime, when given relative path" do
324
+ VfsRealDir.chdir(@parent_dir) do
325
+ VirtFS.dir_chdir(@parent_dir)
326
+ expect(VirtFS::VFile.ctime(@rel_path)).to eq(VfsRealFile.ctime(@rel_path))
327
+ end
328
+ end
329
+ end
330
+ end
331
+
332
+ describe ".delete" do
333
+ context "with no filesystems mounted" do
334
+ it "should raise Errno::ENOENT when given a nonexistent file" do
335
+ expect do
336
+ VirtFS::VFile.delete("nonexistent_file")
337
+ end.to raise_error(
338
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
339
+ )
340
+ end
341
+
342
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
343
+ expect do
344
+ VirtFS::VFile.delete(@full_path)
345
+ end.to raise_error(
346
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
347
+ )
348
+ end
349
+ end
350
+
351
+ context "with FS mounted on '/'" do
352
+ before(:each) do
353
+ @native_fs = nativefs_class.new
354
+ VirtFS.mount(@native_fs, @root)
355
+ end
356
+
357
+ it "should raise Errno::ENOENT when given a nonexistent file" do
358
+ expect do
359
+ VirtFS::VFile.delete("nonexistent_file")
360
+ end.to raise_error(
361
+ Errno::ENOENT, /No such file or directory/
362
+ )
363
+ end
364
+
365
+ it "should return the number of files processed - 1" do
366
+ expect(VirtFS::VFile.delete(@full_path)).to eq(1)
367
+ end
368
+
369
+ it "should return the number of files processed - 2" do
370
+ expect(VirtFS::VFile.delete(@full_path, @full_path2)).to eq(2)
371
+ end
372
+
373
+ it "should change the permission bits on an existing file" do
374
+ expect(VfsRealFile.exist?(@full_path)).to be true
375
+ VirtFS::VFile.delete(@full_path)
376
+ expect(VfsRealFile.exist?(@full_path)).to_not be true
377
+ end
378
+ end
379
+ end
380
+
381
+ describe ".directory?" do
382
+ context "with no filesystems mounted" do
383
+ it "should raise Errno::ENOENT when given a nonexistent directory" do
384
+ expect do
385
+ VirtFS::VFile.directory?("nonexistent_directory")
386
+ end.to raise_error(
387
+ Errno::ENOENT, "No such file or directory - nonexistent_directory"
388
+ )
389
+ end
390
+
391
+ it "should raise Errno::ENOENT when given a directory that exists in the native FS" do
392
+ expect do
393
+ VirtFS::VFile.directory?(@parent_dir)
394
+ end.to raise_error(
395
+ Errno::ENOENT, "No such file or directory - #{@parent_dir}"
396
+ )
397
+ end
398
+ end
399
+
400
+ context "with FS mounted on '/'" do
401
+ before(:each) do
402
+ @native_fs = nativefs_class.new
403
+ VirtFS.mount(@native_fs, @root)
404
+ end
405
+
406
+ it "should return false when given a nonexistent directory" do
407
+ expect(VirtFS::VFile.directory?("nonexistent_directory")).to be false
408
+ end
409
+
410
+ it "should return false when given a regular file" do
411
+ expect(VirtFS::VFile.directory?(@full_path)).to be false
412
+ end
413
+
414
+ it "should return true when given a directory" do
415
+ expect(VirtFS::VFile.directory?(@parent_dir)).to be true
416
+ end
417
+ end
418
+ end
419
+
420
+ describe ".executable?" do
421
+ context "with no filesystems mounted" do
422
+ it "should raise Errno::ENOENT when given a nonexistent file" do
423
+ expect do
424
+ VirtFS::VFile.executable?("nonexistent_file")
425
+ end.to raise_error(
426
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
427
+ )
428
+ end
429
+
430
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
431
+ expect do
432
+ VirtFS::VFile.executable?(@full_path)
433
+ end.to raise_error(
434
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
435
+ )
436
+ end
437
+ end
438
+
439
+ context "with FS mounted on '/'" do
440
+ before(:each) do
441
+ @native_fs = nativefs_class.new
442
+ VirtFS.mount(@native_fs, @root)
443
+ end
444
+
445
+ it "should return false when given a nonexistent file" do
446
+ expect(VirtFS::VFile.executable?("nonexistent_file")).to be false
447
+ end
448
+
449
+ it "should return false when given a non-executable file" do
450
+ expect(VirtFS::VFile.executable?(@full_path)).to be false
451
+ end
452
+
453
+ it "should return true when given a executable file" do
454
+ VfsRealFile.chmod(0100, @full_path)
455
+ expect(VirtFS::VFile.executable?(@full_path)).to be true
456
+ end
457
+ end
458
+ end
459
+
460
+ describe ".executable_real?" do
461
+ context "with no filesystems mounted" do
462
+ it "should raise Errno::ENOENT when given a nonexistent file" do
463
+ expect do
464
+ VirtFS::VFile.executable_real?("nonexistent_file")
465
+ end.to raise_error(
466
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
467
+ )
468
+ end
469
+
470
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
471
+ expect do
472
+ VirtFS::VFile.executable_real?(@full_path)
473
+ end.to raise_error(
474
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
475
+ )
476
+ end
477
+ end
478
+
479
+ context "with FS mounted on '/'" do
480
+ before(:each) do
481
+ @native_fs = nativefs_class.new
482
+ VirtFS.mount(@native_fs, @root)
483
+ end
484
+
485
+ it "should return false when given a nonexistent file" do
486
+ expect(VirtFS::VFile.executable_real?("nonexistent_file")).to be false
487
+ end
488
+
489
+ it "should return false when given a non-executable file" do
490
+ expect(VirtFS::VFile.executable_real?(@full_path)).to be false
491
+ end
492
+
493
+ it "should return true when given a executable file" do
494
+ VfsRealFile.chmod(0100, @full_path)
495
+ expect(VirtFS::VFile.executable_real?(@full_path)).to be true
496
+ end
497
+ end
498
+ end
499
+
500
+ describe ".exist?" do
501
+ context "with no filesystems mounted" do
502
+ it "should raise Errno::ENOENT when given a nonexistent file" do
503
+ expect do
504
+ VirtFS::VFile.exist?("nonexistent_file")
505
+ end.to raise_error(
506
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
507
+ )
508
+ end
509
+
510
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
511
+ expect do
512
+ VirtFS::VFile.exist?(@parent_dir)
513
+ end.to raise_error(
514
+ Errno::ENOENT, "No such file or directory - #{@parent_dir}"
515
+ )
516
+ end
517
+ end
518
+
519
+ context "with FS mounted on '/'" do
520
+ before(:each) do
521
+ @native_fs = nativefs_class.new
522
+ VirtFS.mount(@native_fs, @root)
523
+ end
524
+
525
+ it "should return false when given a nonexistent file" do
526
+ expect(VirtFS::VFile.exist?("nonexistent_directory")).to be false
527
+ end
528
+
529
+ it "should return true when given a regular file" do
530
+ expect(VirtFS::VFile.exist?(@full_path)).to be true
531
+ end
532
+
533
+ it "should return true when given a directory" do
534
+ expect(VirtFS::VFile.exist?(@parent_dir)).to be true
535
+ end
536
+ end
537
+ end
538
+
539
+ describe ".expand_path" do
540
+ it "should return the same path as the standard File.expand_path, when given a dirstring" do
541
+ expect(VirtFS::VFile.expand_path(@rel_path, @parent_dir)).to eq(VfsRealFile.expand_path(@rel_path, @parent_dir))
542
+ end
543
+
544
+ it "should return the same path as the standard File.expand_path, when using pwd" do
545
+ VfsRealDir.chdir(@parent_dir) do
546
+ VirtFS.cwd = VfsRealDir.getwd
547
+ expect(VirtFS::VFile.expand_path(@rel_path)).to eq(VfsRealFile.expand_path(@rel_path))
548
+ end
549
+ end
550
+ end
551
+
552
+ describe ".extname" do
553
+ it "should return the known extension of tempfile 1" do
554
+ expect(VirtFS::VFile.extname(@full_path)).to eq(@ext)
555
+ end
556
+
557
+ it "should return the known extension of tempfile 2" do
558
+ expect(VirtFS::VFile.extname(@full_path2)).to eq(@ext2)
559
+ end
560
+ end
561
+
562
+ describe ".file?" do
563
+ context "with no filesystems mounted" do
564
+ it "should raise Errno::ENOENT when given a nonexistent file" do
565
+ expect do
566
+ VirtFS::VFile.file?("nonexistent_file")
567
+ end.to raise_error(
568
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
569
+ )
570
+ end
571
+
572
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
573
+ expect do
574
+ VirtFS::VFile.file?(@parent_dir)
575
+ end.to raise_error(
576
+ Errno::ENOENT, "No such file or directory - #{@parent_dir}"
577
+ )
578
+ end
579
+ end
580
+
581
+ context "with FS mounted on '/'" do
582
+ before(:each) do
583
+ @native_fs = nativefs_class.new
584
+ VirtFS.mount(@native_fs, @root)
585
+ end
586
+
587
+ it "should return false when given a nonexistent file" do
588
+ expect(VirtFS::VFile.file?("nonexistent_directory")).to be false
589
+ end
590
+
591
+ it "should return true when given a regular file" do
592
+ expect(VirtFS::VFile.file?(@full_path)).to be true
593
+ end
594
+
595
+ it "should return false when given a directory" do
596
+ expect(VirtFS::VFile.file?(@parent_dir)).to be false
597
+ end
598
+ end
599
+ end
600
+
601
+ describe ".fnmatch" do
602
+ it "should match representative examples" do
603
+ expect(VirtFS::VFile.fnmatch('cat', 'cat')).to be true
604
+ expect(VirtFS::VFile.fnmatch('cat', 'category')).to be false
605
+ expect(VirtFS::VFile.fnmatch('c?t', 'cat')).to be true
606
+ expect(VirtFS::VFile.fnmatch('c\?t', 'cat')).to be false
607
+ expect(VirtFS::VFile.fnmatch('c??t', 'cat')).to be false
608
+ expect(VirtFS::VFile.fnmatch('c*', 'cats')).to be true
609
+ expect(VirtFS::VFile.fnmatch('c/**/t', 'c/a/b/c/t')).to be true
610
+ expect(VirtFS::VFile.fnmatch('c**t', 'c/a/b/c/t')).to be true
611
+ expect(VirtFS::VFile.fnmatch('c**t', 'cat')).to be true
612
+ expect(VirtFS::VFile.fnmatch('**.txt', 'notes.txt')).to be true
613
+ expect(VirtFS::VFile.fnmatch('**.txt', 'some/dir/tree/notes.txt')).to be true
614
+ expect(VirtFS::VFile.fnmatch('c*t', 'cat')).to be true
615
+ expect(VirtFS::VFile.fnmatch('c\at', 'cat')).to be true
616
+ expect(VirtFS::VFile.fnmatch('c\at', 'cat', File::FNM_NOESCAPE)).to be false
617
+ expect(VirtFS::VFile.fnmatch('a?b', 'a/b')).to be true
618
+ expect(VirtFS::VFile.fnmatch('a?b', 'a/b', File::FNM_PATHNAME)).to be false
619
+ expect(VirtFS::VFile.fnmatch('*', '.profile')).to be false
620
+ expect(VirtFS::VFile.fnmatch('*', '.profile', File::FNM_DOTMATCH)).to be true
621
+ expect(VirtFS::VFile.fnmatch('*', 'dave/.profile')).to be true
622
+ expect(VirtFS::VFile.fnmatch('*', 'dave/.profile', File::FNM_DOTMATCH)).to be true
623
+ expect(VirtFS::VFile.fnmatch('*', 'dave/.profile', File::FNM_PATHNAME)).to be false
624
+ expect(VirtFS::VFile.fnmatch('*/*', 'dave/.profile', File::FNM_PATHNAME)).to be false
625
+ strict = File::FNM_PATHNAME | File::FNM_DOTMATCH
626
+ expect(VirtFS::VFile.fnmatch('*/*', 'dave/.profile', strict)).to be true
627
+ end
628
+ end
629
+
630
+ describe ".ftype" do
631
+ context "with no filesystems mounted" do
632
+ it "should raise Errno::ENOENT when given a nonexistent file" do
633
+ expect do
634
+ VirtFS::VFile.ftype("nonexistent_file")
635
+ end.to raise_error(
636
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
637
+ )
638
+ end
639
+
640
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
641
+ expect do
642
+ VirtFS::VFile.ftype(@full_path)
643
+ end.to raise_error(
644
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
645
+ )
646
+ end
647
+ end
648
+
649
+ context "with FS mounted on '/'" do
650
+ before(:each) do
651
+ @native_fs = nativefs_class.new
652
+ VirtFS.mount(@native_fs, @root)
653
+ end
654
+
655
+ it "should raise Errno::ENOENT when given a nonexistent file" do
656
+ expect do
657
+ VirtFS::VFile.ftype("nonexistent_file")
658
+ end.to raise_error(
659
+ Errno::ENOENT, /No such file or directory/
660
+ )
661
+ end
662
+
663
+ it "should return 'file' when given a regular file" do
664
+ expect(VirtFS::VFile.ftype(@full_path)).to eq('file')
665
+ end
666
+
667
+ it "should return 'directory' when given a directory" do
668
+ expect(VirtFS::VFile.ftype(@parent_dir)).to eq('directory')
669
+ end
670
+
671
+ #
672
+ # The block_dev_file method fails to find a block device
673
+ # file in the Travis environment - disabling this test.
674
+ #
675
+ # it "should return 'blockSpecial,' when given a block device file" do
676
+ # expect(bdev = block_dev_file).to_not eq(nil)
677
+ # expect(VirtFS::VFile.ftype(bdev)).to eq('blockSpecial')
678
+ # end
679
+
680
+ it "should return 'characterSpecial,' when given a block device file" do
681
+ expect(cdev = char_dev_file).to_not eq(nil)
682
+ expect(VirtFS::VFile.ftype(cdev)).to eq('characterSpecial')
683
+ end
684
+ end
685
+ end
686
+
687
+ describe ".grpowned?" do
688
+ context "with no filesystems mounted" do
689
+ it "should raise Errno::ENOENT when given a nonexistent file" do
690
+ expect do
691
+ VirtFS::VFile.grpowned?("nonexistent_file")
692
+ end.to raise_error(
693
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
694
+ )
695
+ end
696
+
697
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
698
+ expect do
699
+ VirtFS::VFile.grpowned?(@full_path)
700
+ end.to raise_error(
701
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
702
+ )
703
+ end
704
+ end
705
+
706
+ context "with FS mounted on '/'" do
707
+ before(:each) do
708
+ @native_fs = nativefs_class.new
709
+ VirtFS.mount(@native_fs, @root)
710
+ end
711
+
712
+ it "should return false when given a nonexistent file" do
713
+ expect(VirtFS::VFile.grpowned?("nonexistent_file")).to be false
714
+ end
715
+
716
+ it "should return true when given a file we created" do
717
+ expect(VirtFS::VFile.grpowned?(@full_path)).to be true
718
+ end
719
+ end
720
+ end
721
+
722
+ describe ".identical?" do
723
+ before(:each) do
724
+ VfsRealFile.symlink(@full_path, @slink_path)
725
+ end
726
+
727
+ after(:each) do
728
+ VfsRealFile.delete(@slink_path)
729
+ end
730
+
731
+ context "with no filesystems mounted" do
732
+ it "should raise Errno::ENOENT when given a nonexistent file" do
733
+ expect do
734
+ VirtFS::VFile.identical?("nonexistent_file1", "nonexistent_file2")
735
+ end.to raise_error(
736
+ Errno::ENOENT, /No such file or directory/
737
+ )
738
+ end
739
+
740
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
741
+ expect do
742
+ VirtFS::VFile.identical?(@full_path, @slink_path)
743
+ end.to raise_error(
744
+ Errno::ENOENT, /No such file or directory/
745
+ )
746
+ end
747
+ end
748
+
749
+ context "with FS mounted on '/'" do
750
+ before(:each) do
751
+ @native_fs = nativefs_class.new
752
+ VirtFS.mount(@native_fs, @root)
753
+ end
754
+
755
+ it "should return false when given a nonexistent file" do
756
+ expect(VirtFS::VFile.identical?(@full_path, "nonexistent_file1")).to be false
757
+ end
758
+
759
+ it "should return true when given the same file" do
760
+ expect(VirtFS::VFile.identical?(@full_path, @full_path)).to be true
761
+ end
762
+
763
+ it "should return true when given a file and its symlink" do
764
+ expect(VirtFS::VFile.identical?(@full_path, @slink_path)).to be true
765
+ end
766
+ end
767
+ end
768
+
769
+ describe ".join" do
770
+ it "should return the same path as the standard File.join" do
771
+ dirs = %( dir1 dir2 dir3 dir4 dir5 )
772
+ expect(VirtFS::VFile.join(dirs)).to eq(VfsRealFile.join(dirs))
773
+ end
774
+ end
775
+
776
+ if VfsRealFile.respond_to?(:lchmod)
777
+ describe ".lchmod" do
778
+ context "with no filesystems mounted" do
779
+ it "should raise Errno::ENOENT when given a nonexistent file" do
780
+ expect do
781
+ VirtFS::VFile.lchmod(0755, "nonexistent_file")
782
+ end.to raise_error(
783
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
784
+ )
785
+ end
786
+
787
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
788
+ expect do
789
+ VirtFS::VFile.lchmod(0755, @full_path)
790
+ end.to raise_error(
791
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
792
+ )
793
+ end
794
+ end
795
+
796
+ context "with FS mounted on '/'" do
797
+ before(:each) do
798
+ @native_fs = nativefs_class.new
799
+ VirtFS.mount(@native_fs, @root)
800
+ end
801
+
802
+ it "should raise Errno::ENOENT when given a nonexistent file" do
803
+ expect do
804
+ VirtFS::VFile.lchmod(0755, "nonexistent_file")
805
+ end.to raise_error(
806
+ Errno::ENOENT, /No such file or directory/
807
+ )
808
+ end
809
+
810
+ it "should return the number of files processed" do
811
+ expect(VirtFS::VFile.lchmod(0777, @full_path)).to eq(1)
812
+ expect(VirtFS::VFile.lchmod(0777, @full_path, @full_path2)).to eq(2)
813
+ end
814
+
815
+ it "should change the permission bits on an existing file" do
816
+ target_mode = 0755
817
+ expect(VfsRealFile.stat(@full_path).mode & 0777).to_not eq(target_mode)
818
+ VirtFS::VFile.lchmod(target_mode, @full_path)
819
+ expect(VfsRealFile.stat(@full_path).mode & 0777).to eq(target_mode)
820
+ end
821
+ end
822
+ end
823
+ end
824
+
825
+ describe ".lchown" do
826
+ before(:each) do
827
+ stat = VfsRealFile.stat(@full_path)
828
+ @owner = stat.uid
829
+ @group = stat.gid
830
+
831
+ VfsRealFile.symlink(@full_path, @slink_path)
832
+ end
833
+
834
+ after(:each) do
835
+ VfsRealFile.delete(@slink_path)
836
+ end
837
+
838
+ context "with no filesystems mounted" do
839
+ it "should raise Errno::ENOENT when given a nonexistent file" do
840
+ expect do
841
+ VirtFS::VFile.lchown(@owner, @group, "nonexistent_file")
842
+ end.to raise_error(
843
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
844
+ )
845
+ end
846
+
847
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
848
+ expect do
849
+ VirtFS::VFile.lchown(@owner, @group, @full_path)
850
+ end.to raise_error(
851
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
852
+ )
853
+ end
854
+ end
855
+
856
+ context "with FS mounted on '/'" do
857
+ before(:each) do
858
+ @native_fs = nativefs_class.new
859
+ VirtFS.mount(@native_fs, @root)
860
+ end
861
+
862
+ it "should raise Errno::ENOENT when given a nonexistent file" do
863
+ expect do
864
+ VirtFS::VFile.lchown(@owner, @group, "nonexistent_file")
865
+ end.to raise_error(
866
+ Errno::ENOENT, /No such file or directory/
867
+ )
868
+ end
869
+
870
+ it "should return the number of files processed" do
871
+ expect(VirtFS::VFile.lchown(@owner, @group, @slink_path)).to eq(1)
872
+ expect(VirtFS::VFile.lchown(@owner, @group, @slink_path, @full_path2)).to eq(2)
873
+ end
874
+ end
875
+ end
876
+
877
+ describe ".link" do
878
+ before(:each) do
879
+ @link_path = temp_name(@temp_prefix, ".hardlink")
880
+ end
881
+
882
+ after(:each) do
883
+ VfsRealFile.delete(@link_path) if VfsRealFile.exist?(@link_path)
884
+ end
885
+
886
+ context "with no filesystems mounted" do
887
+ it "should raise Errno::ENOENT when given a nonexistent file" do
888
+ expect do
889
+ VirtFS::VFile.link("nonexistent_file1", "nonexistent_file2")
890
+ end.to raise_error(
891
+ Errno::ENOENT, /No such file or directory/
892
+ )
893
+ end
894
+
895
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
896
+ expect do
897
+ VirtFS::VFile.link(@full_path, @link_path)
898
+ end.to raise_error(
899
+ Errno::ENOENT, /No such file or directory/
900
+ )
901
+ end
902
+ end
903
+
904
+ context "with FS mounted on '/'" do
905
+ before(:each) do
906
+ @native_fs = nativefs_class.new
907
+ VirtFS.mount(@native_fs, @root)
908
+ end
909
+
910
+ it "should raise Errno::ENOENT when given a nonexistent file" do
911
+ expect do
912
+ VirtFS::VFile.link("nonexistent_file1", @link_path)
913
+ end.to raise_error(
914
+ Errno::ENOENT, /No such file or directory/
915
+ )
916
+ end
917
+
918
+ it "should return 0 on success" do
919
+ expect(VirtFS::VFile.link(@full_path, @link_path)).to eq(0)
920
+ end
921
+
922
+ it "the link should be identical to the original file" do
923
+ expect(VirtFS::VFile.link(@full_path, @link_path)).to eq(0)
924
+ expect(VirtFS::VFile.identical?(@full_path, @link_path)).to be true
925
+ end
926
+ end
927
+ end
928
+
929
+ describe ".lstat" do
930
+ context "with no filesystems mounted" do
931
+ it "should raise Errno::ENOENT when given a nonexistent file" do
932
+ expect do
933
+ VirtFS::VFile.lstat("nonexistent_file1")
934
+ end.to raise_error(
935
+ Errno::ENOENT, /No such file or directory/
936
+ )
937
+ end
938
+
939
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
940
+ expect do
941
+ VirtFS::VFile.lstat(@full_path)
942
+ end.to raise_error(
943
+ Errno::ENOENT, /No such file or directory/
944
+ )
945
+ end
946
+ end
947
+
948
+ context "with FS mounted on '/'" do
949
+ before(:each) do
950
+ @native_fs = nativefs_class.new
951
+ VirtFS.mount(@native_fs, @root)
952
+
953
+ VfsRealFile.symlink(@full_path, @slink_path)
954
+ end
955
+
956
+ after(:each) do
957
+ VfsRealFile.delete(@slink_path)
958
+ end
959
+
960
+ it "should raise Errno::ENOENT when given a nonexistent file" do
961
+ expect do
962
+ VirtFS::VFile.lstat("nonexistent_file1")
963
+ end.to raise_error(
964
+ Errno::ENOENT, /No such file or directory/
965
+ )
966
+ end
967
+
968
+ it "should return the stat information for the symlink" do
969
+ expect(VirtFS::VFile.lstat(@slink_path).symlink?).to be true
970
+ end
971
+ end
972
+ end
973
+
974
+ describe ".mtime" do
975
+ context "with no filesystems mounted" do
976
+ it "should raise Errno::ENOENT when given a nonexistent file" do
977
+ expect do
978
+ VirtFS::VFile.mtime("nonexistent_file")
979
+ end.to raise_error(
980
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
981
+ )
982
+ end
983
+
984
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
985
+ expect do
986
+ VirtFS::VFile.mtime(@full_path)
987
+ end.to raise_error(
988
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
989
+ )
990
+ end
991
+ end
992
+
993
+ context "with FS mounted on '/'" do
994
+ before(:each) do
995
+ @native_fs = nativefs_class.new
996
+ VirtFS.mount(@native_fs, @root)
997
+ end
998
+
999
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1000
+ expect do
1001
+ VirtFS::VFile.mtime("nonexistent_file")
1002
+ end.to raise_error(
1003
+ Errno::ENOENT, /No such file or directory/
1004
+ )
1005
+ end
1006
+
1007
+ it "should return the same value as the standard File.mtime, when given a full path" do
1008
+ expect(VirtFS::VFile.mtime(@full_path)).to eq(VfsRealFile.mtime(@full_path))
1009
+ end
1010
+
1011
+ it "should return the same value as the standard File.mtime, when given relative path" do
1012
+ VfsRealDir.chdir(@parent_dir) do
1013
+ VirtFS.dir_chdir(@parent_dir)
1014
+ expect(VirtFS::VFile.mtime(@rel_path)).to eq(VfsRealFile.mtime(@rel_path))
1015
+ end
1016
+ end
1017
+ end
1018
+ end
1019
+
1020
+ describe ".owned?" do
1021
+ context "with no filesystems mounted" do
1022
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1023
+ expect do
1024
+ VirtFS::VFile.owned?("nonexistent_file")
1025
+ end.to raise_error(
1026
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1027
+ )
1028
+ end
1029
+
1030
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1031
+ expect do
1032
+ VirtFS::VFile.owned?(@full_path)
1033
+ end.to raise_error(
1034
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1035
+ )
1036
+ end
1037
+ end
1038
+
1039
+ context "with FS mounted on '/'" do
1040
+ before(:each) do
1041
+ @native_fs = nativefs_class.new
1042
+ VirtFS.mount(@native_fs, @root)
1043
+ end
1044
+
1045
+ it "should return false when given a nonexistent file" do
1046
+ expect(VirtFS::VFile.owned?("nonexistent_file")).to be false
1047
+ end
1048
+
1049
+ it "should return true when given a file we created" do
1050
+ expect(VirtFS::VFile.owned?(@full_path)).to be true
1051
+ end
1052
+ end
1053
+ end
1054
+
1055
+ describe ".path" do
1056
+ before(:each) do
1057
+ @native_fs = nativefs_class.new
1058
+ VirtFS.mount(@native_fs, @root)
1059
+ end
1060
+
1061
+ it "should work with a string" do
1062
+ expect(VirtFS::VFile.path(@full_path)).to eq(@full_path)
1063
+ end
1064
+
1065
+ it "should work with an IO object" do
1066
+ VirtFS::VFile.open(@full_path) do |fobj|
1067
+ expect(VirtFS::VFile.path(fobj)).to eq(@full_path)
1068
+ end
1069
+ end
1070
+ end
1071
+
1072
+ describe ".pipe?" do
1073
+ context "with no filesystems mounted" do
1074
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1075
+ expect do
1076
+ VirtFS::VFile.pipe?("nonexistent_file")
1077
+ end.to raise_error(
1078
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1079
+ )
1080
+ end
1081
+
1082
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1083
+ expect do
1084
+ VirtFS::VFile.pipe?(@full_path)
1085
+ end.to raise_error(
1086
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1087
+ )
1088
+ end
1089
+ end
1090
+
1091
+ context "with FS mounted on '/'" do
1092
+ before(:each) do
1093
+ @native_fs = nativefs_class.new
1094
+ VirtFS.mount(@native_fs, @root)
1095
+ end
1096
+
1097
+ it "should return false when given a nonexistent file" do
1098
+ expect(VirtFS::VFile.pipe?("nonexistent_file")).to be false
1099
+ end
1100
+
1101
+ it "should return false when given a regular file" do
1102
+ expect(VirtFS::VFile.pipe?(@full_path)).to be false
1103
+ end
1104
+ end
1105
+ end
1106
+
1107
+ describe ".readable?" do
1108
+ context "with no filesystems mounted" do
1109
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1110
+ expect do
1111
+ VirtFS::VFile.readable?("nonexistent_file")
1112
+ end.to raise_error(
1113
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1114
+ )
1115
+ end
1116
+
1117
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1118
+ expect do
1119
+ VirtFS::VFile.readable?(@full_path)
1120
+ end.to raise_error(
1121
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1122
+ )
1123
+ end
1124
+ end
1125
+
1126
+ context "with FS mounted on '/'" do
1127
+ before(:each) do
1128
+ @native_fs = nativefs_class.new
1129
+ VirtFS.mount(@native_fs, @root)
1130
+ end
1131
+
1132
+ it "should return false when given a nonexistent file" do
1133
+ expect(VirtFS::VFile.readable?("nonexistent_file")).to be false
1134
+ end
1135
+
1136
+ #
1137
+ # NOTE: This test fails when run under Fusion shared folders.
1138
+ # Could be due to silent failure of chmod.
1139
+ #
1140
+ it "should return false when given a non-readable file" do
1141
+ VfsRealFile.chmod(0300, @full_path)
1142
+ expect(VirtFS::VFile.readable?(@full_path)).to be false
1143
+ end
1144
+
1145
+ it "should return true when given a readable file" do
1146
+ VfsRealFile.chmod(0400, @full_path)
1147
+ expect(VirtFS::VFile.readable?(@full_path)).to be true
1148
+ end
1149
+ end
1150
+ end
1151
+
1152
+ describe ".readable_real?" do
1153
+ context "with no filesystems mounted" do
1154
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1155
+ expect do
1156
+ VirtFS::VFile.readable_real?("nonexistent_file")
1157
+ end.to raise_error(
1158
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1159
+ )
1160
+ end
1161
+
1162
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1163
+ expect do
1164
+ VirtFS::VFile.readable_real?(@full_path)
1165
+ end.to raise_error(
1166
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1167
+ )
1168
+ end
1169
+ end
1170
+
1171
+ context "with FS mounted on '/'" do
1172
+ before(:each) do
1173
+ @native_fs = nativefs_class.new
1174
+ VirtFS.mount(@native_fs, @root)
1175
+ end
1176
+
1177
+ it "should return false when given a nonexistent file" do
1178
+ expect(VirtFS::VFile.readable_real?("nonexistent_file")).to be false
1179
+ end
1180
+
1181
+ #
1182
+ # NOTE: This test fails when run under Fusion shared folders.
1183
+ # Could be due to silent failure of chmod.
1184
+ #
1185
+ it "should return false when given a non-readable file" do
1186
+ VfsRealFile.chmod(0300, @full_path)
1187
+ expect(VirtFS::VFile.readable_real?(@full_path)).to be false
1188
+ end
1189
+
1190
+ it "should return true when given a readable file" do
1191
+ VfsRealFile.chmod(0400, @full_path)
1192
+ expect(VirtFS::VFile.readable_real?(@full_path)).to be true
1193
+ end
1194
+ end
1195
+ end
1196
+
1197
+ describe ".readlink" do
1198
+ context "with no filesystems mounted" do
1199
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1200
+ expect do
1201
+ VirtFS::VFile.readlink("nonexistent_file1")
1202
+ end.to raise_error(
1203
+ Errno::ENOENT, /No such file or directory/
1204
+ )
1205
+ end
1206
+
1207
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1208
+ expect do
1209
+ VirtFS::VFile.readlink(@full_path)
1210
+ end.to raise_error(
1211
+ Errno::ENOENT, /No such file or directory/
1212
+ )
1213
+ end
1214
+ end
1215
+
1216
+ context "with FS mounted on '/'" do
1217
+ before(:each) do
1218
+ @native_fs = nativefs_class.new
1219
+ VirtFS.mount(@native_fs, @root)
1220
+
1221
+ VfsRealFile.symlink(@full_path, @slink_path)
1222
+ end
1223
+
1224
+ after(:each) do
1225
+ VfsRealFile.delete(@slink_path)
1226
+ end
1227
+
1228
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1229
+ expect do
1230
+ VirtFS::VFile.readlink("nonexistent_file1")
1231
+ end.to raise_error(
1232
+ Errno::ENOENT, /No such file or directory/
1233
+ )
1234
+ end
1235
+
1236
+ it "should return the stat information for the symlink" do
1237
+ expect(VirtFS::VFile.readlink(@slink_path)).to eq(@full_path)
1238
+ end
1239
+ end
1240
+ end
1241
+
1242
+ describe ".realdirpath" do
1243
+ before(:each) do
1244
+ @native_fs = nativefs_class.new
1245
+ VirtFS.mount(@native_fs, @root)
1246
+ end
1247
+
1248
+ it "should return the same path as the standard realdirpath" do
1249
+ expect(VirtFS::VFile.realdirpath(@full_path)).to eq(VfsRealFile.realdirpath(@full_path))
1250
+ end
1251
+ end
1252
+
1253
+ describe ".realpath" do
1254
+ before(:each) do
1255
+ @native_fs = nativefs_class.new
1256
+ VirtFS.mount(@native_fs, @root)
1257
+ end
1258
+
1259
+ it "should return the same path as the standard realdirpath" do
1260
+ expect(VirtFS::VFile.realpath(@full_path)).to eq(VfsRealFile.realpath(@full_path))
1261
+ end
1262
+ end
1263
+
1264
+ describe ".rename" do
1265
+ before(:each) do
1266
+ @to_path = temp_name(@temp_prefix, ".renamed")
1267
+ end
1268
+
1269
+ after(:each) do
1270
+ VfsRealFile.delete(@to_path) if VfsRealFile.exist?(@to_path)
1271
+ end
1272
+
1273
+ context "with no filesystems mounted" do
1274
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1275
+ expect do
1276
+ VirtFS::VFile.rename("nonexistent_file1", "nonexistent_file2")
1277
+ end.to raise_error(
1278
+ Errno::ENOENT, /No such file or directory/
1279
+ )
1280
+ end
1281
+
1282
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1283
+ expect do
1284
+ VirtFS::VFile.rename(@full_path, @to_path)
1285
+ end.to raise_error(
1286
+ Errno::ENOENT, /No such file or directory/
1287
+ )
1288
+ end
1289
+ end
1290
+
1291
+ context "with FS mounted on '/'" do
1292
+ before(:each) do
1293
+ @native_fs = nativefs_class.new
1294
+ VirtFS.mount(@native_fs, @root)
1295
+ end
1296
+
1297
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1298
+ expect do
1299
+ VirtFS::VFile.rename("nonexistent_file1", @to_path)
1300
+ end.to raise_error(
1301
+ Errno::ENOENT, /No such file or directory/
1302
+ )
1303
+ end
1304
+
1305
+ it "should return 0 on success" do
1306
+ expect(VirtFS::VFile.rename(@full_path, @to_path)).to eq(0)
1307
+ end
1308
+
1309
+ it "the link should rename the file" do
1310
+ expect(VirtFS::VFile.rename(@full_path, @to_path)).to eq(0)
1311
+ expect(VirtFS::VFile.exist?(@to_path)).to be true
1312
+ expect(VirtFS::VFile.exist?(@full_path)).to be false
1313
+ end
1314
+ end
1315
+ end
1316
+
1317
+ describe ".setgid?" do
1318
+ context "with no filesystems mounted" do
1319
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1320
+ expect do
1321
+ VirtFS::VFile.setgid?("nonexistent_file")
1322
+ end.to raise_error(
1323
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1324
+ )
1325
+ end
1326
+
1327
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1328
+ expect do
1329
+ VirtFS::VFile.setgid?(@full_path)
1330
+ end.to raise_error(
1331
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1332
+ )
1333
+ end
1334
+ end
1335
+
1336
+ context "with FS mounted on '/'" do
1337
+ before(:each) do
1338
+ @native_fs = nativefs_class.new
1339
+ VirtFS.mount(@native_fs, @root)
1340
+ end
1341
+
1342
+ it "should return false when given a nonexistent file" do
1343
+ expect(VirtFS::VFile.setgid?("nonexistent_file")).to be false
1344
+ end
1345
+
1346
+ it "should return false when given a non-setgid file" do
1347
+ VfsRealFile.chmod(0644, @full_path)
1348
+ expect(VirtFS::VFile.setgid?(@full_path)).to be false
1349
+ end
1350
+
1351
+ it "should return true when given a setgid file" do
1352
+ VfsRealFile.chmod(02644, @full_path)
1353
+ expect(VirtFS::VFile.setgid?(@full_path)).to be true
1354
+ end
1355
+ end
1356
+ end
1357
+
1358
+ describe ".setuid?" do
1359
+ context "with no filesystems mounted" do
1360
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1361
+ expect do
1362
+ VirtFS::VFile.setuid?("nonexistent_file")
1363
+ end.to raise_error(
1364
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1365
+ )
1366
+ end
1367
+
1368
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1369
+ expect do
1370
+ VirtFS::VFile.setuid?(@full_path)
1371
+ end.to raise_error(
1372
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1373
+ )
1374
+ end
1375
+ end
1376
+
1377
+ context "with FS mounted on '/'" do
1378
+ before(:each) do
1379
+ @native_fs = nativefs_class.new
1380
+ VirtFS.mount(@native_fs, @root)
1381
+ end
1382
+
1383
+ it "should return false when given a nonexistent file" do
1384
+ expect(VirtFS::VFile.setuid?("nonexistent_file")).to be false
1385
+ end
1386
+
1387
+ it "should return false when given a non-setuid file" do
1388
+ VfsRealFile.chmod(0644, @full_path)
1389
+ expect(VirtFS::VFile.setuid?(@full_path)).to be false
1390
+ end
1391
+
1392
+ it "should return true when given a setuid file" do
1393
+ VfsRealFile.chmod(04644, @full_path)
1394
+ expect(VirtFS::VFile.setuid?(@full_path)).to be true
1395
+ end
1396
+ end
1397
+ end
1398
+
1399
+ describe ".size" do
1400
+ context "with no filesystems mounted" do
1401
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1402
+ expect do
1403
+ VirtFS::VFile.size("nonexistent_file")
1404
+ end.to raise_error(
1405
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1406
+ )
1407
+ end
1408
+
1409
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1410
+ expect do
1411
+ VirtFS::VFile.size(@full_path)
1412
+ end.to raise_error(
1413
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1414
+ )
1415
+ end
1416
+ end
1417
+
1418
+ context "with FS mounted on '/'" do
1419
+ before(:each) do
1420
+ @native_fs = nativefs_class.new
1421
+ VirtFS.mount(@native_fs, @root)
1422
+ end
1423
+
1424
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1425
+ expect do
1426
+ VirtFS::VFile.size("nonexistent_file")
1427
+ end.to raise_error(
1428
+ Errno::ENOENT, /No such file or directory/
1429
+ )
1430
+ end
1431
+
1432
+ it "should return the known size of the file" do
1433
+ expect(VirtFS::VFile.size(@full_path)).to eq(@data1.bytesize)
1434
+ end
1435
+
1436
+ it "should return the same value as the standard File#size" do
1437
+ expect(VirtFS::VFile.size(@full_path)).to eq(VfsRealFile.size(@full_path))
1438
+ end
1439
+
1440
+ it "should return 0 for empty file" do
1441
+ expect(VirtFS::VFile.size(@full_path2)).to eq(0)
1442
+ end
1443
+ end
1444
+ end
1445
+
1446
+ describe ".size?" do
1447
+ context "with no filesystems mounted" do
1448
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1449
+ expect do
1450
+ VirtFS::VFile.size?("nonexistent_file")
1451
+ end.to raise_error(
1452
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1453
+ )
1454
+ end
1455
+
1456
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1457
+ expect do
1458
+ VirtFS::VFile.size?(@full_path)
1459
+ end.to raise_error(
1460
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1461
+ )
1462
+ end
1463
+ end
1464
+
1465
+ context "with FS mounted on '/'" do
1466
+ before(:each) do
1467
+ @native_fs = nativefs_class.new
1468
+ VirtFS.mount(@native_fs, @root)
1469
+ end
1470
+
1471
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1472
+ expect do
1473
+ VirtFS::VFile.size?("nonexistent_file")
1474
+ end.to raise_error(
1475
+ Errno::ENOENT, /No such file or directory/
1476
+ )
1477
+ end
1478
+
1479
+ it "should return the known size of the file" do
1480
+ expect(VirtFS::VFile.size?(@full_path)).to eq(@data1.bytesize)
1481
+ end
1482
+
1483
+ it "should return the same value as the standard File#size" do
1484
+ expect(VirtFS::VFile.size?(@full_path)).to eq(VfsRealFile.size?(@full_path))
1485
+ end
1486
+
1487
+ it "should return nil for empty file" do
1488
+ expect(VirtFS::VFile.size?(@full_path2)).to eq(nil)
1489
+ end
1490
+ end
1491
+ end
1492
+
1493
+ describe ".socket?" do
1494
+ context "with no filesystems mounted" do
1495
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1496
+ expect do
1497
+ VirtFS::VFile.socket?("nonexistent_file")
1498
+ end.to raise_error(
1499
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1500
+ )
1501
+ end
1502
+
1503
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1504
+ expect do
1505
+ VirtFS::VFile.socket?(@full_path)
1506
+ end.to raise_error(
1507
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1508
+ )
1509
+ end
1510
+ end
1511
+
1512
+ context "with FS mounted on '/'" do
1513
+ before(:each) do
1514
+ @native_fs = nativefs_class.new
1515
+ VirtFS.mount(@native_fs, @root)
1516
+ end
1517
+
1518
+ it "should return false when given a nonexistent file" do
1519
+ expect(VirtFS::VFile.socket?("nonexistent_file")).to be false
1520
+ end
1521
+
1522
+ it "should return false when given a regular file" do
1523
+ expect(VirtFS::VFile.socket?(@full_path)).to be false
1524
+ end
1525
+ end
1526
+ end
1527
+
1528
+ describe ".split" do
1529
+ it "should return the same values as the standard File.split" do
1530
+ expect(VirtFS::VFile.split(@full_path)).to match_array(VfsRealFile.split(@full_path))
1531
+ end
1532
+ end
1533
+
1534
+ describe ".stat" do
1535
+ context "with no filesystems mounted" do
1536
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1537
+ expect do
1538
+ VirtFS::VFile.stat("nonexistent_file1")
1539
+ end.to raise_error(
1540
+ Errno::ENOENT, /No such file or directory/
1541
+ )
1542
+ end
1543
+
1544
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1545
+ expect do
1546
+ VirtFS::VFile.stat(@full_path)
1547
+ end.to raise_error(
1548
+ Errno::ENOENT, /No such file or directory/
1549
+ )
1550
+ end
1551
+ end
1552
+
1553
+ context "with FS mounted on '/'" do
1554
+ before(:each) do
1555
+ @native_fs = nativefs_class.new
1556
+ VirtFS.mount(@native_fs, @root)
1557
+
1558
+ VfsRealFile.symlink(@full_path, @slink_path)
1559
+ end
1560
+
1561
+ after(:each) do
1562
+ VfsRealFile.delete(@slink_path)
1563
+ end
1564
+
1565
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1566
+ expect do
1567
+ VirtFS::VFile.stat("nonexistent_file1")
1568
+ end.to raise_error(
1569
+ Errno::ENOENT, /No such file or directory/
1570
+ )
1571
+ end
1572
+
1573
+ it "should return the stat information for the file" do
1574
+ expect(VirtFS::VFile.stat(@full_path).symlink?).to be false
1575
+ end
1576
+
1577
+ it "given a symlink, should return the stat information for the regular file" do
1578
+ expect(VirtFS::VFile.stat(@slink_path).symlink?).to be false
1579
+ end
1580
+ end
1581
+ end
1582
+
1583
+ describe ".sticky?" do
1584
+ context "with no filesystems mounted" do
1585
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1586
+ expect do
1587
+ VirtFS::VFile.sticky?("nonexistent_file")
1588
+ end.to raise_error(
1589
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1590
+ )
1591
+ end
1592
+
1593
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1594
+ expect do
1595
+ VirtFS::VFile.sticky?(@full_path)
1596
+ end.to raise_error(
1597
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1598
+ )
1599
+ end
1600
+ end
1601
+
1602
+ context "with FS mounted on '/'" do
1603
+ before(:each) do
1604
+ @native_fs = nativefs_class.new
1605
+ VirtFS.mount(@native_fs, @root)
1606
+ end
1607
+
1608
+ it "should return false when given a nonexistent file" do
1609
+ expect(VirtFS::VFile.sticky?("nonexistent_file")).to be false
1610
+ end
1611
+
1612
+ it "should return false when given a non-sticky file" do
1613
+ VfsRealFile.chmod(0644, @full_path)
1614
+ expect(VirtFS::VFile.sticky?(@full_path)).to be false
1615
+ end
1616
+
1617
+ it "should return true when given a sticky file" do
1618
+ VfsRealFile.chmod(01644, @full_path)
1619
+ expect(VirtFS::VFile.sticky?(@full_path)).to be true
1620
+ end
1621
+ end
1622
+ end
1623
+
1624
+ describe ".symlink" do
1625
+ after(:each) do
1626
+ VfsRealFile.delete(@slink_path) if VfsRealFile.exist?(@slink_path)
1627
+ end
1628
+
1629
+ context "with no filesystems mounted" do
1630
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1631
+ expect do
1632
+ VirtFS::VFile.symlink("nonexistent_file1", "nonexistent_file2")
1633
+ end.to raise_error(
1634
+ Errno::ENOENT, /No such file or directory/
1635
+ )
1636
+ end
1637
+
1638
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1639
+ expect do
1640
+ VirtFS::VFile.symlink(@full_path, @slink_path)
1641
+ end.to raise_error(
1642
+ Errno::ENOENT, /No such file or directory/
1643
+ )
1644
+ end
1645
+ end
1646
+
1647
+ context "with FS mounted on '/'" do
1648
+ before(:each) do
1649
+ @native_fs = nativefs_class.new
1650
+ VirtFS.mount(@native_fs, @root)
1651
+ end
1652
+
1653
+ it "should return 0 on success" do
1654
+ expect(VirtFS::VFile.symlink(@full_path, @slink_path)).to eq(0)
1655
+ end
1656
+
1657
+ it "the symlink should be identical to the original file" do
1658
+ expect(VirtFS::VFile.symlink(@full_path, @slink_path)).to eq(0)
1659
+ expect(VirtFS::VFile.identical?(@full_path, @slink_path)).to be true
1660
+ end
1661
+ end
1662
+ end
1663
+
1664
+ describe ".symlink?" do
1665
+ context "with no filesystems mounted" do
1666
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1667
+ expect do
1668
+ VirtFS::VFile.symlink?("nonexistent_file1")
1669
+ end.to raise_error(
1670
+ Errno::ENOENT, /No such file or directory/
1671
+ )
1672
+ end
1673
+
1674
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1675
+ expect do
1676
+ VirtFS::VFile.symlink?(@full_path)
1677
+ end.to raise_error(
1678
+ Errno::ENOENT, /No such file or directory/
1679
+ )
1680
+ end
1681
+ end
1682
+
1683
+ context "with FS mounted on '/'" do
1684
+ before(:each) do
1685
+ @native_fs = nativefs_class.new
1686
+ VirtFS.mount(@native_fs, @root)
1687
+
1688
+ VfsRealFile.symlink(@full_path, @slink_path)
1689
+ end
1690
+
1691
+ after(:each) do
1692
+ VfsRealFile.delete(@slink_path)
1693
+ end
1694
+
1695
+ it "should return false when given a nonexistent file" do
1696
+ expect(VirtFS::VFile.symlink?("nonexistent_file")).to be false
1697
+ end
1698
+
1699
+ it "should return true given a symlink" do
1700
+ expect(VirtFS::VFile.symlink?(@slink_path)).to be true
1701
+ end
1702
+ end
1703
+ end
1704
+
1705
+ describe ".truncate" do
1706
+ context "with no filesystems mounted" do
1707
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1708
+ expect do
1709
+ VirtFS::VFile.truncate("nonexistent_file", 0)
1710
+ end.to raise_error(
1711
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1712
+ )
1713
+ end
1714
+
1715
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1716
+ expect do
1717
+ VirtFS::VFile.truncate(@full_path, 0)
1718
+ end.to raise_error(
1719
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1720
+ )
1721
+ end
1722
+ end
1723
+
1724
+ context "with FS mounted on '/'" do
1725
+ before(:each) do
1726
+ @native_fs = nativefs_class.new
1727
+ VirtFS.mount(@native_fs, @root)
1728
+ end
1729
+
1730
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1731
+ expect do
1732
+ VirtFS::VFile.truncate("nonexistent_file", 0)
1733
+ end.to raise_error(
1734
+ Errno::ENOENT, /No such file or directory/
1735
+ )
1736
+ end
1737
+
1738
+ it "should return 0" do
1739
+ expect(VirtFS::VFile.truncate(@full_path, 5)).to eq(0)
1740
+ end
1741
+
1742
+ it "should raise truncate the file to the specified size" do
1743
+ tsize = @data1.bytesize/2
1744
+ expect(VfsRealFile.size(@full_path)).to_not eq(tsize)
1745
+ VirtFS::VFile.truncate(@full_path, tsize)
1746
+ expect(VfsRealFile.size(@full_path)).to eq(tsize)
1747
+ end
1748
+ end
1749
+ end
1750
+
1751
+ describe ".utime" do
1752
+ before(:each) do
1753
+ @time = Time.new(2015, 9, 12, 9, 50)
1754
+ end
1755
+
1756
+ context "with no filesystems mounted" do
1757
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1758
+ expect do
1759
+ VirtFS::VFile.utime(@time, @time, "nonexistent_file")
1760
+ end.to raise_error(
1761
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1762
+ )
1763
+ end
1764
+
1765
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1766
+ expect do
1767
+ VirtFS::VFile.utime(@time, @time, @full_path)
1768
+ end.to raise_error(
1769
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1770
+ )
1771
+ end
1772
+ end
1773
+
1774
+ context "with FS mounted on '/'" do
1775
+ before(:each) do
1776
+ @native_fs = nativefs_class.new
1777
+ VirtFS.mount(@native_fs, @root)
1778
+ end
1779
+
1780
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1781
+ expect do
1782
+ VirtFS::VFile.utime(@time, @time, "nonexistent_file")
1783
+ end.to raise_error(
1784
+ Errno::ENOENT, /No such file or directory/
1785
+ )
1786
+ end
1787
+
1788
+ it "should set the atime and mtime of the file, given a full path" do
1789
+ expect(VirtFS::VFile.utime(@time, @time, @full_path)).to eq(1)
1790
+ expect(VirtFS::VFile.atime(@full_path)).to eq(@time)
1791
+ expect(VirtFS::VFile.mtime(@full_path)).to eq(@time)
1792
+ end
1793
+
1794
+ it "should set the atime and mtime of the file, given relative path" do
1795
+ VfsRealDir.chdir(@parent_dir) do
1796
+ VirtFS.dir_chdir(@parent_dir)
1797
+ expect(VirtFS::VFile.utime(@time, @time, @rel_path)).to eq(1)
1798
+ expect(VirtFS::VFile.atime(@full_path)).to eq(@time)
1799
+ expect(VirtFS::VFile.mtime(@full_path)).to eq(@time)
1800
+ end
1801
+ end
1802
+ end
1803
+ end
1804
+
1805
+ describe ".world_readable?" do
1806
+ context "with no filesystems mounted" do
1807
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1808
+ expect do
1809
+ VirtFS::VFile.world_readable?("nonexistent_file")
1810
+ end.to raise_error(
1811
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1812
+ )
1813
+ end
1814
+
1815
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1816
+ expect do
1817
+ VirtFS::VFile.world_readable?(@full_path)
1818
+ end.to raise_error(
1819
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1820
+ )
1821
+ end
1822
+ end
1823
+
1824
+ context "with FS mounted on '/'" do
1825
+ before(:each) do
1826
+ @native_fs = nativefs_class.new
1827
+ VirtFS.mount(@native_fs, @root)
1828
+ end
1829
+
1830
+ it "should return nil when given a nonexistent file" do
1831
+ expect(VirtFS::VFile.world_readable?("nonexistent_file")).to eq(nil)
1832
+ end
1833
+
1834
+ it "should return nil when given a non-world-readable file" do
1835
+ VfsRealFile.chmod(0773, @full_path)
1836
+ expect(VirtFS::VFile.world_readable?(@full_path)).to eq(nil)
1837
+ end
1838
+
1839
+ it "should return permission bits when given a world-readable file" do
1840
+ VfsRealFile.chmod(0004, @full_path)
1841
+ expect(VirtFS::VFile.world_readable?(@full_path)).to eq(0004)
1842
+ end
1843
+ end
1844
+ end
1845
+
1846
+ describe ".world_writable?" do
1847
+ context "with no filesystems mounted" do
1848
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1849
+ expect do
1850
+ VirtFS::VFile.world_writable?("nonexistent_file")
1851
+ end.to raise_error(
1852
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1853
+ )
1854
+ end
1855
+
1856
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1857
+ expect do
1858
+ VirtFS::VFile.world_writable?(@full_path)
1859
+ end.to raise_error(
1860
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1861
+ )
1862
+ end
1863
+ end
1864
+
1865
+ context "with FS mounted on '/'" do
1866
+ before(:each) do
1867
+ @native_fs = nativefs_class.new
1868
+ VirtFS.mount(@native_fs, @root)
1869
+ end
1870
+
1871
+ it "should return nil when given a nonexistent file" do
1872
+ expect(VirtFS::VFile.world_writable?("nonexistent_file")).to eq(nil)
1873
+ end
1874
+
1875
+ it "should return nil when given a non-world_writable file" do
1876
+ VfsRealFile.chmod(0775, @full_path)
1877
+ expect(VirtFS::VFile.world_writable?(@full_path)).to eq(nil)
1878
+ end
1879
+
1880
+ it "should return permission bits when given a world_writable file" do
1881
+ VfsRealFile.chmod(0002, @full_path)
1882
+ expect(VirtFS::VFile.world_writable?(@full_path)).to eq(0002)
1883
+ end
1884
+ end
1885
+ end
1886
+
1887
+ describe ".writable?" do
1888
+ context "with no filesystems mounted" do
1889
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1890
+ expect do
1891
+ VirtFS::VFile.writable?("nonexistent_file")
1892
+ end.to raise_error(
1893
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1894
+ )
1895
+ end
1896
+
1897
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1898
+ expect do
1899
+ VirtFS::VFile.writable?(@full_path)
1900
+ end.to raise_error(
1901
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1902
+ )
1903
+ end
1904
+ end
1905
+
1906
+ context "with FS mounted on '/'" do
1907
+ before(:each) do
1908
+ @native_fs = nativefs_class.new
1909
+ VirtFS.mount(@native_fs, @root)
1910
+ end
1911
+
1912
+ it "should return false when given a nonexistent file" do
1913
+ expect(VirtFS::VFile.writable?("nonexistent_file")).to be false
1914
+ end
1915
+
1916
+ #
1917
+ # NOTE: This test fails when run under Fusion shared folders.
1918
+ # Could be due to silent failure of chmod.
1919
+ #
1920
+ it "should return false when given a non-writable file" do
1921
+ VfsRealFile.chmod(0500, @full_path)
1922
+ expect(VirtFS::VFile.writable?(@full_path)).to be false
1923
+ end
1924
+
1925
+ it "should return true when given a writable file" do
1926
+ VfsRealFile.chmod(0200, @full_path)
1927
+ expect(VirtFS::VFile.writable?(@full_path)).to be true
1928
+ end
1929
+ end
1930
+ end
1931
+
1932
+ describe ".writable_real?" do
1933
+ context "with no filesystems mounted" do
1934
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1935
+ expect do
1936
+ VirtFS::VFile.writable_real?("nonexistent_file")
1937
+ end.to raise_error(
1938
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1939
+ )
1940
+ end
1941
+
1942
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1943
+ expect do
1944
+ VirtFS::VFile.writable_real?(@full_path)
1945
+ end.to raise_error(
1946
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1947
+ )
1948
+ end
1949
+ end
1950
+
1951
+ context "with FS mounted on '/'" do
1952
+ before(:each) do
1953
+ @native_fs = nativefs_class.new
1954
+ VirtFS.mount(@native_fs, @root)
1955
+ end
1956
+
1957
+ it "should return false when given a nonexistent file" do
1958
+ expect(VirtFS::VFile.writable_real?("nonexistent_file")).to be false
1959
+ end
1960
+
1961
+ #
1962
+ # NOTE: This test fails when run under Fusion shared folders.
1963
+ # Could be due to silent failure of chmod.
1964
+ #
1965
+ it "should return false when given a non-writable file" do
1966
+ VfsRealFile.chmod(0500, @full_path)
1967
+ expect(VirtFS::VFile.writable_real?(@full_path)).to be false
1968
+ end
1969
+
1970
+ it "should return true when given a writable file" do
1971
+ VfsRealFile.chmod(0200, @full_path)
1972
+ expect(VirtFS::VFile.writable_real?(@full_path)).to be true
1973
+ end
1974
+ end
1975
+ end
1976
+
1977
+ describe ".zero?" do
1978
+ context "with no filesystems mounted" do
1979
+ it "should raise Errno::ENOENT when given a nonexistent file" do
1980
+ expect do
1981
+ VirtFS::VFile.zero?("nonexistent_file")
1982
+ end.to raise_error(
1983
+ Errno::ENOENT, "No such file or directory - nonexistent_file"
1984
+ )
1985
+ end
1986
+
1987
+ it "should raise Errno::ENOENT when given a file that exists in the native FS" do
1988
+ expect do
1989
+ VirtFS::VFile.zero?(@full_path)
1990
+ end.to raise_error(
1991
+ Errno::ENOENT, "No such file or directory - #{@full_path}"
1992
+ )
1993
+ end
1994
+ end
1995
+
1996
+ context "with FS mounted on '/'" do
1997
+ before(:each) do
1998
+ @native_fs = nativefs_class.new
1999
+ VirtFS.mount(@native_fs, @root)
2000
+ end
2001
+
2002
+ it "should return false when given a nonexistent file" do
2003
+ expect(VirtFS::VFile.zero?("nonexistent_file")).to be false
2004
+ end
2005
+
2006
+ it "should return false when given a non-zero length file" do
2007
+ expect(VirtFS::VFile.zero?(@full_path)).to be false
2008
+ end
2009
+
2010
+ it "should return true when given a zero length file" do
2011
+ expect(VirtFS::VFile.zero?(@full_path2)).to be true
2012
+ end
2013
+ end
2014
+ end
2015
+
2016
+ describe ".new" do
2017
+ context "with no filesystems mounted" do
2018
+ it "should raise Errno::ENOENT when the file doesn't exist" do
2019
+ expect do
2020
+ VirtFS::VFile.new("not_a_file")
2021
+ end.to raise_error(
2022
+ Errno::ENOENT, "No such file or directory - not_a_file"
2023
+ )
2024
+ end
2025
+
2026
+ it "should raise Errno::ENOENT the file does exist in the native FS" do
2027
+ expect do
2028
+ VirtFS::VFile.new(@full_path)
2029
+ end.to raise_error(
2030
+ Errno::ENOENT, /No such file or directory -/
2031
+ )
2032
+ end
2033
+ end
2034
+
2035
+ context "with FS mounted on '/'" do
2036
+ before(:each) do
2037
+ @native_fs = nativefs_class.new
2038
+ VirtFS.mount(@native_fs, @root)
2039
+ end
2040
+
2041
+ it "should raise Errno::ENOENT when the file doesn't exist" do
2042
+ expect do
2043
+ VirtFS::VFile.new("not_a_file")
2044
+ end.to raise_error(
2045
+ Errno::ENOENT, /No such file or directory/
2046
+ )
2047
+ end
2048
+
2049
+ it "should return a File object - given full path" do
2050
+ expect(VirtFS::VFile.new(@full_path)).to be_kind_of(VirtFS::VFile)
2051
+ end
2052
+
2053
+ it "should return a directory object - given relative path" do
2054
+ VirtFS::VDir.chdir(@parent_dir)
2055
+ expect(VirtFS::VFile.new(@rel_path)).to be_kind_of(VirtFS::VFile)
2056
+ end
2057
+ end
2058
+ end
2059
+
2060
+ describe ".open" do
2061
+ context "with no filesystems mounted" do
2062
+ it "should raise Errno::ENOENT when file doesn't exist" do
2063
+ expect do
2064
+ VirtFS::VFile.open("not_a_file")
2065
+ end.to raise_error(
2066
+ Errno::ENOENT, "No such file or directory - not_a_file"
2067
+ )
2068
+ end
2069
+
2070
+ it "should raise Errno::ENOENT file does exist in the native FS" do
2071
+ expect do
2072
+ VirtFS::VFile.open(@full_path)
2073
+ end.to raise_error(
2074
+ Errno::ENOENT, /No such file or directory -/
2075
+ )
2076
+ end
2077
+ end
2078
+
2079
+ context "with FS mounted on '/'" do
2080
+ before(:each) do
2081
+ @native_fs = nativefs_class.new
2082
+ VirtFS.mount(@native_fs, @root)
2083
+ end
2084
+
2085
+ it "should raise Errno::ENOENT when file doesn't exist" do
2086
+ expect do
2087
+ VirtFS::VFile.new("not_a_file")
2088
+ end.to raise_error(
2089
+ Errno::ENOENT, /No such file or directory/
2090
+ )
2091
+ end
2092
+
2093
+ it "should return a File object - when no block given" do
2094
+ expect(VirtFS::VFile.open(@full_path)).to be_kind_of(VirtFS::VFile)
2095
+ end
2096
+
2097
+ it "should yield a file object to the block - when block given" do
2098
+ VirtFS::VFile.open(@full_path) { |file_obj| expect(file_obj).to be_kind_of(VirtFS::VFile) }
2099
+ end
2100
+
2101
+ it "should return the value of the block - when block given" do
2102
+ expect(VirtFS::VFile.open(@full_path) { true }).to be true
2103
+ end
2104
+ end
2105
+ end
2106
+ end