cukeforker 0.0.5 → 0.0.6

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.
data/lib/cukeforker.rb CHANGED
@@ -6,6 +6,7 @@ end
6
6
  require "cucumber/cli/main"
7
7
  require "fileutils"
8
8
  require "observer"
9
+ require "ostruct"
9
10
 
10
11
  module CukeForker
11
12
  end
@@ -10,6 +10,9 @@ module CukeForker
10
10
  def on_worker_finished(worker)
11
11
  end
12
12
 
13
+ def on_worker_forked(worker)
14
+ end
15
+
13
16
  def on_run_interrupted
14
17
  end
15
18
 
@@ -16,6 +16,10 @@ module CukeForker
16
16
  log.info "[ worker #{worker.id.to_s.ljust 3} ] starting: #{worker.feature}"
17
17
  end
18
18
 
19
+ def on_worker_forked(worker)
20
+ log.info "[ worker #{worker.id.to_s.ljust 3} ] forked : #{worker.feature}"
21
+ end
22
+
19
23
  def on_worker_finished(worker)
20
24
  log.info "[ worker #{worker.id.to_s.ljust 3} ] #{status_string(worker.failed?).ljust(8)}: #{worker.feature}"
21
25
  end
@@ -1,3 +1,3 @@
1
1
  module CukeForker
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -5,12 +5,16 @@ module CukeForker
5
5
  end
6
6
 
7
7
  def on_worker_starting(worker)
8
- worker.vnc = @pool.get
8
+ worker.data.vnc = @pool.get
9
9
  end
10
10
 
11
11
  def on_worker_finished(worker)
12
12
  @pool.release worker.vnc
13
- worker.vnc = nil
13
+ worker.data.vnc = nil
14
+ end
15
+
16
+ def on_worker_forked(worker)
17
+ ENV['DISPLAY'] = worker.data.vnc.display
14
18
  end
15
19
 
16
20
  def on_run_finished(failed)
@@ -1,19 +1,21 @@
1
1
  module CukeForker
2
2
  class Worker
3
+ include Observable
4
+
3
5
  class << self
4
6
  attr_writer :id
5
7
  def id; @id ||= -1; end
6
8
  end
7
9
 
8
- attr_reader :status, :feature, :pid, :format, :out, :id
9
- attr_accessor :vnc
10
+ attr_reader :status, :feature, :pid, :format, :out, :id, :data
10
11
 
11
12
  def initialize(feature, format, out, extra_args = [])
12
13
  @feature = feature
13
14
  @format = format
14
15
  @extra_args = extra_args
15
16
  @out = out
16
- @status, @vnc = nil
17
+ @status = nil
18
+ @data = OpenStruct.new
17
19
 
18
20
  @id = self.class.id += 1
19
21
  end
@@ -30,7 +32,11 @@ module CukeForker
30
32
  end
31
33
 
32
34
  def start
33
- @pid = Process.fork { execute_cucumber }
35
+ @pid = Process.fork {
36
+ changed
37
+ notify_observers :on_worker_forked, self
38
+ execute_cucumber
39
+ }
34
40
  end
35
41
 
36
42
  def args
@@ -47,7 +53,7 @@ module CukeForker
47
53
  #{feature}
48
54
  #{status.inspect}
49
55
  #{out}
50
- #{vnc && vnc.display}
56
+ #{data}
51
57
  ]"
52
58
  end
53
59
 
@@ -92,6 +92,11 @@ module CukeForker
92
92
  result
93
93
  end
94
94
 
95
+ def add_observer(observer)
96
+ @pending.each { |e| e.add_observer observer }
97
+ super
98
+ end
99
+
95
100
  private
96
101
 
97
102
  def start(worker)
@@ -18,7 +18,9 @@ module CukeForker
18
18
  listener.on_display_starting mock_display
19
19
  listener.on_display_fetched mock_display
20
20
  listener.on_worker_starting mock_worker
21
+ listener.on_worker_forked mock_worker
21
22
  listener.on_worker_starting mock_worker2
23
+ listener.on_worker_forked mock_worker2
22
24
  listener.on_eta Time.now, 10, 255
23
25
  listener.on_worker_finished mock_worker
24
26
  listener.on_worker_finished mock_worker2
