diff options
| author | Luke Kanies <luke@madstop.com> | 2009-05-17 17:20:55 -0500 |
|---|---|---|
| committer | James Turnbull <james@lovedthanlost.net> | 2009-05-20 18:29:04 +1000 |
| commit | 415553e9485d7ba3ed867033ac9c3315107d3c92 (patch) | |
| tree | edec1c8310b21a6564b7b15a226252f29906a604 /spec/unit/util/autoload/file_cache.rb | |
| parent | d489a2b9e2806beefd41627adf7e20d23b0924d6 (diff) | |
| download | puppet-415553e9485d7ba3ed867033ac9c3315107d3c92.tar.gz puppet-415553e9485d7ba3ed867033ac9c3315107d3c92.tar.xz puppet-415553e9485d7ba3ed867033ac9c3315107d3c92.zip | |
Adding caching of file metadata to the autoloader
The cache isn't actually used yet - this just adds
all of the plumbing.
It was found that stat'ing files that didn't exist
could take up to 85% of a run, so this is progress
toward getting rid of those stats.
Signed-off-by: Luke Kanies <luke@madstop.com>
Diffstat (limited to 'spec/unit/util/autoload/file_cache.rb')
| -rwxr-xr-x | spec/unit/util/autoload/file_cache.rb | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/spec/unit/util/autoload/file_cache.rb b/spec/unit/util/autoload/file_cache.rb new file mode 100755 index 000000000..ad4e75f74 --- /dev/null +++ b/spec/unit/util/autoload/file_cache.rb @@ -0,0 +1,129 @@ +#!/usr/bin/env ruby + +require File.dirname(__FILE__) + '/../../../spec_helper' +require 'puppet/util/autoload/file_cache' + +class FileCacheTester + include Puppet::Util::Autoload::FileCache +end + +describe Puppet::Util::Autoload::FileCache do + before do + @cacher = FileCacheTester.new + end + + after do + Puppet::Util::Autoload::FileCache.clear + end + + describe "when checking whether files exist" do + it "should have a method for testing whether a file exists" do + @cacher.should respond_to(:file_exist?) + end + + it "should use lstat to determine whether a file exists" do + File.expects(:lstat).with("/my/file") + @cacher.file_exist?("/my/file") + end + + it "should consider a file as absent if its lstat fails" do + File.expects(:lstat).with("/my/file").raises Errno::ENOENT + @cacher.should_not be_file_exist("/my/file") + end + + it "should consider a file as present if its lstat succeeds" do + File.expects(:lstat).with("/my/file").returns mock("stat") + @cacher.should be_file_exist("/my/file") + end + + it "should not stat a file twice in quick succession when the file is missing" do + File.expects(:lstat).with("/my/file").once.raises Errno::ENOENT + @cacher.should_not be_file_exist("/my/file") + @cacher.should_not be_file_exist("/my/file") + end + + it "should not stat a file twice in quick succession when the file is present" do + File.expects(:lstat).with("/my/file").once.returns mock("stat") + @cacher.should be_file_exist("/my/file") + @cacher.should be_file_exist("/my/file") + end + + it "should expire cached data after 15 seconds" do + now = Time.now + + later = now + 16 + + Time.expects(:now).times(3).returns(now).then.returns(later).then.returns(later) + File.expects(:lstat).with("/my/file").times(2).returns(mock("stat")).then.raises Errno::ENOENT + @cacher.should be_file_exist("/my/file") + @cacher.should_not be_file_exist("/my/file") + end + + it "should share cached data across autoload instances" do + File.expects(:lstat).with("/my/file").once.returns mock("stat") + other = Puppet::Util::Autoload.new("bar", "tmp") + + @cacher.should be_file_exist("/my/file") + other.should be_file_exist("/my/file") + end + end + + describe "when checking whether files exist" do + before do + @stat = stub 'stat', :directory? => true + end + + it "should have a method for determining whether a directory exists" do + @cacher.should respond_to(:directory_exist?) + end + + it "should use lstat to determine whether a directory exists" do + File.expects(:lstat).with("/my/file").returns @stat + @cacher.directory_exist?("/my/file") + end + + it "should consider a directory as absent if its lstat fails" do + File.expects(:lstat).with("/my/file").raises Errno::ENOENT + @cacher.should_not be_directory_exist("/my/file") + end + + it "should consider a directory as present if its lstat succeeds and the stat is of a directory" do + @stat.expects(:directory?).returns true + File.expects(:lstat).with("/my/file").returns @stat + @cacher.should be_directory_exist("/my/file") + end + + it "should consider a directory as absent if its lstat succeeds and the stat is not of a directory" do + @stat.expects(:directory?).returns false + File.expects(:lstat).with("/my/file").returns @stat + @cacher.should_not be_directory_exist("/my/file") + end + + it "should not stat a directory twice in quick succession when the file is missing" do + File.expects(:lstat).with("/my/file").once.raises Errno::ENOENT + @cacher.should_not be_directory_exist("/my/file") + @cacher.should_not be_directory_exist("/my/file") + end + + it "should not stat a directory twice in quick succession when the file is present" do + File.expects(:lstat).with("/my/file").once.returns @stat + @cacher.should be_directory_exist("/my/file") + @cacher.should be_directory_exist("/my/file") + end + + it "should not consider a file to be a directory based on cached data" do + @stat.stubs(:directory?).returns false + File.stubs(:lstat).with("/my/file").returns @stat + @cacher.file_exist?("/my/file") + @cacher.should_not be_directory_exist("/my/file") + end + + it "should share cached data across autoload instances" do + File.expects(:lstat).with("/my/file").once.returns @stat + other = Puppet::Util::Autoload.new("bar", "tmp") + + @cacher.should be_directory_exist("/my/file") + other.should be_directory_exist("/my/file") + end + end +end |
