summaryrefslogtreecommitdiff
path: root/spec/support/shared/unit/file_system_support.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/support/shared/unit/file_system_support.rb')
-rw-r--r--spec/support/shared/unit/file_system_support.rb110
1 files changed, 110 insertions, 0 deletions
diff --git a/spec/support/shared/unit/file_system_support.rb b/spec/support/shared/unit/file_system_support.rb
new file mode 100644
index 0000000000..8516292c67
--- /dev/null
+++ b/spec/support/shared/unit/file_system_support.rb
@@ -0,0 +1,110 @@
+#
+# Author:: John Keiser (<jkeiser@opscode.com>)
+# Copyright:: Copyright (c) 2012 Opscode, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require 'chef/chef_fs/file_system'
+require 'chef/chef_fs/file_system/base_fs_dir'
+require 'chef/chef_fs/file_system/base_fs_object'
+
+module FileSystemSupport
+ class MemoryFile < Chef::ChefFS::FileSystem::BaseFSObject
+ def initialize(name, parent, value)
+ super(name, parent)
+ @value = value
+ end
+ def read
+ return @value
+ end
+ end
+
+ class MemoryDir < Chef::ChefFS::FileSystem::BaseFSDir
+ def initialize(name, parent)
+ super(name, parent)
+ @children = []
+ end
+ attr_reader :children
+ def child(name)
+ @children.select { |child| child.name == name }.first || Chef::ChefFS::FileSystem::NonexistentFSObject.new(name, self)
+ end
+ def add_child(child)
+ @children.push(child)
+ end
+ def can_have_child?(name, is_dir)
+ root.cannot_be_in_regex ? (name !~ root.cannot_be_in_regex) : true
+ end
+ end
+
+ class MemoryRoot < MemoryDir
+ def initialize(pretty_name, cannot_be_in_regex = nil)
+ super('', nil)
+ @pretty_name = pretty_name
+ @cannot_be_in_regex = cannot_be_in_regex
+ end
+
+ attr_reader :cannot_be_in_regex
+
+ def path_for_printing
+ @pretty_name
+ end
+ end
+
+ def memory_fs(pretty_name, value, cannot_be_in_regex = nil)
+ if !value.is_a?(Hash)
+ raise "memory_fs() must take a Hash"
+ end
+ dir = MemoryRoot.new(pretty_name, cannot_be_in_regex)
+ value.each do |key, child|
+ dir.add_child(memory_fs_value(child, key.to_s, dir))
+ end
+ dir
+ end
+
+ def memory_fs_value(value, name = '', parent = nil)
+ if value.is_a?(Hash)
+ dir = MemoryDir.new(name, parent)
+ value.each do |key, child|
+ dir.add_child(memory_fs_value(child, key.to_s, dir))
+ end
+ dir
+ else
+ MemoryFile.new(name, parent, value || "#{name}\n")
+ end
+ end
+
+ def pattern(p)
+ Chef::ChefFS::FilePattern.new(p)
+ end
+
+ def return_paths(*expected)
+ ReturnPaths.new(expected)
+ end
+
+ def no_blocking_calls_allowed
+ [ MemoryFile, MemoryDir ].each do |c|
+ [ :children, :exists?, :read ].each do |m|
+ c.any_instance.stub(m).and_raise("#{m.to_s} should not be called")
+ end
+ end
+ end
+
+ def list_should_yield_paths(fs, pattern_str, *expected_paths)
+ result_paths = []
+ Chef::ChefFS::FileSystem.list(fs, pattern(pattern_str)) { |result| result_paths << result.path }
+ result_paths.should =~ expected_paths
+ end
+end
+