summaryrefslogtreecommitdiffstats
path: root/test/language/node.rb
blob: 68459d141f60f4bb2074a1e9c7dc9ec055282de2 (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
#!/usr/bin/env ruby

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

require 'puppet'
require 'puppet/parser/parser'
require 'puppettest'

class TestParser < Test::Unit::TestCase
    include PuppetTest::ParserTesting

    def setup
        super
        Puppet[:parseonly] = true
    end

    def test_simple_hostname
        check_parseable "host1"
        check_parseable "'host2'"
        check_parseable "\"host3\""
        check_parseable [ "'host1'",  "host2" ]
        check_parseable [ "'host1'",  "'host2'" ]
        check_parseable [ "'host1'",  "\"host2\"" ]
        check_parseable [ "\"host1\"",  "host2" ]
        check_parseable [ "\"host1\"",  "'host2'" ]
        check_parseable [ "\"host1\"",  "\"host2\"" ]
    end

    def test_qualified_hostname
        check_parseable "'host.example.com'"
        check_parseable "\"host.example.com\""
        check_parseable [ "'host.example.com'", "host1" ]
        check_parseable [ "\"host.example.com\"", "host1" ]
        check_parseable "'host-1.37examples.example.com'"
        check_parseable "\"host-1.37examples.example.com\""
        check_parseable "'svn.23.nu'"
        check_parseable "\"svn.23.nu\""
        check_parseable "'HOST'"
        check_parseable "\"HOST\""
    end
    
    def test_inherits_from_default
        check_parseable(["default", "host1"], "node default {}\nnode host1 inherits default {}")
    end

    def test_reject_hostname
        check_nonparseable "host.example.com"
        check_nonparseable "host@example.com"
        check_nonparseable "'$foo.example.com'"
        check_nonparseable "\"$foo.example.com\""
        check_nonparseable "'host1 host2'"
        check_nonparseable "\"host1 host2\""
        check_nonparseable "HOST"
    end

    AST = Puppet::Parser::AST

    def check_parseable(hostnames, code = nil)
        unless hostnames.is_a?(Array)
            hostnames = [ hostnames ]
        end
        interp = nil
        code ||= "node #{hostnames.join(", ")} { }"
        assert_nothing_raised {
            interp = mkinterp :Code => code
        }
        # Strip quotes
        hostnames.map! { |s| s.sub(/^['"](.*)['"]$/, "\\1") }

        # parse
        assert_nothing_raised {
            interp.send(:parsefiles)
        }

        # Now make sure we can look up each of the names
        hostnames.each do |name|
            assert(interp.nodesearch(name),
                "Could not find node %s" % name.inspect)
        end
    end

    def check_nonparseable(hostname)
        interp = nil
        assert_raise(Puppet::DevError, Puppet::ParseError, "#{hostname} passed") {
            interp = mkinterp :Code => "node #{hostname} { }"
            interp.send(:parsefiles)
        }
    end

    # Make sure we can find default nodes if there's no other entry
    def test_default_node
        Puppet[:parseonly] = false

        fileA = tempfile()
        fileB = tempfile()
        code = %{
node mynode {
    file { "#{fileA}": ensure => file }
}

node default {
    file { "#{fileB}": ensure => file }
}
}
        interp = nil
        assert_nothing_raised {
            interp = mkinterp :Code => code
        }

        # First make sure it parses
        assert_nothing_raised {
            interp.send(:parsefiles)
        }

        # Make sure we find our normal node
        assert(interp.nodesearch("mynode"),
            "Did not find normal node")

        # Now look for the default node
        default = interp.nodesearch("someother")
        assert(default,
            "Did not find default node")

        assert_equal("default", default.classname)
    end
end