rfusefs 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  module FuseFS
2
2
 
3
3
  # A full in-memory filesystem defined with hashes. It is writable to the
4
- # user that mounted it
4
+ # user that mounted it
5
5
  # may create and edit files within it, as well as the programmer
6
6
  # === Usage
7
7
  # root = Metadir.new()
@@ -14,10 +14,10 @@ module FuseFS
14
14
  # Because Metadir is fully recursive, you can mount your own or other defined
15
15
  # directory structures under it. For example, to mount a dictionary filesystem
16
16
  # (see samples/dictfs.rb), use:
17
- #
17
+ #
18
18
  # root.mkdir("/dict",DictFS.new())
19
- #
20
- class MetaDir
19
+ #
20
+ class MetaDir
21
21
 
22
22
  DEFAULT_FS = FuseDir.new()
23
23
 
@@ -66,7 +66,7 @@ module FuseFS
66
66
  # Extended attributes
67
67
  def xattr(path)
68
68
  pathmethod(:xattr,path) do | path |
69
- @xattr[path]
69
+ @xattr[path]
70
70
  end
71
71
  end
72
72
 
@@ -13,7 +13,7 @@ module FuseFS
13
13
  #
14
14
  class PathMapperFS < FuseDir
15
15
 
16
- # Represents a mappted file or directory
16
+ # Represents a mapped file or directory
17
17
  class MNode
18
18
 
19
19
  # Merge extended attributes with the ones from the underlying file
@@ -112,10 +112,10 @@ module FuseFS
112
112
  end
113
113
 
114
114
  # Compatibility and convenience method
115
- # @param [:pm_real_path,String,Symbol] key
116
- # @return [String] {#real_path} if key == :pm_real_path
115
+ # @param [:pm_real_path,String,Symbol] key
116
+ # @return [String] {#real_path} if key == :pm_real_path
117
117
  # @return [MNode] the node representing the file named key
118
- # @return [Object] shortcut for {#options}[key]
118
+ # @return [Object] shortcut for {#options}[key]
119
119
  def[](key)
120
120
  case key
121
121
  when :pm_real_path
@@ -266,7 +266,7 @@ module FuseFS
266
266
  # @yieldparam [Hash] filesystem node
267
267
  # @yieldreturn [true,false] should this node be deleted
268
268
  def cleanup(&block)
269
- recursive_cleanup(@root,&block)
269
+ recursive_cleanup(@root,&block)
270
270
  end
271
271
 
272
272
 
@@ -379,7 +379,7 @@ module FuseFS
379
379
  file.sysseek(offset)
380
380
  file.syswrite(buf[0,sz])
381
381
  end
382
-
382
+
383
383
  # @!visibility private
384
384
  def raw_sync(path,datasync,file=nil)
385
385
  file = @openfiles[path] unless file
@@ -393,7 +393,7 @@ module FuseFS
393
393
  # @!visibility private
394
394
  def raw_close(path,file=nil)
395
395
  file = @openfiles.delete(path) unless file
396
-
396
+
397
397
  if file && !file.closed?
398
398
  begin
399
399
  flags = file.fcntl(Fcntl::F_GETFL) & Fcntl::O_ACCMODE
@@ -15,7 +15,7 @@ module FuseFS
15
15
  # Maintains a count of the number of times through the scan loop
16
16
  attr_reader :scan_id
17
17
 
18
- #
18
+ #
19
19
  #
20
20
  # @param [String] db_path Path to Sqlite database
21
21
  # @param [String] sql query
@@ -55,7 +55,7 @@ module FuseFS
55
55
  end
56
56
 
57
57
  # FuseFS callback when filesystem is unmounted
58
- #
58
+ #
59
59
  # Stops the database watching threads
60
60
  # @api FuseFS
61
61
  def unmounted()
@@ -88,6 +88,11 @@ module FuseFS
88
88
  cleanup() { |file_node| file_node.options[:sqlite_scan_id] != @scan_id }
89
89
  end
90
90
 
91
+ # Rescan on HUP signal
92
+ def sighup
93
+ rescan()
94
+ end
95
+
91
96
  private
92
97
 
93
98
  def scan_loop()
@@ -45,28 +45,14 @@ module FuseFS
45
45
  # end
46
46
  #
47
47
  def FuseFS.main(argv=ARGV,options=[],option_usage="",device=nil,exec=File.basename($0))
48
- options = RFuse.parse_options(argv,*options)
49
-
50
- if options[:mountpoint]
51
- begin
52
- fs = yield options
53
- rescue StandardError => ex
54
- puts ex.message
55
- puts ex.backtrace.join("\n")
56
- end
57
-
58
- puts RFuse.usage(device,exec) if options[:help] || !fs
59
- puts "Options:\n" if options[:help]
60
-
61
- FuseFS.start(fs,*argv) if fs || options[:help]
62
-
63
- puts option_usage if options[:help]
64
- else
65
- puts "rfusefs: failed, no mountpoint provided",RFuse.usage(device,exec)
48
+ RFuse.main(argv,options,option_usage,device,exec) do |options,argv|
49
+ root = yield options
50
+ FuseFS.set_root(root)
51
+ FuseFS.mount_under(*argv)
66
52
  end
