summaryrefslogtreecommitdiffstats
path: root/test/language/node.rb
blob: a1bb58a9fe2904e0c7c8866c99d71c34605717f1 (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
if __FILE__ == $0
    $:.unshift '../../lib'
    $:.unshift '..'
    $puppetbase = "../.."
end

require 'puppet'
require 'puppet/parser/parser'
require 'test/unit'
require 'puppettest'

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

    def setup
        super
        Puppet[:parseonly] = true
        @parser = Puppet::Parser::Parser.new()
    end

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

    def test_qualified_hostname
        check_parseable "'host.example.com'"
        check_parseable [ "'host.example.com'", "host1" ]
        check_parseable "'host-1.37examples.example.com'"
        check_parseable "'svn.23.nu'"
        check_parseable "'HOST'"
    end

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

    AST = Puppet::Parser::AST

    def check_parseable(hostnames)
        unless hostnames.is_a?(Array)
            hostnames = [ hostnames ]
        end
        assert_nothing_raised {
            @parser.string = "node #{hostnames.join(", ")} { }"
        }
        # Strip quotes
        hostnames.map! { |s| s.sub(/^'(.*)'$/, "\\1") }
        ast = nil
        assert_nothing_raised {
            ast = @parser.parse
        }
        # Verify that the AST has the expected structure
        # and that the leaves have the right hostnames in them
        assert_kind_of(AST::ASTArray, ast)
        assert_equal(1, ast.children.size)
        nodedef = ast.children[0]
        assert_kind_of(AST::NodeDef, nodedef)
        assert_kind_of(AST::ASTArray, nodedef.names)
        assert_equal(hostnames.size, nodedef.names.children.size)
        hostnames.size.times do |i|
            hostnode = nodedef.names.children[i]
            assert_kind_of(AST::HostName, hostnode)
            assert_equal(hostnames[i], hostnode.value)
        end
    end

    def check_nonparseable(hostname)
        assert_nothing_raised {
            @parser.string = "node #{hostname} { }"
        }

        assert_raise(Puppet::DevError, Puppet::ParseError) {
            @parser.parse
        }
    end

    # Make sure we can find default nodes if there's no other entry
    def test_default_node
        Puppet[:parseonly] = false
        @parser = Puppet::Parser::Parser.new()

        fileA = tempfile()
        fileB = tempfile()
        @parser.string = %{
node mynode {
    file { "#{fileA}": ensure => file }
}

node default {
    file { "#{fileB}": ensure => file }
}
}

        # First make sure it parses
        ast = nil
        assert_nothing_raised {
            ast = @parser.parse
        }

        args = {
            :ast => ast,
            :facts => {},
            :names => ["mynode"]
        }
        # Make sure we get a config for "mynode"

        trans = nil
        assert_nothing_raised {
            trans = Puppet::Parser::Scope.new.evaluate(args)
        }

        assert(trans, "Did not get config for mynode")

        args[:names] = ["othernode"]
        # Now make sure the default node is used
        trans = nil
        assert_nothing_raised {
            trans = Puppet::Parser::Scope.new.evaluate(args)
        }

        assert(trans, "Did not get config for default node")
    end
end