dockerspec 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 00c000093e65be525764d4adb1a19c986747a1f2
4
- data.tar.gz: 31ffe0b3521f66c09dffb9994e0d5de0a7895ef9
3
+ metadata.gz: 396a46490a394c6af6d52bd16850e4b6a0ccd909
4
+ data.tar.gz: d9c0eb9d9244bcb92b59615711a769cee935e3ce
5
5
  SHA512:
6
- metadata.gz: cf7da409ef3be6b88a6720bab01736e9badb61fc12b6ed494fee7efc47df18ca51aa09ad11a1703230aee29912e0dd62788d2653463048f8bfcea457a3fb4297
7
- data.tar.gz: 769fd611bd5c3e1bb8b97e8d37f65adb9572a2fe810e26af03e85d41ec7dac8af7fc543ba8575c7afef6fccc2cace7455404f8a0e20d9c0caa14deb5fca248b5
6
+ metadata.gz: 36b1beb9af0e95ffaadf1577d26c20789b2fea94df4d821746b1cfbcfd0771861ce681587ba97f641d27e95a135d6e22d71a896798fb2262a6c05d8c92b30537
7
+ data.tar.gz: 20d681f61e9d27b03c694d907408763e45272a4303590f0a48f04a2a2a68070f28e53cf6d7e4e7736ef37e82cee3f1bb9a0f5f1929ce4572f2bdf0e7c9009535
@@ -1,60 +1,94 @@
1
1
  # CHANGELOG for Dockerspec
2
2
 
