summaryrefslogtreecommitdiffstats
path: root/test/puppet/tc_suidmanager.rb
blob: 08d957cc0aa671a35762f6dea65fb155e27275c5 (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
#!/usr/bin/env ruby

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

require 'puppet'
require 'puppettest'
require 'test/unit'
require 'mocha'

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

    def setup
        @user = nonrootuser
        super
    end

    def test_metaprogramming_function_additions
        # NOTE: the way that we are dynamically generating the methods in
        # SUIDManager for the UID/GID calls was causing problems due to the
        # modification of a closure. Should the bug rear itself again, this
        # test will fail.
        Process.expects(:uid).times(2)

        assert_nothing_raised do
            Puppet::Util::SUIDManager.uid
            Puppet::Util::SUIDManager.uid
        end
    end

    def test_id_set
        Process.expects(:euid=).with(@user.uid)
        Process.expects(:egid=).with(@user.gid)

        assert_nothing_raised do
            Puppet::Util::SUIDManager.egid = @user.gid
            Puppet::Util::SUIDManager.euid = @user.uid
        end
    end

    def test_utiluid
        assert_not_equal(nil, Puppet::Util.uid(@user.name))
    end

    def test_asuser_as_root
        Process.stubs(:uid).returns(0)
        expects_id_set_and_revert @user.uid, @user.gid
        Puppet::Util::SUIDManager.asuser @user.uid, @user.gid do end
    end

    def test_asuser_as_nonroot
        Process.stubs(:uid).returns(1)
        expects_no_id_set
        Puppet::Util::SUIDManager.asuser @user.uid, @user.gid do end
    end


    def test_system_as_root
        Process.stubs(:uid).returns(0)
        set_exit_status!
        expects_id_set_and_revert @user.uid, @user.gid
        Kernel.expects(:system).with('blah')
        Puppet::Util::SUIDManager.system('blah', @user.uid, @user.gid)
    end

    def test_system_as_nonroot
        Process.stubs(:uid).returns(1)
        set_exit_status!
        expects_no_id_set
        Kernel.expects(:system).with('blah')
        Puppet::Util::SUIDManager.system('blah', @user.uid, @user.gid)
    end

    def test_run_and_capture
        if (RUBY_VERSION <=> "1.8.4") < 0
            warn "Cannot run this test on ruby < 1.8.4"
        else
            set_exit_status!

            Puppet::Util.expects(:execute).with( 'yay',
                                                 { :failonfail => false,
                                                   :uid => @user.uid,
                                                   :gid => @user.gid }
                                               ).returns('output')


            output = Puppet::Util::SUIDManager.run_and_capture 'yay', 
                                                               @user.uid,
                                                               @user.gid

            assert_equal 'output', output.first
            assert_kind_of Process::Status, output.last
        end
    end

    private

    def expects_id_set_and_revert(uid, gid)
        Process.expects(:euid).returns(99997)
        Process.expects(:egid).returns(99996)

        Process.expects(:euid=).with(uid)
        Process.expects(:egid=).with(gid)

        Process.expects(:euid=).with(99997)
        Process.expects(:egid=).with(99996)
    end

    def expects_no_id_set
        Process.expects(:egid).never
        Process.expects(:euid).never
        Process.expects(:egid=).never
        Process.expects(:euid=).never
    end

    def set_exit_status!
      # We want to make sure $? is set, this is the only way I know how.
      Kernel.system '' if $?.nil?
    end
end