sys-filesystem 1.1.6 → 1.4.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,396 @@
1
+ ####################################################################
2
+ # sys_filesystem_unix_spec.rb
3
+ #
4
+ # Specs for the Sys::Filesystem.stat method and related stuff.
5
+ # This test suite should be run via the 'rake spec' task.
6
+ ####################################################################
7
+ require 'spec_helper'
8
+ require 'sys-filesystem'
9
+ require 'pathname'
10
+
11
+ RSpec.describe Sys::Filesystem, :unix => true do
12
+ let(:solaris) { RbConfig::CONFIG['host_os'] =~ /sunos|solaris/i }
13
+ let(:linux) { RbConfig::CONFIG['host_os'] =~ /linux/i }
14
+ let(:bsd) { RbConfig::CONFIG['host_os'] =~ /bsd/i }
15
+ let(:darwin) { RbConfig::CONFIG['host_os'] =~ /mac|darwin/i }
16
+ let(:root) { '/' }
17
+
18
+ before do
19
+ @stat = Sys::Filesystem.stat(root)
20
+ @size = 58720256
21
+ end
22
+
23
+ example "version number is set to the expected value" do
24
+ expect(Sys::Filesystem::VERSION).to eq('1.4.3')
25
+ expect(Sys::Filesystem::VERSION).to be_frozen
26
+ end
27
+
28
+ example "you cannot instantiate an instance" do
29
+ expect{ described_class.new }.to raise_error(NoMethodError)
30
+ end
31
+
32
+ example "stat path works as expected" do
33
+ expect(@stat).to respond_to(:path)
34
+ expect(@stat.path).to eq(root)
35
+ end
36
+
37
+ example "stat block_size works as expected" do
38
+ expect(@stat).to respond_to(:block_size)
39
+ expect(@stat.block_size).to be_kind_of(Numeric)
40
+ end
41
+
42
+ example "stat fragment_size works as expected" do
43
+ expect(@stat).to respond_to(:fragment_size)
44
+ expect(@stat.fragment_size).to be_kind_of(Numeric)
45
+ end
46
+
47
+ example "stat fragment_size is a plausible value" do
48
+ expect(@stat.fragment_size).to be >= 512
49
+ expect(@stat.fragment_size).to be <= 16384
50
+ end
51
+
52
+ example "stat blocks works as expected" do
53
+ expect(@stat).to respond_to(:blocks)
54
+ expect(@stat.blocks).to be_kind_of(Numeric)
55
+ end
56
+
57
+ example "stat blocks_free works as expected" do
58
+ expect(@stat).to respond_to(:blocks_free)
59
+ expect(@stat.blocks_free).to be_kind_of(Numeric)
60
+ end
61
+
62
+ example "stat blocks_available works as expected" do
63
+ expect(@stat).to respond_to(:blocks_available)
64
+ expect(@stat.blocks_available).to be_kind_of(Numeric)
65
+ end
66
+
67
+ example "stat files works as expected" do
68
+ expect(@stat).to respond_to(:files)
69
+ expect(@stat.files).to be_kind_of(Numeric)
70
+ end
71
+
72
+ example "stat inodes is an alias for files" do
73
+ expect(@stat).to respond_to(:inodes)
74
+ expect(@stat.method(:inodes)).to eq(@stat.method(:files))
75
+ end
76
+
77
+ example "stat files tree works as expected" do
78
+ expect(@stat).to respond_to(:files_free)
79
+ expect(@stat.files_free).to be_kind_of(Numeric)
80
+ end
81
+
82
+ example "stat inodes_free is an alias for files_free" do
83
+ expect(@stat).to respond_to(:inodes_free)
84
+ expect(@stat.method(:inodes_free)).to eq(@stat.method(:files_free))
85
+ end
86
+
87
+ example "stat files_available works as expected" do
88
+ expect(@stat).to respond_to(:files_available)
89
+ expect(@stat.files_available).to be_kind_of(Numeric)
90
+ end
91
+
92
+ example "stat inodes_available is an alias for files_available" do
93
+ expect(@stat).to respond_to(:inodes_available)
94
+ expect(@stat.method(:inodes_available)).to eq(@stat.method(:files_available))
95
+ end
96
+
97
+ example "stat filesystem_id works as expected" do
98
+ expect(@stat).to respond_to(:filesystem_id)
99
+ expect(@stat.filesystem_id).to be_kind_of(Integer)
100
+ end
101
+
102
+ example "stat flags works as expected" do
103
+ expect(@stat).to respond_to(:flags)
104
+ expect(@stat.flags).to be_kind_of(Numeric)
105
+ end
106
+
107
+ example "stat name_max works as expected" do
108
+ expect(@stat).to respond_to(:name_max)
109
+ expect(@stat.name_max).to be_kind_of(Numeric)
110
+ end
111
+
112
+ example "stat base_type works as expected" do
113
+ skip "base_type test skipped except on Solaris" unless solaris
114
+
115
+ expect(@stat).to respond_to(:base_type)
116
+ expect(@stat.base_type).to be_kind_of(String)
117
+ end
118
+
119
+ example "stat constants are defined" do
120
+ expect(Sys::Filesystem::Stat::RDONLY).not_to be_nil
121
+ expect(Sys::Filesystem::Stat::NOSUID).not_to be_nil
122
+ end
123
+
124
+ example "stat constants for solaris are defined" do
125
+ skip "NOTRUNC test skipped except on Solaris" unless solaris
126
+ expect(Sys::Filesystem::Stat::NOTRUNC).not_to be_nil
127
+ end
128
+
129
+ example "stat bytes_total works as expected" do
130
+ expect(@stat).to respond_to(:bytes_total)
131
+ expect(@stat.bytes_total).to be_kind_of(Numeric)
132
+ end
133
+
134
+ example "stat bytes_free works as expected" do
135
+ expect(@stat).to respond_to(:bytes_free)
136
+ expect(@stat.bytes_free).to be_kind_of(Numeric)
137
+ expect(@stat.blocks_free * @stat.fragment_size).to eq(@stat.bytes_free)
138
+ end
139
+
140
+ example "stat bytes_available works as expected" do
141
+ expect(@stat).to respond_to(:bytes_available)
142
+ expect(@stat.bytes_available).to be_kind_of(Numeric)
143
+ expect(@stat.blocks_available * @stat.fragment_size).to eq(@stat.bytes_available)
144
+ end
145
+
146
+ example "stat bytes works as expected" do
147
+ expect(@stat).to respond_to(:bytes_used)
148
+ expect(@stat.bytes_used).to be_kind_of(Numeric)
149
+ end
150
+
151
+ example "stat percent_used works as expected" do
152
+ expect(@stat).to respond_to(:percent_used)
153
+ expect(@stat.percent_used).to be_kind_of(Float)
154
+ end
155
+
156
+ example "stat singleton method requires an argument" do
157
+ expect{ Sys::Filesystem.stat }.to raise_error(ArgumentError)
158
+ end
159
+
160
+ example "stat case_insensitive method works as expected" do
161
+ expected = darwin ? true : false
162
+ expect(@stat.case_insensitive?).to eq(expected)
163
+ expect(Sys::Filesystem.stat(Dir.home).case_insensitive?).to eq(expected)
164
+ end
165
+
166
+ example "stat case_sensitive method works as expected" do
167
+ expected = darwin ? false : true
168
+ expect(@stat.case_sensitive?).to eq(expected)
169
+ expect(Sys::Filesystem.stat(Dir.home).case_sensitive?).to eq(expected)
170
+ end
171
+
172
+ example "numeric helper methods are defined" do
173
+ expect(@size).to respond_to(:to_kb)
174
+ expect(@size).to respond_to(:to_mb)
175
+ expect(@size).to respond_to(:to_gb)
176
+ expect(@size).to respond_to(:to_tb)
177
+ end
178
+
179
+ example "to_kb works as expected" do
180
+ expect(@size.to_kb).to eq(57344)
181
+ end
182
+
183
+ example "to_mb works as expected" do
184
+ expect(@size.to_mb).to eq(56)
185
+ end
186
+
187
+ example "to_gb works as expected" do
188
+ expect(@size.to_gb).to eq(0)
189
+ end
190
+
191
+ context "Filesystem.stat(Pathname)" do
192
+ before do
193
+ @stat_pathname = Sys::Filesystem.stat(Pathname.new(root))
194
+ end
195
+
196
+ example "stat with Pathname argument works as expected" do
197
+ expect(@stat_pathname.class).to eq(@stat.class)
198
+ expect(@stat_pathname.path).to eq(@stat.path)
199
+ expect(@stat_pathname.block_size).to eq(@stat.block_size)
200
+ expect(@stat_pathname.fragment_size).to eq(@stat.fragment_size)
201
+ expect(@stat_pathname.blocks).to eq(@stat.blocks)
202
+ expect(@stat_pathname.blocks_free).to eq(@stat.blocks_free)
203
+ expect(@stat_pathname.blocks_available).to eq(@stat.blocks_available)
204
+ expect(@stat_pathname.files).to eq(@stat.files)
205
+ expect(@stat_pathname.files_free).to eq(@stat.files_free)
206
+ expect(@stat_pathname.files_available).to eq(@stat.files_available)
207
+ expect(@stat_pathname.filesystem_id).to eq(@stat.filesystem_id)
208
+ expect(@stat_pathname.flags).to eq(@stat.flags)
209
+ expect(@stat_pathname.name_max).to eq(@stat.name_max)
210
+ expect(@stat_pathname.base_type).to eq(@stat.base_type)
211
+ end
212
+ end
213
+
214
+ context "Filesystem.stat(File)" do
215
+ before do
216
+ @stat_file = File.open(root){ |file| Sys::Filesystem.stat(file) }
217
+ end
218
+
219
+ example "stat with File argument works as expected" do
220
+ expect(@stat_file.class).to eq(@stat.class)
221
+ expect(@stat_file.path).to eq(@stat.path)
222
+ expect(@stat_file.block_size).to eq(@stat.block_size)
223
+ expect(@stat_file.fragment_size).to eq(@stat.fragment_size)
224
+ expect(@stat_file.blocks).to eq(@stat.blocks)
225
+ expect(@stat_file.blocks_free).to eq(@stat.blocks_free)
226
+ expect(@stat_file.blocks_available).to eq(@stat.blocks_available)
227
+ expect(@stat_file.files).to eq(@stat.files)
228
+ expect(@stat_file.files_free).to eq(@stat.files_free)
229
+ expect(@stat_file.files_available).to eq(@stat.files_available)
230
+ expect(@stat_file.filesystem_id).to eq(@stat.filesystem_id)
231
+ expect(@stat_file.flags).to eq(@stat.flags)
232
+ expect(@stat_file.name_max).to eq(@stat.name_max)
233
+ expect(@stat_file.base_type).to eq(@stat.base_type)
234
+ end
235
+ end
236
+
237
+ context "Filesystem.stat(Dir)" do
238
+ before do
239
+ @stat_dir = Dir.open(root){ |dir| Sys::Filesystem.stat(dir) }
240
+ end
241
+
242
+ example "stat with Dir argument works as expected" do
243
+ expect(@stat_dir.class).to eq(@stat.class)
244
+ expect(@stat_dir.path).to eq(@stat.path)
245
+ expect(@stat_dir.block_size).to eq(@stat.block_size)
246
+ expect(@stat_dir.fragment_size).to eq(@stat.fragment_size)
247
+ expect(@stat_dir.blocks).to eq(@stat.blocks)
248
+ expect(@stat_dir.blocks_free).to eq(@stat.blocks_free)
249
+ expect(@stat_dir.blocks_available).to eq(@stat.blocks_available)
250
+ expect(@stat_dir.files).to eq(@stat.files)
251
+ expect(@stat_dir.files_free).to eq(@stat.files_free)
252
+ expect(@stat_dir.files_available).to eq(@stat.files_available)
253
+ expect(@stat_dir.filesystem_id).to eq(@stat.filesystem_id)
254
+ expect(@stat_dir.flags).to eq(@stat.flags)
255
+ expect(@stat_dir.name_max).to eq(@stat.name_max)
256
+ expect(@stat_dir.base_type).to eq(@stat.base_type)
257
+ end
258
+ end
259
+
260
+ context "Filesystem::Mount" do
261
+ let(:mount){ Sys::Filesystem.mounts[0] }
262
+
263
+ before do
264
+ @array = []
265
+ end
266
+
267
+ example "mounts singleton method works as expected without a block" do
268
+ expect{ @array = Sys::Filesystem.mounts }.not_to raise_error
269
+ expect(@array[0]).to be_kind_of(Sys::Filesystem::Mount)
270
+ end
271
+
272
+ example "mounts singleton method works as expected with a block" do
273
+ expect{ Sys::Filesystem.mounts{ |m| @array << m } }.not_to raise_error
274
+ expect(@array[0]).to be_kind_of(Sys::Filesystem::Mount)
275
+ end
276
+
277
+ example "calling the mounts singleton method a large number of times does not cause issues" do
278
+ expect{ 1000.times{ @array = Sys::Filesystem.mounts } }.not_to raise_error
279
+ end
280
+
281
+ example "mount name method works as expected" do
282
+ expect(mount).to respond_to(:name)
283
+ expect(mount.name).to be_kind_of(String)
284
+ end
285
+
286
+ example "mount fsname is an alias for name" do
287
+ expect(mount).to respond_to(:fsname)
288
+ expect(mount.method(:fsname)).to eq(mount.method(:name))
289
+ end
290
+
291
+ example "mount point method works as expected" do
292
+ expect(mount).to respond_to(:mount_point)
293
+ expect(mount.mount_point).to be_kind_of(String)
294
+ end
295
+
296
+ example "mount dir is an alias for mount_point" do
297
+ expect(mount).to respond_to(:dir)
298
+ expect(mount.method(:dir)).to eq(mount.method(:mount_point))
299
+ end
300
+
301
+ example "mount mount_type works as expected" do
302
+ expect(mount).to respond_to(:mount_type)
303
+ expect(mount.mount_type).to be_kind_of(String)
304
+ end
305
+
306
+ example "mount options works as expected" do
307
+ expect(mount).to respond_to(:options)
308
+ expect(mount.options).to be_kind_of(String)
309
+ end
310
+
311
+ example "mount opts is an alias for options" do
312
+ expect(mount).to respond_to(:opts)
313
+ expect(mount.method(:opts)).to eq(mount.method(:options))
314
+ end
315
+
316
+ example "mount time works as expected" do
317
+ expect(mount).to respond_to(:mount_time)
318
+
319
+ if solaris
320
+ expect(mount.mount_time).to be_kind_of(Time)
321
+ else
322
+ expect(mount.mount_time).to be_nil
323
+ end
324
+ end
325
+
326
+ example "mount dump_frequency works as expected" do
327
+ msg = 'dump_frequency test skipped on this platform'
328
+ skip msg if solaris || bsd || darwin
329
+ expect(mount).to respond_to(:dump_frequency)
330
+ expect(mount.dump_frequency).to be_kind_of(Numeric)
331
+ end
332
+
333
+ example "mount freq is an alias for dump_frequency" do
334
+ expect(mount).to respond_to(:freq)
335
+ expect(mount.method(:freq)).to eq(mount.method(:dump_frequency))
336
+ end
337
+
338
+ example "mount pass_number works as expected" do
339
+ msg = 'pass_number test skipped on this platform'
340
+ skip msg if solaris || bsd || darwin
341
+ expect(mount).to respond_to(:pass_number)
342
+ expect(mount.pass_number).to be_kind_of(Numeric)
343
+ end
344
+
345
+ example "mount passno is an alias for pass_number" do
346
+ expect(mount).to respond_to(:passno)
347
+ expect(mount.method(:passno)).to eq(mount.method(:pass_number))
348
+ end
349
+
350
+ example "mount_point singleton method works as expected" do
351
+ expect(Sys::Filesystem).to respond_to(:mount_point)
352
+ expect{ Sys::Filesystem.mount_point(Dir.pwd) }.not_to raise_error
353
+ expect(Sys::Filesystem.mount_point(Dir.pwd)).to be_kind_of(String)
354
+ end
355
+
356
+ example "mount singleton method is defined" do
357
+ expect(Sys::Filesystem).to respond_to(:mount)
358
+ end
359
+
360
+ example "umount singleton method is defined" do
361
+ expect(Sys::Filesystem).to respond_to(:umount)
362
+ end
363
+ end
364
+
365
+ context "FFI" do
366
+ before(:context) do
367
+ require 'mkmf-lite'
368
+ end
369
+
370
+ let(:dummy) { Class.new { extend Mkmf::Lite } }
371
+
372
+ example "ffi functions are private" do
373
+ expect(Sys::Filesystem.methods.include?('statvfs')).to be false
374
+ expect(Sys::Filesystem.methods.include?('strerror')).to be false
375
+ end
376
+
377
+ example "statfs struct is expected size" do
378
+ header = bsd || darwin ? 'sys/mount.h' : 'sys/statfs.h'
379
+ expect(Sys::Filesystem::Structs::Statfs.size).to eq(dummy.check_sizeof('struct statfs', header))
380
+ end
381
+
382
+ example "statvfs struct is expected size" do
383
+ expect(Sys::Filesystem::Structs::Statvfs.size).to eq(dummy.check_sizeof('struct statvfs', 'sys/statvfs.h'))
384
+ end
385
+
386
+ example "mnttab struct is expected size" do
387
+ skip "mnttab test skipped except on Solaris" unless solaris
388
+ expect(Sys::Filesystem::Structs::Mnttab.size).to eq(dummy.check_sizeof('struct mnttab', 'sys/mnttab.h'))
389
+ end
390
+
391
+ example "mntent struct is expected size" do
392
+ skip "mnttab test skipped except on Linux" unless linux
393
+ expect(Sys::Filesystem::Structs::Mntent.size).to eq(dummy.check_sizeof('struct mntent', 'mntent.h'))
394
+ end
395
+ end
396
+ end