puppet 4.10.9 → 4.10.10
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/puppet/agent.rb +22 -2
- data/lib/puppet/application.rb +18 -1
- data/lib/puppet/application/agent.rb +9 -2
- data/lib/puppet/application/apply.rb +1 -1
- data/lib/puppet/application/config.rb +1 -0
- data/lib/puppet/application/device.rb +1 -2
- data/lib/puppet/application/filebucket.rb +22 -5
- data/lib/puppet/application/help.rb +1 -0
- data/lib/puppet/application/inspect.rb +2 -0
- data/lib/puppet/application/lookup.rb +1 -3
- data/lib/puppet/application_support.rb +6 -1
- data/lib/puppet/defaults.rb +33 -4
- data/lib/puppet/face/config.rb +13 -0
- data/lib/puppet/functions/each.rb +10 -4
- data/lib/puppet/functions/lookup.rb +2 -2
- data/lib/puppet/functions/map.rb +12 -2
- data/lib/puppet/functions/reduce.rb +45 -2
- data/lib/puppet/interface.rb +1 -0
- data/lib/puppet/module_tool/tar/mini.rb +57 -4
- data/lib/puppet/network/http/factory.rb +9 -0
- data/lib/puppet/network/http/webrick.rb +1 -3
- data/lib/puppet/node.rb +10 -0
- data/lib/puppet/node/facts.rb +9 -0
- data/lib/puppet/parser/functions/sprintf.rb +17 -3
- data/lib/puppet/pops/loader/static_loader.rb +2 -2
- data/lib/puppet/pops/lookup/hiera_config.rb +2 -2
- data/lib/puppet/pops/merge_strategy.rb +16 -1
- data/lib/puppet/pops/types/iterable.rb +2 -0
- data/lib/puppet/pops/types/type_factory.rb +1 -1
- data/lib/puppet/pops/types/type_mismatch_describer.rb +15 -5
- data/lib/puppet/pops/types/types.rb +4 -2
- data/lib/puppet/provider/service/smf.rb +2 -2
- data/lib/puppet/provider/service/systemd.rb +1 -0
- data/lib/puppet/provider/service/upstart.rb +1 -1
- data/lib/puppet/settings/environment_conf.rb +10 -2
- data/lib/puppet/transaction.rb +3 -0
- data/lib/puppet/transaction/report.rb +8 -1
- data/lib/puppet/type.rb +1 -9
- data/lib/puppet/type/user.rb +9 -3
- data/lib/puppet/util/http_proxy.rb +14 -6
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +29 -13
- data/man/man5/puppet.conf.5 +276 -55
- data/man/man8/extlookup2hiera.8 +2 -2
- data/man/man8/puppet-agent.8 +32 -10
- data/man/man8/puppet-apply.8 +21 -6
- data/man/man8/puppet-ca.8 +48 -34
- data/man/man8/puppet-catalog.8 +4 -4
- data/man/man8/puppet-cert.8 +23 -6
- data/man/man8/puppet-certificate.8 +44 -28
- data/man/man8/puppet-certificate_request.8 +4 -4
- data/man/man8/puppet-certificate_revocation_list.8 +4 -4
- data/man/man8/puppet-config.8 +5 -5
- data/man/man8/puppet-describe.8 +3 -3
- data/man/man8/puppet-device.8 +23 -13
- data/man/man8/puppet-doc.8 +5 -5
- data/man/man8/puppet-epp.8 +16 -10
- data/man/man8/puppet-facts.8 +4 -4
- data/man/man8/puppet-file.8 +4 -4
- data/man/man8/puppet-filebucket.8 +63 -6
- data/man/man8/puppet-generate.8 +84 -0
- data/man/man8/puppet-help.8 +4 -4
- data/man/man8/puppet-inspect.8 +8 -5
- data/man/man8/puppet-key.8 +4 -4
- data/man/man8/puppet-lookup.8 +87 -0
- data/man/man8/puppet-man.8 +5 -5
- data/man/man8/puppet-master.8 +5 -5
- data/man/man8/puppet-module.8 +22 -13
- data/man/man8/puppet-node.8 +4 -4
- data/man/man8/puppet-parser.8 +4 -4
- data/man/man8/puppet-plugin.8 +4 -4
- data/man/man8/puppet-report.8 +4 -4
- data/man/man8/puppet-resource.8 +4 -8
- data/man/man8/puppet-resource_type.8 +4 -4
- data/man/man8/puppet-status.8 +5 -5
- data/man/man8/puppet.8 +12 -3
- data/spec/fixtures/unit/application/environments/production/data/common.yaml +2 -0
- data/spec/integration/agent/logging_spec.rb +2 -0
- data/spec/integration/provider/cron/crontab_spec.rb +1 -0
- data/spec/unit/agent_spec.rb +33 -0
- data/spec/unit/application/config_spec.rb +4 -0
- data/spec/unit/application/inspect_spec.rb +11 -0
- data/spec/unit/application/lookup_spec.rb +30 -0
- data/spec/unit/application_spec.rb +18 -0
- data/spec/unit/environments_spec.rb +15 -0
- data/spec/unit/face/config_spec.rb +1 -2
- data/spec/unit/functions/break_spec.rb +108 -49
- data/spec/unit/functions/defined_spec.rb +2 -2
- data/spec/unit/functions/lookup_spec.rb +88 -3
- data/spec/unit/interface_spec.rb +12 -0
- data/spec/unit/module_tool/tar/mini_spec.rb +34 -5
- data/spec/unit/network/http/factory_spec.rb +22 -0
- data/spec/unit/network/http/webrick_spec.rb +30 -29
- data/spec/unit/parser/functions/sprintf_spec.rb +26 -0
- data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
- data/spec/unit/pops/types/type_calculator_spec.rb +21 -0
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +9 -0
- data/spec/unit/provider/service/smf_spec.rb +2 -4
- data/spec/unit/provider/service/systemd_spec.rb +14 -0
- data/spec/unit/resource/catalog_spec.rb +10 -0
- data/spec/unit/transaction/report_spec.rb +19 -0
- data/spec/unit/util/http_proxy_spec.rb +37 -0
- metadata +4 -2
@@ -268,11 +268,11 @@ describe "the 'defined' function" do
|
|
268
268
|
end
|
269
269
|
|
270
270
|
it 'raises error if referencing undef' do
|
271
|
-
expect{func.call(@scope, nil)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String or Type, got Undef/)
|
271
|
+
expect{func.call(@scope, nil)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String, Type\[CatalogEntry\], or Type\[Type\], got Undef/)
|
272
272
|
end
|
273
273
|
|
274
274
|
it 'raises error if referencing a number' do
|
275
|
-
expect{func.call(@scope, 42)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String or Type, got Integer/)
|
275
|
+
expect{func.call(@scope, 42)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String, Type\[CatalogEntry\], or Type\[Type\], got Integer/)
|
276
276
|
end
|
277
277
|
|
278
278
|
it 'is false if referencing empty string' do
|
@@ -842,6 +842,24 @@ describe "The lookup function" do
|
|
842
842
|
end
|
843
843
|
end
|
844
844
|
end
|
845
|
+
|
846
|
+
context 'that contains an array with duplicates' do
|
847
|
+
let(:common_yaml) { <<-YAML.unindent }
|
848
|
+
a:
|
849
|
+
- alpha
|
850
|
+
- bravo
|
851
|
+
- charlie
|
852
|
+
- bravo
|
853
|
+
YAML
|
854
|
+
|
855
|
+
it 'retains the duplicates when using default merge strategy' do
|
856
|
+
expect(lookup('a')).to eql(%w(alpha bravo charlie bravo))
|
857
|
+
end
|
858
|
+
|
859
|
+
it 'does deduplification when using merge strategy "unique"' do
|
860
|
+
expect(lookup('a', :merge => 'unique')).to eql(%w(alpha bravo charlie))
|
861
|
+
end
|
862
|
+
end
|
845
863
|
end
|
846
864
|
|
847
865
|
context 'with lookup_options configured using patterns' do
|
@@ -1084,14 +1102,81 @@ describe "The lookup function" do
|
|
1084
1102
|
glob_c: value glob_a
|
1085
1103
|
YAML
|
1086
1104
|
'b.yaml' => <<-YAML.unindent
|
1087
|
-
|
1088
|
-
|
1089
|
-
|
1105
|
+
glob_d:
|
1106
|
+
a: value glob_d.a
|
1107
|
+
b: value glob_d.b
|
1090
1108
|
YAML
|
1091
1109
|
|
1092
1110
|
}
|
1093
1111
|
}
|
1094
1112
|
end
|
1113
|
+
|
1114
|
+
it 'finds environment data using globs' do
|
1115
|
+
expect(lookup('glob_a')).to eql('value glob_a')
|
1116
|
+
expect(warnings).to be_empty
|
1117
|
+
end
|
1118
|
+
|
1119
|
+
it 'finds environment data using interpolated globs' do
|
1120
|
+
expect(lookup('glob_d.a')).to eql('value glob_d.a')
|
1121
|
+
expect(warnings).to be_empty
|
1122
|
+
end
|
1123
|
+
end
|
1124
|
+
|
1125
|
+
context 'and an environment Hiera v5 configuration using uris' do
|
1126
|
+
let(:env_hiera_yaml) do
|
1127
|
+
<<-YAML.unindent
|
1128
|
+
---
|
1129
|
+
version: 5
|
1130
|
+
hierarchy:
|
1131
|
+
- name: Uris
|
1132
|
+
uris:
|
1133
|
+
- "http://test.example.com"
|
1134
|
+
- "/some/arbitrary/path"
|
1135
|
+
- "urn:with:opaque:path"
|
1136
|
+
- "dothis%20-f%20bar"
|
1137
|
+
data_hash: mod::uri_test_func
|
1138
|
+
YAML
|
1139
|
+
end
|
1140
|
+
|
1141
|
+
let(:env_modules) do
|
1142
|
+
{
|
1143
|
+
'mod' => { 'lib' => { 'puppet' => { 'functions' => { 'mod' => { 'uri_test_func.rb' => <<-RUBY } } } } }
|
1144
|
+
Puppet::Functions.create_function(:'mod::uri_test_func') do
|
1145
|
+
dispatch :uri_test_func do
|
1146
|
+
param 'Hash', :options
|
1147
|
+
param 'Puppet::LookupContext', :context
|
1148
|
+
end
|
1149
|
+
|
1150
|
+
def uri_test_func(options, context)
|
1151
|
+
{ 'uri' => [ options['uri'] ] }
|
1152
|
+
end
|
1153
|
+
end
|
1154
|
+
RUBY
|
1155
|
+
}
|
1156
|
+
end
|
1157
|
+
|
1158
|
+
it 'The uris are propagated in the options hash' do
|
1159
|
+
expect(lookup('uri', 'merge' => 'unique')).to eql(
|
1160
|
+
%w(http://test.example.com /some/arbitrary/path urn:with:opaque:path dothis%20-f%20bar))
|
1161
|
+
expect(warnings).to be_empty
|
1162
|
+
end
|
1163
|
+
|
1164
|
+
context 'and a uri uses bad syntax' do
|
1165
|
+
let(:env_hiera_yaml) do
|
1166
|
+
<<-YAML.unindent
|
1167
|
+
---
|
1168
|
+
version: 5
|
1169
|
+
hierarchy:
|
1170
|
+
- name: Uris
|
1171
|
+
uri: "dothis -f bar"
|
1172
|
+
data_hash: mod::uri_test_func
|
1173
|
+
YAML
|
1174
|
+
end
|
1175
|
+
|
1176
|
+
it 'an attempt to lookup raises InvalidURIError' do
|
1177
|
+
expect{ lookup('uri', 'merge' => 'unique') }.to raise_error(/bad URI/)
|
1178
|
+
end
|
1179
|
+
end
|
1095
1180
|
end
|
1096
1181
|
|
1097
1182
|
context 'and an environment Hiera v5 configuration using mapped_paths' do
|
data/spec/unit/interface_spec.rb
CHANGED
@@ -126,6 +126,18 @@ describe Puppet::Interface do
|
|
126
126
|
expect { subject[:foo, '0.0.1'] }.to raise_error Puppet::Error
|
127
127
|
end
|
128
128
|
|
129
|
+
describe 'when raising NoMethodErrors' do
|
130
|
+
subject { described_class.new(:foo, '1.0.0') }
|
131
|
+
|
132
|
+
it 'includes the face name in the error message' do
|
133
|
+
expect { subject.boombaz }.to raise_error(NoMethodError, /#{subject.name}/)
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'includes the face version in the error message' do
|
137
|
+
expect { subject.boombaz }.to raise_error(NoMethodError, /#{subject.version}/)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
129
141
|
it_should_behave_like "things that declare options" do
|
130
142
|
def add_options_to(&block)
|
131
143
|
subject.new(:with_options, '0.0.1', &block)
|
@@ -8,10 +8,17 @@ describe Puppet::ModuleTool::Tar::Mini, :if => (Puppet.features.minitar? and Pup
|
|
8
8
|
let(:destfile) { '/the/dest/file.tar.gz' }
|
9
9
|
let(:minitar) { described_class.new }
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
class MockFileStatEntry
|
12
|
+
def initialize(mode = 0100)
|
13
|
+
@mode = mode
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "unpacks a tar file with correct permissions" do
|
18
|
+
entry = unpacks_the_entry(:file_start, 'thefile')
|
13
19
|
|
14
20
|
minitar.unpack(sourcefile, destdir, 'uid')
|
21
|
+
expect(entry.instance_variable_get(:@mode)).to eq(0755)
|
15
22
|
end
|
16
23
|
|
17
24
|
it "does not allow an absolute path" do
|
@@ -41,20 +48,42 @@ describe Puppet::ModuleTool::Tar::Mini, :if => (Puppet.features.minitar? and Pup
|
|
41
48
|
"Attempt to install file with an invalid path into \"#{File.expand_path('/the/thedir')}\" under \"#{destdir}\"")
|
42
49
|
end
|
43
50
|
|
51
|
+
it "unpacks on Windows" do
|
52
|
+
unpacks_the_entry(:file_start, 'thefile', nil)
|
53
|
+
|
54
|
+
entry = minitar.unpack(sourcefile, destdir, 'uid')
|
55
|
+
# Windows does not use these permissions.
|
56
|
+
expect(entry.instance_variable_get(:@mode)).to eq(nil)
|
57
|
+
end
|
58
|
+
|
44
59
|
it "packs a tar file" do
|
45
60
|
writer = stub('GzipWriter')
|
46
61
|
|
47
62
|
Zlib::GzipWriter.expects(:open).with(destfile).yields(writer)
|
48
|
-
|
63
|
+
stats = {:mode => 0222}
|
64
|
+
Archive::Tar::Minitar.expects(:pack).with(sourcedir, writer).yields(:file_start, 'abc', stats)
|
65
|
+
|
66
|
+
minitar.pack(sourcedir, destfile)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "packs a tar file on Windows" do
|
70
|
+
writer = stub('GzipWriter')
|
71
|
+
|
72
|
+
Zlib::GzipWriter.expects(:open).with(destfile).yields(writer)
|
73
|
+
Archive::Tar::Minitar.expects(:pack).with(sourcedir, writer).
|
74
|
+
yields(:file_start, 'abc', {:entry => MockFileStatEntry.new(nil)})
|
49
75
|
|
50
76
|
minitar.pack(sourcedir, destfile)
|
51
77
|
end
|
52
78
|
|
53
|
-
def unpacks_the_entry(type, name)
|
79
|
+
def unpacks_the_entry(type, name, mode = 0100)
|
54
80
|
reader = stub('GzipReader')
|
55
81
|
|
56
82
|
Zlib::GzipReader.expects(:open).with(sourcefile).yields(reader)
|
57
83
|
minitar.expects(:find_valid_files).with(reader).returns([name])
|
58
|
-
|
84
|
+
entry = MockFileStatEntry.new(mode)
|
85
|
+
Archive::Tar::Minitar.expects(:unpack).with(reader, destdir, [name]).
|
86
|
+
yields(type, name, {:entry => entry})
|
87
|
+
entry
|
59
88
|
end
|
60
89
|
end
|
@@ -94,5 +94,27 @@ describe Puppet::Network::HTTP::Factory do
|
|
94
94
|
expect(conn.read_timeout).to eq(120)
|
95
95
|
end
|
96
96
|
end
|
97
|
+
|
98
|
+
context 'source address' do
|
99
|
+
it 'defaults to system-defined' do
|
100
|
+
skip "Requires Ruby >= 2.0" unless RUBY_VERSION.to_i >= 2
|
101
|
+
conn = create_connection(site)
|
102
|
+
|
103
|
+
expect(conn.local_host).to be(nil)
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'sets the local_host address' do
|
107
|
+
Puppet[:sourceaddress] = "127.0.0.1"
|
108
|
+
if RUBY_VERSION.to_i >= 2
|
109
|
+
conn = create_connection(site)
|
110
|
+
|
111
|
+
expect(conn.local_host).to eq('127.0.0.1')
|
112
|
+
else
|
113
|
+
expect {
|
114
|
+
create_connection(site)
|
115
|
+
}.to raise_error(ArgumentError, "Setting 'sourceaddress' is unsupported by this version of Net::HTTP.")
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
97
119
|
end
|
98
120
|
end
|
@@ -14,31 +14,37 @@ describe Puppet::Network::HTTP::WEBrick do
|
|
14
14
|
|
15
15
|
let(:address) { '127.0.0.1' }
|
16
16
|
let(:port) { 31337 }
|
17
|
-
|
18
|
-
let(:
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
17
|
+
let(:server) { Puppet::Network::HTTP::WEBrick.new }
|
18
|
+
let(:localcacert) { make_absolute("/ca/crt") }
|
19
|
+
let(:ssl_server_ca_auth) { make_absolute("/ca/ssl_server_auth_file") }
|
20
|
+
let(:key) { stub 'key', :content => "mykey" }
|
21
|
+
let(:cert) { stub 'cert', :content => "mycert" }
|
22
|
+
let(:host) { stub 'host', :key => key, :certificate => cert, :name => "yay", :ssl_store => "mystore" }
|
24
23
|
|
25
24
|
let(:mock_ssl_context) do
|
26
25
|
stub('ssl_context', :ciphers= => nil)
|
27
26
|
end
|
28
27
|
|
28
|
+
let(:socket) { mock('socket') }
|
29
29
|
let(:mock_webrick) do
|
30
|
-
stub('webrick',
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
30
|
+
server = stub('webrick',
|
31
|
+
:[] => {},
|
32
|
+
:listeners => [],
|
33
|
+
:status => :Running,
|
34
|
+
:mount => nil,
|
35
|
+
:shutdown => nil,
|
36
|
+
:ssl_context => mock_ssl_context)
|
37
|
+
server.stubs(:start).yields(socket)
|
38
|
+
IO.stubs(:select).with([socket], nil, nil, anything).returns(true)
|
39
|
+
socket.stubs(:accept)
|
40
|
+
server.stubs(:run).with(socket)
|
41
|
+
server
|
38
42
|
end
|
39
43
|
|
40
44
|
before :each do
|
41
45
|
WEBrick::HTTPServer.stubs(:new).returns(mock_webrick)
|
46
|
+
Puppet::SSL::Certificate.indirection.stubs(:find).with('ca').returns cert
|
47
|
+
Puppet::SSL::Host.stubs(:localhost).returns host
|
42
48
|
end
|
43
49
|
|
44
50
|
describe "when turning on listening" do
|
@@ -88,6 +94,13 @@ describe Puppet::Network::HTTP::WEBrick do
|
|
88
94
|
expect(server).to be_listening
|
89
95
|
end
|
90
96
|
|
97
|
+
it "is passed a yet to be accepted socket" do
|
98
|
+
socket.expects(:accept)
|
99
|
+
|
100
|
+
server.listen(address, port)
|
101
|
+
server.unlisten
|
102
|
+
end
|
103
|
+
|
91
104
|
describe "when the REST protocol is requested" do
|
92
105
|
it "should register the REST handler at /" do
|
93
106
|
# We don't care about the options here.
|
@@ -192,18 +205,6 @@ describe Puppet::Network::HTTP::WEBrick do
|
|
192
205
|
end
|
193
206
|
|
194
207
|
describe "when configuring ssl" do
|
195
|
-
let(:server) { Puppet::Network::HTTP::WEBrick.new }
|
196
|
-
let(:localcacert) { make_absolute("/ca/crt") }
|
197
|
-
let(:ssl_server_ca_auth) { make_absolute("/ca/ssl_server_auth_file") }
|
198
|
-
let(:key) { stub 'key', :content => "mykey" }
|
199
|
-
let(:cert) { stub 'cert', :content => "mycert" }
|
200
|
-
let(:host) { stub 'host', :key => key, :certificate => cert, :name => "yay", :ssl_store => "mystore" }
|
201
|
-
|
202
|
-
before :each do
|
203
|
-
Puppet::SSL::Certificate.indirection.stubs(:find).with('ca').returns cert
|
204
|
-
Puppet::SSL::Host.stubs(:localhost).returns host
|
205
|
-
end
|
206
|
-
|
207
208
|
it "should use the key from the localhost SSL::Host instance" do
|
208
209
|
Puppet::SSL::Host.expects(:localhost).returns host
|
209
210
|
host.expects(:key).returns key
|
@@ -236,8 +237,8 @@ describe Puppet::Network::HTTP::WEBrick do
|
|
236
237
|
expect(server.setup_ssl[:SSLCACertificateFile]).to eq(ssl_server_ca_auth)
|
237
238
|
end
|
238
239
|
|
239
|
-
it "should start ssl immediately" do
|
240
|
-
expect(server.setup_ssl[:SSLStartImmediately]).to
|
240
|
+
it "should not start ssl immediately" do
|
241
|
+
expect(server.setup_ssl[:SSLStartImmediately]).to eq(false)
|
241
242
|
end
|
242
243
|
|
243
244
|
it "should enable ssl" do
|
@@ -44,4 +44,30 @@ describe "the sprintf function" do
|
|
44
44
|
expect(result).to(eql("<overlong: 027 0XBEEF (foo )>"))
|
45
45
|
end
|
46
46
|
|
47
|
+
it 'does not attempt to mutate its arguments' do
|
48
|
+
args = ['%d', 1].freeze
|
49
|
+
expect { @scope.function_sprintf(args) }.to_not raise_error
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'support named arguments in a hash with string keys' do
|
53
|
+
result = @scope.function_sprintf(["%<foo>d : %<bar>f", {'foo' => 1, 'bar' => 2}])
|
54
|
+
expect(result).to eq("1 : 2.000000")
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'raises a key error if a key is not present' do
|
58
|
+
expect do
|
59
|
+
@scope.function_sprintf(["%<foo>d : %<zanzibar>f", {'foo' => 1, 'bar' => 2}])
|
60
|
+
end.to raise_error(KeyError, /key<zanzibar> not found/)
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'a hash with string keys that is output formats as strings' do
|
64
|
+
result = @scope.function_sprintf(["%s", {'foo' => 1, 'bar' => 2}])
|
65
|
+
expect(result).to eq("{\"foo\"=>1, \"bar\"=>2}")
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'named arguments hash with non string keys are tolerated' do
|
69
|
+
result = @scope.function_sprintf(["%<foo>d : %<bar>f", {'foo' => 1, 'bar' => 2, 1 => 2, [1] => 2, false => true, {} => {}}])
|
70
|
+
expect(result).to eq("1 : 2.000000")
|
71
|
+
end
|
72
|
+
|
47
73
|
end
|
@@ -116,6 +116,10 @@ describe 'The type calculator' do
|
|
116
116
|
PUnitType::DEFAULT
|
117
117
|
end
|
118
118
|
|
119
|
+
def iterable_t(t = nil)
|
120
|
+
TypeFactory.iterable(t)
|
121
|
+
end
|
122
|
+
|
119
123
|
def types
|
120
124
|
Types
|
121
125
|
end
|
@@ -1573,6 +1577,13 @@ describe 'The type calculator' do
|
|
1573
1577
|
t2 = parser.parse('Type[PositiveIntegerType]', scope)
|
1574
1578
|
expect(calculator.assignable?(t2, t1)).to be_truthy
|
1575
1579
|
end
|
1580
|
+
|
1581
|
+
it 'An alias for a Type that describes an Iterable instance is assignable to Iterable' do
|
1582
|
+
t = type_alias_t('MyType', 'Enum[a,b]').resolve(parser, nil)
|
1583
|
+
|
1584
|
+
# True because String is iterable and an instance of Enum is a String
|
1585
|
+
expect(calculator.assignable?(iterable_t, t)).to be_truthy
|
1586
|
+
end
|
1576
1587
|
end
|
1577
1588
|
end
|
1578
1589
|
|
@@ -1863,6 +1874,11 @@ describe 'The type calculator' do
|
|
1863
1874
|
expect(calculator.instance?(t, 15)).to be_truthy
|
1864
1875
|
end
|
1865
1876
|
|
1877
|
+
it 'should consider t an instance of Iterable when aliased type is Iterable' do
|
1878
|
+
t = type_alias_t('Alias', 'Enum[a, b]').resolve(parser, nil)
|
1879
|
+
expect(calculator.instance?(iterable_t, t)).to be_truthy
|
1880
|
+
end
|
1881
|
+
|
1866
1882
|
it 'should consider x an instance of the aliased type that uses self recursion' do
|
1867
1883
|
t = type_alias_t('Tree', 'Hash[String,Variant[String,Tree]]')
|
1868
1884
|
loader = Object.new
|
@@ -2064,6 +2080,11 @@ describe 'The type calculator' do
|
|
2064
2080
|
expect(calculator.iterable(calculator.type(t))).to eq(nil)
|
2065
2081
|
end
|
2066
2082
|
end
|
2083
|
+
|
2084
|
+
it 'should produce an iterable for a type alias of an Iterable type' do
|
2085
|
+
t = PTypeAliasType.new('MyAlias', nil, PIntegerType.new(1, 10))
|
2086
|
+
expect(calculator.iterable(t).respond_to?(:each)).to eq(true)
|
2087
|
+
end
|
2067
2088
|
end
|
2068
2089
|
|
2069
2090
|
context 'when dealing with different types of inference' do
|
@@ -168,6 +168,15 @@ describe 'the type mismatch describer' do
|
|
168
168
|
/parameter 'arg' expects a match for Enum\['a', 'b'\], got Sensitive/))
|
169
169
|
end
|
170
170
|
|
171
|
+
it "will report the parameter of Type[<type alias>] using the alias name" do
|
172
|
+
code = <<-CODE
|
173
|
+
type Custom = String[1]
|
174
|
+
Custom.each |$x| { notice($x) }
|
175
|
+
CODE
|
176
|
+
expect { eval_and_collect_notices(code) }.to(raise_error(Puppet::Error,
|
177
|
+
/expects an Iterable value, got Type\[Custom\]/))
|
178
|
+
end
|
179
|
+
|
171
180
|
context 'when reporting a mismatch between' do
|
172
181
|
let(:parser) { TypeParser.singleton }
|
173
182
|
let(:subject) { TypeMismatchDescriber.singleton }
|
@@ -18,8 +18,6 @@ describe provider_class, :if => Puppet.features.posix? do
|
|
18
18
|
|
19
19
|
FileTest.stubs(:file?).with('/usr/sbin/svcadm').returns true
|
20
20
|
FileTest.stubs(:executable?).with('/usr/sbin/svcadm').returns true
|
21
|
-
FileTest.stubs(:file?).with('/usr/sbin/svccfg').returns true
|
22
|
-
FileTest.stubs(:executable?).with('/usr/sbin/svccfg').returns true
|
23
21
|
FileTest.stubs(:file?).with('/usr/bin/svcs').returns true
|
24
22
|
FileTest.stubs(:executable?).with('/usr/bin/svcs').returns true
|
25
23
|
Facter.stubs(:value).with(:operatingsystem).returns('Solaris')
|
@@ -76,9 +74,9 @@ describe provider_class, :if => Puppet.features.posix? do
|
|
76
74
|
@provider.expects(:svcs).with('-H', '-o', 'state,nstate', "/system/myservice").returns("online\t-")
|
77
75
|
@provider.status
|
78
76
|
end
|
79
|
-
it "should return
|
77
|
+
it "should return stopped if svcs can't find the service" do
|
80
78
|
@provider.stubs(:svcs).raises(Puppet::ExecutionFailure.new("no svc found"))
|
81
|
-
expect(@provider.status).to eq(:
|
79
|
+
expect(@provider.status).to eq(:stopped)
|
82
80
|
end
|
83
81
|
it "should return running if online in svcs output" do
|
84
82
|
@provider.stubs(:svcs).returns("online\t-")
|