summaryrefslogtreecommitdiffstats
path: root/spec/shared_behaviours
diff options
context:
space:
mode:
authorMax Martin <max@puppetlabs.com>2011-03-23 14:32:59 -0700
committerMax Martin <max@puppetlabs.com>2011-03-23 14:32:59 -0700
commit66d0b16c8a0a55dd79b1b0f0e639f107e552d9ab (patch)
treeadb06f307051368e9fe9a23c3338fe7511eb8adf /spec/shared_behaviours
parent36f4dc5e1527fc46f097080c12bb1ee5c3d46714 (diff)
parent3875b5ba9014a6ba540e51e0ffb411d58aa521e4 (diff)
downloadpuppet-66d0b16c8a0a55dd79b1b0f0e639f107e552d9ab.tar.gz
puppet-66d0b16c8a0a55dd79b1b0f0e639f107e552d9ab.tar.xz
puppet-66d0b16c8a0a55dd79b1b0f0e639f107e552d9ab.zip
Merge branch '2.6.next' into next
* 2.6.next: Fixed #6562 - Minor kick documentation fix (#6658) Propagate ENC connection errors to the agent (#4884) Remove typo from spec test (#4884) Modify tests to pass on non-OS X systems (#4884) Revise new exec tests, add a few more (#4884) Add an shell provider for execs (#4884) Fix Test::Unit exec tests (#4884) Break the exec type out to have a posix provider (#4884) Add consistent path validation and behavior (#4884) Add expand_path to requiring the spec_helper (#4884) Autorequire shared behaviors and method to silence warnings (#4884) Fix whitespace (#4884) Get rid of open3 require since it wasn't being used (#5814) Improved cron type specs (#5814) cron_spec shouldn't depend on cron provider Manually Resolved Conflicts: lib/puppet/util/command_line/puppetrun spec/spec_helper.rb spec/unit/type/exec_spec.rb spec/unit/type_spec.rb test/ral/type/exec.rb
Diffstat (limited to 'spec/shared_behaviours')
-rw-r--r--spec/shared_behaviours/path_parameters.rb185
1 files changed, 185 insertions, 0 deletions
diff --git a/spec/shared_behaviours/path_parameters.rb b/spec/shared_behaviours/path_parameters.rb
new file mode 100644
index 000000000..b5a907900
--- /dev/null
+++ b/spec/shared_behaviours/path_parameters.rb
@@ -0,0 +1,185 @@
+# In order to use this correctly you must define a method to get an instance
+# of the type being tested, so that this code can remain generic:
+#
+# it_should_behave_like "all path parameters", :path do
+# def instance(path)
+# Puppet::Type.type(:example).new(
+# :name => 'foo', :require => 'bar', :path_param => path
+# )
+# end
+#
+# That method will be invoked for each test to create the instance that we
+# subsequently test through the system; you should ensure that the minimum of
+# possible attributes are set to keep the tests clean.
+#
+# You must also pass the symbolic name of the parameter being tested to the
+# block, and optionally can pass a hash of additional options to the block.
+#
+# The known options are:
+# :array :: boolean, does this support arrays of paths, default true.
+
+shared_examples_for "all pathname parameters with arrays" do |win32|
+ path_types = {
+ "unix absolute" => "/foo/bar",
+ "unix relative" => "foo/bar",
+ "win32 absolute" => %q{\foo\bar},
+ "win32 relative" => %q{foo\bar},
+ "drive absolute" => %q{c:\foo\bar},
+ "drive relative" => %q{c:foo\bar}
+ }
+
+ describe "when given an array of paths" do
+ (1..path_types.length).each do |n|
+ path_types.keys.combination(n) do |set|
+ data = path_types.collect { |k, v| set.member?(k) ? v : nil } .compact
+ reject = true
+ only_absolute = set.find { |k| k =~ /relative/ } .nil?
+ only_unix = set.reject { |k| k =~ /unix/ } .length == 0
+
+ if only_absolute and (only_unix or win32) then
+ reject = false
+ end
+
+ it "should #{reject ? 'reject' : 'accept'} #{set.join(", ")}" do
+ if reject then
+ expect { instance(data) }.
+ should raise_error Puppet::Error, /fully qualified/
+ else
+ instance = instance(data)
+ instance[@param].should == data
+ end
+ end
+
+ it "should #{reject ? 'reject' : 'accept'} #{set.join(", ")} doubled" do
+ if reject then
+ expect { instance(data + data) }.
+ should raise_error Puppet::Error, /fully qualified/
+ else
+ instance = instance(data + data)
+ instance[@param].should == (data + data)
+ end
+ end
+ end
+ end
+ end
+end
+
+
+shared_examples_for "all path parameters" do |param, options|
+ # Extract and process options to the block.
+ options ||= {}
+ array = options[:array].nil? ? true : options.delete(:array)
+ if options.keys.length > 0 then
+ fail "unknown options for 'all path parameters': " +
+ options.keys.sort.join(', ')
+ end
+
+ def instance(path)
+ fail "we didn't implement the 'instance(path)' method in the it_should_behave_like block"
+ end
+
+ ########################################################################
+ # The actual testing code...
+ before :all do
+ @param = param
+ end
+
+ before :each do
+ @file_separator = File::SEPARATOR
+ end
+ after :each do
+ with_verbose_disabled do
+ verbose, $VERBOSE = $VERBOSE, nil
+ File::SEPARATOR = @file_separator
+ $VERBOSE = verbose
+ end
+ end
+
+ describe "on a Unix-like platform it" do
+ before :each do
+ with_verbose_disabled do
+ File::SEPARATOR = '/'
+ end
+ Puppet.features.stubs(:microsoft_windows?).returns(false)
+ Puppet.features.stubs(:posix?).returns(true)
+ end
+
+ if array then
+ it_should_behave_like "all pathname parameters with arrays", false
+ end
+
+ it "should accept a fully qualified path" do
+ path = File.join('', 'foo')
+ instance = instance(path)
+ instance[@param].should == path
+ end
+
+ it "should give a useful error when the path is not absolute" do
+ path = 'foo'
+ expect { instance(path) }.
+ should raise_error Puppet::Error, /fully qualified/
+ end
+
+ { "Unix" => '/', "Win32" => '\\' }.each do |style, slash|
+ %w{q Q a A z Z c C}.sort.each do |drive|
+ it "should reject drive letter '#{drive}' with #{style} path separators" do
+ path = "#{drive}:#{slash}Program Files"
+ expect { instance(path) }.
+ should raise_error Puppet::Error, /fully qualified/
+ end
+ end
+ end
+ end
+
+ describe "on a Windows-like platform it" do
+ before :each do
+ with_verbose_disabled do
+ File::SEPARATOR = '\\'
+ end
+ Puppet.features.stubs(:microsoft_windows?).returns(true)
+ Puppet.features.stubs(:posix?).returns(false)
+ end
+
+ if array then
+ it_should_behave_like "all pathname parameters with arrays", true
+ end
+
+ it "should accept a fully qualified path" do
+ path = File.join('', 'foo')
+ instance = instance(path)
+ instance[@param].should == path
+ end
+
+ it "should give a useful error when the path is not absolute" do
+ path = 'foo'
+ expect { instance(path) }.
+ should raise_error Puppet::Error, /fully qualified/
+ end
+
+ it "also accepts Unix style path separators" do
+ path = '/Program Files'
+ instance = instance(path)
+ instance[@param].should == path
+ end
+
+ { "Unix" => '/', "Win32" => '\\' }.each do |style, slash|
+ %w{q Q a A z Z c C}.sort.each do |drive|
+ it "should accept drive letter '#{drive}' with #{style} path separators " do
+ path = "#{drive}:#{slash}Program Files"
+ instance = instance(path)
+ instance[@param].should == path
+ end
+ end
+ end
+
+ { "UNC paths" => %q{\\foo\bar},
+ "unparsed local paths" => %q{\\?\c:\foo},
+ "unparsed UNC paths" => %q{\\?\foo\bar}
+ }.each do |name, path|
+ it "should accept #{name} as absolute" do
+ instance = instance(path)
+ instance[@param].should == path
+ end
+ end
+ end
+end