summaryrefslogtreecommitdiff
path: root/spec/support/shared/unit/file_system_support.rb
blob: 8516292c67b015dd9e1e5d56cb04e10e1391a677 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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