beaker 1.15.0 → 1.16.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
- ODI2NmQ0ZDdmZjljMDEzNzJhY2QwZWY1OGVjYzVmZjUzM2M1NDU2OA==
4
+ YzBmNDU3OTYwNGM3YTEwYjk2MjZlNmNjNzg5MDg1YTExMGRlOTMwMQ==
5
5
  data.tar.gz: !binary |-
6
- NzkzYTA2YjFmMWMwY2YzMjNiZmE0ZmE1NzVhMjA2NWFkMjFhMDllYg==
6
+ NWMzMzg3NDRlMTUyMDliN2E4NDBiODQ5ODY2MGNmNWZiYTNhMWRjOQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MzA0YTM2ZTEzMjZkNjIwZmM0OTU1OWRhYzNkYWI3OGU2NDMwMjBiYzk4MDg5
10
- MDMwY2VlMGE4OWQ5MTEwMzU1NjJhNTQ2MTY0YzFmNzM5Yzk4NjU0NmNmNjk1
11
- NjcyNWFmZWRkNzU2NjY4MDFiN2U2NTEwNTMwNWRhMTRiOGUyZTI=
9
+ MTQ3NWM0MmVhZjRkZjU4NTE4NTMwMWM5YTAwMGU1ZmI1YTI4ZDgxMjQ0NzEy
10
+ MjVmOWM3YjIwYzY4YjNiNGU3MmNhZDg2MDBiZGU1MjZhZDk5NzdlY2UwNTE1
11
+ NDZlMDFmZjZiYWY4NzRmN2RjNWZjZjM5NGI4M2U2ZTIyYjA1N2E=
12
12
  data.tar.gz: !binary |-
13
- MjMwNGNkOTg1M2Q1N2ZjODMyNThlNTg2NTlkOTg1ZmY4Zjc3YTBhYTFmMGZi
14
- ZDgzNGZlODdjN2Q5N2JkZGU4ZDIxMmE5MDQ1ODU0MGU4ZTliZmJmYjU3NGEx
15
- ZjBhMTYxZTc2MTYxZmEyM2EzZDliMTY0ZGE5ZDE0YmQxZTY3MjE=
13
+ OWFlYTRiOTYxYzQ1ODYxYmI2NGYwNDQyMDQ2NjFiOWI1MzY3MDZiYjYxZjhl
14
+ YzM3OGQyMzYyMTBjNmExZDlkZWZmOTk4NzZkZDBhODc0NzE3NmY1YmExMmNh
15
+ NDZiNmJjMzc1MTYwMjRhNzkyYzM3M2U4OWEwMjkxMjIwOWE0NzE=
data/HISTORY.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # beaker - History
2
2
  ## Tags
