aruba 0.6.1 → 0.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +6 -0
- data/.rubocop.yml +3 -0
- data/.travis.yml +3 -0
- data/Gemfile +1 -1
- data/History.md +7 -2
- data/README.md +26 -15
- data/Rakefile +4 -1
- data/aruba.gemspec +2 -1
- data/config/rubocop/exclude.yml +160 -0
- data/config/rubocop/include.yml +0 -0
- data/features/file_system_commands.feature +23 -7
- data/features/support/custom_main.rb +2 -2
- data/features/support/env.rb +0 -1
- data/features/support/jruby.rb +1 -1
- data/lib/aruba/api.rb +217 -30
- data/lib/aruba/config.rb +8 -8
- data/lib/aruba/cucumber.rb +13 -21
- data/lib/aruba/in_process.rb +1 -1
- data/lib/aruba/jruby.rb +1 -1
- data/lib/aruba/reporting.rb +7 -8
- data/spec/aruba/api_spec.rb +136 -27
- data/spec/aruba/jruby_spec.rb +19 -17
- data/spec/spec_helper.rb +2 -38
- metadata +20 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: abc9ad9b84fa8e51541f65c4fd9182308fa90b4b
|
4
|
+
data.tar.gz: 8c9a74b73102f29b11a0bb3fbc3652f52bd84492
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f3fa2197e0e1aa64baa079883c9ea70ceb38df6fe7984f5bc973b15c8c46de8990384bf3cb674bf049c4619ff3484bac8e890a2301bd51e4c7766a48309d060
|
7
|
+
data.tar.gz: d063a1f78058c485fe09ecf31f66761e20104a6746e16baf2a9adce2ace692fa3c5a7d20d90b901c32399df33af78d2c1f1021efe6aa4f91803e67c1282387e3
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/History.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
-
## [master](https://github.com/cucumber/aruba/compare/v0.6.
|
1
|
+
## [master](https://github.com/cucumber/aruba/compare/v0.6.2...master)
|
2
2
|
|
3
|
-
## [
|
3
|
+
## [v0.6.2](https://github.com/cucumber/aruba/compare/v0.6.1...v0.6.2)
|
4
|
+
* Fixed minor issue #223)
|
5
|
+
* Added support for ruby 2.1.3 -- 2.1.5
|
6
|
+
* Added support for comparison to a fixture file
|
7
|
+
|
8
|
+
## [v0.6.1](https://github.com/cucumber/aruba/compare/v0.6.0...v0.6.1)
|
4
9
|
* Added support for ruby 2.1.2
|
5
10
|
* Added support for ~ expansion
|
6
11
|
* Added support for with_env
|
data/README.md
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
[![Build Status](https://travis-ci.org/cucumber/aruba.png)](http://travis-ci.org/cucumber/aruba)
|
1
|
+
[![Build Status](https://travis-ci.org/cucumber/aruba.png)](http://travis-ci.org/cucumber/aruba)
|
2
|
+
[![Gem Version](https://badge.fury.io/rb/aruba.svg)](http://badge.fury.io/rb/aruba)
|
3
|
+
[![Dependency Status](https://gemnasium.com/cucumber/aruba.png)](https://gemnasium.com/cucumber/aruba.png)
|
4
|
+
[![Code Climate](https://codeclimate.com/github/cucumber/aruba.png)](https://codeclimate.com/github/cucumber/aruba)
|
2
5
|
|
3
6
|
Aruba is Cucumber extension for testing command line applications written in any programming language. Features at a glance:
|
4
7
|
|
@@ -32,21 +35,29 @@ well. One might want to use it together with `rspec`.
|
|
32
35
|
1. Create a directory named `spec/support`
|
33
36
|
2. Create a file named `spec/support/aruba.rb` with:
|
34
37
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
+
```
|
39
|
+
require 'aruba/api'
|
40
|
+
require 'aruba/reporting'
|
38
41
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
RSpec.configure do |config|
|
43
|
+
config.include Aruba::Api
|
44
|
+
|
45
|
+
config.before(:each) do
|
46
|
+
restore_env
|
47
|
+
clean_current_dir
|
44
48
|
end
|
45
|
-
|
49
|
+
end
|
50
|
+
```
|
51
|
+
3. Add the following to your `spec/spec_helper.rb`
|
52
|
+
|
53
|
+
```
|
54
|
+
Dir.glob(::File.expand_path('../support/*.rb', __FILE__)).each { |f| require_relative f }
|
55
|
+
```
|
56
|
+
|
46
57
|
|
47
58
|
## API
|
48
59
|
|
49
|
-
`aruba` provides a
|
60
|
+
`aruba` provides a wonderful API to be used in your tests:
|
50
61
|
|
51
62
|
* Creating files/directories
|
52
63
|
* Deleting files/directories
|
@@ -54,7 +65,7 @@ well. One might want to use it together with `rspec`.
|
|
54
65
|
* Checking file existence/absence
|
55
66
|
* ...
|
56
67
|
|
57
|
-
A full documentation of the
|
68
|
+
A full documentation of the API can be found [here](http://www.rubydoc.info/github/cucumber/aruba/master/frames).
|
58
69
|
|
59
70
|
## Configuration
|
60
71
|
|
@@ -73,7 +84,7 @@ end
|
|
73
84
|
|
74
85
|
### Modify the PATH
|
75
86
|
|
76
|
-
Aruba will automatically add the `bin` directory of your project to the `PATH` environment variable for
|
87
|
+
Aruba will automatically add the `bin` directory of your project to the `PATH` environment variable for
|
77
88
|
the duration of each Cucumber scenario. So if you're developing a Ruby gem with a binary command, you
|
78
89
|
can test those commands as though the gem were already installed.
|
79
90
|
|
@@ -83,7 +94,7 @@ If you need other directories to be added to the `PATH`, you can put the followi
|
|
83
94
|
|
84
95
|
### Increasing timeouts
|
85
96
|
|
86
|
-
A process sometimes takes longer than expected to terminate, and Aruba will kill them off (and fail your scenario) if it is still alive after 3 seconds. If you need more time you can modify the timeout by assigning a different value to `@aruba_timeout_seconds` in a `Before` block:
|
97
|
+
A process sometimes takes longer than expected to terminate, and Aruba will kill them off (and fail your scenario) if it is still alive after 3 seconds. If you need more time you can modify the timeout by assigning a different value to `@aruba_timeout_seconds` in a `Before` block:
|
87
98
|
|
88
99
|
```ruby
|
89
100
|
Before do
|
@@ -262,7 +273,7 @@ Scenario: Make tea
|
|
262
273
|
## Making tea
|
263
274
|
* Get a pot
|
264
275
|
* And some hot water
|
265
|
-
|
276
|
+
|
266
277
|
Given...
|
267
278
|
```
|
268
279
|
|
data/Rakefile
CHANGED
@@ -23,7 +23,10 @@ RSpec::Core::RakeTask.new do |spec|
|
|
23
23
|
spec.rspec_opts = ['--color', '--format documentation']
|
24
24
|
end
|
25
25
|
|
26
|
+
require 'rubocop/rake_task'
|
27
|
+
RuboCop::RakeTask.new
|
28
|
+
|
26
29
|
desc "Run tests, both RSpec and Cucumber"
|
27
|
-
task :test => [:spec, :cucumber, :cucumber_wip]
|
30
|
+
task :test => [ :rubocop, :spec, :cucumber, :cucumber_wip]
|
28
31
|
|
29
32
|
task :default => :test
|
data/aruba.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'aruba'
|
5
|
-
s.version = '0.6.
|
5
|
+
s.version = '0.6.2'
|
6
6
|
s.authors = ["Aslak Hellesøy", "David Chelimsky", "Mike Sassak", "Matt Wynne"]
|
7
7
|
s.description = 'CLI Steps for Cucumber, hand-crafted for you in Aruba'
|
8
8
|
s.summary = "aruba-#{s.version}"
|
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.add_development_dependency 'rspec', '>= 3.0.0'
|
20
20
|
s.add_development_dependency 'fuubar', '>= 1.1.1'
|
21
21
|
s.add_development_dependency 'cucumber-pro', '~> 0.0'
|
22
|
+
s.add_development_dependency 'rubocop', '~> 0.26.0'
|
22
23
|
|
23
24
|
s.rubygems_version = ">= 1.6.1"
|
24
25
|
s.files = `git ls-files`.split("\n")
|
@@ -0,0 +1,160 @@
|
|
1
|
+
# Cop supports --auto-correct.
|
2
|
+
# Configuration parameters: SupportedStyles.
|
3
|
+
Style/HashSyntax:
|
4
|
+
Enabled: false
|
5
|
+
|
6
|
+
Lint/AmbiguousRegexpLiteral:
|
7
|
+
Enabled: false
|
8
|
+
|
9
|
+
# Cop supports --auto-correct.
|
10
|
+
Lint/RescueException:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
# Cop supports --auto-correct.
|
14
|
+
Lint/UnusedBlockArgument:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
# Cop supports --auto-correct.
|
18
|
+
Lint/UnusedMethodArgument:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
Lint/UselessAssignment:
|
22
|
+
Enabled: false
|
23
|
+
|
24
|
+
# Configuration parameters: AllowURI.
|
25
|
+
Metrics/LineLength:
|
26
|
+
Max: 169
|
27
|
+
|
28
|
+
# Configuration parameters: CountComments.
|
29
|
+
Metrics/MethodLength:
|
30
|
+
Max: 18
|
31
|
+
|
32
|
+
# Cop supports --auto-correct.
|
33
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
34
|
+
Style/AlignParameters:
|
35
|
+
Enabled: false
|
36
|
+
|
37
|
+
# Cop supports --auto-correct.
|
38
|
+
Style/Blocks:
|
39
|
+
Enabled: false
|
40
|
+
|
41
|
+
Style/CaseEquality:
|
42
|
+
Enabled: false
|
43
|
+
|
44
|
+
# Cop supports --auto-correct.
|
45
|
+
Style/CharacterLiteral:
|
46
|
+
Enabled: false
|
47
|
+
|
48
|
+
# Cop supports --auto-correct.
|
49
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
50
|
+
Style/ClassCheck:
|
51
|
+
Enabled: false
|
52
|
+
|
53
|
+
Style/ClassVars:
|
54
|
+
Enabled: false
|
55
|
+
|
56
|
+
# Cop supports --auto-correct.
|
57
|
+
# Configuration parameters: PreferredMethods.
|
58
|
+
Style/CollectionMethods:
|
59
|
+
Enabled: false
|
60
|
+
|
61
|
+
Style/Documentation:
|
62
|
+
Enabled: false
|
63
|
+
|
64
|
+
# Cop supports --auto-correct.
|
65
|
+
Style/EmptyLinesAroundBody:
|
66
|
+
Enabled: false
|
67
|
+
|
68
|
+
# Configuration parameters: MinBodyLength.
|
69
|
+
Style/GuardClause:
|
70
|
+
Enabled: false
|
71
|
+
|
72
|
+
# Configuration parameters: MaxLineLength.
|
73
|
+
Style/IfUnlessModifier:
|
74
|
+
Enabled: false
|
75
|
+
|
76
|
+
Style/Lambda:
|
77
|
+
Enabled: false
|
78
|
+
|
79
|
+
# Cop supports --auto-correct.
|
80
|
+
Style/LeadingCommentSpace:
|
81
|
+
Enabled: false
|
82
|
+
|
83
|
+
# Cop supports --auto-correct.
|
84
|
+
# Configuration parameters: PreferredDelimiters.
|
85
|
+
Style/PercentLiteralDelimiters:
|
86
|
+
Enabled: false
|
87
|
+
|
88
|
+
# Configuration parameters: SupportedStyles.
|
89
|
+
Style/RaiseArgs:
|
90
|
+
EnforcedStyle: compact
|
91
|
+
|
92
|
+
# Cop supports --auto-correct.
|
93
|
+
Style/RedundantSelf:
|
94
|
+
Enabled: false
|
95
|
+
|
96
|
+
# Configuration parameters: MaxSlashes.
|
97
|
+
Style/RegexpLiteral:
|
98
|
+
Enabled: false
|
99
|
+
|
100
|
+
# Cop supports --auto-correct.
|
101
|
+
# Configuration parameters: AllowAsExpressionSeparator.
|
102
|
+
Style/Semicolon:
|
103
|
+
Enabled: false
|
104
|
+
|
105
|
+
# Cop supports --auto-correct.
|
106
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
107
|
+
Style/SignalException:
|
108
|
+
Enabled: false
|
109
|
+
|
110
|
+
# Configuration parameters: Methods.
|
111
|
+
Style/SingleLineBlockParams:
|
112
|
+
Enabled: false
|
113
|
+
|
114
|
+
# Cop supports --auto-correct.
|
115
|
+
Style/SingleSpaceBeforeFirstArg:
|
116
|
+
Enabled: false
|
117
|
+
|
118
|
+
# Cop supports --auto-correct.
|
119
|
+
Style/SpaceAfterComma:
|
120
|
+
Enabled: false
|
121
|
+
|
122
|
+
# Cop supports --auto-correct.
|
123
|
+
Style/SpaceAfterControlKeyword:
|
124
|
+
Enabled: false
|
125
|
+
|
126
|
+
# Cop supports --auto-correct.
|
127
|
+
Style/SpaceAfterNot:
|
128
|
+
Enabled: false
|
129
|
+
|
130
|
+
# Cop supports --auto-correct.
|
131
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
132
|
+
Style/SpaceBeforeBlockBraces:
|
133
|
+
Enabled: false
|
134
|
+
|
135
|
+
# Cop supports --auto-correct.
|
136
|
+
Style/SpaceBeforeComma:
|
137
|
+
Enabled: false
|
138
|
+
|
139
|
+
# Cop supports --auto-correct.
|
140
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
|
141
|
+
Style/SpaceInsideBlockBraces:
|
142
|
+
Enabled: false
|
143
|
+
|
144
|
+
# Cop supports --auto-correct.
|
145
|
+
Style/SpaceInsideBrackets:
|
146
|
+
Enabled: false
|
147
|
+
|
148
|
+
# Cop supports --auto-correct.
|
149
|
+
Style/SpaceInsideParens:
|
150
|
+
Enabled: false
|
151
|
+
|
152
|
+
# Cop supports --auto-correct.
|
153
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
154
|
+
Style/StringLiterals:
|
155
|
+
Enabled: false
|
156
|
+
|
157
|
+
# Cop supports --auto-correct.
|
158
|
+
# Configuration parameters: ExactNameMatch, AllowPredicates, AllowDSLWriters, Whitelist.
|
159
|
+
Style/TrivialAccessors:
|
160
|
+
Enabled: false
|
File without changes
|
@@ -3,12 +3,12 @@ Feature: file system commands
|
|
3
3
|
In order to specify commands that load files
|
4
4
|
As a developer using Cucumber
|
5
5
|
I want to create temporary files
|
6
|
-
|
6
|
+
|
7
7
|
Scenario: create a dir
|
8
8
|
Given a directory named "foo/bar"
|
9
9
|
When I run `file foo/bar`
|
10
10
|
Then the stdout should contain "foo/bar: directory"
|
11
|
-
|
11
|
+
|
12
12
|
Scenario: create a file
|
13
13
|
Given a file named "foo/bar/example.txt" with:
|
14
14
|
"""
|
@@ -33,12 +33,12 @@ Feature: file system commands
|
|
33
33
|
Given a file named "foo/bar/example.txt" with:
|
34
34
|
"""
|
35
35
|
hello world
|
36
|
-
|
36
|
+
|
37
37
|
"""
|
38
38
|
When I append to "foo/bar/example.txt" with:
|
39
39
|
"""
|
40
40
|
this was appended
|
41
|
-
|
41
|
+
|
42
42
|
"""
|
43
43
|
When I run `cat foo/bar/example.txt`
|
44
44
|
Then the stdout should contain "hello world"
|
@@ -51,12 +51,12 @@ Feature: file system commands
|
|
51
51
|
|
52
52
|
Scenario: clean up files generated in previous scenario
|
53
53
|
Then the file "foo/bar/example.txt" should not exist
|
54
|
-
|
54
|
+
|
55
55
|
Scenario: change to a subdir
|
56
56
|
Given a file named "foo/bar/example.txt" with:
|
57
57
|
"""
|
58
58
|
hello world
|
59
|
-
|
59
|
+
|
60
60
|
"""
|
61
61
|
When I cd to "foo/bar"
|
62
62
|
And I run `cat example.txt`
|
@@ -128,7 +128,7 @@ Feature: file system commands
|
|
128
128
|
Then a directory named "foo/bar" should not exist
|
129
129
|
"""
|
130
130
|
|
131
|
-
Scenario: Check file contents
|
131
|
+
Scenario: Check file contents with text
|
132
132
|
Given a file named "foo" with:
|
133
133
|
"""
|
134
134
|
hello world
|
@@ -158,6 +158,22 @@ Feature: file system commands
|
|
158
158
|
baz
|
159
159
|
"""
|
160
160
|
|
161
|
+
Scenario: Check file contents with another file
|
162
|
+
Given a file named "foo" with:
|
163
|
+
"""
|
164
|
+
hello world
|
165
|
+
"""
|
166
|
+
And a file named "bar" with:
|
167
|
+
"""
|
168
|
+
hello world
|
169
|
+
"""
|
170
|
+
And a file named "nonbar" with:
|
171
|
+
"""
|
172
|
+
hello another world
|
173
|
+
"""
|
174
|
+
Then the file "foo" should be equal to file "bar"
|
175
|
+
And the file "foo" should not be equal to file "nonbar"
|
176
|
+
|
161
177
|
Scenario: Remove file
|
162
178
|
Given a file named "foo" with:
|
163
179
|
"""
|
@@ -10,7 +10,7 @@ class CustomMain
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def execute!
|
13
|
-
@stdout.puts(@argv.map
|
13
|
+
@stdout.puts(@argv.map(&:reverse).join(' '))
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -21,4 +21,4 @@ end
|
|
21
21
|
|
22
22
|
After('~@in-process') do
|
23
23
|
Aruba.process = Aruba::SpawnProcess
|
24
|
-
end
|
24
|
+
end
|
data/features/support/env.rb
CHANGED
data/features/support/jruby.rb
CHANGED
data/lib/aruba/api.rb
CHANGED
@@ -10,6 +10,33 @@ module Aruba
|
|
10
10
|
module Api
|
11
11
|
include RSpec::Matchers
|
12
12
|
|
13
|
+
# Expand file name
|
14
|
+
#
|
15
|
+
# @param [String] file_name
|
16
|
+
# Name of file
|
17
|
+
#
|
18
|
+
# @return [String]
|
19
|
+
# The full path
|
20
|
+
#
|
21
|
+
# @example Single file name
|
22
|
+
#
|
23
|
+
# # => <path>/tmp/aruba/file
|
24
|
+
# absolute_path('file')
|
25
|
+
#
|
26
|
+
# @example Single Dot
|
27
|
+
#
|
28
|
+
# # => <path>/tmp/aruba
|
29
|
+
# absolute_path('.')
|
30
|
+
#
|
31
|
+
# @example Join and Expand path
|
32
|
+
#
|
33
|
+
# # => <path>/tmp/aruba/path/file
|
34
|
+
# absolute_path('path', 'file')
|
35
|
+
#
|
36
|
+
def absolute_path(*args)
|
37
|
+
in_current_dir { File.expand_path File.join(*args) }
|
38
|
+
end
|
39
|
+
|
13
40
|
# Execute block in current directory
|
14
41
|
#
|
15
42
|
# @yield
|
@@ -48,7 +75,7 @@ module Aruba
|
|
48
75
|
# @return [Array]
|
49
76
|
# The directory path: Each subdirectory is a member of an array
|
50
77
|
def dirs
|
51
|
-
@dirs ||=
|
78
|
+
@dirs ||= %w(tmp aruba)
|
52
79
|
end
|
53
80
|
|
54
81
|
# Create a file with given content
|
@@ -65,6 +92,21 @@ module Aruba
|
|
65
92
|
_create_file(file_name, file_content, false)
|
66
93
|
end
|
67
94
|
|
95
|
+
# Create an empty file
|
96
|
+
#
|
97
|
+
# @param [String] file_name
|
98
|
+
# The name of the file
|
99
|
+
def touch_file(file_name)
|
100
|
+
in_current_dir do
|
101
|
+
file_name = File.expand_path(file_name)
|
102
|
+
_mkdir(File.dirname(file_name))
|
103
|
+
|
104
|
+
FileUtils.touch file_name
|
105
|
+
end
|
106
|
+
|
107
|
+
self
|
108
|
+
end
|
109
|
+
|
68
110
|
# Create a file with the given size
|
69
111
|
#
|
70
112
|
# The method does not check if file already exists. If the file name is a
|
@@ -88,6 +130,7 @@ module Aruba
|
|
88
130
|
_create_file(file_name, file_content, true)
|
89
131
|
end
|
90
132
|
|
133
|
+
# @private
|
91
134
|
def _create_file(file_name, file_content, check_presence)
|
92
135
|
in_current_dir do
|
93
136
|
file_name = File.expand_path(file_name)
|
@@ -97,6 +140,8 @@ module Aruba
|
|
97
140
|
_mkdir(File.dirname(file_name))
|
98
141
|
File.open(file_name, 'w') { |f| f << file_content }
|
99
142
|
end
|
143
|
+
|
144
|
+
self
|
100
145
|
end
|
101
146
|
|
102
147
|
# Change file system permissions of file
|
@@ -119,6 +164,8 @@ module Aruba
|
|
119
164
|
end
|
120
165
|
end
|
121
166
|
|
167
|
+
# @private
|
168
|
+
# @deprecated
|
122
169
|
def chmod(*args, &block)
|
123
170
|
warn('The use of "chmod" is deprecated. Use "filesystem_permissions" instead')
|
124
171
|
|
@@ -154,12 +201,15 @@ module Aruba
|
|
154
201
|
end
|
155
202
|
end
|
156
203
|
|
204
|
+
# @private
|
205
|
+
# @deprecated
|
157
206
|
def mod?(*args, &block)
|
158
207
|
warn('The use of "mod?" is deprecated. Use "check_filesystem_permissions" instead')
|
159
208
|
|
160
209
|
check_filesystem_permissions(*args, &block)
|
161
210
|
end
|
162
211
|
|
212
|
+
# @private
|
163
213
|
def _create_fixed_size_file(file_name, file_size, check_presence)
|
164
214
|
in_current_dir do
|
165
215
|
file_name = File.expand_path(file_name)
|
@@ -206,6 +256,8 @@ module Aruba
|
|
206
256
|
in_current_dir do
|
207
257
|
_mkdir(directory_name)
|
208
258
|
end
|
259
|
+
|
260
|
+
self
|
209
261
|
end
|
210
262
|
|
211
263
|
# Remove directory
|
@@ -227,9 +279,9 @@ module Aruba
|
|
227
279
|
#
|
228
280
|
# @param [true,false] expect_presence
|
229
281
|
# Should the given paths be present (true) or absent (false)
|
230
|
-
def check_file_presence(paths, expect_presence)
|
282
|
+
def check_file_presence(paths, expect_presence = true)
|
231
283
|
prep_for_fs_check do
|
232
|
-
paths.each do |path|
|
284
|
+
Array(paths).each do |path|
|
233
285
|
if path.kind_of? Regexp
|
234
286
|
if expect_presence
|
235
287
|
expect(Dir.glob('**/*')).to include_regexp(path)
|
@@ -310,34 +362,57 @@ module Aruba
|
|
310
362
|
# @param [String] file
|
311
363
|
# The file to be checked
|
312
364
|
#
|
313
|
-
# @param [String]
|
314
|
-
# The content which must/must not be in the file
|
365
|
+
# @param [String, Regexp] content
|
366
|
+
# The content which must/must not be in the file. If content is
|
367
|
+
# a String exact match is done, if content is a Regexp then file
|
368
|
+
# is matched using regular expression
|
315
369
|
#
|
316
370
|
# @param [true, false] expect_match
|
317
371
|
# Must the content be in the file or not
|
318
|
-
def check_file_content(file,
|
319
|
-
|
372
|
+
def check_file_content(file, content, expect_match = true)
|
373
|
+
match_content =
|
374
|
+
if(Regexp === content)
|
375
|
+
match(content)
|
376
|
+
else
|
377
|
+
eq(content)
|
378
|
+
end
|
320
379
|
prep_for_fs_check do
|
321
|
-
|
322
|
-
content = IO.read(file)
|
323
|
-
|
380
|
+
content = IO.read(File.expand_path(file))
|
324
381
|
if expect_match
|
325
|
-
expect(content).to
|
382
|
+
expect(content).to match_content
|
326
383
|
else
|
327
|
-
expect(content).not_to
|
384
|
+
expect(content).not_to match_content
|
328
385
|
end
|
329
386
|
end
|
330
387
|
end
|
331
388
|
|
332
|
-
#
|
389
|
+
# @private
|
390
|
+
# @deprecated
|
391
|
+
def check_exact_file_content(file, exact_content, expect_match = true)
|
392
|
+
warn('The use of "check_exact_file_content" is deprecated. Use "#check_file_content" with a string instead.')
|
393
|
+
|
394
|
+
check_file_content(file, exact_content, expect_match)
|
395
|
+
end
|
396
|
+
|
397
|
+
# Check if the content of file against the content of a reference file
|
333
398
|
#
|
334
399
|
# @param [String] file
|
335
400
|
# The file to be checked
|
336
401
|
#
|
337
|
-
# @param [String]
|
338
|
-
# The
|
339
|
-
|
340
|
-
|
402
|
+
# @param [String] reference_file
|
403
|
+
# The reference file
|
404
|
+
#
|
405
|
+
# @param [true, false] expect_match
|
406
|
+
# Must the content be in the file or not
|
407
|
+
def check_binary_file_content(file, reference_file, expect_match = true)
|
408
|
+
prep_for_fs_check do
|
409
|
+
identical = FileUtils.compare_file(file, reference_file)
|
410
|
+
if expect_match
|
411
|
+
expect(identical).to be(true), "The file \"#{file}\" differs from file \"#{reference_file}\""
|
412
|
+
else
|
413
|
+
expect(identical).not_to be(true), "The file \"#{file}\" is identical to file \"#{reference_file}\""
|
414
|
+
end
|
415
|
+
end
|
341
416
|
end
|
342
417
|
|
343
418
|
# Check presence of a directory
|
@@ -361,17 +436,20 @@ module Aruba
|
|
361
436
|
end
|
362
437
|
end
|
363
438
|
|
439
|
+
# @private
|
364
440
|
def prep_for_fs_check(&block)
|
365
441
|
stop_processes!
|
366
442
|
in_current_dir{ block.call }
|
367
443
|
end
|
368
444
|
|
445
|
+
# @private
|
369
446
|
def _mkdir(dir_name)
|
370
447
|
dir_name = File.expand_path(dir_name)
|
371
448
|
|
372
449
|
FileUtils.mkdir_p(dir_name) unless File.directory?(dir_name)
|
373
450
|
end
|
374
451
|
|
452
|
+
# @private
|
375
453
|
def _rm_rf(dir_name)
|
376
454
|
dir_name = File.expand_path(dir_name)
|
377
455
|
|
@@ -391,10 +469,6 @@ module Aruba
|
|
391
469
|
string
|
392
470
|
end
|
393
471
|
|
394
|
-
def regexp(string_or_regexp)
|
395
|
-
Regexp === string_or_regexp ? string_or_regexp : Regexp.compile(Regexp.escape(string_or_regexp))
|
396
|
-
end
|
397
|
-
|
398
472
|
# Fetch output (stdout, stderr) from command
|
399
473
|
#
|
400
474
|
# @param [String] cmd
|
@@ -422,40 +496,72 @@ module Aruba
|
|
422
496
|
get_process(cmd).stderr
|
423
497
|
end
|
424
498
|
|
499
|
+
# Get stdout of all processes
|
500
|
+
#
|
501
|
+
# @return [String]
|
502
|
+
# The stdout of all process which have run before
|
425
503
|
def all_stdout
|
426
504
|
stop_processes!
|
427
505
|
only_processes.inject("") { |out, ps| out << ps.stdout }
|
428
506
|
end
|
429
507
|
|
508
|
+
# Get stderr of all processes
|
509
|
+
#
|
510
|
+
# @return [String]
|
511
|
+
# The stderr of all process which have run before
|
430
512
|
def all_stderr
|
431
513
|
stop_processes!
|
432
514
|
only_processes.inject("") { |out, ps| out << ps.stderr }
|
433
515
|
end
|
434
516
|
|
517
|
+
# Get stderr and stdout of all processes
|
518
|
+
#
|
519
|
+
# @return [String]
|
520
|
+
# The stderr and stdout of all process which have run before
|
435
521
|
def all_output
|
436
522
|
all_stdout << all_stderr
|
437
523
|
end
|
438
524
|
|
525
|
+
# Full compare arg1 and arg2
|
526
|
+
#
|
527
|
+
# @return [TrueClass, FalseClass]
|
528
|
+
# If arg1 is exactly the same as arg2 return true, otherwise false
|
439
529
|
def assert_exact_output(expected, actual)
|
440
530
|
actual.force_encoding(expected.encoding) if RUBY_VERSION >= "1.9"
|
441
531
|
expect(unescape(actual)).to eq unescape(expected)
|
442
532
|
end
|
443
533
|
|
534
|
+
# Partial compare arg1 and arg2
|
535
|
+
#
|
536
|
+
# @return [TrueClass, FalseClass]
|
537
|
+
# If arg2 contains arg1 return true, otherwise false
|
444
538
|
def assert_partial_output(expected, actual)
|
445
539
|
actual.force_encoding(expected.encoding) if RUBY_VERSION >= "1.9"
|
446
540
|
expect(unescape(actual)).to include(unescape(expected))
|
447
541
|
end
|
448
542
|
|
543
|
+
# Regex Compare arg1 and arg2
|
544
|
+
#
|
545
|
+
# @return [TrueClass, FalseClass]
|
546
|
+
# If arg2 matches arg1 return true, otherwise false
|
449
547
|
def assert_matching_output(expected, actual)
|
450
548
|
actual.force_encoding(expected.encoding) if RUBY_VERSION >= "1.9"
|
451
549
|
expect(unescape(actual)).to match /#{unescape(expected)}/m
|
452
550
|
end
|
453
551
|
|
552
|
+
# Negative regex compare arg1 and arg2
|
553
|
+
#
|
554
|
+
# @return [TrueClass, FalseClass]
|
555
|
+
# If arg2 does not match arg1 return true, otherwise false
|
454
556
|
def assert_not_matching_output(expected, actual)
|
455
557
|
actual.force_encoding(expected.encoding) if RUBY_VERSION >= "1.9"
|
456
|
-
expect(unescape(actual)).not_to match
|
558
|
+
expect(unescape(actual)).not_to match(/#{unescape(expected)}/m)
|
457
559
|
end
|
458
560
|
|
561
|
+
# Negative partial compare arg1 and arg2
|
562
|
+
#
|
563
|
+
# @return [TrueClass, FalseClass]
|
564
|
+
# If arg2 does not match/include arg1 return true, otherwise false
|
459
565
|
def assert_no_partial_output(unexpected, actual)
|
460
566
|
actual.force_encoding(unexpected.encoding) if RUBY_VERSION >= "1.9"
|
461
567
|
if Regexp === unexpected
|
@@ -465,24 +571,44 @@ module Aruba
|
|
465
571
|
end
|
466
572
|
end
|
467
573
|
|
574
|
+
# Partial compare output of interactive command and arg1
|
575
|
+
#
|
576
|
+
# @return [TrueClass, FalseClass]
|
577
|
+
# If output of interactive command includes arg1 return true, otherwise false
|
468
578
|
def assert_partial_output_interactive(expected)
|
469
579
|
unescape(_read_interactive).include?(unescape(expected)) ? true : false
|
470
580
|
end
|
471
581
|
|
582
|
+
# Check if command succeeded and if arg1 is included in output
|
583
|
+
#
|
584
|
+
# @return [TrueClass, FalseClass]
|
585
|
+
# If exit status is 0 and arg1 is included in output return true, otherwise false
|
472
586
|
def assert_passing_with(expected)
|
473
|
-
|
587
|
+
assert_success(true)
|
588
|
+
assert_partial_output(expected, all_output)
|
474
589
|
end
|
475
590
|
|
591
|
+
# Check if command failed and if arg1 is included in output
|
592
|
+
#
|
593
|
+
# @return [TrueClass, FalseClass]
|
594
|
+
# If exit status is not equal 0 and arg1 is included in output return true, otherwise false
|
476
595
|
def assert_failing_with(expected)
|
477
|
-
|
596
|
+
assert_success(false)
|
597
|
+
assert_partial_output(expected, all_output)
|
478
598
|
end
|
479
599
|
|
600
|
+
# @private
|
601
|
+
# @deprecated
|
480
602
|
def assert_exit_status_and_partial_output(expect_to_pass, expected)
|
603
|
+
warn('The use of "assert_exit_status_and_partial_output" is deprecated. Use "#assert_access" and "#assert_partial_output" instead.')
|
604
|
+
|
481
605
|
assert_success(expect_to_pass)
|
482
606
|
assert_partial_output(expected, all_output)
|
483
607
|
end
|
484
608
|
|
485
609
|
# TODO: Remove this. Call more methods elsewhere instead. Reveals more intent.
|
610
|
+
# @private
|
611
|
+
# @deprecated
|
486
612
|
def assert_exit_status_and_output(expect_to_pass, expected_output, expect_exact_output)
|
487
613
|
assert_success(expect_to_pass)
|
488
614
|
if expect_exact_output
|
@@ -492,34 +618,45 @@ module Aruba
|
|
492
618
|
end
|
493
619
|
end
|
494
620
|
|
621
|
+
# Check exit status of process
|
622
|
+
#
|
623
|
+
# @return [TrueClass, FalseClass]
|
624
|
+
# If arg1 is true, return true if command was successful
|
625
|
+
# If arg1 is false, return true if command failed
|
495
626
|
def assert_success(success)
|
496
627
|
success ? assert_exit_status(0) : assert_not_exit_status(0)
|
497
628
|
end
|
498
629
|
|
630
|
+
# @private
|
499
631
|
def assert_exit_status(status)
|
500
632
|
expect(last_exit_status).to eq(status),
|
501
633
|
append_output_to("Exit status was #{last_exit_status} but expected it to be #{status}.")
|
502
634
|
end
|
503
635
|
|
636
|
+
# @private
|
504
637
|
def assert_not_exit_status(status)
|
505
638
|
expect(last_exit_status).not_to eq(status),
|
506
639
|
append_output_to("Exit status was #{last_exit_status} which was not expected.")
|
507
640
|
end
|
508
641
|
|
642
|
+
# @private
|
509
643
|
def append_output_to(message)
|
510
644
|
"#{message} Output:\n\n#{all_output}\n"
|
511
645
|
end
|
512
646
|
|
647
|
+
# @private
|
513
648
|
def processes
|
514
649
|
@processes ||= []
|
515
650
|
end
|
516
651
|
|
652
|
+
# @private
|
517
653
|
def stop_processes!
|
518
654
|
processes.each do |_, process|
|
519
655
|
stop_process(process)
|
520
656
|
end
|
521
657
|
end
|
522
658
|
|
659
|
+
# Terminate all running processes
|
523
660
|
def terminate_processes!
|
524
661
|
processes.each do |_, process|
|
525
662
|
terminate_process(process)
|
@@ -527,16 +664,19 @@ module Aruba
|
|
527
664
|
end
|
528
665
|
end
|
529
666
|
|
667
|
+
# @private
|
530
668
|
def register_process(name, process)
|
531
669
|
processes << [name, process]
|
532
670
|
end
|
533
671
|
|
672
|
+
# @private
|
534
673
|
def get_process(wanted)
|
535
674
|
matching_processes = processes.reverse.find{ |name, _| name == wanted }
|
536
675
|
raise ArgumentError.new("No process named '#{wanted}' has been started") unless matching_processes
|
537
676
|
matching_processes.last
|
538
677
|
end
|
539
678
|
|
679
|
+
# @private
|
540
680
|
def only_processes
|
541
681
|
processes.collect{ |_, process| process }
|
542
682
|
end
|
@@ -571,17 +711,38 @@ module Aruba
|
|
571
711
|
|
572
712
|
DEFAULT_TIMEOUT_SECONDS = 3
|
573
713
|
|
714
|
+
# Default exit timeout for running commands with aruba
|
715
|
+
#
|
716
|
+
# Overwrite this method if you want a different timeout or set
|
717
|
+
# `@aruba_timeout_seconds`.
|
574
718
|
def exit_timeout
|
575
719
|
@aruba_timeout_seconds || DEFAULT_TIMEOUT_SECONDS
|
576
720
|
end
|
577
721
|
|
578
722
|
DEFAULT_IO_WAIT_SECONDS = 0.1
|
579
723
|
|
724
|
+
# Default io wait timeout
|
725
|
+
#
|
726
|
+
# Overwrite this method if you want a different timeout or set
|
727
|
+
# `@aruba_io_wait_seconds
|
580
728
|
def io_wait
|
581
729
|
@aruba_io_wait_seconds || DEFAULT_IO_WAIT_SECONDS
|
582
730
|
end
|
583
731
|
|
584
|
-
|
732
|
+
# Run a command with aruba
|
733
|
+
#
|
734
|
+
# Checks for error during command execution and checks the output to detect
|
735
|
+
# an timeout error.
|
736
|
+
#
|
737
|
+
# @param [String] cmd
|
738
|
+
# The command to be executed
|
739
|
+
#
|
740
|
+
# @param [TrueClass,FalseClass] fail_on_error
|
741
|
+
# Should aruba fail on error?
|
742
|
+
#
|
743
|
+
# @param [Integer] timeout
|
744
|
+
# Timeout for execution
|
745
|
+
def run_simple(cmd, fail_on_error = true, timeout = nil)
|
585
746
|
run(cmd, timeout) do |process|
|
586
747
|
stop_process(process)
|
587
748
|
end
|
@@ -593,6 +754,8 @@ module Aruba
|
|
593
754
|
#
|
594
755
|
# @param [String] cmd
|
595
756
|
# The command to by run
|
757
|
+
#
|
758
|
+
# @see #cmd
|
596
759
|
def run_interactive(cmd)
|
597
760
|
@interactive = run(cmd)
|
598
761
|
end
|
@@ -611,24 +774,30 @@ module Aruba
|
|
611
774
|
@interactive.stdin.close
|
612
775
|
end
|
613
776
|
|
777
|
+
# @deprecated
|
778
|
+
# @private
|
614
779
|
def eot
|
615
780
|
warn(%{\e[35m The \"#eot\"-method is deprecated. It will be deleted with the next major version. Please use \"#close_input\"-method instead.\e[0m})
|
616
781
|
close_input
|
617
782
|
end
|
618
783
|
|
784
|
+
# @private
|
619
785
|
def _write_interactive(input)
|
620
786
|
@interactive.stdin.write(input)
|
621
787
|
@interactive.stdin.flush
|
622
788
|
end
|
623
789
|
|
790
|
+
# @private
|
624
791
|
def _read_interactive
|
625
792
|
@interactive.read_stdout
|
626
793
|
end
|
627
794
|
|
795
|
+
# @private
|
628
796
|
def _ensure_newline(str)
|
629
797
|
str.chomp << "\n"
|
630
798
|
end
|
631
799
|
|
800
|
+
# @private
|
632
801
|
def announce_or_puts(msg)
|
633
802
|
if(@puts)
|
634
803
|
Kernel.puts(msg)
|
@@ -637,6 +806,7 @@ module Aruba
|
|
637
806
|
end
|
638
807
|
end
|
639
808
|
|
809
|
+
# @private
|
640
810
|
def detect_ruby(cmd)
|
641
811
|
if cmd =~ /^ruby\s/
|
642
812
|
cmd.gsub(/^ruby\s/, "#{current_ruby} ")
|
@@ -645,14 +815,21 @@ module Aruba
|
|
645
815
|
end
|
646
816
|
end
|
647
817
|
|
818
|
+
# @private
|
648
819
|
def current_ruby
|
649
820
|
File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
|
650
821
|
end
|
651
822
|
|
823
|
+
# Use a clean rvm gemset
|
824
|
+
#
|
825
|
+
# Please make sure that you've got [rvm](http://rvm.io/) installed.
|
826
|
+
#
|
827
|
+
# @param [String] gemset
|
828
|
+
# The name of the gemset to be used
|
652
829
|
def use_clean_gemset(gemset)
|
653
830
|
run_simple(%{rvm gemset create "#{gemset}"}, true)
|
654
831
|
if all_stdout =~ /'#{gemset}' gemset created \((.*)\)\./
|
655
|
-
gem_home =
|
832
|
+
gem_home = Regexp.last_match[1]
|
656
833
|
set_env('GEM_HOME', gem_home)
|
657
834
|
set_env('GEM_PATH', gem_home)
|
658
835
|
set_env('BUNDLE_PATH', gem_home)
|
@@ -667,6 +844,7 @@ module Aruba
|
|
667
844
|
end
|
668
845
|
end
|
669
846
|
|
847
|
+
# Unset variables used by bundler
|
670
848
|
def unset_bundler_env_vars
|
671
849
|
%w[RUBYOPT BUNDLE_PATH BUNDLE_BIN_PATH BUNDLE_GEMFILE].each do |key|
|
672
850
|
set_env(key, nil)
|
@@ -697,20 +875,29 @@ module Aruba
|
|
697
875
|
end
|
698
876
|
end
|
699
877
|
|
878
|
+
# @private
|
700
879
|
def original_env
|
701
880
|
@original_env ||= {}
|
702
881
|
end
|
703
882
|
|
883
|
+
# Run block with environment
|
884
|
+
#
|
885
|
+
# @param [Hash] env
|
886
|
+
# The variables to be used for block.
|
887
|
+
#
|
888
|
+
# @yield
|
889
|
+
# The block of code which should be run with the modified environment variables
|
704
890
|
def with_env(env = {}, &block)
|
705
891
|
env.each do |k,v|
|
706
892
|
set_env k, v
|
707
|
-
block.call
|
708
|
-
restore_env
|
709
893
|
end
|
894
|
+
block.call
|
895
|
+
restore_env
|
710
896
|
end
|
711
897
|
|
712
|
-
|
713
|
-
|
898
|
+
# TODO: move some more methods under here!
|
899
|
+
|
900
|
+
private
|
714
901
|
|
715
902
|
def last_exit_status
|
716
903
|
return @last_exit_status if @last_exit_status
|