summaryrefslogtreecommitdiff
path: root/spec/unit/provider_resolver_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/unit/provider_resolver_spec.rb')
-rw-r--r--spec/unit/provider_resolver_spec.rb305
1 files changed, 170 insertions, 135 deletions
diff --git a/spec/unit/provider_resolver_spec.rb b/spec/unit/provider_resolver_spec.rb
index cd3d7713a7..88df4a20cc 100644
--- a/spec/unit/provider_resolver_spec.rb
+++ b/spec/unit/provider_resolver_spec.rb
@@ -28,30 +28,37 @@ include Chef::Mixin::ConvertToClassName
describe Chef::ProviderResolver do
+ let(:resource_name) { :service }
+ let(:provider) { nil }
+ let(:action) { :start }
+
let(:node) do
node = Chef::Node.new
- allow(node).to receive(:[]).with(:os).and_return(os)
- allow(node).to receive(:[]).with(:platform_family).and_return(platform_family)
- allow(node).to receive(:[]).with(:platform).and_return(platform)
- allow(node).to receive(:[]).with(:platform_version).and_return(platform_version)
- allow(node).to receive(:is_a?).and_return(Chef::Node)
+ node.automatic[:os] = os
+ node.automatic[:platform_family] = platform_family
+ node.automatic[:platform] = platform
+ node.automatic[:platform_version] = platform_version
+ node.automatic[:kernel] = { machine: 'i386' }
node
end
+ let(:run_context) { Chef::RunContext.new(node, nil, nil) }
let(:provider_resolver) { Chef::ProviderResolver.new(node, resource, action) }
+ let(:resolved_provider) do
+ begin
+ resource ? resource.provider_for_action(action).class : nil
+ rescue Chef::Exceptions::ProviderNotFound
+ nil
+ end
+ end
- let(:action) { :start }
-
- let(:resolved_provider) { provider_resolver.resolve }
-
- let(:provider) { nil }
-
- let(:resource_name) { :service }
-
- let(:resource) { double(Chef::Resource, provider: provider, resource_name: resource_name) }
-
- before do
- allow(resource).to receive(:is_a?).with(Chef::Resource).and_return(true)
+ let(:resource) do
+ resource_class = Chef::ResourceResolver.resolve(resource_name, node: node)
+ if resource_class
+ resource = resource_class.new('test', run_context)
+ resource.provider = provider if provider
+ end
+ resource
end
def self.on_platform(platform, *tags,
@@ -83,16 +90,41 @@ describe Chef::ProviderResolver do
end
def self.expect_providers(**providers)
- providers.each do |name, provider|
+ providers.each do |name, expected|
describe name.to_s do
let(:resource_name) { name }
- if provider
- it "resolves to a #{provider}" do
- expect(resolved_provider).to eql(provider)
+
+ tags = []
+ expected_provider = nil
+ expected_resource = nil
+ Array(expected).each do |p|
+ if p.is_a?(Class) && p <= Chef::Provider
+ expected_provider = p
+ elsif p.is_a?(Class) && p <= Chef::Resource
+ expected_resource = p
+ else
+ tags << p
+ end
+ end
+
+ if expected_resource && expected_provider
+ it "'#{name}' resolves to resource #{expected_resource} and provider #{expected_provider}", *tags do
+ expect(resource.class).to eql(expected_resource)
+ provider = double(expected_provider, class: expected_provider)
+ expect(provider).to receive(:action=).with(action)
+ expect(expected_provider).to receive(:new).with(resource, run_context).and_return(provider)
+ expect(resolved_provider).to eql(expected_provider)
+ end
+ elsif expected_provider
+ it "'#{name}' resolves to provider #{expected_provider}", *tags do
+ provider = double(expected_provider)
+ expect(provider).to receive(:action=).with(action)
+ expect(expected_provider).to receive(:new).with(resource, run_context).and_return(provider)
+ expect(resolved_provider).to eql(expected_provider)
end
else
- it "Fails to resolve (since #{name.inspect} is unsupported on #{platform} #{platform_version})" do
- expect { resolved_provider }.to raise_error /Cannot find a provider/
+ it "'#{name}' fails to resolve (since #{name.inspect} is unsupported on #{platform} #{platform_version})", *tags do
+ expect(resolved_provider).to be_nil
end
end
end
@@ -454,48 +486,48 @@ describe Chef::ProviderResolver do
PROVIDERS =
{
- bash: Chef::Provider::Script,
- breakpoint: Chef::Provider::Breakpoint,
- chef_gem: Chef::Provider::Package::Rubygems,
- cookbook_file: Chef::Provider::CookbookFile,
- csh: Chef::Provider::Script,
- deploy: Chef::Provider::Deploy::Timestamped,
- deploy_revision: Chef::Provider::Deploy::Revision,
- directory: Chef::Provider::Directory,
- easy_install_package: Chef::Provider::Package::EasyInstall,
- erl_call: Chef::Provider::ErlCall,
- execute: Chef::Provider::Execute,
- file: Chef::Provider::File,
- gem_package: Chef::Provider::Package::Rubygems,
- git: Chef::Provider::Git,
- group: Chef::Provider::Group::Gpasswd,
- homebrew_package: Chef::Provider::Package::Homebrew,
- http_request: Chef::Provider::HttpRequest,
- ifconfig: Chef::Provider::Ifconfig,
- link: Chef::Provider::Link,
- log: Chef::Provider::Log::ChefLog,
- macports_package: Chef::Provider::Package::Macports,
- mdadm: Chef::Provider::Mdadm,
- mount: Chef::Provider::Mount::Mount,
- perl: Chef::Provider::Script,
- portage_package: Chef::Provider::Package::Portage,
- python: Chef::Provider::Script,
- remote_directory: Chef::Provider::RemoteDirectory,
- route: Chef::Provider::Route,
- ruby: Chef::Provider::Script,
- ruby_block: Chef::Provider::RubyBlock,
- script: Chef::Provider::Script,
- subversion: Chef::Provider::Subversion,
- template: Chef::Provider::Template,
- timestamped_deploy: Chef::Provider::Deploy::Timestamped,
- user: Chef::Provider::User::Useradd,
- whyrun_safe_ruby_block: Chef::Provider::WhyrunSafeRubyBlock,
+ bash: [ Chef::Resource::Bash, Chef::Provider::Script ],
+ breakpoint: [ Chef::Resource::Breakpoint, Chef::Provider::Breakpoint ],
+ chef_gem: [ Chef::Resource::ChefGem, Chef::Provider::Package::Rubygems ],
+ cookbook_file: [ Chef::Resource::CookbookFile, Chef::Provider::CookbookFile ],
+ csh: [ Chef::Resource::Csh, Chef::Provider::Script ],
+ deploy: [ Chef::Resource::Deploy, Chef::Provider::Deploy::Timestamped ],
+ deploy_revision: [ Chef::Resource::DeployRevision, Chef::Provider::Deploy::Revision ],
+ directory: [ Chef::Resource::Directory, Chef::Provider::Directory ],
+ easy_install_package: [ Chef::Resource::EasyInstallPackage, Chef::Provider::Package::EasyInstall ],
+ erl_call: [ Chef::Resource::ErlCall, Chef::Provider::ErlCall ],
+ execute: [ Chef::Resource::Execute, Chef::Provider::Execute ],
+ file: [ Chef::Resource::File, Chef::Provider::File ],
+ gem_package: [ Chef::Resource::GemPackage, Chef::Provider::Package::Rubygems ],
+ git: [ Chef::Resource::Git, Chef::Provider::Git ],
+ group: [ Chef::Resource::Group, Chef::Provider::Group::Gpasswd ],
+ homebrew_package: [ Chef::Resource::HomebrewPackage, Chef::Provider::Package::Homebrew ],
+ http_request: [ Chef::Resource::HttpRequest, Chef::Provider::HttpRequest ],
+ ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig ],
+ link: [ Chef::Resource::Link, Chef::Provider::Link ],
+ log: [ Chef::Resource::Log, Chef::Provider::Log::ChefLog ],
+ macports_package: [ Chef::Resource::MacportsPackage, Chef::Provider::Package::Macports ],
+ mdadm: [ Chef::Resource::Mdadm, Chef::Provider::Mdadm ],
+ mount: [ Chef::Resource::Mount, Chef::Provider::Mount::Mount ],
+ perl: [ Chef::Resource::Perl, Chef::Provider::Script ],
+ portage_package: [ Chef::Resource::PortagePackage, Chef::Provider::Package::Portage ],
+ python: [ Chef::Resource::Python, Chef::Provider::Script ],
+ remote_directory: [ Chef::Resource::RemoteDirectory, Chef::Provider::RemoteDirectory ],
+ route: [ Chef::Resource::Route, Chef::Provider::Route ],
+ ruby: [ Chef::Resource::Ruby, Chef::Provider::Script ],
+ ruby_block: [ Chef::Resource::RubyBlock, Chef::Provider::RubyBlock ],
+ script: [ Chef::Resource::Script, Chef::Provider::Script ],
+ subversion: [ Chef::Resource::Subversion, Chef::Provider::Subversion ],
+ template: [ Chef::Resource::Template, Chef::Provider::Template ],
+ timestamped_deploy: [ Chef::Resource::TimestampedDeploy, Chef::Provider::Deploy::Timestamped ],
+ user: [ Chef::Resource::User, Chef::Provider::User::Useradd ],
+ whyrun_safe_ruby_block: [ Chef::Resource::WhyrunSafeRubyBlock, Chef::Provider::WhyrunSafeRubyBlock ],
# We want to check that these are unsupported:
apt_package: nil,
bff_package: nil,
- dsc_script: nil,
dpkg_package: nil,
+ dsc_script: nil,
ips_package: nil,
pacman_package: nil,
paludis_package: nil,
@@ -507,61 +539,62 @@ describe Chef::ProviderResolver do
windows_service: nil,
"linux" => {
- apt_package: Chef::Provider::Package::Apt,
- dpkg_package: Chef::Provider::Package::Dpkg,
- pacman_package: Chef::Provider::Package::Pacman,
- paludis_package: Chef::Provider::Package::Paludis,
- rpm_package: Chef::Provider::Package::Rpm,
- yum_package: Chef::Provider::Package::Yum,
+ apt_package: [ Chef::Resource::AptPackage, Chef::Provider::Package::Apt ],
+ dpkg_package: [ Chef::Resource::DpkgPackage, Chef::Provider::Package::Dpkg ],
+ pacman_package: [ Chef::Resource::PacmanPackage, Chef::Provider::Package::Pacman ],
+ paludis_package: [ Chef::Resource::PaludisPackage, Chef::Provider::Package::Paludis ],
+ rpm_package: [ Chef::Resource::RpmPackage, Chef::Provider::Package::Rpm ],
+ yum_package: [ Chef::Resource::YumPackage, Chef::Provider::Package::Yum ],
"debian" => {
- ifconfig: Chef::Provider::Ifconfig::Debian,
- package: Chef::Provider::Package::Apt,
-# service: Chef::Provider::Service::Debian,
+ ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig::Debian ],
+ package: [ Chef::Resource::AptPackage, Chef::Provider::Package::Apt ],
+# service: [ Chef::Resource::DebianService, Chef::Provider::Service::Debian ],
"debian" => {
"7.0" => {
},
"6.0" => {
- ifconfig: Chef::Provider::Ifconfig,
-# service: Chef::Provider::Service::Insserv,
+ ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig ],
+# service: [ Chef::Resource::InsservService, Chef::Provider::Service::Insserv ],
},
"5.0" => {
- ifconfig: Chef::Provider::Ifconfig,
+ ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig ],
},
},
"gcel" => {
"3.1.4" => {
- ifconfig: Chef::Provider::Ifconfig,
+ ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig ],
},
},
"linaro" => {
"3.1.4" => {
- ifconfig: Chef::Provider::Ifconfig,
+ ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig ],
},
},
"linuxmint" => {
"3.1.4" => {
- ifconfig: Chef::Provider::Ifconfig,
-# service: Chef::Provider::Service::Upstart,
+ ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig ],
+# service: [ Chef::Resource::UpstartService, Chef::Provider::Service::Upstart ],
},
},
"raspbian" => {
"3.1.4" => {
- ifconfig: Chef::Provider::Ifconfig,
+ ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig ],
},
},
"ubuntu" => {
"11.10" => {
},
"10.04" => {
- ifconfig: Chef::Provider::Ifconfig,
+ ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig ],
},
},
},
"arch" => {
- package: Chef::Provider::Package::Pacman,
+ # TODO should be Chef::Resource::PacmanPackage
+ package: [ Chef::Resource::Package, Chef::Provider::Package::Pacman ],
"arch" => {
"3.1.4" => {
@@ -570,8 +603,8 @@ describe Chef::ProviderResolver do
},
"freebsd" => {
- group: Chef::Provider::Group::Pw,
- user: Chef::Provider::User::Pw,
+ group: [ Chef::Resource::Group, Chef::Provider::Group::Pw ],
+ user: [ Chef::Resource::User, Chef::Provider::User::Pw ],
"freebsd" => {
"3.1.4" => {
@@ -579,30 +612,31 @@ describe Chef::ProviderResolver do
},
},
"suse" => {
- group: Chef::Provider::Group::Gpasswd,
+ group: [ Chef::Resource::Group, Chef::Provider::Group::Gpasswd ],
"suse" => {
"12.0" => {
},
%w(11.1 11.2 11.3) => {
- group: Chef::Provider::Group::Suse,
+ group: [ Chef::Resource::Group, Chef::Provider::Group::Suse ],
},
},
"opensuse" => {
-# service: Chef::Provider::Service::Redhat,
- package: Chef::Provider::Package::Zypper,
- group: Chef::Provider::Group::Usermod,
+# service: [ Chef::Resource::RedhatService, Chef::Provider::Service::Redhat ],
+ package: [ Chef::Resource::ZypperPackage, Chef::Provider::Package::Zypper ],
+ group: [ Chef::Resource::Group, Chef::Provider::Group::Usermod ],
"12.3" => {
},
"12.2" => {
- group: Chef::Provider::Group::Suse,
+ group: [ Chef::Resource::Group, Chef::Provider::Group::Suse ],
},
},
},
"gentoo" => {
- package: Chef::Provider::Package::Portage,
- portage_package: Chef::Provider::Package::Portage,
-# service: Chef::Provider::Service::Gentoo,
+ # TODO should be Chef::Resource::PortagePackage
+ package: [ Chef::Resource::Package, Chef::Provider::Package::Portage ],
+ portage_package: [ Chef::Resource::PortagePackage, Chef::Provider::Package::Portage ],
+# service: [ Chef::Resource::GentooService, Chef::Provider::Service::Gentoo ],
"gentoo" => {
"3.1.4" => {
@@ -611,27 +645,27 @@ describe Chef::ProviderResolver do
},
"rhel" => {
-# service: Chef::Provider::Service::Systemd,
- package: Chef::Provider::Package::Yum,
- ifconfig: Chef::Provider::Ifconfig::Redhat,
+# service: [ Chef::Resource::SystemdService, Chef::Provider::Service::Systemd ],
+ package: [ Chef::Resource::YumPackage, Chef::Provider::Package::Yum ],
+ ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig::Redhat ],
%w(amazon xcp xenserver ibm_powerkvm cloudlinux parallels) => {
"3.1.4" => {
-# service: Chef::Provider::Service::Redhat,
+# service: [ Chef::Resource::RedhatService, Chef::Provider::Service::Redhat ],
},
},
%w(redhat centos scientific oracle) => {
"7.0" => {
},
"6.0" => {
-# service: Chef::Provider::Service::Redhat,
+# service: [ Chef::Resource::RedhatService, Chef::Provider::Service::Redhat ],
},
},
"fedora" => {
"15.0" => {
},
"14.0" => {
-# service: Chef::Provider::Service::Redhat,
+# service: [ Chef::Resource::RedhatService, Chef::Provider::Service::Redhat ],
},
},
},
@@ -640,9 +674,9 @@ describe Chef::ProviderResolver do
"darwin" => {
%w(mac_os_x mac_os_x_server) => {
- group: Chef::Provider::Group::Dscl,
- package: Chef::Provider::Package::Homebrew,
- user: Chef::Provider::User::Dscl,
+ group: [ Chef::Resource::Group, Chef::Provider::Group::Dscl ],
+ package: [ Chef::Resource::HomebrewPackage, Chef::Provider::Package::Homebrew ],
+ user: [ Chef::Resource::User, Chef::Provider::User::Dscl ],
"mac_os_x" => {
"10.9.2" => {
@@ -652,17 +686,17 @@ describe Chef::ProviderResolver do
},
"windows" => {
- batch: Chef::Provider::Batch,
- dsc_script: Chef::Provider::DscScript,
- env: Chef::Provider::Env::Windows,
- group: Chef::Provider::Group::Windows,
- mount: Chef::Provider::Mount::Windows,
- package: Chef::Provider::Package::Windows,
- powershell_script: Chef::Provider::PowershellScript,
- service: Chef::Provider::Service::Windows,
- user: Chef::Provider::User::Windows,
- windows_package: Chef::Provider::Package::Windows,
- windows_service: Chef::Provider::Service::Windows,
+ batch: [ Chef::Resource::Batch, Chef::Provider::Batch ],
+ dsc_script: [ Chef::Resource::DscScript, Chef::Provider::DscScript ],
+ env: [ Chef::Resource::Env, Chef::Provider::Env::Windows ],
+ group: [ Chef::Resource::Group, Chef::Provider::Group::Windows ],
+ mount: [ Chef::Resource::Mount, Chef::Provider::Mount::Windows ],
+ package: [ Chef::Resource::WindowsPackage, Chef::Provider::Package::Windows ],
+ powershell_script: [ Chef::Resource::PowershellScript, Chef::Provider::PowershellScript ],
+ service: [ Chef::Resource::WindowsService, Chef::Provider::Service::Windows ],
+ user: [ Chef::Resource::User, Chef::Provider::User::Windows ],
+ windows_package: [ Chef::Resource::WindowsPackage, Chef::Provider::Package::Windows ],
+ windows_service: [ Chef::Resource::WindowsService, Chef::Provider::Service::Windows ],
"windows" => {
%w(mswin mingw32 windows) => {
@@ -673,15 +707,16 @@ describe Chef::ProviderResolver do
},
"aix" => {
- bff_package: Chef::Provider::Package::Aix,
- cron: Chef::Provider::Cron::Aix,
- group: Chef::Provider::Group::Aix,
- ifconfig: Chef::Provider::Ifconfig::Aix,
- mount: Chef::Provider::Mount::Aix,
- package: Chef::Provider::Package::Aix,
- rpm_package: Chef::Provider::Package::Rpm,
- user: Chef::Provider::User::Aix,
-# service: Chef::Provider::Service::Aix,
+ bff_package: [ Chef::Resource::BffPackage, Chef::Provider::Package::Aix ],
+ cron: [ Chef::Resource::Cron, Chef::Provider::Cron::Aix ],
+ group: [ Chef::Resource::Group, Chef::Provider::Group::Aix ],
+ ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig::Aix ],
+ mount: [ Chef::Resource::Mount, Chef::Provider::Mount::Aix ],
+ # TODO should be Chef::Resource::BffPackage
+ package: [ Chef::Resource::Package, Chef::Provider::Package::Aix ],
+ rpm_package: [ Chef::Resource::RpmPackage, Chef::Provider::Package::Rpm ],
+ user: [ Chef::Resource::User, Chef::Provider::User::Aix ],
+# service: [ Chef::Resource::AixService, Chef::Provider::Service::Aix ],
"aix" => {
"aix" => {
@@ -695,7 +730,7 @@ describe Chef::ProviderResolver do
"hpux" => {
"hpux" => {
"3.1.4" => {
- group: Chef::Provider::Group::Usermod
+ group: [ Chef::Resource::Group, Chef::Provider::Group::Usermod ]
}
}
}
@@ -705,15 +740,15 @@ describe Chef::ProviderResolver do
"netbsd" => {
"netbsd" => {
"3.1.4" => {
- group: Chef::Provider::Group::Groupmod,
+ group: [ Chef::Resource::Group, Chef::Provider::Group::Groupmod ],
},
},
},
},
"openbsd" => {
- group: Chef::Provider::Group::Usermod,
- package: Chef::Provider::Package::Openbsd,
+ group: [ Chef::Resource::Group, Chef::Provider::Group::Usermod ],
+ package: [ Chef::Resource::OpenbsdPackage, Chef::Provider::Package::Openbsd ],
"openbsd" => {
"openbsd" => {
@@ -724,15 +759,15 @@ describe Chef::ProviderResolver do
},
"solaris2" => {
- group: Chef::Provider::Group::Usermod,
- ips_package: Chef::Provider::Package::Ips,
- package: Chef::Provider::Package::Ips,
- mount: Chef::Provider::Mount::Solaris,
- solaris_package: Chef::Provider::Package::Solaris,
+ group: [ Chef::Resource::Group, Chef::Provider::Group::Usermod ],
+ ips_package: [ Chef::Resource::IpsPackage, Chef::Provider::Package::Ips ],
+ package: [ Chef::Resource::SolarisPackage, Chef::Provider::Package::Solaris ],
+ mount: [ Chef::Resource::Mount, Chef::Provider::Mount::Solaris ],
+ solaris_package: [ Chef::Resource::SolarisPackage, Chef::Provider::Package::Solaris ],
"smartos" => {
- smartos_package: Chef::Provider::Package::SmartOS,
- package: Chef::Provider::Package::SmartOS,
+ smartos_package: [ Chef::Resource::SmartosPackage, Chef::Provider::Package::SmartOS ],
+ package: [ Chef::Resource::SmartosPackage, Chef::Provider::Package::SmartOS ],
"smartos" => {
"3.1.4" => {
@@ -743,12 +778,11 @@ describe Chef::ProviderResolver do
"solaris2" => {
"nexentacore" => {
"3.1.4" => {
- package: Chef::Provider::Package::Solaris,
},
},
"omnios" => {
"3.1.4" => {
- user: Chef::Provider::User::Solaris,
+ user: [ Chef::Resource::User, Chef::Provider::User::Solaris ],
}
},
"openindiana" => {
@@ -760,11 +794,11 @@ describe Chef::ProviderResolver do
},
},
"solaris2" => {
- user: Chef::Provider::User::Solaris,
+ user: [ Chef::Resource::User, Chef::Provider::User::Solaris ],
"5.11" => {
+ package: [ Chef::Resource::IpsPackage, Chef::Provider::Package::Ips ],
},
"5.9" => {
- package: Chef::Provider::Package::Solaris,
},
},
},
@@ -784,7 +818,8 @@ describe Chef::ProviderResolver do
"exherbo" => {
"exherbo" => {
"3.1.4" => {
- package: Chef::Provider::Package::Paludis
+ # TODO should be Chef::Resource::PaludisPackage
+ package: [ Chef::Resource::Package, Chef::Provider::Package::Paludis ]
}
}
}