beaker 2.40.0 → 2.41.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDdmMjNiYzBlNDAyM2VlMjVmNDExMDQ0YzFjZDZjMmI3NzM0ODg2OA==
4
+ ZjUwYTZlZjRmMzlkZmVmMDg3ZjFjMTlkMDNiOGE5MjRhMDcwYmU2MQ==
5
5
  data.tar.gz: !binary |-
6
- NTYzMGQ3ZDFjNzY0Y2ZmNjJlNGJlYzU2MWQ2NjU4OTY0YzYxZjFjYw==
6
+ MjEzZWRjNTA4NzRiM2UwYmY0NjEyNjY1MWFmNTRlYWIzYmNlYWRlNw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- Y2FiNDJlZjFhYTZmODEyNTUyZWZlYWQ5Mzg3ZDhlZmFiYzBmOTRkNGIwYWZj
10
- ZDQ0NGQxNGJhZjMwZjI5MTFkNGEyMTIzMjIwNjg4YzE1ZWFiMTJiMzI3ZGM1
11
- ZTg4YmI5MjI4Zjg0ZDU4NWIwZDZjNjdhYzdhY2E5ZTUyZDY3NDA=
9
+ Y2QxZjA0NmNiMzQxMzIyMzkzMWIwMjk1OTFjN2NiYzU2Y2MzMjIyNTQ0M2U5
10
+ MDlmN2NkZDBkOTA1ZDlmN2VmZWMwMTUzOTY1ZmExN2QxZjE4OTJkM2I0YTM2
11
+ NzI4ZmZmYTdhNjQ3NzE3NmQ1M2IxYzk3NGFiZDljNTU1NjQ2NWM=
12
12
  data.tar.gz: !binary |-
13
- NDU0YWQyMWY0MjZmMjkyNDc0MjE2MzJlZjMxMTYwM2RmOGY3ZDliZDkwYjMw
14
- NDYyODc5NGIwMTA3M2FmMjYyZjM3YzkwM2ZjMjM3MWU0NWFiOWMwOTJiZTEx
15
- MTU3NWE3M2RjY2Q5ZDYwMzEwMzE5YmFjYWZjNTcxOTMyY2MxZTc=
13
+ MjlmNzJkZTc2Zjc3MGZjMjNhYWQ4YmQ4MjM1YmE0NzA0MzIzYjYxMTU0Y2Y1
14
+ NTQ3NTk5MzZhNjJjZGVkMDAxZjY5NTJhNGFiNzg3ODhlMzRlMDAwZGY3NzJk
15
+ ODQ3ZjY1MTE1ZTI5ZWFkNDI4ODJkOGI4NTllNGExMzliMWU5NDI=
data/HISTORY.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # default - History
2
2
  ## Tags
