wakiki-spork 0.8.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/Gemfile +6 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +127 -0
  4. data/assets/bootstrap.rb +29 -0
  5. data/bin/spork +20 -0
  6. data/ext/mkrf_conf.rb +26 -0
  7. data/features/at_exit_during_each_run.feature +35 -0
  8. data/features/cucumber_rails_integration.feature +111 -0
  9. data/features/diagnostic_mode.feature +41 -0
  10. data/features/gemfiles/rails3.0/Gemfile +10 -0
  11. data/features/gemfiles/rails3.0/Gemfile.lock +135 -0
  12. data/features/rails_delayed_loading_workarounds.feature +115 -0
  13. data/features/rspec_rails_integration.feature +92 -0
  14. data/features/spork_debugger.feature +108 -0
  15. data/features/steps/general_steps.rb +3 -0
  16. data/features/steps/rails_steps.rb +63 -0
  17. data/features/steps/sandbox_steps.rb +115 -0
  18. data/features/support/background_job.rb +63 -0
  19. data/features/support/bundler_helpers.rb +42 -0
  20. data/features/support/env.rb +117 -0
  21. data/features/unknown_app_framework.feature +42 -0
  22. data/lib/spork.rb +156 -0
  23. data/lib/spork/app_framework.rb +80 -0
  24. data/lib/spork/app_framework/padrino.rb +22 -0
  25. data/lib/spork/app_framework/rails.rb +167 -0
  26. data/lib/spork/app_framework/rails_stub_files/application.rb +1 -0
  27. data/lib/spork/app_framework/rails_stub_files/application_controller.rb +22 -0
  28. data/lib/spork/app_framework/rails_stub_files/application_helper.rb +3 -0
  29. data/lib/spork/app_framework/unknown.rb +6 -0
  30. data/lib/spork/custom_io_streams.rb +25 -0
  31. data/lib/spork/diagnoser.rb +105 -0
  32. data/lib/spork/ext/rails-reloader.rb +14 -0
  33. data/lib/spork/ext/ruby-debug.rb +150 -0
  34. data/lib/spork/forker.rb +71 -0
  35. data/lib/spork/run_strategy.rb +44 -0
  36. data/lib/spork/run_strategy/forking.rb +32 -0
  37. data/lib/spork/run_strategy/magazine.rb +121 -0
  38. data/lib/spork/run_strategy/magazine/magazine_slave.rb +30 -0
  39. data/lib/spork/run_strategy/magazine/magazine_slave_provider.rb +27 -0
  40. data/lib/spork/run_strategy/magazine/ring_server.rb +10 -0
  41. data/lib/spork/runner.rb +91 -0
  42. data/lib/spork/server.rb +74 -0
  43. data/lib/spork/test_framework.rb +167 -0
  44. data/lib/spork/test_framework/cucumber.rb +24 -0
  45. data/lib/spork/test_framework/rspec.rb +14 -0
  46. data/spec/spec_helper.rb +108 -0
  47. data/spec/spork/app_framework/rails_spec.rb +22 -0
  48. data/spec/spork/app_framework/unknown_spec.rb +12 -0
  49. data/spec/spork/app_framework_spec.rb +16 -0
  50. data/spec/spork/diagnoser_spec.rb +105 -0
  51. data/spec/spork/forker_spec.rb +44 -0
  52. data/spec/spork/run_strategy/forking_spec.rb +38 -0
  53. data/spec/spork/runner_spec.rb +50 -0
  54. data/spec/spork/server_spec.rb +15 -0
  55. data/spec/spork/test_framework/cucumber_spec.rb +11 -0
  56. data/spec/spork/test_framework/rspec_spec.rb +10 -0
  57. data/spec/spork/test_framework_spec.rb +114 -0
  58. data/spec/spork_spec.rb +151 -0
  59. data/spec/support/fake_framework.rb +15 -0
  60. data/spec/support/fake_run_strategy.rb +21 -0
  61. metadata +159 -0
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Spork::Forker do
4
+ describe ".new" do
5
+ it "runs a block in a fork" do
6
+ $var = "hello world"
7
+ Spork::Forker.new { $var = "booyah" }.result
8
+ $var.should == "hello world"
9
+ end
10
+ end
11
+
12
+ describe "#result" do
13
+ it "returns the result" do
14
+ Spork::Forker.new { "results" }.result.should == "results"
15
+ end
16
+ end
17
+
18
+ describe "#running?" do
19
+ it "reports when the fork is running" do
20
+ forker = Spork::Forker.new { sleep 0.1 }
21
+ forker.running?.should == true
22
+ forker.result
23
+ sleep 0.1
24
+ forker.running?.should == false
25
+ end
26
+ end
27
+
28
+ describe "#abort" do
29
+ it "aborts a fork and returns nil for the result" do
30
+ started_at = Time.now
31
+ ended_at = nil
32
+ forker = Spork::Forker.new { sleep 5 }
33
+ Thread.new do
34
+ forker.result.should == nil
35
+ ended_at = Time.now
36
+ end
37
+ sleep 0.5
38
+ forker.abort
39
+ sleep 0.1
40
+ (ended_at - started_at).should be_close(0.5, 0.1)
41
+ forker.running?.should == false
42
+ end
43
+ end
44
+ 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
@@ -0,0 +1,50 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
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
+
9
+ before(:each) do
10
+ @out, @err = StringIO.new, StringIO.new
11
+ end
12
+
13
+ it "finds a matching server with a prefix" do
14
+ Spork::Runner.new(["rs"], @out, @err).find_test_framework.class.should == Spork::TestFramework::RSpec
15
+ end
16
+
17
+ it "shows an error message if no matching server was found" do
18
+ Spork::Runner.new(["argle_bargle"], @out, @err).run.should == false
19
+ @err.string.should include(%(Couldn't find a supported test framework that begins with 'argle_bargle'))
20
+ end
21
+
22
+ it "bootstraps a server when -b is passed in" do
23
+ use_test_server
24
+ @test_framework.should_receive(:bootstrap)
25
+ Spork::Runner.new(['rspec', '-b'], @out, @err).run
26
+ end
27
+
28
+ it "aborts if it can't preload" do
29
+ use_test_server
30
+ @test_framework.should_receive(:preload).and_return(false)
31
+ Spork::Server.should_not_receive(:run)
32
+ Spork::Runner.new(['rspec'], @out, @err).run
33
+ end
34
+
35
+ it "runs the server if all is well" do
36
+ use_test_server
37
+ @test_framework.should_receive(:preload).and_return(true)
38
+ Spork::Server.should_receive(:run)
39
+ Spork::Runner.new(['rspec'], @out, @err).run
40
+ @err.string.should include("Using RSpec")
41
+ end
42
+
43
+ it "outputs a list of supported servers, along with supported asterisk" do
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)
47
+
48
+ Spork::Runner.new(['rspec'], @out, @err).supported_test_frameworks_text.should include("(*) RSpec")
49
+ end
50
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Spork::Server do
4
+ describe "a fake server" do
5
+ before(:each) do
6
+ @fake_run_strategy = FakeRunStrategy.new
7
+ @server = Spork::Server.new(:run_strategy => @fake_run_strategy)
8
+ end
9
+
10
+ it "accepts a port" do
11
+ @server.port = 12345
12
+ @server.port.should == 12345
13
+ end
14
+ end
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,151 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ Spork.class_eval do
4
+ def self.reset!
5
+ @state = nil
6
+ @already_ran = nil
7
+ end
8
+ end
9
+
10
+ describe Spork do
11
+ before(:each) do
12
+ Spork.reset!
13
+ end
14
+
15
+ def spec_helper_simulator
16
+ @ran ||= []
17
+ Spork.prefork do
18
+ @ran << :prefork
19
+ end
20
+
21
+ Spork.each_run do
22
+ @ran << :each_run
23
+ end
24
+ @ran
25
+ end
26
+
27
+ it "only runs the preload block when preforking" do
28
+ Spork.exec_prefork { spec_helper_simulator }
29
+ @ran.should == [:prefork]
30
+ end
31
+
32
+ it "only runs the each_run block when running" do
33
+ Spork.exec_prefork { spec_helper_simulator }
34
+ @ran.should == [:prefork]
35
+
36
+ Spork.exec_each_run
37
+ @ran.should == [:prefork, :each_run]
38
+ end
39
+
40
+ it "runs both blocks when Spork not activated" do
41
+ spec_helper_simulator.should == [:prefork, :each_run]
42
+ end
43
+
44
+ it "prevents blocks from being ran twice" do
45
+ Spork.exec_prefork { spec_helper_simulator }
46
+ Spork.exec_each_run
47
+ @ran.clear
48
+ Spork.exec_prefork { spec_helper_simulator }
49
+ Spork.exec_each_run
50
+ @ran.should == []
51
+ end
52
+
53
+ it "runs multiple prefork and each_run blocks at different locations" do
54
+ Spork.prefork { }
55
+ Spork.each_run { }
56
+ spec_helper_simulator.should == [:prefork, :each_run]
57
+ end
58
+
59
+ it "expands a caller line, preserving the line number" do
60
+ Spork.send(:expanded_caller, "/boo/../yah.rb:31").should == "/yah.rb:31"
61
+ end
62
+
63
+ describe "#using_spork?" do
64
+ it "returns true if Spork is being used" do
65
+ Spork.using_spork?.should be_false
66
+ Spork.using_spork!
67
+ Spork.using_spork?.should be_true
68
+ end
69
+ end
70
+
71
+ describe "#trap_method" do
72
+ before(:each) do
73
+ Spork.using_spork!
74
+
75
+ Object.class_eval do
76
+ class TrapTest
77
+ def self.output
78
+ @output ||= []
79
+ end
80
+
81
+ def hello
82
+ TrapTest.output << 'hello'
83
+ end
84
+
85
+ def goodbye
86
+ TrapTest.output << 'goodbye'
87
+ end
88
+
89
+ def say_something!
90
+ TrapTest.output << 'something'
91
+ end
92
+ end
93
+ end
94
+ @trap_test = TrapTest.new
95
+ end
96
+
97
+ after(:each) do
98
+ Object.send(:remove_const, :TrapTest)
99
+ end
100
+
101
+ it "delays execution of a method until after Spork.exec_each_run is called" do
102
+ Spork.using_spork!
103
+ Spork.trap_method(TrapTest, :hello)
104
+ @trap_test.hello
105
+ @trap_test.goodbye
106
+ Spork.exec_each_run
107
+ TrapTest.output.should == ['goodbye', 'hello']
108
+ end
109
+
110
+ it "works with methods that have punctuation" do
111
+ Spork.trap_method(TrapTest, :say_something!)
112
+ @trap_test.say_something!
113
+ TrapTest.output.should == []
114
+ Spork.exec_each_run
115
+ TrapTest.output.should == ['something']
116
+ end
117
+ end
118
+
119
+ describe "#trap_class_method" do
120
+ before(:each) do
121
+ Object.class_eval do
122
+ class TrapTest
123
+ def self.output
124
+ @output ||= []
125
+ end
126
+
127
+ def self.hello
128
+ output << 'hello'
129
+ end
130
+
131
+ def self.goodbye
132
+ output << 'goodbye'
133
+ end
134
+ end
135
+ end
136
+ end
137
+
138
+ after(:each) do
139
+ Object.send(:remove_const, :TrapTest)
140
+ end
141
+
142
+ it "delays execution of a method until after Spork.exec_each_run is called" do
143
+ Spork.using_spork!
144
+ Spork.trap_class_method(TrapTest, :hello)
145
+ TrapTest.hello
146
+ TrapTest.goodbye
147
+ Spork.exec_each_run
148
+ TrapTest.output.should == ['goodbye', 'hello']
149
+ end
150
+ end
151
+ 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