test_bench-parallel 0.0.0.0
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.
- checksums.yaml +7 -0
- data/lib/test_bench/parallel/controls.rb +0 -0
- data/lib/test_bench/parallel/run.rb +11 -0
- data/lib/test_bench/parallel/session.rb +143 -0
- data/lib/test_bench/parallel.rb +6 -0
- metadata +76 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5073d58e8db74392df639212009500be3125c22480ec93e952b95134d09d91cd
|
4
|
+
data.tar.gz: df087d665f30b6bdd75806661d7ef18974daac9664f061877f00cc2180486dbc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ab1c248d3433219d90773a9451a69ecb2eaaa1ce04b67eea7e67898c2c0b7ab902d69b92ba47bac269e56f5bbacd5b9f833035c1d07a0679f085a41f62d190ab
|
7
|
+
data.tar.gz: 1e5f90dec29303652be615504cd48f8197ba49ace51dd6d6b395b0143dbb0daf62d388cb2f86f76274dba01c40e143f07640435d63b9d02a14dc40837b436bbf
|
File without changes
|
@@ -0,0 +1,143 @@
|
|
1
|
+
module TestBench
|
2
|
+
module Parallel
|
3
|
+
class Session
|
4
|
+
attr_reader :session
|
5
|
+
attr_reader :processes
|
6
|
+
|
7
|
+
attr_accessor :threads
|
8
|
+
attr_accessor :file_path_queue
|
9
|
+
attr_accessor :telemetry_queue
|
10
|
+
|
11
|
+
def pending_file_count
|
12
|
+
@pending_file_count ||= 0
|
13
|
+
end
|
14
|
+
attr_writer :pending_file_count
|
15
|
+
|
16
|
+
def initialize(session, processes)
|
17
|
+
@session = session
|
18
|
+
@processes = processes
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.build(processes: nil)
|
22
|
+
processes ||= Defaults.processes
|
23
|
+
|
24
|
+
session = self.establish_session
|
25
|
+
|
26
|
+
new(session, processes)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.establish_session
|
30
|
+
TestBench::Run.establish_session
|
31
|
+
end
|
32
|
+
|
33
|
+
def register_telemetry_sink(...)
|
34
|
+
session.register_telemetry_sink(...)
|
35
|
+
end
|
36
|
+
|
37
|
+
def result(...)
|
38
|
+
session.result(...)
|
39
|
+
end
|
40
|
+
|
41
|
+
def execute(file_path)
|
42
|
+
start if not started?
|
43
|
+
|
44
|
+
file_path_queue.push(file_path)
|
45
|
+
|
46
|
+
self.pending_file_count += 1
|
47
|
+
|
48
|
+
until pending_file_count <= threads.count
|
49
|
+
update
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def close
|
54
|
+
file_path_queue.close
|
55
|
+
|
56
|
+
until threads.empty?
|
57
|
+
update
|
58
|
+
|
59
|
+
threads.delete_if do |thread|
|
60
|
+
!thread.alive?
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def update
|
66
|
+
timeout_milliseconds = 100
|
67
|
+
timeout_seconds = Rational(timeout_milliseconds, 1_000)
|
68
|
+
|
69
|
+
while event_data_batch = telemetry_queue.pop(timeout: timeout_seconds)
|
70
|
+
event_data_batch.each do |event_data|
|
71
|
+
session.record_event(event_data)
|
72
|
+
|
73
|
+
case event_data
|
74
|
+
when TestBench::Session::Events::FileExecuted
|
75
|
+
self.pending_file_count -= 1
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def started?
|
82
|
+
!threads.nil?
|
83
|
+
end
|
84
|
+
|
85
|
+
def start
|
86
|
+
self.file_path_queue = Queue.new
|
87
|
+
self.telemetry_queue = Queue.new
|
88
|
+
|
89
|
+
self.threads = processes.times.map do |process|
|
90
|
+
Thread.new do
|
91
|
+
session = TestBench::Session.build
|
92
|
+
|
93
|
+
telemetry_sink = TelemetrySink.new(telemetry_queue)
|
94
|
+
session.register_telemetry_sink(telemetry_sink)
|
95
|
+
|
96
|
+
while file_path = file_path_queue.pop
|
97
|
+
session.execute(file_path)
|
98
|
+
|
99
|
+
telemetry_sink.flush
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class TelemetrySink
|
106
|
+
include Telemetry::Sink
|
107
|
+
|
108
|
+
def event_data_batch
|
109
|
+
@event_data_batch ||= []
|
110
|
+
end
|
111
|
+
attr_writer :event_data_batch
|
112
|
+
|
113
|
+
attr_reader :queue
|
114
|
+
|
115
|
+
def initialize(queue)
|
116
|
+
@queue = queue
|
117
|
+
end
|
118
|
+
|
119
|
+
def receive(event_data)
|
120
|
+
event_data_batch.push(event_data)
|
121
|
+
end
|
122
|
+
|
123
|
+
def flush
|
124
|
+
queue.push(event_data_batch)
|
125
|
+
|
126
|
+
self.event_data_batch = nil
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
module Defaults
|
131
|
+
def self.processes
|
132
|
+
env_processes = ENV['TEST_BENCH_PARALLEL_PROCESSES']
|
133
|
+
|
134
|
+
if not env_processes.nil?
|
135
|
+
env_processes.to_i
|
136
|
+
else
|
137
|
+
Etc.nprocessors
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: test_bench-parallel
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brightworks Digital
|
8
|
+
bindir: bin
|
9
|
+
cert_chain: []
|
10
|
+
dependencies:
|
11
|
+
- !ruby/object:Gem::Dependency
|
12
|
+
name: test_bench-run
|
13
|
+
requirement: !ruby/object:Gem::Requirement
|
14
|
+
requirements:
|
15
|
+
- - ">="
|
16
|
+
- !ruby/object:Gem::Version
|
17
|
+
version: '0'
|
18
|
+
type: :runtime
|
19
|
+
prerelease: false
|
20
|
+
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: '0'
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: test_bench
|
27
|
+
requirement: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: '0'
|
32
|
+
type: :development
|
33
|
+
prerelease: false
|
34
|
+
version_requirements: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
description: Parallel runner for projects that use TestBench
|
40
|
+
email: development@bright.works
|
41
|
+
executables: []
|
42
|
+
extensions: []
|
43
|
+
extra_rdoc_files: []
|
44
|
+
files:
|
45
|
+
- lib/test_bench
|
46
|
+
- lib/test_bench/parallel
|
47
|
+
- lib/test_bench/parallel/controls.rb
|
48
|
+
- lib/test_bench/parallel/run.rb
|
49
|
+
- lib/test_bench/parallel/session.rb
|
50
|
+
- lib/test_bench/parallel.rb
|
51
|
+
homepage: http://test-bench.software
|
52
|
+
licenses:
|
53
|
+
- MIT
|
54
|
+
metadata:
|
55
|
+
homepage_uri: http://test-bench.software
|
56
|
+
source_code_uri: https://github.com/test-bench/test-bench-parallel
|
57
|
+
allowed_push_host: https://rubygems.org
|
58
|
+
namespace: TestBench::Parallel
|
59
|
+
rdoc_options: []
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
requirements: []
|
73
|
+
rubygems_version: 3.6.9
|
74
|
+
specification_version: 4
|
75
|
+
summary: Parallel runner for projects that use TestBench
|
76
|
+
test_files: []
|