jcukeforker 0.3.1 → 0.4.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/.travis.yml +4 -0
- data/jcukeforker.gemspec +2 -1
- data/lib/jcukeforker/formatters/junit_scenario_formatter.rb +3 -3
- data/lib/jcukeforker/normalised_encoding_file.rb +38 -0
- data/lib/jcukeforker/runner.rb +1 -2
- data/lib/jcukeforker/scenario_list.rb +24 -0
- data/lib/jcukeforker/scenarios.rb +9 -9
- data/lib/jcukeforker/version.rb +1 -1
- data/lib/jcukeforker/worker.rb +0 -1
- data/lib/jcukeforker.rb +2 -1
- data/spec/jcukeforker/logging_listener_spec.rb +2 -2
- data/spec/jcukeforker/recording_vnc_listener_spec.rb +9 -9
- data/spec/jcukeforker/runner_spec.rb +20 -22
- data/spec/jcukeforker/scenarios_spec.rb +75 -37
- data/spec/jcukeforker/status_server_spec.rb +2 -2
- data/spec/jcukeforker/task_manager_spec.rb +4 -4
- data/spec/jcukeforker/worker_spec.rb +5 -5
- metadata +54 -48
- data/lib/jcukeforker/formatters/scenario_line_logger.rb +0 -40
- data/spec/jcukeforker/formatters/scenario_line_logger_spec.rb +0 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e32fbbcbe969e537a3c9601b5827789daaf915f2
|
4
|
+
data.tar.gz: e00bc3cd309212d5021679ea4909d0150f8afaf6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c7ea46aa52c889b3598943fef095808ac47705245535e377d01b9dc175a3883d195721b0899ce58e94884e1242c61453cd7ed2e89f74fa8e0ffe460f3287f1c
|
7
|
+
data.tar.gz: e3547b71f9ac1de4c844f406d6849ad6ecffc4e339bbbcfa57cd6cc73c6a37ac0aca61c283d400eb0f90b92d4247247c7448ea70c0b8ef6c7027170861921ff2
|
data/.travis.yml
CHANGED
data/jcukeforker.gemspec
CHANGED
@@ -14,12 +14,13 @@ Gem::Specification.new do |s|
|
|
14
14
|
|
15
15
|
s.rubyforge_project = "jcukeforker"
|
16
16
|
|
17
|
-
s.add_dependency "cucumber", ">=
|
17
|
+
s.add_dependency "cucumber", ">= 2.3.2"
|
18
18
|
s.add_dependency "vnctools", ">= 0.1.1"
|
19
19
|
s.add_dependency "childprocess", ">= 0.5.3"
|
20
20
|
s.add_development_dependency "rspec"
|
21
21
|
s.add_development_dependency "coveralls"
|
22
22
|
s.add_development_dependency "rake", "~> 10"
|
23
|
+
s.add_development_dependency "pry"
|
23
24
|
|
24
25
|
s.files = `git ls-files`.split("\n")
|
25
26
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'cucumber/formatter/junit'
|
2
|
-
|
2
|
+
|
3
3
|
module JCukeForker
|
4
4
|
module Formatters
|
5
5
|
class JunitScenarioFormatter < Cucumber::Formatter::Junit
|
@@ -19,8 +19,8 @@ module JCukeForker
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
23
|
-
@testsuite =
|
22
|
+
def end_feature(feature_element)
|
23
|
+
@testsuite = Builder::XmlMarkup.new(:indent => 2)
|
24
24
|
@testsuite.instruct!
|
25
25
|
@testsuite.testsuite(
|
26
26
|
:failures => @failures,
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module JCukeForker
|
2
|
+
class NormalisedEncodingFile
|
3
|
+
COMMENT_OR_EMPTY_LINE_PATTERN = /^\s*#|^\s*$/ #:nodoc:
|
4
|
+
ENCODING_PATTERN = /^\s*#\s*encoding\s*:\s*([^\s]+)/ #:nodoc:
|
5
|
+
|
6
|
+
def self.read(path)
|
7
|
+
new(path).read
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(path)
|
11
|
+
begin
|
12
|
+
@file = File.new(path)
|
13
|
+
set_encoding
|
14
|
+
rescue Errno::EACCES => e
|
15
|
+
raise FileNotFoundException.new(e, File.expand_path(path))
|
16
|
+
rescue Errno::ENOENT => e
|
17
|
+
raise FeatureFolderNotFoundException.new(e, path)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def read
|
22
|
+
@file.read.encode("UTF-8")
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def set_encoding
|
28
|
+
@file.each do |line|
|
29
|
+
if ENCODING_PATTERN =~ line
|
30
|
+
@file.set_encoding $1
|
31
|
+
break
|
32
|
+
end
|
33
|
+
break unless COMMENT_OR_EMPTY_LINE_PATTERN =~ line
|
34
|
+
end
|
35
|
+
@file.rewind
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/jcukeforker/runner.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
class ScenarioList
|
2
|
+
attr_accessor :scenarios
|
3
|
+
|
4
|
+
def scenarios
|
5
|
+
@scenarios
|
6
|
+
end
|
7
|
+
|
8
|
+
def before_test_step(test_step)
|
9
|
+
end
|
10
|
+
|
11
|
+
def after_test_step(test_step, result)
|
12
|
+
end
|
13
|
+
|
14
|
+
def before_test_case(test_case)
|
15
|
+
end
|
16
|
+
|
17
|
+
def after_test_case(test_case, result)
|
18
|
+
@scenarios ||= []
|
19
|
+
@scenarios << [test_case.feature.file, test_case.location.line].join(':')
|
20
|
+
end
|
21
|
+
|
22
|
+
def done
|
23
|
+
end
|
24
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
require 'cucumber/
|
1
|
+
require 'cucumber/core'
|
2
|
+
require 'cucumber/core/filter'
|
2
3
|
|
3
4
|
module JCukeForker
|
4
5
|
|
@@ -14,6 +15,7 @@ module JCukeForker
|
|
14
15
|
#
|
15
16
|
|
16
17
|
class Scenarios
|
18
|
+
include Cucumber::Core
|
17
19
|
def self.by_args(args)
|
18
20
|
options = Cucumber::Cli::Options.new(STDOUT, STDERR, :default_profile => 'default')
|
19
21
|
tagged(options.parse!(args)[:tag_expressions])
|
@@ -25,15 +27,13 @@ module JCukeForker
|
|
25
27
|
end
|
26
28
|
|
27
29
|
def self.tagged(tags)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
feature.accept(scenario_line_logger)
|
30
|
+
scenario_list = ScenarioList.new
|
31
|
+
feature_files.each do |feature|
|
32
|
+
source = JCukeForker::NormalisedEncodingFile.read(feature)
|
33
|
+
file = Cucumber::Core::Gherkin::Document.new(feature, source)
|
34
|
+
self.new.execute([file], scenario_list, [Cucumber::Core::Test::TagFilter.new(tags)])
|
34
35
|
end
|
35
|
-
|
36
|
-
scenario_line_logger.scenarios
|
36
|
+
scenario_list.scenarios
|
37
37
|
end
|
38
38
|
|
39
39
|
def self.feature_files
|
data/lib/jcukeforker/version.rb
CHANGED
data/lib/jcukeforker/worker.rb
CHANGED
@@ -6,7 +6,6 @@ require 'observer'
|
|
6
6
|
require 'childprocess'
|
7
7
|
require_relative './abstract_listener'
|
8
8
|
require_relative './recording_vnc_listener'
|
9
|
-
require_relative './formatters/scenario_line_logger'
|
10
9
|
require_relative './formatters/junit_scenario_formatter'
|
11
10
|
|
12
11
|
module JCukeForker
|
data/lib/jcukeforker.rb
CHANGED
@@ -20,5 +20,6 @@ require 'jcukeforker/status_server'
|
|
20
20
|
require 'jcukeforker/task_manager'
|
21
21
|
require 'jcukeforker/configurable_vnc_server'
|
22
22
|
|
23
|
-
require 'jcukeforker/
|
23
|
+
require 'jcukeforker/normalised_encoding_file'
|
24
|
+
require 'jcukeforker/scenario_list'
|
24
25
|
require 'jcukeforker/formatters/junit_scenario_formatter'
|
@@ -6,7 +6,7 @@ module JCukeForker
|
|
6
6
|
let(:listener) { LoggingListener.new stdout }
|
7
7
|
|
8
8
|
it "logs all events" do
|
9
|
-
Time.
|
9
|
+
allow(Time).to receive(:now).and_return(Time.now)
|
10
10
|
|
11
11
|
mock_worker = {:path => '1', :feature => 'foo/bar', :status => true }
|
12
12
|
mock_worker2 = {:path => '15', :feature => 'foo/baz', :status => false}
|
@@ -25,7 +25,7 @@ module JCukeForker
|
|
25
25
|
|
26
26
|
timestamp = Time.now.strftime("%Y-%m-%d %H:%M:%S##{Process.pid}")
|
27
27
|
|
28
|
-
stdout.string.
|
28
|
+
expect(stdout.string).to eql <<-OUTPUT
|
29
29
|
I, [#{timestamp}] INFO -- : [ run ] starting
|
30
30
|
I, [#{timestamp}] INFO -- : [ worker 1 ] register: 1
|
31
31
|
I, [#{timestamp}] INFO -- : [ worker 1 ] starting: foo/bar
|
@@ -12,7 +12,7 @@ module JCukeForker
|
|
12
12
|
|
13
13
|
env = ENV['DISPLAY']
|
14
14
|
ENV['DISPLAY']= ':1'
|
15
|
-
ChildProcess.
|
15
|
+
expect(ChildProcess).to receive(:build).with(
|
16
16
|
'ffmpeg',
|
17
17
|
'-an',
|
18
18
|
'-y',
|
@@ -24,34 +24,34 @@ module JCukeForker
|
|
24
24
|
'./feature.webm'
|
25
25
|
).and_return(recorder)
|
26
26
|
|
27
|
-
recorder.
|
27
|
+
expect(recorder).to receive(:start)
|
28
28
|
|
29
29
|
listener.on_task_starting worker, feature
|
30
30
|
ENV['DISPLAY'] = env
|
31
31
|
end
|
32
32
|
|
33
33
|
it "stops recording when the task is finished" do
|
34
|
-
recorder.
|
34
|
+
expect(recorder).to receive(:stop)
|
35
35
|
listener.instance_variable_set(:@recorder, recorder)
|
36
36
|
|
37
37
|
listener.on_task_finished worker, nil, nil
|
38
38
|
|
39
|
-
listener.instance_variable_get(:@recorder).
|
39
|
+
expect(listener.instance_variable_get(:@recorder)).to be_nil
|
40
40
|
end
|
41
41
|
|
42
42
|
it "stops recording when worker dies" do
|
43
43
|
listener.instance_variable_set(:@recorder, recorder)
|
44
|
-
recorder.
|
44
|
+
expect(recorder).to receive(:stop)
|
45
45
|
|
46
46
|
listener.on_worker_dead(nil)
|
47
47
|
end
|
48
48
|
|
49
49
|
it "deletes the output file if the worker succeeded" do
|
50
|
-
recorder.
|
50
|
+
allow(recorder).to receive(:stop)
|
51
51
|
listener.instance_variable_set(:@recorder, recorder)
|
52
52
|
|
53
|
-
listener.
|
54
|
-
FileUtils.
|
53
|
+
expect(listener).to receive(:output).and_return("./foo.mp4")
|
54
|
+
expect(FileUtils).to receive(:rm_rf).with("./foo.mp4")
|
55
55
|
|
56
56
|
listener.on_task_finished worker, nil, true
|
57
57
|
end
|
@@ -60,7 +60,7 @@ module JCukeForker
|
|
60
60
|
listener = RecordingVncListener.new worker, 'codec' => "flv", 'ext' => 'flv'
|
61
61
|
env = ENV['DISPLAY']
|
62
62
|
ENV['DISPLAY']= ':1'
|
63
|
-
ChildProcess.
|
63
|
+
expect(ChildProcess).to receive(:build).with(
|
64
64
|
'ffmpeg',
|
65
65
|
'-an',
|
66
66
|
'-y',
|
@@ -20,29 +20,29 @@ module JCukeForker
|
|
20
20
|
mock_io_out = double(IO, :sync= => nil)
|
21
21
|
mock_tasks = Array.new(2) { |n| double("Worker-#{n}") }
|
22
22
|
|
23
|
-
TaskManager.
|
24
|
-
StatusServer.
|
25
|
-
File.
|
26
|
-
File.
|
27
|
-
File.
|
23
|
+
expect(TaskManager).to receive(:new).with(features, mock_io_out, {format: format, out: out, extra_args: []}).and_return mock_task_manager
|
24
|
+
expect(StatusServer).to receive(:new).with('/tmp/in').and_return mock_status_server
|
25
|
+
expect(File).to receive(:open).with('/tmp/in', 'w').and_return mock_io_out
|
26
|
+
expect(File).to receive(:open).with('/tmp/out', 'w').and_return mock_io_out
|
27
|
+
expect(File).to receive(:open).with('/tmp/out', 'a').and_return mock_io_out
|
28
28
|
|
29
|
-
mock_status_server.
|
30
|
-
mock_status_server.
|
29
|
+
expect(mock_status_server).to receive(:add_observer).with listeners.first
|
30
|
+
expect(mock_status_server).to receive(:add_observer).with mock_task_manager
|
31
31
|
|
32
|
-
Runner.create(features,
|
32
|
+
expect(Runner.create(features,
|
33
33
|
:max => max,
|
34
34
|
:notify => listeners,
|
35
35
|
:format => format,
|
36
36
|
:log => false,
|
37
37
|
:out => out,
|
38
38
|
:delay => 1
|
39
|
-
).
|
39
|
+
)).to be_kind_of(Runner)
|
40
40
|
end
|
41
41
|
|
42
42
|
it "creates and runs a new runner" do
|
43
43
|
r = double(Runner)
|
44
|
-
Runner.
|
45
|
-
r.
|
44
|
+
expect(Runner).to receive(:create).with(%w[a b], {}).and_return(r)
|
45
|
+
expect(r).to receive(:run)
|
46
46
|
|
47
47
|
Runner.run(%w[a b])
|
48
48
|
end
|
@@ -62,10 +62,9 @@ module JCukeForker
|
|
62
62
|
it "processes the queue" do
|
63
63
|
runner.add_observer listener
|
64
64
|
|
65
|
-
listener.
|
66
|
-
process.
|
67
|
-
process.
|
68
|
-
# listener.should_receive(:update).with(:on_run_finished, false)
|
65
|
+
expect(listener).to receive(:update).with(:on_run_starting)
|
66
|
+
expect(process).to receive(:start)
|
67
|
+
expect(process).to receive(:wait)
|
69
68
|
|
70
69
|
runner.run
|
71
70
|
end
|
@@ -73,9 +72,9 @@ module JCukeForker
|
|
73
72
|
it "fires on_run_interrupted and shuts down if the run is interrupted" do
|
74
73
|
runner.add_observer listener
|
75
74
|
|
76
|
-
process.
|
77
|
-
runner.
|
78
|
-
listener.
|
75
|
+
allow(process).to receive(:wait).and_raise(Interrupt)
|
76
|
+
allow(runner).to receive(:stop)
|
77
|
+
expect(listener).to receive(:update).with(:on_run_interrupted)
|
79
78
|
|
80
79
|
runner.run
|
81
80
|
end
|
@@ -83,11 +82,10 @@ module JCukeForker
|
|
83
82
|
it "fires on_run_interrupted and shuts down if an error occurs" do
|
84
83
|
runner.add_observer listener
|
85
84
|
|
86
|
-
process.
|
87
|
-
runner.
|
88
|
-
listener.should_receive(:update).with(:on_run_interrupted)
|
85
|
+
allow(process).to receive(:wait).and_raise(StandardError)
|
86
|
+
allow(runner).to receive(:stop)
|
89
87
|
|
90
|
-
|
88
|
+
expect{ runner.run }.to raise_error(StandardError)
|
91
89
|
end
|
92
90
|
end
|
93
91
|
|
@@ -3,65 +3,103 @@ require File.expand_path("../../spec_helper", __FILE__)
|
|
3
3
|
module JCukeForker
|
4
4
|
describe Scenarios do
|
5
5
|
it "returns all scenarios and their line numbers" do
|
6
|
-
|
7
|
-
|
6
|
+
allow(Scenarios).to receive(:feature_files).and_return(['features/test1.feature', 'features/test2.feature'])
|
7
|
+
allow(JCukeForker::NormalisedEncodingFile).to receive(:read).with(/features\/test\d\.feature/).and_return(<<-GHERKIN)
|
8
|
+
Feature: Test Feature
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
Scenario: Test Scenario 1
|
11
|
+
Given I do fake precondition
|
12
|
+
When I do fake action
|
13
|
+
Then I get fake assertions
|
14
|
+
|
15
|
+
Scenario: Test Scenario 2
|
16
|
+
Given I do fake precondition
|
17
|
+
When I do fake action
|
18
|
+
Then I get fake assertions
|
19
|
+
GHERKIN
|
20
|
+
|
21
|
+
all_scenarios = Scenarios.all
|
22
|
+
|
23
|
+
expect(all_scenarios.length).to eql 4
|
24
|
+
expect(all_scenarios[0]).to eql "features/test1.feature:3"
|
25
|
+
expect(all_scenarios[1]).to eql "features/test1.feature:8"
|
26
|
+
expect(all_scenarios[2]).to eql "features/test2.feature:3"
|
27
|
+
expect(all_scenarios[3]).to eql "features/test2.feature:8"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "returns all scenarios and their line numbers by tags" do
|
31
|
+
allow(Scenarios).to receive(:feature_files).and_return(['features/test1.feature'])
|
32
|
+
allow(JCukeForker::NormalisedEncodingFile).to receive(:read).with('features/test1.feature').and_return(<<-GHERKIN)
|
33
|
+
Feature: test 1
|
34
|
+
@find_me
|
11
35
|
Scenario: test scenario 1
|
12
36
|
Given nothing happens
|
13
|
-
|
14
37
|
Scenario: test scenario 2
|
15
|
-
Given nothing else happens
|
38
|
+
Given nothing else happens
|
39
|
+
GHERKIN
|
16
40
|
|
41
|
+
all_scenarios = Scenarios.by_args(%W[-t @find_me])
|
17
42
|
|
18
|
-
|
19
|
-
|
43
|
+
expect(all_scenarios.length).to eql 1
|
44
|
+
expect(all_scenarios[0]).to eql "features/test1.feature:3"
|
45
|
+
end
|
20
46
|
|
21
|
-
|
47
|
+
it "returns all scenarios and their line numbers by multiple include tags" do
|
48
|
+
allow(Scenarios).to receive(:feature_files).and_return(['features/test1.feature'])
|
49
|
+
allow(JCukeForker::NormalisedEncodingFile).to receive(:read).with('features/test1.feature').and_return(<<-GHERKIN)
|
50
|
+
Feature: test 1
|
51
|
+
@find_me
|
52
|
+
Scenario: test scenario 1
|
22
53
|
Given nothing happens
|
23
54
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
| 1 |
|
29
|
-
")
|
55
|
+
@me_too
|
56
|
+
Scenario: test scenario 2
|
57
|
+
Given nothing else happens
|
58
|
+
GHERKIN
|
30
59
|
|
31
|
-
|
32
|
-
Cucumber::FeatureFile.stub(:new).with("features/test2.feature").and_return(feature_2)
|
60
|
+
all_scenarios = Scenarios.by_args(%W[-t @find_me,@me_too])
|
33
61
|
|
34
|
-
|
62
|
+
expect(all_scenarios.length).to eql 2
|
63
|
+
expect(all_scenarios[0]).to eql "features/test1.feature:3"
|
64
|
+
expect(all_scenarios[1]).to eql "features/test1.feature:7"
|
65
|
+
end
|
35
66
|
|
36
|
-
|
67
|
+
it "returns all scenarios and their line numbers by multiple and tags" do
|
68
|
+
allow(Scenarios).to receive(:feature_files).and_return(['features/test1.feature'])
|
69
|
+
allow(JCukeForker::NormalisedEncodingFile).to receive(:read).with('features/test1.feature').and_return(<<-GHERKIN)
|
70
|
+
Feature: test 1
|
71
|
+
@find_me @me_too
|
72
|
+
Scenario: test scenario 1
|
73
|
+
Given nothing happens
|
37
74
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
all_scenarios[3].should == "features/test2.feature:10"
|
43
|
-
end
|
75
|
+
@me_too
|
76
|
+
Scenario: test scenario 2
|
77
|
+
Given nothing else happens
|
78
|
+
GHERKIN
|
44
79
|
|
45
|
-
|
46
|
-
|
80
|
+
all_scenarios = Scenarios.by_args(%W[-t @find_me -t @me_too])
|
81
|
+
|
82
|
+
expect(all_scenarios.length).to eql 1
|
83
|
+
expect(all_scenarios[0]).to eql "features/test1.feature:3"
|
84
|
+
end
|
47
85
|
|
48
|
-
|
49
|
-
|
86
|
+
it "returns all scenarios and their line numbers by exclusion tag" do
|
87
|
+
allow(Scenarios).to receive(:feature_files).and_return(['features/test1.feature'])
|
88
|
+
allow(JCukeForker::NormalisedEncodingFile).to receive(:read).with('features/test1.feature').and_return(<<-GHERKIN)
|
89
|
+
Feature: test 1
|
50
90
|
@find_me
|
51
91
|
Scenario: test scenario 1
|
52
92
|
Given nothing happens
|
53
93
|
|
94
|
+
@me_too
|
54
95
|
Scenario: test scenario 2
|
55
|
-
Given nothing else happens
|
96
|
+
Given nothing else happens
|
97
|
+
GHERKIN
|
56
98
|
|
57
|
-
|
58
|
-
|
59
|
-
Scenarios.stub(:feature_files).and_return(['features/test1.feature'])
|
60
|
-
|
61
|
-
all_scenarios = Scenarios.by_args(%W[-t @find_me])
|
99
|
+
all_scenarios = Scenarios.by_args(%W[-t ~@find_me])
|
62
100
|
|
63
|
-
all_scenarios.length.
|
64
|
-
all_scenarios[0].
|
101
|
+
expect(all_scenarios.length).to eql 1
|
102
|
+
expect(all_scenarios[0]).to eql "features/test1.feature:7"
|
65
103
|
end
|
66
104
|
end
|
67
105
|
end
|
@@ -11,9 +11,9 @@ module JCukeForker
|
|
11
11
|
|
12
12
|
# register a listener, just do an end to end test
|
13
13
|
mock_listener = double(AbstractListener, :update => nil)
|
14
|
-
mock_listener.
|
14
|
+
expect(mock_listener).to receive(:update).with(status.to_s, worker_path)
|
15
15
|
mock_io = double(IO, :sync= => nil)
|
16
|
-
File.
|
16
|
+
expect(File).to receive(:open).with('/tmp/in', 'r').and_return(mock_io)
|
17
17
|
|
18
18
|
# expect the worker to register
|
19
19
|
io_in = '/tmp/in'
|
@@ -9,7 +9,7 @@ module JCukeForker
|
|
9
9
|
|
10
10
|
it "can register a worker" do
|
11
11
|
|
12
|
-
mock_file.
|
12
|
+
expect(mock_file).to receive(:write).with("{\"worker\":\"/tmp/jcukeforker-test-socket\",\"feature\":\"feature:1\",\"action\":\"feature\"}#{$-0}")
|
13
13
|
|
14
14
|
task_manager = TaskManager.new [feature], mock_file
|
15
15
|
task_manager.on_worker_register worker_path
|
@@ -17,7 +17,7 @@ module JCukeForker
|
|
17
17
|
|
18
18
|
it "can finish task" do
|
19
19
|
|
20
|
-
mock_file.
|
20
|
+
expect(mock_file).to receive(:write).with("{\"worker\":\"/tmp/jcukeforker-test-socket\",\"feature\":\"feature:1\",\"action\":\"feature\"}#{$-0}")
|
21
21
|
|
22
22
|
task_manager = TaskManager.new [feature], mock_file
|
23
23
|
task_manager.on_task_finished worker_path, nil, nil
|
@@ -25,7 +25,7 @@ module JCukeForker
|
|
25
25
|
|
26
26
|
it "can send '__KILL__' when there are no tasks left" do
|
27
27
|
|
28
|
-
mock_file.
|
28
|
+
expect(mock_file).to receive(:write).with("{\"action\":\"__KILL__\",\"worker\":\"/tmp/jcukeforker-test-socket\"}#{$-0}")
|
29
29
|
|
30
30
|
task_manager = TaskManager.new [], mock_file
|
31
31
|
task_manager.on_task_finished worker_path, nil, nil
|
@@ -35,7 +35,7 @@ module JCukeForker
|
|
35
35
|
task_manager = TaskManager.new [], mock_file
|
36
36
|
def task_manager.pop_task(*args); end
|
37
37
|
task_manager.on_task_finished worker_path, feature, false
|
38
|
-
task_manager.has_failures
|
38
|
+
expect(task_manager.has_failures?).to eql true
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -8,8 +8,8 @@ module JCukeForker
|
|
8
8
|
let(:mock_worker_server) { double(UNIXServer, :close => nil) }
|
9
9
|
let(:mock_worker_socket) { double(UNIXSocket, :close => nil) }
|
10
10
|
let(:worker) do
|
11
|
-
File.
|
12
|
-
mock_status_file.
|
11
|
+
expect(File).to receive(:open).with('/tmp/in', 'a').and_return(mock_status_file)
|
12
|
+
expect(mock_status_file).to receive(:sync=).with(true)
|
13
13
|
Worker.new status_path, worker_path, '1'
|
14
14
|
end
|
15
15
|
|
@@ -19,9 +19,9 @@ module JCukeForker
|
|
19
19
|
|
20
20
|
it "can register worker" do
|
21
21
|
|
22
|
-
mock_status_file.
|
22
|
+
expect(mock_status_file).to receive(:write).with("[\"on_worker_register\",\"1\"]#{$-0}")
|
23
23
|
mock_event_file = double(IO)
|
24
|
-
File.
|
24
|
+
expect(File).to receive(:open).with(worker_path, 'r').and_return(mock_event_file)
|
25
25
|
|
26
26
|
worker.register
|
27
27
|
end
|
@@ -36,7 +36,7 @@ module JCukeForker
|
|
36
36
|
expected_args = formats.flat_map do |f|
|
37
37
|
%W[--format #{f} --out #{path}/some_feature_51.#{f}]
|
38
38
|
end
|
39
|
-
worker.args.each_cons(expected_args.size).include?(expected_args).
|
39
|
+
expect(worker.args.each_cons(expected_args.size).include?(expected_args)).to be true
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
metadata
CHANGED
@@ -1,108 +1,115 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jcukeforker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Gowan
|
8
8
|
- Jari Bakken
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-05-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name: cucumber
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
16
|
requirements:
|
18
|
-
- -
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: 1.1.5
|
21
|
-
- - "<"
|
17
|
+
- - '>='
|
22
18
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
24
|
-
|
19
|
+
version: 2.3.2
|
20
|
+
name: cucumber
|
25
21
|
prerelease: false
|
22
|
+
type: :runtime
|
26
23
|
version_requirements: !ruby/object:Gem::Requirement
|
27
24
|
requirements:
|
28
|
-
- -
|
25
|
+
- - '>='
|
29
26
|
- !ruby/object:Gem::Version
|
30
|
-
version:
|
31
|
-
- - "<"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '2.0'
|
27
|
+
version: 2.3.2
|
34
28
|
- !ruby/object:Gem::Dependency
|
35
|
-
name: vnctools
|
36
29
|
requirement: !ruby/object:Gem::Requirement
|
37
30
|
requirements:
|
38
|
-
- -
|
31
|
+
- - '>='
|
39
32
|
- !ruby/object:Gem::Version
|
40
33
|
version: 0.1.1
|
41
|
-
|
34
|
+
name: vnctools
|
42
35
|
prerelease: false
|
36
|
+
type: :runtime
|
43
37
|
version_requirements: !ruby/object:Gem::Requirement
|
44
38
|
requirements:
|
45
|
-
- -
|
39
|
+
- - '>='
|
46
40
|
- !ruby/object:Gem::Version
|
47
41
|
version: 0.1.1
|
48
42
|
- !ruby/object:Gem::Dependency
|
49
|
-
name: childprocess
|
50
43
|
requirement: !ruby/object:Gem::Requirement
|
51
44
|
requirements:
|
52
|
-
- -
|
45
|
+
- - '>='
|
53
46
|
- !ruby/object:Gem::Version
|
54
47
|
version: 0.5.3
|
55
|
-
|
48
|
+
name: childprocess
|
56
49
|
prerelease: false
|
50
|
+
type: :runtime
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
52
|
requirements:
|
59
|
-
- -
|
53
|
+
- - '>='
|
60
54
|
- !ruby/object:Gem::Version
|
61
55
|
version: 0.5.3
|
62
56
|
- !ruby/object:Gem::Dependency
|
63
|
-
name: rspec
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
58
|
requirements:
|
66
|
-
- -
|
59
|
+
- - '>='
|
67
60
|
- !ruby/object:Gem::Version
|
68
61
|
version: '0'
|
69
|
-
|
62
|
+
name: rspec
|
70
63
|
prerelease: false
|
64
|
+
type: :development
|
71
65
|
version_requirements: !ruby/object:Gem::Requirement
|
72
66
|
requirements:
|
73
|
-
- -
|
67
|
+
- - '>='
|
74
68
|
- !ruby/object:Gem::Version
|
75
69
|
version: '0'
|
76
70
|
- !ruby/object:Gem::Dependency
|
77
|
-
name: coveralls
|
78
71
|
requirement: !ruby/object:Gem::Requirement
|
79
72
|
requirements:
|
80
|
-
- -
|
73
|
+
- - '>='
|
81
74
|
- !ruby/object:Gem::Version
|
82
75
|
version: '0'
|
83
|
-
|
76
|
+
name: coveralls
|
84
77
|
prerelease: false
|
78
|
+
type: :development
|
85
79
|
version_requirements: !ruby/object:Gem::Requirement
|
86
80
|
requirements:
|
87
|
-
- -
|
81
|
+
- - '>='
|
88
82
|
- !ruby/object:Gem::Version
|
89
83
|
version: '0'
|
90
84
|
- !ruby/object:Gem::Dependency
|
91
|
-
name: rake
|
92
85
|
requirement: !ruby/object:Gem::Requirement
|
93
86
|
requirements:
|
94
|
-
- -
|
87
|
+
- - ~>
|
95
88
|
- !ruby/object:Gem::Version
|
96
89
|
version: '10'
|
97
|
-
|
90
|
+
name: rake
|
98
91
|
prerelease: false
|
92
|
+
type: :development
|
99
93
|
version_requirements: !ruby/object:Gem::Requirement
|
100
94
|
requirements:
|
101
|
-
- -
|
95
|
+
- - ~>
|
102
96
|
- !ruby/object:Gem::Version
|
103
97
|
version: '10'
|
104
|
-
|
105
|
-
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
name: pry
|
105
|
+
prerelease: false
|
106
|
+
type: :development
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
description: Library to maintain a forking queue of Cucumber processes, with optional VNC displays. Designed for JRuby and Windows.
|
106
113
|
email:
|
107
114
|
- gowanjason@gmail.com
|
108
115
|
executables:
|
@@ -110,9 +117,9 @@ executables:
|
|
110
117
|
extensions: []
|
111
118
|
extra_rdoc_files: []
|
112
119
|
files:
|
113
|
-
-
|
114
|
-
-
|
115
|
-
-
|
120
|
+
- .gitignore
|
121
|
+
- .rspec
|
122
|
+
- .travis.yml
|
116
123
|
- Gemfile
|
117
124
|
- LICENSE
|
118
125
|
- README.mdown
|
@@ -123,17 +130,17 @@ files:
|
|
123
130
|
- lib/jcukeforker/abstract_listener.rb
|
124
131
|
- lib/jcukeforker/configurable_vnc_server.rb
|
125
132
|
- lib/jcukeforker/formatters/junit_scenario_formatter.rb
|
126
|
-
- lib/jcukeforker/formatters/scenario_line_logger.rb
|
127
133
|
- lib/jcukeforker/logging_listener.rb
|
134
|
+
- lib/jcukeforker/normalised_encoding_file.rb
|
128
135
|
- lib/jcukeforker/recording_vnc_listener.rb
|
129
136
|
- lib/jcukeforker/runner.rb
|
137
|
+
- lib/jcukeforker/scenario_list.rb
|
130
138
|
- lib/jcukeforker/scenarios.rb
|
131
139
|
- lib/jcukeforker/status_server.rb
|
132
140
|
- lib/jcukeforker/task_manager.rb
|
133
141
|
- lib/jcukeforker/version.rb
|
134
142
|
- lib/jcukeforker/worker.rb
|
135
143
|
- lib/jcukeforker/worker_script.rb
|
136
|
-
- spec/jcukeforker/formatters/scenario_line_logger_spec.rb
|
137
144
|
- spec/jcukeforker/logging_listener_spec.rb
|
138
145
|
- spec/jcukeforker/recording_vnc_listener_spec.rb
|
139
146
|
- spec/jcukeforker/runner_spec.rb
|
@@ -145,28 +152,27 @@ files:
|
|
145
152
|
homepage: ''
|
146
153
|
licenses: []
|
147
154
|
metadata: {}
|
148
|
-
post_install_message:
|
155
|
+
post_install_message:
|
149
156
|
rdoc_options: []
|
150
157
|
require_paths:
|
151
158
|
- lib
|
152
159
|
required_ruby_version: !ruby/object:Gem::Requirement
|
153
160
|
requirements:
|
154
|
-
- -
|
161
|
+
- - '>='
|
155
162
|
- !ruby/object:Gem::Version
|
156
163
|
version: '0'
|
157
164
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
165
|
requirements:
|
159
|
-
- -
|
166
|
+
- - '>='
|
160
167
|
- !ruby/object:Gem::Version
|
161
168
|
version: '0'
|
162
169
|
requirements: []
|
163
170
|
rubyforge_project: jcukeforker
|
164
|
-
rubygems_version: 2.
|
165
|
-
signing_key:
|
171
|
+
rubygems_version: 2.1.9
|
172
|
+
signing_key:
|
166
173
|
specification_version: 4
|
167
174
|
summary: CukeForker, for JRuby and Windows
|
168
175
|
test_files:
|
169
|
-
- spec/jcukeforker/formatters/scenario_line_logger_spec.rb
|
170
176
|
- spec/jcukeforker/logging_listener_spec.rb
|
171
177
|
- spec/jcukeforker/recording_vnc_listener_spec.rb
|
172
178
|
- spec/jcukeforker/runner_spec.rb
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'gherkin/tag_expression'
|
2
|
-
module JCukeForker
|
3
|
-
module Formatters
|
4
|
-
class ScenarioLineLogger
|
5
|
-
attr_reader :scenarios
|
6
|
-
|
7
|
-
def initialize(tag_expression = Gherkin::TagExpression.new([]))
|
8
|
-
@scenarios = []
|
9
|
-
@tag_expression = tag_expression
|
10
|
-
end
|
11
|
-
|
12
|
-
def visit_feature_element(feature_element)
|
13
|
-
if @tag_expression.evaluate(feature_element.source_tags)
|
14
|
-
if feature_element.respond_to?(:each_example_row)
|
15
|
-
feature_element.each_example_row do |row|
|
16
|
-
#TODO remove reflection
|
17
|
-
build_scenario(feature_element, row.instance_variable_get(:@cells).first)
|
18
|
-
end
|
19
|
-
else
|
20
|
-
build_scenario(feature_element, feature_element)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def method_missing(*args)
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def build_scenario(feature_element, sub_element)
|
31
|
-
line_number = if sub_element.respond_to?(:line)
|
32
|
-
sub_element.line
|
33
|
-
else
|
34
|
-
sub_element.location.line
|
35
|
-
end
|
36
|
-
@scenarios << [feature_element.feature.file, line_number].join(':')
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require File.expand_path("../../../spec_helper", __FILE__)
|
2
|
-
require 'cucumber/ast/scenario_outline'
|
3
|
-
|
4
|
-
module JCukeForker::Formatters
|
5
|
-
describe ScenarioLineLogger do
|
6
|
-
it "returns scenario names and line numbers for a scenario" do
|
7
|
-
logger = ScenarioLineLogger.new
|
8
|
-
|
9
|
-
feature = double("Cucumber::Ast::Feature")
|
10
|
-
feature_element = double("Cucumber::Ast::Scenario")
|
11
|
-
|
12
|
-
feature.should_receive(:file).twice.and_return('features/test1.feature')
|
13
|
-
feature_element.should_receive(:source_tags).twice.and_return('')
|
14
|
-
feature_element.should_receive(:feature).twice.and_return(feature)
|
15
|
-
feature_element.should_receive(:line).and_return(3)
|
16
|
-
feature_element.should_receive(:line).and_return(6)
|
17
|
-
|
18
|
-
logger.visit_feature_element(feature_element)
|
19
|
-
logger.visit_feature_element(feature_element)
|
20
|
-
|
21
|
-
logger.scenarios.length.should == 2
|
22
|
-
logger.scenarios[0].should == "features/test1.feature:3"
|
23
|
-
logger.scenarios[1].should == "features/test1.feature:6"
|
24
|
-
end
|
25
|
-
|
26
|
-
it "returns scenario names and line numbers for a scenario outline" do
|
27
|
-
logger = ScenarioLineLogger.new
|
28
|
-
|
29
|
-
feature = double("Cucumber::Ast::Feature")
|
30
|
-
row = double("Cucumber::Ast::OutlineTable::ExampleRow")
|
31
|
-
cell = double("Cucumber::Ast::Table::Cell", :line => 4)
|
32
|
-
feature_element = Cucumber::Ast::ScenarioOutline.new(*Array.new(11) {|a| double(a, :each => true) })
|
33
|
-
feature_element.stub(:each_example_row).and_yield(row)
|
34
|
-
|
35
|
-
row.should_receive(:instance_variable_get).with(:@cells).and_return([cell])
|
36
|
-
feature.should_receive(:file).and_return('features/test1.feature')
|
37
|
-
feature_element.should_receive(:source_tags).and_return('')
|
38
|
-
feature_element.should_receive(:feature).and_return(feature)
|
39
|
-
|
40
|
-
logger.visit_feature_element(feature_element)
|
41
|
-
|
42
|
-
logger.scenarios.length.should == 1
|
43
|
-
logger.scenarios[0].should == "features/test1.feature:4"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|