67
53
  end
68
54
 
69
- # Start the FuseFS root at mountpoint with opts.
55
+ # Start the FuseFS root at mountpoint with opts.
70
56
  #
71
57
  # If not previously set, Signal traps for "TERM" and "INT" are added
72
58
  # to exit the filesystem
@@ -77,7 +63,6 @@ module FuseFS
77
63
  # @note RFuseFS extension
78
64
  # @return [void]
79
65
  def FuseFS.start(root,mountpoint,*opts)
80
- set_default_traps("TERM","INT") { FuseFS.exit }
81
66
  FuseFS.set_root(root)
82
67
  begin
83
68
  FuseFS.mount_under(mountpoint,*opts)
@@ -88,7 +73,7 @@ module FuseFS
88
73
  end
89
74
 
90
75
  # Forks {FuseFS.start} so you can access your filesystem with ruby File
91
- # operations (eg for testing).
76
+ # operations (eg for testing).
92
77
  # @note This is an *RFuseFS* extension
93
78
  # @return [void]
94
79
  def FuseFS.mount(root,mountpoint,*opts)
@@ -126,43 +111,40 @@ module FuseFS
126
111
  end
127
112
  end
128
113
 
129
- # Set the root virtual directory
114
+ # Set the root virtual directory
130
115
  # @param root [Object] an object implementing a subset of {FuseFS::API}
131
116
  # @return [void]
132
117
  def FuseFS.set_root(root)
133
- @fs=RFuseFS.new(root)
118
+ @fs=Fuse::Root.new(root)
134
119
  end
135
120
 
136
121
  # This will cause FuseFS to virtually mount itself under the given path. {set_root} must have
137
122
  # been called previously.
138
123
  # @param [String] mountpoint an existing directory where the filesystem will be virtually mounted
139
124
  # @param [Array<String>] args
125
+ # @return [Fuse] the mounted fuse filesystem
140
126
  # These are as expected by the "mount" command. Note in particular that the first argument
141
127
  # is expected to be the mount point. For more information, see http://fuse.sourceforge.net
142
128
  # and the manual pages for "mount.fuse"
143
- def FuseFS.mount_under(mountpoint, *args)
144
- @fuse = RFuse::FuseDelegator.new(@fs,mountpoint,*args)
129
+ def FuseFS.mount_under(mountpoint, *args)
130
+ @fuse = Fuse.new(@fs,mountpoint,*args)
145
131
  end
146
132
 
147
- # This is the main loop waiting on then executing filesystem operations from the
148
- # kernel.
149
- #
133
+ # This is the main loop waiting on, then executing, filesystem operations from the
134
+ # kernel.
135
+ #
150
136
  # Note: Running in a separate thread is generally not useful. In particular
151
- # you cannot access your filesystem using ruby File operations.
137
+ # you cannot use Ruby File operations to access your filesystem from
138
+ # within the ruby process that calls run.
152
139
  # @note RFuseFS extension
153
140
  def FuseFS.run
154
- @fs.mounted()
155
- @fuse.loop if @fuse.mounted?
156
- ensure
157
- @fs.unmounted()
141
+ @fuse.run()
158
142
  end
159
143
 
160
- # Exit the run loop and teardown FUSE
161
- # Most useful from Signal.trap() or Kernel.at_exit()
144
+ # Exit the run loop and teardown FUSE
145
+ # Most useful from Signal.trap() or Kernel.at_exit()
162
146
  def FuseFS.exit
163
- if @fuse
164
- @fuse.exit
165
- end
147
+ @fuse.exit if @fuse
166
148
  end
167
149
 
168
150
  # @return [Fixnum] the calling process uid
@@ -188,15 +170,5 @@ module FuseFS
188
170
  #do nothing
189
171
  end
190
172
 
191
- private
192
-
193
- def self.set_default_traps(*signals,&block)
194
- signals.each do |sig|
195
- old_proc = Signal.trap(sig,block)
196
- unless "DEFAULT".eql?(old_proc)
197
- Signal.trap(sig,old_proc)
198
- end
199
- end
200
- end
201
173
  end
202
174
 
@@ -1,3 +1,3 @@
1
1
  module RFuseFS
2
- VERSION="1.0.2"
2
+ VERSION="1.0.3"
3
3
  end
@@ -20,9 +20,9 @@ Gem::Specification.new do |s|
20
20
  s.has_rdoc = 'yard'
21
21
  s_extra_rdoc_files = 'History.rdoc'
22
22
 
23
- s.add_dependency("rfuse", ">= 1.0.5")
23
+ s.add_dependency("rfuse", "~> 1.1")
24
24
  s.add_development_dependency("rake")
25
- s.add_development_dependency("rspec")
25
+ s.add_development_dependency("rspec","~> 3")
26
26
  s.add_development_dependency("yard")
27
27
  s.add_development_dependency("redcarpet")
28
28
  s.add_development_dependency("sqlite3")
