test_bench-run 2.1.3.1 → 3.0.0.0.pre.1
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 +4 -4
- data/lib/test_bench/run/controls/{result.rb → events.rb} +1 -1
- data/lib/test_bench/run/controls/{process_id.rb → message.rb} +1 -1
- data/lib/test_bench/run/controls/path.rb +1 -9
- data/lib/test_bench/run/controls/random.rb +1 -1
- data/lib/test_bench/run/controls/session.rb +14 -0
- data/lib/test_bench/run/controls/status.rb +42 -0
- data/lib/test_bench/run/controls/summary/file/info.rb +106 -0
- data/lib/test_bench/run/controls/summary/file/totals.rb +36 -0
- data/lib/test_bench/run/controls/summary/file.rb +42 -0
- data/lib/test_bench/run/controls/summary/run.rb +51 -0
- data/lib/test_bench/run/controls/summary.rb +43 -0
- data/lib/test_bench/run/controls/{events/session.rb → telemetry.rb} +2 -2
- data/lib/test_bench/run/controls/time.rb +1 -1
- data/lib/test_bench/run/controls.rb +14 -20
- data/lib/test_bench/run/run.rb +78 -90
- data/lib/test_bench/run/{get_files → select_files}/substitute.rb +11 -14
- data/lib/test_bench/run/select_files.rb +68 -0
- data/lib/test_bench/run/substitute.rb +40 -0
- data/lib/test_bench/run/summary/substitute.rb +17 -0
- data/lib/test_bench/run/summary.rb +475 -0
- data/lib/test_bench/run.rb +6 -14
- metadata +32 -45
- data/lib/test_bench/run/controls/directory.rb +0 -70
- data/lib/test_bench/run/controls/event_data.rb +0 -7
- data/lib/test_bench/run/controls/events/event_data.rb +0 -9
- data/lib/test_bench/run/controls/events/file_crashed.rb +0 -109
- data/lib/test_bench/run/controls/events/file_finished.rb +0 -56
- data/lib/test_bench/run/controls/events/file_started.rb +0 -47
- data/lib/test_bench/run/controls/events/finished.rb +0 -56
- data/lib/test_bench/run/controls/events/started.rb +0 -47
- data/lib/test_bench/run/controls/exception.rb +0 -101
- data/lib/test_bench/run/controls/executor.rb +0 -56
- data/lib/test_bench/run/controls/file/create.rb +0 -69
- data/lib/test_bench/run/controls/file/pattern.rb +0 -33
- data/lib/test_bench/run/controls/file.rb +0 -180
- data/lib/test_bench/run/events.rb +0 -12
- data/lib/test_bench/run/executor/serial.rb +0 -34
- data/lib/test_bench/run/executor/substitute.rb +0 -45
- data/lib/test_bench/run/executor.rb +0 -44
- data/lib/test_bench/run/file.rb +0 -81
- data/lib/test_bench/run/get_files.rb +0 -76
- data/lib/test_bench/run/output/file.rb +0 -135
- data/lib/test_bench/run/output/summary/error.rb +0 -139
- data/lib/test_bench/run/output/summary.rb +0 -182
@@ -1,180 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Run
|
3
|
-
module Controls
|
4
|
-
module File
|
5
|
-
def self.example(filename: nil, directory: nil, root_directory: nil)
|
6
|
-
filename ||= self.filename
|
7
|
-
directory ||= self.directory
|
8
|
-
|
9
|
-
if root_directory == :none
|
10
|
-
root_directory = nil
|
11
|
-
else
|
12
|
-
root_directory ||= self.root_directory
|
13
|
-
end
|
14
|
-
|
15
|
-
paths = []
|
16
|
-
|
17
|
-
if root_directory
|
18
|
-
paths << root_directory
|
19
|
-
end
|
20
|
-
|
21
|
-
paths << directory
|
22
|
-
paths << filename
|
23
|
-
|
24
|
-
::File.join(*paths)
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.random
|
28
|
-
Test.random
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.filename
|
32
|
-
Name.example
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.directory
|
36
|
-
Test.directory
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.root_directory
|
40
|
-
'/some-root-dir'
|
41
|
-
end
|
42
|
-
|
43
|
-
module Random
|
44
|
-
def self.example(basename: nil, directory: nil, root_directory: nil)
|
45
|
-
basename ||= Test::Random.basename
|
46
|
-
directory ||= Test::Random.directory
|
47
|
-
|
48
|
-
filename = Name::Random.example(basename:)
|
49
|
-
|
50
|
-
File.example(filename:, directory:, root_directory:)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
module Local
|
55
|
-
def self.example
|
56
|
-
File.example(root_directory: :none)
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.random
|
60
|
-
File::Random.example(root_directory: :none)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
module Test
|
65
|
-
extend self
|
66
|
-
|
67
|
-
def self.example(root_directory: nil)
|
68
|
-
filename = Name.example(basename:)
|
69
|
-
|
70
|
-
File.example(filename:, directory:, root_directory:)
|
71
|
-
end
|
72
|
-
|
73
|
-
def self.random
|
74
|
-
Random.example
|
75
|
-
end
|
76
|
-
|
77
|
-
def basename
|
78
|
-
'some_test_file'
|
79
|
-
end
|
80
|
-
|
81
|
-
def directory
|
82
|
-
'test/automated'
|
83
|
-
end
|
84
|
-
|
85
|
-
module Random
|
86
|
-
extend Test
|
87
|
-
|
88
|
-
def self.example(root_directory: nil)
|
89
|
-
filename = Name::Random.example(basename:)
|
90
|
-
|
91
|
-
File.example(filename:, directory:, root_directory:)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
module Local
|
96
|
-
def self.example
|
97
|
-
Test.example(root_directory: :none)
|
98
|
-
end
|
99
|
-
|
100
|
-
def self.random
|
101
|
-
Test::Random.example(root_directory: :none)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
module Implementation
|
107
|
-
extend self
|
108
|
-
|
109
|
-
def self.example(root_directory: nil)
|
110
|
-
filename = Name.example(basename:)
|
111
|
-
|
112
|
-
File.example(filename:, directory:, root_directory:)
|
113
|
-
end
|
114
|
-
|
115
|
-
def self.random
|
116
|
-
Random.example
|
117
|
-
end
|
118
|
-
|
119
|
-
def basename
|
120
|
-
'some_file'
|
121
|
-
end
|
122
|
-
|
123
|
-
def directory
|
124
|
-
'lib/some_directory'
|
125
|
-
end
|
126
|
-
|
127
|
-
module Random
|
128
|
-
extend Implementation
|
129
|
-
|
130
|
-
def self.example(root_directory: nil)
|
131
|
-
filename = Name::Random.example(basename:)
|
132
|
-
|
133
|
-
File.example(filename:, directory:, root_directory:)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
module Local
|
138
|
-
def self.example
|
139
|
-
Implementation.example(root_directory: :none)
|
140
|
-
end
|
141
|
-
|
142
|
-
def self.random
|
143
|
-
Implementation::Random.example(root_directory: :none)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
module Name
|
149
|
-
def self.example(basename: nil)
|
150
|
-
basename ||= self.basename
|
151
|
-
|
152
|
-
Telemetry::Controls::File::Name.example(basename:, extension:)
|
153
|
-
end
|
154
|
-
|
155
|
-
def self.random
|
156
|
-
Random.example
|
157
|
-
end
|
158
|
-
|
159
|
-
def self.basename
|
160
|
-
'some_file'
|
161
|
-
end
|
162
|
-
|
163
|
-
def self.extension
|
164
|
-
'.rb'
|
165
|
-
end
|
166
|
-
|
167
|
-
module Random
|
168
|
-
def self.example(basename: nil)
|
169
|
-
basename ||= Name.basename
|
170
|
-
|
171
|
-
extension = Name.extension
|
172
|
-
|
173
|
-
Telemetry::Controls::File::Name::Random.example(basename:, extension:)
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Run
|
3
|
-
module Events
|
4
|
-
FileStarted = Telemetry::Event.define(:file)
|
5
|
-
FileFinished = Telemetry::Event.define(:file, :result)
|
6
|
-
FileCrashed = Telemetry::Event.define(:file, :error_message, :error_text)
|
7
|
-
|
8
|
-
Started = Telemetry::Event.define(:random_seed)
|
9
|
-
Finished = Telemetry::Event.define(:random_seed, :result)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Run
|
3
|
-
module Executor
|
4
|
-
class Serial
|
5
|
-
include Executor
|
6
|
-
|
7
|
-
def run_file
|
8
|
-
@run_file ||= Run::File.build
|
9
|
-
end
|
10
|
-
attr_writer :run_file
|
11
|
-
|
12
|
-
def session_store
|
13
|
-
@session_store ||= Session::Store.new
|
14
|
-
end
|
15
|
-
attr_writer :session_store
|
16
|
-
|
17
|
-
def configure
|
18
|
-
Session::Store.configure(self)
|
19
|
-
end
|
20
|
-
|
21
|
-
def execute(file)
|
22
|
-
run_file.(file)
|
23
|
-
|
24
|
-
rescue => exception
|
25
|
-
session = session_store.fetch
|
26
|
-
|
27
|
-
session.record_failure
|
28
|
-
|
29
|
-
STDERR.write("#{exception.full_message}\n")
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Run
|
3
|
-
module Executor
|
4
|
-
module Substitute
|
5
|
-
def self.build
|
6
|
-
Executor.new
|
7
|
-
end
|
8
|
-
|
9
|
-
class Executor
|
10
|
-
include Run::Executor
|
11
|
-
|
12
|
-
def files
|
13
|
-
@files ||= []
|
14
|
-
end
|
15
|
-
|
16
|
-
attr_accessor :started
|
17
|
-
def started? = !!started
|
18
|
-
|
19
|
-
attr_accessor :finished
|
20
|
-
def finished? = !!finished
|
21
|
-
|
22
|
-
def start
|
23
|
-
self.started = true
|
24
|
-
end
|
25
|
-
|
26
|
-
def execute(file)
|
27
|
-
files << file
|
28
|
-
end
|
29
|
-
|
30
|
-
def executed?(file=nil)
|
31
|
-
if not file.nil?
|
32
|
-
files.include?(file)
|
33
|
-
else
|
34
|
-
!files.empty?
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def finish
|
39
|
-
self.finished = true
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Run
|
3
|
-
module Executor
|
4
|
-
AbstractMethodError = Class.new(RuntimeError)
|
5
|
-
|
6
|
-
def self.included(cls)
|
7
|
-
cls.class_exec do
|
8
|
-
extend Build
|
9
|
-
extend Configure
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def configure
|
14
|
-
end
|
15
|
-
|
16
|
-
def start
|
17
|
-
end
|
18
|
-
|
19
|
-
def execute(file)
|
20
|
-
raise AbstractMethodError, "Subclass didn't implement execute (File: #{file.inspect})"
|
21
|
-
end
|
22
|
-
|
23
|
-
def finish
|
24
|
-
end
|
25
|
-
|
26
|
-
module Build
|
27
|
-
def build
|
28
|
-
instance = new
|
29
|
-
instance.configure
|
30
|
-
instance
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
module Configure
|
35
|
-
def configure(receiver, attr_name: nil)
|
36
|
-
attr_name ||= :executor
|
37
|
-
|
38
|
-
instance = build
|
39
|
-
receiver.public_send(:"#{attr_name}=", instance)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
data/lib/test_bench/run/file.rb
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Run
|
3
|
-
class File
|
4
|
-
ReadFileError = Class.new(RuntimeError)
|
5
|
-
|
6
|
-
def root_directory
|
7
|
-
@root_directory ||= ::Dir.pwd
|
8
|
-
end
|
9
|
-
attr_writer :root_directory
|
10
|
-
|
11
|
-
def session
|
12
|
-
@session ||= Session::Substitute.build
|
13
|
-
end
|
14
|
-
attr_writer :session
|
15
|
-
|
16
|
-
def random
|
17
|
-
@random ||= Random::Substitute.build
|
18
|
-
end
|
19
|
-
attr_writer :random
|
20
|
-
|
21
|
-
def self.build(session: nil)
|
22
|
-
instance = new
|
23
|
-
Session.configure(instance, session:)
|
24
|
-
Random.configure(instance)
|
25
|
-
instance
|
26
|
-
end
|
27
|
-
|
28
|
-
def call(file)
|
29
|
-
random.reset(file)
|
30
|
-
|
31
|
-
begin
|
32
|
-
source = ::File.read(file)
|
33
|
-
rescue SystemCallError => error
|
34
|
-
raise ReadFileError, "Couldn't run #{file}: #{error.message.partition(' @ ').first}"
|
35
|
-
end
|
36
|
-
|
37
|
-
failure_sequence = session.failure_sequence
|
38
|
-
|
39
|
-
session.record_event(Events::FileStarted.new(file))
|
40
|
-
|
41
|
-
begin
|
42
|
-
TOPLEVEL_BINDING.eval(source, file)
|
43
|
-
|
44
|
-
rescue => exception
|
45
|
-
raise exception
|
46
|
-
|
47
|
-
ensure
|
48
|
-
if not exception.nil?
|
49
|
-
error_message = error_message(exception)
|
50
|
-
error_text = error_text(exception)
|
51
|
-
|
52
|
-
session.record_event(Events::FileCrashed.new(file, error_message, error_text))
|
53
|
-
|
54
|
-
raise exception
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
failed = session.failed?(failure_sequence)
|
59
|
-
result = !failed
|
60
|
-
|
61
|
-
session.record_event(Events::FileFinished.new(file, result))
|
62
|
-
|
63
|
-
result
|
64
|
-
end
|
65
|
-
|
66
|
-
def error_message(exception)
|
67
|
-
error_message = exception.full_message(order: :top, highlight: false).each_line(chomp: true).first
|
68
|
-
|
69
|
-
if error_message.delete_prefix!(root_directory)
|
70
|
-
error_message.delete_prefix!('/')
|
71
|
-
end
|
72
|
-
|
73
|
-
error_message
|
74
|
-
end
|
75
|
-
|
76
|
-
def error_text(exception)
|
77
|
-
exception.full_message
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
@@ -1,76 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Run
|
3
|
-
class GetFiles
|
4
|
-
FileError = Class.new(RuntimeError)
|
5
|
-
|
6
|
-
attr_reader :exclude_patterns
|
7
|
-
|
8
|
-
def initialize(exclude_patterns)
|
9
|
-
@exclude_patterns = exclude_patterns
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.build(exclude: nil)
|
13
|
-
exclude_patterns = exclude
|
14
|
-
exclude_patterns ||= Defaults.exclude_patterns
|
15
|
-
|
16
|
-
if exclude_patterns.instance_of?(String)
|
17
|
-
exclude_patterns = exclude_patterns.split(':')
|
18
|
-
end
|
19
|
-
|
20
|
-
new(exclude_patterns)
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.call(path, *paths, exclude: nil, &block)
|
24
|
-
instance = build(exclude:)
|
25
|
-
instance.(path, *paths, &block)
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.configure(receiver, exclude: nil, attr_name: nil)
|
29
|
-
attr_name ||= :get_files
|
30
|
-
|
31
|
-
instance = build(exclude:)
|
32
|
-
receiver.public_send(:"#{attr_name}=", instance)
|
33
|
-
end
|
34
|
-
|
35
|
-
def call(path, *paths, &block)
|
36
|
-
paths = [path, *paths]
|
37
|
-
|
38
|
-
paths.each do |path|
|
39
|
-
if ::File.extname(path).empty?
|
40
|
-
pattern = ::File.join(path, '**/*.rb')
|
41
|
-
else
|
42
|
-
pattern = path
|
43
|
-
end
|
44
|
-
|
45
|
-
assure_extant(path)
|
46
|
-
|
47
|
-
Dir.glob(pattern).each do |file|
|
48
|
-
excluded = exclude_patterns.any? do |exclude_pattern|
|
49
|
-
exclude_pattern = ::File.join('*', exclude_pattern)
|
50
|
-
|
51
|
-
::File.fnmatch?(exclude_pattern, file, ::File::FNM_EXTGLOB)
|
52
|
-
end
|
53
|
-
|
54
|
-
if excluded
|
55
|
-
next
|
56
|
-
end
|
57
|
-
|
58
|
-
block.(file)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def assure_extant(path)
|
64
|
-
::File.stat(path)
|
65
|
-
rescue Errno::ENOENT => enoent
|
66
|
-
raise FileError, enoent.message
|
67
|
-
end
|
68
|
-
|
69
|
-
module Defaults
|
70
|
-
def self.exclude_patterns
|
71
|
-
ENV.fetch('TEST_BENCH_EXCLUDE_FILE_PATTERN', '*_init.rb')
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
@@ -1,135 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Run
|
3
|
-
module Output
|
4
|
-
class File
|
5
|
-
Error = Class.new(RuntimeError)
|
6
|
-
|
7
|
-
include TestBench::Output
|
8
|
-
include Events
|
9
|
-
|
10
|
-
def session_output
|
11
|
-
@session_output ||= TestBench::Output::Substitute.build
|
12
|
-
end
|
13
|
-
attr_writer :session_output
|
14
|
-
|
15
|
-
def pended_events
|
16
|
-
@pended_events ||= {}
|
17
|
-
end
|
18
|
-
attr_writer :pended_events
|
19
|
-
|
20
|
-
def only_failure
|
21
|
-
@only_failure.nil? ?
|
22
|
-
@only_failure = Defaults.only_failure :
|
23
|
-
@only_failure
|
24
|
-
end
|
25
|
-
alias :only_failure? :only_failure
|
26
|
-
attr_writer :only_failure
|
27
|
-
|
28
|
-
def configure(...)
|
29
|
-
TestBench::Session::Output::Writer.configure(self, ...)
|
30
|
-
|
31
|
-
Session::Output.configure(self, writer:, attr_name: :session_output)
|
32
|
-
end
|
33
|
-
|
34
|
-
handle FileStarted do |file_started|
|
35
|
-
process_id = file_started.metadata.process_id
|
36
|
-
|
37
|
-
start(process_id)
|
38
|
-
end
|
39
|
-
|
40
|
-
handle FileFinished do |file_finished|
|
41
|
-
process_id = file_finished.metadata.process_id
|
42
|
-
result = file_finished.result
|
43
|
-
file = file_finished.file
|
44
|
-
|
45
|
-
finish(process_id, result, file)
|
46
|
-
end
|
47
|
-
|
48
|
-
handle FileCrashed do |file_crashed|
|
49
|
-
process_id = file_crashed.metadata.process_id
|
50
|
-
file = file_crashed.file
|
51
|
-
|
52
|
-
result = false
|
53
|
-
|
54
|
-
finish(process_id, result, file)
|
55
|
-
end
|
56
|
-
|
57
|
-
handle Started do
|
58
|
-
end
|
59
|
-
|
60
|
-
handle Finished do
|
61
|
-
end
|
62
|
-
|
63
|
-
def finish(process_id, result, file)
|
64
|
-
events = pended_events.delete(process_id)
|
65
|
-
|
66
|
-
if only_failure && result
|
67
|
-
return
|
68
|
-
end
|
69
|
-
|
70
|
-
writer.puts("Running #{file}")
|
71
|
-
|
72
|
-
writer_sequence = writer.sequence
|
73
|
-
|
74
|
-
events ||= []
|
75
|
-
events.each do |event_data|
|
76
|
-
session_output.receive(event_data)
|
77
|
-
end
|
78
|
-
|
79
|
-
if writer.current?(writer_sequence)
|
80
|
-
writer.
|
81
|
-
style(:faint).
|
82
|
-
puts("(Nothing written)")
|
83
|
-
|
84
|
-
writer.puts
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def handle_event_data(event_data)
|
89
|
-
pend(event_data)
|
90
|
-
end
|
91
|
-
|
92
|
-
def pend_event(event_data)
|
93
|
-
process_id = event_data.process_id
|
94
|
-
|
95
|
-
if not started?(process_id)
|
96
|
-
start(process_id)
|
97
|
-
end
|
98
|
-
|
99
|
-
pended_events = self.pended_events[process_id]
|
100
|
-
pended_events << event_data
|
101
|
-
end
|
102
|
-
alias :pend :pend_event
|
103
|
-
|
104
|
-
def pended_event?(event_data)
|
105
|
-
process_id = event_data.process_id
|
106
|
-
|
107
|
-
pended_events = self.pended_events.fetch(process_id) do
|
108
|
-
return false
|
109
|
-
end
|
110
|
-
|
111
|
-
pended_events.include?(event_data)
|
112
|
-
end
|
113
|
-
alias :pended? :pended_event?
|
114
|
-
|
115
|
-
def start(process_id)
|
116
|
-
if started?(process_id)
|
117
|
-
raise Error, "Process already started (Process ID: #{process_id})"
|
118
|
-
end
|
119
|
-
|
120
|
-
pended_events[process_id] = []
|
121
|
-
end
|
122
|
-
|
123
|
-
def started?(process_id)
|
124
|
-
pended_events.key?(process_id)
|
125
|
-
end
|
126
|
-
|
127
|
-
module Defaults
|
128
|
-
def self.only_failure
|
129
|
-
ENV.fetch('TEST_BENCH_ONLY_FAILURE', 'off') == 'on'
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|