cukeforker 0.1.9 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/cukeforker/runner.rb +1 -1
- data/lib/cukeforker/version.rb +1 -1
- data/lib/cukeforker/worker_queue.rb +5 -1
- data/spec/cukeforker/formatters/scenario_line_logger_spec.rb +5 -5
- data/spec/cukeforker/logging_listener_spec.rb +3 -3
- data/spec/cukeforker/recording_vnc_listener_spec.rb +4 -4
- data/spec/cukeforker/runner_spec.rb +16 -16
- data/spec/cukeforker/scenarios_spec.rb +5 -5
- data/spec/cukeforker/vnc_listener_spec.rb +3 -3
- data/spec/cukeforker/worker_queue_spec.rb +18 -4
- data/spec/cukeforker/worker_spec.rb +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0a71153dc8250ce79cb7ed2b93ed9bc153f1adb
|
4
|
+
data.tar.gz: a509ebde9c5946ddd5bc51e0175a9afedbadf632
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da6c6dca2c50581ba380f3be11031561e72c8c7eaf424e6ad15c2c91b2a80cf4c6ae2abdc93ae5a2432afc4dd24ccb316b2a9adc136f228c3c3a0cb4541d75c6
|
7
|
+
data.tar.gz: 3f0381d1203723e7962a0c9aa4f5e7895a8978acc3be1ed5cac55f0d0f0f97989fb7c6bf7fd296d033c58611b619d044845db08f066841ce3c57e0df6d4770c0
|
data/lib/cukeforker/runner.rb
CHANGED
@@ -6,7 +6,7 @@ module CukeForker
|
|
6
6
|
# where 'features' is an Array of file:line
|
7
7
|
# and 'opts' is a Hash of options:
|
8
8
|
#
|
9
|
-
# :max => Fixnum number of workers (default: 2)
|
9
|
+
# :max => Fixnum number of workers (default: 2, pass 0 for unlimited)
|
10
10
|
# :vnc => true/false,Class children are launched with DISPLAY set from a VNC server pool,
|
11
11
|
# where the size of the pool is equal to :max. If passed a Class instance,
|
12
12
|
# this will be passed as the second argument to VncTools::ServerPool.
|
data/lib/cukeforker/version.rb
CHANGED
@@ -5,6 +5,10 @@ module CukeForker
|
|
5
5
|
def initialize(max)
|
6
6
|
@max = max
|
7
7
|
|
8
|
+
if @max < 0
|
9
|
+
raise ArgumentError, "max workers cannot be negative, got #{@max.inspect}"
|
10
|
+
end
|
11
|
+
|
8
12
|
@pending = []
|
9
13
|
@running = []
|
10
14
|
@finished = []
|
@@ -59,7 +63,7 @@ module CukeForker
|
|
59
63
|
end
|
60
64
|
|
61
65
|
def full?
|
62
|
-
size == @max
|
66
|
+
@max != 0 && size == @max
|
63
67
|
end
|
64
68
|
|
65
69
|
def empty?
|
@@ -6,8 +6,8 @@ module CukeForker::Formatters
|
|
6
6
|
it "returns scenario names and line numbers for a scenario" do
|
7
7
|
logger = ScenarioLineLogger.new
|
8
8
|
|
9
|
-
feature =
|
10
|
-
feature_element =
|
9
|
+
feature = double("Cucumber::Ast::Feature")
|
10
|
+
feature_element = double("Cucumber::Ast::Scenario")
|
11
11
|
|
12
12
|
feature.should_receive(:file).twice.and_return('features/test1.feature')
|
13
13
|
feature_element.should_receive(:source_tags).twice.and_return('')
|
@@ -26,9 +26,9 @@ module CukeForker::Formatters
|
|
26
26
|
it "returns scenario names and line numbers for a scenario outline" do
|
27
27
|
logger = ScenarioLineLogger.new
|
28
28
|
|
29
|
-
feature =
|
30
|
-
location =
|
31
|
-
feature_element = Cucumber::Ast::ScenarioOutline.new(*Array.new(11) {|a|
|
29
|
+
feature = double("Cucumber::Ast::Feature")
|
30
|
+
location = double("Cucumber::Ast::Location", :line => 4)
|
31
|
+
feature_element = Cucumber::Ast::ScenarioOutline.new(*Array.new(11) {|a| double(a, :each => true) })
|
32
32
|
feature_element.stub(:location => location)
|
33
33
|
|
34
34
|
feature.should_receive(:file).and_return('features/test1.feature')
|
@@ -8,10 +8,10 @@ module CukeForker
|
|
8
8
|
it "logs all events" do
|
9
9
|
Time.stub(:now => Time.now)
|
10
10
|
|
11
|
-
mock_worker =
|
12
|
-
mock_worker2 =
|
11
|
+
mock_worker = double(Worker, :id => "1", :feature => "foo/bar", :failed? => false)
|
12
|
+
mock_worker2 = double(Worker, :id => "15", :feature => "foo/baz", :failed? => true)
|
13
13
|
|
14
|
-
mock_display =
|
14
|
+
mock_display = double(VncTools::Server)
|
15
15
|
mock_display.stub(:display).and_return(nil, ":5", ":15")
|
16
16
|
|
17
17
|
listener.on_run_starting
|
@@ -2,10 +2,10 @@ require File.expand_path("../../spec_helper", __FILE__)
|
|
2
2
|
|
3
3
|
module CukeForker
|
4
4
|
describe RecordingVncListener do
|
5
|
-
let(:server) {
|
6
|
-
let(:vnc_listener) {
|
7
|
-
let(:worker) {
|
8
|
-
let(:recorder) {
|
5
|
+
let(:server) { double(VncTools::Server, :display => ":2")}
|
6
|
+
let(:vnc_listener) { double(VncListener).as_null_object }
|
7
|
+
let(:worker) { double(Worker, :data => OpenStruct.new(:vnc => server), :out => ".", :basename => "foo", :failed? => true) }
|
8
|
+
let(:recorder) { double(VncTools::Recorder, :start => nil, :stop => nil, :output => "foo.mp4") }
|
9
9
|
let(:listener) { RecordingVncListener.new vnc_listener }
|
10
10
|
|
11
11
|
it "forwards messages to the wrapped listener do" do
|
@@ -10,12 +10,12 @@ module CukeForker
|
|
10
10
|
max = 4
|
11
11
|
format = :json
|
12
12
|
out = "/tmp"
|
13
|
-
listeners = [
|
13
|
+
listeners = [double(AbstractListener, :update => nil)]
|
14
14
|
log = false
|
15
15
|
features = %w[a b]
|
16
16
|
|
17
|
-
mock_queue =
|
18
|
-
mock_workers = Array.new(2) { |n|
|
17
|
+
mock_queue = double(WorkerQueue)
|
18
|
+
mock_workers = Array.new(2) { |n| double("Worker-#{n}") }
|
19
19
|
|
20
20
|
Process.stub(:pid => 1234)
|
21
21
|
|
@@ -37,9 +37,9 @@ module CukeForker
|
|
37
37
|
end
|
38
38
|
|
39
39
|
it "sets up the VNC pool if :vnc => true" do
|
40
|
-
mock_pool =
|
40
|
+
mock_pool = double(VncTools::ServerPool, :add_observer => nil)
|
41
41
|
VncTools::ServerPool.should_receive(:new).with(2).and_return mock_pool
|
42
|
-
VncListener.should_receive(:new).with(mock_pool).and_return
|
42
|
+
VncListener.should_receive(:new).with(mock_pool).and_return double(:update => nil)
|
43
43
|
|
44
44
|
Runner.create([], :max => 2, :vnc => true)
|
45
45
|
end
|
@@ -47,37 +47,37 @@ module CukeForker
|
|
47
47
|
it "sets up the VNC pool with a custom server class" do
|
48
48
|
server_class = Class.new
|
49
49
|
|
50
|
-
mock_pool =
|
50
|
+
mock_pool = double(VncTools::ServerPool, :add_observer => nil)
|
51
51
|
VncTools::ServerPool.should_receive(:new).with(2, server_class).and_return mock_pool
|
52
|
-
VncListener.should_receive(:new).with(mock_pool).and_return
|
52
|
+
VncListener.should_receive(:new).with(mock_pool).and_return double(:update => nil)
|
53
53
|
|
54
54
|
Runner.create([], :max => 2, :vnc => server_class)
|
55
55
|
end
|
56
56
|
|
57
57
|
it "sets up VNC recording if :record => true" do
|
58
|
-
mock_pool =
|
58
|
+
mock_pool = double(VncTools::ServerPool, :add_observer => nil)
|
59
59
|
VncTools::ServerPool.should_receive(:new).with(2).and_return mock_pool
|
60
60
|
|
61
|
-
mock_vnc_listener =
|
61
|
+
mock_vnc_listener = double(:update => nil)
|
62
62
|
VncListener.should_receive(:new).with(mock_pool).and_return(mock_vnc_listener)
|
63
|
-
RecordingVncListener.should_receive(:new).with(mock_vnc_listener).and_return(
|
63
|
+
RecordingVncListener.should_receive(:new).with(mock_vnc_listener).and_return(double(:update => nil))
|
64
64
|
|
65
65
|
Runner.create([], :max => 2, :vnc => true, :record => true)
|
66
66
|
end
|
67
67
|
|
68
68
|
it "sets up VNC recording if :record => Hash" do
|
69
|
-
mock_pool =
|
69
|
+
mock_pool = double(VncTools::ServerPool, :add_observer => nil)
|
70
70
|
VncTools::ServerPool.should_receive(:new).with(2).and_return mock_pool
|
71
71
|
|
72
|
-
mock_vnc_listener =
|
72
|
+
mock_vnc_listener = double(:update => nil)
|
73
73
|
VncListener.should_receive(:new).with(mock_pool).and_return(mock_vnc_listener)
|
74
|
-
RecordingVncListener.should_receive(:new).with(mock_vnc_listener, :codec => "flv").and_return(
|
74
|
+
RecordingVncListener.should_receive(:new).with(mock_vnc_listener, :codec => "flv").and_return(double(:update => nil))
|
75
75
|
|
76
76
|
Runner.create([], :max => 2, :vnc => true, :record => {:codec => "flv"})
|
77
77
|
end
|
78
78
|
|
79
79
|
it "creates and runs a new runner" do
|
80
|
-
r =
|
80
|
+
r = double(Runner)
|
81
81
|
Runner.should_receive(:create).with(%w[a b], {}).and_return(r)
|
82
82
|
r.should_receive(:run)
|
83
83
|
|
@@ -86,8 +86,8 @@ module CukeForker
|
|
86
86
|
end
|
87
87
|
|
88
88
|
context "running" do
|
89
|
-
let(:listener) {
|
90
|
-
let(:queue) {
|
89
|
+
let(:listener) { double(AbstractListener, :update => nil) }
|
90
|
+
let(:queue) { double(Queue, :has_failures? => false) }
|
91
91
|
let(:runner) { Runner.new(queue) }
|
92
92
|
|
93
93
|
it "processes the queue" do
|
@@ -28,10 +28,10 @@ module CukeForker
|
|
28
28
|
| 1 |
|
29
29
|
")
|
30
30
|
|
31
|
-
Cucumber::FeatureFile.stub
|
32
|
-
Cucumber::FeatureFile.stub
|
31
|
+
Cucumber::FeatureFile.stub(:new).with("features/test1.feature").and_return(feature_1)
|
32
|
+
Cucumber::FeatureFile.stub(:new).with("features/test2.feature").and_return(feature_2)
|
33
33
|
|
34
|
-
Scenarios.stub
|
34
|
+
Scenarios.stub(:feature_files).and_return(['features/test1.feature', 'features/test2.feature'])
|
35
35
|
|
36
36
|
all_scenarios = Scenarios.all
|
37
37
|
|
@@ -54,9 +54,9 @@ module CukeForker
|
|
54
54
|
Scenario: test scenario 2
|
55
55
|
Given nothing else happens")
|
56
56
|
|
57
|
-
Cucumber::FeatureFile.stub
|
57
|
+
Cucumber::FeatureFile.stub(:new).with("features/test1.feature").and_return(feature_1)
|
58
58
|
|
59
|
-
Scenarios.stub
|
59
|
+
Scenarios.stub(:feature_files).and_return(['features/test1.feature'])
|
60
60
|
|
61
61
|
all_scenarios = Scenarios.by_args(%W[-t @find_me])
|
62
62
|
|
@@ -2,9 +2,9 @@ require File.expand_path("../../spec_helper", __FILE__)
|
|
2
2
|
|
3
3
|
module CukeForker
|
4
4
|
describe VncListener do
|
5
|
-
let(:server) {
|
6
|
-
let(:pool) {
|
7
|
-
let(:worker) {
|
5
|
+
let(:server) { double(VncTools::Server, :display => ":15") }
|
6
|
+
let(:pool) { double(VncTools::ServerPool) }
|
7
|
+
let(:worker) { double(Worker, :data => OpenStruct.new) }
|
8
8
|
let(:listener) { VncListener.new pool }
|
9
9
|
|
10
10
|
it "fetches a display from the pool and assings it to the worker" do
|
@@ -2,7 +2,7 @@ require File.expand_path("../../spec_helper", __FILE__)
|
|
2
2
|
|
3
3
|
module CukeForker
|
4
4
|
describe WorkerQueue do
|
5
|
-
let(:workers) { Array.new(5) { |n|
|
5
|
+
let(:workers) { Array.new(5) { |n| double("Worker-#{n}") } }
|
6
6
|
let(:queue) { WorkerQueue.new(3) }
|
7
7
|
|
8
8
|
it "adds an item to the queue" do
|
@@ -28,6 +28,20 @@ module CukeForker
|
|
28
28
|
queue.should be_backed_up
|
29
29
|
end
|
30
30
|
|
31
|
+
it "is unlimited if max workers = 0" do
|
32
|
+
unlimited_queue = WorkerQueue.new(0)
|
33
|
+
|
34
|
+
workers.each { |w| queue.add double.as_null_object }
|
35
|
+
|
36
|
+
unlimited_queue.fill
|
37
|
+
unlimited_queue.should_not be_full
|
38
|
+
unlimited_queue.should_not be_backed_up
|
39
|
+
end
|
40
|
+
|
41
|
+
it "raises if max workers is negative" do
|
42
|
+
expect { WorkerQueue.new(-1) }.to raise_error(ArgumentError)
|
43
|
+
end
|
44
|
+
|
31
45
|
it "removes finished workers from the queue" do
|
32
46
|
workers.each do |w|
|
33
47
|
w.should_receive(:start)
|
@@ -36,9 +50,9 @@ module CukeForker
|
|
36
50
|
|
37
51
|
queue.fill
|
38
52
|
|
39
|
-
workers[0].stub
|
40
|
-
workers[1].stub
|
41
|
-
workers[2].stub
|
53
|
+
workers[0].stub(:finished? => true)
|
54
|
+
workers[1].stub(:finished? => true)
|
55
|
+
workers[2].stub(:finished? => false)
|
42
56
|
|
43
57
|
queue.poll
|
44
58
|
|
@@ -68,7 +68,7 @@ module CukeForker
|
|
68
68
|
end
|
69
69
|
|
70
70
|
it "fires an event after forking" do
|
71
|
-
mock_listener =
|
71
|
+
mock_listener = double(AbstractListener)
|
72
72
|
mock_listener.should_receive(:update).with(:on_worker_forked, worker)
|
73
73
|
|
74
74
|
worker.add_observer mock_listener
|
@@ -88,12 +88,12 @@ module CukeForker
|
|
88
88
|
end
|
89
89
|
|
90
90
|
it "considers itself failed if the exit code was 1" do
|
91
|
-
worker.stub :status =>
|
91
|
+
worker.stub :status => double(:exitstatus => 1)
|
92
92
|
worker.should be_failed
|
93
93
|
end
|
94
94
|
|
95
95
|
it "considers itself failed if the exit code was 0" do
|
96
|
-
worker.stub :status =>
|
96
|
+
worker.stub :status => double(:exitstatus => 0)
|
97
97
|
worker.should_not be_failed
|
98
98
|
end
|
99
99
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cukeforker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jari Bakken
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cucumber
|