@@ -6,8 +6,8 @@ require 'fusefs/dirlink'
6
6
  include FuseFS
7
7
 
8
8
  root = MetaDir.new
9
- root.stats.total_space = 1024*1024
10
- root.stats.total_nodes = 1024
9
+ root.stats.max_space = 1024*1024
10
+ root.stats.max_nodes = 1024
11
11
  root.stats.strict = true
12
12
 
13
13
  class Counter
@@ -4,361 +4,366 @@ require 'sys/filesystem'
4
4
  require 'ffi-xattr'
5
5
 
6
6
  describe FuseFS::MetaDir do
7
-
8
- context "in ruby" do
9
-
7
+
8
+ context 'in ruby' do
9
+
10
10
  before(:each) do
11
11
  @metadir = FuseFS::MetaDir.new()
12
- @metadir.mkdir("/test")
13
- @metadir.mkdir("/test/hello")
14
- @metadir.mkdir("/test/hello/emptydir")
15
- @metadir.write_to("/test/hello/hello.txt","Hello World!\n")
12
+ @metadir.mkdir('/test')
13
+ @metadir.mkdir('/test/hello')
14
+ @metadir.mkdir('/test/hello/emptydir')
15
+ @metadir.write_to('/test/hello/hello.txt', "Hello World!\n")
16
16
  end
17
-
18
- context "general directory methods" do
19
- it "should list directory contents" do
20
- @metadir.contents("/").should =~ [ "test" ]
21
- @metadir.contents("/test").should =~ [ "hello" ]
22
- @metadir.contents("/test/hello").should =~ ["hello.txt", "emptydir" ]
23
- end
24
-
25
- it "should indicate paths which are/are not directories" do
26
- @metadir.directory?("/test").should be_true
27
- @metadir.directory?("/test/hello").should be_true
28
- @metadir.directory?("/test/hello/hello.txt").should be_false
29
- @metadir.directory?("/nodir").should be_false
30
- @metadir.directory?("/test/nodir").should be_false
31
- end
32
-
33
- it "should indicate paths which are/are not files" do
34
- @metadir.file?("/test").should be_false
35
- @metadir.file?("/test/nodir").should be_false
36
- @metadir.file?("/test/hello").should be_false
37
- @metadir.file?("/test/hello/hello.txt").should be_true
38
- end
39
-
40
- it "should indicate the size of a file" do
41
- @metadir.size("/test/hello/hello.txt").should be "Hello World!\n".length
42
- end
43
-
44
- it "should report filesystem statistics" do
45
- @metadir.statistics("/").should == [ 13, 5, nil, nil ]
17
+
18
+ context 'general directory methods' do
19
+ it 'should list directory contents' do
20
+ expect(@metadir.contents('/')).to match_array(['test'])
21
+ expect(@metadir.contents('/test')).to match_array(['hello'])
22
+ expect(@metadir.contents('/test/hello')).to match_array(['hello.txt', 'emptydir'])
23
+ end
24
+
25
+ it 'should indicate paths which are/are not directories' do
26
+ expect(@metadir.directory?('/test')).to be_truthy
27
+ expect(@metadir.directory?('/test/hello')).to be_truthy
28
+ expect(@metadir.directory?('/test/hello/hello.txt')).to be_falsey
29
+ expect(@metadir.directory?('/nodir')).to be_falsey
30
+ expect(@metadir.directory?('/test/nodir')).to be_falsey
31
+ end
32
+
33
+ it 'should indicate paths which are/are not files' do
34
+ expect(@metadir.file?('/test')).to be_falsey
35
+ expect(@metadir.file?('/test/nodir')).to be_falsey
36
+ expect(@metadir.file?('/test/hello')).to be_falsey
37
+ expect(@metadir.file?('/test/hello/hello.txt')).to be_truthy
38
+ end
39
+
40
+ it 'should indicate the size of a file' do
41
+ expect(@metadir.size('/test/hello/hello.txt')).to be "Hello World!\n".length
42
+ end
43
+
44
+ it 'should report filesystem statistics' do
45
+ expect(@metadir.statistics('/')).to eq([13, 5, nil, nil])
46
46
  end
47
47
  end
48
-
49
- context "with write access" do
50
-
48
+
49
+ context 'with write access' do
50
+
51
51
  around(:each) do |example|
52
- FuseFS::RFuseFS.context(fuse_context(),&example)
52
+ FuseFS::Fuse::Root.context(fuse_context(), &example)
53
53
  end
54
-
54
+
55
55
  before(:each) do
