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.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +154 -0
- data/Rakefile +5 -0
- data/lib/virtfs-nativefs-thick.rb +1 -0
- data/lib/virtfs-nativefs-thin.rb +1 -0
- data/lib/virtfs.rb +38 -0
- data/lib/virtfs/activation.rb +97 -0
- data/lib/virtfs/block_io.rb +140 -0
- data/lib/virtfs/byte_range.rb +71 -0
- data/lib/virtfs/context.rb +300 -0
- data/lib/virtfs/context_manager.rb +175 -0
- data/lib/virtfs/context_switch_class_methods.rb +96 -0
- data/lib/virtfs/delegate_module.rb +40 -0
- data/lib/virtfs/dir_instance_delegate.rb +3 -0
- data/lib/virtfs/exception.rb +13 -0
- data/lib/virtfs/file_instance_delegate.rb +3 -0
- data/lib/virtfs/file_modes_and_options.rb +293 -0
- data/lib/virtfs/find_class_methods.rb +106 -0
- data/lib/virtfs/io_buffer.rb +133 -0
- data/lib/virtfs/io_instance_delegate.rb +3 -0
- data/lib/virtfs/kernel.rb +146 -0
- data/lib/virtfs/nativefs/thick.rb +30 -0
- data/lib/virtfs/nativefs/thick/dir_class_methods.rb +38 -0
- data/lib/virtfs/nativefs/thick/file_class_methods.rb +178 -0
- data/lib/virtfs/nativefs/thin.rb +32 -0
- data/lib/virtfs/nativefs/thin/dir.rb +30 -0
- data/lib/virtfs/nativefs/thin/dir_class_methods.rb +41 -0
- data/lib/virtfs/nativefs/thin/file.rb +112 -0
- data/lib/virtfs/nativefs/thin/file_class_methods.rb +181 -0
- data/lib/virtfs/protofs/protofs.rb +7 -0
- data/lib/virtfs/protofs/protofs_base.rb +12 -0
- data/lib/virtfs/protofs/protofs_dir.rb +13 -0
- data/lib/virtfs/protofs/protofs_dir_class.rb +31 -0
- data/lib/virtfs/protofs/protofs_file.rb +27 -0
- data/lib/virtfs/protofs/protofs_file_class.rb +136 -0
- data/lib/virtfs/stat.rb +100 -0
- data/lib/virtfs/thin_dir_delegator.rb +79 -0
- data/lib/virtfs/thin_file_delegator.rb +77 -0
- data/lib/virtfs/thin_io_delegator_methods.rb +301 -0
- data/lib/virtfs/thin_io_delegator_methods_bufferio.rb +337 -0
- data/lib/virtfs/v_dir.rb +238 -0
- data/lib/virtfs/v_file.rb +480 -0
- data/lib/virtfs/v_io.rb +243 -0
- data/lib/virtfs/v_pathname.rb +128 -0
- data/lib/virtfs/version.rb +3 -0
- data/spec/activate_spec.rb +202 -0
- data/spec/chroot_spec.rb +120 -0
- data/spec/context_manager_class_spec.rb +246 -0
- data/spec/context_manager_instance_spec.rb +255 -0
- data/spec/context_spec.rb +335 -0
- data/spec/data/UTF-16LE-data.txt +0 -0
- data/spec/data/UTF-8-data.txt +212 -0
- data/spec/dir_class_spec.rb +506 -0
- data/spec/dir_instance_spec.rb +208 -0
- data/spec/file_class_spec.rb +2106 -0
- data/spec/file_instance_spec.rb +154 -0
- data/spec/file_modes_and_options_spec.rb +1556 -0
- data/spec/find_spec.rb +142 -0
- data/spec/io_bufferio_size_shared_examples.rb +371 -0
- data/spec/io_bufferio_size_spec.rb +861 -0
- data/spec/io_bufferio_spec.rb +801 -0
- data/spec/io_class_spec.rb +145 -0
- data/spec/io_instance_spec.rb +516 -0
- data/spec/kernel_spec.rb +285 -0
- data/spec/mount_spec.rb +186 -0
- data/spec/nativefs_local_root_spec.rb +132 -0
- data/spec/path_spec.rb +39 -0
- data/spec/spec_helper.rb +126 -0
- data/tasks/rspec.rake +3 -0
- data/tasks/yard.rake +7 -0
- data/test/UTF-8-demo.txt +212 -0
- data/test/bench.rb +18 -0
- data/test/bio_internal_test.rb +45 -0
- data/test/delegate_io.rb +31 -0
- data/test/delegate_module.rb +62 -0
- data/test/encode_test.rb +42 -0
- data/test/enoent_test.rb +30 -0
- data/test/namespace_test.rb +42 -0
- data/test/read_block_valid_encoding.rb +44 -0
- data/test/read_test.rb +78 -0
- data/test/stream_readers.rb +46 -0
- data/test/utf-16-demo.txt +0 -0
- data/test/utf8_to_utf16.rb +77 -0
- data/test/wrapper_test.rb +34 -0
- data/virtfs.gemspec +29 -0
- metadata +230 -0
@@ -0,0 +1,506 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
describe VirtFS::VDir, "(#{$fs_interface} interface)" do
|
5
|
+
before(:all) do
|
6
|
+
@full_path = File.expand_path(__FILE__)
|
7
|
+
@rel_path = File.basename(@full_path)
|
8
|
+
@spec_dir = File.dirname(@full_path)
|
9
|
+
@this_dir = VfsRealDir.getwd
|
10
|
+
@root = File::SEPARATOR
|
11
|
+
end
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
reset_context
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ".[]" do
|
18
|
+
context "with no filesystems mounted" do
|
19
|
+
it "should return empty array when in a nonexistent directory" do
|
20
|
+
VirtFS.cwd = "/not_a_dir" # bypass existence checks.
|
21
|
+
expect(VirtFS::VDir["*"]).to match_array([])
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return empty array when in a directory that exists in the native FS" do
|
25
|
+
VirtFS.cwd = @this_dir # bypass existence checks.
|
26
|
+
expect(VirtFS::VDir["*"]).to match_array([])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "with FS mounted on '/'" do
|
31
|
+
before(:each) do
|
32
|
+
@native_fs = nativefs_class.new
|
33
|
+
VirtFS.mount(@native_fs, @root)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return empty array when in a nonexistent directory" do
|
37
|
+
VirtFS.cwd = "/not_a_dir" # bypass existence checks.
|
38
|
+
expect(VirtFS::VDir["*"]).to match_array([])
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should enumerate the same file names as the standard Dir.glob - simple glob" do
|
42
|
+
VfsRealDir.chdir(@this_dir) do # for VfsRealDir.glob
|
43
|
+
VirtFS.dir_chdir(@this_dir)
|
44
|
+
expect(VirtFS::VDir["*"]).to match_array(VfsRealDir["*"])
|
45
|
+
expect(VirtFS::VDir["*/*.rb"]).to match_array(VfsRealDir["*/*.rb"])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should enumerate the same file names as the standard Dir.glob - relative glob" do
|
50
|
+
VfsRealDir.chdir(@spec_dir) do # for VfsRealDir.glob
|
51
|
+
VirtFS.dir_chdir(@spec_dir)
|
52
|
+
expect(VirtFS::VDir["../**/*.rb"] - VfsRealDir["../**/*.rb"]).to match_array([])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe ".chdir" do
|
59
|
+
context "with no filesystems mounted" do
|
60
|
+
it "should raise Errno::ENOENT when given a nonexistent directory" do
|
61
|
+
expect do
|
62
|
+
VirtFS::VDir.chdir("nonexistent_directory")
|
63
|
+
end.to raise_error(
|
64
|
+
Errno::ENOENT, "No such file or directory - nonexistent_directory"
|
65
|
+
)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should raise Errno::ENOENT when given a directory that exists in the native FS" do
|
69
|
+
expect do
|
70
|
+
VirtFS::VDir.chdir(@this_dir)
|
71
|
+
end.to raise_error(
|
72
|
+
Errno::ENOENT, "No such file or directory - #{@this_dir}"
|
73
|
+
)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "with FS mounted on '/'" do
|
78
|
+
before(:each) do
|
79
|
+
@native_fs = nativefs_class.new
|
80
|
+
VirtFS.mount(@native_fs, @root)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should raise Errno::ENOENT when directory doesn't exist" do
|
84
|
+
expect do
|
85
|
+
VirtFS::VDir.chdir("nonexistent_directory")
|
86
|
+
end.to raise_error(
|
87
|
+
Errno::ENOENT, "No such file or directory - nonexistent_directory"
|
88
|
+
)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should return 0 when no block given" do
|
92
|
+
expect(VirtFS::VDir.chdir(@this_dir)).to eq(0)
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should return last object of block, when block given" do
|
96
|
+
expect(VirtFS::VDir.chdir(@this_dir) { true }).to be true
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should yield the new current directory to the block" do
|
100
|
+
expect(VirtFS::VDir.chdir(@this_dir) { |path| path == @this_dir }).to be true
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should change to the home directory when called without an argument" do
|
104
|
+
VirtFS::VDir.chdir
|
105
|
+
expect(VirtFS::VDir.getwd).to eq(VfsRealDir.home)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe ".delete .rmdir .unlink" do
|
111
|
+
context "with no filesystems mounted" do
|
112
|
+
it "should raise Errno::ENOENT when parent doesn't exist" do
|
113
|
+
expect do
|
114
|
+
VirtFS.cwd = "/not_a_dir" # bypass existence checks.
|
115
|
+
VirtFS::VDir.delete("foo.d")
|
116
|
+
end.to raise_error(
|
117
|
+
Errno::ENOENT, "No such file or directory - /not_a_dir"
|
118
|
+
)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should raise Errno::ENOENT parent does exist in the native FS" do
|
122
|
+
expect do
|
123
|
+
VirtFS.cwd = @this_dir # bypass existence checks.
|
124
|
+
VirtFS::VDir.delete("foo.d")
|
125
|
+
end.to raise_error(
|
126
|
+
Errno::ENOENT, /No such file or directory -/
|
127
|
+
)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context "with FS mounted on '/'" do
|
132
|
+
before(:each) do
|
133
|
+
@native_fs = nativefs_class.new
|
134
|
+
VirtFS.mount(@native_fs, @root)
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should raise Errno::ENOENT when directory does exist in the native FS" do
|
138
|
+
expect do
|
139
|
+
VirtFS::VDir.delete("/not_a_dir/foo.d")
|
140
|
+
end.to raise_error(
|
141
|
+
Errno::ENOENT, /No such file or directory/
|
142
|
+
)
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should delete the directory - given full path" do
|
146
|
+
VfsRealDir.mktmpdir("vfs_spec_tmp-") do |parent_dir|
|
147
|
+
dir_path = VfsRealFile.join(parent_dir, "foo.d")
|
148
|
+
expect(VirtFS::VDir.mkdir(dir_path)).to eq(0)
|
149
|
+
expect(VfsRealDir.exist?(dir_path)).to be true
|
150
|
+
expect(VirtFS::VDir.delete(dir_path)).to eq(0)
|
151
|
+
expect(VfsRealDir.exist?(dir_path)).to be false
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
it "should delete the directory - given relative path" do
|
156
|
+
VfsRealDir.mktmpdir("vfs_spec_tmp-") do |parent_dir|
|
157
|
+
dir_path = VfsRealFile.join(parent_dir, "foo.d")
|
158
|
+
VirtFS::VDir.chdir(parent_dir)
|
159
|
+
expect(VirtFS::VDir.mkdir("foo.d")).to eq(0)
|
160
|
+
expect(VfsRealDir.exist?(dir_path)).to be true
|
161
|
+
expect(VirtFS::VDir.delete("foo.d")).to eq(0)
|
162
|
+
expect(VfsRealDir.exist?(dir_path)).to be false
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe ".entries" do
|
169
|
+
context "with no filesystems mounted" do
|
170
|
+
it "should raise Errno::ENOENT when given a nonexistent directory" do
|
171
|
+
expect do
|
172
|
+
VirtFS::VDir.entries("nonexistent_directory")
|
173
|
+
end.to raise_error(
|
174
|
+
Errno::ENOENT, "No such file or directory - nonexistent_directory"
|
175
|
+
)
|
176
|
+
end
|
177
|
+
|
178
|
+
it "should raise Errno::ENOENT when given a directory that exists in the native FS" do
|
179
|
+
expect do
|
180
|
+
VirtFS::VDir.entries(@this_dir)
|
181
|
+
end.to raise_error(
|
182
|
+
Errno::ENOENT, "No such file or directory - #{@this_dir}"
|
183
|
+
)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
context "with FS mounted on #{@root}" do
|
188
|
+
before(:each) do
|
189
|
+
@native_fs = nativefs_class.new
|
190
|
+
VirtFS.mount(@native_fs, @root)
|
191
|
+
VirtFS.dir_chdir(@this_dir)
|
192
|
+
end
|
193
|
+
|
194
|
+
it "should raise Errno::ENOENT when given a nonexistent directory" do
|
195
|
+
expect do
|
196
|
+
VirtFS::VDir.entries("nonexistent_directory")
|
197
|
+
end.to raise_error(
|
198
|
+
Errno::ENOENT, /No such file or directory/
|
199
|
+
)
|
200
|
+
end
|
201
|
+
|
202
|
+
it "should, given full path, return the same file names as the real Dir.entries" do
|
203
|
+
expect(VirtFS::VDir.entries(@this_dir)).to eq(VfsRealDir.entries(@this_dir))
|
204
|
+
end
|
205
|
+
|
206
|
+
it "should, given relative path, return the same file names as the real Dir.entries" do
|
207
|
+
expect(VirtFS::VDir.entries(".")).to eq(VfsRealDir.entries("."))
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
describe ".exist? .exists?" do
|
213
|
+
context "with no filesystems mounted" do
|
214
|
+
it "should return false when given a nonexistent directory" do
|
215
|
+
expect(VirtFS::VDir.exist?("nonexistent_directory")).to be false
|
216
|
+
end
|
217
|
+
|
218
|
+
it "should return false when given a directory that exists in the native FS" do
|
219
|
+
expect(VirtFS::VDir.exist?(@this_dir)).to be false
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
context "with FS mounted on #{@root}" do
|
224
|
+
before(:each) do
|
225
|
+
@native_fs = nativefs_class.new
|
226
|
+
VirtFS.mount(@native_fs, @root)
|
227
|
+
VirtFS.dir_chdir(@this_dir)
|
228
|
+
end
|
229
|
+
|
230
|
+
it "should, given full path, return true for this directory" do
|
231
|
+
expect(VirtFS::VDir.exist?(@this_dir)).to be true
|
232
|
+
end
|
233
|
+
|
234
|
+
it "should, given relative path, return true for this directory" do
|
235
|
+
expect(VirtFS::VDir.exist?(".")).to be true
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
describe ".foreach" do
|
241
|
+
context "with no filesystems mounted" do
|
242
|
+
it "should raise Errno::ENOENT when given a nonexistent directory" do
|
243
|
+
expect do
|
244
|
+
VirtFS::VDir.foreach("nonexistent_directory")
|
245
|
+
end.to raise_error(
|
246
|
+
Errno::ENOENT, "No such file or directory - nonexistent_directory"
|
247
|
+
)
|
248
|
+
end
|
249
|
+
|
250
|
+
it "should raise Errno::ENOENT when given a directory that exists in the native FS" do
|
251
|
+
expect do
|
252
|
+
VirtFS::VDir.foreach(@this_dir)
|
253
|
+
end.to raise_error(
|
254
|
+
Errno::ENOENT, "No such file or directory - #{@this_dir}"
|
255
|
+
)
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
context "with FS mounted on #{@root}" do
|
260
|
+
before(:each) do
|
261
|
+
@native_fs = nativefs_class.new
|
262
|
+
VirtFS.mount(@native_fs, @root)
|
263
|
+
VirtFS.dir_chdir(@this_dir)
|
264
|
+
end
|
265
|
+
|
266
|
+
it "should raise Errno::ENOENT when given a nonexistent directory" do
|
267
|
+
expect do
|
268
|
+
VirtFS::VDir.foreach("nonexistent_directory").to_a
|
269
|
+
end.to raise_error(
|
270
|
+
Errno::ENOENT, /No such file or directory/
|
271
|
+
)
|
272
|
+
end
|
273
|
+
|
274
|
+
it "should return an enum when no block is given" do
|
275
|
+
expect(VirtFS::VDir.foreach(@this_dir)).to be_kind_of(Enumerator)
|
276
|
+
end
|
277
|
+
|
278
|
+
it "should return nil when block is given" do
|
279
|
+
expect(VirtFS::VDir.foreach(@this_dir) { |f| f }).to be_nil
|
280
|
+
end
|
281
|
+
|
282
|
+
it "should, given full path, return the same file names as the real Dir.foreach" do
|
283
|
+
expect(VirtFS::VDir.foreach(@this_dir).to_a).to eq(VfsRealDir.foreach(@this_dir).to_a)
|
284
|
+
end
|
285
|
+
|
286
|
+
it "should, given relative path, return the same file names as the real Dir.foreach" do
|
287
|
+
expect(VirtFS::VDir.foreach(".").to_a).to eq(VfsRealDir.foreach(".").to_a)
|
288
|
+
end
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
describe ".getwd .pwd" do
|
293
|
+
it "should default to '#{@root}'" do
|
294
|
+
expect(VirtFS::VDir.getwd).to eq(@root)
|
295
|
+
end
|
296
|
+
|
297
|
+
it "return the value set by VirtFS.dir_chdir" do
|
298
|
+
VirtFS.cwd = @this_dir
|
299
|
+
expect(VirtFS::VDir.getwd).to eq(@this_dir)
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
describe ".glob" do
|
304
|
+
context "with no filesystems mounted" do
|
305
|
+
it "should return empty array when in a nonexistent directory" do
|
306
|
+
VirtFS.cwd = "/not_a_dir" # bypass existence checks.
|
307
|
+
expect(VirtFS::VDir.glob("*")).to match_array([])
|
308
|
+
end
|
309
|
+
|
310
|
+
it "should return empty array when in a directory that exists in the native FS" do
|
311
|
+
VirtFS.cwd = @this_dir # bypass existence checks.
|
312
|
+
expect(VirtFS::VDir.glob("*")).to match_array([])
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
context "with FS mounted on '/'" do
|
317
|
+
before(:each) do
|
318
|
+
@native_fs = nativefs_class.new
|
319
|
+
VirtFS.mount(@native_fs, @root)
|
320
|
+
end
|
321
|
+
|
322
|
+
it "should return empty array when in a nonexistent directory" do
|
323
|
+
VirtFS.cwd = "/not_a_dir" # bypass existence checks.
|
324
|
+
expect(VirtFS::VDir.glob("*")).to match_array([])
|
325
|
+
end
|
326
|
+
|
327
|
+
it "should enumerate the same file names as the standard Dir.glob - simple glob" do
|
328
|
+
VfsRealDir.chdir(@this_dir) do # for VfsRealDir.glob
|
329
|
+
VirtFS.dir_chdir(@this_dir)
|
330
|
+
expect(VirtFS::VDir.glob("*")).to match_array(VfsRealDir.glob("*"))
|
331
|
+
expect(VirtFS::VDir.glob("*/*.rb")).to match_array(VfsRealDir.glob("*/*.rb"))
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
it "should enumerate the same file names as the standard Dir.glob - relative glob" do
|
336
|
+
VfsRealDir.chdir(@spec_dir) do # for VfsRealDir.glob
|
337
|
+
VirtFS.dir_chdir(@spec_dir)
|
338
|
+
expect(VirtFS::VDir.glob("../**/*.rb") - VfsRealDir.glob("../**/*.rb")).to match_array([])
|
339
|
+
end
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
describe ".home" do
|
345
|
+
before(:each) do
|
346
|
+
@native_fs = nativefs_class.new
|
347
|
+
VirtFS.mount(@native_fs, @root)
|
348
|
+
end
|
349
|
+
|
350
|
+
it "should return the home directory of the current user, when called without an argument" do
|
351
|
+
expect(VirtFS::VDir.home).to eq(VfsRealDir.home)
|
352
|
+
end
|
353
|
+
|
354
|
+
it "should return the home directory of the given user" do
|
355
|
+
expect(VirtFS::VDir.home("root")).to eq(VfsRealDir.home("root"))
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
describe ".mkdir" do
|
360
|
+
context "with no filesystems mounted" do
|
361
|
+
it "should raise Errno::ENOENT when parent doesn't exist" do
|
362
|
+
expect do
|
363
|
+
VirtFS.cwd = "/not_a_dir" # bypass existence checks.
|
364
|
+
VirtFS::VDir.mkdir("foo.d")
|
365
|
+
end.to raise_error(
|
366
|
+
Errno::ENOENT, "No such file or directory - /not_a_dir"
|
367
|
+
)
|
368
|
+
end
|
369
|
+
|
370
|
+
it "should raise Errno::ENOENT parent does exist in the native FS" do
|
371
|
+
expect do
|
372
|
+
VirtFS.cwd = @this_dir # bypass existence checks.
|
373
|
+
VirtFS::VDir.mkdir("foo.d")
|
374
|
+
end.to raise_error(
|
375
|
+
Errno::ENOENT, /No such file or directory -/
|
376
|
+
)
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
context "with FS mounted on '/'" do
|
381
|
+
before(:each) do
|
382
|
+
@native_fs = nativefs_class.new
|
383
|
+
VirtFS.mount(@native_fs, @root)
|
384
|
+
end
|
385
|
+
|
386
|
+
it "should raise Errno::ENOENT when parent does exist in the native FS" do
|
387
|
+
expect do
|
388
|
+
VirtFS::VDir.mkdir("/not_a_dir/foo.d")
|
389
|
+
end.to raise_error(
|
390
|
+
Errno::ENOENT, /No such file or directory/
|
391
|
+
)
|
392
|
+
end
|
393
|
+
|
394
|
+
it "should create the directory in the parent directory - given full path" do
|
395
|
+
VfsRealDir.mktmpdir("vfs_spec_tmp-") do |parent_dir|
|
396
|
+
dir_path = VfsRealFile.join(parent_dir, "foo.d")
|
397
|
+
expect(VirtFS::VDir.mkdir(dir_path)).to eq(0)
|
398
|
+
expect(VfsRealDir.exist?(dir_path)).to be true
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
it "should create the directory in the parent directory - given relative path" do
|
403
|
+
VfsRealDir.mktmpdir("vfs_spec_tmp-") do |parent_dir|
|
404
|
+
dir_path = VfsRealFile.join(parent_dir, "foo.d")
|
405
|
+
VirtFS::VDir.chdir(parent_dir)
|
406
|
+
expect(VirtFS::VDir.mkdir("foo.d")).to eq(0)
|
407
|
+
expect(VfsRealDir.exist?(dir_path)).to be true
|
408
|
+
end
|
409
|
+
end
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
describe ".new" do
|
414
|
+
context "with no filesystems mounted" do
|
415
|
+
it "should raise Errno::ENOENT when directory doesn't exist" do
|
416
|
+
expect do
|
417
|
+
VirtFS::VDir.new("/not_a_dir")
|
418
|
+
end.to raise_error(
|
419
|
+
Errno::ENOENT, "No such file or directory - /not_a_dir"
|
420
|
+
)
|
421
|
+
end
|
422
|
+
|
423
|
+
it "should raise Errno::ENOENT directory does exist in the native FS" do
|
424
|
+
expect do
|
425
|
+
VirtFS::VDir.new(@this_dir)
|
426
|
+
end.to raise_error(
|
427
|
+
Errno::ENOENT, /No such file or directory -/
|
428
|
+
)
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
432
|
+
context "with FS mounted on '/'" do
|
433
|
+
before(:each) do
|
434
|
+
@native_fs = nativefs_class.new
|
435
|
+
VirtFS.mount(@native_fs, @root)
|
436
|
+
end
|
437
|
+
|
438
|
+
it "should raise Errno::ENOENT when directory doesn't exist" do
|
439
|
+
expect do
|
440
|
+
VirtFS::VDir.new("/not_a_dir")
|
441
|
+
end.to raise_error(
|
442
|
+
Errno::ENOENT, /No such file or directory/
|
443
|
+
)
|
444
|
+
end
|
445
|
+
|
446
|
+
it "should return a directory object - given full path" do
|
447
|
+
expect(VirtFS::VDir.new(@this_dir)).to be_kind_of(VirtFS::VDir)
|
448
|
+
end
|
449
|
+
|
450
|
+
it "should return a directory object - given relative path" do
|
451
|
+
VfsRealDir.mktmpdir("vfs_spec_tmp-") do |parent_dir|
|
452
|
+
VirtFS::VDir.chdir(parent_dir)
|
453
|
+
expect(VirtFS::VDir.mkdir("foo.d")).to eq(0)
|
454
|
+
expect(VirtFS::VDir.new("foo.d")).to be_kind_of(VirtFS::VDir)
|
455
|
+
end
|
456
|
+
end
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
460
|
+
describe ".open" do
|
461
|
+
context "with no filesystems mounted" do
|
462
|
+
it "should raise Errno::ENOENT when directory doesn't exist" do
|
463
|
+
expect do
|
464
|
+
VirtFS::VDir.open("/not_a_dir")
|
465
|
+
end.to raise_error(
|
466
|
+
Errno::ENOENT, "No such file or directory - /not_a_dir"
|
467
|
+
)
|
468
|
+
end
|
469
|
+
|
470
|
+
it "should raise Errno::ENOENT directory does exist in the native FS" do
|
471
|
+
expect do
|
472
|
+
VirtFS::VDir.open(@this_dir)
|
473
|
+
end.to raise_error(
|
474
|
+
Errno::ENOENT, /No such file or directory -/
|
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 raise Errno::ENOENT when directory doesn't exist" do
|
486
|
+
expect do
|
487
|
+
VirtFS::VDir.new("/not_a_dir")
|
488
|
+
end.to raise_error(
|
489
|
+
Errno::ENOENT, /No such file or directory/
|
490
|
+
)
|
491
|
+
end
|
492
|
+
|
493
|
+
it "should return a directory object - when no block given" do
|
494
|
+
expect(VirtFS::VDir.open(@this_dir)).to be_kind_of(VirtFS::VDir)
|
495
|
+
end
|
496
|
+
|
497
|
+
it "should yield a directory object to the block - when block given" do
|
498
|
+
VirtFS::VDir.open(@this_dir) { |dir_obj| expect(dir_obj).to be_kind_of(VirtFS::VDir) }
|
499
|
+
end
|
500
|
+
|
501
|
+
it "should return the value of the block - when block given" do
|
502
|
+
expect(VirtFS::VDir.open(@this_dir) { true }).to be true
|
503
|
+
end
|
504
|
+
end
|
505
|
+
end
|
506
|
+
end
|