parallel_tests 0.9.2 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --backtrace
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- parallel_tests (0.9.2)
4
+ parallel_tests (0.9.3)
5
5
  parallel
6
6
 
7
7
  GEM
data/Readme.md CHANGED
@@ -65,6 +65,20 @@ Test by pattern (e.g. use one integration server per subfolder / see if you brok
65
65
 
66
66
  Took 29.925333 seconds
67
67
 
68
+ Running things once
69
+ ===================
70
+
71
+ ```Ruby
72
+ # effected by race-condition: first process may boot slower the second
73
+ # either sleep a bit or use a lock for example File.lock
74
+ ParallelTests.first_process? ? do_something : sleep(1)
75
+
76
+ at_exit do
77
+ ParallelTests.wait_for_other_processes_to_finish
78
+ undo_something
79
+ end
80
+ ```
81
+
68
82
  Loggers
69
83
  ===================
70
84
 
@@ -178,8 +192,9 @@ TIPS
178
192
 
179
193
  TODO
180
194
  ====
195
+ - make tests consistently pass with `--order random` in .rspec
181
196
  - fix tests vs cucumber >= 1.2 `unknown option --format`
182
- - add tests for the rake tasks, maybe generate a rails project ...
197
+ - add integration tests for the rake tasks, maybe generate a rails project ...
183
198
  - add unit tests for cucumber runtime formatter
184
199
  - make jRuby compatible [basics](http://yehudakatz.com/2009/07/01/new-rails-isolation-testing/)
185
200
  - make windows compatible
@@ -4,6 +4,8 @@ require 'parallel_tests/grouper'
4
4
  require 'parallel_tests/railtie' if defined? Rails::Railtie
5
5
 
6
6
  module ParallelTests
7
+ GREP_PROCESSES_COMMAND = "ps -ef | grep [T]EST_ENV_NUMBER= 2>&1"
8
+
7
9
  def self.determine_number_of_processes(count)
8
10
  [
9
11
  count,
@@ -27,4 +29,20 @@ module ParallelTests
27
29
 
28
30
  false
29
31
  end
32
+
33
+ def self.first_process?
34
+ !ENV["TEST_ENV_NUMBER"] || ENV["TEST_ENV_NUMBER"].to_i == 0
35
+ end
36
+
37
+ def self.wait_for_other_processes_to_finish
38
+ return unless ENV["TEST_ENV_NUMBER"]
39
+ sleep 1 until number_of_running_processes <= 1
40
+ end
41
+
42
+ # Fun fact: this includes the current process if it's run via parallel_tests
43
+ def self.number_of_running_processes
44
+ result = `#{GREP_PROCESSES_COMMAND}`
45
+ raise "Could not grep for processes -> #{result}" if result.strip != "" && !$?.success?
46
+ result.split("\n").size
47
+ end
30
48
  end
@@ -1,3 +1,3 @@
1
1
  module ParallelTests
2
- VERSION = Version = '0.9.2'
2
+ VERSION = Version = '0.9.3'
3
3
  end
@@ -172,6 +172,14 @@ describe 'CLI' do
172
172
  result.should include('ZZZ')
173
173
  end
174
174
 
175
+ it "can wait_for_other_processes_to_finish" do
176
+ write "test/a_test.rb", "require 'parallel_tests'; ParallelTests.wait_for_other_processes_to_finish; puts 'a'"
177
+ write "test/b_test.rb", "sleep 1; puts 'b'"
178
+ write "test/c_test.rb", "sleep 1.5; puts 'c'"
179
+ write "test/d_test.rb", "sleep 2; puts 'd'"
180
+ run_tests("test", :processes => 4).should include("b\nc\nd\na\n")
181
+ end
182
+
175
183
  context "Test::Unit" do
176
184
  it "runs" do
177
185
  write "test/x1_test.rb", "require 'test/unit'; class XTest < Test::Unit::TestCase; def test_xxx; end; end"
@@ -44,7 +44,13 @@ describe ParallelTests::Test::RuntimeLogger do
44
44
  end
45
45
  end
46
46
 
47
- describe :formatting do
47
+ describe "formatting" do
48
+ def with_rails_defined
49
+ Object.const_set(:Rails, Module.new)
50
+ yield
51
+ Object.send(:remove_const, :Rails)
52
+ end
53
+
48
54
  def call(*args)
49
55
  ParallelTests::Test::RuntimeLogger.message(*args)
50
56
  end
@@ -68,17 +74,17 @@ describe ParallelTests::Test::RuntimeLogger do
68
74
  end
69
75
 
70
76
  it "guesses subdirectory structure for rails test classes" do
71
- module Rails
72
- end
73
- class ActionController
74
- class TestCase
77
+ with_rails_defined do
78
+ class ActionController
79
+ class TestCase
80
+ end
75
81
  end
82
+ class FakeControllerTest < ActionController::TestCase
83
+ end
84
+ test = FakeControllerTest.new
85
+ time = Time.now
86
+ call(test, time, Time.at(time.to_f+2.00)).should == 'test/functional/fake_controller_test.rb:2.00'
76
87
  end
77
- class FakeControllerTest < ActionController::TestCase
78
- end
79
- test = FakeControllerTest.new
80
- time = Time.now
81
- call(test, time, Time.at(time.to_f+2.00)).should == 'test/functional/fake_controller_test.rb:2.00'
82
88
  end
83
89
  end
84
90
  end
@@ -34,7 +34,7 @@ describe ParallelTests do
34
34
  end
35
35
  end
36
36
 
37
- describe :bundler_enabled? do
37
+ describe ".bundler_enabled?" do
38
38
  before do
39
39
  Object.stub!(:const_defined?).with(:Bundler).and_return false
40
40
  end
@@ -67,6 +67,69 @@ describe ParallelTests do
67
67
  end
68
68
  end
69
69
 
70
+ describe ".wait_for_other_processes_to_finish" do
71
+ def with_running_processes(count, wait=0.2)
72
+ count.times { Thread.new{ `TEST_ENV_NUMBER=1; sleep #{wait}` } }
73
+ sleep 0.1
74
+ yield
75
+ ensure
76
+ sleep wait # make sure the threads have finished
77
+ end
78
+
79
+ it "does not wait if not run in parallel" do
80
+ ParallelTests.should_not_receive(:sleep)
81
+ ParallelTests.wait_for_other_processes_to_finish
82
+ end
83
+
84
+ it "stops if only itself is running" do
85
+ ENV["TEST_ENV_NUMBER"] = "2"
86
+ ParallelTests.should_not_receive(:sleep)
87
+ with_running_processes(1) do
88
+ ParallelTests.wait_for_other_processes_to_finish
89
+ end
90
+ end
91
+
92
+ it "waits for other processes to finish" do
93
+ ENV["TEST_ENV_NUMBER"] = "2"
94
+ counter = 0
95
+ ParallelTests.stub(:sleep).with{ sleep 0.1; counter += 1 }
96
+ with_running_processes(2, 0.4) do
97
+ ParallelTests.wait_for_other_processes_to_finish
98
+ end
99
+ counter.should == 3
100
+ end
101
+ end
102
+
103
+ describe ".number_of_running_processes" do
104
+ it "is 0 for nothing" do
105
+ ParallelTests.number_of_running_processes.should == 0
106
+ end
107
+
108
+ it "is 2 when 2 are running" do
109
+ wait = 0.2
110
+ 2.times { Thread.new{ `TEST_ENV_NUMBER=1; sleep #{wait}` } }
111
+ sleep 0.1
112
+ ParallelTests.number_of_running_processes.should == 2
113
+ sleep wait
114
+ end
115
+ end
116
+
117
+ describe ".first_process?" do
118
+ it "is first if no env is set" do
119
+ ParallelTests.first_process?.should == true
120
+ end
121
+
122
+ it "is first if env is set to blank" do
123
+ ENV["TEST_ENV_NUMBER"] = ""
124
+ ParallelTests.first_process?.should == true
125
+ end
126
+
127
+ it "is not first if env is set to something" do
128
+ ENV["TEST_ENV_NUMBER"] = "2"
129
+ ParallelTests.first_process?.should == false
130
+ end
131
+ end
132
+
70
133
  it "has a version" do
71
134
  ParallelTests::VERSION.should =~ /^\d+\.\d+\.\d+/
72
135
  end
@@ -20,6 +20,12 @@ OutputLogger = Struct.new(:output) do
20
20
  end
21
21
  end
22
22
 
23
+ RSpec.configure do |config|
24
+ config.after do
25
+ ENV.delete("TEST_ENV_NUMBER")
26
+ end
27
+ end
28
+
23
29
  def mocked_process
24
30
  open('|cat /dev/null')
25
31
  end
metadata CHANGED
@@ -1,32 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parallel_tests
3
3
  version: !ruby/object:Gem::Version
4
+ version: 0.9.3
4
5
  prerelease:
5
- version: 0.9.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Michael Grosser
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-04 00:00:00.000000000 Z
12
+ date: 2013-01-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- version_requirements: !ruby/object:Gem::Requirement
15
+ name: parallel
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ! '>='
18
20
  - !ruby/object:Gem::Version
19
21
  version: '0'
20
- none: false
22
+ type: :runtime
21
23
  prerelease: false
22
- name: parallel
23
- requirement: !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ! '>='
26
28
  - !ruby/object:Gem::Version
27
29
  version: '0'
28
- none: false
29
- type: :runtime
30
30
  description:
31
31
  email: michael@grosser.it
32
32
  executables:
@@ -37,6 +37,7 @@ extensions: []
37
37
  extra_rdoc_files: []
38
38
  files:
39
39
  - .gitignore
40
+ - .rspec
40
41
  - Gemfile
41
42
  - Gemfile.lock
42
43
  - Rakefile
@@ -84,23 +85,23 @@ rdoc_options: []
84
85
  require_paths:
85
86
  - lib
86
87
  required_ruby_version: !ruby/object:Gem::Requirement
88
+ none: false
87
89
  requirements:
88
90
  - - ! '>='
89
91
  - !ruby/object:Gem::Version
90
92
  version: '0'
91
93
  segments:
92
94
  - 0
93
- hash: -1348773835990268798
94
- none: false
95
+ hash: -3882668074104783522
95
96
  required_rubygems_version: !ruby/object:Gem::Requirement
97
+ none: false
96
98
  requirements:
97
99
  - - ! '>='
98
100
  - !ruby/object:Gem::Version
99
101
  version: '0'
100
102
  segments:
101
103
  - 0
102
- hash: -1348773835990268798
103
- none: false
104
+ hash: -3882668074104783522
104
105
  requirements: []
105
106
  rubyforge_project:
106
107
  rubygems_version: 1.8.24