summaryrefslogtreecommitdiffstats
path: root/test/ral/type/resources.rb
blob: 426e76b0e426b3726f19967ad8fdb4a5d9732925 (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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#!/usr/bin/env ruby
#
#  Created by Luke Kanies on 2006-12-12.
#  Copyright (c) 2006. All rights reserved.

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

require 'puppettest'

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

    def add_purge_lister
        # Now define the list method
        class << @purgetype
            def instances
                $purgemembers.values
            end
        end
    end
    
    def mk_purger(managed = false)
        @purgenum ||= 0
        @purgenum += 1
        obj = @purgetype.create :name => "purger%s" % @purgenum
        $purgemembers[obj[:name]] = obj
        if managed
            obj[:fake] = "testing"
        end
        obj
    end

    def mkpurgertype
        # Create a purgeable type
        $purgemembers = {}
        @purgetype = Puppet::Type.newtype(:purgetest) do
            newparam(:name, :namevar => true) {}
            newproperty(:ensure) do
                newvalue(:absent) do
                    $purgemembers[@parent[:name]] = @parent
                end
                newvalue(:present) do
                    $purgemembers.delete(@parent[:name])
                end
            end
            newproperty(:fake) do
                def sync
                    :faked
                end
            end
        end
        cleanup do
            Puppet::Type.rmtype(:purgetest)
        end
    end

    def setup
        super
        @type = Puppet::Type.type(:resources)
    end

    def test_purge
        # Create a purgeable type
        mkpurgertype
        
        purger = nil
        assert_nothing_raised do
            purger = @type.new :name => "purgetest", :noop => true, :loglevel => :warning
        end
        assert(purger, "did not get purger manager")
        add_purge_lister()
        
        assert_equal($purgemembers.values.sort, @purgetype.instances.sort)
        
        # and it should now succeed
        assert_nothing_raised do
            purger[:purge] = true
        end
        assert(purger.purge?, "purge boolean was not enabled")
        
        # Okay, now let's try doing some purging, yo
        managed = []
        unmanned = []
        3.times { managed << mk_purger(true) } # 3 managed
        3.times { unmanned << mk_purger(false) } # 3 unmanaged
        
        managed.each do |m|
            assert(m.managed?, "managed resource was not considered managed")
        end
        unmanned.each do |u|
            assert(! u.managed?, "unmanaged resource was considered managed")
        end
        
        # First make sure we get nothing back when purge is false
        genned = nil
        purger[:purge] = false
        assert_nothing_raised do
            genned = purger.generate
        end
        assert_equal([], genned, "Purged even when purge is false")
        
        # Now make sure we can purge
        purger[:purge] = true
        assert_nothing_raised do
            genned = purger.generate
        end
        assert(genned, "Did not get any generated resources")

        genned.each do |res|
            assert(res.purging, "did not mark resource for purging")
        end
        assert(! genned.empty?, "generated resource list was empty")
        
        # Now make sure the generate method only finds the unmanaged resources
        assert_equal(unmanned.collect { |r| r.title }.sort, genned.collect { |r| r.title },
            "Did not return correct purge list")
        
        # Now make sure our metaparams carried over
        genned.each do |res|
            [:noop, :loglevel].each do |param|
                assert_equal(purger[param], res[param], "metaparam %s did not carry over" % param)
            end
        end
    end
    
    # Part of #408.
    def test_check
        # First check a non-user
        res = Puppet::Type.type(:resources).new :name => :package
        assert_nil(res[:unless_system_user], "got bad default for package")
        
        
        assert_nothing_raised {
            assert(res.check("A String"), "String failed check")
            assert(res.check(Puppet::Type.type(:file).new(:path => tempfile())), "File failed check")
            assert(res.check(Puppet::Type.type(:user).new(:name => "yayness")), "User failed check in package")
        }
        
        # Now create a user manager
        res = Puppet::Type.type(:resources).new :name => :user
        
        # Make sure the default is 500
        assert_equal(500, res[:unless_system_user], "got bad default")
        
        # Now make sure root fails the test
        @user = Puppet::Type.type(:user)
        assert_nothing_raised {
            assert(! res.check(@user.create(:name => "root")), "root passed check")
            assert(! res.check(@user.create(:name => "nobody")), "nobody passed check")
        }
        
        # Now find a user between 0 and the limit
        low = high = nil
        Etc.passwd { |entry|
            if ! low and (entry.uid > 10 and entry.uid < 500)
                low = entry.name
            else
                # We'll reset the limit, since we can't really guarantee that
                # there are any users with uid > 500
                if ! high and entry.uid > 100 and ! res.system_users.include?(entry.name)
                    high = entry.name
                    break
                end
            end
        }
        
        if low
            assert(! res.check(@user.create(:name => low)), "low user %s passed check" % low)
        end
        if high
            res[:unless_system_user] = 50
            assert(res.check(@user.create(:name => high)), "high user %s failed check" % high)
        end
    end
    
    # The other half of #408.
    def test_check_is_called
        res = Puppet::Type.type(:resources).new :name => :user, :purge => true
        
        list = nil
        assert_nothing_raised { list = res.generate }
        
        assert(! list.empty?, "did not get any users")
        
        bad = list.find_all { |u|
                %w{root bin nobody}.include?(u[:name]) or (cv = u.retrieve and cv[u.property(:uid)] < 500)
            }
        assert(bad.empty?, "incorrectly passed users %s" % bad.collect { |u| u[:name]}.join(", "))
    end
end