56
- FuseFS::reader_uid.should == Process.uid
57
- FuseFS::reader_gid.should == Process.gid
58
- end
59
-
60
-
61
- it "should allow directory creation" do
62
- @metadir.can_mkdir?("/test/otherdir").should be_true
63
- end
64
-
65
- it "should allow file creation and update" do
66
- @metadir.can_write?("/test/hello/newfile").should be_true
67
- @metadir.can_write?("/test/hello/hello.txt").should be_true
68
- end
69
-
70
- it "should read files" do
71
- @metadir.read_file("/test/hello/hello.txt").should == "Hello World!\n"
72
- end
73
-
74
- it "should update existing files" do
75
- @metadir.write_to("/test/hello/hello.txt","new contents")
76
- @metadir.read_file("/test/hello/hello.txt").should == "new contents"
77
- end
78
-
79
- it "should not allow deletion of non empty directories" do
80
- @metadir.can_rmdir?("/test/hello").should be_false
81
- end
82
-
83
- it "should delete directories" do
84
- @metadir.rmdir("/test/hello/emptydir")
85
- @metadir.contents("/test/hello").should =~ ["hello.txt"]
86
- end
87
-
88
- it "should allow and delete files" do
89
- @metadir.can_delete?("/test/hello/hello.txt").should be_true
90
- @metadir.delete("/test/hello/hello.txt")
91
- @metadir.contents("/test/hello").should =~ ["emptydir"]
92
- end
93
-
94
- it "should move directories at same level" do
95
- before = @metadir.contents("/test/hello")
96
- @metadir.rename("/test/hello","/test/moved").should be_true
97
- @metadir.directory?("/test/moved").should be_true
98
- @metadir.contents("/test/moved").should =~ before
99
- @metadir.read_file("/test/moved/hello.txt").should == "Hello World!\n"
100
- end
101
-
102
- it "should move directories between different paths" do
103
- @metadir.mkdir("/test/other")
104
- @metadir.mkdir("/test/other/more")
105
- before = @metadir.contents("/test/hello")
106
- @metadir.rename("/test/hello","/test/other/more/hello").should be_true
107
- @metadir.contents("/test/other/more/hello").should =~ before
108
- @metadir.read_file("/test/other/more/hello/hello.txt").should == "Hello World!\n"
109
- end
110
-
111
- it "should maintain filesystem statistics" do
56
+ expect(FuseFS::reader_uid).to eq(Process.uid)
57
+ expect(FuseFS::reader_gid).to eq(Process.gid)
58
+ end
59
+
60
+
61
+ it 'should allow directory creation' do
62
+ expect(@metadir.can_mkdir?('/test/otherdir')).to be_truthy
63
+ end
64
+
65
+ it 'should allow file creation and update' do
66
+ expect(@metadir.can_write?('/test/hello/newfile')).to be_truthy
67
+ expect(@metadir.can_write?('/test/hello/hello.txt')).to be_truthy
68
+ end
69
+
70
+ it 'should read files' do
71
+ expect(@metadir.read_file('/test/hello/hello.txt')).to eq("Hello World!\n")
72
+ end
73
+
74
+ it 'should update existing files' do
75
+ @metadir.write_to('/test/hello/hello.txt', 'new contents')
76
+ expect(@metadir.read_file('/test/hello/hello.txt')).to eq('new contents')
77
+ end
78
+
79
+ it 'should not allow deletion of non empty directories' do
80
+ expect(@metadir.can_rmdir?('/test/hello')).to be_falsey
81
+ end
82
+
83
+ it 'should delete directories' do
84
+ @metadir.rmdir('/test/hello/emptydir')
85
+ expect(@metadir.contents('/test/hello')).to match_array(['hello.txt'])
86
+ end
87
+
88
+ it 'should allow and delete files' do
89
+ expect(@metadir.can_delete?('/test/hello/hello.txt')).to be_truthy
90
+ @metadir.delete('/test/hello/hello.txt')
91
+ expect(@metadir.contents('/test/hello')).to match_array(['emptydir'])
92
+ end
93
+
94
+ it 'should move directories at same level' do
95
+ before = @metadir.contents('/test/hello')
96
+ expect(@metadir.rename('/test/hello', '/test/moved')).to be_truthy
97
+ expect(@metadir.directory?('/test/moved')).to be_truthy
98
+ expect(@metadir.contents('/test/moved')).to match_array(before)
99
+ expect(@metadir.read_file('/test/moved/hello.txt')).to eq("Hello World!\n")
100
+ end
101
+
102
+ it 'should move directories between different paths' do
103
+ @metadir.mkdir('/test/other')
104
+ @metadir.mkdir('/test/other/more')
105
+ before = @metadir.contents('/test/hello')
106
+ expect(@metadir.rename('/test/hello', '/test/other/more/hello')).to be_truthy
107
+ expect(@metadir.contents('/test/other/more/hello')).to match_array(before)
108
+ expect(@metadir.read_file('/test/other/more/hello/hello.txt')).to eq("Hello World!\n")
109
+ end
110
+
111
+ it 'should maintain filesystem statistics' do
112
112
  # remove a directory
113
- @metadir.rmdir("/test/hello/emptydir")
113
+ @metadir.rmdir('/test/hello/emptydir')
114
114
 
115
115
  # replace text for (the only) existing file
116
- @metadir.write_to("/test/hello/hello.txt","new text")
117
-
118
- @metadir.statistics("/").should == [ 8, 4, nil, nil ]
116
+ @metadir.write_to('/test/hello/hello.txt', 'new text')
117
+
118
+ expect(@metadir.statistics('/')).to eq([8, 4, nil, nil])
119
119
  end
120
120
  end