@@ -34,7 +36,9 @@ I, [#{timestamp}] INFO -- : [ run ] starting
34
36
  I, [#{timestamp}] INFO -- : [ display ] starting
35
37
  I, [#{timestamp}] INFO -- : [ display :5 ] fetched
36
38
  I, [#{timestamp}] INFO -- : [ worker 1 ] starting: foo/bar
39
+ I, [#{timestamp}] INFO -- : [ worker 1 ] forked : foo/bar
37
40
  I, [#{timestamp}] INFO -- : [ worker 15 ] starting: foo/baz
41
+ I, [#{timestamp}] INFO -- : [ worker 15 ] forked : foo/baz
38
42
  I, [#{timestamp}] INFO -- : [ eta 10/255] #{Time.now.strftime "%Y-%m-%d %H:%M:%S"}
39
43
  I, [#{timestamp}] INFO -- : [ worker 1 ] passed : foo/bar
40
44
  I, [#{timestamp}] INFO -- : [ worker 15 ] failed : foo/baz
@@ -2,14 +2,14 @@ require File.expand_path("../../spec_helper", __FILE__)
2
2
 
3
3
  module CukeForker
4
4
  describe VncListener do
5
- let(:server) { mock(VncServer) }
6
- let(:pool) { mock(VncServerPool) }
7
- let(:worker) { mock(Worker) }
8
- let(:listener) { VncListener.new pool }
5
+ let(:server) { mock(VncServer, :display => ":15") }
6
+ let(:pool) { mock(VncServerPool) }
7
+ let(:worker) { mock(Worker, :data => OpenStruct.new) }
8
+ let(:listener) { VncListener.new pool }
9
9
 
10
10
  it "fetches a display from the pool and assings it to the worker" do
11
11
  pool.should_receive(:get).and_return(server)
12
- worker.should_receive(:vnc=).with server
12
+ worker.data.should_receive(:vnc=).with server
13
13
 
14
14
  listener.on_worker_starting worker
15
15
  end
@@ -17,7 +17,7 @@ module CukeForker
17
17
  it "releases the display and removes it from the worker" do
18
18
  worker.should_receive(:vnc).and_return server
19
19
  pool.should_receive(:release).with server
20
- worker.should_receive(:vnc=).with(nil)
20
+ worker.data.should_receive(:vnc=).with(nil)
21
21
 
22
22
  listener.on_worker_finished worker
23
23
  end
@@ -28,5 +28,12 @@ module CukeForker
28
28
  listener.on_run_finished(true)
29
29
  end
30
30
 
31
+ it "sets DISPLAY after the worker is forked" do
32
+ worker.data.should_receive(:vnc).and_return(server)
33
+ ENV.should_receive(:[]=).with("DISPLAY", ":15")
34
+
35
+ listener.on_worker_forked worker
36
+ end
37
+
31
38
  end # VncListenerServer
32
39
  end # CukeForker
@@ -67,6 +67,17 @@ module CukeForker
67
67
  queue.poll
68
68
  end
69
69
 
70
+ it "adds observers to pending workers" do
71
+ listener = AbstractListener.new
72
+
73
+ workers.each { |w|
74
+ w.should_receive(:add_observer).with(listener)
75
+ queue.add w
76
+ }
77
+
78
+ queue.add_observer listener
79
+ end
80
+
70
81
  it "knows if any of the workers failed" do
71
82
  workers.each { |w| queue.add w }
72
83
 
@@ -50,8 +50,11 @@ module CukeForker
50
50
  worker.start
51
51
  end
52
52
 
53
- it "sets DISPLAY if a VNC server is set" do
54
- worker.vnc = mock(VncServer, :display => ":5")
53
+ it "fires an event after forking" do
54
+ mock_listener = mock(AbstractListener)
55
+ mock_listener.should_receive(:update).with(:on_worker_forked, worker)
56
+
57
+ worker.add_observer mock_listener
55
58
 
56
59
  Process.should_receive(:fork).and_yield.and_return(1234)
57
60
  $stdout.should_receive(:reopen).with("some/path/some_feature.stdout")
@@ -59,8 +62,6 @@ module CukeForker
59
62
  Cucumber::Cli::Main.should_receive(:execute).and_return(false)
60
63
  worker.should_receive(:exit).with(0)
61
64
 
62
- ENV.should_receive(:[]=).with("DISPLAY", ":5")
63
-
64
65
  worker.start
65
66
  end
66
67
 
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 5
9
- version: 0.0.5
8
+ - 6
9
+ version: 0.0.6
10
10
  platform: ruby
11
11
  authors:
12
12
  - Jari Bakken