summaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2008-12-10 23:29:39 -0600
committerJames Turnbull <james@lovedthanlost.net>2008-12-12 09:44:42 +1100
commit45144a1b9da2839fd9f8a182a8f82ecb06e17292 (patch)
tree545483efecf2ac4bfaf9e9a984ca651867043edc /spec
parent2385a78a7c455affed26955142a4d4d3ce53c37f (diff)
Fixing #1812 (hopefully) - adding read and write locks to yaml.
It's obviously not really possible to test that this fixes it, but I'm confident that the locks work, and now we're using them, so it *should*. Signed-off-by: Luke Kanies <luke@madstop.com>
Diffstat (limited to 'spec')
-rwxr-xr-xspec/unit/indirector/yaml.rb21
1 files changed, 14 insertions, 7 deletions
diff --git a/spec/unit/indirector/yaml.rb b/spec/unit/indirector/yaml.rb
index 081ae9666..7536fbc25 100755
--- a/spec/unit/indirector/yaml.rb
+++ b/spec/unit/indirector/yaml.rb
@@ -58,12 +58,12 @@ describe Puppet::Indirector::Yaml, " when choosing file location" do
proc { @store.save(@request) }.should raise_error(ArgumentError)
end
- it "should convert Ruby objects to YAML and write them to disk" do
+ it "should convert Ruby objects to YAML and write them to disk using a write lock" do
yaml = @subject.to_yaml
file = mock 'file'
path = @store.send(:path, @subject.name)
FileTest.expects(:exist?).with(File.dirname(path)).returns(true)
- File.expects(:open).with(path, "w", 0660).yields(file)
+ @store.expects(:writelock).with(path, 0660).yields(file)
file.expects(:print).with(yaml)
@store.save(@request)
@@ -74,9 +74,11 @@ describe Puppet::Indirector::Yaml, " when choosing file location" do
file = mock 'file'
path = @store.send(:path, @subject.name)
dir = File.dirname(path)
+
FileTest.expects(:exist?).with(dir).returns(false)
Dir.expects(:mkdir).with(dir)
- File.expects(:open).with(path, "w", 0660).yields(file)
+
+ @store.expects(:writelock).yields(file)
file.expects(:print).with(yaml)
@store.save(@request)
@@ -84,24 +86,29 @@ describe Puppet::Indirector::Yaml, " when choosing file location" do
end
describe Puppet::Indirector::Yaml, " when retrieving YAML" do
- it "should read YAML in from disk and convert it to Ruby objects" do
+ it "should read YAML in from disk using a read lock and convert it to Ruby objects" do
path = @store.send(:path, @subject.name)
yaml = @subject.to_yaml
FileTest.expects(:exist?).with(path).returns(true)
- File.expects(:read).with(path).returns(yaml)
+
+ fh = mock 'filehandle'
+ @store.expects(:readlock).with(path).yields fh
+ fh.expects(:read).returns yaml
@store.find(@request).instance_variable_get("@name").should == :me
end
it "should fail coherently when the stored YAML is invalid" do
path = @store.send(:path, @subject.name)
+ FileTest.expects(:exist?).with(path).returns(true)
# Something that will fail in yaml
yaml = "--- !ruby/object:Hash"
- FileTest.expects(:exist?).with(path).returns(true)
- File.expects(:read).with(path).returns(yaml)
+ fh = mock 'filehandle'
+ @store.expects(:readlock).yields fh
+ fh.expects(:read).returns yaml
proc { @store.find(@request) }.should raise_error(Puppet::Error)
end