121
-
122
- context "with readonly access" do
121
+
122
+ context 'with readonly access' do
123
123
  around(:each) do |example|
124
124
  #Simulate a different userid..
125
- FuseFS::RFuseFS.context(fuse_context(-1,-1),&example)
125
+ FuseFS::Fuse::Root.context(fuse_context(-1, -1), &example)
126
126
  end
127
-
127
+
128
128
  before(:each) do
129
- FuseFS::reader_uid.should_not == Process.uid
130
- FuseFS::reader_gid.should_not == Process.gid
131
- end
132
-
133
- it "should not allow directory creation" do
134
- @metadir.can_mkdir?("/test/anydir").should be_false
135
- @metadir.can_mkdir?("/test/hello/otherdir").should be_false
136
- end
137
-
138
- it "should not allow file creation or write access" do
139
- @metadir.can_write?("/test/hello/hello.txt").should be_false
140
- @metadir.can_write?("/test/hello/newfile").should be_false
141
- end
142
-
143
- it "should not allow file deletion" do
144
- @metadir.can_delete?("/test/hello/hello.txt").should be_false
145
- end
146
-
147
- it "should not allow directory deletion" do
148
- @metadir.can_rmdir?("/test/emptydir").should be_false
149
- end
150
-
151
- it "should not allow directory renames" do
152
- @metadir.rename("/test/emptydir","/test/otherdir").should be_false
129
+ expect(FuseFS::reader_uid).not_to eq(Process.uid)
130
+ expect(FuseFS::reader_gid).not_to eq(Process.gid)
131
+ end
132
+
133
+ it 'should not allow directory creation' do
134
+ expect(@metadir.can_mkdir?('/test/anydir')).to be_falsey
135
+ expect(@metadir.can_mkdir?('/test/hello/otherdir')).to be_falsey
136
+ end
137
+
138
+ it 'should not allow file creation or write access' do
139
+ expect(@metadir.can_write?('/test/hello/hello.txt')).to be_falsey
140
+ expect(@metadir.can_write?('/test/hello/newfile')).to be_falsey
141
+ end
142
+
143
+ it 'should not allow file deletion' do
144
+ expect(@metadir.can_delete?('/test/hello/hello.txt')).to be_falsey
145
+ end
146
+
147
+ it 'should not allow directory deletion' do
148
+ expect(@metadir.can_rmdir?('/test/emptydir')).to be_falsey
149
+ end
150
+
151
+ it 'should not allow directory renames' do
152
+ expect(@metadir.rename('/test/emptydir', '/test/otherdir')).to be_falsey
153
153
  #TODO and make sure it doesn't rename
154
154
  end
155
155
 
156
- it "should not allow file renames" do
157
- @metadir.rename("test/hello/hello.txt","test/hello.txt2").should be_false
156
+ it 'should not allow file renames' do
157
+ expect(@metadir.rename('test/hello/hello.txt', 'test/hello.txt2')).to be_falsey
158
158
  #TODO and make sure it doesn't rename
159
159
  end
160
160
  end
161
-
162
- context "with subdirectory containing another FuseFS" do
161
+
162
+ context 'with subdirectory containing another FuseFS' do
163
163
  around(:each) do |example|
164
- FuseFS::RFuseFS.context(fuse_context(),&example)
164
+ FuseFS::Fuse::Root.context(fuse_context(), &example)
165
165
  end
166
166
 
167
167
  before(:each) do
168
- @fusefs = mock("mock_fusefs")
169
- @metadir.mkdir("/test")
170
- @metadir.mkdir("/test/fusefs",@fusefs)
168
+ @fusefs = double('mock_fusefs')
169
+ @metadir.mkdir('/test')
170
+ @metadir.mkdir('/test/fusefs', @fusefs)
171
171
  end
172
172
 
173
- api_methods = [:directory?, :file?, :contents, :executable?, :size, :times, :read_file, :can_write?, :can_delete?, :delete, :can_mkdir?, :can_rmdir?, :rmdir, :touch, :raw_open, :raw_truncate, :raw_read, :raw_write, :raw_close]
173
+ api_methods = [:directory?, :file?, :contents, :executable?, :size, :times, :read_file, :can_write?, :can_delete?, :delete, :can_mkdir?, :can_rmdir?, :rmdir, :touch, :raw_open, :raw_truncate, :raw_read, :raw_write, :raw_close]
174
174
  api_methods.each do |method|
175
- it "should pass on #{method}" do
176
- arity = FuseFS::FuseDir.instance_method(method).arity().abs - 1
177
- args = Array.new(arity) { |i| i }
178
- @fusefs.should_receive(method).with("/path/to/file",*args).and_return("anything")
179
- @metadir.send(method,"/test/fusefs/path/to/file",*args)
180
- end
175
+ it "should pass on #{method}" do
176
+ arity = FuseFS::FuseDir.instance_method(method).arity().abs - 1
177
+ args = Array.new(arity) { |i| i }
178
+ expect(@fusefs).to receive(method).with('/path/to/file', *args).and_return('anything')
179
+ @metadir.send(method, '/test/fusefs/path/to/file', *args)
180
+ end
181
181
  end