3
- * [LATEST - 18 Apr, 2016 (29b0694d)](#LATEST)
3
+ * [LATEST - 10 May, 2016 (859e8702)](#LATEST)
4
+ * [2.40.0 - 18 Apr, 2016 (0a7b948a)](#2.40.0)
4
5
  * [2.39.0 - 6 Apr, 2016 (5976e103)](#2.39.0)
5
6
  * [2.38.1 - 31 Mar, 2016 (124b91b8)](#2.38.1)
6
7
  * [2.38.0 - 30 Mar, 2016 (0878bff7)](#2.38.0)
@@ -116,7 +117,229 @@
116
117
  * [pe1.2 - 6 Sep, 2011 (ba3dadd2)](#pe1.2)
117
118
 
118
119
  ## Details
119
- ### <a name = "LATEST">LATEST - 18 Apr, 2016 (29b0694d)
120
+ ### <a name = "LATEST">LATEST - 10 May, 2016 (859e8702)
121
+
122
+ * (GEM) update beaker version to 2.41.0 (859e8702)
123
+
124
+ * Merge pull request #1118 from tvpartytonight/BKR-684 (44e11078)
125
+
126
+
127
+ ```
128
+ Merge pull request #1118 from tvpartytonight/BKR-684
129
+
130
+ (BKR-684) Update Beaker-Libraries doc
131
+ ```
132
+ * (BKR-684) Update Beaker-Libraries doc (69689f76)
133
+
134
+
135
+ ```
136
+ (BKR-684) Update Beaker-Libraries doc
137
+
138
+ This PR syncs the internal confluence docs with public Github
139
+ documentation.
140
+ ```
141
+ * Merge pull request #1105 from er0ck/fix/master/BKR-779-skip_test_broken_in_with_puppet_running_on (54dd8192)
142
+
143
+
144
+ ```
145
+ Merge pull request #1105 from er0ck/fix/master/BKR-779-skip_test_broken_in_with_puppet_running_on
146
+
147
+ (BKR-779) skip_test broken in with_puppet_running_on
148
+ ```
149
+ * Merge pull request #1116 from petems/BKR-799-update_fedora_support (1c5a46b7)
150
+
151
+
152
+ ```
153
+ Merge pull request #1116 from petems/BKR-799-update_fedora_support
154
+
155
+ (BKR-799) Update Fedora support
156
+ ```
157
+ * (BKR-799) Updates specs with more Fedora versions (0553e807)
158
+
159
+ * (BKR-799) Use systemd for commands from Fedora 14+ (859e8ee1)
160
+
161
+ * (BKR-799) Use dnf on Fedora from 22 onwards (020522a0)
162
+
163
+ * Merge pull request #1112 from apollo-io/solaris11-provision (5e04dbd8)
164
+
165
+
166
+ ```
167
+ Merge pull request #1112 from apollo-io/solaris11-provision
168
+
169
+ (BKR-789) enable --no-provision for Solaris 11 guests
170
+ ```
171
+ * Merge pull request #1114 from briancain/maint/improve-vmpooler-error-msg (0562c213)
172
+
173
+
174
+ ```
175
+ Merge pull request #1114 from briancain/maint/improve-vmpooler-error-msg
176
+
177
+ (maint) Improve the error message returned when failing to request vms
178
+ ```
179
+ * (maint) Include parsed response in error msg (e0f69a5c)
180
+
181
+ * Merge pull request #1109 from kevpl/docs_maintainers_create3 (384384f5)
182
+
183
+
184
+ ```
185
+ Merge pull request #1109 from kevpl/docs_maintainers_create3
186
+
187
+ (MAINT) added maintainers section to README
188
+ ```
189
+ * (maint) Improve the error message returned when failing to request vms (c7dc65be)
190
+
191
+
192
+ ```
193
+ (maint) Improve the error message returned when failing to request vms
194
+
195
+ This commit gives a better error message to the user when beaker fails
196
+ to request a host set that doesn't exist in vmpooler.
197
+ ```
198
+ * Merge pull request #1110 from er0ck/improve/master/BKR-776-TestCase_methods_for_exporting_structured_data_to_junit_xml (72bff6a5)
199
+
200
+
201
+ ```
202
+ Merge pull request #1110 from er0ck/improve/master/BKR-776-TestCase_methods_for_exporting_structured_data_to_junit_xml
203
+
204
+ (BKR-776) test case methods for exporting structured data to junit xml
205
+ ```
206
+ * (BKR-789) enable --no-provision for Solaris 11 guests (0c40f30d)
207
+
208
+
209
+ ```
210
+ (BKR-789) enable --no-provision for Solaris 11 guests
211
+
212
+ Without this change, it is not possible to run beaker against solaris
213
+ hosts with --no-provision, which means for every test run the VMs must
214
+ be re-provisioned, which has a big impact on the length of time to be
215
+ able to run tests during development lifecycle.
216
+
217
+ For Solaris the 'rolemod' command is used, but this can only be run
218
+ successfully once, the second time it runs it fails because the root
219
+ user has already been changes from a role to a user. This change adds a
220
+ check to ensure rolemod is only run if it is needed.
221
+ ```
222
+ * Merge pull request #1111 from kevpl/bkr787_vmpooler_dont_reask (4f65721d)
223
+
224
+
225
+ ```
226
+ Merge pull request #1111 from kevpl/bkr787_vmpooler_dont_reask
227
+
228
+ (BKR-787) vmpooler only asks for failed hosts on provision request repeat
229
+ ```
230
+ * (BKR-787) vmpooler only asks for failed hosts on provision request repeat (a1d8e0d5)
231
+
232
+ * Merge pull request #1106 from kevpl/docs_test_suites2 (76349e4d)
233
+
234
+
235
+ ```
236
+ Merge pull request #1106 from kevpl/docs_test_suites2
237
+
238
+ (MAINT) created test_suites.md
239
+ ```
240
+ * Merge pull request #1107 from kevpl/docs_ticket_lifecycle_update (cf27df65)
241
+
242
+
243
+ ```
244
+ Merge pull request #1107 from kevpl/docs_ticket_lifecycle_update
245
+
246
+ (MAINT) fixed BKR.next label in JIRA ticket docs
247
+ ```
248
+ * (BKR-776) functionality for exporting structured data (to junit xml) (8f3b5327)
249
+
250
+
251
+ ```
252
+ (BKR-776) functionality for exporting structured data (to junit xml)
253
+
254
+ This change adds a dsl method `export` which takes a single argument of
255
+ hash data for export to junit.xml.
256
+ This can be used for later storage without storing all of the logfile.
257
+ Think performance benchmarks, flakiness data, etc.
258
+ ```
259
+ * (maint) fix up nearby spec tests (c13c2e14)
260
+
261
+ * (MAINT) added maintainers section to README (620854f1)
262
+
263
+
264
+ ```
265
+ (MAINT) added maintainers section to README
266
+
267
+ [skip ci]
268
+ ```
269
+ * (MAINT) created test_suites.md (961dbf47)
270
+
271
+
272
+ ```
273
+ (MAINT) created test_suites.md
274
+
275
+ [skip ci]
276
+ ```
277
+ * (maint) update defaults for common user id_rsa-acceptance keys (20fd411b)
278
+
279
+ * (BKR-779) add acceptance tests for skip_test and pending_test (9cfd8d3c)
280
+
281
+
282
+ ```
283
+ (BKR-779) add acceptance tests for skip_test and pending_test
284
+
285
+ These tests required changes to the pre-suite for puppetpkg.
286
+ We might also require changes to puppetgit and puppetgem and maybe pe.
287
+ we need to tell with_puppet_running_on where to find the correct puppet
288
+ service, otherwise beaker defaults to pe-puppetserver.
289
+ ```
290
+ * (BKR-779) skip_test, pending_test, fail_test don't work in with_puppet_running_on (2fc36eb3)
291
+
292
+
293
+ ```
294
+ (BKR-779) skip_test, pending_test, fail_test don't work in with_puppet_running_on
295
+
296
+ Prior to this change, these test exits did not work in
297
+ with_puppet_running_on() as the exceptions were not bubbling up to
298
+ TestCase.
299
+ This change rescues the exceptions for these flow-controls before they
300
+ get mangled by the other rescues and sent to TestCase. We should
301
+ probably be using throw here. But there are too many entanglements to
302
+ get them working in this PR.
303
+ ```
304
+ * (maint) cleanup some nearby spec tests (7d16c6d0)
305
+
306
+ * Merge pull request #1104 from cmurphy/rpm_upgrade (57ec5a6b)
307
+
308
+
309
+ ```
310
+ Merge pull request #1104 from cmurphy/rpm_upgrade
311
+
312
+ (MAINT) Use the upgrade install option for rpm packages
313
+ ```
314
+ * (MAINT) Use the upgrade install option for rpms (2db3708e)
315
+
316
+
317
+ ```
318
+ (MAINT) Use the upgrade install option for rpms
319
+
320
+ Images used in beaker tests might have all kinds of preinstalled
321
+ packages on them, some of which may be out of date. In our case, we
322
+ were preinstalling the puppetlabs el 7.10 release package on images,
323
+ but then running beaker's install_puppet function as a provisional step
324
+ in our tests. Since a new release package was added, this started
325
+ failing[1]. We were able to fix this easily by fixing our images, but
326
+ users depending on externally hosted images, such as vagrant boxes, may
327
+ not be so lucky.
328
+
329
+ This patch changes the -i flag of the rpm install command to -U so that
330
+ the package will be either installed or, if already present but out of
331
+ date, upgraded. This will not change functionality for users with clean
332
+ images who do not need to upgrade anything. The --replacepkgs flag that
333
+ was already present in the rpm command is not sufficient to remove
334
+ conflicting files from older versions of packages.
335
+
336
+ [1] http://logs.openstack.org/77/308277/2/check/gate-openstackci-beaker-centos-7/0736982/console.html#_2016-04-20_14_14_12_690
337
+ ```
338
+ * (MAINT) fixed BKR.next label in JIRA ticket docs (c49ae8a4)
339
+
340
+ ### <a name = "2.40.0">2.40.0 - 18 Apr, 2016 (0a7b948a)
341
+
342
+ * (HISTORY) update beaker history for gem release 2.40.0 (0a7b948a)
120
343
 
121
344
  * (GEM) update beaker version to 2.40.0 (29b0694d)
122
345
 
data/README.md CHANGED
@@ -23,6 +23,19 @@ Beaker functionality has been extended through the use of libraries available as
23
23
 
24
24
  See [LICENSE](LICENSE) file.
25
25
 
26
- #Support
26
+ #Support & Issues
27
27
 
28
28
  Please log tickets and issues at our [Beaker Issue Tracker](https://tickets.puppetlabs.com/issues/?jql=project%20%3D%20BKR). In addition there is an active #puppet-dev channel on Freenode.
29
+
30
+ For additional information on filing tickets, please check out our [CONTRIBUTOR doc](CONTRIBUTING.md),
31
+ and for ticket lifecycle information, checkout our [ticket process doc](docs/meta/ticket_process.md).
32
+
33
+ #Maintainers
34
+
35
+ Beaker is maintained by Puppet's Quality Engineering (QE) Team. In particular, our current Beaker maintainers are:
36
+
37
+ | Name | Email |
38
+ |:--------------:|:--------------------:|
39
+ | Kevin Imber | <ki@puppet.com> |
40
+ | Tony Vu | <tony.vu@puppet.com> |
41
+ | Sarah Thompson | <sarah@puppet.com> |
@@ -1,3 +1,6 @@
1
1
  {
2
- :load_path => File.join('acceptance', 'lib')
2
+ :load_path => File.join('acceptance', 'lib'),
3
+ :ssh => {
4
+ :keys => ["id_rsa_acceptance", "#{ENV['HOME']}/.ssh/id_rsa-acceptance"],
5
+ },
3
6
  }
@@ -1,4 +1,9 @@
1
1
  {
2
+ :type => 'foss',
3
+ :add_el_extras => 'true',
4
+ :is_puppetserver => false,
5
+ :puppetservice => 'puppet.service',
2
6
  :pre_suite => 'acceptance/pre_suite/puppet_gem/install.rb',
3
- :tests => 'acceptance/tests/puppet'
4
- }.merge(eval File.read('acceptance/config/acceptance-options.rb'))
7
+ :tests => 'acceptance/tests/puppet',
8
+ :'master-start-curl-retries' => 30,
9
+ }.merge(eval File.read('acceptance/config/acceptance-options.rb'))
@@ -1,4 +1,9 @@
1
1
  {
2
+ :type => 'foss',
3
+ :add_el_extras => 'true',
4
+ :is_puppetserver => false,
5
+ :puppetservice => 'puppet.service',
2
6
  :pre_suite => 'acceptance/pre_suite/puppet_git/install.rb',
3
- :tests => 'acceptance/tests/puppet'
4
- }.merge(eval File.read('acceptance/config/acceptance-options.rb'))
7
+ :tests => 'acceptance/tests/puppet',
8
+ :'master-start-curl-retries' => 30,
9
+ }.merge(eval File.read('acceptance/config/acceptance-options.rb'))
@@ -1,4 +1,8 @@
1
1
  {
2
+ :type => 'foss',
3
+ :is_puppetserver => false,
4
+ :puppetservice => 'puppet.service',
2
5
  :pre_suite => 'acceptance/pre_suite/puppet_pkg/install.rb',
3
- :tests => 'acceptance/tests/puppet'
4
- }.merge(eval File.read('acceptance/config/acceptance-options.rb'))
6
+ :tests => 'acceptance/tests/puppet',
7
+ :'master-start-curl-retries' => 30,
8
+ }.merge(eval File.read('acceptance/config/acceptance-options.rb'))
@@ -1,3 +1,8 @@
1
1
  hosts.each do |host|
2
2
  install_puppet_from_gem(host, {:version => '3.7.5'})
3
+ unless host['platform'] =~ /windows/
4
+ on(host, "touch #{File.join(host.puppet['confdir'],'puppet.conf')}")
5
+ on(host, puppet('resource user puppet ensure=present'))
6
+ on(host, puppet('resource group puppet ensure=present'))
7
+ end
3
8
  end
@@ -90,4 +90,9 @@ hosts.each do |host|
90
90
  repos.each do |repo|
91
91
  install_from_git(host, SourcePath, repo)
92
92
  end
93
+ unless host['platform'] =~ /windows/
94
+ on(host, "touch #{File.join(host.puppet['confdir'],'puppet.conf')}")
95
+ on(host, puppet('resource user puppet ensure=present'))
96
+ on(host, puppet('resource group puppet ensure=present'))
97
+ end
93
98
  end
@@ -0,0 +1,13 @@
1
+ test_name 'ensure tests can export arbitrary data' do
2
+
3
+ step 'export nested hash' do
4
+ export({'middle earth' => {
5
+ 'Hobbits' => ['Bilbo', 'Frodo'],
6
+ 'Elves' => 'Arwen',
7
+ :total => {'numbers' => 42}
8
+ }
9
+ })
10
+ export({'another' => 'author'})
11
+ end
12
+
13
+ end
@@ -0,0 +1,30 @@
1
+ test_name 'with_puppet_running_on' do
2
+
3
+ with_puppet_running_on(master, {}) do
4
+ puppet_service = master['puppetservice']
5
+ on(master, puppet("resource service #{puppet_service}")).stdout do |result|
6
+ assert_match(/running/,result,'did not find puppet service/master running')
7
+ end
8
+ end
9
+
10
+ end
11
+
12
+ test_name 'skip_test in with_puppet_running_on' do
13
+
14
+ with_puppet_running_on(master, {}) do
15
+ skip_test 'skip rest'
16
+ assert(false)
17
+ end
18
+
19
+ end
20
+
21
+ test_name 'pending_test in with_puppet_running_on' do
22
+
23
+ with_puppet_running_on(master, {}) do
24
+ pending_test 'pending appendix prepended'
25
+ assert(false)
26
+ end
27
+
28
+ end
29
+
30
+ # TODO: no idea how to test fail_test in here
@@ -1,5 +1,5 @@
1
1
  # Beaker Libraries
2
- The QA team at Puppet Labs has written several libraries that extends the functionality provided
2
+ Engineering at Puppet Labs has written several libraries that extends the functionality provided
3
3
  by Beaker.
4
4
 
5
5
  | Name | Description | Docs |
@@ -8,3 +8,9 @@ by Beaker.
8
8
  | beaker_windows | Useful helpers for testing on Windows hosts | [Github Repo](https://github.com/puppetlabs/beaker_windows) |
9
9
  | Puppet Install Helper | Use environment variables for choosing which puppet version to install | [Github Repo](https://github.com/puppetlabs/beaker-puppet_install_helper) |
10
10
  | testmode_switcher | [prototype] run your puppet module tests in master/agent, apply or local mode | [Github Repo](https://github.com/puppetlabs/beaker-testmode_switcher) |
11
+ | beaker-hostgenerator | Generates Beaker host files | [Github Repo](https://github.com/puppetlabs/beaker-hostgenerator/) |
12
+ | beaker-answers | Generates answers for Puppet Enterprise installation | [Github Repo](https://github.com/puppetlabs/beaker-answers/) |
13
+ | beaker-pe | Adds helper methods for Puppet Enterprise specific tasks | [Github Repo](https://github.com/puppetlabs/beaker-pe/) |
14
+ | Beaker Rubymine Plugin | An IntelliJ IDEA plugin making Beaker test runs a native IDE experience | [Github Repo](https://github.com/samwoods1/BeakerRubyMinePlugin) |
15
+ | beaker-rspec | A bridge between beaker itself and [rspec](https://github.com/rspec/rspec); also integrates [serverspec](http://serverspec.org/) | [Github Repo](https://github.com/puppetlabs/beaker-rspec/) |
16
+
@@ -77,7 +77,7 @@ Once your PR is merged, then you can Resolve your ticket.
77
77
 
78
78
  **NOTE** that when you do this, you should set the FixedVersion to
79
79
 
80
- BKR next
80
+ BKR.next
81
81
 
82
82
  The reason that we do this now and not before is that we use this field to
83
83
  autogenerate our release notes. We want to make sure that we capture only
@@ -0,0 +1,83 @@
1
+ # Test Suites & Failure Modes
2
+
3
+ Beaker test suites correspond to test suites in most testing frameworks,
4
+ being containers for tests or pre- or post-testing files to execute.
5
+
6
+ There are two main ways that you specify which test suites a particular
7
+ file belongs in. The first way is to use the Beaker command line interface
8
+ (CLI) arguments. These are specified in runtime order below:
9
+
10
+ --pre-suite
11
+ —-tests
12
+ —-post-suite
13
+ —-pre-cleanup
14
+
15
+ If you’d like to find out more information about these arguments, or how
16
+ exactly you pass the specified files to each suite, execute `beaker —-help`
17
+ at the CLI.
18
+
19
+ The second way is to provide suite arguments through config files. There
20
+ are two places that you can provide this info:
21
+
22
+ 1. The `CONFIG` section of a hosts file.
23
+ 2. A local options file passed through the `--options-file` CLI argument.
24
+
25
+ Either way, the keys for the arguments needed are listed below, respective
26
+ to the arguments listed above:
27
+
28
+ :pre_suite
29
+ :tests
30
+ :post_suite
31
+ :pre_cleanup
32
+
33
+ *Note* that one difference between the two methods is that if you provide the
34
+ options via the CLI, we support various input methods such as specifying
35
+ individual files vs paths to folders. The second option (providing keys to
36
+ config files) only works if each file is fully specified. Beaker will not
37
+ find all files in a directory in the second case, that expansion is only done
38
+ on the CLI inputs.
39
+
40
+ # Suite Details, & Failure Mode Behavior
41
+
42
+ This section is to explain the particulars of any suite, and any warnings or
43
+ notes about using them, including how they behave in Beaker’s different
44
+ failure modes.
45
+
46
+ ## Pre-Suite
47
+
48
+ The pre-suite is for setting up the Systems Under Test (SUTs) for the testing
49
+ suite. No surprises here, usually these files are filled with the setup and
50
+ installation code needed to verify that the operating assumptions of the
51
+ software being tested are true.
52
+
53
+ Pre-suites, since they’re supposed to contain just setup code, will fail-fast
54
+ and the entire Beaker run will be abandoned if setup fails, since testing
55
+ assumes that setup has succeeded.
56
+
57
+ ## Tests
58
+
59
+ Time to actually test! This suite contains the test files that you would
60
+ like to verify new code with.
61
+
62
+ The test suite behaves according to the global fail-mode setting.
63
+
64
+ ## Post-Suite
65
+
66
+ Usually the post-suite is used to clean up any fixtures that your tests might
67
+ have poisoned, collect any log files that you’d like to later review, and
68
+ to get any resources from the SUTs before they are cleaned up / deleted.
69
+
70
+ The post-suite only runs if the fail-mode is set to slow, which it is by
71
+ default. Fast fail-mode will skip this suite, so that you can get feedback
72
+ quicker, and you can potentially check out the system in the state exactly
73
+ that it failed in.
74
+
75
+ ## Pre-cleanup
76
+
77
+ The pre-cleanup suite is for tasks that you’d like to run at the end of your
78
+ tests, regardless of Beaker’s fail-mode. You can think of this behaving as a
79
+ `finally` block at the end of a `try-rescue` one.
80
+
81
+ The pre-cleanup suite falls back to the global fail-mode setting, which
82
+ defaults to slow, meaning it will run all tests regardless of any early
83
+ failures.
@@ -16,7 +16,7 @@ module Beaker
16
16
  # (or range) of integer exit codes that should be considered
17
17
  # acceptable. An error will be thrown if the exit code does not
18
18
  # match one of the values in this list.
19
- # @option opts [Boolean] :accept_all_exit_codes (false) Consider all
19
+ # @option opts [Boolean] :accept_all_exit_codes (false) Consider all
20
20
  # exit codes as passing.
21
21
  # @option opts [Boolean] :dry_run (false) Do not actually execute any
22
22
  # commands on the SUT
@@ -170,6 +170,16 @@ module Beaker
170
170
 
171
171
  yield self if block_given?
172
172
 
173
+ # FIXME: these test-flow-control exceptions should be using throw
174
+ # they can be caught in test_case. current layout dows not allow it
175
+ rescue Beaker::DSL::Outcomes::PassTest => early_assertion
176
+ pass_test(early_assertion)
177
+ rescue Beaker::DSL::Outcomes::FailTest => early_assertion
178
+ fail_test(early_assertion)
179
+ rescue Beaker::DSL::Outcomes::PendingTest => early_assertion
180
+ pending_test(early_assertion)
181
+ rescue Beaker::DSL::Outcomes::SkipTest => early_assertion
182
+ skip_test(early_assertion)
173
183
  rescue Beaker::DSL::Assertions, Minitest::Assertion => early_assertion
174
184
  fail_test(early_assertion)
175
185
  rescue Exception => early_exception
@@ -77,6 +77,13 @@ module Beaker
77
77
  raise( SkipTest, message )
78
78
  end
79
79
 
80
+ # populate a TestCase's @exports[] with structured_data
81
+ #
82
+ # @param [Hash,Array<Hash>] data The data to export
83
+ def export(data)
84
+ @exports << data
85
+ end
86
+
80
87
  # Formats an optional message or self appended by a state, either
81
88
  # bracketted in newlines
82
89
  #
@@ -166,7 +166,7 @@ module Unix::Exec
166
166
  case self['platform']
167
167
  when /debian|ubuntu|cumulus|huaweios/
168
168
  exec(Beaker::Command.new("service ssh restart"))
169
- when /el-7|centos-7|redhat-7|oracle-7|scientific-7|eos-7/
169
+ when /el-7|centos-7|redhat-7|oracle-7|scientific-7|eos-7|fedora-(1[4-9]|2[0-9])/
170
170
  exec(Beaker::Command.new("systemctl restart sshd.service"))
171
171
  when /el-|centos|fedora|redhat|oracle|scientific|eos/
172
172
  exec(Beaker::Command.new("/sbin/service sshd restart"))
@@ -68,7 +68,7 @@ module Unix::Pkg
68
68
  execute("zypper --non-interactive in #{name}", opts)
69
69
  when /el-4/
70
70
  @logger.debug("Package installation not supported on rhel4")
71
- when /fedora-22/
71
+ when /fedora-(2[2-9])/
72
72
  if version
73
73
  name = "#{name}-#{version}"
74
74
  end
@@ -139,7 +139,7 @@ module Unix::Pkg
139
139
  if name =~ /^http/ and opts[:package_proxy]
140
140
  proxy = extract_rpm_proxy_options(opts[:package_proxy])
141
141
  end
142
- execute("rpm #{cmdline_args} -ivh #{name} #{proxy}")
142
+ execute("rpm #{cmdline_args} -Uvh #{name} #{proxy}")
143
143
  end
144
144
 
145
145
  def uninstall_package(name, cmdline_args = '', opts = {})
@@ -176,7 +176,7 @@ module Unix::Pkg
176
176
  execute("zypper --non-interactive --no-gpg-checks up #{name}", opts)
177
177
  when /el-4/
178
178
  @logger.debug("Package upgrade is not supported on rhel4")
179
- when /fedora-22/
179
+ when /fedora-(2[2-9])/
180
180
  execute("dnf -y #{cmdline_args} update #{name}", opts)
181
181
  when /cisco|fedora|centos|eos|el-/
182
182
  execute("yum -y #{cmdline_args} update #{name}", opts)
@@ -448,7 +448,7 @@ module Unix::Pkg
448
448
  )
449
449
  variant, version, arch, codename = self['platform'].to_array
450
450
  case variant
451
- when /^(fedora-22)$/
451
+ when /^(fedora-(2[2-9]))$/
452
452
  execute("tar -zxvf #{onhost_copied_download} -C #{onhost_copy_base}")
453
453
  execute("dnf --nogpgcheck localinstall -y #{onhost_copied_file}")
454
454
  when /^(fedora|el|centos)$/
@@ -387,7 +387,7 @@ module Beaker
387
387
  logger.notify "Disabling updates.puppetlabs.com by modifying hosts file to resolve updates to 127.0.0.1 on #{host}"
388
388
  set_etc_hosts(host, "127.0.0.1\tupdates.puppetlabs.com\n")
389
389
  end
390
- end
390
+ end
391
391
 
392
392
  # Update sshd_config on debian, ubuntu, centos, el, redhat, cumulus, and fedora boxes to allow for root login
393
393
  #
@@ -410,7 +410,7 @@ module Beaker
410
410
  elsif host['platform'] =~ /solaris-10/
411
411
  host.exec(Command.new("sudo gsed -i -e 's/#PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config"), {:pty => true} )
412
412
  elsif host['platform'] =~ /solaris-11/
413
- host.exec(Command.new("sudo rolemod -K type=normal root"), {:pty => true} )
413
+ host.exec(Command.new("if grep \"root::::type=role\" /etc/user_attr; then sudo rolemod -K type=normal root; else echo \"root user already type=normal\"; fi"), {:pty => true} )
414
414
  host.exec(Command.new("sudo gsed -i -e 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config"), {:pty => true} )
415
415
  elsif not host.is_powershell?
416
416
  host.exec(Command.new("sudo su -c \"sed -ri 's/^#?PermitRootLogin no|^#?PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config\""), {:pty => true})
@@ -420,7 +420,7 @@ module Beaker
420
420
  #restart sshd
421
421
  if host['platform'] =~ /debian|ubuntu|cumulus/
422
422
  host.exec(Command.new("sudo su -c \"service ssh restart\""), {:pty => true})
423
- elsif host['platform'] =~ /centos-7|el-7|redhat-7/
423
+ elsif host['platform'] =~ /centos-7|el-7|redhat-7|fedora-(1[4-9]|2[0-9])/
424
424
  host.exec(Command.new("sudo -E systemctl restart sshd.service"), {:pty => true})
425
425
  elsif host['platform'] =~ /centos|el-|redhat|fedora|eos/
426
426
  host.exec(Command.new("sudo -E /sbin/service sshd reload"), {:pty => true})
@@ -212,7 +212,7 @@ module Beaker
212
212
  RUN apt-get update
213
213
  RUN apt-get install -y openssh-server openssh-client #{Beaker::HostPrebuiltSteps::CUMULUS_PACKAGES.join(' ')}
214
214
  EOF
215
- when /fedora-22/
215
+ when /fedora-(2[2-9])/
216
216
  dockerfile += <<-EOF
217
217
  RUN dnf clean all
218
218
  RUN dnf install -y sudo openssh-server openssh-clients #{Beaker::HostPrebuiltSteps::UNIX_PACKAGES.join(' ')}
@@ -126,31 +126,41 @@ module Beaker
126
126
  @logger.notify "Requesting VM set from vmpooler"
127
127
  end
128
128
 
129
- request.body = request_payload.to_json
129
+ request_payload_json = request_payload.to_json
130
+ @logger.trace( "Request payload json: #{request_payload_json}" )
131
+ request.body = request_payload_json
130
132
 
131
133
  response = http.request(request)
132
134
  parsed_response = JSON.parse(response.body)
135
+ @logger.trace( "Response parsed json: #{parsed_response}" )
133
136
 
134
137
  if parsed_response['ok']
135
138
  domain = parsed_response['domain']
139
+ request_payload = {}
136
140
 
137
141
  @hosts.each_with_index do |h, i|
138
142
  # If the requested host template is not available on vmpooler
139
- if get_host_info(parsed_response, h['template']).nil?
140
- raise "Vmpooler.provision - requested host #{h['template']} not available"
143
+ host_template = h['template']
144
+ if get_host_info(parsed_response, host_template).nil?
145
+ request_payload[host_template] ||= 0
146
+ request_payload[host_template] += 1
147
+ next
141
148
  end
142
149
  if parsed_response[h['template']]['hostname'].is_a?(Array)
143
- hostname = parsed_response[h['template']]['hostname'].shift
150
+ hostname = parsed_response[host_template]['hostname'].shift
144
151
  else
145
- hostname = parsed_response[h['template']]['hostname']
152
+ hostname = parsed_response[host_template]['hostname']
146
153
  end
147
154
 
148
155
  h['vmhostname'] = domain ? "#{hostname}.#{domain}" : hostname
149
156
 
150
157
  @logger.notify "Using available host '#{h['vmhostname']}' (#{h.name})"
151
158
  end
159
+ unless request_payload.empty?
160
+ raise "Vmpooler.provision - requested VM templates #{request_payload.keys} not available"
161
+ end
152
162
  else
153
- raise "Vmpooler.provision - requested host set not available"
163
+ raise "Vmpooler.provision - response from pooler not ok. Requested host set #{request_payload.keys} not available in pooler.\n#{parsed_response}"
154
164
  end
155
165
  rescue JSON::ParserError, RuntimeError, *SSH_EXCEPTIONS => e
156
166
  @logger.debug "Failed vmpooler provision: #{e.class} : #{e.message}"
@@ -37,6 +37,10 @@ module Beaker
37
37
  # a hash.
38
38
  attr_accessor :metadata
39
39
 
40
+ # Necessary for {Beaker::DSL::Outcomes}.
41
+ # Assumed to be an Array.
42
+ attr_accessor :exports
43
+
40
44
  #The full log for this test
41
45
  attr_accessor :sublog
42
46
 
@@ -102,6 +106,7 @@ module Beaker
102
106
  @runtime = nil
103
107
  @teardown_procs = []
104
108
  @metadata = {}
109
+ @exports = []
105
110
  set_current_test_filename(@path ? File.basename(@path, '.rb') : nil)
106
111
 
107
112
 
@@ -203,6 +203,13 @@ module Beaker
203
203
  item['name'] = File.basename(test.path)
204
204
  item['time'] = "%f" % test.runtime
205
205
 
206
+ #ugh. nokogiri!!! item can't take a hash, let alone an array.
207
+ test.exports.each do |export|
208
+ export.keys.each do |key|
209
+ item[key] = export[key]
210
+ end
211
+ end
212
+
206
213
  # Did we fail? If so, report that.
207
214
  # We need to remove the escape character from colorized text, the
208
215
  # substitution of other entities is handled well by Rexml
@@ -1,5 +1,5 @@
1
1
  module Beaker
2
2
  module Version
3
- STRING = '2.40.0'
3
+ STRING = '2.41.0'
4
4
  end
5
5
  end
@@ -5,6 +5,7 @@ class ClassMixedWithDSLHelpers
5
5
  include Beaker::DSL::Wrappers
6
6
  include Beaker::DSL::Roles
7
7
  include Beaker::DSL::Patterns
8
+ include Beaker::DSL::Outcomes
8
9
 
9
10
  def logger
10
11
  RSpec::Mocks::Double.new('logger').as_null_object
@@ -502,6 +503,33 @@ describe ClassMixedWithDSLHelpers do
502
503
  subject.with_puppet_running_on(host, {})
503
504
  end
504
505
 
506
+ context 'with test flow exceptions' do
507
+ it 'can pass_test' do
508
+ expect( subject ).to receive(:backup_the_file).and_raise(Beaker::DSL::Outcomes::PassTest)
509
+ expect {
510
+ subject.with_puppet_running_on(host, {}).to receive(:pass_test)
511
+ }.to raise_error(Beaker::DSL::Outcomes::PassTest)
512
+ end
513
+ it 'can fail_test' do
514
+ expect( subject ).to receive(:backup_the_file).and_raise(Beaker::DSL::Outcomes::FailTest)
515
+ expect {
516
+ subject.with_puppet_running_on(host, {}).to receive(:fail_test)
517
+ }.to raise_error(Beaker::DSL::Outcomes::FailTest)
518
+ end
519
+ it 'can skip_test' do
520
+ expect( subject ).to receive(:backup_the_file).and_raise(Beaker::DSL::Outcomes::SkipTest)
521
+ expect {
522
+ subject.with_puppet_running_on(host, {}).to receive(:skip_test)
523
+ }.to raise_error(Beaker::DSL::Outcomes::SkipTest)
524
+ end
525
+ it 'can pending_test' do
526
+ expect( subject ).to receive(:backup_the_file).and_raise(Beaker::DSL::Outcomes::PendingTest)
527
+ expect {
528
+ subject.with_puppet_running_on(host, {}).to receive(:pending_test)
529
+ }.to raise_error(Beaker::DSL::Outcomes::PendingTest)
530
+ end
531
+ end
532
+
505
533
  describe 'with puppet-server' do
506
534
  let(:default_confdir) { "/etc/puppet" }
507
535
  let(:default_vardir) { "/var/lib/puppet" }
@@ -842,17 +870,16 @@ describe ClassMixedWithDSLHelpers do
842
870
  end
843
871
  end
844
872
 
873
+ let(:logger) { double.as_null_object }
845
874
  describe 'handling failures' do
846
875
 
847
- let(:logger) { double.as_null_object }
848
876
  before do
849
877
  allow( subject ).to receive( :logger ).and_return( logger )
850
878
  expect( subject ).to receive(:stop_puppet_from_source_on).and_raise(RuntimeError.new('Also failed in teardown.'))
879
+ expect( host ).to receive(:port_open?).with(8140).and_return(true)
851
880
  end
852
881
 
853
882
  it 'does not swallow an exception raised from within test block if ensure block also fails' do
854
- expect( host ).to receive(:port_open?).with(8140).and_return(true)
855
-
856
883
  expect( subject.logger ).to receive(:error).with(/Raised during attempt to teardown.*Also failed in teardown/)
857
884
 
858
885
  expect do
@@ -861,8 +888,6 @@ describe ClassMixedWithDSLHelpers do
861
888
  end
862
889
 
863
890
  it 'dumps the puppet logs if there is an error in the teardown' do
864
- expect( host ).to receive(:port_open?).with(8140).and_return(true)
865
-
866
891
  expect( subject.logger ).to receive(:notify).with(/Dumping master log/)
867
892
 
868
893
  expect do
@@ -871,8 +896,6 @@ describe ClassMixedWithDSLHelpers do
871
896
  end
872
897
 
873
898
  it 'does not mask the teardown error with an error from dumping the logs' do
874
- expect( host ).to receive(:port_open?).with(8140).and_return(true)
875
-
876
899
  expect( subject.logger ).to receive(:notify).with(/Dumping master log/).and_raise("Error from dumping logs")
877
900
 
878
901
  expect do
@@ -881,13 +904,14 @@ describe ClassMixedWithDSLHelpers do
881
904
  end
882
905
 
883
906
  it 'does not swallow a teardown exception if no earlier exception was raised' do
884
- expect( host ).to receive(:port_open?).with(8140).and_return(true)
885
907
  expect( subject.logger).to_not receive(:error)
886
908
  expect do
887
909
  subject.with_puppet_running_on(host, {})
888
910
  end.to raise_error(RuntimeError, 'Also failed in teardown.')
889
911
  end
912
+
890
913
  end
914
+
891
915
  end
892
916
  end
893
917
 
@@ -214,20 +214,24 @@ module Beaker
214
214
  end
215
215
  end
216
216
 
217
- it "uses yum on fedora-20" do
218
- @opts = {'platform' => 'fedora-20-is-me'}
219
- pkg = 'fedora_package'
220
- expect( Beaker::Command ).to receive(:new).with("yum -y install #{pkg}", [], {:prepend_cmds=>nil, :cmdexe=>false}).and_return('')
221
- expect( instance ).to receive(:exec).with('', {}).and_return(generate_result("hello", {:exit_code => 0}))
222
- expect( instance.install_package(pkg) ).to be == "hello"
217
+ (1..21).to_a.each do | fedora_release |
218
+ it "uses yum on fedora-#{fedora_release}" do
219
+ @opts = {'platform' => "fedora-#{fedora_release}-is-me"}
220
+ pkg = 'fedora_package'
221
+ expect( Beaker::Command ).to receive(:new).with("yum -y install #{pkg}", [], {:prepend_cmds=>nil, :cmdexe=>false}).and_return('')
222
+ expect( instance ).to receive(:exec).with('', {}).and_return(generate_result("hello", {:exit_code => 0}))
223
+ expect( instance.install_package(pkg) ).to be == "hello"
224
+ end
223
225
  end
224
226
 
225
- it "uses dnf on fedora-22" do
226
- @opts = {'platform' => 'fedora-22-is-me'}
227
- pkg = 'fedora_package'
228
- expect( Beaker::Command ).to receive(:new).with("dnf -y install #{pkg}", [], {:prepend_cmds=>nil, :cmdexe=>false}).and_return('')
229
- expect( instance ).to receive(:exec).with('', {}).and_return(generate_result("hello", {:exit_code => 0}))
230
- expect( instance.install_package(pkg) ).to be == "hello"
227
+ (22..29).to_a.each do | fedora_release |
228
+ it "uses dnf on fedora-#{fedora_release}" do
229
+ @opts = {'platform' => "fedora-#{fedora_release}-is-me"}
230
+ pkg = 'fedora_package'
231
+ expect( Beaker::Command ).to receive(:new).with("dnf -y install #{pkg}", [], {:prepend_cmds=>nil, :cmdexe=>false}).and_return('')
232
+ expect( instance ).to receive(:exec).with('', {}).and_return(generate_result("hello", {:exit_code => 0}))
233
+ expect( instance.install_package(pkg) ).to be == "hello"
234
+ end
231
235
  end
232
236
  end
233
237
 
@@ -257,7 +261,7 @@ module Beaker
257
261
  it "accepts a package as a single argument" do
258
262
  @opts = {'platform' => 'el-is-me'}
259
263
  pkg = 'redhat_package'
260
- expect( Beaker::Command ).to receive(:new).with("rpm -ivh #{pkg} ", [], {:prepend_cmds=>nil, :cmdexe=>false}).and_return('')
264
+ expect( Beaker::Command ).to receive(:new).with("rpm -Uvh #{pkg} ", [], {:prepend_cmds=>nil, :cmdexe=>false}).and_return('')
261
265
  expect( instance ).to receive(:exec).with('', {}).and_return(generate_result("hello", {:exit_code => 0}))
262
266
  expect( instance.install_package_with_rpm(pkg) ).to be == "hello"
263
267
  end
@@ -266,7 +270,7 @@ module Beaker
266
270
  @opts = {'platform' => 'el-is-me'}
267
271
  pkg = 'redhat_package'
268
272
  cmdline_args = '--foo'
269
- expect( Beaker::Command ).to receive(:new).with("rpm #{cmdline_args} -ivh #{pkg} ", [], {:prepend_cmds=>nil, :cmdexe=>false}).and_return('')
273
+ expect( Beaker::Command ).to receive(:new).with("rpm #{cmdline_args} -Uvh #{pkg} ", [], {:prepend_cmds=>nil, :cmdexe=>false}).and_return('')
270
274
  expect( instance ).to receive(:exec).with('', {}).and_return(generate_result("hello", {:exit_code => 0}))
271
275
  expect( instance.install_package_with_rpm(pkg, cmdline_args) ).to be == "hello"
272
276
  end
@@ -56,6 +56,18 @@ describe Beaker do
56
56
  "sudo sed -i '' 's/#PermitRootLogin no/PermitRootLogin Yes/g' /etc/sshd_config"
57
57
  ]
58
58
 
59
+ # Solaris
60
+ it_should_behave_like 'enables_root_login', 'solaris-10', [
61
+ "sudo -E svcadm restart network/ssh",
62
+ "sudo gsed -i -e 's/#PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config"
63
+ ], true
64
+
65
+ it_should_behave_like 'enables_root_login', 'solaris-11', [
66
+ "sudo -E svcadm restart network/ssh",
67
+ "sudo gsed -i -e 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config",
68
+ "if grep \"root::::type=role\" /etc/user_attr; then sudo rolemod -K type=normal root; else echo \"root user already type=normal\"; fi"
69
+ ], true
70
+
59
71
  ['debian','ubuntu','cumulus'].each do | deb_like |
60
72
  it_should_behave_like 'enables_root_login', deb_like, [
61
73
  "sudo su -c \"sed -ri 's/^#?PermitRootLogin no|^#?PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config\"",
@@ -11,10 +11,10 @@ end
11
11
 
12
12
  module Beaker
13
13
  platforms = [
14
- "ubuntu-14.04-x86_64",
15
- "cumulus-2.2-x86_64",
16
- "fedora-22-x86_64",
17
- "centos-7-x86_64",
14
+ "ubuntu-14.04-x86_64",
15
+ "cumulus-2.2-x86_64",
16
+ "fedora-22-x86_64",
17
+ "centos-7-x86_64",
18
18
  "sles-12-x86_64"
19
19
  ]
20
20
 
@@ -427,14 +427,16 @@ module Beaker
427
427
  expect( dockerfile ).to be =~ /RUN zypper -n in openssh/
428
428
  end
429
429
 
430
- it 'should use dnf on fedora-22' do
431
- FakeFS.deactivate!
432
- dockerfile = docker.send(:dockerfile_for, {
433
- 'platform' => 'fedora-22-x86_64',
434
- 'image' => 'foobar',
435
- })
430
+ (22..29).to_a.each do | fedora_release |
431
+ it "should use dnf on fedora #{fedora_release}" do
432
+ FakeFS.deactivate!
433
+ dockerfile = docker.send(:dockerfile_for, {
434
+ 'platform' => "fedora-#{fedora_release}-x86_64",
435
+ 'image' => 'foobar',
436
+ })
436
437
 
437
- expect( dockerfile ).to be =~ /RUN dnf install -y sudo/
438
+ expect( dockerfile ).to be =~ /RUN dnf install -y sudo/
439
+ end
438
440
  end
439
441
 
440
442
  it 'should use user dockerfile if specified' do
@@ -76,13 +76,35 @@ module Beaker
76
76
 
77
77
  it 'raises an error when a host template is not found in returned json' do
78
78
  vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
79
- host = vmpooler.instance_variable_get(:@hosts)[0][:template]
80
79
 
81
80
  allow( vmpooler ).to receive( :require ).and_return( true )
82
81
  allow( vmpooler ).to receive( :sleep ).and_return( true )
83
- allow( vmpooler ).to receive(:get_host_info).and_return(nil)
82
+ allow( vmpooler ).to receive( :get_host_info ).and_return( nil )
84
83
 
85
- expect {vmpooler.provision}.to raise_error RuntimeError,"Vmpooler.provision - requested host #{host} not available"
84
+ expect {
85
+ vmpooler.provision
86
+ }.to raise_error( RuntimeError,
87
+ /Vmpooler\.provision - requested VM templates \[.*\,.*\,.*\] not available/
88
+ )
89
+ end
90
+
91
+ it 'repeats asking only for failed hosts' do
92
+ vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
93
+
94
+ allow( vmpooler ).to receive( :require ).and_return( true )
95
+ allow( vmpooler ).to receive( :sleep ).and_return( true )
96
+ allow( vmpooler ).to receive( :get_host_info ).with(
97
+ anything, "vm1_has_a_template" ).and_return( nil )
98
+ allow( vmpooler ).to receive( :get_host_info ).with(
99
+ anything, "vm2_has_a_template" ).and_return( 'y' )
100
+ allow( vmpooler ).to receive( :get_host_info ).with(
101
+ anything, "vm3_has_a_template" ).and_return( 'y' )
102
+
103
+ expect {
104
+ vmpooler.provision
105
+ }.to raise_error( RuntimeError,
106
+ /Vmpooler\.provision - requested VM templates \[[^\,]*\] not available/
107
+ ) # should be only one item in the list, no commas
86
108
  end
87
109
  end
88
110
 
@@ -227,40 +227,86 @@ module Beaker
227
227
  end
228
228
 
229
229
  describe '#write_junit_xml' do
230
- let( :options ) { make_opts.merge({ :logger => double().as_null_object, 'name' => create_files(@files), :log_dated_dir => '.', :xml_dated_dir => '.'}) }
231
- let(:rb_test) { 'my_ruby_file.rb' }
232
-
233
- it 'doesn\'t re-order test cases themselves on time_sort' do
234
- nokogiri_mock = Hash.new
235
- allow( nokogiri_mock ).to receive( :add_child )
236
- allow( Nokogiri::XML::Node ).to receive( :new ) { nokogiri_mock }
237
- allow( LoggerJunit ).to receive( :write_xml ).and_yield( Object.new, nokogiri_mock )
238
-
230
+ let(:options) { make_opts.merge({:logger => double().as_null_object,
231
+ 'name' => create_files(@files),
232
+ :log_dated_dir => '.',
233
+ :xml_dated_dir => '.'}) }
234
+ let(:rb_test) { 'my_ruby_file.rb' }
235
+ before(:each) do
236
+ @nokogiri_mock = Hash.new
237
+ allow( @nokogiri_mock ).to receive( :add_child )
238
+ allow( Nokogiri::XML::Node ).to receive( :new ) { @nokogiri_mock }
239
+ allow( LoggerJunit ).to receive( :write_xml ).and_yield( Object.new, @nokogiri_mock )
239
240
  @files = [ rb_test, rb_test, rb_test]
240
- ts = Beaker::TestSuite.new( 'name', hosts, options, Time.now, :fast )
241
- tsr = ts.instance_variable_get( :@test_suite_results )
242
-
243
- allow( tsr ).to receive( :start_time ).and_return(0)
244
- allow( tsr ).to receive( :stop_time ).and_return(10)
245
- expect( tsr.instance_variable_get( :@logger ) ).to receive( :error ).never
246
-
247
- test_cases = []
248
- 3.times do
241
+ @ts = Beaker::TestSuite.new( 'name', hosts, options, Time.now, :fast )
242
+ @tsr = @ts.instance_variable_get( :@test_suite_results )
243
+ allow( @tsr ).to receive( :start_time ).and_return(0)
244
+ allow( @tsr ).to receive( :stop_time ).and_return(10)
245
+ @test_cases = []
246
+ @files.each_with_index do |file, index|
249
247
  tc = Beaker::TestCase.new( hosts, options[:logger], options, rb_test)
250
248
  allow( tc ).to receive( :sublog ).and_return( false )
251
- test_cases << tc
249
+ @test_cases << tc
250
+ end
251
+ end
252
+
253
+ it 'doesn\'t re-order test cases themselves on time_sort' do
254
+ expect( @tsr.instance_variable_get( :@logger ) ).to receive( :error ).never
255
+
256
+ @test_cases.each_with_index do |tc,index|
257
+ tc.instance_variable_set(:@runtime, 3**index)
258
+ @tsr.add_test_case( tc )
252
259
  end
253
- test_cases[0].instance_variable_set(:@runtime, 3)
254
- test_cases[1].instance_variable_set(:@runtime, 301)
255
- test_cases[2].instance_variable_set(:@runtime, 101)
256
- test_cases.map { |tc| tsr.add_test_case( tc ) }
257
260
 
258
261
  original_testcase_order = test_suite_result.instance_variable_get( :@test_cases ).dup
259
- tsr.write_junit_xml( 'fakeFilePath07', 'fakeFileToLink09', true )
262
+ time_sort = true
263
+ @tsr.write_junit_xml( 'fakeFilePath07', 'fakeFileToLink09', time_sort )
260
264
  after_testcase_order = test_suite_result.instance_variable_get( :@test_cases ).dup
261
265
  expect( after_testcase_order ).to be === original_testcase_order
262
266
  end
263
267
 
268
+ it 'writes @export nested hashes properly' do
269
+ expect( @tsr.instance_variable_get( :@logger ) ).to receive( :error ).never
270
+ inner_value = {'second' => '2nd'}
271
+ @test_cases.each do |tc|
272
+ tc.instance_variable_set(:@runtime, 0)
273
+ tc.instance_variable_set(:@exports, [{'oh' => 'hai', 'first' => inner_value}])
274
+ @tsr.add_test_case( tc )
275
+ end
276
+ @tsr.write_junit_xml( 'fakeFilePath08' )
277
+ expect( @nokogiri_mock['oh'] ).to eq('hai')
278
+ expect( @nokogiri_mock['first'] ).to eq(inner_value)
279
+ end
280
+
281
+ it 'writes @export array of hashes properly' do
282
+ expect( @tsr.instance_variable_get( :@logger ) ).to receive( :error ).never
283
+ @test_cases.each do |tc|
284
+ tc.instance_variable_set(:@runtime, 0)
285
+ tc.instance_variable_set(:@exports, [{:yes => 'hello'}, {:uh => 'sher'}])
286
+ @tsr.add_test_case( tc )
287
+ end
288
+ @tsr.write_junit_xml( 'fakeFilePath08' )
289
+ expect( @nokogiri_mock[:yes] ).to eq('hello')
290
+ expect( @nokogiri_mock[:uh] ).to eq('sher')
291
+ end
292
+
293
+ # this isn't the best test as the @nokogiri_mock is a single hash.
294
+ # it really should be an array of hashes or nested, to ensure each case
295
+ # gets the correct key/value. But i could not get it to work properly with
296
+ # the various calls to ::Node and #add_child
297
+ it 'writes @export hashes per test case properly' do
298
+ expect( @tsr.instance_variable_get( :@logger ) ).to receive( :error ).never
299
+ @test_cases.each_with_index do |tc,index|
300
+ tc.instance_variable_set(:@runtime, 0)
301
+ tc.instance_variable_set(:@exports, [{"yes_#{index}" => "hello#{index}"}])
302
+ @tsr.add_test_case( tc )
303
+ end
304
+ @tsr.write_junit_xml( 'fakeFilePath08' )
305
+ @test_cases.each_with_index do |tc,index|
306
+ expect( @nokogiri_mock["yes_#{index}"] ).to eq("hello#{index}")
307
+ end
308
+ end
309
+
264
310
  end
265
311
 
266
312
 
@@ -119,12 +119,17 @@ module PlatformHelpers
119
119
  'cumulus',
120
120
  'huaweios']
121
121
 
122
+
123
+ FEDORASYSTEMD = (14..29).to_a.collect! { |i| "fedora-#{i}" }
124
+
122
125
  SYSTEMDPLATFORMS = ['el-7',
123
126
  'centos-7',
124
127
  'redhat-7',
125
128
  'oracle-7',
126
129
  'scientific-7',
127
- 'eos-7']
130
+ 'eos-7'].concat(FEDORASYSTEMD)
131
+
132
+ FEDORASYSTEMV = (1..13).to_a.collect! { |i| "fedora-#{i}" }
128
133
 
129
134
  SYSTEMVPLATFORMS = ['el-',
130
135
  'centos',
@@ -132,5 +137,5 @@ module PlatformHelpers
132
137
  'redhat',
133
138
  'oracle',
134
139
  'scientific',
135
- 'eos']
140
+ 'eos'].concat(FEDORASYSTEMV)
136
141
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.40.0
4
+ version: 2.41.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppetlabs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-18 00:00:00.000000000 Z
11
+ date: 2016-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -567,10 +567,12 @@ files:
567
567
  - acceptance/tests/base/host_test.rb
568
568
  - acceptance/tests/base/packages.rb
569
569
  - acceptance/tests/base/packages_unix.rb
570
+ - acceptance/tests/base/test_suite/export.rb
570
571
  - acceptance/tests/hypervisor/communication_test.rb
571
572
  - acceptance/tests/load_path_bootstrap.rb
572
573
  - acceptance/tests/puppet/README.md
573
574
  - acceptance/tests/puppet/install_smoke_test.rb
575
+ - acceptance/tests/puppet/with_puppet_running_on.rb
574
576
  - beaker.gemspec
575
577
  - bin/beaker
576
578
  - docs/Access-the-Live-Test-Console-with-Pry.md
@@ -612,6 +614,7 @@ files:
612
614
  - docs/hypervisors/vagrant.md
613
615
  - docs/meta/README.md
614
616
  - docs/meta/ticket_process.md
617
+ - docs/runner/test_suites.md
615
618
  - docs/vSphere-Support.md
616
619
  - ext/completion/beaker-completion.bash
617
620
  - lib/beaker.rb