test_bench-run 2.1.3.0 → 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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/lib/test_bench/run/controls/{result.rb → events.rb} +1 -1
  3. data/lib/test_bench/run/controls/{process_id.rb → message.rb} +1 -1
  4. data/lib/test_bench/run/controls/path.rb +1 -9
  5. data/lib/test_bench/run/controls/random.rb +1 -1
  6. data/lib/test_bench/run/controls/session.rb +14 -0
  7. data/lib/test_bench/run/controls/status.rb +42 -0
  8. data/lib/test_bench/run/controls/summary/file/info.rb +106 -0
  9. data/lib/test_bench/run/controls/summary/file/totals.rb +36 -0
  10. data/lib/test_bench/run/controls/summary/file.rb +42 -0
  11. data/lib/test_bench/run/controls/summary/run.rb +51 -0
  12. data/lib/test_bench/run/controls/summary.rb +43 -0
  13. data/lib/test_bench/run/controls/{events/session.rb → telemetry.rb} +2 -2
  14. data/lib/test_bench/run/controls/time.rb +1 -1
  15. data/lib/test_bench/run/controls.rb +14 -20
  16. data/lib/test_bench/run/run.rb +78 -90
  17. data/lib/test_bench/run/{get_files → select_files}/substitute.rb +11 -14
  18. data/lib/test_bench/run/select_files.rb +68 -0
  19. data/lib/test_bench/run/substitute.rb +40 -0
  20. data/lib/test_bench/run/summary/substitute.rb +17 -0
  21. data/lib/test_bench/run/summary.rb +475 -0
  22. data/lib/test_bench/run.rb +6 -14
  23. metadata +32 -45
  24. data/lib/test_bench/run/controls/directory.rb +0 -70
  25. data/lib/test_bench/run/controls/event_data.rb +0 -7
  26. data/lib/test_bench/run/controls/events/event_data.rb +0 -9
  27. data/lib/test_bench/run/controls/events/file_crashed.rb +0 -109
  28. data/lib/test_bench/run/controls/events/file_finished.rb +0 -56
  29. data/lib/test_bench/run/controls/events/file_started.rb +0 -47
  30. data/lib/test_bench/run/controls/events/finished.rb +0 -56
  31. data/lib/test_bench/run/controls/events/started.rb +0 -47
  32. data/lib/test_bench/run/controls/exception.rb +0 -101
  33. data/lib/test_bench/run/controls/executor.rb +0 -56
  34. data/lib/test_bench/run/controls/file/create.rb +0 -69
  35. data/lib/test_bench/run/controls/file/pattern.rb +0 -33
  36. data/lib/test_bench/run/controls/file.rb +0 -180
  37. data/lib/test_bench/run/events.rb +0 -12
  38. data/lib/test_bench/run/executor/serial.rb +0 -34
  39. data/lib/test_bench/run/executor/substitute.rb +0 -45
  40. data/lib/test_bench/run/executor.rb +0 -44
  41. data/lib/test_bench/run/file.rb +0 -81
  42. data/lib/test_bench/run/get_files.rb +0 -76
  43. data/lib/test_bench/run/output/file.rb +0 -135
  44. data/lib/test_bench/run/output/summary/error.rb +0 -139
  45. 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
@@ -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