jason-o-matic-deep_test 1.2.2.4 → 1.2.2.5
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/deep_test.rb +2 -0
- data/lib/deep_test/distributed/dispatch_controller.rb +8 -2
- data/lib/deep_test/distributed/multi_test_server_proxy.rb +5 -0
- data/lib/deep_test/distributed/remote_worker_client.rb +13 -1
- data/lib/deep_test/distributed/remote_worker_server.rb +23 -3
- data/lib/deep_test/distributed/test_server_workers.rb +16 -2
- data/lib/deep_test/extensions/drb_extension.rb +9 -0
- data/lib/deep_test/local_workers.rb +3 -2
- data/lib/deep_test/process_orchestrator.rb +2 -2
- data/lib/deep_test/server.rb +11 -4
- data/lib/deep_test/test/runner.rb +2 -2
- data/lib/deep_test/worker.rb +4 -0
- metadata +1 -1
data/lib/deep_test.rb
CHANGED
@@ -19,7 +19,13 @@ module DeepTest
|
|
19
19
|
Thread.new do
|
20
20
|
Thread.current[:receiver] = r
|
21
21
|
Timeout.timeout(@options.timeout_in_seconds) do
|
22
|
-
|
22
|
+
begin
|
23
|
+
DeepTest.logger.debug "Dispatching to #{r.inspect}: #{method_name}(*#{args.inspect})"
|
24
|
+
r.send method_name, *args
|
25
|
+
rescue Exception => ex
|
26
|
+
DeepTest.logger.debug "DISPATCH EXCEPTION from #{r.inspect}: #{ex.message}\n#{ex.backtrace.join("\n")}"
|
27
|
+
raise
|
28
|
+
end
|
23
29
|
end
|
24
30
|
end
|
25
31
|
end
|
@@ -38,7 +44,7 @@ module DeepTest
|
|
38
44
|
end
|
39
45
|
rescue Exception => e
|
40
46
|
@receivers.delete t[:receiver]
|
41
|
-
DeepTest.logger.error "Exception while dispatching #{method_name} to #{t[:receiver].__drburi} #{e.message}"
|
47
|
+
DeepTest.logger.error "Exception while dispatching #{method_name} to #{t[:receiver].__drburi} #{e.message}\n#{e.backtrace.join("\n")}"
|
42
48
|
end
|
43
49
|
end
|
44
50
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module DeepTest
|
2
2
|
module Distributed
|
3
3
|
class MultiTestServerProxy
|
4
|
+
|
4
5
|
def initialize(options, slaves)
|
5
6
|
DeepTest.logger.debug "MultiTestServerProxy#initialize #{slaves.length} slaves"
|
6
7
|
@slave_controller = DispatchController.new(options, slaves)
|
@@ -27,7 +28,11 @@ module DeepTest
|
|
27
28
|
end
|
28
29
|
|
29
30
|
class WorkerServerProxy
|
31
|
+
|
32
|
+
attr_reader :slaves
|
33
|
+
|
30
34
|
def initialize(options, slaves)
|
35
|
+
@slaves = slaves
|
31
36
|
DeepTest.logger.debug "WorkerServerProxy#initialize #{slaves.inspect}"
|
32
37
|
@slave_controller = DispatchController.new(options, slaves)
|
33
38
|
end
|
@@ -13,6 +13,12 @@ module DeepTest
|
|
13
13
|
t = Thread.new do
|
14
14
|
@test_server.sync(@options)
|
15
15
|
@worker_server = @test_server.spawn_worker_server(@options)
|
16
|
+
|
17
|
+
@worker_server.slaves.each do |s|
|
18
|
+
DeepTest.logger.debug "Startng the DRb service to connect to: #{s.inspect}"
|
19
|
+
DRb.start_service(s.__drburi, nil, DRbFire::ROLE => DRbFire::CLIENT)
|
20
|
+
end
|
21
|
+
|
16
22
|
@worker_server.load_files filelist
|
17
23
|
end
|
18
24
|
|
@@ -29,7 +35,13 @@ module DeepTest
|
|
29
35
|
end
|
30
36
|
end
|
31
37
|
|
32
|
-
def start_all
|
38
|
+
def start_all(drbserver)
|
39
|
+
|
40
|
+
@worker_server.slaves.each do |s|
|
41
|
+
DeepTest.logger.debug "Remote worker client start_all sending Server reference to RemoteWorkerServer: #{s.inspect}"
|
42
|
+
s.drbserver = drbserver
|
43
|
+
end
|
44
|
+
|
33
45
|
@worker_server.start_all
|
34
46
|
rescue => e
|
35
47
|
raise if failed_over?
|
@@ -5,6 +5,8 @@ module DeepTest
|
|
5
5
|
include DRb::DRbUndumped
|
6
6
|
|
7
7
|
MERCY_KILLING_GRACE_PERIOD = 10 * 60 unless defined?(MERCY_KILLING_GRACE_PERIOD)
|
8
|
+
|
9
|
+
attr_accessor :uri
|
8
10
|
|
9
11
|
def initialize(base_path, workers, options)
|
10
12
|
@base_path = base_path
|
@@ -56,7 +58,7 @@ module DeepTest
|
|
56
58
|
|
57
59
|
def start_all
|
58
60
|
@workers_started = true
|
59
|
-
@workers.start_all
|
61
|
+
@workers.start_all(self)
|
60
62
|
end
|
61
63
|
|
62
64
|
def stop_all
|
@@ -88,10 +90,13 @@ module DeepTest
|
|
88
90
|
innie.close
|
89
91
|
|
90
92
|
server = new(base_path, workers, options)
|
91
|
-
|
92
|
-
|
93
|
+
|
94
|
+
# this is half the magic that lets us work through the NAT
|
95
|
+
DRb.start_service("drbfire://#{address}:0", server, DRbFire::ROLE => DRbFire::SERVER, DRbFire::DELEGATE => DRbBindAllTCPSocket)
|
93
96
|
DeepTest.logger.info "RemoteWorkerServer started at #{DRb.uri}"
|
94
97
|
|
98
|
+
server.uri = DRb.uri
|
99
|
+
|
95
100
|
outie.write DRb.uri
|
96
101
|
outie.close
|
97
102
|
|
@@ -105,6 +110,21 @@ module DeepTest
|
|
105
110
|
innie.close
|
106
111
|
DRbObject.new_with_uri(uri)
|
107
112
|
end
|
113
|
+
|
114
|
+
######################################################################################
|
115
|
+
# These methods allow us to proxy the Server through the NAT
|
116
|
+
######################################################################################
|
117
|
+
def drbserver=(drbserver)
|
118
|
+
DeepTest.logger.debug "Setting the Server remote reference to: #{drbserver.inspect}"
|
119
|
+
@drbserver = drbserver
|
120
|
+
end
|
121
|
+
def take_work
|
122
|
+
DeepTest.logger.debug "Remote worker server proxying 'take_work' back to Server"
|
123
|
+
@drbserver.take_work
|
124
|
+
end
|
125
|
+
def write_result(res)
|
126
|
+
@drbserver.write_result res
|
127
|
+
end
|
108
128
|
|
109
129
|
end
|
110
130
|
end
|
@@ -11,11 +11,25 @@ module DeepTest
|
|
11
11
|
@test_server_config[:number_of_workers]
|
12
12
|
end
|
13
13
|
|
14
|
+
# Here we use DRb to communicate with the RemoteWorkerServer to avoid multiple processes
|
15
|
+
# trying to use the same drbfire connection. We have the RemoteWorkerServer proxy the
|
16
|
+
# interaction with Server since the RemoteServerWorker can connect back to the Server trough a NAT.
|
14
17
|
def server
|
15
|
-
|
18
|
+
# we're in a new process (one of the workers on the test_server),
|
19
|
+
# so stop the old server from RemoteWorkerServer
|
20
|
+
DRb.stop_service
|
21
|
+
|
22
|
+
# since RemoteWorkerServer now uses drbfire, we use it here to communicate with it
|
23
|
+
DRb.start_service(@server_proxy.uri, nil, DRbFire::ROLE => DRbFire::CLIENT)
|
24
|
+
|
25
|
+
DeepTest.logger.debug "LocalWorkers start_all worker starting with with blackboard: #{@server_proxy.uri.inspect} #{@server_proxy.inspect}"
|
26
|
+
|
27
|
+
# finally, return a remote reference to the RemoteWorkerServer
|
28
|
+
DRbObject.new_with_uri(@server_proxy.uri)
|
16
29
|
end
|
17
30
|
|
18
|
-
def start_all
|
31
|
+
def start_all(server_proxy)
|
32
|
+
@server_proxy = server_proxy
|
19
33
|
super
|
20
34
|
@warlock.exit_when_none_running
|
21
35
|
end
|
@@ -15,6 +15,9 @@ module DeepTest
|
|
15
15
|
# Open a server listening for connections at +uri+ using
|
16
16
|
# configuration +config+.
|
17
17
|
def self.open_server(uri, config)
|
18
|
+
|
19
|
+
DeepTest.logger.debug "drubyall open_server with args: #{uri.inspect} #{config.inspect}"
|
20
|
+
|
18
21
|
uri = 'drubyall://:0' unless uri
|
19
22
|
host, port, opt = parse_uri(uri)
|
20
23
|
|
@@ -27,6 +30,12 @@ module DeepTest
|
|
27
30
|
port = soc.addr[1] if port == 0
|
28
31
|
uri = "druby://#{host}:#{port}"
|
29
32
|
self.new(uri, soc, config)
|
33
|
+
|
34
|
+
rescue Exception => e
|
35
|
+
unless DRb::DRbBadURI === e or DRb::DRbBadScheme === e
|
36
|
+
DeepTest.logger.debug "drubyall open_server exception: #{e.message}\n#{e.backtrace.join("\n")}"
|
37
|
+
end
|
38
|
+
raise
|
30
39
|
end
|
31
40
|
end
|
32
41
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module DeepTest
|
2
2
|
class LocalWorkers
|
3
|
+
|
3
4
|
def initialize(options)
|
4
5
|
@options = options
|
5
6
|
@warlock = Warlock.new
|
@@ -8,12 +9,12 @@ module DeepTest
|
|
8
9
|
def load_files(files)
|
9
10
|
files.each {|f| load f}
|
10
11
|
end
|
11
|
-
|
12
|
+
|
12
13
|
def server
|
13
14
|
@options.server
|
14
15
|
end
|
15
16
|
|
16
|
-
def start_all
|
17
|
+
def start_all(s)
|
17
18
|
each_worker do |worker_num|
|
18
19
|
start_worker(worker_num) do
|
19
20
|
reseed_random_numbers
|
@@ -16,10 +16,10 @@ module DeepTest
|
|
16
16
|
begin
|
17
17
|
server = Server.start(@options)
|
18
18
|
@options.new_listener_list.before_starting_workers
|
19
|
-
@workers.start_all
|
19
|
+
@workers.start_all(server)
|
20
20
|
begin
|
21
21
|
DeepTest.logger.debug "Loader Starting (#{$$})"
|
22
|
-
passed = @runner.process_work_units
|
22
|
+
passed = @runner.process_work_units(server)
|
23
23
|
ensure
|
24
24
|
shutdown(server)
|
25
25
|
end
|
data/lib/deep_test/server.rb
CHANGED
@@ -1,9 +1,16 @@
|
|
1
1
|
module DeepTest
|
2
2
|
class Server
|
3
|
+
include DRbUndumped
|
4
|
+
|
3
5
|
def self.start(options)
|
4
6
|
server = new(options)
|
5
|
-
|
6
|
-
|
7
|
+
|
8
|
+
# start_sevice if running locally, otherise we only want to use the RemoteWorkerClient connection
|
9
|
+
if options.distributed_server.nil?
|
10
|
+
DRb.start_service("drbfire://0.0.0.0:#{options.server_port}", server, DRbFire::ROLE => DRbFire::SERVER)
|
11
|
+
DeepTest.logger.info "Started DeepTest service at #{DRb.uri}"
|
12
|
+
end
|
13
|
+
|
7
14
|
server
|
8
15
|
end
|
9
16
|
|
@@ -12,8 +19,8 @@ module DeepTest
|
|
12
19
|
end
|
13
20
|
|
14
21
|
def self.remote_reference(address, port)
|
15
|
-
DRb.start_service
|
16
|
-
blackboard = DRbObject.new_with_uri("
|
22
|
+
DRb.start_service("drbfire://#{address}:#{port}", nil, DRbFire::ROLE => DRbFire::CLIENT)
|
23
|
+
blackboard = DRbObject.new_with_uri("drbfire://#{address}:#{port}")
|
17
24
|
DeepTest.logger.debug "Connecting to DeepTest server at #{blackboard.__drburi}"
|
18
25
|
blackboard
|
19
26
|
end
|
@@ -12,9 +12,9 @@ module DeepTest
|
|
12
12
|
@options = options
|
13
13
|
end
|
14
14
|
|
15
|
-
def process_work_units
|
15
|
+
def process_work_units(server)
|
16
16
|
suite = ::Test::Unit::AutoRunner::COLLECTORS[:objectspace].call NO_FILTERS
|
17
|
-
supervised_suite = DeepTest::Test::SupervisedTestSuite.new(suite,
|
17
|
+
supervised_suite = DeepTest::Test::SupervisedTestSuite.new(suite, server)
|
18
18
|
require 'test/unit/ui/console/testrunner'
|
19
19
|
result = ::Test::Unit::UI::Console::TestRunner.run(supervised_suite, ::Test::Unit::UI::NORMAL)
|
20
20
|
result.passed?
|
data/lib/deep_test/worker.rb
CHANGED
@@ -28,9 +28,13 @@ module DeepTest
|
|
28
28
|
end
|
29
29
|
rescue Server::NoWorkUnitsRemainingError
|
30
30
|
DeepTest.logger.debug("Worker #{number}: no more work to do")
|
31
|
+
rescue Exception => e
|
32
|
+
DeepTest.logger.debug "Worker #{number} EXCEPTION: #{e.message}\n#{e.backtrace.join("\n")}"
|
33
|
+
raise
|
31
34
|
end
|
32
35
|
|
33
36
|
def next_work_unit
|
37
|
+
DeepTest.logger.debug "Worker #{number} getting next work unit from: #{@blackboard.inspect}"
|
34
38
|
@blackboard.take_work
|
35
39
|
rescue Server::NoWorkUnitsAvailableError
|
36
40
|
sleep 0.02
|