hydra 0.15.0 → 0.15.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -20,12 +20,9 @@ In your rakefile:
20
20
  require 'hydra/tasks'
21
21
 
22
22
  Hydra::TestTask.new('hydra') do |t|
23
- # test unit
24
23
  t.add_files 'test/unit/**/*_test.rb'
25
24
  t.add_files 'test/functional/**/*_test.rb'
26
25
  t.add_files 'test/integration/**/*_test.rb'
27
- # cucumber
28
- t.add_files 'features/**/*.feature'
29
26
  end
30
27
 
31
28
  Run:
@@ -35,6 +32,23 @@ Run:
35
32
  Hydra defaults to Single Core mode, so you may want to configure it
36
33
  to use two (or more) of your cores if you have a multi-processing machine.
37
34
 
35
+ == Hydra + Cucumber
36
+
37
+ Hydra can run cucumber features, but because of cucumber's specialized
38
+ environment, cucumber features have to be run after your other tests.
39
+
40
+ Hydra::TestTask.new('hydra') do |t|
41
+ t.add_files 'test/unit/**/*_test.rb'
42
+ t.add_files 'test/functional/**/*_test.rb'
43
+ t.add_files 'test/integration/**/*_test.rb'
44
+ # cucumber
45
+ t.autosort = false
46
+ t.add_files 'features/**/*.feature'
47
+ end
48
+
49
+ Hydra's autosort feature sorts files by their runtime, so we
50
+ have to disable it in order to run cucumber features at the end
51
+
38
52
  == Supported frameworks
39
53
 
40
54
  Right now hydra only supports a few frameworks:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.15.0
1
+ 0.15.1
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{hydra}
8
- s.version = "0.15.0"
8
+ s.version = "0.15.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Nick Gauthier"]
12
- s.date = %q{2010-03-30}
12
+ s.date = %q{2010-03-31}
13
13
  s.description = %q{Spread your tests over multiple machines to test your code faster.}
14
14
  s.email = %q{nick@smartlogicsolutions.com}
