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
|
#!/usr/bin/env ruby
#
# Created by Luke A. Kanies on 2006-02-20.
# Copyright (c) 2006. All rights reserved.
$:.unshift("../../lib") if __FILE__ =~ /\.rb$/
require 'puppettest'
require 'mocha'
require 'puppettest/parsertesting'
require 'puppettest/resourcetesting'
class TestASTComponent < Test::Unit::TestCase
include PuppetTest
include PuppetTest::ParserTesting
include PuppetTest::ResourceTesting
AST = Puppet::Parser::AST
def test_component
interp, scope, source = mkclassframing
# Create a new definition
klass = interp.newdefine "yayness",
:arguments => [["owner", stringobj("nobody")], %w{mode}],
:code => AST::ASTArray.new(
:children => [resourcedef("file", "/tmp/$name",
"owner" => varref("owner"), "mode" => varref("mode"))]
)
# Test validattr? a couple different ways
[:owner, "owner", :schedule, "schedule"].each do |var|
assert(klass.validattr?(var), "%s was not considered valid" % var.inspect)
end
[:random, "random"].each do |var|
assert(! klass.validattr?(var), "%s was considered valid" % var.inspect)
end
# Now call it a couple of times
# First try it without a required param
assert_raise(Puppet::ParseError) do
klass.evaluate(:scope => scope,
:name => "bad",
:arguments => {"owner" => "nobody"}
)
end
# And make sure it didn't create the file
assert_nil(scope.findresource("File[/tmp/bad]"),
"Made file with invalid params")
assert_nothing_raised do
klass.evaluate(:scope => scope,
:title => "first",
:arguments => {"mode" => "755"}
)
end
firstobj = scope.findresource("File[/tmp/first]")
assert(firstobj, "Did not create /tmp/first obj")
assert_equal("file", firstobj.type)
assert_equal("/tmp/first", firstobj.title)
assert_equal("nobody", firstobj[:owner])
assert_equal("755", firstobj[:mode])
# Make sure we can't evaluate it with the same args
assert_raise(Puppet::ParseError) do
klass.evaluate(:scope => scope,
:title => "first",
:arguments => {"mode" => "755"}
)
end
# Now create another with different args
assert_nothing_raised do
klass.evaluate(:scope => scope,
:title => "second",
:arguments => {"mode" => "755", "owner" => "daemon"}
)
end
secondobj = scope.findresource("File[/tmp/second]")
assert(secondobj, "Did not create /tmp/second obj")
assert_equal("file", secondobj.type)
assert_equal("/tmp/second", secondobj.title)
assert_equal("daemon", secondobj[:owner])
assert_equal("755", secondobj[:mode])
end
# #539 - definitions should support both names and titles
def test_names_and_titles
interp, scope, source = mkclassframing
[
{:name => "one", :title => "two"},
{:title => "mytitle"},
].each_with_index do |hash, i|
# Create a definition that uses both name and title
klass = interp.newdefine "yayness%s" % i
subscope = klass.subscope(scope, "yayness%s" % i)
klass.expects(:subscope).returns(subscope)
args = {:title => hash[:title]}
if hash[:name]
args[:arguments] = {:name => hash[:name]}
end
args[:scope] = scope
assert_nothing_raised("Could not evaluate definition with %s" % hash.inspect) do
klass.evaluate(args)
end
name = hash[:name] || hash[:title]
title = hash[:title]
args[:name] ||= name
assert_equal(name, subscope.lookupvar("name"),
"Name did not get set correctly")
assert_equal(title, subscope.lookupvar("title"),
"title did not get set correctly")
[:name, :title].each do |param|
val = args[param]
assert(subscope.tags.include?(val),
"Scope was not tagged with %s" % val)
end
end
end
end
# $Id$
|