timcharper-spork 0.5.10 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -68,6 +68,7 @@ Feature: Rails Integration
68
68
 
69
69
 
70
70
  Scenario: Running spork with a rails app and a non-standard port
71
+ Given this scenario is pending until rspec releases a version that supports --port
71
72
  Given a file named "spec/did_it_work_spec.rb" with:
72
73
  """
73
74
  describe "Did it work?" do
@@ -0,0 +1,3 @@
1
+ Given /^this scenario is pending.+/ do
2
+ pending
3
+ end
@@ -54,7 +54,7 @@ class Spork::AppFramework
54
54
 
55
55
  # Abstract: The path to the file that loads the project environment, ie config/environment.rb. Returns nil if there is none.
56
56
  def entry_point
57
- raise NotImplemented
57
+ raise NotImplementedError
58
58
  end
59
59
 
60
60
  def preload(&block)
@@ -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
@@ -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 }
data/lib/spork/runner.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  require 'optparse'
2
2
  require 'spork/server'
3
+ require 'spork/test_framework'
4
+ require 'spork/run_strategy'
3
5
 
4
6
  module Spork
5
7
  # This is used by bin/spork. It's wrapped in a class because it's easier to test that way.
6
8
  class Runner
7
- attr_reader :server
9
+ attr_reader :test_framework
8
10
 
9
11
  def self.run(args, output, error)
10
12
  self.new(args, output, error).run
@@ -30,74 +32,49 @@ module Spork
30
32
  if @options[:help]
31
33
  @output.puts opt
32
34
  @output.puts
33
- @output.puts supported_servers_text
35
+ @output.puts supported_test_frameworks_text
34
36
  exit(0)
35
37
  end
36
38
  end
37
39
 
38
- def supported_servers_text
40
+ def supported_test_frameworks_text
39
41
  text = StringIO.new
40
42
 
41
43
  text.puts "Supported test frameworks:"
42
- text.puts Spork::Server.supported_servers.sort { |a,b| a.server_name <=> b.server_name }.map { |s| (s.available? ? '(*) ' : '( ) ') + s.server_name }
44
+ text.puts Spork::TestFramework.supported_test_frameworks.sort { |a,b| a.short_name <=> b.short_name }.map { |s| (s.available? ? '(*) ' : '( ) ') + s.short_name }
43
45
  text.puts "\nLegend: ( ) - not detected in project (*) - detected\n"
44
46
  text.string
45
47
  end
46
48
 
47
49
  # Returns a server for the specified (or the detected default) testing framework. Returns nil if none detected, or if the specified is not supported or available.
48
- def find_server
49
- if options[:server_matcher]
50
- @server = Spork::Server.supported_servers(options[:server_matcher]).first
51
- unless @server
52
- @error.puts <<-ERROR
53
- #{options[:server_matcher].inspect} didn't match a supported test framework.
54
-
55
- #{supported_servers_text}
56
- ERROR
57
- return
58
- end
59
-
60
- unless @server.available?
61
- @error.puts <<-USEFUL_ERROR
62
- I can't find the helper file #{@server.helper_file} for the #{@server.server_name} testing framework.
63
- Are you running me from the project directory?
64
- USEFUL_ERROR
65
- return
66
- end
67
- else
68
- @server = Spork::Server.available_servers.first
69
- if @server.nil?
70
- @error.puts <<-USEFUL_ERROR
71
- I can't find any testing frameworks to use.
72
- Are you running me from a project directory?
73
- USEFUL_ERROR
74
- return
75
- end
76
- end
77
- @server
50
+ def find_test_framework
51
+ Spork::TestFramework.factory(@output, @error, options[:server_matcher])
52
+ rescue Spork::TestFramework::NoFrameworksAvailable => e
53
+ @error.puts e.message
54
+ rescue Spork::TestFramework::FactoryException => e
55
+ @error.puts "#{e.message}\n\n#{supported_test_frameworks_text}"
78
56
  end
79
57
 
80
58
  def run
81
- return false unless find_server
59
+ return false unless test_framework = find_test_framework
82
60
  ENV["DRB"] = 'true'
83
- @error.puts "Using #{server.server_name}"
61
+ @error.puts "Using #{test_framework.short_name}"
84
62
  @error.flush
85
63
 
86
- server.port = options[:port]
87
-
88
64
  case
89
65
  when options[:bootstrap]
90
- server.bootstrap
66
+ test_framework.bootstrap
91
67
  when options[:diagnose]
92
68
  require 'spork/diagnoser'
93
69
 
94
- Spork::Diagnoser.install_hook!(server.entry_point)
95
- server.preload
70
+ Spork::Diagnoser.install_hook!(test_framework.entry_point)
71
+ test_framework.preload
96
72
  Spork::Diagnoser.output_results(@output)
97
73
  return true
98
74
  else
99
- return(false) unless server.preload
100
- server.run
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)
101
78
  return true
102
79
  end
103
80
  end
data/lib/spork/server.rb CHANGED
@@ -8,78 +8,16 @@ 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
- @@supported_servers = []
12
-
13
- LOAD_PREFERENCE = ['RSpec', 'Cucumber']
14
- BOOTSTRAP_FILE = File.dirname(__FILE__) + "/../../assets/bootstrap.rb"
15
-
11
+ attr_reader :run_strategy
16
12
  include Spork::CustomIOStreams
17
13
 
18
- # Abstract method: returns the servers port. Override this to return the port that should be used by the test framework.
19
- def self.port
20
- raise NotImplemented
21
- end
22
-
23
- # Abstract method: returns the entry file that loads the testing environment, such as spec/spec_helper.rb.
24
- def self.helper_file
25
- raise NotImplemented
26
- end
27
-
28
- # Convenience method that turns the class name without the namespace
29
- def self.server_name
30
- self.name.gsub('Spork::Server::', '')
14
+ def initialize(options = {})
15
+ @run_strategy = options[:run_strategy]
16
+ @port = options[:port]
31
17
  end
32
18
 
33
- # Returns a list of all testing servers that have detected their testing framework being used in the project.
34
- def self.available_servers
35
- supported_servers.select { |s| s.available? }
36
- end
37
-
38
- # Returns a list of all servers that have been implemented (it keeps track of them automatically via Class.inherited)
39
- def self.supported_servers(starting_with = nil)
40
- @@supported_servers.sort! { |a,b| a.load_preference_index <=> b.load_preference_index }
41
- return @@supported_servers if starting_with.nil?
42
- @@supported_servers.select do |s|
43
- s.server_name.match(/^#{Regexp.escape(starting_with)}/i)
44
- end
45
- end
46
-
47
- # Returns true if the testing frameworks helper file exists. Override if this is not sufficient to detect your testing framework.
48
- def self.available?
49
- File.exist?(helper_file)
50
- end
51
-
52
- # Used to specify
53
- def self.load_preference_index
54
- LOAD_PREFERENCE.index(server_name) || LOAD_PREFERENCE.length
55
- end
56
-
57
- # Detects if the test helper has been bootstrapped.
58
- def self.bootstrapped?
59
- File.read(helper_file).include?("Spork.prefork")
60
- end
61
-
62
- # Bootstraps the current test helper file by prepending a Spork.prefork and Spork.each_run block at the beginning.
63
- def self.bootstrap
64
- if bootstrapped?
65
- stderr.puts "Already bootstrapped!"
66
- return
67
- end
68
- stderr.puts "Bootstrapping #{helper_file}."
69
- contents = File.read(helper_file)
70
- bootstrap_code = File.read(BOOTSTRAP_FILE)
71
- File.open(helper_file, "wb") do |f|
72
- f.puts bootstrap_code
73
- f.puts contents
74
- end
75
-
76
- stderr.puts "Done. Edit #{helper_file} now with your favorite text editor and follow the instructions."
77
- true
78
- end
79
-
80
- def self.run
81
- return unless available?
82
- new.listen
19
+ def self.run(options = {})
20
+ new(options).listen
83
21
  end
84
22
 
85
23
  # Sets up signals and starts the DRb service. If it's successful, it doesn't return. Not ever. You don't need to override this.
@@ -93,18 +31,8 @@ class Spork::Server
93
31
  DRb.thread.join
94
32
  end
95
33
 
96
- def port
97
- self.class.instance_variable_get("@port") || self.class.port
98
- end
34
+ attr_accessor :port
99
35
 
100
- def self.port= p
101
- @port = p
102
- end
103
-
104
- def helper_file
105
- self.class.helper_file
106
- end
107
-
108
36
  # This is the public facing method that is served up by DRb. To use it from the client side (in a testing framework):
109
37
  #
110
38
  # DRb.start_service("druby://localhost:0") # this allows Ruby to do some magical stuff so you can pass an output stream over DRb.
@@ -114,66 +42,10 @@ class Spork::Server
114
42
  #
115
43
  # When implementing a test server, don't override this method: override run_tests instead.
116
44
  def run(argv, stderr, stdout)
117
- abort if running?
118
-
119
- @child = ::Spork::Forker.new do
120
- $stdout, $stderr = stdout, stderr
121
- Spork.exec_each_run { load helper_file }
122
- run_tests(argv, stderr, stdout)
123
- end
124
- @child.result
45
+ run_strategy.run(argv, stderr, stdout)
125
46
  end
126
47
 
127
- # returns whether or not the child (a test run) is running right now.
128
- def running?
129
- @child && @child.running?
130
- end
131
-
132
- protected
133
- # Abstract method: here is where the server runs the tests.
134
- def run_tests(argv, input, output)
135
- raise NotImplemented
136
- end
137
-
138
48
  private
139
- def self.inherited(subclass)
140
- @@supported_servers << subclass
141
- end
142
-
143
- def self.framework
144
- @framework ||= Spork::AppFramework.detect_framework
145
- end
146
-
147
- def self.entry_point
148
- bootstrapped? ? helper_file : framework.entry_point
149
- end
150
-
151
- def self.preload
152
- Spork.exec_prefork do
153
- unless bootstrapped?
154
- stderr.puts "#{helper_file} has not been bootstrapped. Run spork --bootstrap to do so."
155
- stderr.flush
156
-
157
- if framework.bootstrap_required?
158
- stderr.puts "I can't do anything for you by default for the framework your using: #{framework.short_name}.\nYou must bootstrap #{helper_file} to continue."
159
- stderr.flush
160
- return false
161
- else
162
- load(framework.entry_point)
163
- end
164
- end
165
-
166
- framework.preload do
167
- if bootstrapped?
168
- stderr.puts "Loading Spork.prefork block..."
169
- stderr.flush
170
- load(helper_file)
171
- end
172
- end
173
- end
174
- true
175
- end
176
-
177
49
  def restart
178
50
  stderr.puts "restarting"
179
51
  stderr.flush
@@ -183,12 +55,8 @@ class Spork::Server
183
55
  exec(command_line)
184
56
  end
185
57
 
186
- def abort
187
- @child && @child.abort
188
- end
189
-
190
58
  def sig_int_received
191
- if running?
59
+ if run_strategy.running?
192
60
  abort
193
61
  stderr.puts "Running tests stopped. Press CTRL-C again to stop the server."
194
62
  stderr.flush
@@ -197,5 +65,3 @@ class Spork::Server
197
65
  end
198
66
  end
199
67
  end
200
-
201
- Dir[File.dirname(__FILE__) + "/server/*.rb"].each { |file| require file }
@@ -0,0 +1,24 @@
1
+ class Spork::TestFramework::Cucumber < Spork::TestFramework
2
+ DEFAULT_PORT = 8990
3
+ HELPER_FILE = File.join(Dir.pwd, "features/support/env.rb")
4
+
5
+ class << self
6
+ # REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
7
+ attr_accessor :mother_object
8
+ end
9
+
10
+ def preload
11
+ require 'cucumber'
12
+ begin
13
+ @step_mother = ::Cucumber::StepMother.new
14
+ @step_mother.load_programming_language('rb')
15
+ rescue NoMethodError => pre_cucumber_0_4 # REMOVE WHEN SUPPORT FOR PRE-0.4 IS DROPPED
16
+ @step_mother = Spork::Server::Cucumber.mother_object
17
+ end
18
+ super
19
+ end
20
+
21
+ def run_tests(argv, stderr, stdout)
22
+ ::Cucumber::Cli::Main.new(argv, stdout, stderr).execute!(@step_mother)
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ class Spork::TestFramework::RSpec < Spork::TestFramework
2
+ DEFAULT_PORT = 8989
3
+ HELPER_FILE = File.join(Dir.pwd, "spec/spec_helper.rb")
4
+
5
+ def run_tests(argv, stderr, stdout)
6
+ ::Spec::Runner::CommandLine.run(
7
+ ::Spec::Runner::OptionParser.parse(
8
+ argv,
9
+ stderr,
10
+ stdout
11
+ )
12
+ )
13
+ end
14
+ end
@@ -0,0 +1,167 @@
1
+ class Spork::TestFramework
2
+ LOAD_PREFERENCE = ['RSpec', 'Cucumber']
3
+ BOOTSTRAP_FILE = File.dirname(__FILE__) + "/../../assets/bootstrap.rb"
4
+
5
+ @@supported_test_frameworks = []
6
+ attr_reader :stdout, :stderr
7
+
8
+ class FactoryException < Exception; end
9
+
10
+ class NoFrameworksAvailable < FactoryException
11
+ def message
12
+ "I can't find any testing frameworks to use. Are you running me from a project directory?"
13
+ end
14
+ end
15
+
16
+ class FrameworkNotAvailable < FactoryException
17
+ def initialize(framework)
18
+ @framework = framework
19
+ end
20
+
21
+ def message
22
+ "I can't find the file #{e.test_framework.helper_file} for the #{e.test_framework.short_name} testing framework.\nAre you running me from the project directory?"
23
+ end
24
+ end
25
+
26
+ class NoFrameworkMatched < FactoryException
27
+ def initialize(beginning_with)
28
+ @beginning_with = beginning_with
29
+ end
30
+
31
+ def message
32
+ "Couldn't find a supported test framework that begins with '#{@beginning_with}'"
33
+ end
34
+ end
35
+
36
+ def initialize(stdout = STDOUT, stderr = STDERR)
37
+ @stdout, @stderr = stdout, stderr
38
+ end
39
+
40
+ def self.factory(output = STDOUT, error = STDERR, beginning_with = nil)
41
+ if beginning_with
42
+ @klass = supported_test_frameworks(beginning_with).first
43
+ raise(NoFrameworkMatched.new(beginning_with)) if @klass.nil?
44
+ raise(FrameworkNotAvailable.new(@klass)) unless @klass.available?
45
+ else
46
+ @klass = available_test_frameworks.first
47
+ raise(NoFrameworksAvailable.new) unless @klass
48
+ end
49
+ @klass.new(output, error)
50
+ end
51
+
52
+ def self.helper_file
53
+ self::HELPER_FILE
54
+ end
55
+
56
+ def self.default_port
57
+ (ENV["#{short_name.upcase}_DRB"] || self::DEFAULT_PORT).to_i
58
+ end
59
+
60
+ def self.short_name
61
+ self.name.gsub('Spork::TestFramework::', '')
62
+ end
63
+
64
+ # Returns a list of all testing servers that have detected their testing framework being used in the project.
65
+ def self.available_test_frameworks
66
+ supported_test_frameworks.select { |s| s.available? }
67
+ end
68
+
69
+ # Returns a list of all servers that have been implemented (it keeps track of them automatically via Class.inherited)
70
+ def self.supported_test_frameworks(starting_with = nil)
71
+ @@supported_test_frameworks.sort! { |a,b| a.load_preference_index <=> b.load_preference_index }
72
+ return @@supported_test_frameworks if starting_with.nil?
73
+ @@supported_test_frameworks.select do |s|
74
+ s.short_name.match(/^#{Regexp.escape(starting_with)}/i)
75
+ end
76
+ end
77
+
78
+ def short_name
79
+ self.class.short_name
80
+ end
81
+
82
+ def helper_file
83
+ self.class.helper_file
84
+ end
85
+
86
+ # Detects if the test helper has been bootstrapped.
87
+ def bootstrapped?
88
+ File.read(helper_file).include?("Spork.prefork")
89
+ end
90
+
91
+ # Bootstraps the current test helper file by prepending a Spork.prefork and Spork.each_run block at the beginning.
92
+ def bootstrap
93
+ if bootstrapped?
94
+ stderr.puts "Already bootstrapped!"
95
+ return
96
+ end
97
+ stderr.puts "Bootstrapping #{helper_file}."
98
+ contents = File.read(helper_file)
99
+ bootstrap_code = File.read(BOOTSTRAP_FILE)
100
+ File.open(helper_file, "wb") do |f|
101
+ f.puts bootstrap_code
102
+ f.puts contents
103
+ end
104
+
105
+ stderr.puts "Done. Edit #{helper_file} now with your favorite text editor and follow the instructions."
106
+ true
107
+ end
108
+
109
+ # Returns true if the testing frameworks helper file exists. Override if this is not sufficient to detect your testing framework.
110
+ def self.available?
111
+ File.exist?(helper_file)
112
+ end
113
+
114
+ # Used to specify
115
+ def self.load_preference_index
116
+ LOAD_PREFERENCE.index(short_name) || LOAD_PREFERENCE.length
117
+ end
118
+
119
+ def preload
120
+ Spork.exec_prefork do
121
+ unless bootstrapped?
122
+ stderr.puts "#{helper_file} has not been bootstrapped. Run spork --bootstrap to do so."
123
+ stderr.flush
124
+
125
+ if framework.bootstrap_required?
126
+ stderr.puts "I can't do anything for you by default for the framework your using: #{framework.short_name}.\nYou must bootstrap #{helper_file} to continue."
127
+ stderr.flush
128
+ return false
129
+ else
130
+ load(framework.entry_point)
131
+ end
132
+ end
133
+
134
+ framework.preload do
135
+ if bootstrapped?
136
+ stderr.puts "Loading Spork.prefork block..."
137
+ stderr.flush
138
+ load(helper_file)
139
+ end
140
+ end
141
+ end
142
+ true
143
+ end
144
+
145
+ def run_tests(argv, stderr, stdout)
146
+ raise NotImplementedError
147
+ end
148
+
149
+ def entry_point
150
+ bootstrapped? ? helper_file : framework.entry_point
151
+ end
152
+
153
+ def default_port
154
+ self.class.default_port
155
+ end
156
+
157
+ protected
158
+ def self.inherited(subclass)
159
+ @@supported_test_frameworks << subclass
160
+ end
161
+
162
+ def framework
163
+ @framework ||= Spork::AppFramework.detect_framework
164
+ end
165
+ end
166
+
167
+ Spork.detect_and_require('spork/test_framework/*.rb')
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)
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'rubygems'
2
- require 'spec'
3
2
 
4
3
  unless $spec_helper_loaded
5
4
  $spec_helper_loaded = true
@@ -9,7 +8,6 @@ unless $spec_helper_loaded
9
8
 
10
9
  require 'spork'
11
10
  require 'spork/runner.rb'
12
- require 'spork/server.rb'
13
11
  require 'spork/diagnoser.rb'
14
12
  require 'stringio'
15
13
  require 'fileutils'
@@ -34,7 +32,11 @@ unless $spec_helper_loaded
34
32
  File.open(filename, 'wb') { |f| f << contents }
35
33
  end
36
34
  end
37
-
35
+
36
+ def create_helper_file(test_framework = FakeFramework)
37
+ create_file(test_framework.helper_file, "# stub spec helper file")
38
+ end
39
+
38
40
  def in_current_dir(&block)
39
41
  Dir.chdir(current_dir, &block)
40
42
  end
@@ -104,4 +106,6 @@ unless $spec_helper_loaded
104
106
  end
105
107
  end
106
108
  end
109
+
110
+ Dir.glob(File.dirname(__FILE__) + "/support/*.rb").each { |f| require(f) }
107
111
  end
@@ -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
@@ -1,60 +1,54 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  describe Spork::Runner do
4
+ def use_test_server(klass = Spork::TestFramework::RSpec)
5
+ @test_framework = klass.new
6
+ Spork::TestFramework.stub!(:factory).and_return(@test_framework)
7
+ end
8
+
4
9
  before(:each) do
5
10
  @out, @err = StringIO.new, StringIO.new
6
11
  end
7
12
 
8
13
  it "finds a matching server with a prefix" do
9
- Spork::Runner.new(["rs"], @out, @err).find_server.should == Spork::Server::RSpec
14
+ Spork::Runner.new(["rs"], @out, @err).find_test_framework.class.should == Spork::TestFramework::RSpec
10
15
  end
11
16
 
12
17
  it "shows an error message if no matching server was found" do
13
18
  Spork::Runner.new(["argle_bargle"], @out, @err).run.should == false
14
- @err.string.should include(%("argle_bargle" didn't match a supported test framework))
15
- end
16
-
17
- it "defaults to use rspec over cucumber" do
18
- Spork::Server::RSpec.stub!(:available?).and_return(true)
19
- Spork::Server::Cucumber.stub!(:available?).and_return(true)
20
- Spork::Runner.new([], @out, @err).find_server.should == Spork::Server::RSpec
21
- end
22
-
23
- it "defaults to use cucumber when rspec not available" do
24
- Spork::Server::RSpec.stub!(:available?).and_return(false)
25
- Spork::Server::Cucumber.stub!(:available?).and_return(true)
26
- Spork::Runner.new([], @out, @err).find_server.should == Spork::Server::Cucumber
19
+ @err.string.should include(%(Couldn't find a supported test framework that begins with 'argle_bargle'))
27
20
  end
28
21
 
29
22
  it "bootstraps a server when -b is passed in" do
30
- Spork::Server::RSpec.stub!(:available?).and_return(true)
31
- Spork::Server::RSpec.should_receive(:bootstrap).and_return(true)
23
+ use_test_server
24
+ @test_framework.should_receive(:bootstrap)
32
25
  Spork::Runner.new(['rspec', '-b'], @out, @err).run
33
26
  end
34
27
 
35
28
  it "aborts if it can't preload" do
36
- Spork::Server::RSpec.stub!(:available?).and_return(true)
37
- Spork::Server::RSpec.should_receive(:preload).and_return(false)
38
- Spork::Server::RSpec.should_not_receive(:run)
29
+ use_test_server
30
+ @test_framework.should_receive(:preload).and_return(false)
31
+ Spork::Server.should_not_receive(:run)
39
32
  Spork::Runner.new(['rspec'], @out, @err).run
40
33
  end
41
34
 
42
35
  it "runs the server if all is well" do
43
- Spork::Server::RSpec.stub!(:available?).and_return(true)
44
- Spork::Server::RSpec.should_receive(:preload).and_return(true)
45
- Spork::Server::RSpec.should_receive(:run).and_return(true)
36
+ use_test_server
37
+ @test_framework.should_receive(:preload).and_return(true)
38
+ Spork::Server.should_receive(:run)
46
39
  Spork::Runner.new(['rspec'], @out, @err).run
47
40
  @err.string.should include("Using RSpec")
48
41
  end
49
42
 
50
43
  it "outputs a list of supported servers, along with supported asterisk" do
51
- Spork::Server.stub!(:supported_servers).and_return([Spork::Server::RSpec, Spork::Server::Cucumber])
52
- Spork::Server::RSpec.stub!(:available?).and_return(true)
53
- Spork::Server::Cucumber.stub!(:available?).and_return(false)
44
+ Spork::Server.stub!(:supported_test_frameworks).and_return([Spork::TestFramework::RSpec, Spork::TestFramework::Cucumber])
45
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
46
+ Spork::TestFramework::Cucumber.stub!(:available?).and_return(false)
54
47
 
55
- Spork::Runner.new(['rspec'], @out, @err).supported_servers_text.should == <<-EOF
48
+ Spork::Runner.new(['rspec'], @out, @err).supported_test_frameworks_text.should == <<-EOF
56
49
  Supported test frameworks:
57
50
  ( ) Cucumber
51
+ ( ) FakeFramework
58
52
  (*) RSpec
59
53
 
60
54
  Legend: ( ) - not detected in project (*) - detected
@@ -1,141 +1,15 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
-
4
- class FakeServer < Spork::Server
5
- attr_accessor :wait_time
6
-
7
- include Spork::TestIOStreams
8
-
9
- def self.helper_file
10
- SPEC_TMP_DIR + "/fake/test_helper.rb"
11
- end
12
-
13
- def self.port
14
- 1000
15
- end
16
-
17
- def run_tests(argv, input, output)
18
- sleep(@wait_time || 0.5)
19
- true
20
- end
21
- end
22
-
23
3
  describe Spork::Server do
24
- describe ".available_servers" do
25
- before(:each) do
26
- Spork::Server.supported_servers.each { |s| s.stub!(:available?).and_return(false) }
27
- end
28
-
29
- it "returns a list of all available servers" do
30
- Spork::Server.available_servers.should == []
31
- Spork::Server::RSpec.stub!(:available?).and_return(true)
32
- Spork::Server.available_servers.should == [Spork::Server::RSpec]
33
- end
34
-
35
- it "returns rspec before cucumber when both are available" do
36
- Spork::Server::RSpec.stub!(:available?).and_return(true)
37
- Spork::Server::Cucumber.stub!(:available?).and_return(true)
38
- Spork::Server.available_servers.should == [Spork::Server::RSpec, Spork::Server::Cucumber]
39
- end
40
- end
41
-
42
- describe ".supported_servers" do
43
- it "returns all defined servers" do
44
- Spork::Server.supported_servers.should include(Spork::Server::RSpec)
45
- Spork::Server.supported_servers.should include(Spork::Server::Cucumber)
46
- end
47
-
48
- it "returns a list of servers matching a case-insensitive prefix" do
49
- Spork::Server.supported_servers("rspec").should == [Spork::Server::RSpec]
50
- Spork::Server.supported_servers("rs").should == [Spork::Server::RSpec]
51
- Spork::Server.supported_servers("cuc").should == [Spork::Server::Cucumber]
52
- end
53
- end
54
-
55
4
  describe "a fake server" do
56
- def create_helper_file
57
- create_file(FakeServer.helper_file, "# stub spec helper file")
58
- end
59
-
60
5
  before(:each) do
61
- @fake = FakeServer.new
62
- end
63
-
64
- it "should be available when the helper_file exists" do
65
- FakeServer.available?.should == false
66
- create_helper_file
67
- FakeServer.available?.should == true
68
- end
69
-
70
- it "has a name" do
71
- FakeServer.server_name.should == "FakeServer"
72
- end
73
-
74
- it "tells if it's testing framework is being used" do
75
- Spork::Server.available_servers.should_not include(FakeServer)
76
- create_helper_file
77
- Spork::Server.available_servers.should include(FakeServer)
78
- end
79
-
80
- it "recognizes if the helper_file has been bootstrapped" do
81
- bootstrap_contents = File.read(FakeServer::BOOTSTRAP_FILE)
82
- File.stub!(:read).with(FakeServer.helper_file).and_return("")
83
- FakeServer.bootstrapped?.should == false
84
- File.stub!(:read).with(FakeServer.helper_file).and_return(bootstrap_contents)
85
- FakeServer.bootstrapped?.should == true
86
- end
87
-
88
- it "bootstraps a file" do
89
- create_helper_file
90
- FakeServer.bootstrap
91
-
92
- $test_stderr.string.should include("Bootstrapping")
93
- $test_stderr.string.should include("Edit")
94
- $test_stderr.string.should include("favorite text editor")
95
-
96
- File.read(FakeServer.helper_file).should include(File.read(FakeServer::BOOTSTRAP_FILE))
6
+ @fake_run_strategy = FakeRunStrategy.new
7
+ @server = Spork::Server.new(:run_strategy => @fake_run_strategy)
97
8
  end
98
-
99
- it "aborts the current running thread when another run is started" do
100
- create_helper_file
101
- @fake.wait_time = 0.25
102
- first_run = Thread.new { @fake.run("test", STDOUT, STDIN).should == nil }
103
- sleep(0.05)
104
- @fake.run("test", STDOUT, STDIN).should == true
105
9
 
106
- # wait for the first to finish
107
- first_run.join
108
- end
109
-
110
- it "can abort the current run" do
111
- create_helper_file
112
- @fake.wait_time = 5
113
- started_at = Time.now
114
- first_run = Thread.new { @fake.run("test", STDOUT, STDIN).should == true }
115
- sleep(0.05)
116
- @fake.send(:abort)
117
- sleep(0.01) while @fake.running?
118
-
119
- (Time.now - started_at).should < @fake.wait_time
120
- end
121
-
122
- it "returns the result of the run_tests method from the forked child" do
123
- create_helper_file
124
- @fake.stub!(:run_tests).and_return("tests were ran")
125
- @fake.run("test", STDOUT, STDIN).should == "tests were ran"
126
- end
127
-
128
10
  it "accepts a port" do
129
- create_helper_file
130
- @fake.class.port = 12345
131
- @fake.port.should == 12345
132
- end
133
-
134
- it "falls back to a default port" do
135
- create_helper_file
136
- @fake.class.port = nil
137
- @fake.port.should == FakeServer.port
11
+ @server.port = 12345
12
+ @server.port.should == 12345
138
13
  end
139
-
140
14
  end
141
15
  end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require File.dirname(__FILE__) + "/../test_framework_spec"
3
+
4
+ describe Spork::TestFramework::Cucumber do
5
+ before(:each) do
6
+ @klass = Spork::TestFramework::Cucumber
7
+ @server = @klass.new
8
+ end
9
+
10
+ it_should_behave_like "a TestFramework"
11
+ end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require File.dirname(__FILE__) + "/../test_framework_spec"
3
+
4
+ describe Spork::TestFramework::RSpec do
5
+ before(:each) do
6
+ @klass = Spork::TestFramework::RSpec
7
+ end
8
+
9
+ it_should_behave_like "a TestFramework"
10
+ end
@@ -0,0 +1,114 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "a TestFramework", :shared => true do
4
+ describe ".default_port" do
5
+ it "uses the DEFAULT_PORT when the environment variable is not set" do
6
+ @klass.default_port.should == @klass::DEFAULT_PORT
7
+ end
8
+
9
+ it 'uses ENV["#{short_name.upcase}_DRB"] as port if present' do
10
+ env_name = "#{@klass.short_name.upcase}_DRB"
11
+ orig, ENV[env_name] = ENV[env_name], "9000"
12
+ begin
13
+ @klass.default_port.should == 9000
14
+ ensure
15
+ ENV[env_name] = orig
16
+ end
17
+ end
18
+ end
19
+
20
+ describe ".helper_file" do
21
+ it "returns ::HELPER_FILE for the TestFramework" do
22
+ @klass.helper_file.should == @klass::HELPER_FILE
23
+ end
24
+ end
25
+ end
26
+
27
+ describe Spork::TestFramework do
28
+
29
+ before(:each) do
30
+ @fake = FakeFramework.new
31
+ end
32
+
33
+ describe ".available_test_frameworks" do
34
+ before(:each) do
35
+ Spork::TestFramework.supported_test_frameworks.each { |s| s.stub!(:available?).and_return(false) }
36
+ end
37
+
38
+ it "returns a list of all available servers" do
39
+ Spork::TestFramework.available_test_frameworks.should == []
40
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
41
+ Spork::TestFramework.available_test_frameworks.should == [Spork::TestFramework::RSpec]
42
+ end
43
+
44
+ it "returns rspec before cucumber when both are available" do
45
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
46
+ Spork::TestFramework::Cucumber.stub!(:available?).and_return(true)
47
+ Spork::TestFramework.available_test_frameworks.should == [Spork::TestFramework::RSpec, Spork::TestFramework::Cucumber]
48
+ end
49
+ end
50
+
51
+ describe ".supported_test_frameworks" do
52
+ it "returns all defined servers" do
53
+ Spork::TestFramework.supported_test_frameworks.should include(Spork::TestFramework::RSpec)
54
+ Spork::TestFramework.supported_test_frameworks.should include(Spork::TestFramework::Cucumber)
55
+ end
56
+
57
+ it "returns a list of servers matching a case-insensitive prefix" do
58
+ Spork::TestFramework.supported_test_frameworks("rspec").should == [Spork::TestFramework::RSpec]
59
+ Spork::TestFramework.supported_test_frameworks("rs").should == [Spork::TestFramework::RSpec]
60
+ Spork::TestFramework.supported_test_frameworks("cuc").should == [Spork::TestFramework::Cucumber]
61
+ end
62
+ end
63
+
64
+ describe ".short_name" do
65
+ it "returns the name of the framework, without the namespace prefix" do
66
+ Spork::TestFramework::Cucumber.short_name.should == "Cucumber"
67
+ end
68
+ end
69
+
70
+ describe ".available?" do
71
+ it "returns true when the helper_file exists" do
72
+ FakeFramework.available?.should == false
73
+ create_helper_file(FakeFramework)
74
+ FakeFramework.available?.should == true
75
+ end
76
+ end
77
+
78
+ describe ".bootstrapped?" do
79
+ it "recognizes if the helper_file has been bootstrapped" do
80
+ bootstrap_contents = File.read(FakeFramework::BOOTSTRAP_FILE)
81
+ File.stub!(:read).with(@fake.helper_file).and_return("")
82
+ @fake.bootstrapped?.should == false
83
+ File.stub!(:read).with(@fake.helper_file).and_return(bootstrap_contents)
84
+ @fake.bootstrapped?.should == true
85
+ end
86
+ end
87
+
88
+ describe ".bootstrap" do
89
+ it "bootstraps a file" do
90
+ create_helper_file
91
+ @fake.bootstrap
92
+
93
+ $test_stderr.string.should include("Bootstrapping")
94
+ $test_stderr.string.should include("Edit")
95
+ $test_stderr.string.should include("favorite text editor")
96
+
97
+ File.read(@fake.helper_file).should include(File.read(FakeFramework::BOOTSTRAP_FILE))
98
+ end
99
+ end
100
+
101
+ describe ".factory" do
102
+ it "defaults to use rspec over cucumber" do
103
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
104
+ Spork::TestFramework::Cucumber.stub!(:available?).and_return(true)
105
+ Spork::TestFramework.factory(STDOUT, STDERR).class.should == Spork::TestFramework::RSpec
106
+ end
107
+
108
+ it "defaults to use cucumber when rspec not available" do
109
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(false)
110
+ Spork::TestFramework::Cucumber.stub!(:available?).and_return(true)
111
+ Spork::TestFramework.factory(STDOUT, STDERR).class.should == Spork::TestFramework::Cucumber
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,15 @@
1
+ class FakeFramework < Spork::TestFramework
2
+ include Spork::TestIOStreams
3
+
4
+ attr_accessor :wait_time
5
+ DEFAULT_PORT = 1000
6
+
7
+ def self.helper_file
8
+ SPEC_TMP_DIR + "/fake/test_helper.rb"
9
+ end
10
+
11
+ def run_tests(argv, input, output)
12
+ sleep(@wait_time || 0.5)
13
+ true
14
+ end
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: timcharper-spork
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.10
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-08-31 00:00:00 -07:00
12
+ date: 2009-09-12 00:00:00 -07:00
13
13
  default_executable: spork
14
14
  dependencies: []
15
15
 
@@ -31,6 +31,7 @@ files:
31
31
  - features/diagnostic_mode.feature
32
32
  - features/rails_delayed_loading_workarounds.feature
33
33
  - features/rspec_rails_integration.feature
34
+ - features/steps/general_steps.rb
34
35
  - features/steps/rails_steps.rb
35
36
  - features/steps/sandbox_steps.rb
36
37
  - features/support/env.rb
@@ -45,21 +46,28 @@ files:
45
46
  - lib/spork/custom_io_streams.rb
46
47
  - lib/spork/diagnoser.rb
47
48
  - lib/spork/forker.rb
49
+ - lib/spork/run_strategy.rb
50
+ - lib/spork/run_strategy/forking.rb
48
51
  - lib/spork/runner.rb
49
52
  - lib/spork/server.rb
50
- - lib/spork/server/cucumber.rb
51
- - lib/spork/server/rspec.rb
53
+ - lib/spork/test_framework.rb
54
+ - lib/spork/test_framework/cucumber.rb
55
+ - lib/spork/test_framework/rspec.rb
52
56
  - spec/spec_helper.rb
53
57
  - spec/spork/app_framework/rails_spec.rb
54
58
  - spec/spork/app_framework/unknown_spec.rb
55
59
  - spec/spork/app_framework_spec.rb
56
60
  - spec/spork/diagnoser_spec.rb
57
61
  - spec/spork/forker_spec.rb
62
+ - spec/spork/run_strategy/forking_spec.rb
58
63
  - spec/spork/runner_spec.rb
59
- - spec/spork/server/cucumber_spec.rb
60
- - spec/spork/server/rspec_spec.rb
61
64
  - spec/spork/server_spec.rb
65
+ - spec/spork/test_framework/cucumber_spec.rb
66
+ - spec/spork/test_framework/rspec_spec.rb
67
+ - spec/spork/test_framework_spec.rb
62
68
  - spec/spork_spec.rb
69
+ - spec/support/fake_framework.rb
70
+ - spec/support/fake_run_strategy.rb
63
71
  has_rdoc: false
64
72
  homepage: http://github.com/timcharper/spork
65
73
  post_install_message:
@@ -94,8 +102,12 @@ test_files:
94
102
  - spec/spork/app_framework_spec.rb
95
103
  - spec/spork/diagnoser_spec.rb
96
104
  - spec/spork/forker_spec.rb
105
+ - spec/spork/run_strategy/forking_spec.rb
97
106
  - spec/spork/runner_spec.rb
98
- - spec/spork/server/cucumber_spec.rb
99
- - spec/spork/server/rspec_spec.rb
100
107
  - spec/spork/server_spec.rb
108
+ - spec/spork/test_framework/cucumber_spec.rb
109
+ - spec/spork/test_framework/rspec_spec.rb
110
+ - spec/spork/test_framework_spec.rb
101
111
  - spec/spork_spec.rb
112
+ - spec/support/fake_framework.rb
113
+ - spec/support/fake_run_strategy.rb
@@ -1,35 +0,0 @@
1
- require 'cucumber'
2
-
3
- class Spork::Server::Cucumber < Spork::Server
4
- CUCUMBER_PORT = 8990
5
- CUCUMBER_HELPER_FILE = File.join(Dir.pwd, "features/support/env.rb")
6
-
7
- class << self
8
- def port
9
- (ENV['CUCUMBER_DRB'] || CUCUMBER_PORT).to_i
10
- end
11
-
12
- def helper_file
13
- CUCUMBER_HELPER_FILE
14
- end
15
-
16
- # REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
17
- attr_accessor :step_mother
18
- end
19
-
20
- # REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
21
- def step_mother
22
- self.class.step_mother
23
- end
24
-
25
- def run_tests(argv, stderr, stdout)
26
- ::Cucumber::Cli::Main.new(argv, stdout, stderr).execute!(step_mother)
27
- end
28
- end
29
-
30
- begin
31
- Spork::Server::Cucumber.step_mother = ::Cucumber::StepMother.new
32
- Spork::Server::Cucumber.step_mother.load_programming_language('rb') if defined?(Spork::Server)
33
- rescue NoMethodError => pre_cucumber_0_4 # REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
34
- Spork::Server::Cucumber.step_mother = self
35
- end
@@ -1,22 +0,0 @@
1
- class Spork::Server::RSpec < Spork::Server
2
- RSPEC_PORT = 8989
3
- RSPEC_HELPER_FILE = File.join(Dir.pwd, "spec/spec_helper.rb")
4
-
5
- def self.port
6
- (ENV['RSPEC_DRB'] || RSPEC_PORT).to_i
7
- end
8
-
9
- def self.helper_file
10
- RSPEC_HELPER_FILE
11
- end
12
-
13
- def run_tests(argv, stderr, stdout)
14
- ::Spec::Runner::CommandLine.run(
15
- ::Spec::Runner::OptionParser.parse(
16
- argv,
17
- stderr,
18
- stdout
19
- )
20
- )
21
- end
22
- end
@@ -1,25 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
-
3
- describe Spork::Server::Cucumber do
4
- before(:each) do
5
- @server = Spork::Server::Cucumber.new
6
- end
7
-
8
- it "uses the CUCUMBER_PORT for it's default port" do
9
- @server.port.should == Spork::Server::Cucumber::CUCUMBER_PORT
10
- end
11
-
12
- it "uses ENV['CUCUMBER_DRB'] as port if present" do
13
- orig = ENV['CUCUMBER_DRB']
14
- begin
15
- ENV['CUCUMBER_DRB'] = "9000"
16
- @server.port.should == 9000
17
- ensure
18
- ENV['CUCUMBER_DRB'] = orig
19
- end
20
- end
21
-
22
- it "uses the CUCUMBER_HELPER_FILE for it's helper_file" do
23
- @server.helper_file.should == Spork::Server::Cucumber::CUCUMBER_HELPER_FILE
24
- end
25
- end
@@ -1,25 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
-
3
- describe Spork::Server::RSpec do
4
- before(:each) do
5
- @server = Spork::Server::RSpec.new
6
- end
7
-
8
- it "uses the RSPEC_PORT for it's default port" do
9
- @server.port.should == Spork::Server::RSpec::RSPEC_PORT
10
- end
11
-
12
- it "uses ENV['RSPEC_DRB'] as port if present" do
13
- orig = ENV['RSPEC_DRB']
14
- begin
15
- ENV['RSPEC_DRB'] = "9000"
16
- @server.port.should == 9000
17
- ensure
18
- ENV['RSPEC_DRB'] = orig
19
- end
20
- end
21
-
22
- it "uses the RSPEC_HELPER_FILE for it's helper_file" do
23
- @server.helper_file.should == Spork::Server::RSpec::RSPEC_HELPER_FILE
24
- end
25
- end