15
15
  s.extra_rdoc_files = [
@@ -54,6 +54,7 @@ Gem::Specification.new do |s|
54
54
  "test/fixtures/assert_true.rb",
55
55
  "test/fixtures/config.yml",
56
56
  "test/fixtures/features/step_definitions.rb",
57
+ "test/fixtures/features/write_alternate_file.feature",
57
58
  "test/fixtures/features/write_file.feature",
58
59
  "test/fixtures/hello_world.rb",
59
60
  "test/fixtures/slow.rb",
@@ -1,5 +1,4 @@
1
- require 'cucumber/formatter/console'
2
- require 'cucumber/formatter/io'
1
+ require 'cucumber/formatter/progress'
3
2
 
4
3
  module Cucumber #:nodoc:
5
4
  module Formatter #:nodoc:
@@ -44,6 +44,7 @@ module Hydra #:nodoc:
44
44
  output = "." if output == ""
45
45
 
46
46
  @io.write Results.new(:output => output, :file => file)
47
+ return output
47
48
  end
48
49
 
49
50
  # Stop running
@@ -114,48 +115,38 @@ module Hydra #:nodoc:
114
115
 
115
116
  # run all the scenarios in a cucumber feature file
116
117
  def run_cucumber_file(file)
117
- require 'cucumber'
118
- require 'cucumber/formatter/progress'
119
- require 'hydra/cucumber/formatter'
120
- def tag_excess(features, limits)
121
- limits.map do |tag_name, tag_limit|
122
- tag_locations = features.tag_locations(tag_name)
123
- if tag_limit && (tag_locations.length > tag_limit)
124
- [tag_name, tag_limit, tag_locations]
125
- else
126
- nil
127
- end
128
- end.compact
129
- end
130
118
 
131
119
  files = [file]
132
120
  dev_null = StringIO.new
133
-
134
- options = Cucumber::Cli::Options.new
135
- configuration = Cucumber::Cli::Configuration.new(dev_null, dev_null)
136
- configuration.parse!([]+files)
137
- step_mother = Cucumber::StepMother.new
138
-
139
- step_mother.options = configuration.options
140
- step_mother.log = configuration.log
141
- step_mother.load_code_files(configuration.support_to_load)
142
- step_mother.after_configuration(configuration)
143
- features = step_mother.load_plain_text_features(files)
144
- step_mother.load_code_files(configuration.step_defs_to_load)
145
-
146
- tag_excess = tag_excess(features, configuration.options[:tag_expression].limits)
147
- configuration.options[:tag_excess] = tag_excess
148
-
149
121
  hydra_response = StringIO.new
150
- formatter = Cucumber::Formatter::Hydra.new(
151
- step_mother, hydra_response, configuration.options
122
+
123
+ unless @step_mother
124
+ require 'cucumber'
125
+ require 'hydra/cucumber/formatter'
126
+ @step_mother = Cucumber::StepMother.new
127
+ @cuke_configuration = Cucumber::Cli::Configuration.new(dev_null, dev_null)
128
+ @cuke_configuration.parse!(['features']+files)
129
+
130
+ @step_mother.options = @cuke_configuration.options
131
+ @step_mother.log = @cuke_configuration.log
132
+ @step_mother.load_code_files(@cuke_configuration.support_to_load)
133
+ @step_mother.after_configuration(@cuke_configuration)
134
+ @step_mother.load_code_files(@cuke_configuration.step_defs_to_load)
135
+ end
136
+ cuke_formatter = Cucumber::Formatter::Hydra.new(
137
+ @step_mother, hydra_response, @cuke_configuration.options
152
138
  )
153
139
 
154
- runner = Cucumber::Ast::TreeWalker.new(
155
- step_mother, [formatter], configuration.options, dev_null
140
+ cuke_runner ||= Cucumber::Ast::TreeWalker.new(
141
+ @step_mother, [cuke_formatter], @cuke_configuration.options, dev_null
156
142
  )
157
- step_mother.visitor = runner
158
- runner.visit_features(features)
143
+ @step_mother.visitor = cuke_runner
144
+
145
+ features = @step_mother.load_plain_text_features(files)
146
+ tag_excess = tag_excess(features, @cuke_configuration.options[:tag_expression].limits)
147
+ @cuke_configuration.options[:tag_excess] = tag_excess
148
+
149
+ cuke_runner.visit_features(features)
159
150
 
160
151
  hydra_response.rewind
161
152
  return hydra_response.read
@@ -184,5 +175,17 @@ module Hydra #:nodoc:
184
175
  end
185
176
  return klasses.select{|k| k.respond_to? 'suite'}
186
177
  end
178
+
179
+ # Yanked a method from Cucumber
180
+ def tag_excess(features, limits)
181
+ limits.map do |tag_name, tag_limit|
182
+ tag_locations = features.tag_locations(tag_name)
183
+ if tag_limit && (tag_locations.length > tag_limit)
184
+ [tag_name, tag_limit, tag_locations]
185
+ else
186
+ nil
187
+ end
188
+ end.compact
189
+ end
187
190
  end
188
191
  end
@@ -2,6 +2,10 @@ Given /^a target file$/ do
2
2
  @target_file = File.expand_path(File.join(Dir.tmpdir, 'hydra_test.txt'))
3
3
  end
4
4
 
5
+ Given /^an alternate target file$/ do
6
+ @target_file = File.expand_path(File.join(Dir.tmpdir, 'alternate_hydra_test.txt'))
7
+ end
8
+
5
9
  When /^I write "([^\"]*)" to the file$/ do |text|
6
10
  f = File.new(@target_file, 'w')
7
11
  f.write text
@@ -0,0 +1,7 @@
1
+ Feature: Write a file
2
+
3
+ Scenario: Write to hydra_test.txt
4
+ Given an alternate target file
5
+ When I write "HYDRA" to the file
6
+ Then "HYDRA" should be written in the file
7
+
@@ -5,10 +5,12 @@ class RunnerTest < Test::Unit::TestCase
5
5
  setup do
6
6
  sleep(0.2)
7
7
  FileUtils.rm_f(target_file)
8
+ FileUtils.rm_f(alternate_target_file)
8
9
  end
9
10
 
10
11
  teardown do
11
12
  FileUtils.rm_f(target_file)
13
+ FileUtils.rm_f(alternate_target_file)
12
14
  end
13
15
 
14
16
 
@@ -35,13 +37,22 @@ class RunnerTest < Test::Unit::TestCase
35
37
  Process.wait(child)
36
38
  end
37
39
 
38
- should "run a cucumber test" do
39
- pipe = Hydra::Pipe.new
40
- parent = Process.fork do
41
- request_a_file_and_verify_completion(pipe, cucumber_feature_file)
42
- end
43
- run_the_runner(pipe)
44
- Process.wait(parent)
40
+ should "run two cucumber tests" do
41
+ puts "THE FOLLOWING WARNINGS CAN BE IGNORED"
42
+ puts "It is caused by Cucumber loading all rb files near its features"
43
+
44
+ runner = Hydra::Runner.new(:io => File.new('/dev/null', 'w'))
45
+ runner.run_file(cucumber_feature_file)
46
+ assert File.exists?(target_file)
47
+ assert_equal "HYDRA", File.read(target_file)
48
+
49
+ FileUtils.rm_f(target_file)
50
+
51
+ runner.run_file(alternate_cucumber_feature_file)
52
+ assert File.exists?(alternate_target_file)
53
+ assert_equal "HYDRA", File.read(alternate_target_file)
54
+
55
+ puts "END IGNORABLE OUTPUT"
45
56
  end
46
57
 
47
58
  should "be able to run a runner over ssh" do
@@ -80,6 +91,7 @@ class RunnerTest < Test::Unit::TestCase
80
91
 
81
92
  # grab its response. This makes us wait for it to finish
82
93
  response = pipe.gets
94
+ puts response.output
83
95
 
84
96
  # tell it to shut down
85
97
  pipe.write(Hydra::Messages::Worker::Shutdown.new)
@@ -14,6 +14,10 @@ class Test::Unit::TestCase
14
14
  def target_file
15
15
  File.expand_path(File.join(Dir.tmpdir, 'hydra_test.txt'))
16
16
  end
17
+
18
+ def alternate_target_file
19
+ File.expand_path(File.join(Dir.tmpdir, 'alternate_hydra_test.txt'))
20
+ end
17
21
 
18
22
  def test_file
19
23
  File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', 'write_file.rb'))
@@ -22,6 +26,10 @@ class Test::Unit::TestCase
22
26
  def cucumber_feature_file
23
27
  File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', 'features', 'write_file.feature'))
24
28
  end
29
+
30
+ def alternate_cucumber_feature_file
31
+ File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', 'features', 'write_alternate_file.feature'))
32
+ end
25
33
  end
26
34
 
27
35
  module Hydra #:nodoc:
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hydra
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.15.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Gauthier
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-30 00:00:00 -04:00
12
+ date: 2010-03-31 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -69,6 +69,7 @@ files:
69
69
  - test/fixtures/assert_true.rb
70
70
  - test/fixtures/config.yml
71
71
  - test/fixtures/features/step_definitions.rb
72
+ - test/fixtures/features/write_alternate_file.feature
72
73
  - test/fixtures/features/write_file.feature
73
74
  - test/fixtures/hello_world.rb
74
75
  - test/fixtures/slow.rb