182
-
183
- it "should pass on :write_to" do
184
- @fusefs.should_receive(:write_to).with("/path/to/file","new contents\n")
185
- @metadir.write_to("/test/fusefs/path/to/file","new contents\n")
182
+
183
+ it 'should pass on :write_to' do
184
+ expect(@fusefs).to receive(:write_to).with('/path/to/file', "new contents\n")
185
+ @metadir.write_to('/test/fusefs/path/to/file', "new contents\n")
186
186
  end
187
187
 
188
- it "should pass on :mkdir" do
189
- @fusefs.should_receive(:mkdir).with("/path/to/file",nil).once().and_raise(ArgumentError)
190
- @fusefs.should_receive(:mkdir).with("/path/to/file").once().and_return("true")
191
- @metadir.mkdir("/test/fusefs/path/to/file")
188
+ it 'should pass on :mkdir' do
189
+ expect(@fusefs).to receive(:mkdir).with('/path/to/file', nil).once().and_raise(ArgumentError)
190
+ expect(@fusefs).to receive(:mkdir).with('/path/to/file').once().and_return('true')
191
+ @metadir.mkdir('/test/fusefs/path/to/file')
192
192
  end
193
193
 
194
- it "should rename within same directory" do
195
- @fusefs.should_receive(:rename).with("/oldfile","/newfile")
196
- @metadir.rename("/test/fusefs/oldfile","/test/fusefs/newfile")
194
+ it 'should rename within same directory' do
195
+ expect(@fusefs).to receive(:rename).with('/oldfile', '/newfile')
196
+ @metadir.rename('/test/fusefs/oldfile', '/test/fusefs/newfile')
197
197
  end
198
198
 
199
- it "should pass rename down common directories" do
200
- @fusefs.should_receive(:rename).with("/path/to/file" ,"/new/path/to/file")
201
- @metadir.rename("/test/fusefs/path/to/file","/test/fusefs/new/path/to/file")
199
+ it 'should pass rename down common directories' do
200
+ expect(@fusefs).to receive(:rename).with('/path/to/file', '/new/path/to/file')
201
+ @metadir.rename('/test/fusefs/path/to/file', '/test/fusefs/new/path/to/file')
202
202
  end
203
203
 
204
- it "should rename across directories if from_path is a FuseFS object that accepts extended rename" do
205
- @fusefs.should_receive(:rename).with("/path/to/file","/nonfusepath",
206
- an_instance_of(FuseFS::MetaDir)) do | myPath, extPath, extFS |
207
- extFS.write_to(extPath,"look Mum, no hands!")
208
- end
204
+ it 'should rename across directories if from_path is a FuseFS object that accepts extended rename' do
205
+ expect(@fusefs).to receive(:rename).with('/path/to/file', '/nonfusepath',
206
+ an_instance_of(FuseFS::MetaDir)) do |myPath, extPath, extFS|
207
+ extFS.write_to(extPath, 'look Mum, no hands!')
208
+ end
209
209
 
210
- @metadir.rename("/test/fusefs/path/to/file","/test/nonfusepath").should be_true
211
- @metadir.read_file("/test/nonfusepath").should == "look Mum, no hands!"
210
+ expect(@metadir.rename('/test/fusefs/path/to/file', '/test/nonfusepath')).to be_truthy
211
+ expect(@metadir.read_file('/test/nonfusepath')).to eq('look Mum, no hands!')
212
212
  end
213
213
 
214
- it "should quietly return false if from_path is a FuseFS object that does not accept extended rename" do
215
- @fusefs.should_receive(:rename).
216
- with("/path/to/file","/nonfusepath",an_instance_of(FuseFS::MetaDir)).
217
- and_raise(ArgumentError)
218
- @metadir.rename("/test/fusefs/path/to/file","/test/nonfusepath").should be_false
214
+ it 'should quietly return false if from_path is a FuseFS object that does not accept extended rename' do
215
+ expect(@fusefs).to receive(:rename).
216
+ with('/path/to/file', '/nonfusepath', an_instance_of(FuseFS::MetaDir)).
217
+ and_raise(ArgumentError)
218
+ expect(@metadir.rename('/test/fusefs/path/to/file', '/test/nonfusepath')).to be_falsey
219
219
 
220
220
  end
221
221
 
222
- it "should not attempt rename file unless :can_write? the destination" do
223
- @fusefs.should_receive(:can_write?).with("/newpath/to/file").and_return(false)
224
- @metadir.write_to("/test/aFile","some contents")
225
- @metadir.rename("/test/aFile","/test/fusefs/newpath/to/file").should be_false
222
+ it 'should not attempt rename file unless :can_write? the destination' do
223
+ expect(@fusefs).to receive(:can_write?).with('/newpath/to/file').and_return(false)
224
+ @metadir.write_to('/test/aFile', 'some contents')
225
+ expect(@metadir.rename('/test/aFile', '/test/fusefs/newpath/to/file')).to be_falsey
226
226
  end
227
227
 
