DTR 0.0.1 → 0.0.2

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.
@@ -0,0 +1,91 @@
1
+ require 'dtr/env_store'
2
+ require 'drb'
3
+ require 'rinda/ring'
4
+ require 'rinda/tuplespace'
5
+
6
+ module DTR
7
+ class ServiceProvider
8
+
9
+ def self.broadcast_list=(list)
10
+ EnvStore.new[:broadcast_list] = list
11
+ end
12
+
13
+ PORT = 3344
14
+ BROADCAST_LIST = []
15
+
16
+ def initialize
17
+ puts "-- Initializing drb service..."
18
+ env_store = EnvStore.new
19
+ (env_store[:broadcast_list] || ['localhost']).each do |broadcast|
20
+ BROADCAST_LIST << broadcast.untaint
21
+ puts "-- Added broadcast: #{broadcast}"
22
+ end
23
+ DRb.start_service
24
+ end
25
+
26
+ # start DTR server
27
+ def start
28
+ puts '-- Booting DTR server...'
29
+ Rinda::RingServer.new Rinda::TupleSpace.new, PORT
30
+ puts "-- DTR server started on port #{PORT}"
31
+ #set safe level to 1 here, now, runner can't set to 1, cause test should can do anything
32
+ #......
33
+ $SAFE = 1 unless $DEBUG # disable eval() and friends
34
+ # Wait until the user explicitly kills the server.
35
+ DRb.thread.join
36
+ end
37
+
38
+ def provide(runner)
39
+ renewer = Rinda::SimpleRenewer.new
40
+ tuple = [:name, :'DTR::Runner', runner.freeze, "DTR remote runner #{runner.name}"]
41
+ lookup_ring.write(tuple, renewer)
42
+ end
43
+
44
+ def lookup_runner
45
+ lookup_ring.take([:name, :'DTR::Runner', nil, nil])[2]
46
+ end
47
+
48
+ def runners
49
+ lookup_ring.read_all([:name, :'DTR::Runner', nil, nil]).collect {|rt| rt[2]}
50
+ end
51
+
52
+ def wait_until_teardown
53
+ lookup_ring.notify(nil, [:working_env, nil]).pop
54
+ end
55
+
56
+ def working_env
57
+ lookup_ring.read([:working_env, nil])[1]
58
+ end
59
+
60
+ def setup_working_env(env)
61
+ clear_workspace
62
+ lookup_ring.write [:working_env, env]
63
+ end
64
+
65
+ def teardown_working_env
66
+ clear_workspace
67
+ end
68
+
69
+ def start_service
70
+ DRb.start_service
71
+ end
72
+
73
+ def stop_service
74
+ DRb.stop_service
75
+ end
76
+
77
+ def clear_workspace
78
+ runners.size.times do
79
+ lookup_runner.shutdown rescue nil
80
+ end
81
+ lookup_ring.read_all([:working_env, nil]).size.times do
82
+ lookup_ring.take [:working_env, nil] rescue nil
83
+ end rescue nil
84
+ end
85
+
86
+ private
87
+ def lookup_ring
88
+ Rinda::TupleSpaceProxy.new(Rinda::RingFinger.new(BROADCAST_LIST, PORT).lookup_ring_any)
89
+ end
90
+ end
91
+ end
data/lib/dtr/svn.rb ADDED
@@ -0,0 +1,20 @@
1
+ module DTR
2
+ class SvnRepository
3
+ def revision
4
+ output = %x[svn info]
5
+ if /Revision: (\d+)/ =~ output
6
+ $1.to_i
7
+ else
8
+ $stderr.puts "Can't get svn revision, 'svn info' output: \n#{output}"
9
+ end
10
+ end
11
+
12
+ def update_to(revision)
13
+ return nil if revision.nil?
14
+ return "echo 'code base is #{revision}'" if revision == self.revision
15
+ return "svn update -r #{revision}" if revision && (revision == 'HEAD' || revision > 0)
16
+ $stderr.puts "Error revision number: #{revision.inspect}"
17
+ nil
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require 'dtr/inject.rb'
3
+
4
+ class InjectTest < Test::Unit::TestCase
5
+
6
+ def teardown
7
+ DTR.reject
8
+ end
9
+
10
+ def test_inject
11
+ DTR.inject
12
+ assert Test::Unit::TestCase.method_defined?(:__run__)
13
+ assert Test::Unit::TestSuite.method_defined?(:__run__)
14
+ assert Test::Unit::TestSuite.method_defined?(:dtr_injected?)
15
+ end
16
+
17
+ def test_reject
18
+ DTR.inject
19
+ DTR.reject
20
+ test_case = Test::Unit::TestCase.new('name')
21
+ assert_false test_case.respond_to?(:__run__)
22
+ assert test_case.respond_to?(:run)
23
+ end
24
+
25
+ end
@@ -0,0 +1,172 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require 'test/unit/ui/console/testrunner'
3
+ require 'dtr/service_provider'
4
+ require 'dtr/inject'
5
+ require 'dtr'
6
+ $be_silent = true
7
+ $repository = NullObject.new
8
+
9
+ module Test
10
+ module Unit
11
+ class TestResult
12
+ attr_reader :errors
13
+ end
14
+ end
15
+ end
16
+
17
+ class ScenarioTests < Test::Unit::TestCase
18
+
19
+ def setup
20
+ unless defined?(ATestCase)
21
+ require 'a_test_case'
22
+ require 'a_test_case2'
23
+ require 'a_failed_test_case'
24
+ require 'an_error_test_case'
25
+ require 'test_case_revision63_failed_but_revision64_passed'
26
+ require 'a_file_system_test_case'
27
+ end
28
+ DTR.inject
29
+ end
30
+
31
+ def teardown
32
+ DTR.reject
33
+ $argv_dup = nil
34
+ end
35
+
36
+ def test_run_test_passed
37
+ $argv_dup = ['a_test_case.rb', 'a_test_case2.rb', 'a_file_system_test_case.rb']
38
+ suite = Test::Unit::TestSuite.new('run_test_passed')
39
+ suite << ATestCase.suite
40
+ suite << ATestCase2.suite
41
+ suite << AFileSystemTestCase.suite
42
+
43
+ @result = runit(suite)
44
+
45
+ assert @result.passed?
46
+ assert_equal 3, @result.run_count
47
+ assert_equal 0, @result.failure_count
48
+ assert_equal 0, @result.error_count
49
+ end
50
+
51
+ def test_run_test_failed
52
+ $argv_dup = ['a_test_case.rb', 'a_failed_test_case.rb']
53
+ suite = Test::Unit::TestSuite.new('test_run_test_failed')
54
+ suite << ATestCase.suite
55
+ suite << AFailedTestCase.suite
56
+
57
+ @result = runit(suite)
58
+
59
+ assert !@result.passed?
60
+ assert_equal 2, @result.run_count
61
+ assert_equal 1, @result.failure_count
62
+ assert_equal 0, @result.error_count
63
+ end
64
+
65
+ def test_run_test_error
66
+ $argv_dup = ['a_test_case.rb', 'an_error_test_case.rb']
67
+ suite = Test::Unit::TestSuite.new('test_run_test_error')
68
+ suite << ATestCase.suite
69
+ suite << AnErrorTestCase.suite
70
+
71
+ logger.debug { "dtr_injected: #{Test::Unit::TestSuite.method_defined?(:dtr_injected?)}" }
72
+ @result = runit(suite)
73
+
74
+ assert_false @result.passed?
75
+ assert_equal 2, @result.run_count
76
+ assert_equal 0, @result.failure_count
77
+ assert_equal 1, @result.error_count
78
+ end
79
+
80
+ def test_run_suite_should_be_independence
81
+ $argv_dup = ['an_error_test_case.rb']
82
+ suite = Test::Unit::TestSuite.new('test_run_suite_should_be_independence 1')
83
+ suite << AnErrorTestCase.suite
84
+
85
+ @result = runit(suite)
86
+
87
+ assert_false @result.passed?
88
+ assert_equal 1, @result.run_count
89
+ assert_equal 0, @result.failure_count
90
+ assert_equal 1, @result.error_count
91
+
92
+ $argv_dup = ['a_test_case.rb']
93
+ suite = Test::Unit::TestSuite.new('test_run_suite_should_be_independence 2')
94
+ suite << ATestCase.suite
95
+
96
+ @result = runit(suite)
97
+
98
+ assert @result.passed?
99
+ assert_equal 1, @result.run_count
100
+ assert_equal 0, @result.failure_count
101
+ assert_equal 0, @result.error_count
102
+ end
103
+
104
+ def test_should_ignore_environment_file_not_exists
105
+ $argv_dup = ['a_test_case.rb', 'test_file_not_exists.rb']
106
+ suite = Test::Unit::TestSuite.new('test_run_test_file_not_exist')
107
+ suite << ATestCase.suite
108
+
109
+ @result = runit(suite)
110
+
111
+ assert @result.passed?
112
+ assert_equal 1, @result.run_count
113
+ assert_equal 0, @result.failure_count
114
+ assert_equal 0, @result.error_count
115
+ end
116
+
117
+ def test_run_empty_test_suite_and_no_test_files_in_environment
118
+ $argv_dup = []
119
+ suite = Test::Unit::TestSuite.new('test_run_without_test_files')
120
+
121
+ @result = runit(suite)
122
+
123
+ assert @result.passed?
124
+ assert_equal 0, @result.run_count
125
+ assert_equal 0, @result.failure_count
126
+ assert_equal 0, @result.error_count
127
+ end
128
+
129
+ def runit(suite)
130
+ Test::Unit::UI::Console::TestRunner.run(suite, Test::Unit::UI::SILENT)
131
+ end
132
+
133
+ # def test_run_specific_revision_test
134
+ # new_injected_env ['test_case_revision63_failed_but_revision64_passed.rb'], 63
135
+ # suite = Test::Unit::TestSuite.new('test_run_revision63')
136
+ # suite << TestCaseRevision63FailedButRevision64Passed.suite
137
+ # @result = runit(suite)
138
+ #
139
+ # assert_false @result.passed?
140
+ # assert_equal 1, @result.run_count
141
+ # assert_equal 1, @result.failure_count
142
+ # assert_equal 0, @result.error_count
143
+ #
144
+ # new_injected_env ['test_case_revision63_failed_but_revision64_passed.rb'], 'HEAD'
145
+ # suite = Test::Unit::TestSuite.new('test_run_revision64')
146
+ # suite << TestCaseRevision63FailedButRevision64Passed.suite
147
+ # @result = runit(suite)
148
+ #
149
+ # assert @result.passed?
150
+ # assert_equal 1, @result.run_count
151
+ # assert_equal 0, @result.failure_count
152
+ # assert_equal 0, @result.error_count
153
+ # end
154
+
155
+ def test_run_test_specified_by_load_path
156
+ lib_path = File.expand_path(File.dirname(__FILE__) + '/../testdata/lib')
157
+ $LOAD_PATH.unshift lib_path
158
+ require 'lib_test_case'
159
+ $argv_dup = ['lib_test_case.rb']
160
+ suite = Test::Unit::TestSuite.new('test_run_test_specified_by_load_path')
161
+ suite << LibTestCase.suite
162
+
163
+ @result = runit(suite)
164
+
165
+ assert @result.passed?
166
+ assert_equal 1, @result.run_count
167
+ assert_equal 0, @result.failure_count
168
+ assert_equal 0, @result.error_count
169
+ ensure
170
+ $LOAD_PATH.delete lib_path
171
+ end
172
+ end
data/test/svn_test.rb ADDED
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require 'dtr/svn'
3
+
4
+ class SvnTest < Test::Unit::TestCase
5
+
6
+ def test_revision
7
+ revision = DTR::SvnRepository.new.revision
8
+ assert(revision > 40)
9
+ end
10
+
11
+ end
data/test/test_helper.rb CHANGED
@@ -1,108 +1,25 @@
1
- require 'test/unit'
2
- require 'fileutils'
3
- require 'ostruct'
4
-
5
- $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
6
- require 'dtr'
7
-
8
- FileUtils.makedirs DTROPTIONS[:tmp_dir]
9
- DTROPTIONS.merge!({:client_name => "dtr client", :setup => "echo \"setup_dtr_client\"", :wait_a_moment => false})
10
-
11
- class NoResponseClient
12
- attr_reader :report_signature
13
-
14
- def self.server=(server)
15
- @@server = server
16
- end
17
-
18
- def name
19
- 'test client'
20
- end
21
-
22
- def server_signature
23
- @@server.server_signature
24
- end
25
-
26
- def idle?
27
- (@executing_test_files ||= nil).nil?
28
- end
29
-
30
- def setup(signature)
31
- @log = log + 'setup ' + signature
32
- @report_signature = signature
33
- end
34
-
35
- def run(runner_name, test_files, signature)
36
- @report_signature = signature
37
- raise 'I am busy, should not ask me do anymore' unless idle?
38
- @executing_test_files = test_files
39
- end
40
-
41
- def log
42
- @log ||= ''
43
- end
44
- end
45
-
46
- module Test
47
- module Unit
48
- class TestCase
49
- def assert_false(o)
50
- assert !o
51
- end
52
-
53
- def new_successful_test_file
54
- new_test_file do |file, num|
55
- file.syswrite(%{
56
- require 'test/unit'
57
- class TestFile#{num} < Test::Unit::TestCase
58
- def test_succeeded
59
- assert true
60
- end
61
- end
62
- })
63
- end
64
- end
65
-
66
- def new_failed_test_file
67
- new_test_file do |file, num|
68
- file.syswrite(%{
69
- require 'test/unit'
70
- class TestFile#{num} < Test::Unit::TestCase
71
- def test_failed
72
- assert false
73
- end
74
- end
75
- })
76
- end
77
- end
78
-
79
- def new_error_test_file
80
- new_test_file do |file, num|
81
- file.syswrite(%{
82
- require 'test/unit'
83
- class TestFile#{num} < Test::Unit::TestCase
84
- def test_error
85
- raise 'error'
86
- end
87
-
88
- def test_runtime_error
89
- should.raise.runtime.error
90
- end
91
- end
92
- })
93
- end
94
- end
95
-
96
- def new_test_file
97
- @test_file_num ||= 0
98
- @test_file_num += 1
99
- file_name = "#{DTROPTIONS[:tmp_dir]}/test_file#{@test_file_num}.rb"
100
- File.open(file_name, 'w') do |file|
101
- yield file, @test_file_num
102
- end
103
-
104
- file_name
105
- end
106
- end
107
- end
108
- end
1
+ require 'test/unit'
2
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
3
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../testdata')
4
+
5
+ module Test
6
+ module Unit
7
+ class TestCase
8
+ def assert_false(o)
9
+ assert !o
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ class TestRepository
16
+ attr_accessor :revision
17
+
18
+ def initialize
19
+ @revision = 1
20
+ end
21
+
22
+ def update_to(revision)
23
+ "echo 'update to #{revision}'"
24
+ end
25
+ end