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.
data/lib/dtr/drb_dtr.rb DELETED
@@ -1,275 +0,0 @@
1
- require 'drb/acl'
2
- require 'drb'
3
- require 'dtr/base'
4
- require 'dtr/ruby_ext'
5
-
6
- module DTR
7
- class DRbObjectWrapper
8
- def initialize(uri)
9
- @uri = uri
10
- end
11
-
12
- def method_missing(method, *args, &block)
13
- (@drbo ||= DRbObject.new_with_uri(@uri)).send(method, *args, &block)
14
- rescue DRb::DRbConnError => e
15
- logger.info { "DRb #{@uri} is not alive!" }
16
- nil
17
- end
18
- end
19
-
20
- class OriginalTestReports
21
- def summary_of(report)
22
- reports << report
23
- convert_to_str(report.successes, '.') + convert_to_str(report.failures, 'F') + convert_to_str(report.errors, 'E')
24
- end
25
-
26
- def reports
27
- @reports ||= []
28
- end
29
-
30
- def failures_and_errors
31
- collect(reports.collect{|r|r.stdout})
32
- end
33
-
34
- private
35
- def convert_to_str(size, status_char)
36
- return '' if size == 0
37
- Array.new(size).fill(status_char).join
38
- end
39
-
40
- def collect(stdouts)
41
- test_errors = []
42
- stdouts.each do |stdout|
43
- stdout.gsub(/^\s+\d+\) Error:\n(.*:\n.*\n[\s\S]*?\n)\n/) do
44
- test_errors << " #{test_errors.size + 1}) Error:\n" + $1
45
- end
46
- end
47
-
48
- test_failures = []
49
- stdouts.each do |stdout|
50
- stdout.gsub(/^\s+\d+\) Failure:\n([\S\s]*?\n)\n/) do
51
- test_failures << " #{test_errors.size + test_failures.size + 1}) Failure:\n" + $1
52
- end
53
- end
54
-
55
- if test_errors.empty?
56
- test_failures.join("\n")
57
- else
58
- test_errors.join("\n") + "\n" + test_failures.join("\n")
59
- end
60
- end
61
- end
62
-
63
- class DrbTestRunnerServer
64
-
65
- def initialize(my_uri, test_files, clients)
66
- logger.info {'Initializing DTR server...'}
67
- @server = Server.new(test_files)
68
-
69
- clients.each do |uri|
70
- @server.add_client DRbObjectWrapper.new(uri)
71
- logger.info {"Added DTR client at #{uri}"}
72
- end
73
-
74
- DRb.install_acl clients.to_acl
75
- logger.info { "Installed acl: #{clients.to_acl_list.join(', ')}" }
76
-
77
- @my_uri = my_uri
78
- @original_output_model = DTROPTIONS[:output_model] == :original
79
-
80
- @progress_bar = unless @original_output_model
81
- begin
82
- require 'rubygems'
83
- require 'progressbar'
84
- ProgressBar.new("Completed", test_files.size)
85
- rescue Exception => e
86
- logger.info { "Progressbar gem is not installed or could not be loaded. " }
87
- logger.info { e }
88
- @original_output_model = true
89
- original_output { "Progressbar gem is not installed or could not be loaded(got error: #{e.message}).\nTurn on original output model." }
90
- NullObj.new
91
- end
92
- else
93
- NullObj.new
94
- end
95
-
96
- @original_reports = @original_output_model ? OriginalTestReports.new : NullObj.new
97
- end
98
-
99
- def start(run_setup=false)
100
- $SAFE = 1 # disable eval() and friends
101
- logger.info {'Starting server...'}
102
- DRb.start_service(@my_uri, self)
103
- logger.info { "=> DTR server started on #{@my_uri}"}
104
- original_output { "Loaded suites: #{@server.test_files.join(', ')}\n" }
105
- output "Started\n"
106
- begin
107
- begin
108
- @server.run :setup => run_setup
109
- rescue Server::NoAliveClientsError => e
110
- logger.info { e }
111
- end
112
-
113
- logger.debug { reports.to_yaml }
114
- logger.info { '' }
115
- @server.latest_build_summary.split("\n").each do |msg|
116
- logger.info { msg }
117
- end
118
-
119
- logger.info { "Run tests completed #{succeeded? ? 'SUCCEEDED' : 'FAILED'}" }
120
- original_output { "\n" }
121
- original_output { "\n#{@original_reports.failures_and_errors}" }
122
- output "\n#{@server.latest_build_summary}\n"
123
- ensure
124
- DRb.stop_service
125
- end
126
- end
127
-
128
- def succeeded?
129
- @server.succeeded?
130
- end
131
-
132
- def reports
133
- @server.reports
134
- end
135
-
136
- def server_signature
137
- @server.server_signature
138
- end
139
-
140
- def update_setup_log(signature, report)
141
- if report[:exit_code] == 0
142
- logger.debug {"updating setup report: #{report.to_yaml}"}
143
- else
144
- logger.info { report.to_yaml }
145
- end
146
- @server.update_setup_log(signature, report)
147
- end
148
-
149
- def update(signature, report)
150
- original_output {@original_reports.summary_of report}
151
- if report.succeeded?
152
- logger.debug {"updating report: #{report.to_yaml}"}
153
- else
154
- logger.info { report.to_yaml }
155
-
156
- output report.stdout unless @original_output_model
157
- end
158
-
159
- result = @server.update(signature, report)
160
- @progress_bar.set reports.size
161
- result
162
- end
163
-
164
- private
165
- def original_output
166
- if @original_output_model
167
- output yield
168
- end
169
- end
170
-
171
- def output(msg)
172
- $stdout.print msg
173
- $stdout.flush
174
- end
175
- end
176
-
177
- class DrbTestRunnerClientServer
178
-
179
- def initialize(my_uri, server_uri)
180
- @my_uri = my_uri
181
- @server_uri = server_uri
182
- @run_setup_signature = nil
183
- @client_name = DTROPTIONS[:client_name]
184
- end
185
-
186
- def name
187
- @client_name
188
- end
189
-
190
- def queue
191
- @queue ||= []
192
- end
193
-
194
- def idle?
195
- queue.empty?
196
- end
197
-
198
- def setup(signature)
199
- logger.info {"request setup"}
200
- @run_setup_signature = signature
201
- end
202
-
203
- def run(runner_name, test_files, signature)
204
- unless test_files.nil? || test_files.empty?
205
- queue << [runner_name, test_files, signature]
206
- else
207
- logger.info { "Error: argument test_files is #{test_files.nil? ? 'nil' : 'empty'}!"}
208
- end
209
- end
210
-
211
- def server_signature
212
- drbServer.server_signature
213
- end
214
-
215
- def start
216
- $SAFE = 1 # disable eval() and friends
217
- access_uris = [@server_uri]
218
- DRb.install_acl access_uris.to_acl
219
- logger.info { "Installed acl: #{access_uris.to_acl_list.join(', ')}" }
220
- DRb.start_service(@my_uri, self)
221
-
222
- begin
223
- logger.info { "=> DTR client started on #{@my_uri}"}
224
- logger.info { "=> OPTIONS: #{DTROPTIONS.to_yaml}"}
225
- logger.info { "=> Ctrl-C to shutdown; call with --help for options" }
226
-
227
- loop do
228
- if @run_setup_signature
229
- logger.info {"Setup"}
230
- begin
231
- result = dtrClient.setup(@run_setup_signature)
232
- if result[:exit_code] != 0
233
- logger.info { "SETUP FAILED: #{result.inspect}" }
234
- puts "SETUP FAILED: #{result.inspect}"
235
- break
236
- end
237
- rescue Exception => e
238
- logger.error { e }
239
- end
240
- @run_setup_signature = nil
241
- logger.info {"Sleeping..."}
242
- end
243
- unless queue.empty?
244
- logger.info {"Working..."}
245
- logger.debug {queue.first.to_yaml}
246
- begin
247
- dtrClient.run(*queue.first.dup)
248
- rescue Exception => e
249
- logger.error { e }
250
- end
251
- queue.pop
252
- logger.info {"Sleeping..."}
253
- end
254
-
255
- begin
256
- sleep(1)
257
- rescue Interrupt => e
258
- break # Ctrl-C to shutdown
259
- end
260
- end
261
- ensure
262
- DRb.stop_service
263
- end
264
- end
265
-
266
- private
267
- def dtrClient
268
- Client.new(drbServer, @client_name)
269
- end
270
-
271
- def drbServer
272
- @drbServer ||= DRbObjectWrapper.new(@server_uri)
273
- end
274
- end
275
- end
@@ -1,5 +0,0 @@
1
- call rake run_dtr_s
2
- echo "prog exit code [%errorlevel%]"
3
-
4
- call rake run_dtr_f
5
- echo "prog exit code [%errorlevel%]"
@@ -1,32 +0,0 @@
1
- require 'test/unit'
2
- require File.dirname(__FILE__) + '/test_helper'
3
-
4
- class AveragePackerTest < Test::Unit::TestCase
5
- def setup
6
- @packer = DTR::AveragePacker.new
7
- end
8
- def test_pack
9
- assert_raise RuntimeError do
10
- @packer.pack([], 2)
11
- end
12
-
13
- assert_raise RuntimeError do
14
- @packer.pack(nil, 2)
15
- end
16
-
17
- assert_equal [[1]], @packer.pack([1], 1)
18
-
19
- assert_equal [[1, 2]], @packer.pack([1, 2], 1)
20
-
21
- assert_equal [[1], []], @packer.pack([1], 2)
22
-
23
- assert_equal [['1'], []], @packer.pack(['1'], 2)
24
-
25
- assert_equal [[1], [2]], @packer.pack([1, 2], 2)
26
-
27
- assert_equal [[1, 3], [2]], @packer.pack([1, 2, 3], 2)
28
- assert_equal [[1, 4], [2], [3]], @packer.pack([1, 2, 3, 4], 3)
29
-
30
- assert_equal [[1, 4, 7], [2, 5, 8], [3, 6]], @packer.pack([1, 2, 3, 4, 5, 6, 7, 8], 3)
31
- end
32
- end
data/test/base_test.rb DELETED
@@ -1,236 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- class BaseTest < Test::Unit::TestCase
4
-
5
- def setup
6
- DTROPTIONS[:packing_once] = false
7
- @server = DTR::Server.new
8
- @client_num = 0
9
-
10
- NoResponseClient.server = @server
11
- end
12
-
13
- def test_run_test_successfully
14
- @server.test_files = [new_successful_test_file]
15
- @server.add_client new_client
16
-
17
- assert_false @server.complete?
18
- assert_false @server.succeeded?
19
- @server.run
20
- assert @server.complete?
21
- assert @server.succeeded?
22
-
23
- test_report = @server.reports[@server.test_files[0]]
24
- assert_equal @server.clients.first.name, test_report.client_name
25
- assert test_report.succeeded?
26
- assert test_report.stdout.length > 0
27
- assert test_report.stderr.length > 0
28
- end
29
-
30
- def test_run_test_failed
31
- @server.test_files = [new_failed_test_file]
32
- @server.add_client new_client
33
-
34
- assert_false @server.complete?
35
- assert_false @server.succeeded?
36
- @server.run
37
- assert @server.complete?
38
- assert_false @server.succeeded?
39
-
40
- test_report = @server.reports[@server.test_files[0]]
41
- assert_false test_report.succeeded?
42
- end
43
-
44
- def test_run_on_multi_clients_with_average_strategy
45
- @server.test_files = [new_successful_test_file, new_successful_test_file]
46
- @server.add_client new_client
47
- @server.add_client new_client
48
-
49
- @server.run
50
-
51
- assert @server.complete?
52
- assert @server.succeeded?
53
- assert_equal 1, @server.clients[0].completed_cmds.size
54
- assert_equal 1, @server.clients[1].completed_cmds.size
55
- end
56
-
57
- def test_should_dispatch_tests_which_is_waiting_for_report_to_idle_client
58
- @server.test_files = [new_successful_test_file, new_successful_test_file]
59
- @server.add_client NoResponseClient.new
60
- client = new_client
61
- @server.add_client client
62
-
63
- @server.run
64
-
65
- assert @server.complete?
66
- assert @server.succeeded?
67
- assert_equal 2, client.completed_cmds.size
68
- end
69
-
70
- def test_update_report_by_signature
71
- @server.test_files = [new_successful_test_file]
72
- @server.add_client NoResponseClient.new
73
- @server.run(:wait_for_reports => false)
74
-
75
- assert_false @server.complete?
76
- report = new_report
77
- assert @server.update(@server.clients.first.report_signature, report)
78
- assert @server.complete?
79
- assert_equal({report.test => report}, @server.reports)
80
- end
81
-
82
- def test_should_not_be_able_to_update_report_after_completed
83
- @server.test_files = [new_successful_test_file]
84
- @server.add_client NoResponseClient.new
85
- @server.run(:wait_for_reports => false)
86
- report = new_report
87
- @server.update @server.clients.first.report_signature, report
88
- assert @server.complete?
89
-
90
- @server.reports.clear
91
- assert_false @server.update(@server.clients.first.report_signature, report)
92
- assert_equal({}, @server.reports)
93
- end
94
-
95
- def test_should_not_update_reports_if_server_never_ran
96
- @server.test_files = [new_successful_test_file]
97
- assert_false @server.update(nil, DTR::TestReport.new('test', {:name => 'client name', :exit_code => 0}, *success_test_summary))
98
- assert_equal({}, @server.reports)
99
-
100
- @server.update(Time.now.to_s, new_report)
101
- assert_equal({}, @server.reports)
102
- end
103
-
104
- def test_should_not_update_reports_if_signature_is_incorrect
105
- @server.test_files = [new_successful_test_file]
106
- @server.add_client NoResponseClient.new
107
- @server.run(:wait_for_reports => false)
108
-
109
- assert_false @server.complete?
110
- assert_false @server.update('incorrect signature', new_report)
111
- assert_equal({}, @server.reports)
112
- end
113
-
114
- def test_summary_after_ran_tests
115
- @server.test_files = [new_successful_test_file, new_failed_test_file, new_error_test_file]
116
- @server.add_client new_client
117
-
118
- assert_raise RuntimeError do
119
- @server.latest_build_summary
120
- end
121
- @server.run
122
- assert(/Finished in \d\.\d seconds./ =~ @server.latest_build_summary)
123
- assert(/4 tests, 2 assertions, 1 failures, 2 errors/ =~ @server.latest_build_summary)
124
- end
125
-
126
- def test_should_be_able_to_setup_test_env_on_client_side
127
- @server.test_files = [new_successful_test_file]
128
- client = NoResponseClient.new
129
- @server.add_client client
130
- @server.run :setup => true, :wait_for_reports => false
131
- assert_equal "setup #{client.report_signature}", client.log
132
- end
133
-
134
- def test_should_have_client_setup_log
135
- @server.test_files = [new_successful_test_file]
136
- client = new_client
137
- @server.add_client client
138
- @server.run :setup => true, :wait_for_reports => false
139
- assert @server.client_setup_logs[client.name]
140
- assert(/echo "setup_dtr_client"/ =~ @server.client_setup_logs[client.name][:stdout])
141
- assert_equal client.name, @server.client_setup_logs[client.name][:client_name]
142
- assert_equal 0, @server.client_setup_logs[client.name][:exit_code]
143
- end
144
-
145
- def test_should_ignore_out_of_date_report_of_client_setup
146
- @server.test_files = [new_successful_test_file]
147
- client = NoResponseClient.new
148
- @server.add_client client
149
- @server.run :setup => true, :wait_for_reports => false
150
- out_of_date = client.report_signature
151
- sleep(1)
152
- @server.run :setup => true, :wait_for_reports => false
153
- assert_false @server.update_setup_log(out_of_date, {:client_name => client.name})
154
- end
155
-
156
- def test_should_update_as_0_tests_when_test_file_execution_result_has_no_summary_line
157
- empty_test_file = new_test_file {|file, num|}
158
- @server.test_files = [empty_test_file]
159
- @server.add_client new_client
160
-
161
- @server.run
162
-
163
- assert(/Finished in \d\.\d seconds./ =~ @server.latest_build_summary)
164
- assert(/0 tests, 0 assertions, 0 failures, 0 errors/ =~ @server.latest_build_summary)
165
- end
166
-
167
- def test_should_be_failed_when_no_test_files_specified
168
- @server.test_files = []
169
- @server.add_client new_client
170
-
171
- @server.run
172
-
173
- assert @server.complete?
174
- assert_false @server.succeeded?
175
- assert(/Finished in \d\.\d seconds./ =~ @server.latest_build_summary)
176
- assert(/0 tests, 0 assertions, 0 failures, 0 errors/ =~ @server.latest_build_summary)
177
- end
178
-
179
- def test_should_remove_client_when_client_setup_failed
180
- @server.test_files = [new_successful_test_file]
181
- @server.add_client DTR::Client.new(@server, "client name", 'error cmd')
182
-
183
- @server.run :setup => true
184
-
185
- assert @server.clients.empty?
186
- assert @server.client_setup_logs["client name"]
187
- end
188
-
189
- def test_should_work_with_client_which_is_added_after_ran_tests
190
- @server.test_files = [new_successful_test_file]
191
- @server.add_client NoResponseClient.new
192
-
193
- @server.send(:run_start, :setup => true)
194
- @server.send(:run_once)
195
- assert_false @server.complete?
196
-
197
- client = new_client
198
- @server.add_client client
199
- @server.send(:run_once)
200
- assert @server.complete?
201
- assert @server.client_setup_logs[client.name]
202
- end
203
-
204
- def test_should_only_ask_client_to_setup_once
205
- @server.test_files = [new_successful_test_file]
206
- client = NoResponseClient.new
207
- @server.add_client client
208
-
209
- @server.send(:run_start, :setup => true)
210
- @server.send(:run_once)
211
- @server.send(:run_once)
212
- @server.send(:run_once)
213
- assert_equal "setup #{client.report_signature}", client.log
214
- end
215
-
216
- def xtest_pack_once
217
- DTROPTIONS[:packing_once] = true
218
- @server.test_files = [new_successful_test_file, new_successful_test_file]
219
- @server.add_client NoResponseClient.new
220
- @server.add_client new_client
221
- @server.run
222
- end
223
-
224
- def success_test_summary
225
- [1, 0, 0, 0]
226
- end
227
-
228
- def new_client
229
- DTR::Client.new(@server, "client#{@client_num += 1}")
230
- end
231
-
232
- def new_report(test=@server.test_files.first)
233
- DTR::TestReport.new(test, {:name => 'client name', :exit_code => 0}, *success_test_summary)
234
- end
235
-
236
- end