summaryrefslogtreecommitdiff
path: root/spec/unit/dsl/platfrom_introspection_spec.rb
diff options
context:
space:
mode:
authorSeth Chisamore <schisamo@opscode.com>2012-10-30 10:39:35 -0400
committerSeth Chisamore <schisamo@opscode.com>2012-10-30 10:39:35 -0400
commit24dc69a9a97e82a6e4207de68d6dcc664178249b (patch)
tree19bb289c9f88b4bbab066bc56b95d6d222fd5c35 /spec/unit/dsl/platfrom_introspection_spec.rb
parent9348c1c9c80ee757354d624b7dc1b78ebc7605c4 (diff)
downloadchef-24dc69a9a97e82a6e4207de68d6dcc664178249b.tar.gz
[OC-3564] move core Chef to the repo root \o/ \m/
The opscode/chef repository now only contains the core Chef library code used by chef-client, knife and chef-solo!
Diffstat (limited to 'spec/unit/dsl/platfrom_introspection_spec.rb')
-rw-r--r--spec/unit/dsl/platfrom_introspection_spec.rb272
1 files changed, 272 insertions, 0 deletions
diff --git a/spec/unit/dsl/platfrom_introspection_spec.rb b/spec/unit/dsl/platfrom_introspection_spec.rb
new file mode 100644
index 0000000000..e6cc7ad9ff
--- /dev/null
+++ b/spec/unit/dsl/platfrom_introspection_spec.rb
@@ -0,0 +1,272 @@
+#
+# Author:: Seth Falcon (<seth@opscode.com>)
+# Copyright:: Copyright (c) 2010 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 'spec_helper'
+require 'chef/dsl/platform_introspection'
+
+class LanguageTester
+ include Chef::DSL::PlatformIntrospection
+end
+
+describe Chef::DSL::PlatformIntrospection do
+ before(:each) do
+ @language = LanguageTester.new
+ @node = Hash.new
+ @language.stub!(:node).and_return(@node)
+ @platform_hash = {}
+ %w{openbsd freebsd}.each do |x|
+ @platform_hash[x] = {
+ "default" => x,
+ "1.2.3" => "#{x}-1.2.3"
+ }
+ end
+ @platform_hash["debian"] = {["5", "6"] => "debian-5/6", "default" => "debian"}
+ @platform_hash["default"] = "default"
+
+ @platform_family_hash = {
+ "debian" => "debian value",
+ [:rhel, :fedora] => "redhatty value",
+ "suse" => "suse value",
+ :default => "default value"
+ }
+ end
+
+ it "returns a default value when there is no known platform" do
+ @node = Hash.new
+ @language.value_for_platform(@platform_hash).should == "default"
+ end
+
+ it "returns a default value when there is no known platform family" do
+ @language.value_for_platform_family(@platform_family_hash).should == "default value"
+ end
+
+ it "returns a default value when the current platform doesn't match" do
+ @node[:platform] = "not-a-known-platform"
+ @language.value_for_platform(@platform_hash).should == "default"
+ end
+
+ it "returns a default value when current platform_family doesn't match" do
+ @node[:platform_family] = "ultra-derived-linux"
+ @language.value_for_platform_family(@platform_family_hash).should == "default value"
+ end
+
+ it "returns a value based on the current platform" do
+ @node[:platform] = "openbsd"
+ @language.value_for_platform(@platform_hash).should == "openbsd"
+ end
+
+ it "returns a value based on the current platform family" do
+ @node[:platform_family] = "debian"
+ @language.value_for_platform_family(@platform_family_hash).should == "debian value"
+ end
+
+ it "returns a version-specific value based on the current platform" do
+ @node[:platform] = "openbsd"
+ @node[:platform_version] = "1.2.3"
+ @language.value_for_platform(@platform_hash).should == "openbsd-1.2.3"
+ end
+
+ it "returns a value based on the current platform if version not found" do
+ @node[:platform] = "openbsd"
+ @node[:platform_version] = "0.0.0"
+ @language.value_for_platform(@platform_hash).should == "openbsd"
+ end
+
+ describe "when platform versions is an array" do
+ it "returns a version-specific value based on the current platform" do
+ @node[:platform] = "debian"
+ @node[:platform_version] = "6"
+ @language.value_for_platform(@platform_hash).should == "debian-5/6"
+ end
+
+ it "returns a value based on the current platform if version not found" do
+ @node[:platform] = "debian"
+ @node[:platform_version] = "0.0.0"
+ @language.value_for_platform(@platform_hash).should == "debian"
+ end
+ end
+
+ describe "when checking platform?" do
+ before(:each) do
+ @language = LanguageTester.new
+ @node = Hash.new
+ @language.stub!(:node).and_return(@node)
+ end
+
+ it "returns true if the node is a provided platform and platforms are provided as symbols" do
+ @node[:platform] = 'ubuntu'
+ @language.platform?([:redhat, :ubuntu]).should == true
+ end
+
+ it "returns true if the node is a provided platform and platforms are provided as strings" do
+ @node[:platform] = 'ubuntu'
+ @language.platform?(["redhat", "ubuntu"]).should == true
+ end
+
+ it "returns false if the node is not of the provided platforms" do
+ @node[:platform] = 'ubuntu'
+ @language.platform?(:splatlinux).should == false
+ end
+ end
+
+ describe "when checking platform_family?" do
+ before(:each) do
+ @language = LanguageTester.new
+ @node = Hash.new
+ @language.stub!(:node).and_return(@node)
+ end
+
+ it "returns true if the node is in a provided platform family and families are provided as symbols" do
+ @node[:platform_family] = 'debian'
+ @language.platform_family?([:rhel, :debian]).should == true
+ end
+
+ it "returns true if the node is a provided platform and platforms are provided as strings" do
+ @node[:platform_family] = 'rhel'
+ @language.platform_family?(["rhel", "debian"]).should == true
+ end
+
+ it "returns false if the node is not of the provided platforms" do
+ @node[:platform_family] = 'suse'
+ @language.platform_family?(:splatlinux).should == false
+ end
+
+ it "returns false if the node is not of the provided platforms and platform_family is not set" do
+ @language.platform_family?(:splatlinux).should == false
+ end
+
+ end
+ # NOTE: this is a regression test for bug CHEF-1514
+ describe "when the value is an array" do
+ before do
+ @platform_hash = {
+ "debian" => { "4.0" => [ :restart, :reload ], "default" => [ :restart, :reload, :status ] },
+ "ubuntu" => { "default" => [ :restart, :reload, :status ] },
+ "centos" => { "default" => [ :restart, :reload, :status ] },
+ "redhat" => { "default" => [ :restart, :reload, :status ] },
+ "fedora" => { "default" => [ :restart, :reload, :status ] },
+ "default" => { "default" => [:restart, :reload ] }}
+ end
+
+ it "returns the correct default for a given platform" do
+ @node[:platform] = "debian"
+ @node[:platform_version] = '9000'
+ @language.value_for_platform(@platform_hash).should == [ :restart, :reload, :status ]
+ end
+
+ it "returns the correct platform+version specific value " do
+ @node[:platform] = "debian"
+ @node[:platform_version] = '4.0'
+ @language.value_for_platform(@platform_hash).should == [:restart, :reload]
+ end
+ end
+
+end
+
+describe Chef::DSL::PlatformIntrospection::PlatformDependentValue do
+ before do
+ platform_hash = {
+ :openbsd => {:default => 'free, functional, secure'},
+ [:redhat, :centos, :fedora, :scientific] => {:default => '"stable"'},
+ :ubuntu => {'10.04' => 'using upstart more', :default => 'using init more'},
+ :default => 'bork da bork'
+ }
+ @platform_specific_value = Chef::DSL::PlatformIntrospection::PlatformDependentValue.new(platform_hash)
+ end
+
+ it "returns the default value when the platform doesn't match" do
+ @platform_specific_value.value_for_node(:platform => :dos).should == 'bork da bork'
+ end
+
+ it "returns a value for a platform set as a group" do
+ @platform_specific_value.value_for_node(:platform => :centos).should == '"stable"'
+ end
+
+ it "returns a value for the platform when it was set as a symbol but fetched as a string" do
+ @platform_specific_value.value_for_node(:platform => "centos").should == '"stable"'
+ end
+
+ it "returns a value for a specific platform version" do
+ node = {:platform => 'ubuntu', :platform_version => '10.04'}
+ @platform_specific_value.value_for_node(node).should == 'using upstart more'
+ end
+
+ it "returns a platform-default value if the platform version doesn't match an explicit one" do
+ node = {:platform => 'ubuntu', :platform_version => '9.10' }
+ @platform_specific_value.value_for_node(node).should == 'using init more'
+ end
+
+ it "returns nil if there is no default and no platforms match" do
+ # this matches the behavior in the original implementation.
+ # whether or not it's correct is another matter.
+ platform_specific_value = Chef::DSL::PlatformIntrospection::PlatformDependentValue.new({})
+ platform_specific_value.value_for_node(:platform => 'foo').should be_nil
+ end
+
+ it "raises an argument error if the platform hash is not correctly structured" do
+ bad_hash = {:ubuntu => :foo} # should be :ubuntu => {:default => 'foo'}
+ lambda {Chef::DSL::PlatformIntrospection::PlatformDependentValue.new(bad_hash)}.should raise_error(ArgumentError)
+ end
+
+end
+describe Chef::DSL::PlatformIntrospection::PlatformFamilyDependentValue do
+ before do
+ @array_values = [:stop, :start, :reload]
+
+ @platform_family_hash = {
+ "debian" => "debian value",
+ [:rhel, "fedora"] => "redhatty value",
+ "suse" => @array_values,
+ :gentoo => "gentoo value",
+ :default => "default value"
+ }
+
+ @platform_family_value = Chef::DSL::PlatformIntrospection::PlatformFamilyDependentValue.new(@platform_family_hash)
+ end
+
+ it "returns the default value when the platform family doesn't match" do
+ @platform_family_value.value_for_node(:platform_family => :os2).should == 'default value'
+ end
+
+
+ it "returns a value for the platform family when it was set as a string but fetched as a symbol" do
+ @platform_family_value.value_for_node(:platform_family => :debian).should == "debian value"
+ end
+
+ it "returns a value for the platform family when it was set as a symbol but fetched as a string" do
+ @platform_family_value.value_for_node(:platform_family => "gentoo").should == "gentoo value"
+ end
+
+ it "returns an array value stored for a platform family" do
+ @platform_family_value.value_for_node(:platform_family => "suse").should == @array_values
+ end
+
+ it "returns a value for the platform family when it was set within an array hash key as a symbol" do
+ @platform_family_value.value_for_node(:platform_family => :rhel).should == "redhatty value"
+ end
+
+ it "returns a value for the platform family when it was set within an array hash key as a string" do
+ @platform_family_value.value_for_node(:platform_family => "fedora").should == "redhatty value"
+ end
+
+ it "returns nil if there is no default and no platforms match" do
+ platform_specific_value = Chef::DSL::PlatformIntrospection::PlatformFamilyDependentValue.new({})
+ platform_specific_value.value_for_node(:platform_family => 'foo').should be_nil
+ end
+
+end