summaryrefslogtreecommitdiffstats
path: root/test/ral/manager/provider.rb
blob: 16d865800a8420da1154cb65a8d8ada597a5944b (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
#!/usr/bin/env ruby

require File.dirname(__FILE__) + '/../../lib/puppettest'

require 'puppettest'
require 'mocha'

class TestTypeProviders < Test::Unit::TestCase
    include PuppetTest

    def setup
        super
        @type = Puppet::Type.newtype(:provider_test) do
            newparam(:name) {}
            ensurable
        end
        cleanup { Puppet::Type.rmtype(:provider_test) }
    end

    # Make sure default providers behave correctly
    def test_defaultproviders
        basic = @type.provide(:basic) do
            defaultfor :operatingsystem => :somethingelse,
                :operatingsystemrelease => :yayness
        end

        assert_equal(basic, @type.defaultprovider)
        @type.defaultprovider = nil

        greater = @type.provide(:greater) do
            defaultfor :operatingsystem => Facter.value("operatingsystem")
        end

        assert_equal(greater, @type.defaultprovider)
    end

    # Make sure the provider is always the first parameter created.
    def test_provider_sorting
        should = [:name, :ensure]
        assert_equal(should, @type.allattrs.reject { |p| ! should.include?(p) },
            "Got wrong order of parameters")

        @type.provide(:yay) { }
        should = [:name, :provider, :ensure]
        assert_equal(should, @type.allattrs.reject { |p| ! should.include?(p) },
            "Providify did not reorder parameters")
    end

    # Make sure that provider instances can be passed in directly.
    def test_name_or_provider
        provider = @type.provide(:testing) do
        end

        # first make sure we can pass the name in
        resource = nil
        assert_nothing_raised("Could not create provider instance by name") do
            resource = @type.new :name => "yay", :provider => :testing
        end

        assert_instance_of(provider, resource.provider, "Did not create provider instance")

        # Now make sure we can pass in an instance
        provinst = provider.new(:name => "foo")
        assert_nothing_raised("Could not pass in provider instance") do
            resource = @type.new :name => "foo", :provider => provinst
        end

        assert_equal(provinst, resource.provider, "Did not retain provider instance")
        assert_equal(provider.name, resource[:provider], "Provider value was set to the provider instead of its name")

        # Now make sure unsuitable provider instances still throw errors
        provider = @type.provide(:badprov) do
            confine :exists => "/no/such/file"
        end

        # And make sure the provider must be a valid provider type for this resource
        pkgprov = Puppet::Type.type(:package).new(:name => "yayness").provider
        assert(provider, "did not get package provider")

        assert_raise(Puppet::Error, "Did not fail on invalid provider instance") do
            resource = @type.new :name => "bar", :provider => pkgprov
        end

    end

    # #571 -- so we can cause a provider to become suitable within
    # a run.
    def test_unsuitable_providers_should_not_fail_at_initialization
        Puppet::Type.type(:user).provider(:useradd).stubs(:suitable?).returns false

        assert_nothing_raised("Unsuitable providers failed at initialization") do
            Puppet::Type.type(:user).new :name => "luke", :ensure => :present, :provider => :useradd
        end
    end

    # #571 -- so we can cause a provider to become suitable within
    # a run.
    def test_unsuitable_providers_should_fail_at_evaluation
        Puppet::Type.type(:user).provider(:useradd).stubs(:suitable?).returns false

        user = Puppet::Type.type(:user).new :name => "luke", :ensure => :present, :provider => :useradd
        assert_raise(Puppet::Error, "Unsuitable provider did not fail at evaluation") do
            user.evaluate
        end
    end
end