3
- * [LATEST - 8 Jul, 2014 (cc636ca0)](#LATEST)
3
+ * [LATEST - 17 Jul, 2014 (b0558827)](#LATEST)
4
+ * [beaker1.15.0 - 8 Jul, 2014 (82bb4ef9)](#beaker1.15.0)
4
5
  * [beaker1.14.1 - 3 Jul, 2014 (d2e750d5)](#beaker1.14.1)
5
6
  * [beaker1.14.0 - 3 Jul, 2014 (cf8ea838)](#beaker1.14.0)
6
7
  * [beaker1.13.1 - 23 Jun, 2014 (aa09552d)](#beaker1.13.1)
@@ -50,7 +51,192 @@
50
51
  * [pe1.2 - 6 Sep, 2011 (ba3dadd2)](#pe1.2)
51
52
 
52
53
  ## Details
53
- ### <a name = "LATEST">LATEST - 8 Jul, 2014 (cc636ca0)
54
+ ### <a name = "LATEST">LATEST - 17 Jul, 2014 (b0558827)
55
+
56
+ * Merge pull request #364 from anodelman/make-gem (b0558827)
57
+
58
+
59
+ ```
60
+ Merge pull request #364 from anodelman/make-gem
61
+
62
+ (GEM) version bump for beaker 1.16.0
63
+ ```
64
+ * (GEM) version bump for beaker 1.16.0 (6664c6ab)
65
+
66
+ * Merge pull request #363 from puppetlabs/revert-359-issue/master/qeng-188-foss-service-restarts (56cfac77)
67
+
68
+
69
+ ```
70
+ Merge pull request #363 from puppetlabs/revert-359-issue/master/qeng-188-foss-service-restarts
71
+
72
+ Revert "(QENG-188) Allow foss runs to use service scripts"
73
+ ```
74
+ * Revert "(QENG-188) Allow foss runs to use service scripts" (dbfa7b23)
75
+
76
+ * Merge pull request #359 from jpartlow/issue/master/qeng-188-foss-service-restarts (d2464451)
77
+
78
+
79
+ ```
80
+ Merge pull request #359 from jpartlow/issue/master/qeng-188-foss-service-restarts
81
+
82
+ (QENG-188) Allow foss runs to use service scripts
83
+ ```
84
+ * Merge pull request #360 from anodelman/fail-slow (0d0c9239)
85
+
86
+
87
+ ```
88
+ Merge pull request #360 from anodelman/fail-slow
89
+
90
+ (QENG-927) Beaker does not honor --fail-mode always fails fast
91
+ ```
92
+ * (QENG-927) Beaker does not honor --fail-mode always fails fast (755f13eb)
93
+
94
+
95
+ ```
96
+ (QENG-927) Beaker does not honor --fail-mode always fails fast
97
+
98
+ - bug comes from regex comparison with a symbol not being coerced to a
99
+ string in ruby 1.8, simple adding a 'to_s' resolves this
100
+ ```
101
+ * Merge pull request #358 from waynr/bugfix/ezbake-utils (b83f5299)
102
+
103
+
104
+ ```
105
+ Merge pull request #358 from waynr/bugfix/ezbake-utils
106
+
107
+ (QENG-924) Fix Beaker::DSL::EZBakeUtils.conditionally_clone
108
+ ```
109
+ * Merge pull request #357 from jpartlow/issue/master/qeng-923-ensure-platform-codename (06aa5b81)
110
+
111
+
112
+ ```
113
+ Merge pull request #357 from jpartlow/issue/master/qeng-923-ensure-platform-codename
114
+
115
+ (QENG-923) Ensure @codename is set if platform string has codename
116
+ ```
117
+ * (QENG-924) Fix Beaker::DSL::EZBakeUtils.conditionally_clone (b6cd1ac6)
118
+
119
+
120
+ ```
121
+ (QENG-924) Fix Beaker::DSL::EZBakeUtils.conditionally_clone
122
+
123
+ Fetch from origin then checkout the origin HEAD.
124
+
125
+ Signed-off-by: Wayne <wayne@puppetlabs.com>
126
+ ```
127
+ * (QENG-923) Ensure @codename is set if platform string has codename (26724829)
128
+
129
+
130
+ ```
131
+ (QENG-923) Ensure @codename is set if platform string has codename
132
+
133
+ Beaker 1.14.0 and up has a change to Beaker::Platform which ensures that
134
+ @version and @codename is set if the platform string contains the
135
+ version number, and that @version is set if platform string contains the
136
+ codename, but it fails to set the @codename in this later case.
137
+
138
+ Puppet currently has debian/ubuntu configs checked (used in ci) which
139
+ use platform strings of the form debian-wheezy-x86_64. We could change
140
+ these, but it looks like the intention of the Beaker::Platform object is
141
+ to provide @version and @codename (where codenames are used).
142
+
143
+ This patch ensures that @codename is set along with @version in these
144
+ cases.
145
+ ```
146
+ * Merge pull request #356 from anodelman/utf-8-encoding (842a0d99)
147
+
148
+
149
+ ```
150
+ Merge pull request #356 from anodelman/utf-8-encoding
151
+
152
+ (QENG-912) Beaker 1.14 breaks PE Puppet Acceptance
153
+ ```
154
+ * Merge pull request #354 from anodelman/scp-repair (6e0261f2)
155
+
156
+
157
+ ```
158
+ Merge pull request #354 from anodelman/scp-repair
159
+
160
+ (QENG-6) Beaker DSL `scp_*` commands print the options hash as if...
161
+ ```
162
+ * (QENG-912) Beaker 1.14 breaks PE Puppet Acceptance (928fad7f)
163
+
164
+
165
+ ```
166
+ (QENG-912) Beaker 1.14 breaks PE Puppet Acceptance
167
+
168
+ - was too conservative in removing non utf-8 compliant characters -
169
+ ended up removing compliant characters along with undef/invalid
170
+ character codes
171
+ - tested locally and it preserved messages like:
172
+ /etc/puppet/modules
173
+ ├── jimmy-appleseed (v1.1.0)
174
+ ├── jimmy-crakorn (v0.4.0)
175
+ └── jimmy-thelock (v1.0.0)
176
+ - correctly removed actual undef/invalid characters so that string
177
+ methods can be run (ie, split, gsub)
178
+ ```
179
+ * Merge pull request #338 from anodelman/add-history (9e6acd2e)
180
+
181
+
182
+ ```
183
+ Merge pull request #338 from anodelman/add-history
184
+
185
+ (QENG-849) beaker should maintain a history file that provides...
186
+ ```
187
+ * (QENG-6) Beaker DSL `scp_*` commands print the options hash as if... (9aca3a1d)
188
+
189
+
190
+ ```
191
+ (QENG-6) Beaker DSL `scp_*` commands print the options hash as if...
192
+
193
+ ... it were executed on the command line
194
+ - simply remove the option hash from the debug line, it isn't
195
+ appropriate there.
196
+ ```
197
+ * (QENG-849) beaker should maintain a history file that provides... (04bf6d4f)
198
+
199
+
200
+ ```
201
+ (QENG-849) beaker should maintain a history file that provides...
202
+
203
+ ...information per gem release
204
+
205
+ - generate a markdown history file from beaker git log
206
+ ```
207
+ * (QENG-188) Allow foss runs to use service scripts (881311ab)
208
+
209
+
210
+ ```
211
+ (QENG-188) Allow foss runs to use service scripts
212
+
213
+ Prior to this commit, any run of beaker with a non-pe master that
214
+ attempted to stand up a master with a particular configuration in order
215
+ to test against it using the with_puppet_running_on() helper would
216
+ always stand up a webrick master by executing `puppet master <args>` and
217
+ then later stop it with `kill`.
218
+
219
+ The platform team needs to be able to run acceptance suites in which the
220
+ puppetmaster is started/stopped using package provided init scripts, or
221
+ by restarting apache if a passenger puppetmaster package is installed.
222
+
223
+ This PR makes a few additions to OptionsHash, Host and the DSL::Helpers
224
+ to allow us to distinguish foss hosts which were spun up from source
225
+ from those which were installed from packages. And if we are working
226
+ with packages, whether we will be attempting to restart a running
227
+ service or stop/start using service scripts.
228
+ ```
229
+ ### <a name = "beaker1.15.0">beaker1.15.0 - 8 Jul, 2014 (82bb4ef9)
230
+
231
+ * Merge pull request #353 from anodelman/make-gem (82bb4ef9)
232
+
233
+
234
+ ```
235
+ Merge pull request #353 from anodelman/make-gem
236
+
237
+ (HISTORY) generate history file for beaker 1.15.0
238
+ ```
239
+ * (HISTORY) generate history file for beaker 1.15.0 (bd77ab99)
54
240
 
55
241
  * Merge pull request #351 from anodelman/make-gem (cc636ca0)
56
242
 
data/Rakefile CHANGED
@@ -9,6 +9,10 @@ task :yard do
9
9
  Rake::Task['docs:gen'].invoke
10
10
  end
11
11
 
12
+ task :history do
13
+ Rake::Task['history:gen'].invoke
14
+ end
15
+
12
16
  task :travis do
13
17
  Rake::Task['yard'].invoke unless RUBY_VERSION < '1.9'
14
18
  Rake::Task['spec'].invoke
@@ -24,14 +28,31 @@ namespace :test do
24
28
  end
25
29
  end
26
30
 
27
-
28
31
  ###########################################################
29
32
  #
30
- # Documentation Tasks
33
+ # History Tasks
31
34
  #
32
35
  ###########################################################
36
+ namespace :history do
37
+ desc 'Generate HISTORY.md'
38
+ task :gen do
39
+ original_dir = Dir.pwd
40
+ Dir.chdir( File.expand_path(File.dirname(__FILE__)) )
41
+ output = `bundle exec ruby history.rb .`
42
+ puts output
43
+ if output !~ /success/
44
+ raise "History generation failed"
45
+ end
46
+ Dir.chdir( original_dir )
47
+ end
33
48
 
49
+ end
34
50
 
51
+ ###########################################################
52
+ #
53
+ # Documentation Tasks
54
+ #
55
+ ###########################################################
35
56
  DOCS_DAEMON = "yard server --reload --daemon --server thin"
36
57
  FOREGROUND_SERVER = 'bundle exec yard server --reload --verbose --server thin lib/beaker'
37
58
 
@@ -29,6 +29,7 @@ Gem::Specification.new do |s|
29
29
  s.add_development_dependency 'yard'
30
30
  s.add_development_dependency 'markdown' unless RUBY_VERSION < '1.9'
31
31
  s.add_development_dependency 'thin'
32
+ s.add_development_dependency 'gitlab-grit'
32
33
 
33
34
  # Run time dependencies
34
35
  s.add_runtime_dependency 'json', '~> 1.8'
@@ -0,0 +1,57 @@
1
+ # Generates a HISTORY.md file for your repo based on tags and commits
2
+ # Requires: gem install gitlab-grit
3
+ # Usage: ruby history.rb /your/repo/directory
4
+ #
5
+ # Based on https://coderwall.com/p/99mjcg
6
+
7
+ require 'grit'
8
+
9
+ if ARGV.size < 1
10
+ p "Usage: ruby history.rb /your/repo/directory"
11
+ exit
12
+ end
13
+
14
+ output_file = 'HISTORY.md'
15
+ repo_dir = ARGV[0]
16
+ output = "# #{File.basename(File.absolute_path(repo_dir))} - History\n"
17
+
18
+ repo = Grit::Repo.new(repo_dir)
19
+ head = Grit::Tag.new(repo.commits.first.sha, repo, repo.commits.first.id)
20
+ tags = repo.tags + [head]
21
+ tags.sort! {|x,y| y.commit.authored_date <=> x.commit.authored_date}
22
+
23
+ output << "## Tags\n"
24
+ tags.each do |tag|
25
+ tag_name = tag.name
26
+ if tag == tags.first
27
+ tag_name = 'LATEST'
28
+ end
29
+ output << "* [#{tag_name} - #{tag.commit.authored_date.strftime("%-d %b, %Y")} (#{tag.commit.sha[0,8]})](##{tag_name})\n"
30
+ end
31
+
32
+ output << "\n## Details\n"
33
+ tagcount = 0
34
+ tags.each do |tag|
35
+ tag_name = tag.name
36
+ if tag == tags.first
37
+ tag_name = 'LATEST'
38
+ end
39
+ output << "### <a name = \"#{tag_name}\">#{tag_name} - #{tag.commit.authored_date.strftime("%-d %b, %Y")} (#{tag.commit.sha[0,8]})\n\n"
40
+ if (tagcount != tags.size - 1)
41
+ commit_set = repo.commits_between(tags[tagcount + 1].name, tag.name)
42
+ commit_set.sort! {|x,y| y.authored_date <=> x.authored_date }
43
+ commit_set.each do |c|
44
+ output << "* #{c.short_message} (#{c.sha[0,8]})\n\n"
45
+ if c.short_message != c.message
46
+ output << "\n```\n#{c.message.gsub(/```/, "\n")}\n```\n"
47
+ end
48
+ end
49
+ else
50
+ output << "* Initial release.\n"
51
+ end
52
+ tagcount += 1
53
+ end
54
+
55
+ File.open(output_file, 'w') { |f| f.write(output) }
56
+
57
+ puts "success, output sent to #{output_file}"
@@ -90,7 +90,7 @@ module Beaker
90
90
  rescue => e
91
91
  #post acceptance on failure
92
92
  #run post-suite if we are in fail-slow mode
93
- if @options[:fail_mode] =~ /slow/
93
+ if @options[:fail_mode].to_s =~ /slow/
94
94
  run_suite(:post_suite)
95
95
  end
96
96
  raise e
@@ -101,7 +101,7 @@ module Beaker
101
101
  #cleanup phase
102
102
  rescue => e
103
103
  #cleanup on error
104
- if @options[:preserve_hosts] =~ /(never)/
104
+ if @options[:preserve_hosts].to_s =~ /(never)/
105
105
  @logger.notify "Cleanup: cleaning up after failed run"
106
106
  if @network_manager
107
107
  @network_manager.cleanup
@@ -114,7 +114,7 @@ module Beaker
114
114
  exit 1
115
115
  else
116
116
  #cleanup on success
117
- if @options[:preserve_hosts] =~ /(never)|(onfail)/
117
+ if @options[:preserve_hosts].to_s =~ /(never)|(onfail)/
118
118
  @logger.notify "Cleanup: cleaning up after successful run"
119
119
  if @network_manager
120
120
  @network_manager.cleanup
@@ -65,7 +65,7 @@ module Beaker
65
65
  #
66
66
  def ezbake_stage project_name, project_version, ezbake_dir="tmp/ezbake"
67
67
  ezbake_tools_available?
68
- conditionally_clone "git@github.com:puppetlabs/ezbake.git", ezbake_dir
68
+ conditionally_clone "gitmirror@github.delivery.puppetlabs.net:puppetlabs-ezbake.git", ezbake_dir
69
69
 
70
70
  package_version = ''
71
71
  Dir.chdir(ezbake_dir) do
@@ -207,7 +207,8 @@ module Beaker
207
207
  def conditionally_clone(upstream_uri, local_path)
208
208
  ezbake_tools_available?
209
209
  if system "git --work-tree=#{local_path} --git-dir=#{local_path}/.git status"
210
- system "git --work-tree=#{local_path} --git-dir=#{local_path}/.git pull"
210
+ system "git --work-tree=#{local_path} --git-dir=#{local_path}/.git fetch origin"
211
+ system "git --work-tree=#{local_path} --git-dir=#{local_path}/.git checkout origin/HEAD"
211
212
  else
212
213
  parent_dir = File.dirname(local_path)
213
214
  FileUtils.mkdir_p(parent_dir)
@@ -207,14 +207,14 @@ module Beaker
207
207
  end
208
208
 
209
209
  def do_scp_to source, target, options
210
- @logger.debug "localhost $ scp #{source} #{@name}:#{target} #{options.to_s}"
210
+ @logger.debug "localhost $ scp #{source} #{@name}:#{target}"
211
211
  result = connection.scp_to(source, target, options, $dry_run)
212
212
  return result
213
213
  end
214
214
 
215
215
  def do_scp_from source, target, options
216
216
 
217
- @logger.debug "localhost $ scp #{@name}:#{source} #{target} #{options.to_s}"
217
+ @logger.debug "localhost $ scp #{@name}:#{source} #{target}"
218
218
  result = connection.scp_from(source, target, options, $dry_run)
219
219
  return result
220
220
  end
@@ -75,12 +75,13 @@
75
75
  <xsl:variable name="testsuite_name"><xsl:value-of select="@name"/></xsl:variable>
76
76
 
77
77
  <xsl:variable name="testsuite_name_safe" select="translate($testsuite_name,'.','_')" />
78
- <xsl:variable name="testsuite_tests"><xsl:value-of select="@tests"/></xsl:variable>
78
+ <xsl:variable name="testsuite_attempted"><xsl:value-of select="@tests"/></xsl:variable>
79
79
  <xsl:variable name="testsuite_errors"><xsl:value-of select="@errors"/></xsl:variable>
80
80
  <xsl:variable name="testsuite_failures"><xsl:value-of select="@failures"/></xsl:variable>
81
81
  <xsl:variable name="testsuite_time"><xsl:value-of select="@time"/></xsl:variable>
82
82
  <xsl:variable name="testsuite_skip"><xsl:value-of select="@skip"/></xsl:variable>
83
83
  <xsl:variable name="testsuite_pending"><xsl:value-of select="@pending"/></xsl:variable>
84
+ <xsl:variable name="testsuite_total"><xsl:value-of select="@total"/></xsl:variable>
84
85
  <xsl:variable name="testsuite_panel_type">
85
86
  <xsl:choose>
86
87
  <xsl:when test="$testsuite_errors > 0 or $testsuite_failures > 0">danger</xsl:when>
@@ -103,7 +104,7 @@
103
104
  <div class="col-md-2">
104
105
  </div>
105
106
  <div class="col-md-2">
106
- <h4>Total: <xsl:value-of select="$testsuite_tests" /></h4>
107
+ <h4>Attempted: <xsl:value-of select="$testsuite_attempted" /></h4>
107
108
  </div>
108
109
  <div class="col-md-2">
109
110
  <h4>Failed: <xsl:value-of select="$testsuite_errors + $testsuite_failures" /></h4>
@@ -114,6 +115,9 @@
114
115
  <div class="col-md-2">
115
116
  <h4>Pending: <xsl:value-of select="$testsuite_pending" /></h4>
116
117
  </div>
118
+ <div class="col-md-2">
119
+ <h4>Total: <xsl:value-of select="$testsuite_total" /></h4>
120
+ </div>
117
121
  </div> <!-- row -->
118
122
  </a>
119
123
  </div> <!-- panel-title -->
@@ -141,11 +141,11 @@ module Beaker
141
141
  convert s
142
142
  end
143
143
  else
144
- if string.respond_to?( :encode )
144
+ if string.respond_to?( :force_encoding )
145
145
  # We're running in >= 1.9 and we'll need to convert
146
146
  # Remove invalid and undefined UTF-8 character encodings
147
- encoding = Encoding ? Encoding.default_external : "UTF-8"
148
- return string.encode(encoding, string.encoding, :invalid => :replace, :undef => :replace, :replace => '')
147
+ string.force_encoding('UTF-8')
148
+ return string.chars.select{|i| i.valid_encoding?}.join
149
149
  else
150
150
  # We're running 1.8, do nothing
151
151
  string
@@ -63,6 +63,7 @@ module Beaker
63
63
 
64
64
  if codename_version_hash
65
65
  if codename_version_hash[version]
66
+ @codename = version
66
67
  @version = codename_version_hash[version]
67
68
  else
68
69
  version = version.delete('.')
@@ -31,11 +31,11 @@ module Beaker
31
31
  end
32
32
 
33
33
  def convert string
34
- if string.respond_to?( :encode )
34
+ if string.respond_to?( :force_encoding )
35
35
  # We're running in >= 1.9 and we'll need to convert
36
36
  # Remove invalid and undefined UTF-8 character encodings
37
- encoding = Encoding ? Encoding.default_external : "UTF-8"
38
- return string.encode(encoding, string.encoding, :invalid => :replace, :undef => :replace, :replace => '')
37
+ string.force_encoding('UTF-8')
38
+ return string.chars.select{|i| i.valid_encoding?}.join
39
39
  else
40
40
  # We're running in < 1.9 and Ruby doesn't care
41
41
  return string
@@ -12,7 +12,7 @@ module Beaker
12
12
 
13
13
  #Holds the output of a test suite, formats in plain text or xml
14
14
  class TestSuiteResult
15
- attr_accessor :start_time, :stop_time
15
+ attr_accessor :start_time, :stop_time, :total_tests
16
16
 
17
17
  #Create a {TestSuiteResult} instance.
18
18
  #@param [Hash{Symbol=>String}] options Options for this object
@@ -107,6 +107,7 @@ module Beaker
107
107
  Errored: #{errored_tests}
108
108
  Skipped: #{skipped_tests}
109
109
  Pending: #{pending_tests}
110
+ Total: #{@total_tests}
110
111
 
111
112
  - Specific Test Case Status -
112
113
  ] % [elapsed_time, average_test_time]
@@ -191,6 +192,7 @@ module Beaker
191
192
  suite['failures'] = failed_tests
192
193
  suite['skip'] = skipped_tests
193
194
  suite['pending'] = pending_tests
195
+ suite['total'] = @total_tests
194
196
  suite['time'] = "%f" % (stop_time - start_time)
195
197
  properties = Nokogiri::XML::Node.new('properties', doc)
196
198
  @options.each_pair do | name, value |
@@ -281,7 +283,7 @@ module Beaker
281
283
  @hosts = hosts
282
284
  @run = false
283
285
  @options = options
284
- @fail_mode = fail_mode
286
+ @fail_mode = fail_mode || @options[:fail_mode]
285
287
  @test_suite_results = TestSuiteResult.new(@options, name)
286
288
  @timestamp = timestamp
287
289
 
@@ -308,6 +310,7 @@ module Beaker
308
310
  Beaker.const_set(:Log, @logger) unless defined?( Log )
309
311
 
310
312
  @test_suite_results.start_time = start_time
313
+ @test_suite_results.total_tests = @test_files.length
311
314
 
312
315
  @test_files.each do |test_file|
313
316
  @logger.notify "Begin #{test_file}"
@@ -326,10 +329,10 @@ module Beaker
326
329
  @logger.debug msg
327
330
  when :fail
328
331
  @logger.error msg
329
- break if @fail_mode !~ /slow/ #all failure modes except slow cause us to kick out early on failure
332
+ break if @fail_mode.to_s !~ /slow/ #all failure modes except slow cause us to kick out early on failure
330
333
  when :error
331
334
  @logger.warn msg
332
- break if @fail_mode !~ /slow/ #all failure modes except slow cause us to kick out early on failure
335
+ break if @fail_mode.to_s !~ /slow/ #all failure modes except slow cause us to kick out early on failure
333
336
  end
334
337
  end
335
338
  @test_suite_results.stop_time = Time.now
@@ -1,5 +1,5 @@
1
1
  module Beaker
2
2
  module Version
3
- STRING = '1.15.0'
3
+ STRING = '1.16.0'
4
4
  end
5
5
  end
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  require 'spec_helper'
2
3
 
3
4
  module Beaker
@@ -6,6 +7,23 @@ module Beaker
6
7
  let(:logger) { Logger.new(my_io, :quiet => true) }
7
8
 
8
9
 
10
+ context '#convert' do
11
+ let(:valid_utf8) { "/etc/puppet/modules\n├── jimmy-appleseed (\e[0;36mv1.1.0\e[0m)\n├── jimmy-crakorn (\e[0;36mv0.4.0\e[0m)\n└── jimmy-thelock (\e[0;36mv1.0.0\e[0m)\n" }
12
+ let(:invalid_utf8) {"/etc/puppet/modules\n├── jimmy-appleseed (\e[0;36mv1.1.0\e[0m)\n├── jimmy-crakorn (\e[0;36mv0.4.0\e[0m)\n└── jimmy-thelock (\e[0;36mv1.0.0\e[0m)\xAD\n"}
13
+
14
+ it 'preserves valid utf-8 strings' do
15
+ expect( logger.convert(valid_utf8) ).to be === valid_utf8
16
+ end
17
+ it 'strips out invalid utf-8 characters' do
18
+ #this is 1.9 behavior only
19
+ if RUBY_VERSION.to_f >= 1.9
20
+ expect( logger.convert(invalid_utf8) ).to be === valid_utf8
21
+ else
22
+ pending "not supported in ruby 1.8 (using #{RUBY_VERSION})"
23
+ end
24
+ end
25
+ end
26
+
9
27
  context 'new' do
10
28
  it 'does not duplicate STDOUT when directly passed to it' do
11
29
  stdout_logger = Logger.new STDOUT
@@ -36,11 +36,24 @@ module Beaker
36
36
 
37
37
  it "sets codename to nil" do
38
38
  @name = "centos-6.5-x86_64"
39
- expect{ platform.codename }.to be { nil }
39
+ expect(platform.codename).to be_nil
40
40
  end
41
41
 
42
42
  end
43
43
 
44
+ describe "platforms with version and codename" do
45
+ it "intializes both version and codename if given version" do
46
+ @name = "debian-7-x86_64"
47
+ expect(platform.version).to eq('7')
48
+ expect(platform.codename).to eq('wheezy')
49
+ end
50
+
51
+ it "intializes both version and codename if given codename" do
52
+ @name = "debian-wheezy-x86_64"
53
+ expect(platform.version).to eq('7')
54
+ expect(platform.codename).to eq('wheezy')
55
+ end
56
+ end
44
57
  end
45
58
 
46
59
  context 'to_array' do
@@ -84,6 +84,16 @@ module Beaker
84
84
  testcase.should_receive( :log_and_fail_test ).once.with(kind_of(Timeout::Error))
85
85
  testcase.run_test
86
86
  end
87
+
88
+ it 'correctly handles CommandFailure' do
89
+ path = 'test.rb'
90
+ File.open(path, 'w') do |f|
91
+ f.write "raise Host::CommandFailure"
92
+ end
93
+ @path = path
94
+ testcase.should_receive( :log_and_fail_test ).once.with(kind_of(Host::CommandFailure))
95
+ testcase.run_test
96
+ end
87
97
  end
88
98
 
89
99
  end
@@ -13,14 +13,12 @@ module Beaker
13
13
  let(:sh_test) { File.expand_path(test_dir + '/my_shell_file.sh') }
14
14
 
15
15
  it 'fails without test files' do
16
- expect { Beaker::TestSuite.new 'name', 'hosts',
17
- Hash.new, :stop_on_error }.to raise_error
16
+ expect { Beaker::TestSuite.new('name', 'hosts', Hash.new, Time.now, :stop_on_error) }.to raise_error
18
17
  end
19
18
 
20
19
  it 'includes specific files as test file when explicitly passed' do
21
20
  @files = [ rb_test ]
22
- ts = Beaker::TestSuite.new 'name', 'hosts', options,
23
- :stop_on_error
21
+ ts = Beaker::TestSuite.new('name', 'hosts', options, Time.now, :stop_on_error)
24
22
 
25
23
  expect { ts.instance_variable_get(:@test_files).
26
24
  include? rb_test }.to be_true
@@ -28,6 +26,79 @@ module Beaker
28
26
 
29
27
  end
30
28
 
29
+ context 'run', :use_fakefs => true do
30
+
31
+ let( :options ) { make_opts.merge({ :logger => double().as_null_object, 'name' => create_files(@files), :log_dir => '.' }) }
32
+ let(:broken_script) { "raise RuntimeError" }
33
+ let(:fail_script) { "raise Beaker::DSL::Outcomes::FailTest" }
34
+ let(:okay_script) { "true" }
35
+ let(:rb_test) { 'my_ruby_file.rb' }
36
+ let(:pl_test) { '/my_perl_file.pl' }
37
+ let(:sh_test) { '/my_shell_file.sh' }
38
+
39
+ it 'fails fast if fail_mode != :slow and runtime error is raised' do
40
+ Logger.stub('new')
41
+ @files = [ rb_test, pl_test, sh_test]
42
+ File.open(rb_test, 'w') { |file| file.write(broken_script) }
43
+ File.open(pl_test, 'w') { |file| file.write(okay_script) }
44
+ File.open(sh_test, 'w') { |file| file.write(okay_script) }
45
+
46
+ ts = Beaker::TestSuite.new( 'name', 'hosts', options, Time.now, :stop )
47
+ tsr = ts.instance_variable_get( :@test_suite_results )
48
+ tsr.stub(:write_junit_xml).and_return( true )
49
+ tsr.stub(:summarize).and_return( true )
50
+
51
+ ts.run
52
+ expect( tsr.errored_tests ).to be === 1
53
+ expect( tsr.failed_tests ).to be === 0
54
+ expect( tsr.test_count ).to be === 1
55
+ expect( tsr.passed_tests).to be === 0
56
+
57
+ end
58
+
59
+ it 'fails fast if fail_mode != :slow and fail test is raised' do
60
+ Logger.stub('new')
61
+ @files = [ rb_test, pl_test, sh_test]
62
+ File.open(rb_test, 'w') { |file| file.write(fail_script) }
63
+ File.open(pl_test, 'w') { |file| file.write(okay_script) }
64
+ File.open(sh_test, 'w') { |file| file.write(okay_script) }
65
+
66
+ ts = Beaker::TestSuite.new( 'name', 'hosts', options, Time.now, :stop )
67
+ tsr = ts.instance_variable_get( :@test_suite_results )
68
+ tsr.stub(:write_junit_xml).and_return( true )
69
+ tsr.stub(:summarize).and_return( true )
70
+
71
+ ts.run
72
+ expect( tsr.errored_tests ).to be === 0
73
+ expect( tsr.failed_tests ).to be === 1
74
+ expect( tsr.test_count ).to be === 1
75
+ expect( tsr.passed_tests).to be === 0
76
+
77
+ end
78
+
79
+ it 'fails slow if fail_mode = :slow, even if a test fails and there is a runtime error' do
80
+ Logger.stub('new')
81
+ @files = [ rb_test, pl_test, sh_test]
82
+ File.open(rb_test, 'w') { |file| file.write(broken_script) }
83
+ File.open(pl_test, 'w') { |file| file.write(fail_script) }
84
+ File.open(sh_test, 'w') { |file| file.write(okay_script) }
85
+
86
+ ts = Beaker::TestSuite.new( 'name', 'hosts', options, Time.now, :slow )
87
+ tsr = ts.instance_variable_get( :@test_suite_results )
88
+ tsr.stub(:write_junit_xml).and_return( true )
89
+ tsr.stub(:summarize).and_return( true )
90
+
91
+ ts.run
92
+ expect( tsr.errored_tests ).to be === 1
93
+ expect( tsr.failed_tests ).to be === 1
94
+ expect( tsr.test_count ).to be === 3
95
+ expect( tsr.passed_tests).to be === 1
96
+
97
+ end
98
+
99
+
100
+ end
101
+
31
102
  describe TestSuite::TestSuiteResult do
32
103
 
33
104
  let( :options ) { make_opts.merge({ :logger => double().as_null_object }) }
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: 1.15.0
4
+ version: 1.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppetlabs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-08 00:00:00.000000000 Z
11
+ date: 2014-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - ! '>='
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: gitlab-grit
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ! '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: json
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -338,6 +352,7 @@ files:
338
352
  - Rakefile
339
353
  - beaker.gemspec
340
354
  - bin/beaker
355
+ - history.rb
341
356
  - lib/beaker.rb
342
357
  - lib/beaker/answers.rb
343
358
  - lib/beaker/answers/version20.rb