228
- it "should not attempt rename directory unless :can_mkdir? the destination" do
229
- @fusefs.should_receive(:can_mkdir?).with("/newpath/to/dir").and_return(false)
230
- @metadir.mkdir("/test/aDir","some contents")
231
- @metadir.rename("/test/aDir","/test/fusefs/newpath/to/dir").should be_false
228
+ it 'should not attempt rename directory unless :can_mkdir? the destination' do
229
+ expect(@fusefs).to receive(:can_mkdir?).with('/newpath/to/dir').and_return(false)
230
+ @metadir.mkdir('/test/aDir', 'some contents')
231
+ expect(@metadir.rename('/test/aDir', '/test/fusefs/newpath/to/dir')).to be_falsey
232
232
  end
233
233
 
234
- it "should pass on #statistics" do
235
- @fusefs.should_receive(:statistics).with("/path/to/file")
234
+ it 'should pass on #statistics' do
235
+ expect(@fusefs).to receive(:statistics).with('/path/to/file')
236
236
 
237
- @metadir.statistics("test/fusefs/path/to/file")
237
+ @metadir.statistics('test/fusefs/path/to/file')
238
238
  end
239
239
 
240
- it "should pass on #statistics for root" do
241
- @fusefs.should_receive(:statistics).with("/")
240
+ it 'should pass on #statistics for root' do
241
+ expect(@fusefs).to receive(:statistics).with('/')
242
242
 
243
- @metadir.statistics("test/fusefs")
243
+ @metadir.statistics('test/fusefs')
244
244
  end
245
245
  end
246
-
246
+
247
247
  end
248
- context "in a mounted FUSE filesystem" do
249
-
250
- let(:mountpoint) { Pathname.new(Dir.mktmpdir(["rfusefs","metadir"])) }
251
- let(:metadir) { FuseFS::MetaDir.new() }
252
- let(:testdir) { mountpoint + "test" }
253
- let(:testfile) { testdir + "hello.txt" }
254
-
255
- before(:all) do
256
- metadir.mkdir("/test")
257
- metadir.write_to("/test/hello.txt","Hello World!\n")
258
- metadir.xattr("/test/hello.txt")["user.test"] = "an extended attribute"
259
- metadir.xattr("/test")["user.test"] = "a dir attribute"
260
- FuseFS.mount(metadir,mountpoint)
261
- #Give FUSE some time to get started
262
- sleep(0.5)
263
- end
264
-
265
- after(:all) do
266
- FuseFS.unmount(mountpoint)
267
- sleep(0.5)
268
- FileUtils.rm_r(mountpoint)
269
- end
270
-
271
- it "should list directory contents" do
272
- testdir.entries().should =~ pathnames(".","..","hello.txt")
248
+ context 'in a mounted FUSE filesystem' do
249
+
250
+ before(:all) do
251
+ metadir = FuseFS::MetaDir.new()
252
+ mountpoint = Pathname.new(Dir.mktmpdir(['rfusefs', 'metadir']))
253
+
254
+ metadir.mkdir('/test')
255
+ metadir.write_to('/test/hello.txt', "Hello World!\n")
256
+ metadir.xattr('/test/hello.txt')['user.test'] = 'an extended attribute'
257
+ metadir.xattr('/test')['user.test'] = 'a dir attribute'
258
+ FuseFS.mount(metadir, mountpoint)
259
+ #Give FUSE some time to get started
260
+ sleep(0.5)
261
+ @metadir = metadir
262
+ @mountpoint = mountpoint
273
263
  end
274
264
 
275
- it "should read files" do
276
- testfile.file?.should be_true
277
- testfile.read().should == "Hello World!\n"
265
+ after(:all) do
266
+ FuseFS.unmount(@mountpoint)
267
+ sleep(0.5)
268
+ FileUtils.rm_r(@mountpoint)
278
269
  end
279
270
 
280
- it "should read and write extended attributes from files" do
281
- x = Xattr.new(testfile.to_s)
282
- x["user.test"].should == "an extended attribute"
271
+ let(:testdir) { mountpoint + 'test' }
272
+ let(:testfile) { testdir + 'hello.txt' }
273
+ let(:metadir) { @metadir}
274
+ let(:mountpoint) { @mountpoint }
275
+
276
+ it 'should list directory contents' do
277
+ expect(testdir.entries()).to match_array(pathnames('.', '..', 'hello.txt'))
278
+ end
283
279
 
284
- x["user.new"] = "new"
285
-
286
- Xattr.new(testfile.to_s)["user.new"].should == "new"
280
+ it 'should read files' do
281
+ expect(testfile.file?).to be_truthy
282
+ expect(testfile.read()).to eq("Hello World!\n")
287
283
  end
288
284
 
289
- it "should write extended attributes for directories" do
290
- x = Xattr.new(testdir.to_s)
285
+ it 'should read and write extended attributes from files' do
286
+ x = Xattr.new(testfile.to_s)
287
+ expect(x['user.test']).to eq('an extended attribute')
291
288
 
