deep_test 1.0.4 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
@@ -0,0 +1,4 @@
1
+ * 1.1.0
2
+
3
+ * DeepTest::TestTask#processes= is now DeepTest::TestTask#number_of_workers=
4
+ * No longer depend on the Daemons gem, use DeepTest::Warlock instead.
data/README CHANGED
@@ -1,10 +1,6 @@
1
1
  = DeepTest
2
2
 
3
- DeepTest enables tests to run in multiple processes.
4
-
5
- == Authors
6
-
7
- anonymous z, Dan[http://www.dcmanges.com/blog] Manges[http://www.dcmanges.com/blog], David Vollbracht
3
+ DeepTest enables tests to run in parallel using multiple processes.
8
4
 
9
5
  == Usage
10
6
 
@@ -14,10 +10,18 @@ In your Rakefile:
14
10
  require "deep_test/rake_tasks"
15
11
 
16
12
  # sample DeepTest task
13
+
17
14
  DeepTest::TestTask.new "task_name" do |t|
15
+ t.number_of_workers = 2 # optional, defaults to 2
18
16
  t.pattern = "test/**/*_test.rb"
19
- t.processes = 2 # optional, defaults to 2
20
17
  end
21
18
 
19
+ == Contributors
20
+
21
+ +* anonymous z
22
+ +* Alex Chaffee
23
+ +* Dan[http://www.dcmanges.com/blog] Manges[http://www.dcmanges.com/blog]
24
+ +* David Vollbracht
25
+
22
26
  == License
23
27
  Released under Ruby's[http://www.ruby-lang.org/en/LICENSE.txt] license[http://www.ruby-lang.org/en/LICENSE.txt]
data/Rakefile CHANGED
@@ -14,8 +14,8 @@ Rake::TestTask.new do |t|
14
14
  end
15
15
 
16
16
  DeepTest::TestTask.new :deep_test do |t|
17
+ t.number_of_workers = 2
17
18
  t.pattern = "test/**/*_test.rb"
18
- t.processes = 2
19
19
  end
20
20
 
21
21
  desc "Generate documentation"
@@ -34,22 +34,22 @@ end
34
34
  Gem::manage_gems
35
35
 
36
36
  specification = Gem::Specification.new do |s|
37
+ s.platform = Gem::Platform::RUBY
37
38
  s.name = "deep_test"
38
39
  s.summary = "DeepTest runs tests in multiple processes."
39
- s.version = "1.0.4"
40
+ s.version = "1.1.0"
40
41
  s.author = "anonymous z, Dan Manges, David Vollbracht"
41
42
  s.description = s.summary
42
43
  s.email = "daniel.manges@gmail.com"
43
44
  s.homepage = "http://deep-test.rubyforge.org"
44
45
  s.rubyforge_project = "deep-test"
45
- s.add_dependency "daemons", ">= 1.0.7"
46
46
 
47
47
  s.has_rdoc = true
48
- s.extra_rdoc_files = ['README']
48
+ s.extra_rdoc_files = ['README', 'CHANGELOG']
49
49
  s.rdoc_options << '--title' << "DeepTest" << '--main' << 'README' << '--line-numbers'
50
50
 
51
51
  s.autorequire = "deep_test"
52
- s.files = FileList['{lib,test}/**/*.{rb,rake}', 'README', 'Rakefile'].to_a
52
+ s.files = FileList['{lib,test}/**/*.{rb,rake}', 'README', 'CHANGELOG', 'Rakefile'].to_a
53
53
  end
54
54
 
55
55
  Rake::GemPackageTask.new(specification) do |package|
@@ -59,3 +59,7 @@ end
59
59
 
60
60
  Rake::Task[:gem].prerequisites.unshift :deep_test
61
61
  Rake::Task[:gem].prerequisites.unshift :test
62
+
63
+ task :tar do
64
+ system "tar zcf pkg/deep_test.tar.gz --exclude=.svn --exclude='*.tar.gz' --exclude='*.gem' --directory=.. deep_test"
65
+ end
@@ -6,7 +6,26 @@ module DeepTest
6
6
  yield
7
7
  $stdout.string
8
8
  ensure
9
- $stdout = old_stdout
9
+ $stdout = old_stdout if old_stdout
10
+ end
11
+
12
+ def retrying(description = nil, times = 5)
13
+ i = 0
14
+ loop do
15
+ begin
16
+ return yield
17
+ rescue => e
18
+ i += 1
19
+ print "#{description} received exception #{e}. "
20
+ if i < times
21
+ puts "Retrying..."
22
+ sleep 0.5
23
+ else
24
+ puts "Aborting."
25
+ raise e
26
+ end
27
+ end
28
+ end
10
29
  end
11
30
  end
12
31
  end
@@ -1,2 +1 @@
1
1
  require File.dirname(__FILE__) + "/test_task"
2
- Dir.glob(File.dirname(__FILE__) + "/tasks/**/*.rake").each { |file| load file }
@@ -16,7 +16,3 @@ module DeepTest
16
16
  end
17
17
  end
18
18
  end
19
-
20
- if __FILE__ == $0
21
- DeepTest::Server.start
22
- end
@@ -1,6 +1,7 @@
1
1
  module DeepTest
2
2
  class TestTask
3
- attr_writer :pattern, :processes
3
+ DEFAULT_NUMBER_OF_WORKERS = 2
4
+ attr_writer :number_of_workers, :pattern
4
5
 
5
6
  def initialize(name = :deep_test)
6
7
  @name = name
@@ -10,30 +11,46 @@ module DeepTest
10
11
 
11
12
  def define
12
13
  desc "Run '#{@name}' suite using DeepTest"
13
- task @name => %w[deep_test:server:start] do
14
+ task @name do
14
15
  begin
15
16
  deep_test_lib = File.expand_path(File.dirname(__FILE__) + "/..")
17
+ $LOAD_PATH << deep_test_lib
18
+ require "deep_test"
19
+ warlock = DeepTest::Warlock.new
16
20
 
21
+ # server
22
+ warlock.start "server" do
23
+ DeepTest::Server.start
24
+ end
25
+ sleep 0.25
26
+
17
27
  # workers
18
- starter = File.expand_path(File.dirname(__FILE__) + "/start_workers.rb")
19
- ruby "-I#{deep_test_lib} #{starter} '#{processes}' '#{pattern}'"
28
+ number_of_workers.times do |i|
29
+ warlock.start "worker #{i}" do
30
+ srand # re-seed random numbers
31
+ ENV["RAILS_ENV"] = "test"
32
+ Object.const_set "RAILS_ENV", "test"
33
+ Dir.glob(pattern).each { |file| load file }
34
+ blackboard = DeepTest::RindaBlackboard.new
35
+ DeepTest::Worker.new(blackboard).run
36
+ end
37
+ end
20
38
 
21
39
  # loader
22
40
  loader = File.expand_path(File.dirname(__FILE__) + "/loader.rb")
23
41
  ruby "-I#{deep_test_lib} #{loader} '#{pattern}'"
24
42
  ensure
25
- Rake::Task["deep_test:workers:stop"].invoke
26
- Rake::Task["deep_test:server:stop"].invoke
43
+ warlock.stop_all if warlock
27
44
  end
28
45
  end
29
46
  end
30
47
 
48
+ def number_of_workers
49
+ @number_of_workers ? @number_of_workers.to_i : DEFAULT_NUMBER_OF_WORKERS
50
+ end
51
+
31
52
  def pattern
32
53
  Dir.pwd + "/" + (@pattern || "test/**/*_test.rb")
33
54
  end
34
-
35
- def processes
36
- @processes ? @processes.to_i : 2
37
- end
38
55
  end
39
56
  end
@@ -8,4 +8,4 @@ module DeepTest
8
8
  Rinda::TupleSpaceProxy.new ts
9
9
  end
10
10
  end
11
- end
11
+ end
@@ -0,0 +1,59 @@
1
+ module DeepTest
2
+ class Warlock
3
+ def initialize
4
+ @demons = []
5
+ end
6
+
7
+ def start(name, &block)
8
+ begin
9
+ pid = Process.fork do
10
+ Signal.trap("HUP") { exit 0 }
11
+ yield
12
+ exit
13
+ end
14
+ raise "fatal: fork returned nil" if pid.nil?
15
+ @demons << [name, pid]
16
+ puts "Started #{name} (#{pid})"
17
+ rescue => e
18
+ puts "exception starting #{name}: #{e}"
19
+ puts "\t" + e.backtrace.join("\n\t")
20
+ end
21
+ end
22
+
23
+ def stop_all
24
+ @demons.reverse.each do |demon|
25
+ name, pid = demon
26
+ if running?(pid)
27
+ Process.kill("HUP", pid)
28
+ end
29
+ end
30
+ @demons.each do |demon|
31
+ name, pid = demon
32
+ begin
33
+ Process.wait(pid)
34
+ rescue Errno::ECHILD => e
35
+ puts e
36
+ end
37
+ puts "Stopped #{name} (#{pid})"
38
+ end
39
+ end
40
+
41
+ #stolen from daemons
42
+ def running?(pid)
43
+ # Check if process is in existence
44
+ # The simplest way to do this is to send signal '0'
45
+ # (which is a single system call) that doesn't actually
46
+ # send a signal
47
+ begin
48
+ Process.kill(0, pid)
49
+ return true
50
+ rescue Errno::ESRCH
51
+ return false
52
+ rescue ::Exception # for example on EPERM (process exists but does not belong to us)
53
+ return true
54
+ #rescue Errno::EPERM
55
+ # return false
56
+ end
57
+ end
58
+ end
59
+ end
data/lib/deep_test.rb CHANGED
@@ -1,8 +1,11 @@
1
1
  module DeepTest
2
2
  end
3
+ require 'rinda/ring'
4
+ require 'rinda/tuplespace'
3
5
 
4
6
  require "test/unit/testresult"
5
7
  require "test/unit/error"
8
+ require 'test/unit/failure'
6
9
 
7
10
  require "deep_test/extensions/testresult"
8
11
  require "deep_test/extensions/error"
@@ -16,3 +19,4 @@ require "deep_test/supervised_test_suite"
16
19
  require "deep_test/supervisor"
17
20
  require "deep_test/test_task"
18
21
  require "deep_test/worker"
22
+ require "deep_test/warlock"
@@ -0,0 +1,37 @@
1
+ require File.dirname(__FILE__) + "/../../test_helper"
2
+
3
+ unit_tests do
4
+ test "retrying once" do
5
+ object = Object.new
6
+ object.expects(:call_it_twice).times(2).raises(RuntimeError).then.returns(:ok)
7
+ result = nil
8
+ capture_stdout do
9
+ result = retrying do
10
+ object.call_it_twice
11
+ end
12
+ end
13
+ assert_equal :ok, result
14
+ end
15
+
16
+ test "retrying defaults to 5 times" do
17
+ object = Object.new
18
+ object.expects(:may_i_please_have_another).times(5).
19
+ raises(RuntimeError).raises(RuntimeError).raises(RuntimeError).raises(RuntimeError).returns("ok")
20
+ capture_stdout do
21
+ retrying do
22
+ object.may_i_please_have_another
23
+ end
24
+ end
25
+ end
26
+
27
+ test "retrying raises exception if still failing after number of attempts" do
28
+ my_error = Class.new(StandardError)
29
+ assert_raises(my_error) do
30
+ capture_stdout do
31
+ retrying "", 1 do
32
+ raise my_error
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ unit_tests do
4
+ test "running? is true if sending kill(0, pid) does not fail" do
5
+ warlock = DeepTest::Warlock.new
6
+ Process.expects(:kill).with(0, :pid)
7
+ assert_equal true, warlock.running?(:pid)
8
+ end
9
+
10
+ test "running? is false if Process.kill(0, pid) raises Errno::ESRCH" do
11
+ warlock = DeepTest::Warlock.new
12
+ Process.stubs(:kill).raises(Errno::ESRCH)
13
+ assert_equal false, warlock.running?(:pid)
14
+ end
15
+
16
+ test "running? is true if Process.kill raises Exception" do
17
+ warlock = DeepTest::Warlock.new
18
+ Process.stubs(:kill).raises(Exception)
19
+ assert_equal true, warlock.running?(:pid)
20
+ end
21
+ end
data/test/test_helper.rb CHANGED
@@ -2,7 +2,6 @@ require 'rubygems'
2
2
  require 'test/unit'
3
3
  require 'dust'
4
4
  require 'mocha'
5
- require 'daemons'
6
5
  $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + "/lib")
7
6
  require "deep_test"
8
7
 
@@ -3,7 +3,7 @@ require File.dirname(__FILE__) + "/test_helper"
3
3
  unit_tests do
4
4
  test "defines a rake task with the name passed to the constructor" do
5
5
  DeepTest::TestTask.any_instance.stubs(:desc)
6
- DeepTest::TestTask.any_instance.expects(:task).with { |hash| hash.keys == [:my_task_name] }
6
+ DeepTest::TestTask.any_instance.expects(:task).with(:my_task_name)
7
7
  DeepTest::TestTask.new :my_task_name do
8
8
  end
9
9
  end
@@ -24,18 +24,18 @@ unit_tests do
24
24
  assert_equal "test/**/*_test.rb", task.pattern[-"test/**/*_test.rb".size..-1]
25
25
  end
26
26
 
27
- test "processes defaults to 2" do
27
+ test "number_of_workers defaults to 2" do
28
28
  task = DeepTest::TestTask.new do |t|
29
29
  t.stubs(:define)
30
30
  end
31
- assert_equal 2, task.processes
31
+ assert_equal 2, task.number_of_workers
32
32
  end
33
33
 
34
- test "processes can be set" do
34
+ test "number_of_workers can be set" do
35
35
  task = DeepTest::TestTask.new do |t|
36
- t.processes = 42
36
+ t.number_of_workers = 42
37
37
  t.stubs(:define)
38
38
  end
39
- assert_equal 42, task.processes
39
+ assert_equal 42, task.number_of_workers
40
40
  end
41
41
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: deep_test
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.0.4
7
- date: 2007-12-08 00:00:00 -06:00
6
+ version: 1.1.0
7
+ date: 2007-12-23 00:00:00 -05:00
8
8
  summary: DeepTest runs tests in multiple processes.
9
9
  require_paths:
10
10
  - lib
@@ -35,16 +35,15 @@ files:
35
35
  - lib/deep_test/rinda_blackboard.rb
36
36
  - lib/deep_test/server.rb
37
37
  - lib/deep_test/simple_test_blackboard.rb
38
- - lib/deep_test/start_workers.rb
39
38
  - lib/deep_test/supervised_test_suite.rb
40
39
  - lib/deep_test/supervisor.rb
41
40
  - lib/deep_test/test_task.rb
42
41
  - lib/deep_test/tuple_space_factory.rb
42
+ - lib/deep_test/warlock.rb
43
43
  - lib/deep_test/worker.rb
44
44
  - lib/deep_test/extensions/error.rb
45
45
  - lib/deep_test/extensions/object_extension.rb
46
46
  - lib/deep_test/extensions/testresult.rb
47
- - lib/deep_test/tasks/rinda.rake
48
47
  - test/simple_test_blackboard_test.rb
49
48
  - test/supervised_test_suite_test.rb
50
49
  - test/supervisor_test.rb
@@ -54,8 +53,10 @@ files:
54
53
  - test/worker_test.rb
55
54
  - test/deep_test/loader_test.rb
56
55
  - test/deep_test/rinda_blackboard_test.rb
57
- - test/deep_test/start_workers_test.rb
56
+ - test/deep_test/warlock_test.rb
57
+ - test/deep_test/extensions/object_extension_test.rb
58
58
  - README
59
+ - CHANGELOG
59
60
  - Rakefile
60
61
  test_files: []
61
62
 
@@ -67,19 +68,12 @@ rdoc_options:
67
68
  - --line-numbers
68
69
  extra_rdoc_files:
69
70
  - README
71
+ - CHANGELOG
70
72
  executables: []
71
73
 
72
74
  extensions: []
73
75
 
74
76
  requirements: []
75
77
 
76
- dependencies:
77
- - !ruby/object:Gem::Dependency
78
- name: daemons
79
- version_requirement:
80
- version_requirements: !ruby/object:Gem::Version::Requirement
81
- requirements:
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- version: 1.0.7
85
- version:
78
+ dependencies: []
79
+
@@ -1,23 +0,0 @@
1
- module DeepTest
2
- module StartWorkers
3
- def self.run(args)
4
- processes, pattern = args
5
- processes.to_i.times do
6
- Daemons.run_proc "deep_test_worker", :multiple => true, :ARGV => ["start"], :backtrace => true, :log_output => true do
7
- require "deep_test"
8
- ENV["RAILS_ENV"] = "test"
9
- Object.const_set "RAILS_ENV", "test"
10
- Dir.glob(pattern).each { |file| load file }
11
- blackboard = DeepTest::RindaBlackboard.new
12
- DeepTest::Worker.new(blackboard).run
13
- end
14
- end
15
- end
16
- end
17
- end
18
-
19
- if __FILE__ == $0
20
- require "rubygems"
21
- require "daemons"
22
- DeepTest::StartWorkers.run ARGV
23
- end
@@ -1,33 +0,0 @@
1
- require "rubygems"
2
- begin
3
- require "daemons"
4
- rescue LoadError
5
- raise "The daemons gem must be installed to use deep_test"
6
- end
7
-
8
- namespace :deep_test do
9
- namespace :server do
10
- task :start do
11
- Daemons.run_proc "deep_test_server", :ARGV => ["start"], :backtrace => true, :log_output => true do
12
- require "deep_test"
13
- ENV["RAILS_ENV"] = "test"
14
- Object.const_set "RAILS_ENV", "test"
15
- DeepTest::Server.start
16
- end
17
- sleep 0.25
18
- end
19
- task :stop do
20
- Daemons.run("deep_test_server", :ARGV => ["stop"])
21
- end
22
- end
23
-
24
- namespace :workers do
25
- task :start do
26
- raise "deprecated -dan"
27
- end
28
-
29
- task :stop do
30
- Daemons.run("deep_test_worker", :ARGV => ["stop"])
31
- end
32
- end
33
- end
@@ -1,9 +0,0 @@
1
- require File.dirname(__FILE__) + '/../test_helper'
2
- require "deep_test/start_workers"
3
-
4
- unit_tests do
5
- test "can specify number of processes to start" do
6
- Daemons.expects(:run_proc).times(3)
7
- DeepTest::StartWorkers.run [3, "pattern"]
8
- end
9
- end