test-kitchen 1.0.0.alpha.6 → 1.0.0.alpha.7

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,30 @@
1
+ ## 1.0.0.alpha.7 / 2013-05-23
2
+
3
+ ### New features
4
+
5
+ * Pull request [#90][], issue [#31][]: Add a global user-level config file, located at `~/.kitchen/config.yml`. ([@thommay][])
6
+ * Pull request [#102][]: Allow a way to override remote sudo. ([@calavera][])
7
+ * Propagate default\_config from base driver classes into subclasses. ([@fnichol][])
8
+ * Pull request [#120][]: Add http and https_proxy support. ([@adamhjk][])
9
+ * Pull request [#111][]: Sink. Yeah, that one. ([@sethvargo][])
10
+
11
+ ### Bug fixes
12
+
13
+ * Pull request [#99][], issue [#98][]: Ensure that destroy option is respected when --parallel is used. ([@stevendanna][])
14
+ * Pull request [#116][]: Require the 'name' attribute is present in `metadata.rb`. ([@sethvargo][])
15
+ * Pull request [#113][]: Handle case where YAML parses as nil. ([@smith][])
16
+ * Pass original exception's backtrace to InstanceFailure and ActionFailed. ([@fnichol][])
17
+ * Fix bug where action failures are swallowed with a nil inside an ensure. ([@fnichol][])
18
+
19
+ ### Improvements
20
+
21
+ * Pull request [#104][]: Set the default ssh port in Driver::SSHBase. ([@calavera][])
22
+ * Pull request [#114][]: Update kitchen.yml template with provisionerless baseboxes. ([@jtimberman][])
23
+ * Pull request [#119][]: Test Kitchen works on Windows with Vagrant. ([@adamhjk][])
24
+ * Pull request [#108][]: Add version string to "Starting Kitchen" logging output. ([@fnichol][])
25
+ * Pull request [#105][]: Expand documentation around run-time switches in README. ([@grahamc][])
26
+
27
+
1
28
  ## 1.0.0.alpha.6 / 2013-05-08
2
29
 
3
30
  ### New features
@@ -97,6 +124,7 @@
97
124
  The initial release.
98
125
 
99
126
  <!--- The following link definition list is generated by PimpMyChangelog --->
127
+ [#31]: https://github.com/opscode/test-kitchen/issues/31
100
128
  [#61]: https://github.com/opscode/test-kitchen/issues/61
101
129
  [#64]: https://github.com/opscode/test-kitchen/issues/64
102
130
  [#65]: https://github.com/opscode/test-kitchen/issues/65
@@ -109,10 +137,31 @@ The initial release.
109
137
  [#81]: https://github.com/opscode/test-kitchen/issues/81
110
138
  [#82]: https://github.com/opscode/test-kitchen/issues/82
111
139
  [#84]: https://github.com/opscode/test-kitchen/issues/84
140
+ [#90]: https://github.com/opscode/test-kitchen/issues/90
112
141
  [#92]: https://github.com/opscode/test-kitchen/issues/92
142
+ [#98]: https://github.com/opscode/test-kitchen/issues/98
143
+ [#99]: https://github.com/opscode/test-kitchen/issues/99
144
+ [#102]: https://github.com/opscode/test-kitchen/issues/102
145
+ [#104]: https://github.com/opscode/test-kitchen/issues/104
146
+ [#105]: https://github.com/opscode/test-kitchen/issues/105
147
+ [#108]: https://github.com/opscode/test-kitchen/issues/108
148
+ [#111]: https://github.com/opscode/test-kitchen/issues/111
149
+ [#113]: https://github.com/opscode/test-kitchen/issues/113
150
+ [#114]: https://github.com/opscode/test-kitchen/issues/114
151
+ [#116]: https://github.com/opscode/test-kitchen/issues/116
152
+ [#119]: https://github.com/opscode/test-kitchen/issues/119
153
+ [#120]: https://github.com/opscode/test-kitchen/issues/120
113
154
  [@ChrisLundquist]: https://github.com/ChrisLundquist
155
+ [@adamhjk]: https://github.com/adamhjk
114
156
  [@arunthampi]: https://github.com/arunthampi
115
157
  [@bryanwb]: https://github.com/bryanwb
158
+ [@calavera]: https://github.com/calavera
116
159
  [@fnichol]: https://github.com/fnichol
160
+ [@grahamc]: https://github.com/grahamc
161
+ [@jtimberman]: https://github.com/jtimberman
117
162
  [@mattray]: https://github.com/mattray
118
163
  [@reset]: https://github.com/reset
164
+ [@sethvargo]: https://github.com/sethvargo
165
+ [@smith]: https://github.com/smith
166
+ [@stevendanna]: https://github.com/stevendanna
167
+ [@thommay]: https://github.com/thommay
data/Gemfile CHANGED
@@ -7,7 +7,3 @@ group :development do
7
7
  gem 'rb-fsevent', :require => false
8
8
  gem 'rb-fchange', :require => false
9
9
  end
10
-
11
- group :test do
12
- gem 'rake', '~> 0.9'
13
- end
data/README.md CHANGED
@@ -56,6 +56,17 @@ your tests in parallel. Trust us, it's faster!
56
56
 
57
57
  $ bundle exec kitchen test
58
58
 
59
+ ### Helpful Switches
60
+
61
+ - `--destroy=always|passed|never`
62
+ - `passed` (default): destroy the machine after a successful test
63
+ run (which implies passing tests.)
64
+ - `never`: Never clean up builds, even if they pass or fail.
65
+ - `always`: Regardless of the success or failure of the build,
66
+ destroy the machine.
67
+ - `--log-level=debug|info|warn|error|fatal` - Set the log-level of
68
+ the entire stack, including the chef-solo run.
69
+
59
70
  ## The Kitchen YAML format
60
71
 
61
72
  Test-Kitchen reads its configuration from the .kitchen.yml
@@ -112,7 +123,7 @@ suites:
112
123
  default_ruby: 1.8.7
113
124
  ```
114
125
 
115
- ## Overriding .kitchen.yaml with .kitchen.<driver>.local.yml
126
+ ## Overriding .kitchen.yaml with .kitchen.&lt;driver&gt;.local.yml
116
127
 
117
128
  TODO
118
129
 
@@ -0,0 +1,30 @@
1
+ Feature: The `kitchen sink` command
2
+ In order to have fun and provide an Easter Egg for users
3
+ As a Test Kitchen user
4
+ I want a `sink` command that displays ASCII art
5
+
6
+ Scenario: Displaying help
7
+ When I run `kitchen help`
8
+ Then the exit status should be 0
9
+ And the output should not contain "kitchen sink"
10
+
11
+ Scenario: Displaying the sink
12
+ When I run `kitchen sink`
13
+ Then the exit status should be 0
14
+ And the output should contain:
15
+ """
16
+ ___
17
+ ' _ '.
18
+ / /` `\ \
19
+ | | [__]
20
+ | | {{
21
+ | | }}
22
+ _ | | _ {{
23
+ ___________<_>_| |_<_>}}________
24
+ .=======^=(___)=^={{====.
25
+ / .----------------}}---. \
26
+ / / {{ \ \
27
+ / / }} \ \
28
+ ( '=========================' )
29
+ '-----------------------------'
30
+ """
@@ -55,11 +55,12 @@ module Kitchen
55
55
  nil
56
56
  else
57
57
  <<-INSTALL_CMD.gsub(/^ {10}/, '')
58
+ bash -c '
58
59
  if ! #{sudo}#{ruby_binpath}/gem list busser -i >/dev/null ; then
59
60
  #{sudo}#{ruby_binpath}/gem install #{busser_gem} --no-rdoc --no-ri
60
61
  fi
61
62
  #{sudo}#{ruby_binpath}/busser setup
62
- #{sudo}#{busser_bin} plugin install #{plugins.join(' ')}
63
+ #{sudo}#{busser_bin} plugin install #{plugins.join(' ')}'
63
64
  INSTALL_CMD
64
65
  end
65
66
  end
@@ -77,8 +78,9 @@ module Kitchen
77
78
  nil
78
79
  else
79
80
  <<-INSTALL_CMD.gsub(/^ {10}/, '')
81
+ bash -c '
80
82
  #{sudo}#{busser_bin} suite cleanup
81
- #{local_suite_files.map { |f| stream_file(f, remote_file(f)) }.join}
83
+ #{local_suite_files.map { |f| stream_file(f, remote_file(f)) }.join}'
82
84
  INSTALL_CMD
83
85
  end
84
86
  end
@@ -142,7 +144,7 @@ module Kitchen
142
144
  end
143
145
 
144
146
  def sudo
145
- @use_sudo ? "sudo " : ""
147
+ @use_sudo ? "sudo -E " : ""
146
148
  end
147
149
 
148
150
  def ruby_binpath
@@ -72,7 +72,7 @@ module Kitchen
72
72
  cookbooks_dir = local_cookbooks
73
73
  upload_path(scp, cookbooks_dir, "cookbooks")
74
74
  ensure
75
- FileUtils.rmtree(cookbooks_dir)
75
+ FileUtils.rmtree(cookbooks_dir) unless cookbooks_dir.nil?
76
76
  end
77
77
 
78
78
  def upload_data_bags(scp)
@@ -138,11 +138,16 @@ module Kitchen
138
138
  end
139
139
 
140
140
  def run_resolver(name, bin, tmpdir)
141
- begin
142
- run_command "if ! command -v #{bin} >/dev/null; then exit 1; fi"
143
- rescue Kitchen::ShellOut::ShellCommandFailed
144
- fatal("#{name} must be installed, add it to your Gemfile.")
145
- raise UserError, "#{bin} command not found"
141
+ # Just going to have to take your chances on Windows - no way to
142
+ # check for a command without running it, and looking for an
143
+ # exit code. Good times.
144
+ if RUBY_PLATFORM !~ /mswin|mingw/
145
+ begin
146
+ run_command "if ! command -v #{bin} >/dev/null; then exit 1; fi"
147
+ rescue Kitchen::ShellOut::ShellCommandFailed
148
+ fatal("#{name} must be installed, add it to your Gemfile.")
149
+ raise UserError, "#{bin} command not found"
150
+ end
146
151
  end
147
152
 
148
153
  Kitchen.mutex.synchronize do
@@ -157,7 +162,10 @@ module Kitchen
157
162
 
158
163
  def cp_this_cookbook(tmpdir)
159
164
  metadata_rb = File.join(kitchen_root, "metadata.rb")
160
- cb_name = MetadataChopper.extract(metadata_rb).first
165
+ cb_name = MetadataChopper.extract(metadata_rb).first or raise(UserError,
166
+ "The metadata.rb does not define the 'name' key." +
167
+ " Please add: `name '<cookbook_name>'` to metadata.rb and try again")
168
+
161
169
  cb_path = File.join(tmpdir, cb_name)
162
170
  glob = Dir.glob("#{kitchen_root}/{metadata.rb,README.*," +
163
171
  "attributes,files,libraries,providers,recipes,resources,templates}")
data/lib/kitchen/cli.rb CHANGED
@@ -100,7 +100,7 @@ module Kitchen
100
100
  end
101
101
 
102
102
  update_config!
103
- banner "Starting Kitchen"
103
+ banner "Starting Kitchen (v#{Kitchen::VERSION})"
104
104
  elapsed = Benchmark.measure do
105
105
  ensure_initialized
106
106
  destroy_mode = options[:destroy].to_sym
@@ -137,6 +137,29 @@ module Kitchen
137
137
  end
138
138
  map %w(-v --version) => :version
139
139
 
140
+ desc "sink", "Show the Kitchen sink!", :hide => true
141
+ def sink
142
+ say [
143
+ "",
144
+ " ___ ",
145
+ " ' _ '. ",
146
+ " / /` `\\ \\ ",
147
+ " | | [__] ",
148
+ " | | {{ ",
149
+ " | | }} ",
150
+ " _ | | _ {{ ",
151
+ " ___________<_>_| |_<_>}}________ ",
152
+ " .=======^=(___)=^={{====. ",
153
+ " / .----------------}}---. \\ ",
154
+ " / / {{ \\ \\ ",
155
+ " / / }} \\ \\ ",
156
+ " ( '=========================' ) ",
157
+ " '-----------------------------' ",
158
+ " ", # necessary newline
159
+ ""
160
+ ].map(&:rstrip).join("\n")
161
+ end
162
+
140
163
  desc "console", "Kitchen Console!"
141
164
  def console
142
165
  require 'pry'
@@ -245,7 +268,7 @@ module Kitchen
245
268
 
246
269
  def exec_action(action)
247
270
  update_config!
248
- banner "Starting Kitchen"
271
+ banner "Starting Kitchen (v#{Kitchen::VERSION})"
249
272
  elapsed = Benchmark.measure do
250
273
  @task = action
251
274
  results = parse_subcommand(args.first)
@@ -259,7 +282,7 @@ module Kitchen
259
282
  end
260
283
 
261
284
  def run_parallel(instances, *args)
262
- futures = Array(instances).map { |i| i.future.public_send(task) }
285
+ futures = Array(instances).map { |i| i.future.public_send(task, *args) }
263
286
  futures.map { |i| i.value }
264
287
  end
265
288
 
@@ -167,7 +167,17 @@ module Kitchen
167
167
  end
168
168
 
169
169
  def self.defaults
170
- @defaults ||= Hash.new
170
+ @defaults ||= Hash.new.merge(super_defaults)
171
+ end
172
+
173
+ def self.super_defaults
174
+ klass = self.superclass
175
+
176
+ if klass.respond_to?(:defaults)
177
+ klass.defaults
178
+ else
179
+ Hash.new
180
+ end
171
181
  end
172
182
 
173
183
  def self.default_config(attr, value)
@@ -31,6 +31,9 @@ module Kitchen
31
31
  # @author Fletcher Nichol <fnichol@nichol.ca>
32
32
  class SSHBase < Base
33
33
 
34
+ default_config :sudo, true
35
+ default_config :port, 22
36
+
34
37
  def create(state)
35
38
  raise ClientError, "#{self.class}#create must be implemented"
36
39
  end
@@ -117,9 +120,9 @@ module Kitchen
117
120
  if [ ! -d "/opt/chef" ] || should_update_chef ; then
118
121
  echo "-----> Installing Chef Omnibus (#{flag})"
119
122
  if command -v wget >/dev/null ; then
120
- wget #{url} -O - | sudo bash #{version}
123
+ wget #{url} -O - | #{cmd('bash')} #{version}
121
124
  elif command -v curl >/dev/null ; then
122
- curl -sSL #{url} | sudo bash #{version}
125
+ curl -sSL #{url} | #{cmd('bash')} #{version}
123
126
  else
124
127
  echo ">>>>>> Neither wget nor curl found on this instance."
125
128
  exit 1
@@ -129,7 +132,7 @@ module Kitchen
129
132
  end
130
133
 
131
134
  def prepare_chef_home(ssh_args)
132
- ssh(ssh_args, "sudo rm -rf #{chef_home} && mkdir -p #{chef_home}/cache")
135
+ ssh(ssh_args, "#{cmd('rm')} -rf #{chef_home} && mkdir -p #{chef_home}/cache")
133
136
  end
134
137
 
135
138
  def upload_chef_data(ssh_args)
@@ -140,12 +143,23 @@ module Kitchen
140
143
 
141
144
  def run_chef_solo(ssh_args)
142
145
  ssh(ssh_args, <<-RUN_SOLO)
143
- sudo chef-solo -c #{chef_home}/solo.rb -j #{chef_home}/dna.json \
146
+ #{cmd('chef-solo')} -c #{chef_home}/solo.rb -j #{chef_home}/dna.json \
144
147
  --log_level #{Util.from_logger_level(logger.level)}
145
148
  RUN_SOLO
146
149
  end
147
150
 
148
151
  def ssh(ssh_args, cmd)
152
+ env = "env"
153
+ if config[:http_proxy]
154
+ env << " http_proxy=#{config[:http_proxy]}"
155
+ end
156
+ if config[:https_proxy]
157
+ env << " https_proxy=#{config[:https_proxy]}"
158
+ end
159
+ if env != "env"
160
+ cmd = "#{env} #{cmd}"
161
+ end
162
+
149
163
  debug("[SSH] #{ssh_args[1]}@#{ssh_args[0]} (#{cmd})")
150
164
  Net::SSH.start(*ssh_args) do |ssh|
151
165
  exit_code = ssh_exec_with_exit!(ssh, cmd)
@@ -201,6 +215,10 @@ module Kitchen
201
215
  ensure
202
216
  socket && socket.close
203
217
  end
218
+
219
+ def cmd(script)
220
+ config[:sudo] ? "sudo -E #{script}" : script
221
+ end
204
222
  end
205
223
  end
206
224
  end
@@ -262,12 +262,13 @@ module Kitchen
262
262
  elapsed
263
263
  rescue ActionFailed => e
264
264
  log_failure(what, e)
265
- raise InstanceFailure, failure_message(what) +
266
- " Please see .kitchen/logs/#{self.name}.log for more details", caller
265
+ raise(InstanceFailure, failure_message(what) +
266
+ " Please see .kitchen/logs/#{self.name}.log for more details",
267
+ e.backtrace)
267
268
  rescue Exception => e
268
269
  log_failure(what, e)
269
270
  raise ActionFailed,
270
- "Failed to complete ##{what} action: [#{e.message}]", caller
271
+ "Failed to complete ##{what} action: [#{e.message}]", e.backtrace
271
272
  ensure
272
273
  state_file.write(state)
273
274
  end
@@ -47,6 +47,7 @@ module Kitchen
47
47
  @config_file = File.expand_path(config_file || default_config_file)
48
48
  @process_erb = options.fetch(:process_erb, true)
49
49
  @process_local = options.fetch(:process_local, true)
50
+ @process_global = options.fetch(:process_global, true)
50
51
  end
51
52
 
52
53
  # Reads, parses, and merges YAML configuration files and returns a Hash
@@ -68,7 +69,8 @@ module Kitchen
68
69
  end
69
70
 
70
71
  def combined_hash
71
- @process_local ? yaml.rmerge(local_yaml) : yaml
72
+ y = @process_local ? yaml.rmerge(local_yaml) : yaml
73
+ @process_global ? y.rmerge(global_yaml) : y
72
74
  rescue NoMethodError
73
75
  raise UserError, "Error merging #{File.basename(config_file)} and" +
74
76
  "#{File.basename(local_config_file)}"
@@ -82,6 +84,10 @@ module Kitchen
82
84
  parse_yaml_string(yaml_string(local_config_file), local_config_file)
83
85
  end
84
86
 
87
+ def global_yaml
88
+ parse_yaml_string(yaml_string(global_config_file), global_config_file)
89
+ end
90
+
85
91
  def yaml_string(file)
86
92
  string = read_file(file)
87
93
 
@@ -96,10 +102,14 @@ module Kitchen
96
102
  config_file.sub(/(#{File.extname(config_file)})$/, '.local\1')
97
103
  end
98
104
 
105
+ def global_config_file
106
+ File.join(File.expand_path(ENV["HOME"]), ".kitchen", "config.yml")
107
+ end
108
+
99
109
  def parse_yaml_string(string, file_name)
100
110
  return Hash.new if string.nil? || string.empty?
101
111
 
102
- ::YAML.safe_load(string)
112
+ ::YAML.safe_load(string) || Hash.new
103
113
  rescue SyntaxError, Psych::SyntaxError
104
114
  raise UserError, "Error parsing #{file_name}"
105
115
  end
@@ -60,7 +60,7 @@ module Kitchen
60
60
  def run_command(cmd, options = {})
61
61
  use_sudo = options[:use_sudo].nil? ? false : options[:use_sudo]
62
62
  quiet = options[:quiet]
63
- cmd = "sudo #{cmd}" if use_sudo
63
+ cmd = "sudo -E #{cmd}" if use_sudo
64
64
  subject = "[#{options[:log_subject] || "local"} command]"
65
65
 
66
66
  info("#{subject} BEGIN (#{display_cmd(cmd)})") unless quiet
data/lib/kitchen/util.rb CHANGED
@@ -93,6 +93,7 @@ module Kitchen
93
93
  # @param total [Integer] the total number of seconds
94
94
  # @return [String] a formatted string of the form (XmYY.00s)
95
95
  def self.duration(total)
96
+ total = 0 if total.nil?
96
97
  minutes = (total / 60).to_i
97
98
  seconds = (total - (minutes * 60))
98
99
  "(%dm%.2fs)" % [minutes, seconds]
@@ -18,5 +18,5 @@
18
18
 
19
19
  module Kitchen
20
20
 
21
- VERSION = "1.0.0.alpha.6"
21
+ VERSION = "1.0.0.alpha.7"
22
22
  end
@@ -83,6 +83,28 @@ describe Kitchen::Loader::YAML do
83
83
  })
84
84
  end
85
85
 
86
+ it "deep merges in a global config file with all other configs" do
87
+ stub_yaml!(".kitchen.yml", {
88
+ 'common' => { 'xx' => 1 },
89
+ 'a' => 'b'
90
+ })
91
+ stub_yaml!(".kitchen.local.yml", {
92
+ 'common' => { 'yy' => 2 },
93
+ 'c' => 'd'
94
+ })
95
+ stub_global!({
96
+ 'common' => { 'zz' => 3 },
97
+ 'e' => 'f'
98
+ })
99
+
100
+ loader.read.must_equal({
101
+ :a => 'b',
102
+ :c => 'd',
103
+ :e => 'f',
104
+ :common => { :xx => 1, :yy => 2, :zz => 3 }
105
+ })
106
+ end
107
+
86
108
  it "merges kitchen.local.yml over configuration in kitchen.yml" do
87
109
  stub_yaml!(".kitchen.yml", {
88
110
  'common' => { 'thekey' => 'nope' }
@@ -94,6 +116,20 @@ describe Kitchen::Loader::YAML do
94
116
  loader.read.must_equal({ :common => { :thekey => 'yep' } })
95
117
  end
96
118
 
119
+ it "merges global config over both kitchen.local.yml and kitchen.yml" do
120
+ stub_yaml!(".kitchen.yml", {
121
+ 'common' => { 'thekey' => 'nope' }
122
+ })
123
+ stub_yaml!(".kitchen.local.yml", {
124
+ 'common' => { 'thekey' => 'yep' }
125
+ })
126
+ stub_global!({
127
+ 'common' => { 'thekey' => 'kinda' }
128
+ })
129
+
130
+ loader.read.must_equal({ :common => { :thekey => 'kinda' } })
131
+ end
132
+
97
133
  it "handles a kitchen.local.yml with no yaml elements" do
98
134
  stub_yaml!(".kitchen.yml", {
99
135
  'a' => 'b'
@@ -112,6 +148,15 @@ describe Kitchen::Loader::YAML do
112
148
  loader.read.must_equal({ :a => 'b' })
113
149
  end
114
150
 
151
+ it "handles a kitchen.yml with yaml elements that parse as nil" do
152
+ stub_yaml!(".kitchen.yml", nil)
153
+ stub_yaml!(".kitchen.local.yml", {
154
+ 'a' => 'b'
155
+ })
156
+
157
+ loader.read.must_equal({ :a => 'b' })
158
+ end
159
+
115
160
  it "raises an UserError if the config_file does not exist" do
116
161
  proc { loader.read }.must_raise Kitchen::UserError
117
162
  end
@@ -239,12 +284,34 @@ describe Kitchen::Loader::YAML do
239
284
 
240
285
  loader.read.must_equal({ :a => 'b' })
241
286
  end
287
+
288
+ it "skips the global config if disabled" do
289
+ loader = Kitchen::Loader::YAML.new(
290
+ '/tmp/.kitchen.yml', :process_global => false)
291
+ stub_yaml!(".kitchen.yml", {
292
+ 'a' => 'b'
293
+ })
294
+ stub_global!({
295
+ 'superawesomesauceadditions' => 'enabled, yo'
296
+ })
297
+
298
+ loader.read.must_equal({ :a => 'b' })
299
+ end
242
300
  end
243
301
 
244
302
  private
245
303
 
304
+ def stub_file(path, hash)
305
+ FileUtils.mkdir_p(File.dirname(path))
306
+ File.open(path, "wb") { |f| f.write(hash.to_yaml) }
307
+ end
308
+
246
309
  def stub_yaml!(name = ".kitchen.yml", hash)
247
- FileUtils.mkdir_p "/tmp"
248
- File.open("/tmp/#{name}", "wb") { |f| f.write(hash.to_yaml) }
310
+ stub_file(File.join("/tmp", name), hash)
311
+ end
312
+
313
+ def stub_global!(hash)
314
+ stub_file(File.join(File.expand_path(ENV["HOME"]),
315
+ ".kitchen", "config.yml"), hash)
249
316
  end
250
317
  end
@@ -92,6 +92,10 @@ describe Kitchen::Util do
92
92
 
93
93
  describe ".duration" do
94
94
 
95
+ it "turns nil into a zero" do
96
+ Kitchen::Util.duration(nil).must_equal "(0m0.00s)"
97
+ end
98
+
95
99
  it "formats seconds to 2 digits" do
96
100
  Kitchen::Util.duration(60).must_equal "(1m0.00s)"
97
101
  end
@@ -1,24 +1,25 @@
1
1
  ---
2
2
  driver_plugin: <%= config[:driver_plugin] %>
3
+ driver_config:
4
+ require_chef_omnibus: true
3
5
 
4
6
  platforms:
5
7
  - name: ubuntu-12.04
6
8
  driver_config:
7
- box: canonical-ubuntu-12.04
8
- box_url: http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box
9
- require_chef_omnibus: true
9
+ box: opscode-ubuntu-12.04
10
+ box_url: https://opscode-vm.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box
10
11
  - name: ubuntu-10.04
11
12
  driver_config:
12
13
  box: opscode-ubuntu-10.04
13
- box_url: http://opscode-vm.s3.amazonaws.com/vagrant/opscode_ubuntu-10.04_chef-11.2.0.box
14
- - name: centos-6.3
14
+ box_url: https://opscode-vm.s3.amazonaws.com/vagrant/opscode_ubuntu-10.04_provisionerless.box
15
+ - name: centos-6.4
15
16
  driver_config:
16
- box: opscode-centos-6.3
17
- box_url: http://opscode-vm.s3.amazonaws.com/vagrant/opscode_centos-6.3_chef-11.2.0.box
18
- - name: centos-5.8
17
+ box: opscode-centos-6.4
18
+ box_url: https://opscode-vm.s3.amazonaws.com/vagrant/opscode_centos-6.4_provisionerless.box
19
+ - name: centos-5.9
19
20
  driver_config:
20
- box: opscode-centos-5.8
21
- box_url: http://opscode-vm.s3.amazonaws.com/vagrant/opscode_centos-5.8_chef-11.2.0.box
21
+ box: opscode-centos-5.9
22
+ box_url: https://opscode-vm.s3.amazonaws.com/vagrant/opscode_centos-5.9_provisionerless.box
22
23
 
23
24
  suites:
24
25
  - name: default
data/test-kitchen.gemspec CHANGED
@@ -28,7 +28,10 @@ Gem::Specification.new do |gem|
28
28
  gem.add_dependency 'mixlib-shellout'
29
29
  gem.add_dependency 'safe_yaml'
30
30
 
31
- gem.add_development_dependency 'minitest'
31
+ gem.add_development_dependency 'bundler', '~> 1.3'
32
+ gem.add_development_dependency 'rake'
33
+
34
+ gem.add_development_dependency 'minitest', '~> 4.7'
32
35
  gem.add_development_dependency 'mocha'
33
36
  gem.add_development_dependency 'fakefs'
34
37
  gem.add_development_dependency 'guard-minitest'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test-kitchen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.alpha.6
4
+ version: 1.0.0.alpha.7
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-08 00:00:00.000000000 Z
12
+ date: 2013-05-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: celluloid
@@ -124,7 +124,23 @@ dependencies:
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  - !ruby/object:Gem::Dependency
127
- name: minitest
127
+ name: bundler
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: '1.3'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: '1.3'
142
+ - !ruby/object:Gem::Dependency
143
+ name: rake
128
144
  requirement: !ruby/object:Gem::Requirement
129
145
  none: false
130
146
  requirements:
@@ -139,6 +155,22 @@ dependencies:
139
155
  - - ! '>='
140
156
  - !ruby/object:Gem::Version
141
157
  version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: minitest
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ~>
164
+ - !ruby/object:Gem::Version
165
+ version: '4.7'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: '4.7'
142
174
  - !ruby/object:Gem::Dependency
143
175
  name: mocha
144
176
  requirement: !ruby/object:Gem::Requirement
@@ -337,6 +369,7 @@ files:
337
369
  - features/kitchen_driver_create_command.feature
338
370
  - features/kitchen_driver_discover_command.feature
339
371
  - features/kitchen_init_command.feature
372
+ - features/sink_command.feature
340
373
  - features/step_definitions/gem_steps.rb
341
374
  - features/support/env.rb
342
375
  - lib/kitchen.rb
@@ -427,6 +460,7 @@ test_files:
427
460
  - features/kitchen_driver_create_command.feature
428
461
  - features/kitchen_driver_discover_command.feature
429
462
  - features/kitchen_init_command.feature
463
+ - features/sink_command.feature
430
464
  - features/step_definitions/gem_steps.rb
431
465
  - features/support/env.rb
432
466
  - spec/kitchen/collection_spec.rb