292
- x["user.test"].should == "a dir attribute"
293
- x["user.new"] = "new dir"
294
-
295
- Xattr.new(testdir.to_s)["user.new"].should == "new dir"
289
+ x['user.new'] = 'new'
290
+
291
+ expect(Xattr.new(testfile.to_s)['user.new']).to eq('new')
296
292
  end
297
293
 
294
+ it 'should write extended attributes for directories' do
295
+ x = Xattr.new(testdir.to_s)
296
+
297
+ expect(x['user.test']).to eq('a dir attribute')
298
+ x['user.new'] = 'new dir'
298
299
 
299
- it "should create directories" do
300
- newdir = testdir + "newdir"
301
- newdir.mkdir()
302
- newdir.directory?.should be_true
303
- testdir.entries().should =~ pathnames(".","..","hello.txt","newdir")
300
+ expect(Xattr.new(testdir.to_s)['user.new']).to eq('new dir')
304
301
  end
305
302
 
306
- it "should create files" do
307
- newfile = testdir + "newfile"
308
- newfile.open("w") do |file|
309
- file << "A new file\n"
310
- end
311
- newfile.read.should == "A new file\n"
303
+
304
+ it 'should create directories' do
305
+ newdir = testdir + 'newdir'
306
+ newdir.mkdir()
307
+ expect(newdir.directory?).to be_truthy
308
+ expect(testdir.entries()).to match_array(pathnames('.', '..', 'hello.txt', 'newdir'))
312
309
  end
313
310
 
314
- it "should move directories" do
315
- fromdir = testdir + "fromdir"
316
- fromdir.mkdir()
317
- subfile = fromdir + "afile"
318
- subfile.open("w") do |file|
319
- file << "testfile\n"
320
- end
311
+ it 'should create files' do
312
+ newfile = testdir + 'newfile'
313
+ newfile.open('w') do |file|
314
+ file << "A new file\n"
315
+ end
316
+ expect(newfile.read).to eq("A new file\n")
317
+ end
318
+
319
+ it 'should move directories' do
320
+ fromdir = testdir + 'fromdir'
321
+ fromdir.mkdir()
322
+ subfile = fromdir + 'afile'
323
+ subfile.open('w') do |file|
324
+ file << "testfile\n"
325
+ end
326
+
327
+ movedir = (mountpoint + 'movedir')
328
+ expect(movedir.directory?).to be_falsey
329
+ fromdir.rename(movedir)
330
+ expect(movedir.directory?).to be_truthy
321
331
 
322
- movedir = (mountpoint + "movedir")
323
- movedir.directory?.should be_false
324
- fromdir.rename(movedir)
325
- movedir.directory?.should be_true
326
-
327
- subfile = movedir + "afile"
328
- subfile.file?.should be_true
329
- subfile.read.should == "testfile\n"
332
+ subfile = movedir + 'afile'
333
+ expect(subfile.file?).to be_truthy
334
+ expect(subfile.read).to eq("testfile\n")
330
335
  end
331
336
 
332
- it "should move files" do
333
- movefile = (mountpoint + "moved.txt")
334
- movefile.file?.should be_false
335
- testfile.should be_true
336
- testfile.rename(movefile)
337
- movefile.read.should == "Hello World!\n"
337
+ it 'should move files' do
338
+ movefile = (mountpoint + 'moved.txt')
339
+ expect(movefile.file?).to be_falsey
340
+ expect(testfile).to be_truthy
341
+ testfile.rename(movefile)
342
+ expect(movefile.read).to eq("Hello World!\n")
338
343
  end
339
344
 
340
345
 
341
- it "should report filesystem statistics" do
342
- bigfile = testdir + "bigfile"
343
- bigfile.open("w") do |file|
344
- file << ("x" * 2048)
345
- end
346
-
347
- statfs = Sys::Filesystem.stat(mountpoint.to_s)
346
+ it 'should report filesystem statistics' do
347
+ bigfile = testdir + 'bigfile'
348
+ bigfile.open('w') do |file|
349
+ file << ('x' * 2048)
350
+ end
348
351
 
349
- # These are fixed
350
- statfs.block_size.should == 1024
351
- statfs.fragment_size.should == 1024
352
+ statfs = Sys::Filesystem.stat(mountpoint.to_s)
352
353
 
353
- # These are dependant on the tests above creating files/directories
354
- statfs.files.should == 8
355
- statfs.files_available == 8
354
+ # These are fixed
355
+ expect(statfs.block_size).to eq(1024)
356
+ expect(statfs.fragment_size).to eq(1024)
356
357
 
357
- # assume test are less than 1 block, so dependant on bigfile above
358
- statfs.blocks.should == 2
359
- statfs.blocks_available.should == 0
360
- statfs.blocks_free.should == 0
358
+ # These are dependant on the tests above creating files/directories
359
+ expect(statfs.files).to eq(8)
360
+ statfs.files_available == 8
361
+
362
+ # assume test are less than 1 block, so dependant on bigfile above
363
+ expect(statfs.blocks).to eq(2)
364
+ expect(statfs.blocks_available).to eq(0)
365
+ expect(statfs.blocks_free).to eq(0)
361
366
  end
362
367
  end
363
-
368
+
364
369
  end