cukeforker 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,117 @@
1
+ require File.expand_path("../../spec_helper", __FILE__)
2
+
3
+ module CukeForker
4
+ describe WorkerQueue do
5
+ let(:workers) { Array.new(5) { |n| mock("Worker-#{n}") } }
6
+ let(:queue) { WorkerQueue.new(3) }
7
+
8
+ it "adds an item to the queue" do
9
+ queue.should_not be_backed_up
10
+ queue.add workers.first
11
+ queue.should be_backed_up
12
+ end
13
+
14
+ it "starts up to the max number of workers" do
15
+ queue.should_not be_full
16
+ queue.should be_empty
17
+
18
+ workers.each { |w| queue.add w }
19
+
20
+ workers[0].should_receive(:start)
21
+ workers[1].should_receive(:start)
22
+ workers[2].should_receive(:start)
23
+
24
+ queue.fill
25
+
26
+ queue.size.should == 3
27
+ queue.should be_full
28
+ queue.should be_backed_up
29
+ end
30
+
31
+ it "removes finished workers from the queue" do
32
+ workers.each do |w|
33
+ w.should_receive(:start)
34
+ queue.add w
35
+ end
36
+
37
+ queue.fill
38
+
39
+ workers[0].stub!(:finished? => true)
40
+ workers[1].stub!(:finished? => true)
41
+ workers[2].stub!(:finished? => false)
42
+
43
+ queue.poll
44
+
45
+ queue.should_not be_full
46
+ queue.size.should == 1
47
+
48
+ queue.fill
49
+
50
+ queue.should be_full
51
+ end
52
+
53
+ it "notifies observers when workers are started or finished" do
54
+ listener = AbstractListener.new
55
+ queue.add_observer listener
56
+
57
+ workers.each { |w| queue.add w }
58
+
59
+ workers[0].stub(:start => nil, :finished? => true)
60
+ workers[1].stub(:start => nil, :finished? => true)
61
+ workers[2].stub(:start => nil, :finished? => false)
62
+
63
+ listener.should_receive(:on_worker_starting).exactly(3).times
64
+ queue.fill
65
+
66
+ listener.should_receive(:on_worker_finished).exactly(2).times
67
+ queue.poll
68
+ end
69
+
70
+ it "knows if any of the workers failed" do
71
+ workers.each { |w| queue.add w }
72
+
73
+ workers[0].stub(:start => nil, :finished? => true, :failed? => true)
74
+ workers[1].stub(:start => nil, :finished? => true, :failed? => false)
75
+ workers[2].stub(:start => nil, :finished? => true, :failed? => false)
76
+
77
+ queue.fill
78
+ queue.poll
79
+
80
+ queue.should have_failures
81
+ end
82
+
83
+ it "processes the queue until no longer backed up" do
84
+ workers.each { |w| queue.add w }
85
+
86
+ workers[0].stub(:start => nil, :finished? => true, :failed? => true)
87
+ workers[1].stub(:start => nil, :finished? => true, :failed? => false)
88
+ workers[2].stub(:start => nil, :finished? => true, :failed? => false)
89
+ workers[3].stub(:start => nil, :finished? => true, :failed? => false)
90
+ workers[4].stub(:start => nil, :finished? => true, :failed? => false)
91
+
92
+ queue.process
93
+
94
+ queue.should_not be_backed_up
95
+ queue.should_not be_full
96
+ end
97
+
98
+ it "polls until all workers are finished" do
99
+ queue.stub :start_time => Time.now
100
+ workers[0..2].each { |w| queue.add w }
101
+
102
+ workers[0].stub(:start => nil)
103
+ workers[1].stub(:start => nil)
104
+ workers[2].stub(:start => nil)
105
+
106
+ workers[0].should_receive(:finished?).twice.and_return false, true
107
+ workers[1].should_receive(:finished?).twice.and_return false, true
108
+ workers[2].should_receive(:finished?).twice.and_return false, true
109
+
110
+ queue.fill
111
+ queue.should_not be_backed_up
112
+ queue.should be_full
113
+
114
+ queue.wait_until_finished
115
+ end
116
+ end # WorkerQueue
117
+ end # CukeForker
@@ -0,0 +1,102 @@
1
+ require File.expand_path("../../spec_helper", __FILE__)
2
+
3
+ module CukeForker
4
+ describe Worker do
5
+ let(:worker) { Worker.new("some/feature", :json, "some/path", %w[--extra args]) }
6
+
7
+ before {
8
+ FileUtils.stub :mkdir_p
9
+ }
10
+
11
+ it "creates an argument string based on the given parameters" do
12
+ worker.args.should == %w{--format json --out some/path/some_feature.json --extra args some/feature }
13
+ end
14
+
15
+ it "has an output file" do
16
+ worker.output.should == "some/path/some_feature.json"
17
+ end
18
+
19
+ it "has a stdout file" do
20
+ worker.stdout.should == "some/path/some_feature.stdout"
21
+ end
22
+
23
+ it "has a stderr file" do
24
+ worker.stderr.should == "some/path/some_feature.stderr"
25
+ end
26
+
27
+ it "has a text representation" do
28
+ worker.text.should include("some/feature")
29
+ end
30
+
31
+ it "runs a passing cuke and exits with 0" do
32
+ Process.should_receive(:fork).and_yield.and_return(1234)
33
+ $stdout.should_receive(:reopen).with("some/path/some_feature.stdout")
34
+ $stderr.should_receive(:reopen).with("some/path/some_feature.stderr")
35
+
36
+ Cucumber::Cli::Main.should_receive(:execute).and_return(false)
37
+ worker.should_receive(:exit).with(0)
38
+
39
+ worker.start
40
+ end
41
+
42
+ it "runs a failing cuke and exits with 1" do
43
+ Process.should_receive(:fork).and_yield.and_return(1234)
44
+ $stdout.should_receive(:reopen).with("some/path/some_feature.stdout")
45
+ $stderr.should_receive(:reopen).with("some/path/some_feature.stderr")
46
+
47
+ Cucumber::Cli::Main.should_receive(:execute).and_return(true)
48
+ worker.should_receive(:exit).with(1)
49
+
50
+ worker.start
51
+ end
52
+
53
+ it "sets DISPLAY if a VNC server is set" do
54
+ worker.vnc = mock(VncServer, :display => ":5")
55
+
56
+ Process.should_receive(:fork).and_yield.and_return(1234)
57
+ $stdout.should_receive(:reopen).with("some/path/some_feature.stdout")
58
+ $stderr.should_receive(:reopen).with("some/path/some_feature.stderr")
59
+ Cucumber::Cli::Main.should_receive(:execute).and_return(false)
60
+ worker.should_receive(:exit).with(0)
61
+
62
+ ENV.should_receive(:[]=).with("DISPLAY", ":5")
63
+
64
+ worker.start
65
+ end
66
+
67
+ it "considers itself failed if status wasn't collected" do
68
+ worker.stub :status => nil
69
+ worker.should be_failed
70
+ end
71
+
72
+ it "considers itself failed if the exit code was 1" do
73
+ worker.stub :status => mock(:exitstatus => 1)
74
+ worker.should be_failed
75
+ end
76
+
77
+ it "considers itself failed if the exit code was 0" do
78
+ worker.stub :status => mock(:exitstatus => 0)
79
+ worker.should_not be_failed
80
+ end
81
+
82
+ it "knows if the child is still running" do
83
+ Process.stub :waitpid2 => nil
84
+ worker.should_not be_finished
85
+ end
86
+
87
+ it "knows if the child is finished" do
88
+ Process.stub :waitpid2 => [1234, :some_status]
89
+ worker.should be_finished
90
+ worker.status.should == :some_status
91
+ end
92
+
93
+ it "knows if the child has already been reaped" do
94
+ Process.stub(:waitpid2).and_raise(Errno::ECHILD)
95
+ worker.should be_finished
96
+
97
+ Process.stub(:waitpid2).and_raise(Errno::ESRCH)
98
+ worker.should be_finished
99
+ end
100
+
101
+ end # Worker
102
+ end # CukeForker
@@ -0,0 +1,28 @@
1
+ if ENV['COVERAGE']
2
+ raise "simplecov only works on 1.9" unless RUBY_PLATFORM >= "1.9"
3
+ require 'simplecov'
4
+ SimpleCov.start {
5
+ add_filter "spec/"
6
+ }
7
+ end
8
+
9
+ $LOAD_PATH.unshift File.expand_path("../lib")
10
+ require 'cukeforker'
11
+
12
+ module CukeForker
13
+ module SpecHelper
14
+ class FakeVnc
15
+ def start
16
+ # noop
17
+ end
18
+
19
+ def display
20
+ ":1"
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ RSpec.configure { |c|
27
+ c.include CukeForker::SpecHelper
28
+ }
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cukeforker
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Jari Bakken
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-01-21 00:00:00 +01:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: cucumber
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :runtime
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: rspec
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :development
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: simplecov
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ type: :development
58
+ version_requirements: *id003
59
+ description: Library to maintain a forking queue of Cucumber processes, with optional VNC displays.
60
+ email:
61
+ - jari.bakken@gmail.com
62
+ executables:
63
+ - cukeforker
64
+ extensions: []
65
+
66
+ extra_rdoc_files: []
67
+
68
+ files:
69
+ - .gitignore
70
+ - .rspec
71
+ - Gemfile
72
+ - LICENSE
73
+ - README.mdown
74
+ - Rakefile
75
+ - bin/cukeforker
76
+ - cukeforker.gemspec
77
+ - lib/cukeforker.rb
78
+ - lib/cukeforker/abstract_listener.rb
79
+ - lib/cukeforker/logging_listener.rb
80
+ - lib/cukeforker/runner.rb
81
+ - lib/cukeforker/version.rb
82
+ - lib/cukeforker/vnc_listener.rb
83
+ - lib/cukeforker/vnc_server.rb
84
+ - lib/cukeforker/vnc_server_pool.rb
85
+ - lib/cukeforker/worker.rb
86
+ - lib/cukeforker/worker_queue.rb
87
+ - spec/cukeforker/logging_listener_spec.rb
88
+ - spec/cukeforker/runner_spec.rb
89
+ - spec/cukeforker/vnc_listener_spec.rb
90
+ - spec/cukeforker/vnc_server_pool_spec.rb
91
+ - spec/cukeforker/vnc_server_spec.rb
92
+ - spec/cukeforker/worker_queue_spec.rb
93
+ - spec/cukeforker/worker_spec.rb
94
+ - spec/spec_helper.rb
95
+ has_rdoc: true
96
+ homepage: ""
97
+ licenses: []
98
+
99
+ post_install_message:
100
+ rdoc_options: []
101
+
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ segments:
110
+ - 0
111
+ version: "0"
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ segments:
118
+ - 0
119
+ version: "0"
120
+ requirements: []
121
+
122
+ rubyforge_project: cukeforker
123
+ rubygems_version: 1.3.7
124
+ signing_key:
125
+ specification_version: 3
126
+ summary: Library to maintain a forking queue of Cucumber processes
127
+ test_files:
128
+ - spec/cukeforker/logging_listener_spec.rb
129
+ - spec/cukeforker/runner_spec.rb
130
+ - spec/cukeforker/vnc_listener_spec.rb
131
+ - spec/cukeforker/vnc_server_pool_spec.rb
132
+ - spec/cukeforker/vnc_server_spec.rb
133
+ - spec/cukeforker/worker_queue_spec.rb
134
+ - spec/cukeforker/worker_spec.rb
135
+ - spec/spec_helper.rb