spork 0.5.11 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/features/steps/general_steps.rb +3 -0
- data/lib/spork.rb +7 -1
- data/lib/spork/run_strategy.rb +40 -0
- data/lib/spork/run_strategy/forking.rb +30 -0
- data/lib/spork/runner.rb +4 -2
- data/lib/spork/server.rb +5 -26
- data/lib/spork/test_framework.rb +5 -1
- data/spec/spec_helper.rb +0 -30
- data/spec/spork/run_strategy/forking_spec.rb +38 -0
- data/spec/spork/server_spec.rb +2 -38
- data/spec/support/fake_run_strategy.rb +21 -0
- metadata +8 -2
data/lib/spork.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
|
2
2
|
module Spork
|
3
3
|
BINARY = File.expand_path(File.dirname(__FILE__) + '/../bin/spork')
|
4
|
-
LIBDIR = File.expand_path(File.dirname(__FILE__))
|
4
|
+
LIBDIR = File.expand_path("..", File.dirname(__FILE__))
|
5
5
|
|
6
6
|
class << self
|
7
7
|
# Run a block, during prefork mode. By default, if prefork is called twice in the same file and line number, the supplied block will only be ran once.
|
@@ -70,6 +70,12 @@ module Spork
|
|
70
70
|
trap_method((class << klass; self; end), method_name)
|
71
71
|
end
|
72
72
|
|
73
|
+
def detect_and_require(subfolder)
|
74
|
+
([LIBDIR] + Gem.latest_load_paths.grep(/spork/)).uniq.each do |gem_path|
|
75
|
+
Dir.glob(File.join(gem_path, subfolder)).each { |file| require file }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
73
79
|
private
|
74
80
|
def alias_method_names(method_name, feature)
|
75
81
|
/^(.+?)([\?\!]{0,1})$/.match(method_name.to_s)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class Spork::RunStrategy
|
2
|
+
attr_reader :test_framework
|
3
|
+
@@run_strategies = []
|
4
|
+
|
5
|
+
def initialize(test_framework)
|
6
|
+
@test_framework = test_framework
|
7
|
+
end
|
8
|
+
|
9
|
+
def preload
|
10
|
+
raise NotImplementedError
|
11
|
+
end
|
12
|
+
|
13
|
+
def run(argv, input, output)
|
14
|
+
raise NotImplementedError
|
15
|
+
end
|
16
|
+
|
17
|
+
def cleanup
|
18
|
+
raise NotImplementedError
|
19
|
+
end
|
20
|
+
|
21
|
+
def running?
|
22
|
+
raise NotImplementedError
|
23
|
+
end
|
24
|
+
|
25
|
+
def abort
|
26
|
+
raise NotImplementedError
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
def self.factory(test_framework)
|
31
|
+
Spork::RunStrategy::Forking.new(test_framework)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.inherited(subclass)
|
35
|
+
@@run_strategies << subclass
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
Dir[File.dirname(__FILE__) + "/run_strategy/*.rb"].each { |file| require file }
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Spork::RunStrategy::Forking < Spork::RunStrategy
|
2
|
+
def self.available?
|
3
|
+
Kernel.respond_to?(:fork)
|
4
|
+
end
|
5
|
+
|
6
|
+
def run(argv, stderr, stdout)
|
7
|
+
abort if running?
|
8
|
+
|
9
|
+
@child = ::Spork::Forker.new do
|
10
|
+
$stdout, $stderr = stdout, stderr
|
11
|
+
load test_framework.helper_file
|
12
|
+
Spork.exec_each_run
|
13
|
+
test_framework.run_tests(argv, stderr, stdout)
|
14
|
+
end
|
15
|
+
@child.result
|
16
|
+
end
|
17
|
+
|
18
|
+
def abort
|
19
|
+
@child && @child.abort
|
20
|
+
end
|
21
|
+
|
22
|
+
def preload
|
23
|
+
test_framework.preload
|
24
|
+
end
|
25
|
+
|
26
|
+
def running?
|
27
|
+
@child && @child.running?
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/lib/spork/runner.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
require 'spork/server'
|
3
3
|
require 'spork/test_framework'
|
4
|
+
require 'spork/run_strategy'
|
4
5
|
|
5
6
|
module Spork
|
6
7
|
# This is used by bin/spork. It's wrapped in a class because it's easier to test that way.
|
@@ -71,8 +72,9 @@ module Spork
|
|
71
72
|
Spork::Diagnoser.output_results(@output)
|
72
73
|
return true
|
73
74
|
else
|
74
|
-
|
75
|
-
|
75
|
+
run_strategy = Spork::RunStrategy.factory(test_framework)
|
76
|
+
return(false) unless run_strategy.preload
|
77
|
+
Spork::Server.run(:port => @options[:port] || test_framework.default_port, :run_strategy => run_strategy)
|
76
78
|
return true
|
77
79
|
end
|
78
80
|
end
|
data/lib/spork/server.rb
CHANGED
@@ -8,11 +8,11 @@ require 'spork/app_framework.rb'
|
|
8
8
|
#
|
9
9
|
# (This was originally based off of spec_server.rb from rspec-rails (David Chelimsky), which was based on Florian Weber's TDDMate)
|
10
10
|
class Spork::Server
|
11
|
-
attr_reader :
|
11
|
+
attr_reader :run_strategy
|
12
12
|
include Spork::CustomIOStreams
|
13
13
|
|
14
14
|
def initialize(options = {})
|
15
|
-
@
|
15
|
+
@run_strategy = options[:run_strategy]
|
16
16
|
@port = options[:port]
|
17
17
|
end
|
18
18
|
|
@@ -31,11 +31,7 @@ class Spork::Server
|
|
31
31
|
DRb.thread.join
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
def port
|
37
|
-
@port || test_framework.class.default_port
|
38
|
-
end
|
34
|
+
attr_accessor :port
|
39
35
|
|
40
36
|
# This is the public facing method that is served up by DRb. To use it from the client side (in a testing framework):
|
41
37
|
#
|
@@ -46,20 +42,7 @@ class Spork::Server
|
|
46
42
|
#
|
47
43
|
# When implementing a test server, don't override this method: override run_tests instead.
|
48
44
|
def run(argv, stderr, stdout)
|
49
|
-
|
50
|
-
|
51
|
-
@child = ::Spork::Forker.new do
|
52
|
-
$stdout, $stderr = stdout, stderr
|
53
|
-
load test_framework.helper_file
|
54
|
-
Spork.exec_each_run
|
55
|
-
test_framework.run_tests(argv, stderr, stdout)
|
56
|
-
end
|
57
|
-
@child.result
|
58
|
-
end
|
59
|
-
|
60
|
-
# returns whether or not the child (a test run) is running right now.
|
61
|
-
def running?
|
62
|
-
@child && @child.running?
|
45
|
+
run_strategy.run(argv, stderr, stdout)
|
63
46
|
end
|
64
47
|
|
65
48
|
private
|
@@ -72,12 +55,8 @@ class Spork::Server
|
|
72
55
|
exec(command_line)
|
73
56
|
end
|
74
57
|
|
75
|
-
def abort
|
76
|
-
@child && @child.abort
|
77
|
-
end
|
78
|
-
|
79
58
|
def sig_int_received
|
80
|
-
if running?
|
59
|
+
if run_strategy.running?
|
81
60
|
abort
|
82
61
|
stderr.puts "Running tests stopped. Press CTRL-C again to stop the server."
|
83
62
|
stderr.flush
|
data/lib/spork/test_framework.rb
CHANGED
@@ -150,6 +150,10 @@ class Spork::TestFramework
|
|
150
150
|
bootstrapped? ? helper_file : framework.entry_point
|
151
151
|
end
|
152
152
|
|
153
|
+
def default_port
|
154
|
+
self.class.default_port
|
155
|
+
end
|
156
|
+
|
153
157
|
protected
|
154
158
|
def self.inherited(subclass)
|
155
159
|
@@supported_test_frameworks << subclass
|
@@ -160,4 +164,4 @@ class Spork::TestFramework
|
|
160
164
|
end
|
161
165
|
end
|
162
166
|
|
163
|
-
|
167
|
+
Spork.detect_and_require('spork/test_framework/*.rb')
|
data/spec/spec_helper.rb
CHANGED
@@ -1,34 +1,4 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'spork'
|
3
|
-
|
4
|
-
Spork.prefork do
|
5
|
-
# Loading more in this block will cause your tests to run faster. However,
|
6
|
-
# if you change any configuration or code from libraries loaded here, you'll
|
7
|
-
# need to restart spork for it take effect.
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
Spork.each_run do
|
12
|
-
# This code will be run each time you run your specs.
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
# --- Instructions ---
|
17
|
-
# - Sort through your spec_helper file. Place as much environment loading
|
18
|
-
# code that you don't normally modify during development in the
|
19
|
-
# Spork.prefork block.
|
20
|
-
# - Place the rest under Spork.each_run block
|
21
|
-
# - Any code that is left outside of the blocks will be ran during preforking
|
22
|
-
# and during each_run!
|
23
|
-
# - These instructions should self-destruct in 10 seconds. If they don't,
|
24
|
-
# feel free to delete them.
|
25
|
-
#
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
require 'rubygems'
|
31
|
-
require 'spec'
|
32
2
|
|
33
3
|
unless $spec_helper_loaded
|
34
4
|
$spec_helper_loaded = true
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe Spork::RunStrategy::Forking do
|
4
|
+
before(:each) do
|
5
|
+
@fake_framework = FakeFramework.new
|
6
|
+
@run_strategy = Spork::RunStrategy::Forking.new(@fake_framework)
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns the result of the run_tests method from the forked child" do
|
11
|
+
create_helper_file
|
12
|
+
@fake_framework.stub!(:run_tests).and_return("tests were ran")
|
13
|
+
@run_strategy.run("test", STDOUT, STDIN).should == "tests were ran"
|
14
|
+
end
|
15
|
+
|
16
|
+
it "aborts the current running thread when another run is started" do
|
17
|
+
create_helper_file
|
18
|
+
@fake_framework.wait_time = 0.25
|
19
|
+
first_run = Thread.new { @run_strategy.run("test", STDOUT, STDIN).should == nil }
|
20
|
+
sleep(0.05)
|
21
|
+
@run_strategy.run("test", STDOUT, STDIN).should == true
|
22
|
+
|
23
|
+
# wait for the first to finish
|
24
|
+
first_run.join
|
25
|
+
end
|
26
|
+
|
27
|
+
it "can abort the current run" do
|
28
|
+
create_helper_file
|
29
|
+
@fake_framework.wait_time = 5
|
30
|
+
started_at = Time.now
|
31
|
+
first_run = Thread.new { @run_strategy.run("test", STDOUT, STDIN).should == true }
|
32
|
+
sleep(0.05)
|
33
|
+
@run_strategy.send(:abort)
|
34
|
+
sleep(0.01) while @run_strategy.running?
|
35
|
+
|
36
|
+
(Time.now - started_at).should < @fake_framework.wait_time
|
37
|
+
end
|
38
|
+
end
|
data/spec/spork/server_spec.rb
CHANGED
@@ -3,49 +3,13 @@ require File.dirname(__FILE__) + '/../spec_helper'
|
|
3
3
|
describe Spork::Server do
|
4
4
|
describe "a fake server" do
|
5
5
|
before(:each) do
|
6
|
-
@
|
7
|
-
@server = Spork::Server.new(:
|
6
|
+
@fake_run_strategy = FakeRunStrategy.new
|
7
|
+
@server = Spork::Server.new(:run_strategy => @fake_run_strategy)
|
8
8
|
end
|
9
|
-
|
10
|
-
it "aborts the current running thread when another run is started" do
|
11
|
-
create_helper_file
|
12
|
-
@fake_framework.wait_time = 0.25
|
13
|
-
first_run = Thread.new { @server.run("test", STDOUT, STDIN).should == nil }
|
14
|
-
sleep(0.05)
|
15
|
-
@server.run("test", STDOUT, STDIN).should == true
|
16
9
|
|
17
|
-
# wait for the first to finish
|
18
|
-
first_run.join
|
19
|
-
end
|
20
|
-
|
21
|
-
it "can abort the current run" do
|
22
|
-
create_helper_file
|
23
|
-
@fake_framework.wait_time = 5
|
24
|
-
started_at = Time.now
|
25
|
-
first_run = Thread.new { @server.run("test", STDOUT, STDIN).should == true }
|
26
|
-
sleep(0.05)
|
27
|
-
@server.send(:abort)
|
28
|
-
sleep(0.01) while @server.running?
|
29
|
-
|
30
|
-
(Time.now - started_at).should < @fake_framework.wait_time
|
31
|
-
end
|
32
|
-
|
33
|
-
it "returns the result of the run_tests method from the forked child" do
|
34
|
-
create_helper_file
|
35
|
-
@fake_framework.stub!(:run_tests).and_return("tests were ran")
|
36
|
-
@server.run("test", STDOUT, STDIN).should == "tests were ran"
|
37
|
-
end
|
38
|
-
|
39
10
|
it "accepts a port" do
|
40
|
-
create_helper_file
|
41
11
|
@server.port = 12345
|
42
12
|
@server.port.should == 12345
|
43
13
|
end
|
44
|
-
|
45
|
-
it "falls back to a default port" do
|
46
|
-
create_helper_file
|
47
|
-
@server.port = nil
|
48
|
-
@server.port.should == FakeFramework.default_port
|
49
|
-
end
|
50
14
|
end
|
51
15
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class FakeRunStrategy < Spork::RunStrategy
|
2
|
+
def initialize(*args)
|
3
|
+
end
|
4
|
+
|
5
|
+
def self.available?
|
6
|
+
true
|
7
|
+
end
|
8
|
+
|
9
|
+
def run(argv, stderr, stdout)
|
10
|
+
sleep(@wait_time || 0.5)
|
11
|
+
true
|
12
|
+
end
|
13
|
+
|
14
|
+
def running?
|
15
|
+
false
|
16
|
+
end
|
17
|
+
|
18
|
+
def preload
|
19
|
+
true
|
20
|
+
end
|
21
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spork
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Harper
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-09-12 00:00:00 -04:00
|
13
13
|
default_executable: spork
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -46,6 +46,8 @@ files:
|
|
46
46
|
- lib/spork/custom_io_streams.rb
|
47
47
|
- lib/spork/diagnoser.rb
|
48
48
|
- lib/spork/forker.rb
|
49
|
+
- lib/spork/run_strategy.rb
|
50
|
+
- lib/spork/run_strategy/forking.rb
|
49
51
|
- lib/spork/runner.rb
|
50
52
|
- lib/spork/server.rb
|
51
53
|
- lib/spork/test_framework.rb
|
@@ -57,6 +59,7 @@ files:
|
|
57
59
|
- spec/spork/app_framework_spec.rb
|
58
60
|
- spec/spork/diagnoser_spec.rb
|
59
61
|
- spec/spork/forker_spec.rb
|
62
|
+
- spec/spork/run_strategy/forking_spec.rb
|
60
63
|
- spec/spork/runner_spec.rb
|
61
64
|
- spec/spork/server_spec.rb
|
62
65
|
- spec/spork/test_framework/cucumber_spec.rb
|
@@ -64,6 +67,7 @@ files:
|
|
64
67
|
- spec/spork/test_framework_spec.rb
|
65
68
|
- spec/spork_spec.rb
|
66
69
|
- spec/support/fake_framework.rb
|
70
|
+
- spec/support/fake_run_strategy.rb
|
67
71
|
has_rdoc: true
|
68
72
|
homepage: http://github.com/timcharper/spork
|
69
73
|
licenses: []
|
@@ -100,6 +104,7 @@ test_files:
|
|
100
104
|
- spec/spork/app_framework_spec.rb
|
101
105
|
- spec/spork/diagnoser_spec.rb
|
102
106
|
- spec/spork/forker_spec.rb
|
107
|
+
- spec/spork/run_strategy/forking_spec.rb
|
103
108
|
- spec/spork/runner_spec.rb
|
104
109
|
- spec/spork/server_spec.rb
|
105
110
|
- spec/spork/test_framework/cucumber_spec.rb
|
@@ -107,3 +112,4 @@ test_files:
|
|
107
112
|
- spec/spork/test_framework_spec.rb
|
108
113
|
- spec/spork_spec.rb
|
109
114
|
- spec/support/fake_framework.rb
|
115
|
+
- spec/support/fake_run_strategy.rb
|