summaryrefslogtreecommitdiffstats
path: root/test/network/handler/report.rb
blob: ac8cf6facf7b9a34f4880627d0f848a0a58a2734 (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
#!/usr/bin/env ruby

$:.unshift("../../lib") if __FILE__ =~ /\.rb$/

require 'puppettest'
require 'puppet/network/handler/report'
require 'puppettest/reporttesting'

class TestReportServer < Test::Unit::TestCase
	include PuppetTest
	include PuppetTest::Reporttesting

    Report = Puppet::Network::Handler.report
	Puppet::Util.logmethods(self)

    def mkserver
        server = nil
        assert_nothing_raised {
            server = Puppet::Network::Handler.report.new()
        }
        server
    end

    def mkclient(server = nil)
        server ||= mkserver()
        client = nil
        assert_nothing_raised {
            client = Puppet::Network::Client.report.new(:Report => server)
        }

        client
    end

    def test_report_autoloading
        # Create a fake report
        fakedir = tempfile()
        $: << fakedir
        cleanup do $:.delete(fakedir) end

        libdir = File.join(fakedir, "puppet", "reports")
        FileUtils.mkdir_p(libdir)

        $myreportrun = false
        file = File.join(libdir, "myreport.rb")
        File.open(file, "w") { |f| f.puts %{
                Puppet::Network::Handler.report.newreport(:myreport) do
                    def process(report)
                        $myreportrun = true
                        return report
                    end
                end
            }
        }
        Puppet[:reports] = "myreport"

        # Create a server
        server = Puppet::Network::Handler.report.new

        report = nil
        assert_nothing_raised {
            report = Puppet::Network::Handler.report.report(:myreport)
        }
        assert(report, "Did not get report")

    end

    def test_process
        server = Puppet::Network::Handler.report.new

        # We have to run multiple reports to make sure there's no conflict
        reports = []
        $run = []
        5.times do |i|
            name = "processtest%s" % i
            reports << name

            Report.newreport(name) do
                def process
                    $run << self.report_name
                end
            end
        end
        Puppet[:reports] = reports.collect { |r| r.to_s }.join(",")

        report = fakereport

        retval = nil
        assert_nothing_raised {
            retval = server.send(:process, YAML.dump(report))
        }

        reports.each do |name|
            assert($run.include?(name.intern), "Did not run %s" % name)
        end

        # Now make sure our server doesn't die on missing reports
        Puppet[:reports] = "fakereport"
        assert_nothing_raised {
            retval = server.send(:process, YAML.dump(report))
        }
    end

    # Make sure reports can specify whether to use yaml or not
    def test_useyaml
        server = Puppet::Network::Handler.report.new

        Report.newreport(:yamlyes, :useyaml => true) do
            def process(report)
                $yamlyes = :yesyaml
            end
        end

        Report.newreport(:yamlno) do
            def process
                $yamlno = :noyaml
            end
        end

        Puppet[:reports] = "yamlyes, yamlno"

        report = fakereport
        yaml = YAML.dump(report)

        assert_nothing_raised do
            server.send(:process, yaml)
        end

        assert_equal(:noyaml, $yamlno, "YAML was used for non-yaml report")
        assert_equal(:yesyaml, $yamlyes, "YAML was not used for yaml report")
    end

    def test_reports
        Puppet[:reports] = "myreport"

        # Create a server
        server = Puppet::Network::Handler.report.new

        {"myreport" => ["myreport"],
            " fake, another, yay " => ["fake", "another", "yay"]
        }.each do |str, ary|
            Puppet[:reports] = str
            assert_equal(ary, server.send(:reports))
        end
    end

    def test_newreport
        name = :newreporttest
        assert_nothing_raised do
            Report.newreport(name) do
                attr_accessor :processed

                def process(report)
                    @processed = report
                end
            end
        end

        assert(Report.report(name), "Did not get report")
        assert_instance_of(Module, Report.report(name))

        obj = "yay"
        obj.extend(Report.report(name))

        assert_nothing_raised do
            obj.process("yay")
        end

        assert_equal("yay", obj.processed)
    end

    # Make sure we get a list of all reports
    def test_report_list
        list = nil
        assert_nothing_raised do
            list = Puppet::Network::Handler.report.reports
        end

        [:rrdgraph, :store, :tagmail].each do |name|
            assert(list.include?(name), "Did not load %s" % name)
        end
    end
end