virtfs 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,154 @@
1
+ require 'spec_helper'
2
+
3
+ describe VirtFS::VFile, "(#{$fs_interface} interface)" do
4
+ before(:all) do
5
+ @spec_name = VfsRealFile.basename(__FILE__, ".rb")
6
+ @temp_prefix = "#{@spec_name}-"
7
+
8
+ @ext = ".rb"
9
+ @data1 = "0123456789" * 4
10
+ @temp_file = Tempfile.new(["VirtFS-File", @ext])
11
+ @temp_file.write(@data1)
12
+ @temp_file.close
13
+ @full_path = @temp_file.path
14
+ @rel_path = File.basename(@full_path)
15
+ @parent_dir = File.dirname(@full_path)
16
+
17
+ @ext2 = ".c"
18
+ @temp_file2 = Tempfile.new(["VirtFS-File", @ext2])
19
+ @temp_file2.close
20
+ @full_path2 = @temp_file2.path
21
+ @rel_path2 = File.basename(@full_path2)
22
+ @parent_dir2 = File.dirname(@full_path2)
23
+
24
+ @slink_path = temp_name(@temp_prefix, ".symlink")
25
+
26
+ @root = File::SEPARATOR
27
+ @this_dir = VfsRealDir.getwd
28
+ end
29
+
30
+ before(:each) do
31
+ reset_context
32
+
33
+ @native_fs = nativefs_class.new
34
+ VirtFS.mount(@native_fs, @root)
35
+ end
36
+
37
+ describe "#atime" do
38
+ it "should return the same value as the standard File#atime method" do
39
+ VfsRealFile.open(@full_path) do |rf|
40
+ VirtFS::VFile.open(@full_path) { |vf| expect(vf.atime).to eq(rf.atime) }
41
+ end
42
+ end
43
+ end
44
+
45
+ describe "#chmod" do
46
+ it "should return 0" do
47
+ VirtFS::VFile.open(@full_path) do |vf|
48
+ expect(vf.chmod(0777)).to eq(0)
49
+ end
50
+ end
51
+
52
+ it "should change the permission bits on the file" do
53
+ target_mode = 0755
54
+ expect(VfsRealFile.stat(@full_path).mode & 0777).to_not eq(target_mode)
55
+ VirtFS::VFile.open(@full_path) do |vf|
56
+ expect(vf.chmod(target_mode)).to be_zero
57
+ end
58
+ expect(VfsRealFile.stat(@full_path).mode & 0777).to eq(target_mode)
59
+ end
60
+ end
61
+
62
+ describe "#chown" do
63
+ it "should return 0 on success" do
64
+ stat = VfsRealFile.stat(@full_path)
65
+
66
+ VirtFS::VFile.open(@full_path) do |vf|
67
+ expect(vf.chown(stat.uid, stat.gid)).to eq(0)
68
+ end
69
+ end
70
+ end
71
+
72
+ describe "#ctime" do
73
+ it "should return the same value as the standard File#ctime method" do
74
+ VfsRealFile.open(@full_path) do |rf|
75
+ VirtFS::VFile.open(@full_path) { |vf| expect(vf.ctime).to eq(rf.ctime) }
76
+ end
77
+ end
78
+ end
79
+
80
+ describe "#flock" do
81
+ it "should return 0" do
82
+ VirtFS::VFile.open(@full_path) do |vf|
83
+ expect(vf.flock(File::LOCK_EX)).to eq(0)
84
+ end
85
+ end
86
+ end
87
+
88
+ describe "#lstat" do
89
+ before(:each) do
90
+ VfsRealFile.symlink(@full_path, @slink_path)
91
+ end
92
+
93
+ after(:each) do
94
+ VfsRealFile.delete(@slink_path)
95
+ end
96
+
97
+ it "should return the stat information for the symlink" do
98
+ VirtFS::VFile.open(@slink_path) do |sl|
99
+ expect(sl.lstat.symlink?).to be true
100
+ end
101
+ end
102
+ end
103
+
104
+ describe "#mtime" do
105
+ it "should return the same value as the standard File#mtime method" do
106
+ VfsRealFile.open(@full_path) do |rf|
107
+ VirtFS::VFile.open(@full_path) { |vf| expect(vf.mtime).to eq(rf.mtime) }
108
+ end
109
+ end
110
+ end
111
+
112
+ describe "#path :to_path" do
113
+ it "should return full path when opened with full path" do
114
+ VirtFS::VFile.open(@full_path) { |f| expect(f.path).to eq(@full_path) }
115
+ end
116
+
117
+ it "should return relative path when opened with relative path" do
118
+ parent, target_file = VfsRealFile.split(@full_path)
119
+ VirtFS::VDir.chdir(parent)
120
+ VirtFS::VFile.open(target_file) { |f| expect(f.path).to eq(target_file) }
121
+ end
122
+ end
123
+
124
+ describe "#size" do
125
+ it "should return the known size of the file" do
126
+ VirtFS::VFile.open(@full_path) { |f| expect(f.size).to eq(@data1.bytesize) }
127
+ end
128
+
129
+ it "should return the same value as the standard File#size" do
130
+ VfsRealFile.open(@full_path) do |rf|
131
+ VirtFS::VFile.open(@full_path) { |vf| expect(vf.size).to eq(rf.size) }
132
+ end
133
+ end
134
+ end
135
+
136
+ describe "#truncate" do
137
+ it "should return 0" do
138
+ VirtFS::VFile.open(@full_path, "w") { |f| expect(f.truncate(5)).to eq(0) }
139
+ end
140
+
141
+ it "should raise IOError when file isn't open for writing" do
142
+ VirtFS::VFile.open(@full_path, "r") do |f|
143
+ expect { f.truncate(0) }.to raise_error(IOError, "not opened for writing")
144
+ end
145
+ end
146
+
147
+ it "should truncate the file to the specified size" do
148
+ tsize = @data1.bytesize / 2
149
+ expect(VfsRealFile.size(@full_path)).to_not eq(tsize)
150
+ VirtFS::VFile.open(@full_path, "w") { |f| f.truncate(tsize) }
151
+ expect(VfsRealFile.size(@full_path)).to eq(tsize)
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,1556 @@
1
+ require 'spec_helper'
2
+
3
+ #
4
+ # *args --> mode="r" <,permission> <,options>
5
+ # mode --> String or Integer
6
+ # permission --> Integer
7
+ # options --> Hash
8
+ #
9
+ # 1 arg: <mode | options>
10
+ # 2 args: mode, <permissions | options>
11
+ # 3 args: mode, permissions, options
12
+ #
13
+ # mode string --> file-mode[:external-encoding[:internal-encoding]]
14
+ #
15
+ # file-mode mapped to binary:
16
+ # "r" --> File::RDONLY
17
+ # "r+" --> File::RDWR
18
+ # "w" --> File::WRONLY | File::TRUNC | File::CREAT
19
+ # "w+" --> File::RDWR | File::TRUNC | File::CREAT
20
+ # "a" --> File::WRONLY | File::APPEND | File::CREAT
21
+ # "a+" --> File::RDWR | File::APPEND | File::CREAT
22
+ #
23
+ # Options:
24
+ # :autoclose => If false, the underlying file will not be closed
25
+ # when this I/O object is finalized.
26
+ #
27
+ # :binmode => Opens the IO object in binary mode if true (same as mode: "b").
28
+ #
29
+ # :encoding => Specifies both external and internal encodings
30
+ # as "external:internal" (same format used in mode parameter).
31
+ #
32
+ # :external_encoding => Specifies the external encoding.
33
+ #
34
+ # :internal_encoding => Specifies the internal encoding.
35
+ #
36
+ # :mode => Specifies what would have been the mode parameter.
37
+ #
38
+ # :textmode => Open the file in text mode (the default).
39
+ #
40
+ describe VirtFS::FileModesAndOptions, "(#{$fs_interface} interface)" do # rubocop:disable Style/GlobalVars
41
+ before(:each) do
42
+ reset_context
43
+ end
44
+
45
+ context "modes" do
46
+ context "default" do
47
+ before(:each) do
48
+ @fmo = VirtFS::FileModesAndOptions.new
49
+ end
50
+
51
+ describe "mode_bits" do
52
+ it "should return File::RDONLY" do
53
+ expect(@fmo.mode_bits).to eq(File::RDONLY)
54
+ end
55
+ end
56
+
57
+ describe "external_encoding" do
58
+ it "should return Encoding.default_external" do
59
+ expect(@fmo.external_encoding).to eq(Encoding.default_external)
60
+ end
61
+ end
62
+
63
+ describe "internal_encoding" do
64
+ it "should return Encoding.default_internal" do
65
+ expect(@fmo.internal_encoding).to eq(Encoding.default_internal)
66
+ end
67
+ end
68
+
69
+ describe "permissions" do
70
+ it "should return nil" do
71
+ expect(@fmo.permissions).to eq(nil)
72
+ end
73
+ end
74
+
75
+ describe "append?" do
76
+ it "should return false" do
77
+ expect(@fmo.append?).to be false
78
+ end
79
+ end
80
+
81
+ describe "binmode?" do
82
+ it "should return false" do
83
+ expect(@fmo.binmode?).to be false
84
+ end
85
+ end
86
+
87
+ describe "create?" do
88
+ it "should return false" do
89
+ expect(@fmo.create?).to be false
90
+ end
91
+ end
92
+
93
+ describe "excl?" do
94
+ it "should return false" do
95
+ expect(@fmo.excl?).to be false
96
+ end
97
+ end
98
+
99
+ describe "noctty?" do
100
+ it "should return false" do
101
+ expect(@fmo.noctty?).to be false
102
+ end
103
+ end
104
+
105
+ describe "nonblock?" do
106
+ it "should return false" do
107
+ expect(@fmo.nonblock?).to be false
108
+ end
109
+ end
110
+
111
+ describe "rdonly?" do
112
+ it "should return true" do
113
+ expect(@fmo.rdonly?).to be true
114
+ end
115
+ end
116
+
117
+ describe "rdwr?" do
118
+ it "should return false" do
119
+ expect(@fmo.rdwr?).to be false
120
+ end
121
+ end
122
+
123
+ describe "trunc?" do
124
+ it "should return false" do
125
+ expect(@fmo.trunc?).to be false
126
+ end
127
+ end
128
+
129
+ describe "wronly?" do
130
+ it "should return false" do
131
+ expect(@fmo.wronly?).to be false
132
+ end
133
+ end
134
+ end
135
+
136
+ context "default + binmode = 'b'" do
137
+ before(:each) do
138
+ @fmo = VirtFS::FileModesAndOptions.new("b")
139
+ end
140
+
141
+ describe "mode_bits" do
142
+ it "should return File::RDONLY" do
143
+ expect(@fmo.mode_bits).to eq(File::RDONLY)
144
+ end
145
+ end
146
+
147
+ describe "append?" do
148
+ it "should return false" do
149
+ expect(@fmo.append?).to be false
150
+ end
151
+ end
152
+
153
+ describe "binmode?" do
154
+ it "should return true" do
155
+ expect(@fmo.binmode?).to be true
156
+ end
157
+ end
158
+
159
+ describe "create?" do
160
+ it "should return false" do
161
+ expect(@fmo.create?).to be false
162
+ end
163
+ end
164
+
165
+ describe "excl?" do
166
+ it "should return false" do
167
+ expect(@fmo.excl?).to be false
168
+ end
169
+ end
170
+
171
+ describe "noctty?" do
172
+ it "should return false" do
173
+ expect(@fmo.noctty?).to be false
174
+ end
175
+ end
176
+
177
+ describe "nonblock?" do
178
+ it "should return false" do
179
+ expect(@fmo.nonblock?).to be false
180
+ end
181
+ end
182
+
183
+ describe "rdonly?" do
184
+ it "should return true" do
185
+ expect(@fmo.rdonly?).to be true
186
+ end
187
+ end
188
+
189
+ describe "rdwr?" do
190
+ it "should return false" do
191
+ expect(@fmo.rdwr?).to be false
192
+ end
193
+ end
194
+
195
+ describe "trunc?" do
196
+ it "should return false" do
197
+ expect(@fmo.trunc?).to be false
198
+ end
199
+ end
200
+
201
+ describe "wronly?" do
202
+ it "should return false" do
203
+ expect(@fmo.wronly?).to be false
204
+ end
205
+ end
206
+ end
207
+
208
+ context "read only = 'r'" do
209
+ before(:each) do
210
+ @fmo = VirtFS::FileModesAndOptions.new("r")
211
+ end
212
+
213
+ describe "mode_bits" do
214
+ it "should return File::RDONLY" do
215
+ expect(@fmo.mode_bits).to eq(File::RDONLY)
216
+ end
217
+ end
218
+
219
+ describe "append?" do
220
+ it "should return false" do
221
+ expect(@fmo.append?).to be false
222
+ end
223
+ end
224
+
225
+ describe "binmode?" do
226
+ it "should return false" do
227
+ expect(@fmo.binmode?).to be false
228
+ end
229
+ end
230
+
231
+ describe "create?" do
232
+ it "should return false" do
233
+ expect(@fmo.create?).to be false
234
+ end
235
+ end
236
+
237
+ describe "excl?" do
238
+ it "should return false" do
239
+ expect(@fmo.excl?).to be false
240
+ end
241
+ end
242
+
243
+ describe "noctty?" do
244
+ it "should return false" do
245
+ expect(@fmo.noctty?).to be false
246
+ end
247
+ end
248
+
249
+ describe "nonblock?" do
250
+ it "should return false" do
251
+ expect(@fmo.nonblock?).to be false
252
+ end
253
+ end
254
+
255
+ describe "rdonly?" do
256
+ it "should return true" do
257
+ expect(@fmo.rdonly?).to be true
258
+ end
259
+ end
260
+
261
+ describe "rdwr?" do
262
+ it "should return false" do
263
+ expect(@fmo.rdwr?).to be false
264
+ end
265
+ end
266
+
267
+ describe "trunc?" do
268
+ it "should return false" do
269
+ expect(@fmo.trunc?).to be false
270
+ end
271
+ end
272
+
273
+ describe "wronly?" do
274
+ it "should return false" do
275
+ expect(@fmo.wronly?).to be false
276
+ end
277
+ end
278
+ end
279
+
280
+ context "read only + binmode = 'rb'" do
281
+ before(:each) do
282
+ @fmo = VirtFS::FileModesAndOptions.new("rb")
283
+ end
284
+
285
+ describe "mode_bits" do
286
+ it "should return File::RDONLY" do
287
+ expect(@fmo.mode_bits).to eq(File::RDONLY)
288
+ end
289
+ end
290
+
291
+ describe "append?" do
292
+ it "should return false" do
293
+ expect(@fmo.append?).to be false
294
+ end
295
+ end
296
+
297
+ describe "binmode?" do
298
+ it "should return true" do
299
+ expect(@fmo.binmode?).to be true
300
+ end
301
+ end
302
+
303
+ describe "create?" do
304
+ it "should return false" do
305
+ expect(@fmo.create?).to be false
306
+ end
307
+ end
308
+
309
+ describe "excl?" do
310
+ it "should return false" do
311
+ expect(@fmo.excl?).to be false
312
+ end
313
+ end
314
+
315
+ describe "noctty?" do
316
+ it "should return false" do
317
+ expect(@fmo.noctty?).to be false
318
+ end
319
+ end
320
+
321
+ describe "nonblock?" do
322
+ it "should return false" do
323
+ expect(@fmo.nonblock?).to be false
324
+ end
325
+ end
326
+
327
+ describe "rdonly?" do
328
+ it "should return true" do
329
+ expect(@fmo.rdonly?).to be true
330
+ end
331
+ end
332
+
333
+ describe "rdwr?" do
334
+ it "should return false" do
335
+ expect(@fmo.rdwr?).to be false
336
+ end
337
+ end
338
+
339
+ describe "trunc?" do
340
+ it "should return false" do
341
+ expect(@fmo.trunc?).to be false
342
+ end
343
+ end
344
+
345
+ describe "wronly?" do
346
+ it "should return false" do
347
+ expect(@fmo.wronly?).to be false
348
+ end
349
+ end
350
+ end
351
+
352
+ context "read write = 'r+'" do
353
+ before(:each) do
354
+ @fmo = VirtFS::FileModesAndOptions.new("r+")
355
+ end
356
+
357
+ describe "mode_bits" do
358
+ it "should return File::RDWR" do
359
+ expect(@fmo.mode_bits).to eq(File::RDWR)
360
+ end
361
+ end
362
+
363
+ describe "append?" do
364
+ it "should return false" do
365
+ expect(@fmo.append?).to be false
366
+ end
367
+ end
368
+
369
+ describe "binmode?" do
370
+ it "should return false" do
371
+ expect(@fmo.binmode?).to be false
372
+ end
373
+ end
374
+
375
+ describe "create?" do
376
+ it "should return false" do
377
+ expect(@fmo.create?).to be false
378
+ end
379
+ end
380
+
381
+ describe "excl?" do
382
+ it "should return false" do
383
+ expect(@fmo.excl?).to be false
384
+ end
385
+ end
386
+
387
+ describe "noctty?" do
388
+ it "should return false" do
389
+ expect(@fmo.noctty?).to be false
390
+ end
391
+ end
392
+
393
+ describe "nonblock?" do
394
+ it "should return false" do
395
+ expect(@fmo.nonblock?).to be false
396
+ end
397
+ end
398
+
399
+ describe "rdonly?" do
400
+ it "should return false" do
401
+ expect(@fmo.rdonly?).to be false
402
+ end
403
+ end
404
+
405
+ describe "rdwr?" do
406
+ it "should return true" do
407
+ expect(@fmo.rdwr?).to be true
408
+ end
409
+ end
410
+
411
+ describe "trunc?" do
412
+ it "should return false" do
413
+ expect(@fmo.trunc?).to be false
414
+ end
415
+ end
416
+
417
+ describe "wronly?" do
418
+ it "should return false" do
419
+ expect(@fmo.wronly?).to be false
420
+ end
421
+ end
422
+ end
423
+
424
+ context "read write + binmode = 'r+b'" do
425
+ before(:each) do
426
+ @fmo = VirtFS::FileModesAndOptions.new("r+b")
427
+ end
428
+
429
+ describe "mode_bits" do
430
+ it "should return File::RDWR" do
431
+ expect(@fmo.mode_bits).to eq(File::RDWR)
432
+ end
433
+ end
434
+
435
+ describe "append?" do
436
+ it "should return false" do
437
+ expect(@fmo.append?).to be false
438
+ end
439
+ end
440
+
441
+ describe "binmode?" do
442
+ it "should return true" do
443
+ expect(@fmo.binmode?).to be true
444
+ end
445
+ end
446
+
447
+ describe "create?" do
448
+ it "should return false" do
449
+ expect(@fmo.create?).to be false
450
+ end
451
+ end
452
+
453
+ describe "excl?" do
454
+ it "should return false" do
455
+ expect(@fmo.excl?).to be false
456
+ end
457
+ end
458
+
459
+ describe "noctty?" do
460
+ it "should return false" do
461
+ expect(@fmo.noctty?).to be false
462
+ end
463
+ end
464
+
465
+ describe "nonblock?" do
466
+ it "should return false" do
467
+ expect(@fmo.nonblock?).to be false
468
+ end
469
+ end
470
+
471
+ describe "rdonly?" do
472
+ it "should return false" do
473
+ expect(@fmo.rdonly?).to be false
474
+ end
475
+ end
476
+
477
+ describe "rdwr?" do
478
+ it "should return true" do
479
+ expect(@fmo.rdwr?).to be true
480
+ end
481
+ end
482
+
483
+ describe "trunc?" do
484
+ it "should return false" do
485
+ expect(@fmo.trunc?).to be false
486
+ end
487
+ end
488
+
489
+ describe "wronly?" do
490
+ it "should return false" do
491
+ expect(@fmo.wronly?).to be false
492
+ end
493
+ end
494
+ end
495
+
496
+ context "write only, truncate, create = 'w'" do
497
+ before(:each) do
498
+ @fmo = VirtFS::FileModesAndOptions.new("w")
499
+ end
500
+
501
+ describe "mode_bits" do
502
+ it "should return (File::WRONLY | File::TRUNC | File::CREAT)" do
503
+ expect(@fmo.mode_bits).to eq(File::WRONLY | File::TRUNC | File::CREAT)
504
+ end
505
+ end
506
+
507
+ describe "append?" do
508
+ it "should return false" do
509
+ expect(@fmo.append?).to be false
510
+ end
511
+ end
512
+
513
+ describe "binmode?" do
514
+ it "should return false" do
515
+ expect(@fmo.binmode?).to be false
516
+ end
517
+ end
518
+
519
+ describe "create?" do
520
+ it "should return true" do
521
+ expect(@fmo.create?).to be true
522
+ end
523
+ end
524
+
525
+ describe "excl?" do
526
+ it "should return false" do
527
+ expect(@fmo.excl?).to be false
528
+ end
529
+ end
530
+
531
+ describe "noctty?" do
532
+ it "should return false" do
533
+ expect(@fmo.noctty?).to be false
534
+ end
535
+ end
536
+
537
+ describe "nonblock?" do
538
+ it "should return false" do
539
+ expect(@fmo.nonblock?).to be false
540
+ end
541
+ end
542
+
543
+ describe "rdonly?" do
544
+ it "should return false" do
545
+ expect(@fmo.rdonly?).to be false
546
+ end
547
+ end
548
+
549
+ describe "rdwr?" do
550
+ it "should return false" do
551
+ expect(@fmo.rdwr?).to be false
552
+ end
553
+ end
554
+
555
+ describe "trunc?" do
556
+ it "should return true" do
557
+ expect(@fmo.trunc?).to be true
558
+ end
559
+ end
560
+
561
+ describe "wronly?" do
562
+ it "should return true" do
563
+ expect(@fmo.wronly?).to be true
564
+ end
565
+ end
566
+ end
567
+
568
+ context "read write, truncate, create = 'w+'" do
569
+ before(:each) do
570
+ @fmo = VirtFS::FileModesAndOptions.new("w+")
571
+ end
572
+
573
+ describe "mode_bits" do
574
+ it "should return (File::RDWR | File::TRUNC | File::CREAT)" do
575
+ expect(@fmo.mode_bits).to eq(File::RDWR | File::TRUNC | File::CREAT)
576
+ end
577
+ end
578
+
579
+ describe "append?" do
580
+ it "should return false" do
581
+ expect(@fmo.append?).to be false
582
+ end
583
+ end
584
+
585
+ describe "binmode?" do
586
+ it "should return false" do
587
+ expect(@fmo.binmode?).to be false
588
+ end
589
+ end
590
+
591
+ describe "create?" do
592
+ it "should return true" do
593
+ expect(@fmo.create?).to be true
594
+ end
595
+ end
596
+
597
+ describe "excl?" do
598
+ it "should return false" do
599
+ expect(@fmo.excl?).to be false
600
+ end
601
+ end
602
+
603
+ describe "noctty?" do
604
+ it "should return false" do
605
+ expect(@fmo.noctty?).to be false
606
+ end
607
+ end
608
+
609
+ describe "nonblock?" do
610
+ it "should return false" do
611
+ expect(@fmo.nonblock?).to be false
612
+ end
613
+ end
614
+
615
+ describe "rdonly?" do
616
+ it "should return false" do
617
+ expect(@fmo.rdonly?).to be false
618
+ end
619
+ end
620
+
621
+ describe "rdwr?" do
622
+ it "should return true" do
623
+ expect(@fmo.rdwr?).to be true
624
+ end
625
+ end
626
+
627
+ describe "trunc?" do
628
+ it "should return true" do
629
+ expect(@fmo.trunc?).to be true
630
+ end
631
+ end
632
+
633
+ describe "wronly?" do
634
+ it "should return false" do
635
+ expect(@fmo.wronly?).to be false
636
+ end
637
+ end
638
+ end
639
+
640
+ context "write only, append, create = 'a'" do
641
+ before(:each) do
642
+ @fmo = VirtFS::FileModesAndOptions.new("a")
643
+ end
644
+
645
+ describe "mode_bits" do
646
+ it "should return (File::WRONLY | File::APPEND | File::CREAT)" do
647
+ expect(@fmo.mode_bits).to eq(File::WRONLY | File::APPEND | File::CREAT)
648
+ end
649
+ end
650
+
651
+ describe "append?" do
652
+ it "should return true" do
653
+ expect(@fmo.append?).to be true
654
+ end
655
+ end
656
+
657
+ describe "binmode?" do
658
+ it "should return false" do
659
+ expect(@fmo.binmode?).to be false
660
+ end
661
+ end
662
+
663
+ describe "create?" do
664
+ it "should return true" do
665
+ expect(@fmo.create?).to be true
666
+ end
667
+ end
668
+
669
+ describe "excl?" do
670
+ it "should return false" do
671
+ expect(@fmo.excl?).to be false
672
+ end
673
+ end
674
+
675
+ describe "noctty?" do
676
+ it "should return false" do
677
+ expect(@fmo.noctty?).to be false
678
+ end
679
+ end
680
+
681
+ describe "nonblock?" do
682
+ it "should return false" do
683
+ expect(@fmo.nonblock?).to be false
684
+ end
685
+ end
686
+
687
+ describe "rdonly?" do
688
+ it "should return false" do
689
+ expect(@fmo.rdonly?).to be false
690
+ end
691
+ end
692
+
693
+ describe "rdwr?" do
694
+ it "should return false" do
695
+ expect(@fmo.rdwr?).to be false
696
+ end
697
+ end
698
+
699
+ describe "trunc?" do
700
+ it "should return false" do
701
+ expect(@fmo.trunc?).to be false
702
+ end
703
+ end
704
+
705
+ describe "wronly?" do
706
+ it "should return true" do
707
+ expect(@fmo.wronly?).to be true
708
+ end
709
+ end
710
+ end
711
+
712
+ context "read write, append, create = 'a+'" do
713
+ before(:each) do
714
+ @fmo = VirtFS::FileModesAndOptions.new("a+")
715
+ end
716
+
717
+ describe "mode_bits" do
718
+ it "should return (File::RDWR | File::APPEND | File::CREAT)" do
719
+ expect(@fmo.mode_bits).to eq(File::RDWR | File::APPEND | File::CREAT)
720
+ end
721
+ end
722
+
723
+ describe "append?" do
724
+ it "should return true" do
725
+ expect(@fmo.append?).to be true
726
+ end
727
+ end
728
+
729
+ describe "binmode?" do
730
+ it "should return false" do
731
+ expect(@fmo.binmode?).to be false
732
+ end
733
+ end
734
+
735
+ describe "create?" do
736
+ it "should return true" do
737
+ expect(@fmo.create?).to be true
738
+ end
739
+ end
740
+
741
+ describe "excl?" do
742
+ it "should return false" do
743
+ expect(@fmo.excl?).to be false
744
+ end
745
+ end
746
+
747
+ describe "noctty?" do
748
+ it "should return false" do
749
+ expect(@fmo.noctty?).to be false
750
+ end
751
+ end
752
+
753
+ describe "nonblock?" do
754
+ it "should return false" do
755
+ expect(@fmo.nonblock?).to be false
756
+ end
757
+ end
758
+
759
+ describe "rdonly?" do
760
+ it "should return false" do
761
+ expect(@fmo.rdonly?).to be false
762
+ end
763
+ end
764
+
765
+ describe "rdwr?" do
766
+ it "should return true" do
767
+ expect(@fmo.rdwr?).to be true
768
+ end
769
+ end
770
+
771
+ describe "trunc?" do
772
+ it "should return false" do
773
+ expect(@fmo.trunc?).to be false
774
+ end
775
+ end
776
+
777
+ describe "wronly?" do
778
+ it "should return false" do
779
+ expect(@fmo.wronly?).to be false
780
+ end
781
+ end
782
+ end
783
+
784
+ context "with encoding" do
785
+ context "external encoding" do
786
+ before(:each) do
787
+ @fmo = VirtFS::FileModesAndOptions.new("r+:ascii-8bit")
788
+ end
789
+
790
+ it "should set the external encoding to a value other than the default" do
791
+ new_encoding = Encoding.find("ascii-8bit")
792
+ expect(new_encoding).not_to eq(Encoding.default_external)
793
+ expect(@fmo.external_encoding).to eq(new_encoding)
794
+ end
795
+
796
+ describe "mode_bits" do
797
+ it "should return File::RDWR" do
798
+ expect(@fmo.mode_bits).to eq(File::RDWR)
799
+ end
800
+ end
801
+
802
+ describe "append?" do
803
+ it "should return false" do
804
+ expect(@fmo.append?).to be false
805
+ end
806
+ end
807
+
808
+ describe "binmode?" do
809
+ it "should return false" do
810
+ expect(@fmo.binmode?).to be false
811
+ end
812
+ end
813
+
814
+ describe "create?" do
815
+ it "should return false" do
816
+ expect(@fmo.create?).to be false
817
+ end
818
+ end
819
+
820
+ describe "excl?" do
821
+ it "should return false" do
822
+ expect(@fmo.excl?).to be false
823
+ end
824
+ end
825
+
826
+ describe "noctty?" do
827
+ it "should return false" do
828
+ expect(@fmo.noctty?).to be false
829
+ end
830
+ end
831
+
832
+ describe "nonblock?" do
833
+ it "should return false" do
834
+ expect(@fmo.nonblock?).to be false
835
+ end
836
+ end
837
+
838
+ describe "rdonly?" do
839
+ it "should return false" do
840
+ expect(@fmo.rdonly?).to be false
841
+ end
842
+ end
843
+
844
+ describe "rdwr?" do
845
+ it "should return true" do
846
+ expect(@fmo.rdwr?).to be true
847
+ end
848
+ end
849
+
850
+ describe "trunc?" do
851
+ it "should return false" do
852
+ expect(@fmo.trunc?).to be false
853
+ end
854
+ end
855
+
856
+ describe "wronly?" do
857
+ it "should return false" do
858
+ expect(@fmo.wronly?).to be false
859
+ end
860
+ end
861
+ end
862
+
863
+ context "internal encoding" do
864
+ before(:each) do
865
+ @fmo = VirtFS::FileModesAndOptions.new("r+::utf-8")
866
+ end
867
+
868
+ it "should set the internal encoding to a value other than the default" do
869
+ new_encoding = Encoding.find("utf-8")
870
+ expect(new_encoding).not_to eq(Encoding.default_internal)
871
+ expect(@fmo.internal_encoding).to eq(new_encoding)
872
+ end
873
+
874
+ describe "mode_bits" do
875
+ it "should return File::RDWR" do
876
+ expect(@fmo.mode_bits).to eq(File::RDWR)
877
+ end
878
+ end
879
+
880
+ describe "append?" do
881
+ it "should return false" do
882
+ expect(@fmo.append?).to be false
883
+ end
884
+ end
885
+
886
+ describe "binmode?" do
887
+ it "should return false" do
888
+ expect(@fmo.binmode?).to be false
889
+ end
890
+ end
891
+
892
+ describe "create?" do
893
+ it "should return false" do
894
+ expect(@fmo.create?).to be false
895
+ end
896
+ end
897
+
898
+ describe "excl?" do
899
+ it "should return false" do
900
+ expect(@fmo.excl?).to be false
901
+ end
902
+ end
903
+
904
+ describe "noctty?" do
905
+ it "should return false" do
906
+ expect(@fmo.noctty?).to be false
907
+ end
908
+ end
909
+
910
+ describe "nonblock?" do
911
+ it "should return false" do
912
+ expect(@fmo.nonblock?).to be false
913
+ end
914
+ end
915
+
916
+ describe "rdonly?" do
917
+ it "should return false" do
918
+ expect(@fmo.rdonly?).to be false
919
+ end
920
+ end
921
+
922
+ describe "rdwr?" do
923
+ it "should return true" do
924
+ expect(@fmo.rdwr?).to be true
925
+ end
926
+ end
927
+
928
+ describe "trunc?" do
929
+ it "should return false" do
930
+ expect(@fmo.trunc?).to be false
931
+ end
932
+ end
933
+
934
+ describe "wronly?" do
935
+ it "should return false" do
936
+ expect(@fmo.wronly?).to be false
937
+ end
938
+ end
939
+ end
940
+
941
+ context "external and internal encoding" do
942
+ before(:each) do
943
+ @fmo = VirtFS::FileModesAndOptions.new("r+:ascii-8bit:utf-8")
944
+ end
945
+
946
+ it "should set the external and internal encodings to a values other than the default" do
947
+ new_external_encoding = Encoding.find("ascii-8bit")
948
+ expect(new_external_encoding).not_to eq(Encoding.default_external)
949
+ new_internal_encoding = Encoding.find("utf-8")
950
+ expect(new_internal_encoding).not_to eq(Encoding.default_internal)
951
+ expect(@fmo.external_encoding).to eq(new_external_encoding)
952
+ expect(@fmo.internal_encoding).to eq(new_internal_encoding)
953
+ end
954
+
955
+ describe "mode_bits" do
956
+ it "should return File::RDWR" do
957
+ expect(@fmo.mode_bits).to eq(File::RDWR)
958
+ end
959
+ end
960
+
961
+ describe "append?" do
962
+ it "should return false" do
963
+ expect(@fmo.append?).to be false
964
+ end
965
+ end
966
+
967
+ describe "binmode?" do
968
+ it "should return false" do
969
+ expect(@fmo.binmode?).to be false
970
+ end
971
+ end
972
+
973
+ describe "create?" do
974
+ it "should return false" do
975
+ expect(@fmo.create?).to be false
976
+ end
977
+ end
978
+
979
+ describe "excl?" do
980
+ it "should return false" do
981
+ expect(@fmo.excl?).to be false
982
+ end
983
+ end
984
+
985
+ describe "noctty?" do
986
+ it "should return false" do
987
+ expect(@fmo.noctty?).to be false
988
+ end
989
+ end
990
+
991
+ describe "nonblock?" do
992
+ it "should return false" do
993
+ expect(@fmo.nonblock?).to be false
994
+ end
995
+ end
996
+
997
+ describe "rdonly?" do
998
+ it "should return false" do
999
+ expect(@fmo.rdonly?).to be false
1000
+ end
1001
+ end
1002
+
1003
+ describe "rdwr?" do
1004
+ it "should return true" do
1005
+ expect(@fmo.rdwr?).to be true
1006
+ end
1007
+ end
1008
+
1009
+ describe "trunc?" do
1010
+ it "should return false" do
1011
+ expect(@fmo.trunc?).to be false
1012
+ end
1013
+ end
1014
+
1015
+ describe "wronly?" do
1016
+ it "should return false" do
1017
+ expect(@fmo.wronly?).to be false
1018
+ end
1019
+ end
1020
+ end
1021
+ end
1022
+ end
1023
+
1024
+ context "options" do
1025
+ context "modes" do
1026
+ context "read write + binmode = :mode => 'r+b'" do
1027
+ before(:each) do
1028
+ @fmo = VirtFS::FileModesAndOptions.new(:mode => "r+b")
1029
+ end
1030
+
1031
+ describe "mode_bits" do
1032
+ it "should return File::RDWR" do
1033
+ expect(@fmo.mode_bits).to eq(File::RDWR)
1034
+ end
1035
+ end
1036
+
1037
+ describe "append?" do
1038
+ it "should return false" do
1039
+ expect(@fmo.append?).to be false
1040
+ end
1041
+ end
1042
+
1043
+ describe "binmode?" do
1044
+ it "should return true" do
1045
+ expect(@fmo.binmode?).to be true
1046
+ end
1047
+ end
1048
+
1049
+ describe "create?" do
1050
+ it "should return false" do
1051
+ expect(@fmo.create?).to be false
1052
+ end
1053
+ end
1054
+
1055
+ describe "excl?" do
1056
+ it "should return false" do
1057
+ expect(@fmo.excl?).to be false
1058
+ end
1059
+ end
1060
+
1061
+ describe "noctty?" do
1062
+ it "should return false" do
1063
+ expect(@fmo.noctty?).to be false
1064
+ end
1065
+ end
1066
+
1067
+ describe "nonblock?" do
1068
+ it "should return false" do
1069
+ expect(@fmo.nonblock?).to be false
1070
+ end
1071
+ end
1072
+
1073
+ describe "rdonly?" do
1074
+ it "should return false" do
1075
+ expect(@fmo.rdonly?).to be false
1076
+ end
1077
+ end
1078
+
1079
+ describe "rdwr?" do
1080
+ it "should return true" do
1081
+ expect(@fmo.rdwr?).to be true
1082
+ end
1083
+ end
1084
+
1085
+ describe "trunc?" do
1086
+ it "should return false" do
1087
+ expect(@fmo.trunc?).to be false
1088
+ end
1089
+ end
1090
+
1091
+ describe "wronly?" do
1092
+ it "should return false" do
1093
+ expect(@fmo.wronly?).to be false
1094
+ end
1095
+ end
1096
+ end
1097
+ end
1098
+
1099
+ context "binmode" do
1100
+ context "read write + binmode = :binmode => true, :mode => 'r+'" do
1101
+ before(:each) do
1102
+ @fmo = VirtFS::FileModesAndOptions.new(:binmode => true, :mode => "r+")
1103
+ end
1104
+
1105
+ describe "mode_bits" do
1106
+ it "should return File::RDWR" do
1107
+ expect(@fmo.mode_bits).to eq(File::RDWR)
1108
+ end
1109
+ end
1110
+
1111
+ describe "append?" do
1112
+ it "should return false" do
1113
+ expect(@fmo.append?).to be false
1114
+ end
1115
+ end
1116
+
1117
+ describe "binmode?" do
1118
+ it "should return true" do
1119
+ expect(@fmo.binmode?).to be true
1120
+ end
1121
+ end
1122
+
1123
+ describe "create?" do
1124
+ it "should return false" do
1125
+ expect(@fmo.create?).to be false
1126
+ end
1127
+ end
1128
+
1129
+ describe "excl?" do
1130
+ it "should return false" do
1131
+ expect(@fmo.excl?).to be false
1132
+ end
1133
+ end
1134
+
1135
+ describe "noctty?" do
1136
+ it "should return false" do
1137
+ expect(@fmo.noctty?).to be false
1138
+ end
1139
+ end
1140
+
1141
+ describe "nonblock?" do
1142
+ it "should return false" do
1143
+ expect(@fmo.nonblock?).to be false
1144
+ end
1145
+ end
1146
+
1147
+ describe "rdonly?" do
1148
+ it "should return false" do
1149
+ expect(@fmo.rdonly?).to be false
1150
+ end
1151
+ end
1152
+
1153
+ describe "rdwr?" do
1154
+ it "should return true" do
1155
+ expect(@fmo.rdwr?).to be true
1156
+ end
1157
+ end
1158
+
1159
+ describe "trunc?" do
1160
+ it "should return false" do
1161
+ expect(@fmo.trunc?).to be false
1162
+ end
1163
+ end
1164
+
1165
+ describe "wronly?" do
1166
+ it "should return false" do
1167
+ expect(@fmo.wronly?).to be false
1168
+ end
1169
+ end
1170
+ end
1171
+ end
1172
+
1173
+ context "external_encoding" do
1174
+ it "should set the external encoding to a value other than the default" do
1175
+ new_encoding = Encoding.find("ascii-8bit")
1176
+ expect(new_encoding).not_to eq(Encoding.default_external)
1177
+ fmo = VirtFS::FileModesAndOptions.new(:external_encoding => "ascii-8bit", :mode => "r+")
1178
+ expect(fmo.external_encoding).to eq(new_encoding)
1179
+ end
1180
+ end
1181
+
1182
+ context "internal_encoding" do
1183
+ it "should set the internal encoding to a value other than the default" do
1184
+ new_encoding = Encoding.find("utf-8")
1185
+ expect(new_encoding).not_to eq(Encoding.default_internal)
1186
+ fmo = VirtFS::FileModesAndOptions.new(:internal_encoding => "utf-8", :mode => "r+")
1187
+ expect(fmo.internal_encoding).to eq(new_encoding)
1188
+ end
1189
+ end
1190
+
1191
+ context "encoding" do
1192
+ it "should set the external encoding to a value other than the default" do
1193
+ new_encoding = Encoding.find("ascii-8bit")
1194
+ expect(new_encoding).not_to eq(Encoding.default_external)
1195
+ fmo = VirtFS::FileModesAndOptions.new(:encoding => "ascii-8bit", :mode => "r+")
1196
+ expect(fmo.external_encoding).to eq(new_encoding)
1197
+ expect(fmo.internal_encoding).to eq(Encoding.default_internal)
1198
+ end
1199
+
1200
+ it "should set the internal encoding to a value other than the default" do
1201
+ new_encoding = Encoding.find("utf-8")
1202
+ expect(new_encoding).not_to eq(Encoding.default_internal)
1203
+ fmo = VirtFS::FileModesAndOptions.new(:encoding => ":utf-8", :mode => "r+")
1204
+ expect(fmo.internal_encoding).to eq(new_encoding)
1205
+ expect(fmo.external_encoding).to eq(Encoding.default_external)
1206
+ end
1207
+
1208
+ it "should set the external and internal encodings to a values other than the default" do
1209
+ new_external_encoding = Encoding.find("ascii-8bit")
1210
+ expect(new_external_encoding).not_to eq(Encoding.default_external)
1211
+ new_internal_encoding = Encoding.find("utf-8")
1212
+ expect(new_internal_encoding).not_to eq(Encoding.default_internal)
1213
+ fmo = VirtFS::FileModesAndOptions.new(:encoding => "ascii-8bit:utf-8", :mode => "r+")
1214
+ expect(fmo.external_encoding).to eq(new_external_encoding)
1215
+ expect(fmo.internal_encoding).to eq(new_internal_encoding)
1216
+ end
1217
+ end
1218
+
1219
+ context "textmode" do
1220
+ end
1221
+ end
1222
+
1223
+ context "permissions" do
1224
+ it "should set permissions when specified after mode" do
1225
+ permissions = 0755
1226
+ fmo = VirtFS::FileModesAndOptions.new("r", permissions)
1227
+ expect(fmo.permissions).to eq(permissions)
1228
+ end
1229
+
1230
+ it "should set permissions when specified after mode and before options" do
1231
+ permissions = 0755
1232
+ fmo = VirtFS::FileModesAndOptions.new("r", permissions, :binmode => true)
1233
+ expect(fmo.permissions).to eq(permissions)
1234
+ end
1235
+ end
1236
+
1237
+ #
1238
+ # Test arg combinations.
1239
+ #
1240
+
1241
+ context "mode, permissions" do
1242
+ context "read write = 'r+' with permissions = 0755" do
1243
+ before(:each) do
1244
+ @permissions = 0755
1245
+ @fmo = VirtFS::FileModesAndOptions.new("r+", @permissions)
1246
+ end
1247
+
1248
+ it "should set permissions accordingly" do
1249
+ expect(@fmo.permissions).to eq(@permissions)
1250
+ end
1251
+
1252
+ describe "mode_bits" do
1253
+ it "should return File::RDWR" do
1254
+ expect(@fmo.mode_bits).to eq(File::RDWR)
1255
+ end
1256
+ end
1257
+
1258
+ describe "append?" do
1259
+ it "should return false" do
1260
+ expect(@fmo.append?).to be false
1261
+ end
1262
+ end
1263
+
1264
+ describe "binmode?" do
1265
+ it "should return false" do
1266
+ expect(@fmo.binmode?).to be false
1267
+ end
1268
+ end
1269
+
1270
+ describe "create?" do
1271
+ it "should return false" do
1272
+ expect(@fmo.create?).to be false
1273
+ end
1274
+ end
1275
+
1276
+ describe "excl?" do
1277
+ it "should return false" do
1278
+ expect(@fmo.excl?).to be false
1279
+ end
1280
+ end
1281
+
1282
+ describe "noctty?" do
1283
+ it "should return false" do
1284
+ expect(@fmo.noctty?).to be false
1285
+ end
1286
+ end
1287
+
1288
+ describe "nonblock?" do
1289
+ it "should return false" do
1290
+ expect(@fmo.nonblock?).to be false
1291
+ end
1292
+ end
1293
+
1294
+ describe "rdonly?" do
1295
+ it "should return false" do
1296
+ expect(@fmo.rdonly?).to be false
1297
+ end
1298
+ end
1299
+
1300
+ describe "rdwr?" do
1301
+ it "should return true" do
1302
+ expect(@fmo.rdwr?).to be true
1303
+ end
1304
+ end
1305
+
1306
+ describe "trunc?" do
1307
+ it "should return false" do
1308
+ expect(@fmo.trunc?).to be false
1309
+ end
1310
+ end
1311
+
1312
+ describe "wronly?" do
1313
+ it "should return false" do
1314
+ expect(@fmo.wronly?).to be false
1315
+ end
1316
+ end
1317
+ end
1318
+ end
1319
+
1320
+ context "mode, options" do
1321
+ context "read write = 'r+' with options: :encoding => 'ascii-8bit:utf-8'" do
1322
+ before(:each) do
1323
+ @fmo = VirtFS::FileModesAndOptions.new("r+", :encoding => "ascii-8bit:utf-8")
1324
+ end
1325
+
1326
+ it "should set the external and internal encodings to a values other than the default" do
1327
+ new_external_encoding = Encoding.find("ascii-8bit")
1328
+ expect(new_external_encoding).not_to eq(Encoding.default_external)
1329
+ new_internal_encoding = Encoding.find("utf-8")
1330
+ expect(new_internal_encoding).not_to eq(Encoding.default_internal)
1331
+ expect(@fmo.external_encoding).to eq(new_external_encoding)
1332
+ expect(@fmo.internal_encoding).to eq(new_internal_encoding)
1333
+ end
1334
+
1335
+ describe "mode_bits" do
1336
+ it "should return File::RDWR" do
1337
+ expect(@fmo.mode_bits).to eq(File::RDWR)
1338
+ end
1339
+ end
1340
+
1341
+ describe "append?" do
1342
+ it "should return false" do
1343
+ expect(@fmo.append?).to be false
1344
+ end
1345
+ end
1346
+
1347
+ describe "binmode?" do
1348
+ it "should return false" do
1349
+ expect(@fmo.binmode?).to be false
1350
+ end
1351
+ end
1352
+
1353
+ describe "create?" do
1354
+ it "should return false" do
1355
+ expect(@fmo.create?).to be false
1356
+ end
1357
+ end
1358
+
1359
+ describe "excl?" do
1360
+ it "should return false" do
1361
+ expect(@fmo.excl?).to be false
1362
+ end
1363
+ end
1364
+
1365
+ describe "noctty?" do
1366
+ it "should return false" do
1367
+ expect(@fmo.noctty?).to be false
1368
+ end
1369
+ end
1370
+
1371
+ describe "nonblock?" do
1372
+ it "should return false" do
1373
+ expect(@fmo.nonblock?).to be false
1374
+ end
1375
+ end
1376
+
1377
+ describe "rdonly?" do
1378
+ it "should return false" do
1379
+ expect(@fmo.rdonly?).to be false
1380
+ end
1381
+ end
1382
+
1383
+ describe "rdwr?" do
1384
+ it "should return true" do
1385
+ expect(@fmo.rdwr?).to be true
1386
+ end
1387
+ end
1388
+
1389
+ describe "trunc?" do
1390
+ it "should return false" do
1391
+ expect(@fmo.trunc?).to be false
1392
+ end
1393
+ end
1394
+
1395
+ describe "wronly?" do
1396
+ it "should return false" do
1397
+ expect(@fmo.wronly?).to be false
1398
+ end
1399
+ end
1400
+ end
1401
+ end
1402
+
1403
+ context "mode, permissions, options" do
1404
+ context "read write = 'r+' with permissions = 0755 and ,options = :encoding => 'ascii-8bit:utf-8'" do
1405
+ before(:each) do
1406
+ @permissions = 0755
1407
+ @fmo = VirtFS::FileModesAndOptions.new("r+", @permissions, :encoding => "ascii-8bit:utf-8")
1408
+ end
1409
+
1410
+ it "should set permissions accordingly" do
1411
+ expect(@fmo.permissions).to eq(@permissions)
1412
+ end
1413
+
1414
+ it "should set the external and internal encodings to a values other than the default" do
1415
+ new_external_encoding = Encoding.find("ascii-8bit")
1416
+ expect(new_external_encoding).not_to eq(Encoding.default_external)
1417
+ new_internal_encoding = Encoding.find("utf-8")
1418
+ expect(new_internal_encoding).not_to eq(Encoding.default_internal)
1419
+ expect(@fmo.external_encoding).to eq(new_external_encoding)
1420
+ expect(@fmo.internal_encoding).to eq(new_internal_encoding)
1421
+ end
1422
+
1423
+ describe "mode_bits" do
1424
+ it "should return File::RDWR" do
1425
+ expect(@fmo.mode_bits).to eq(File::RDWR)
1426
+ end
1427
+ end
1428
+
1429
+ describe "append?" do
1430
+ it "should return false" do
1431
+ expect(@fmo.append?).to be false
1432
+ end
1433
+ end
1434
+
1435
+ describe "binmode?" do
1436
+ it "should return false" do
1437
+ expect(@fmo.binmode?).to be false
1438
+ end
1439
+ end
1440
+
1441
+ describe "create?" do
1442
+ it "should return false" do
1443
+ expect(@fmo.create?).to be false
1444
+ end
1445
+ end
1446
+
1447
+ describe "excl?" do
1448
+ it "should return false" do
1449
+ expect(@fmo.excl?).to be false
1450
+ end
1451
+ end
1452
+
1453
+ describe "noctty?" do
1454
+ it "should return false" do
1455
+ expect(@fmo.noctty?).to be false
1456
+ end
1457
+ end
1458
+
1459
+ describe "nonblock?" do
1460
+ it "should return false" do
1461
+ expect(@fmo.nonblock?).to be false
1462
+ end
1463
+ end
1464
+
1465
+ describe "rdonly?" do
1466
+ it "should return false" do
1467
+ expect(@fmo.rdonly?).to be false
1468
+ end
1469
+ end
1470
+
1471
+ describe "rdwr?" do
1472
+ it "should return true" do
1473
+ expect(@fmo.rdwr?).to be true
1474
+ end
1475
+ end
1476
+
1477
+ describe "trunc?" do
1478
+ it "should return false" do
1479
+ expect(@fmo.trunc?).to be false
1480
+ end
1481
+ end
1482
+
1483
+ describe "wronly?" do
1484
+ it "should return false" do
1485
+ expect(@fmo.wronly?).to be false
1486
+ end
1487
+ end
1488
+ end
1489
+ end
1490
+
1491
+ #
1492
+ # Error handling.
1493
+ #
1494
+
1495
+ context "errors" do
1496
+ it "should raise ArgumentError when third arg is not a hash" do
1497
+ expect do
1498
+ @fmo = VirtFS::FileModesAndOptions.new("r+", 0755, true)
1499
+ end.to raise_error(
1500
+ ArgumentError, "wrong number of arguments (4 for 1..3)"
1501
+ )
1502
+ end
1503
+
1504
+ it "should raise ArgumentError when external encoding specified twice" do
1505
+ expect do
1506
+ @fmo = VirtFS::FileModesAndOptions.new("r+:ascii-8bit", 0755, :external_encoding => "ascii-8bit")
1507
+ end.to raise_error(
1508
+ ArgumentError, "encoding specified twice"
1509
+ )
1510
+ end
1511
+
1512
+ it "should raise ArgumentError when internal encoding specified twice" do
1513
+ expect do
1514
+ @fmo = VirtFS::FileModesAndOptions.new("r+::ascii-8bit", 0755, :internal_encoding => "ascii-8bit")
1515
+ end.to raise_error(
1516
+ ArgumentError, "encoding specified twice"
1517
+ )
1518
+ end
1519
+
1520
+ it "should raise ArgumentError when given invalid access mode" do
1521
+ mode_str = "z+"
1522
+ expect do
1523
+ @fmo = VirtFS::FileModesAndOptions.new(mode_str)
1524
+ end.to raise_error(
1525
+ ArgumentError, "invalid access mode #{mode_str}"
1526
+ )
1527
+ end
1528
+
1529
+ it "should raise ArgumentError when binmode specified twice" do
1530
+ expect do
1531
+ @fmo = VirtFS::FileModesAndOptions.new("rb", :binmode => true)
1532
+ end.to raise_error(
1533
+ ArgumentError, "binmode specified twice"
1534
+ )
1535
+ end
1536
+
1537
+ #
1538
+ # This restriction has been removed.
1539
+ #
1540
+ # it "should raise ArgumentError when mode specified twice" do
1541
+ # expect do
1542
+ # @fmo = VirtFS::FileModesAndOptions.new("rb", :mode => "rb")
1543
+ # end.to raise_error(
1544
+ # ArgumentError, "mode specified twice"
1545
+ # )
1546
+ # end
1547
+
1548
+ it "should raise ArgumentError when both binmode and textmode are specified" do
1549
+ expect do
1550
+ @fmo = VirtFS::FileModesAndOptions.new("rb", :textmode => true)
1551
+ end.to raise_error(
1552
+ ArgumentError, "binmode and textmode are mutually exclusive"
1553
+ )
1554
+ end
1555
+ end
1556
+ end