3
- This file is used to list changes made in each version of `dockerspec` Ruby Gem.
4
-
5
- ## 0.3.0 (2016-02-28)
6
-
7
- ### Breaking Changes on 0.3.0
8
-
9
- * Enable `options[:rm]` by default.
10
-
11
- ### New Features on 0.3.0
12
-
13
- * Add Docker Compose support.
14
- * Add Infrataster and Capybara support.
15
- * Add `:wait` option to `docker_run` and `docker_compose`.
16
- * Add `described_image` helper for `docker_run`.
17
- * Support integer values with `have_expose` matcher.
18
- * Make `require 'dockerspec'` optional.
19
-
20
- ### Fixes on 0.3.0
21
-
22
- * Fix `:env` in `docker_run` with Serverspec.
23
- * Fix *Must have id* error when building images from IDs with tags.
24
-
25
- ### Improvements on 0.3.0
26
-
27
- * Update RuboCop to `0.37`, fix new offenses.
28
- * `Runner` classes split into `Engine::Base` and `Runner::Base`.
29
- * Add support for multiple testing engines.
30
- * Add a `Configuration` class to setup the internal modularization.
31
- * Rename many classes.
32
-
33
- ### Documentation Changes on 0.3.0
34
-
35
- * README:
36
- * Move the documentation below examples.
37
- * Add many examples.
38
-
39
- ## 0.2.0 (2015-12-11)
40
-
41
- ### New Features on 0.2.0
42
-
43
- * Set some opinionated RSpec configurations.
44
- * Print Docker errors in a more readable format.
45
-
46
- ### Fixes on 0.2.0
47
-
48
- * Fix *undefined method* error in the outermost examples.
49
-
50
- ### Documentation Changes on 0.2.0
51
-
52
- * Add examples for `#have_cmd` using string format.
53
- * README:
54
- * Improve Ruby documentation.
55
- * Change gem badge to point to RubyGems.
56
- * Add Real-world examples section.
57
-
58
- ## 0.1.0 (2015-12-09)
59
-
60
- * Initial release of `dockerspec`.
3
+ All notable changes to the [`dockerspec`](https://rubygems.org/gems/dockerspec/) RubyGem will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/).
6
+
7
+ ## [0.4.0] - 2017-03-20
8
+ [![Travis CI master Build Status](http://img.shields.io/travis/zuazo/dockerspec.svg?style=flat)](https://travis-ci.org/zuazo/dockerspec)
9
+
10
+ ### Added in 0.4.0
11
+ - Integrate with [rspec-retry](https://github.com/NoRedInk/rspec-retry) gem.
12
+ - Docker logs support ([issue #3](https://github.com/zuazo/dockerspec/issues/3), thanks [@axi43](https://github.com/axi43) for the idea).
13
+
14
+ ### Changed in 0.4.0
15
+ - Let user choose RSpec formatter ([issue #4](https://github.com/zuazo/dockerspec/issues/4), thanks [Luis Sagastume](https://github.com/zuazo/dockerspec/pull/4) for the help).
16
+
17
+ ### Removed in 0.4.0
18
+ - Drop Ruby `< 2.2` support.
19
+
20
+ ### Fixed in 0.4.0
21
+ - Be able to use os detection within test blocks ([issue #2](https://github.com/zuazo/dockerspec/issues/2), **special thanks to [Nan Liu](https://github.com/nanliu)** for his help and [his astonishing presentation](https://www.slideshare.net/NanLiu1/trust-but-verify-testing-with-docker-containers)).
22
+ - Use `Integer` instead of `Fixnum`.
23
+
24
+ ### Improved in 0.4.0
25
+ - `ItsContainer`: rename container_name variable to avoid confussion.
26
+
27
+ ### Documentation Changes in 0.4.0
28
+ - Document `dir` parameter in `Builder#build_from_string`.
29
+ - CHANGELOG: Follow "Keep a CHANGELOG".
30
+ - Add GitHub templates.
31
+ - README:
32
+ - Document how to require the gem.
33
+ - Add Presentations section.
34
+ - Add a TOC.
35
+ - Add documentation links.
36
+
37
+ ## [0.3.0] - 2016-02-28
38
+ [![Travis CI 0.3.0 Build Status](http://img.shields.io/travis/zuazo/dockerspec/0.3.0.svg?style=flat)](https://travis-ci.org/zuazo/dockerspec)
39
+
40
+ ### Breaking Changes in 0.3.0
41
+ - Enable `options[:rm]` by default.
42
+
43
+ ### Added in 0.3.0
44
+ - Add Docker Compose support.
45
+ - Add Infrataster and Capybara support.
46
+ - Add `:wait` option to `docker_run` and `docker_compose`.
47
+ - Add `described_image` helper for `docker_run`.
48
+ - Support integer values with `have_expose` matcher.
49
+ - Make `require 'dockerspec'` optional.
50
+ - Add support for multiple testing engines.
51
+ - Add a `Configuration` class to setup the internal modularization.
52
+
53
+ ### Fixed in 0.3.0
54
+ - Fix `:env` in `docker_run` with Serverspec.
55
+ - Fix *Must have id* error when building images from IDs with tags.
56
+
57
+ ### Improved in 0.3.0
58
+ - Update RuboCop to `0.37`, fix new offenses.
59
+ - `Runner` classes split into `Engine::Base` and `Runner::Base`.
60
+ - Rename many classes.
61
+
62
+ ### Documentation Changes in 0.3.0
63
+ - README:
64
+ - Move the documentation below examples.
65
+ - Add many examples.
66
+
67
+ ## [0.2.0] - 2015-12-11
68
+ [![Travis CI 0.2.0 Build Status](http://img.shields.io/travis/zuazo/dockerspec/0.2.0.svg?style=flat)](https://travis-ci.org/zuazo/dockerspec)
69
+
70
+ ### Added in 0.2.0
71
+ - Print Docker errors in a more readable format.
72
+
73
+ ### Changed in 0.2.0
74
+ - Set some opinionated RSpec configurations.
75
+
76
+ ### Fixed in 0.2.0
77
+ - Fix *undefined method* error in the outermost examples.
78
+
79
+ ### Documentation Changes in 0.2.0
80
+ - Add examples for `#have_cmd` using string format.
81
+ - README:
82
+ - Improve Ruby documentation.
83
+ - Change gem badge to point to RubyGems.
84
+ - Add Real-world examples section.
85
+
86
+ ## 0.1.0 - 2015-12-09
87
+ [![Travis CI 0.1.0 Build Status](http://img.shields.io/travis/zuazo/dockerspec/0.1.0.svg?style=flat)](https://travis-ci.org/zuazo/dockerspec)
88
+
89
+ - Initial release of `dockerspec`.
90
+
91
+ [Unreleased]: https://github.com/zuazo/dockerspec/compare/0.4.0...HEAD
92
+ [0.4.0]: https://github.com/zuazo/dockerspec/compare/0.3.0...0.4.0
93
+ [0.3.0]: https://github.com/zuazo/dockerspec/compare/0.2.0...0.3.0
94
+ [0.2.0]: https://github.com/zuazo/dockerspec/compare/0.1.0...0.2.0
data/README.md CHANGED
@@ -6,20 +6,42 @@
6
6
  [![Gem Version](https://badge.fury.io/rb/dockerspec.svg)](https://rubygems.org/gems/dockerspec)
7
7
  [![Dependency Status](http://img.shields.io/gemnasium/zuazo/dockerspec.svg?style=flat)](https://gemnasium.com/zuazo/dockerspec)
8
8
  [![Code Climate](http://img.shields.io/codeclimate/github/zuazo/dockerspec.svg?style=flat)](https://codeclimate.com/github/zuazo/dockerspec)
9
- [![Travis CI Build Status](http://img.shields.io/travis/zuazo/dockerspec/0.3.0.svg?style=flat)](https://travis-ci.org/zuazo/dockerspec)
9
+ [![Travis CI Build Status](http://img.shields.io/travis/zuazo/dockerspec/0.4.0.svg?style=flat)](https://travis-ci.org/zuazo/dockerspec)
10
10
  [![Circle CI Build Status](https://circleci.com/gh/zuazo/dockerspec/tree/master.svg?style=shield)](https://circleci.com/gh/zuazo/dockerspec/tree/master)
11
- [![Coverage Status](http://img.shields.io/coveralls/zuazo/dockerspec/0.3.0.svg?style=flat)](https://coveralls.io/r/zuazo/dockerspec?branch=0.3.0)
11
+ [![Coverage Status](http://img.shields.io/coveralls/zuazo/dockerspec/0.4.0.svg?style=flat)](https://coveralls.io/github/zuazo/dockerspec?branch=0.4.0)
12
12
  [![Inline docs](http://inch-ci.org/github/zuazo/dockerspec.svg?branch=master&style=flat)](http://inch-ci.org/github/zuazo/dockerspec)
13
13
 
14
- ## Description
15
-
16
14
  A small Ruby Gem to run RSpec, [Serverspec](http://serverspec.org/), [Infrataster](https://github.com/ryotarai/infrataster) and [Capybara](http://jnicklas.github.io/capybara/) tests against Dockerfiles or Docker images easily.
17
15
 
18
16
  This gem is designed to work out of the box on [Travis CI](https://travis-ci.org/), [CircleCI](https://circleci.com/) and other similar CI environments.
19
17
 
18
+ ## Table of Contents
19
+
20
+ - [Requirements](#requirements)
21
+ - [Installation](#installation)
22
+ - [Documentation](#documentation)
23
+ - [Presentations](#presentations)
24
+ - [Usage Examples](#usage-examples)
25
+ - [Run Tests Against a Dockerfile in the Current Directory](#run-tests-against-a-dockerfile-in-the-current-directory)
26
+ - [Run Tests Against Docker Compose](#run-tests-against-docker-compose)
27
+ - [Checking Container Logs](#checking-container-logs)
28
+ - [Retrying Tests That Fail Temporarily](#retrying-tests-that-fail-temporarily)
29
+ - [Run HTTP Tests Using Infrataster](#run-http-tests-using-infrataster)
30
+ - [Run HTTP Tests Using Capybara](#run-http-tests-using-capybara)
31
+ - [Run Database Tests Using `infrataster-plugin-mysql` Gem with Docker Compose](#run-database-tests-using-infrataster-plugin-mysql-gem-with-docker-compose)
32
+ - [Run Different Tests on Each Platform](#run-different-tests-on-each-platform)
33
+ - [Real-world Examples](#real-world-examples)
34
+ - [Prepare Your Ruby Environment](#prepare-your-ruby-environment)
35
+ - [Travis CI Configuration Example](#travis-ci-configuration-example)
36
+ - [CircleCI Configuration Example](#circleci-configuration-example)
37
+ - [Testing](#testing)
38
+ - [Contributing](#contributing)
39
+ - [TODO](#todo)
40
+ - [License and Author](#license-and-author)
41
+
20
42
  ## Requirements
21
43
 
22
- * Ruby `2` or higher.
44
+ * Ruby `2.2` or higher.
23
45
  * Recommended Docker `1.7` or higher.
24
46
 
25
47
  ## Installation
@@ -44,6 +66,33 @@ $ bundle
44
66
 
45
67
  **Warning:** As the gem is in its early development stages, [the API is very likely to break between minor versions](http://semver.org/).
46
68
 
69
+ ## Documentation
70
+
71
+ - Latest release documentation: http://www.rubydoc.info/gems/dockerspec
72
+ - Master unreleased documentation: http://www.rubydoc.info/github/zuazo/dockerspec
73
+
74
+ Specific documentation sections for resources or functions that can be used to generate test cases:
75
+
76
+ - [`docker_build`](http://www.rubydoc.info/gems/dockerspec/Dockerspec/RSpec/Resources#docker_build-instance_method)
77
+ - [*Docker Build* helpers](http://www.rubydoc.info/gems/dockerspec/Dockerspec/Builder/ConfigHelpers)
78
+ - [`docker_run`](http://www.rubydoc.info/gems/dockerspec/Dockerspec/RSpec/Resources#docker_run-instance_method)
79
+ - [*Docker Run* helpers](http://www.rubydoc.info/gems/dockerspec/Dockerspec/Runner/ConfigHelpers)
80
+ - [*Docker Run* Serverspec resource types](http://serverspec.org/resource_types.html)
81
+ - [Infrataster Resources](http://www.rubydoc.info/gems/infrataster#Resources)
82
+ - [Capybara DSL](http://www.rubydoc.info/gems/capybara#The_DSL)
83
+ - [`docker_compose`](http://www.rubydoc.info/gems/dockerspec/Dockerspec/RSpec/Resources#docker_compose-instance_method)
84
+ - [`its_container`](http://www.rubydoc.info/gems/dockerspec/Dockerspec/RSpec/Resources#its_container-instance_method)
85
+
86
+ ### Presentations
87
+
88
+ Apart from the official documentation, [Nan Liu](https://github.com/nanliu) presented a talk for [Portland Docker user group](https://www.meetup.com/Docker-Portland-OR/events/236739986/) regarding how to use Dockerspec in a container:
89
+
90
+ - [Trust, but verify | Testing with Docker Containers](http://www.slideshare.net/NanLiu1/trust-but-verify-testing-with-docker-containers)
91
+
92
+ <a href="https://www.slideshare.net/NanLiu1/trust-but-verify-testing-with-docker-containers">
93
+ <img src="https://i.gyazo.com/fe45a36c2e329af317482c280a09dfab.png" alt="Trust, but verify | Testing with Docker Containers" width="300px">
94
+ </a>
95
+
47
96
  ## Usage Examples
48
97
 
49
98
  ### Run Tests Against a Dockerfile in the Current Directory
@@ -75,7 +124,7 @@ describe 'My Dockerfile' do
75
124
  end
76
125
  ```
77
126
 
78
- See the documentation above for more examples.
127
+ See [the documentation above](#documentation) for more examples.
79
128
 
80
129
  ### Run Tests Against Docker Compose
81
130
 
@@ -93,6 +142,8 @@ describe docker_compose('.', wait: 30) do
93
142
  end
94
143
 
95
144
  its_container(:db) do
145
+ its(:stdout) { should include 'MySQL init process done.' }
146
+
96
147
  describe process('mysqld') do
97
148
  it { should be_running }
98
149
  end
@@ -104,6 +155,54 @@ end
104
155
 
105
156
  **Important Warning:** The `docker_compose` resource uses the [`docker-compose-api`](https://rubygems.org/gems/docker-compose-api) Ruby gem to emulate Docker Compose. So, some *docker-compose.yml* configuration options may not be supported yet or may not work exactly the same. Let us know if you find any bug or you need a missing feature. And thanks to [Mauricio Klein](https://github.com/mauricioklein) for all his work by the way!
106
157
 
158
+ ### Checking Container Logs
159
+
160
+ To check the running container logs content, you can use [the `stdout` and `stderr` helpers](http://www.rubydoc.info/gems/dockerspec/Dockerspec/Runner/ConfigHelpers) inside `docker_run` or `its_container` blocks.
161
+
162
+ For example:
163
+
164
+ ```ruby
165
+ require 'dockerspec/serverspec'
166
+
167
+ describe 'My Dockerfile' do
168
+ describe docker_build('.') do
169
+ describe docker_run(described_image) do
170
+ its(:stdout) { should include 'Successfully Started.' }
171
+ its(:stderr) { should eq '' }
172
+ end
173
+ end
174
+ end
175
+ ```
176
+
177
+ ### Retrying Tests That Fail Temporarily
178
+
179
+ This gem includes the [`rspec-retry`](https://github.com/NoRedInk/rspec-retry) gem. So, you can add `:retry` to the RSpec metadata in order to retry some tests multiple times.
180
+
181
+ For example:
182
+
183
+ ```ruby
184
+ describe docker_run('mariadb') do
185
+ its(:stdout, retry: 30) { should include 'MySQL init process done.' }
186
+ end
187
+ ```
188
+
189
+ By default, it will do a sleep of 1 second between each retry. You can adjust it with `:retry_wait`. See [`rspec-retry` documentation](http://www.rubydoc.info/gems/rspec-retry/0.4.5) for more details.
190
+
191
+ You can also make all tests within a block retry:
192
+
193
+ ```ruby
194
+ describe docker_run('mariadb'), retry: 30 do
195
+ its(:stdout) { should include 'MySQL init process done.' }
196
+ its(:stderr) { should include 'MySQL init process done.' }
197
+
198
+ describe command('mysqld -V'), retry: 1 do # disable retries here
199
+ its(:stdout) { should match(/^mysqld .*MariaDB/i) }
200
+ end
201
+ end
202
+ ```
203
+
204
+ The same applies for `its_container` blocks.
205
+
107
206
  ### Run HTTP Tests Using Infrataster
108
207
 
109
208
  ```ruby
@@ -241,16 +340,38 @@ describe docker_compose('docker-compose.yml', wait: 60) do
241
340
  end
242
341
  ```
243
342
 
244
- ## Documentation
343
+ ### Run Different Tests on Each Platform
245
344
 
246
- - [`docker_build`](http://www.rubydoc.info/gems/dockerspec/Dockerspec/RSpec/Resources#docker_build-instance_method)
247
- - [*Docker Build* helpers](http://www.rubydoc.info/gems/dockerspec/Dockerspec/Builder/ConfigHelpers)
248
- - [`docker_run`](http://www.rubydoc.info/gems/dockerspec/Dockerspec/RSpec/Resources#docker_run-instance_method)
249
- - [*Docker Run* Serverspec resource types](http://serverspec.org/resource_types.html)
250
- - [Infrataster Resources](http://www.rubydoc.info/gems/infrataster#Resources)
251
- - [Capybara DSL](http://www.rubydoc.info/gems/capybara#The_DSL)
252
- - [`docker_compose`](http://www.rubydoc.info/gems/dockerspec/Dockerspec/RSpec/Resources#docker_compose-instance_method)
253
- - [`its_container`](http://www.rubydoc.info/gems/dockerspec/Dockerspec/RSpec/Resources#its_container-instance_method)
345
+ Sometimes, you may want to be able to run different tests depending on the platform. You can use Serverspec's `os` helper method for that:
346
+
347
+ ```ruby
348
+ require 'dockerspec/serverspec'
349
+
350
+ describe docker_build('.', tag: 'mywebapp') do
351
+ describe docker_run('mywebapp') do
352
+ case os[:family]
353
+ when 'debian'
354
+
355
+ describe file('/etc/debian_version') do
356
+ it { should exist }
357
+ end
358
+
359
+ # [...]
360
+
361
+ when 'alpine'
362
+
363
+ describe file('/etc/alpine-release') do
364
+ it { should exist }
365
+ end
366
+
367
+ # [...]
368
+
369
+ end
370
+ end
371
+ end
372
+ ```
373
+
374
+ For more details, see [Serverspec documenation on how to get OS information](http://serverspec.org/advanced_tips.html#how-to-get-os-information).
254
375
 
255
376
  ### Real-world Examples
256
377
 
@@ -282,6 +403,29 @@ $ mkdir spec
282
403
 
283
404
  #### 3. Add your tests to a file with the *spec/myapp_spec.rb* format:
284
405
 
406
+ With this gem, you can use both [Serverspec](http://serverspec.org/) and [Infrataster](https://github.com/ryotarai/infrataster) tests.
407
+
408
+ If you just want to use [Serverspec](http://serverspec.org/) tests:
409
+
410
+ ```ruby
411
+ require 'dockerspec/serverspec'
412
+ ```
413
+
414
+ If you just want to use [Infrataster](https://github.com/ryotarai/infrataster) tests:
415
+
416
+ ```ruby
417
+ require 'dockerspec/infrataster'
418
+ ```
419
+
420
+ But, of course, you can use both types of tests if you want:
421
+
422
+ ```ruby
423
+ require 'dockerspec/serverspec'
424
+ require 'dockerspec/infrataster'
425
+ ```
426
+
427
+ For example, you can create a file in *spec/myapp_spec.rb* with the following content:
428
+
285
429
  ```ruby
286
430
  # spec/myapp_spec.rb
287
431
 
data/TODO.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # TODO for Dockerspec
2
2
 
3
+ * [ ] Log parsing contains `"\x00"` chars.
3
4
  * [ ] Integrate with [Inspec](https://www.chef.io/inspec/).
4
5
  * [ ] Test resources for built images supported inside `docker_compose`.
5
6
  * [ ] Add `docker_context`, `docker_describe` to avoid starting all containers at the same time.
@@ -19,6 +19,7 @@
19
19
 
20
20
  require 'rspec'
21
21
  require 'rspec/its'
22
+ require 'rspec/retry'
22
23
  require 'tmpdir'
23
24
  require 'erubis'
24
25
  require 'dockerspec/docker_gem'
@@ -75,7 +76,7 @@ module Dockerspec
75
76
  # used when the `:template` source is used.
76
77
  # @option opts [String] :tag Repository tag to be applied to the resulting
77
78
  # image.
78
- # @option opts [Fixnum, Symbol] :log_level Sets the docker library
79
+ # @option opts [Integer, Symbol] :log_level Sets the docker library
79
80
  # verbosity level. Possible values:
80
81
  # `:silent` or `0` (no output),
81
82
  # `:ci` or `1` (enables some outputs recommended for CI environments),
@@ -272,6 +273,8 @@ module Dockerspec
272
273
  # generates the temporary Dockerfile.
273
274
  #
274
275
  # @param string [String] The Dockerfile content.
276
+ # @param dir [String] The directory to copy the files from. Files that are
277
+ # required by the Dockerfile passed in *string*.
275
278
  #
276
279
  # @return void
277
280
  #
@@ -48,7 +48,7 @@ module Dockerspec
48
48
  # its(:size) { should be < 20 * 2**20 } # 20M
49
49
  # end
50
50
  #
51
- # @return [Fixnum] The image size in bytes.
51
+ # @return [Integer] The image size in bytes.
52
52
  #
53
53
  # @api public
54
54
  #
@@ -31,7 +31,7 @@ module Dockerspec
31
31
  #
32
32
  # Creates a logger object.
33
33
  #
34
- # @param type [Fixnum, Symbol] The logger to create. Possible values:
34
+ # @param type [Integer, Symbol] The logger to create. Possible values:
35
35
  # `:silent` or `0` (no output),
36
36
  # `:ci` or `1` (enables some outputs recommended for CI environments),
37
37
  # `:info` or `2` (gives information about main build steps),
@@ -66,8 +66,11 @@ module Dockerspec
66
66
  # @api public
67
67
  #
68
68
  def restore
69
- instance_set(@saved_backend_instance)
70
- ::Specinfra.configuration.backend = @saved_backend_name
69
+ backend_class.instance_set(@saved_backend_instance)
70
+ if ::Specinfra.configuration.backend != @saved_backend_name
71
+ backend_class.host_reset
72
+ ::Specinfra.configuration.backend = @saved_backend_name
73
+ end
71
74
  end
72
75
 
73
76
  #
@@ -98,7 +101,7 @@ module Dockerspec
98
101
  # @api public
99
102
  #
100
103
  def reset
101
- instance_set(nil)
104
+ backend_class.instance_set(nil)
102
105
  end
103
106
 
104
107
  #
@@ -117,22 +120,6 @@ module Dockerspec
117
120
 
118
121
  protected
119
122
 
120
- #
121
- # Sets the Specinfra backend.
122
- #
123
- # Used by {.load}.
124
- #
125
- # @param instance [Specinfra::Backend::Base] The Specinfra backend
126
- # object.
127
- #
128
- # @return void
129
- #
130
- # @api private
131
- #
132
- def instance_set(instance)
133
- backend_class.instance_set(instance)
134
- end
135
-
136
123
  #
137
124
  # Returns the current Specinfra backend object.
138
125
  #
@@ -53,46 +53,26 @@ module Dockerspec
53
53
  end
54
54
  end
55
55
 
56
- #
57
- # Searches for an object in the description of the parent RSpec examples.
58
- #
59
- # @param metadata [Hash] RSpec metadata.
60
- # @param klass [Class] Type of object to search.
61
- #
62
- # @return [Object] Returns the object if found. `nil` if not found.
63
- #
64
- # @api public
65
- #
66
- def self.search_object(metadata, klass)
67
- return nil if metadata.nil?
68
- if metadata[:described_class].is_a?(klass)
69
- metadata[:described_class]
70
- elsif metadata_has_parent?(metadata)
71
- search_object(metadata_parent(metadata), klass)
72
- end
73
- end
74
-
75
56
  #
76
57
  # Searches for an object in the description of the parent RSpec examples
77
58
  # that implements a specific method.
78
59
  #
79
60
  # @param metadata [Hash] RSpec metadata.
80
61
  # @param meth [Symbol] The method name.
81
- # @param arity [Integer] The arity of the method.
82
62
  #
83
63
  # @return [Array<Object>] Returns the objects list.
84
64
  #
85
65
  # @api public
86
66
  #
87
- def self.search_objects_with(metadata, meth, arity)
67
+ def self.search_objects_with(metadata, meth)
88
68
  o_ary = []
89
69
  return o_ary if metadata.nil?
90
70
  if metadata[:described_class].respond_to?(meth) &&
91
- metadata[:described_class].method(meth).arity == arity
71
+ metadata[:described_class] != self
92
72
  o_ary << metadata[:described_class]
93
73
  end
94
74
  return o_ary unless metadata_has_parent?(metadata)
95
- search_objects_with(metadata_parent(metadata), meth, arity) + o_ary
75
+ (search_objects_with(metadata_parent(metadata), meth) + o_ary).uniq
96
76
  end
97
77
 
98
78
  #
@@ -105,7 +85,7 @@ module Dockerspec
105
85
  # RSpec.configure do |c|
106
86
  # c.before(:each) do
107
87
  # metadata = RSpec.current_example.metadata
108
- # Dockerspec::Runner::Base.restore(metadata)
88
+ # Dockerspec::Runner::Base.restore_rspec_context(metadata)
109
89
  # end
110
90
  # end
111
91
  #
@@ -120,7 +100,7 @@ module Dockerspec
120
100
  def self.restore_rspec_context(metadata)
121
101
  o_ary =
122
102
  Helper::RSpecExampleHelpers
123
- .search_objects_with(metadata, :restore_rspec_context, 0)
103
+ .search_objects_with(metadata, :restore_rspec_context)
124
104
  o_ary.each(&:restore_rspec_context)
125
105
  end
126
106
  end
@@ -24,6 +24,10 @@
24
24
  #
25
25
  RSpec.configure do |config|
26
26
  config.color = true
27
- config.formatter = :documentation
28
- config.tty = true
27
+ config.formatter = :documentation if config.formatters.empty?
28
+ config.tty = $stdout.tty? if config.tty.nil?
29
+
30
+ # rspec-retry
31
+ config.verbose_retry = true if ENV['CI'] == 'true'
32
+ config.default_sleep_interval = 1
29
33
  end
@@ -188,7 +188,7 @@ module Dockerspec
188
188
  # used when the `:template` source is used.
189
189
  # @option opts [String] :tag Repository tag to be applied to the resulting
190
190
  # image.
191
- # @option opts [Fixnum, Symbol] :log_level Sets the docker library
191
+ # @option opts [Integer, Symbol] :log_level Sets the docker library
192
192
  # verbosity level. Possible values:
193
193
  # `:silent` or `0` (no output),
194
194
  # `:ci` or `1` (enables some outputs recommended for CI environments),
@@ -356,6 +356,7 @@ module Dockerspec
356
356
  def docker_run(*opts)
357
357
  runner = Dockerspec::Configuration.docker_runner.new(*opts)
358
358
  runner.run
359
+ runner.restore_rspec_context
359
360
  described_container(runner.container_name)
360
361
  runner
361
362
  end
@@ -418,7 +419,7 @@ module Dockerspec
418
419
  # @option opts [Symbol] :backend (calculated) Docker backend to use:
419
420
  # `:docker_compose`, `:docker_compose_lxc`.
420
421
  #
421
- # @return [Dockerspec::Runner::Compose] Runner object.
422
+ # @return [String] A description of the object.
422
423
  #
423
424
  # @raise [Dockerspec::DockerRunArgumentError] Raises this exception when
424
425
  # some required fields are missing.
@@ -433,6 +434,10 @@ module Dockerspec
433
434
  def docker_compose(*opts)
434
435
  runner = Dockerspec::Configuration.compose_runner.new(*opts)
435
436
  runner.run
437
+ # Disable storing Runner object on RSpec metadata, to avoid calling its
438
+ # {Runner#restore_rspec_context} method that it is also called in
439
+ # {ItsContainer#restore_rspec_context}:
440
+ runner.to_s
436
441
  end
437
442
 
438
443
  #
@@ -500,7 +505,9 @@ module Dockerspec
500
505
  # `:alpine`, `:arch`, `:coreos`, `:debian`, `:gentoo`, `:nixos`,
501
506
  # `:plamo`, `:poky`, `:redhat`, `:suse`.
502
507
  #
503
- # @return [Dockerspec::Runner::Compose] Runner object.
508
+ # @yield [] the block to run with the tests.
509
+ #
510
+ # @return void
504
511
  #
505
512
  # @raise [Dockerspec::DockerComposeError] Raises this exception when
506
513
  # you call `its_container` without calling `docker_compose`.
@@ -513,9 +520,10 @@ module Dockerspec
513
520
  raise ItsContainerError, ItsContainer::NO_DOCKER_COMPOSE_MESSAGE
514
521
  end
515
522
  container_opts = opts[0].is_a?(Hash) ? opts[0] : {}
516
- compose.select_container(container, container_opts)
523
+ its_container = ItsContainer.new(container, compose)
524
+ its_container.restore_rspec_context(container_opts)
517
525
  described_container(compose.container_name)
518
- describe(ItsContainer.new(container), *opts, &block)
526
+ describe(its_container, *opts, &block)
519
527
  end
520
528
 
521
529
  #
@@ -18,6 +18,7 @@
18
18
  #
19
19
 
20
20
  require 'dockerspec/runner/compose'
21
+ require 'dockerspec/runner/config_helpers'
21
22
  require 'dockerspec/helper/rspec_example_helpers'
22
23
  require 'dockerspec/exceptions'
23
24
 
@@ -28,6 +29,8 @@ module Dockerspec
28
29
  # This generates the object to use within `its_container` calls.
29
30
  #
30
31
  class ItsContainer
32
+ include Dockerspec::Runner::ConfigHelpers
33
+
31
34
  #
32
35
  # A message with description on how to avoid the error when you forget
33
36
  # specifying the docker container you want to test with Docker Compose.
@@ -50,22 +53,27 @@ For example:
50
53
  #
51
54
  # Constructs a `its_container` object.
52
55
  #
53
- # @param container [String] The name of the container.
56
+ # @param container_name [String] The name of the container.
57
+ # @param compose [Dockerspec::Runner::Compose] The compose object we
58
+ # working with.
54
59
  #
55
60
  # @return [Dockerspec::RSpec::Resource::ItsContainer] The
56
61
  # `its_container` object.
57
62
  #
58
63
  # @api public
59
64
  #
60
- def initialize(container)
61
- @container = container
65
+ def initialize(container_name, compose)
66
+ @container_name = container_name
67
+ @compose = compose
62
68
  end
63
69
 
64
70
  #
65
- # Restores the testing context from the RSpec metadata.
71
+ # Restores the testing context.
66
72
  #
67
- # Searches for {Dockerspec::Runner::Compose} objects in the RSpec
68
- # metadata and restores their context to run the tests.
73
+ # This is required for tests to run correctly if we are testing
74
+ # different containers within the same tests. That is because RSpec has
75
+ # two stages, one in which it generates the tests and another in which
76
+ # it runs them.
69
77
  #
70
78
  # This is called from the `before` block in the
71
79
  # *lib/dockerspec/runner/base.rb* file:
@@ -84,14 +92,26 @@ For example:
84
92
  #
85
93
  # @api public
86
94
  #
87
- def restore_rspec_context
88
- metadata = ::RSpec.current_example.metadata
89
- compose =
90
- Helper::RSpecExampleHelpers
91
- .search_object(metadata, Dockerspec::Runner::Compose)
92
- raise ItsContainerError, NO_DOCKER_COMPOSE_MESSAGE if compose.nil?
93
- compose.restore_rspec_context
94
- compose.select_container(@container)
95
+ def restore_rspec_context(opts = nil)
96
+ @compose.select_container(@container_name, opts)
97
+ @compose.restore_rspec_context
98
+ end
99
+
100
+ #
101
+ # Gets the selected container object.
102
+ #
103
+ # This method is used in {Dockerspec::Runner::ConfigHelpers} to get
104
+ # information from the selected container.
105
+ #
106
+ # @return [Docker::Container] The container object.
107
+ #
108
+ # @raise [Dockerspec::RunnerError] When cannot select the container to
109
+ # test.
110
+ #
111
+ # @api public
112
+ #
113
+ def container
114
+ @compose.container
95
115
  end
96
116
 
97
117
  #
@@ -102,7 +122,7 @@ For example:
102
122
  # @api public
103
123
  #
104
124
  def to_s
105
- "\"#{@container}\" container"
125
+ "\"#{@container_name}\" container"
106
126
  end
107
127
  end
108
128
  end
@@ -19,6 +19,7 @@
19
19
 
20
20
  require 'dockerspec/exceptions'
21
21
  require 'dockerspec/engine_list'
22
+ require 'dockerspec/runner/config_helpers'
22
23
  require 'dockerspec/helper/rspec_example_helpers'
23
24
 
24
25
  module Dockerspec
@@ -28,6 +29,8 @@ module Dockerspec
28
29
  # start docker containers.
29
30
  #
30
31
  class Base
32
+ include Dockerspec::Runner::ConfigHelpers
33
+
31
34
  #
32
35
  # The option key to set when you pass a string instead of a hash of
33
36
  # options.
@@ -0,0 +1,97 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author:: Xabier de Zuazo (<xabier@zuazo.org>)
4
+ # Copyright:: Copyright (c) 2017 Xabier de Zuazo
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ module Dockerspec
21
+ module Runner
22
+ #
23
+ # Some helpers to get information from a running container.
24
+ #
25
+ module ConfigHelpers
26
+ #
27
+ # Parse the stdout/stderr log binary stream.
28
+ #
29
+ # @example
30
+ # parse_log("String1") #=> "String1"
31
+ # parse_log("\x02\x00\x00\x00\x00\x00\x00\aSTDERR") #=> "STDERR"
32
+ #
33
+ # @param log [String] log to parse in binary format.
34
+ # @return [String] parsed log.
35
+ #
36
+ # @api private
37
+ #
38
+ def parse_log(log)
39
+ log.sub(/^.*?\a/, '')
40
+ end
41
+
42
+ #
43
+ # Returns the container *stdout* logs.
44
+ #
45
+ # @example Docker Run Example
46
+ # describe docker_run('mysql') do
47
+ # its(:stdout) { should include 'MySQL init process done.' }
48
+ # end
49
+ #
50
+ # @example Docker Compose Example
51
+ # describe docker_compose('.', wait: 30) do
52
+ # describe its_container(:db) do
53
+ # its(:stdout) { should include 'MySQL init process done.' }
54
+ # end
55
+ # end
56
+ #
57
+ # @return [String] The *stdout* logs.
58
+ #
59
+ # @raise [Dockerspec::RunnerError] When cannot select the container to
60
+ # test.
61
+ #
62
+ # @api public
63
+ #
64
+ def stdout
65
+ log = container.logs(stdout: true)
66
+ parse_log(log)
67
+ end
68
+
69
+ #
70
+ # Returns the container *stderr* logs.
71
+ #
72
+ # @example Docker Run Example
73
+ # describe docker_run('mysql') do
74
+ # its(:stderr) { should include 'mysqld: ready for connections.' }
75
+ # end
76
+ #
77
+ # @example Docker Compose Example
78
+ # describe docker_compose('.', wait: 30) do
79
+ # describe its_container(:myapp) do
80
+ # its(:stderr) { should eq '' }
81
+ # end
82
+ # end
83
+ #
84
+ # @return [String] The *stderr* logs.
85
+ #
86
+ # @raise [Dockerspec::RunnerError] When cannot select the container to
87
+ # test.
88
+ #
89
+ # @api public
90
+ #
91
+ def stderr
92
+ log = container.logs(stderr: true).to_s
93
+ parse_log(log)
94
+ end
95
+ end
96
+ end
97
+ end
@@ -25,5 +25,5 @@ module Dockerspec
25
25
  #
26
26
  # Dockerspec Ruby Gem version.
27
27
  #
28
- VERSION = '0.3.0'.freeze
28
+ VERSION = '0.4.0'.freeze
29
29
  end
@@ -43,7 +43,8 @@ RSpec.configure do |config|
43
43
  config.color = true
44
44
  config.tty = true
45
45
 
46
- config.include DockerspecTests
46
+ config.extend DockerspecTests
47
47
  end
48
48
 
49
+ include DockerspecTests
49
50
  DockerspecTests.init_engines
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dockerspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xabier de Zuazo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-28 00:00:00.000000000 Z
11
+ date: 2017-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docker-api
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-retry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.5.3
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.5.3
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: serverspec
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -325,6 +339,7 @@ files:
325
339
  - lib/dockerspec/runner.rb
326
340
  - lib/dockerspec/runner/base.rb
327
341
  - lib/dockerspec/runner/compose.rb
342
+ - lib/dockerspec/runner/config_helpers.rb
328
343
  - lib/dockerspec/runner/docker.rb
329
344
  - lib/dockerspec/runner/serverspec.rb
330
345
  - lib/dockerspec/runner/serverspec/base.rb
@@ -355,10 +370,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
355
370
  version: '0'
356
371
  requirements: []
357
372
  rubyforge_project:
358
- rubygems_version: 2.2.2
373
+ rubygems_version: 2.6.9
359
374
  signing_key:
360
375
  specification_version: 4
361
376
  summary: Dockerspec
362
377
  test_files:
363
378
  - spec/spec_helper.rb
364
- has_rdoc: