torquebox-vfs 1.0.0.CR1-java
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.
- data/lib/gem_hook.rb +18 -0
- data/lib/jboss-common-core-2.2.17.GA.jar +0 -0
- data/lib/jboss-logging-3.0.0.Beta4.jar +0 -0
- data/lib/jboss-logging-spi-2.2.0.CR1.jar +0 -0
- data/lib/jboss-logmanager-1.2.0.CR9.jar +0 -0
- data/lib/jboss-logmanager-log4j-1.0.0.CR3.jar +0 -0
- data/lib/jboss-vfs-3.0.0.GA.jar +0 -0
- data/lib/log4j-1.2.14.jar +0 -0
- data/lib/org.torquebox.vfs.rb +20 -0
- data/lib/torquebox/vfs/debug_filter.rb +37 -0
- data/lib/torquebox/vfs/dir.rb +78 -0
- data/lib/torquebox/vfs/ext/dir.rb +188 -0
- data/lib/torquebox/vfs/ext/file.rb +278 -0
- data/lib/torquebox/vfs/ext/file_test.rb +48 -0
- data/lib/torquebox/vfs/ext/io.rb +158 -0
- data/lib/torquebox/vfs/ext/jdbc.rb +65 -0
- data/lib/torquebox/vfs/ext/kernel.rb +30 -0
- data/lib/torquebox/vfs/ext/pathname.rb +31 -0
- data/lib/torquebox/vfs/ext/tempfile.rb +31 -0
- data/lib/torquebox/vfs/ext/vfs.rb +24 -0
- data/lib/torquebox/vfs/ext/virtual_file.rb +72 -0
- data/lib/torquebox/vfs/file.rb +188 -0
- data/lib/torquebox/vfs/glob_filter.rb +46 -0
- data/lib/torquebox/vfs/glob_translator.rb +204 -0
- data/lib/torquebox/vfs.rb +100 -0
- data/lib/torquebox-vfs.jar +0 -0
- data/lib/torquebox-vfs.rb +20 -0
- data/lib/vfs.rb +20 -0
- data/licenses/lgpl-2.1.txt +504 -0
- data/spec/dir_spec.rb +259 -0
- data/spec/file_spec.rb +451 -0
- data/spec/file_test_spec.rb +34 -0
- data/spec/io_spec.rb +82 -0
- data/spec/jdbc_spec.rb +68 -0
- data/spec/pathname_spec.rb +20 -0
- data/spec/spec_helper.rb +171 -0
- data/spec/vfs_dir_spec.rb +23 -0
- data/spec/vfs_spec.rb +36 -0
- metadata +121 -0
data/spec/file_spec.rb
ADDED
@@ -0,0 +1,451 @@
|
|
1
|
+
|
2
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
3
|
+
require 'tempfile'
|
4
|
+
require 'pathname'
|
5
|
+
|
6
|
+
describe "File extensions for VFS" do
|
7
|
+
|
8
|
+
extend TestDataCopyHelper
|
9
|
+
|
10
|
+
it "should report writable-ness for VFS urls" do
|
11
|
+
prefix = test_copy_base_path( :relative )
|
12
|
+
url = vfs_path( "#{prefix}/home/larry/file1.txt" )
|
13
|
+
File.exists?( url ).should be_true
|
14
|
+
File.exist?( url ).should be_true
|
15
|
+
File.writable?( url ).should be_true
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should not loop infinitely" do
|
19
|
+
File.exists?("/nothingtoseehere").should be_false
|
20
|
+
File.exists?(vfs_path("/nothingtoseehere")).should be_false
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "expand_path" do
|
24
|
+
it "should handle relative non-vfs path" do
|
25
|
+
File.expand_path("../foo", "/tmp/bar").should == "#{absolute_prefix}/tmp/foo"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should handle relative to vfs path" do
|
29
|
+
File.expand_path("../foo", vfs_path("/tmp/bar") ).should == vfs_path("#{absolute_prefix}/tmp/foo")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should expand paths relative to VFS urls as VFS" do
|
33
|
+
absolute = File.expand_path("db/development.sqlite3", vfs_path("/path/to/app") )
|
34
|
+
absolute.should eql( vfs_path("#{absolute_prefix}/path/to/app/db/development.sqlite3") )
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should expand paths relative to VFS pathnames as VFS" do
|
38
|
+
absolute = File.expand_path("db/development.sqlite3", Pathname.new( vfs_path( "/path/to/app" ) ) )
|
39
|
+
absolute.should eql( vfs_path("#{absolute_prefix}/path/to/app/db/development.sqlite3") )
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should expand absolute Pathname objects correctly" do
|
43
|
+
File.expand_path( vfs_path("/foo") ).should eql( vfs_path("/foo") )
|
44
|
+
File.expand_path(Pathname.new( vfs_path("/foo"))).should eql( vfs_path("/foo") )
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should return first path when given two vfs paths" do
|
48
|
+
File.expand_path( vfs_path("/tmp/foo"), vfs_path("/tmp/bar")).should == vfs_path("/tmp/foo")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should handle vfs urls as readable" do
|
53
|
+
File.readable?( __FILE__ ).should be_true
|
54
|
+
File.readable?( vfs_path(__FILE__) ).should be_true
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should report readable-ness for files inside vfs archives" do
|
58
|
+
path = "#{archive1_vfs_path}/web.xml"
|
59
|
+
File.readable?( path ).should be_true
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should report readable-ness for non-existent files inside vfs archives" do
|
63
|
+
path = "#{archive1_vfs_path}/file_that_does_not_exist.txt"
|
64
|
+
File.readable?( path ).should be_false
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should handle #'s in filenames properly" do
|
68
|
+
prefix = test_copy_base_path( :absolute )
|
69
|
+
File.file?( "#{prefix}/#bad-uri#" ).should be_true
|
70
|
+
File.file?( vfs_path( "#{prefix}/#bad-uri#" ) ).should be_true
|
71
|
+
File.file?( vfs_path( "#{prefix}/#missing#" ) ).should be_false
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should handle spaces in filenames properly" do
|
75
|
+
prefix = test_copy_base_path( :absolute )
|
76
|
+
File.file?( "#{prefix}/sound of music/flibbity jibbit" ).should be_true
|
77
|
+
File.file?( vfs_path("#{prefix}/sound of music/flibbity jibbit" ) ).should be_true
|
78
|
+
File.file?( vfs_path("#{prefix}/sound of music/flibberty gibbet" ) ).should be_false
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should handle percent-encoded filenames" do
|
82
|
+
prefix = test_copy_base_path( :absolute )
|
83
|
+
File.file?( "#{prefix}/views%2Flocalhost%3A8080%2Fposts" ).should be_true
|
84
|
+
File.file?( vfs_path("#{prefix}/views%2Flocalhost%3A8080%2Fposts" ) ).should be_true
|
85
|
+
File.file?( vfs_path("#{prefix}/views%2Flocalhost%3A8080%2Fmissing" ) ).should be_false
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should handle backslashes in filenames even though there's no good reason to use them regardless of platform" do
|
89
|
+
filename = __FILE__.gsub("/","\\")
|
90
|
+
File.readable?( filename ).should be_true
|
91
|
+
File.readable?( vfs_path( filename ) ).should be_true
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should be able to chmod real files with vfs urls" do
|
95
|
+
path = File.expand_path("foo")
|
96
|
+
begin
|
97
|
+
f = File.new(path, "w")
|
98
|
+
FileUtils.chmod( 0666, vfs_path( path ) )
|
99
|
+
m1 = f.stat.mode
|
100
|
+
FileUtils.chmod( 0644, vfs_path( path ) )
|
101
|
+
m2 = f.stat.mode
|
102
|
+
m1.should_not eql(m2) unless TESTING_ON_WINDOWS
|
103
|
+
ensure
|
104
|
+
File.delete(path) rescue nil
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should be able to read file after chmod from a stat" do
|
109
|
+
# Similar to what Rails' File.atomic_write does (TORQUE-174)
|
110
|
+
p1 = vfs_path( File.expand_path("p1") )
|
111
|
+
p2 = vfs_path( File.expand_path("p2") )
|
112
|
+
begin
|
113
|
+
File.open(p1, "w") { }
|
114
|
+
File.open(p2, "w") { }
|
115
|
+
File.chmod(File.stat(p1).mode, p2)
|
116
|
+
File.read(p2)
|
117
|
+
ensure
|
118
|
+
File.unlink(p1, p2) rescue nil
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should chmod inside vfs archive when directory mounted on filesystem" do
|
123
|
+
FileUtils.rm_rf "target/mnt"
|
124
|
+
archive = org.jboss.vfs::VFS.child( @archive1_path )
|
125
|
+
logical = archive.getChild( "lib" )
|
126
|
+
physical = java.io::File.new( "target/mnt" )
|
127
|
+
physical.mkdirs
|
128
|
+
mount = org.jboss.vfs::VFS.mountReal( physical, logical )
|
129
|
+
path = "#{@archive1_path}/lib/chmod_test"
|
130
|
+
begin
|
131
|
+
lambda {
|
132
|
+
f = File.new("target/mnt/chmod_test", "w" )
|
133
|
+
FileUtils.chmod( 0666, path )
|
134
|
+
m1 = f.stat.mode
|
135
|
+
FileUtils.chmod( 0755, path )
|
136
|
+
m2 = f.stat.mode
|
137
|
+
m1.should_not eql(m2) unless TESTING_ON_WINDOWS
|
138
|
+
}.should_not raise_error
|
139
|
+
ensure
|
140
|
+
mount.close
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should be able to create new files with vfs urls" do
|
145
|
+
lambda {
|
146
|
+
File.new( vfs_path( __FILE__ ), 'r')
|
147
|
+
}.should_not raise_error
|
148
|
+
end
|
149
|
+
|
150
|
+
it "should allow rm_rf and mkdir_p of vfs path" do
|
151
|
+
parent = Dir.tmpdir
|
152
|
+
workdir = parent + '/vfs-test'
|
153
|
+
child = workdir + "/b/c"
|
154
|
+
FileUtils.rm_rf vfs_path( workdir )
|
155
|
+
File.exist?( vfs_path( child ) ).should be_false
|
156
|
+
FileUtils.mkdir_p( vfs_path( child ) )
|
157
|
+
File.exist?( vfs_path( child ) ).should be_true
|
158
|
+
FileUtils.rm_rf vfs_path( workdir )
|
159
|
+
File.exist?( vfs_path( workdir ) ).should be_false
|
160
|
+
File.exist?( vfs_path( parent ) ).should be_true
|
161
|
+
end
|
162
|
+
|
163
|
+
describe "Tempfiles" do
|
164
|
+
it "should be created in default dir" do
|
165
|
+
lambda {
|
166
|
+
t = Tempfile.new("temp_file_test")
|
167
|
+
File.exist?(t.path).should be_true
|
168
|
+
}.should_not raise_error
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should be created in a non-vfs directory" do
|
172
|
+
lambda {
|
173
|
+
t = Tempfile.new("temp_file_test", Dir.tmpdir)
|
174
|
+
File.exist?(t.path).should be_true
|
175
|
+
}.should_not raise_error
|
176
|
+
end
|
177
|
+
|
178
|
+
it "should be created in a vfs directory" do
|
179
|
+
lambda {
|
180
|
+
t = Tempfile.new("temp_file_test", "vfs:#{Dir.tmpdir}")
|
181
|
+
File.exist?(t.path).should be_true
|
182
|
+
}.should_not raise_error
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
describe "open" do
|
187
|
+
it "should return File when called on File with VFS url" do
|
188
|
+
f = File.open( archive1_vfs_path, 'r')
|
189
|
+
f.should be_an_instance_of(File)
|
190
|
+
f.close
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should return File when called on File without VFS url" do
|
194
|
+
f = File.open(archive1_path, 'r')
|
195
|
+
f.should be_an_instance_of(File)
|
196
|
+
f.close
|
197
|
+
end
|
198
|
+
|
199
|
+
it "should find files by pathnames" do
|
200
|
+
lambda {
|
201
|
+
f = File.open(Pathname.new(archive1_path), 'r')
|
202
|
+
f.close
|
203
|
+
}.should_not raise_error
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
describe "new" do
|
208
|
+
it "should return File when called on File with VFS url" do
|
209
|
+
f = File.new( archive1_vfs_path, 'r')
|
210
|
+
f.should be_an_instance_of(File)
|
211
|
+
f.close
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should return File when called on File without VFS url" do
|
215
|
+
f = File.new( archive1_path, 'r')
|
216
|
+
f.should be_an_instance_of(File)
|
217
|
+
f.close
|
218
|
+
end
|
219
|
+
|
220
|
+
it "should create objects that respond to lstat for files in an archive" do
|
221
|
+
f = File.new( "#{archive1_vfs_path}/web.xml")
|
222
|
+
f.lstat.should_not be_nil
|
223
|
+
f.close
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
[ :absolute, :relative, :vfs ].each do |style|
|
228
|
+
describe "with #{style} paths" do
|
229
|
+
case ( style )
|
230
|
+
when :relative
|
231
|
+
prefix = test_copy_base_path( :relative )
|
232
|
+
when :absolute
|
233
|
+
prefix = test_copy_base_path( :absolute )
|
234
|
+
when :vfs
|
235
|
+
prefix = test_copy_base_path( :vfs )
|
236
|
+
end
|
237
|
+
|
238
|
+
unless TESTING_ON_WINDOWS && ( style == :absolute ) # WTF?
|
239
|
+
it "should provide size for normal files" do
|
240
|
+
path = "#{prefix}/home/larry/file1.txt"
|
241
|
+
s = File.size( path )
|
242
|
+
s.should_not be_nil
|
243
|
+
s.should be > 0
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
it "should throw NOENT for size of non-existant files" do
|
248
|
+
lambda {
|
249
|
+
File.size( "#{prefix}/home/larry/NOT_REALLY_file1.txt" )
|
250
|
+
}.should raise_error
|
251
|
+
end
|
252
|
+
|
253
|
+
|
254
|
+
unless TESTING_ON_WINDOWS && ( style == :absolute ) # WTF?
|
255
|
+
it "should provide size? for normal files" do
|
256
|
+
s = File.size?( "#{prefix}/home/larry/file1.txt" )
|
257
|
+
s.should_not be_nil
|
258
|
+
s.should be > 0
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
it "should not throw NOENT for size? of non-existant files" do
|
263
|
+
lambda {
|
264
|
+
s = File.size?( "#{prefix}/home/larry/NOT_REALLY_file1.txt" )
|
265
|
+
s.should be_nil
|
266
|
+
}.should_not raise_error
|
267
|
+
end
|
268
|
+
|
269
|
+
it "should provide mtime for normal files" do
|
270
|
+
mtime = File.mtime( "#{prefix}/home/larry/file1.txt" )
|
271
|
+
mtime.should_not be_nil
|
272
|
+
end
|
273
|
+
|
274
|
+
it "should report writeable-ness for normal files" do
|
275
|
+
File.writable?( "#{prefix}/home/larry/file1.txt" ).should be_true
|
276
|
+
end
|
277
|
+
|
278
|
+
# move to kernel_spec
|
279
|
+
it "should allow writing with truncation via open()" do
|
280
|
+
open( "#{prefix}/home/larry/file1.txt", (File::WRONLY | File::TRUNC | File::CREAT) ) do |file|
|
281
|
+
file.puts "howdy"
|
282
|
+
end
|
283
|
+
contents = File.read( "#{prefix}/home/larry/file1.txt" )
|
284
|
+
contents.should eql( "howdy\n" )
|
285
|
+
end
|
286
|
+
|
287
|
+
# move to kernel_spec
|
288
|
+
it "should allow writing with appending via open()" do
|
289
|
+
open( "#{prefix}/home/larry/file1.txt", (File::WRONLY | File::APPEND | File::CREAT) ) do |file|
|
290
|
+
file.puts "howdy"
|
291
|
+
end
|
292
|
+
contents = File.read( "#{prefix}/home/larry/file1.txt" )
|
293
|
+
contents.should eql( "This is file 1\nhowdy\n" )
|
294
|
+
|
295
|
+
fs_file = File.join( "#{test_copy_base_path(:relative)}/home/larry/file1.txt" )
|
296
|
+
fs_contents = File.read( fs_file )
|
297
|
+
fs_contents.should eql( "This is file 1\nhowdy\n" )
|
298
|
+
end
|
299
|
+
|
300
|
+
it "should allow writing new files via File.open" do
|
301
|
+
File.open( "#{prefix}/home/larry/new_file.txt", 'w' ) do |file|
|
302
|
+
file.puts "howdy"
|
303
|
+
end
|
304
|
+
contents = File.read( "#{prefix}/home/larry/new_file.txt" )
|
305
|
+
contents.should eql( "howdy\n")
|
306
|
+
end
|
307
|
+
|
308
|
+
it "should allow stat for normal files" do
|
309
|
+
file = "#{prefix}/home/larry/file1.txt"
|
310
|
+
stat = File.stat( file )
|
311
|
+
stat.should_not be_nil
|
312
|
+
stat.mtime.to_s.should eql( File.mtime( file ).to_s )
|
313
|
+
end
|
314
|
+
|
315
|
+
it "should not return a stat for missing files" do
|
316
|
+
lambda {
|
317
|
+
stat = File.stat( "missing file" )
|
318
|
+
}.should raise_error(Errno::ENOENT)
|
319
|
+
lambda {
|
320
|
+
stat = File.stat( vfs_path("/missing/file") )
|
321
|
+
}.should raise_error(Errno::ENOENT)
|
322
|
+
end
|
323
|
+
|
324
|
+
it "should provide mtime for files in an archive" do
|
325
|
+
mtime = File.mtime( "#{prefix}/home/larry/archive1.jar/web.xml" )
|
326
|
+
mtime.should_not be_nil
|
327
|
+
end
|
328
|
+
|
329
|
+
it "should allow stat for files in an archive" do
|
330
|
+
file = "#{prefix}/home/larry/archive1.jar/web.xml"
|
331
|
+
stat = File.stat( file )
|
332
|
+
stat.should_not be_nil
|
333
|
+
stat.mtime.should eql( File.mtime( file ) )
|
334
|
+
end
|
335
|
+
|
336
|
+
it "should provide mtime for files in a nested archive" do
|
337
|
+
mtime = File.mtime( "#{prefix}/home/larry/archive1.jar/lib/archive2.jar/manifest.txt" )
|
338
|
+
mtime.should_not be_nil
|
339
|
+
end
|
340
|
+
|
341
|
+
it "should test existance of normal files" do
|
342
|
+
File.exist?( "#{prefix}/home/larry/file1.txt" ).should be_true
|
343
|
+
File.exist?( "#{prefix}/home/larry/file42.txt" ).should be_false
|
344
|
+
end
|
345
|
+
|
346
|
+
it "should test existance of files in an archive" do
|
347
|
+
File.exist?( "#{prefix}/home/larry/archive1.jar/web.xml" ).should be_true
|
348
|
+
end
|
349
|
+
|
350
|
+
it "should test directoryness for normal files" do
|
351
|
+
File.directory?( "#{prefix}/home/larry" ).should be_true
|
352
|
+
File.directory?( "#{prefix}/home/larry/file1.txt" ).should be_false
|
353
|
+
end
|
354
|
+
|
355
|
+
it "should test directoryness for files within an archive" do
|
356
|
+
File.directory?( "#{prefix}/home/larry/archive1.jar/lib" ).should be_true
|
357
|
+
File.directory?( "#{prefix}/home/larry/archive1.jar/web.xml" ).should be_false
|
358
|
+
end
|
359
|
+
|
360
|
+
it "should test directoryness for non-existant files" do
|
361
|
+
File.directory?( "#{prefix}/home/larry/archive1.jar/fib" ).should be_false
|
362
|
+
File.directory?( "#{prefix}/home/larry/archive1.jar/tacos" ).should be_false
|
363
|
+
File.directory?( "#{prefix}/tacos" ).should be_false
|
364
|
+
end
|
365
|
+
|
366
|
+
it "should test fileness for normal files" do
|
367
|
+
File.file?( "#{prefix}/home/larry" ).should be_false
|
368
|
+
File.file?( "#{prefix}/home/larry/file1.txt" ).should be_true
|
369
|
+
end
|
370
|
+
|
371
|
+
it "should test fileness for files within an archive" do
|
372
|
+
File.file?( "#{prefix}/home/larry/archive1.jar/lib" ).should be_false
|
373
|
+
File.file?( "#{prefix}/home/larry/archive1.jar/web.xml" ).should be_true
|
374
|
+
end
|
375
|
+
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
describe 'path joinage' do
|
380
|
+
it "should work for relative paths" do
|
381
|
+
File.join("", "./foo").should == "/./foo"
|
382
|
+
File.join("/", "./foo").should == "/./foo"
|
383
|
+
File.join("vfs:", "./foo").should == "vfs:/./foo"
|
384
|
+
File.join("vfs:/", "./foo").should == "vfs:/./foo"
|
385
|
+
end
|
386
|
+
it "should work for absolute paths" do
|
387
|
+
File.join("", "/foo").should == "/foo"
|
388
|
+
File.join("/", "/foo").should == "/foo"
|
389
|
+
File.join("vfs:", "/foo").should == "vfs:/foo"
|
390
|
+
File.join("vfs:/", "/foo").should == "vfs:/foo"
|
391
|
+
end
|
392
|
+
it "should work for vfs paths" do
|
393
|
+
File.join("", "vfs:/foo").should == "/foo"
|
394
|
+
File.join("/", "vfs:/foo").should == "/foo"
|
395
|
+
File.join("vfs:", "vfs:/foo").should == "vfs:/foo"
|
396
|
+
File.join("vfs:/", "vfs:/foo").should == "vfs:/foo"
|
397
|
+
end
|
398
|
+
it "should handle a subset of vfs params" do
|
399
|
+
File.join('a', 'b', 'c', 'vfs:/d', 'e').should == 'a/b/c/d/e'
|
400
|
+
File.join('vfs:a', 'b', 'c', 'vfs:/d', 'e').should == 'vfs:a/b/c/d/e'
|
401
|
+
File.join('vfs:/a', 'b', 'c', 'vfs:/d', 'e').should == 'vfs:/a/b/c/d/e'
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
describe 'dirname' do
|
406
|
+
it "should properly handle non-vfs paths" do
|
407
|
+
File.dirname('/').should == '/'
|
408
|
+
File.dirname('/a').should == '/'
|
409
|
+
File.dirname('/a/b').should == '/a'
|
410
|
+
end
|
411
|
+
|
412
|
+
it "should return vfs paths when given a vfs path" do
|
413
|
+
File.dirname('vfs:/').should == 'vfs:/'
|
414
|
+
File.dirname('vfs:/a').should == 'vfs:/'
|
415
|
+
File.dirname('vfs:/a/b').should == 'vfs:/a'
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
419
|
+
describe 'chown' do
|
420
|
+
it "should handle vfs paths" do
|
421
|
+
path = archive1_vfs_path
|
422
|
+
stat = File.stat(path)
|
423
|
+
File.chown( stat.uid, stat.gid, path )
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
describe 'utime' do
|
428
|
+
it "should handle vfs paths" do
|
429
|
+
path = File.expand_path("foo")
|
430
|
+
begin
|
431
|
+
File.new(path, "w")
|
432
|
+
vpath = vfs_path( path )
|
433
|
+
mtime = File.mtime(vpath)
|
434
|
+
File.utime( Time.now, mtime+1, vpath )
|
435
|
+
mtime.should be < File.mtime(vpath)
|
436
|
+
ensure
|
437
|
+
File.delete(path) rescue nil
|
438
|
+
end
|
439
|
+
end
|
440
|
+
end
|
441
|
+
|
442
|
+
describe 'subclasses' do
|
443
|
+
it "should open an instance of the subclass" do
|
444
|
+
class MyFile < File
|
445
|
+
def new_method; 'hello'; end
|
446
|
+
end
|
447
|
+
MyFile.open(__FILE__).new_method.should == 'hello'
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe "File extensions for VFS" do
|
4
|
+
|
5
|
+
it "should delegate to File.directory?" do
|
6
|
+
delegate_to_file(:directory?, 'file')
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should delegate to File.exist?" do
|
10
|
+
delegate_to_file(:exist?, 'file')
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should delegate to File.exists?" do
|
14
|
+
delegate_to_file(:exists?, 'file')
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should delegate to File.file?" do
|
18
|
+
delegate_to_file(:file?, 'file')
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should delegate to File.readable?" do
|
22
|
+
delegate_to_file(:readable?, 'file')
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should delegate to File.writable?" do
|
26
|
+
delegate_to_file(:writable?, 'file')
|
27
|
+
end
|
28
|
+
|
29
|
+
def delegate_to_file(*args)
|
30
|
+
method = args.shift
|
31
|
+
File.should_receive(method).with(*args).and_return('value')
|
32
|
+
FileTest.send(method, *args).should == 'value'
|
33
|
+
end
|
34
|
+
end
|
data/spec/io_spec.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
|
2
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
3
|
+
|
4
|
+
describe "IO extensions for VFS" do
|
5
|
+
|
6
|
+
extend TestDataHelper
|
7
|
+
|
8
|
+
[ :absolute, :relative ].each do |style|
|
9
|
+
[ :vfs, :normal ].each do |vfs_style|
|
10
|
+
describe "with #{vfs_style} #{style} paths" do
|
11
|
+
|
12
|
+
prefix = test_data_base_path( style )
|
13
|
+
prefix = vfs_path( prefix ) if vfs_style == :vfs
|
14
|
+
|
15
|
+
describe 'read' do
|
16
|
+
|
17
|
+
it "should allow reading of regular files" do
|
18
|
+
content = IO.read( "#{prefix}/home/larry/file1.txt" ).chomp
|
19
|
+
content.should_not be_nil
|
20
|
+
content.should_not be_empty
|
21
|
+
content.should eql( "This is file 1" )
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should allow reading of files within an archive" do
|
25
|
+
content = IO.read( "#{prefix}/home/larry/archive1.jar/web.xml" ).chomp
|
26
|
+
content.should_not be_nil
|
27
|
+
content.should_not be_empty
|
28
|
+
content.should eql( "This is web.xml" )
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should allow reading of files within a nested archive" do
|
32
|
+
content = IO.read( "#{prefix}/home/larry/archive1.jar/lib/archive2.jar/manifest.txt" ).chomp
|
33
|
+
content.should_not be_nil
|
34
|
+
content.should_not be_empty
|
35
|
+
content.should eql( "This is manifest.txt" )
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should honor the length argument" do
|
39
|
+
content = IO.read( "#{prefix}/home/larry/file1.txt", 1 ).chomp
|
40
|
+
content.should_not be_nil
|
41
|
+
content.should_not be_empty
|
42
|
+
content.should eql( "T" )
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should honor the offset argument" do
|
46
|
+
content = IO.read( "#{prefix}/home/larry/file1.txt", 1, 1 ).chomp
|
47
|
+
content.should_not be_nil
|
48
|
+
content.should_not be_empty
|
49
|
+
content.should eql( "h" )
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'readline' do
|
55
|
+
|
56
|
+
it "should allow reading a regular file" do
|
57
|
+
content = IO.readlines( "#{prefix}/home/larry/file1.txt" )
|
58
|
+
content.should_not be_nil
|
59
|
+
content.should_not be_empty
|
60
|
+
content.first.chomp.should eql( "This is file 1" )
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should allow reading of files within an archive" do
|
64
|
+
content = IO.readlines( "#{prefix}/home/larry/archive1.jar/web.xml" )
|
65
|
+
content.should_not be_nil
|
66
|
+
content.should_not be_empty
|
67
|
+
content.first.chomp.should eql( "This is web.xml" )
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should allow reading of files within a nested archive" do
|
71
|
+
content = IO.readlines( "#{prefix}/home/larry/archive1.jar/lib/archive2.jar/manifest.txt" )
|
72
|
+
content.should_not be_nil
|
73
|
+
content.should_not be_empty
|
74
|
+
content.first.chomp.should eql( "This is manifest.txt" )
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/spec/jdbc_spec.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
java_import java.util.Properties
|
3
|
+
|
4
|
+
describe "JDBC Extensions for VFS" do
|
5
|
+
|
6
|
+
describe "DriverManager" do
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@driver_manager = java.sql.DriverManager
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "getConnection" do
|
13
|
+
|
14
|
+
it "should call get_connection_with_properties if passed two arguments" do
|
15
|
+
properties = Properties.new
|
16
|
+
@driver_manager.should_receive(:get_connection_with_properties).
|
17
|
+
with("url", properties)
|
18
|
+
@driver_manager.getConnection("url", properties)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should call get_connection_with_username_password if passed three arguments" do
|
22
|
+
@driver_manager.should_receive(:get_connection_with_username_password).
|
23
|
+
with("url", "user", "password")
|
24
|
+
@driver_manager.getConnection("url", "user", "password")
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "get_connection_with_properties" do
|
30
|
+
|
31
|
+
it "should delegate to original method" do
|
32
|
+
properties = Properties.new
|
33
|
+
@driver_manager.should_receive(:get_connection_without_vfs).
|
34
|
+
with("url", properties)
|
35
|
+
@driver_manager.send(:get_connection_with_properties, "url", properties)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should fall back to connect directly" do
|
39
|
+
properties = Properties.new
|
40
|
+
driver = mock('driver')
|
41
|
+
driver.should_receive(:connect).with("url", properties)
|
42
|
+
@driver_manager.registerDriver(driver)
|
43
|
+
@driver_manager.send(:get_connection_with_properties, "url", properties)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "get_connection_with_username_password" do
|
49
|
+
|
50
|
+
it "should delegate to original method" do
|
51
|
+
@driver_manager.should_receive(:get_connection_without_vfs).
|
52
|
+
with("url", "user", "password")
|
53
|
+
@driver_manager.send(:get_connection_with_username_password,
|
54
|
+
"url", "user", "password")
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should fall back to connect directly" do
|
58
|
+
driver = mock('driver')
|
59
|
+
driver.should_receive(:connect).with("url",an_instance_of(Properties))
|
60
|
+
@driver_manager.registerDriver(driver)
|
61
|
+
@driver_manager.send(:get_connection_with_username_password,
|
62
|
+
"url", "user", "password")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
describe "Pathname extensions for VFS" do
|
6
|
+
|
7
|
+
describe "realpath" do
|
8
|
+
it "should expand VFS paths" do
|
9
|
+
pathname = Pathname.new("vfs:/tmp/test")
|
10
|
+
pathname.should_receive(:expand_path).and_return(Pathname.new("/expanded/path"))
|
11
|
+
pathname.realpath.to_s.should == "/expanded/path"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should find real path for non-VFS paths" do
|
15
|
+
pathname = Pathname.new("/tmp/test")
|
16
|
+
pathname.should_receive(:realpath_without_vfs).and_return(Pathname.new("/real/path"))
|
17
|
+
pathname.realpath.to_s.should == "/real/path"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|