test_bench-bootstrap 6.1.1 → 7.0.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 (171) hide show
  1. checksums.yaml +4 -4
  2. data/executables/bench-bootstrap +7 -0
  3. data/lib/test_bench_bootstrap/controls.rb +1 -0
  4. data/lib/test_bench_bootstrap/test_bench_bootstrap.rb +7 -0
  5. data/lib/test_bench_bootstrap.rb +4 -0
  6. data/upstream-lib/test_bench_bootstrap/import_constants/controls/namespace.rb +84 -0
  7. data/upstream-lib/test_bench_bootstrap/import_constants/controls.rb +1 -0
  8. data/upstream-lib/test_bench_bootstrap/import_constants/import_constants.rb +46 -0
  9. data/upstream-lib/test_bench_bootstrap/import_constants/macro.rb +10 -0
  10. data/upstream-lib/test_bench_bootstrap/import_constants.rb +2 -0
  11. data/upstream-lib/test_bench_bootstrap/test_bench/controls/telemetry_sink.rb +7 -0
  12. data/upstream-lib/test_bench_bootstrap/test_bench/controls.rb +3 -0
  13. data/upstream-lib/test_bench_bootstrap/test_bench/executable/controls/path.rb +9 -0
  14. data/upstream-lib/test_bench_bootstrap/test_bench/executable/controls/random.rb +9 -0
  15. data/upstream-lib/test_bench_bootstrap/test_bench/executable/controls/run.rb +12 -0
  16. data/upstream-lib/test_bench_bootstrap/test_bench/executable/controls/standard_input.rb +31 -0
  17. data/upstream-lib/test_bench_bootstrap/test_bench/executable/controls.rb +8 -0
  18. data/upstream-lib/test_bench_bootstrap/test_bench/executable/defaults.rb +15 -0
  19. data/upstream-lib/test_bench_bootstrap/test_bench/executable/executable.rb +61 -0
  20. data/upstream-lib/test_bench_bootstrap/test_bench/executable/parse_arguments.rb +271 -0
  21. data/upstream-lib/test_bench_bootstrap/test_bench/executable.rb +7 -0
  22. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/build.rb +41 -0
  23. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/controls/comment_style.rb +9 -0
  24. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/controls/exception.rb +9 -0
  25. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/controls/fixture.rb +69 -0
  26. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/controls/message.rb +9 -0
  27. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/controls/output.rb +11 -0
  28. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/controls/path.rb +9 -0
  29. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/controls/session.rb +21 -0
  30. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/controls/status.rb +9 -0
  31. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/controls/text.rb +9 -0
  32. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/controls/title.rb +9 -0
  33. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/controls.rb +14 -0
  34. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/evaluate.rb +37 -0
  35. data/upstream-lib/test_bench_bootstrap/test_bench/fixture/fixture.rb +216 -0
  36. data/upstream-lib/test_bench_bootstrap/test_bench/fixture.rb +7 -0
  37. data/upstream-lib/test_bench_bootstrap/test_bench/output/comment_style.rb +63 -0
  38. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/comment_style.rb +23 -0
  39. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/event.rb +9 -0
  40. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/events/aborted.rb +11 -0
  41. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/events/commented.rb +23 -0
  42. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/events/context_finished.rb +11 -0
  43. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/events/context_started.rb +11 -0
  44. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/events/detailed.rb +23 -0
  45. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/events/failed.rb +11 -0
  46. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/events/file_executed.rb +11 -0
  47. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/events/file_not_found.rb +11 -0
  48. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/events/file_queued.rb +11 -0
  49. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/events/skipped.rb +11 -0
  50. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/events/test_finished.rb +11 -0
  51. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/events/test_started.rb +11 -0
  52. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/random.rb +9 -0
  53. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/session.rb +19 -0
  54. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/status.rb +9 -0
  55. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/style.rb +41 -0
  56. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls/text.rb +31 -0
  57. data/upstream-lib/test_bench_bootstrap/test_bench/output/controls.rb +26 -0
  58. data/upstream-lib/test_bench_bootstrap/test_bench/output/detail_policy.rb +46 -0
  59. data/upstream-lib/test_bench_bootstrap/test_bench/output/device/null.rb +21 -0
  60. data/upstream-lib/test_bench_bootstrap/test_bench/output/device/substitute.rb +46 -0
  61. data/upstream-lib/test_bench_bootstrap/test_bench/output/device.rb +75 -0
  62. data/upstream-lib/test_bench_bootstrap/test_bench/output/get.rb +32 -0
  63. data/upstream-lib/test_bench_bootstrap/test_bench/output/level.rb +53 -0
  64. data/upstream-lib/test_bench_bootstrap/test_bench/output/output.rb +572 -0
  65. data/upstream-lib/test_bench_bootstrap/test_bench/output/writer/style.rb +54 -0
  66. data/upstream-lib/test_bench_bootstrap/test_bench/output/writer/substitute.rb +27 -0
  67. data/upstream-lib/test_bench_bootstrap/test_bench/output/writer.rb +119 -0
  68. data/upstream-lib/test_bench_bootstrap/test_bench/output.rb +20 -0
  69. data/upstream-lib/test_bench_bootstrap/test_bench/random/controls/seed.rb +25 -0
  70. data/upstream-lib/test_bench_bootstrap/test_bench/random/controls/sequence.rb +70 -0
  71. data/upstream-lib/test_bench_bootstrap/test_bench/random/controls.rb +2 -0
  72. data/upstream-lib/test_bench_bootstrap/test_bench/random/defaults.rb +13 -0
  73. data/upstream-lib/test_bench_bootstrap/test_bench/random/generator/substitute.rb +23 -0
  74. data/upstream-lib/test_bench_bootstrap/test_bench/random/generator.rb +64 -0
  75. data/upstream-lib/test_bench_bootstrap/test_bench/random/iterator.rb +54 -0
  76. data/upstream-lib/test_bench_bootstrap/test_bench/random/random.rb +27 -0
  77. data/upstream-lib/test_bench_bootstrap/test_bench/random.rb +8 -0
  78. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls/events.rb +9 -0
  79. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls/message.rb +9 -0
  80. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls/path.rb +9 -0
  81. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls/random.rb +9 -0
  82. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls/session.rb +16 -0
  83. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls/status.rb +44 -0
  84. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls/summary/file/info.rb +108 -0
  85. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls/summary/file/totals.rb +38 -0
  86. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls/summary/file.rb +44 -0
  87. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls/summary/run.rb +53 -0
  88. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls/summary.rb +45 -0
  89. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls/telemetry.rb +11 -0
  90. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls/time.rb +9 -0
  91. data/upstream-lib/test_bench_bootstrap/test_bench/run/controls.rb +20 -0
  92. data/upstream-lib/test_bench_bootstrap/test_bench/run/run.rb +146 -0
  93. data/upstream-lib/test_bench_bootstrap/test_bench/run/select_files/substitute.rb +45 -0
  94. data/upstream-lib/test_bench_bootstrap/test_bench/run/select_files.rb +70 -0
  95. data/upstream-lib/test_bench_bootstrap/test_bench/run/substitute.rb +42 -0
  96. data/upstream-lib/test_bench_bootstrap/test_bench/run/summary/substitute.rb +19 -0
  97. data/upstream-lib/test_bench_bootstrap/test_bench/run/summary.rb +477 -0
  98. data/upstream-lib/test_bench_bootstrap/test_bench/run.rb +10 -0
  99. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/backtrace/location.rb +48 -0
  100. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/backtrace.rb +83 -0
  101. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/comment_disposition.rb +17 -0
  102. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/event.rb +35 -0
  103. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/events/aborted.rb +51 -0
  104. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/events/commented.rb +62 -0
  105. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/events/context_finished.rb +112 -0
  106. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/events/context_started.rb +51 -0
  107. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/events/detailed.rb +62 -0
  108. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/events/failed.rb +41 -0
  109. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/events/file_executed.rb +101 -0
  110. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/events/file_not_found.rb +41 -0
  111. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/events/file_queued.rb +41 -0
  112. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/events/skipped.rb +51 -0
  113. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/events/test_finished.rb +92 -0
  114. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/events/test_started.rb +51 -0
  115. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/events.rb +35 -0
  116. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/exception/message.rb +23 -0
  117. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/exception/raise.rb +52 -0
  118. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/exception.rb +81 -0
  119. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/message.rb +43 -0
  120. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/metadata.rb +9 -0
  121. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/path/apex_directory.rb +76 -0
  122. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/path/file/create.rb +113 -0
  123. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/path/file.rb +42 -0
  124. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/path.rb +87 -0
  125. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/random.rb +9 -0
  126. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/result.rb +17 -0
  127. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/sequence.rb +13 -0
  128. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/status.rb +92 -0
  129. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/telemetry.rb +15 -0
  130. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/telemetry_sink.rb +37 -0
  131. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/text.rb +33 -0
  132. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls/title.rb +41 -0
  133. data/upstream-lib/test_bench_bootstrap/test_bench/session/controls.rb +43 -0
  134. data/upstream-lib/test_bench_bootstrap/test_bench/session/defaults.rb +17 -0
  135. data/upstream-lib/test_bench_bootstrap/test_bench/session/events.rb +24 -0
  136. data/upstream-lib/test_bench_bootstrap/test_bench/session/exception/format_backtrace/substitute.rb +34 -0
  137. data/upstream-lib/test_bench_bootstrap/test_bench/session/exception/format_backtrace.rb +114 -0
  138. data/upstream-lib/test_bench_bootstrap/test_bench/session/isolate/substitute.rb +45 -0
  139. data/upstream-lib/test_bench_bootstrap/test_bench/session/isolate.rb +159 -0
  140. data/upstream-lib/test_bench_bootstrap/test_bench/session/result.rb +44 -0
  141. data/upstream-lib/test_bench_bootstrap/test_bench/session/session.rb +237 -0
  142. data/upstream-lib/test_bench_bootstrap/test_bench/session/status.rb +60 -0
  143. data/upstream-lib/test_bench_bootstrap/test_bench/session/substitute/sink.rb +99 -0
  144. data/upstream-lib/test_bench_bootstrap/test_bench/session/substitute.rb +166 -0
  145. data/upstream-lib/test_bench_bootstrap/test_bench/session/trace.rb +53 -0
  146. data/upstream-lib/test_bench_bootstrap/test_bench/session.rb +22 -0
  147. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/controls/event/metadata.rb +72 -0
  148. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/controls/event.rb +156 -0
  149. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/controls/event_data.rb +113 -0
  150. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/controls/handler.rb +83 -0
  151. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/controls/path/file.rb +39 -0
  152. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/controls/process_id.rb +25 -0
  153. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/controls/random.rb +11 -0
  154. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/controls/sink.rb +35 -0
  155. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/controls/time.rb +104 -0
  156. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/controls.rb +16 -0
  157. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/event.rb +130 -0
  158. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/event_data/serialization.rb +85 -0
  159. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/event_data.rb +15 -0
  160. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/sink/file.rb +39 -0
  161. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/sink/handler/event_registry.rb +44 -0
  162. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/sink/handler.rb +128 -0
  163. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/sink.rb +13 -0
  164. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/substitute/sink.rb +71 -0
  165. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/substitute.rb +43 -0
  166. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry/telemetry.rb +92 -0
  167. data/upstream-lib/test_bench_bootstrap/test_bench/telemetry.rb +18 -0
  168. data/upstream-lib/test_bench_bootstrap/test_bench/test_bench.rb +76 -0
  169. data/upstream-lib/test_bench_bootstrap/test_bench.rb +4 -0
  170. metadata +353 -16
  171. data/lib/test_bench/bootstrap.rb +0 -328
@@ -0,0 +1,237 @@
1
+ module TestBenchBootstrap
2
+ module TestBench
3
+ class Session
4
+ Failure = Class.new(RuntimeError)
5
+
6
+ ExecutionBreak = Object.new
7
+
8
+ ## Remove when no longer in use - Nathan, Tue Jul 15 2025
9
+ Abort = ExecutionBreak
10
+
11
+ def telemetry
12
+ @telemetry ||= Telemetry::Substitute.build
13
+ end
14
+ attr_writer :telemetry
15
+
16
+ def format_backtrace
17
+ @format_backtrace ||= Exception::FormatBacktrace::Substitute.build
18
+ end
19
+ attr_writer :format_backtrace
20
+
21
+ def isolate
22
+ @isolate ||= Isolate::Substitute.build
23
+ end
24
+ attr_writer :isolate
25
+
26
+ def status
27
+ @status ||= Status.initial
28
+ end
29
+ attr_writer :status
30
+
31
+ def trace
32
+ @trace ||= Trace.new
33
+ end
34
+ attr_writer :trace
35
+
36
+ def assertion_sequence
37
+ @assertion_sequence ||= 0
38
+ end
39
+ attr_writer :assertion_sequence
40
+
41
+ def self.build
42
+ instance = new
43
+
44
+ Telemetry.configure(instance)
45
+ Exception::FormatBacktrace.configure(instance)
46
+ Isolate.configure(instance)
47
+
48
+ instance
49
+ end
50
+
51
+ def self.instance
52
+ @instance ||= build
53
+ end
54
+
55
+ def self.configure(receiver, session: nil, attr_name: nil)
56
+ session ||= instance
57
+ attr_name ||= :session
58
+
59
+ receiver.public_send(:"#{attr_name}=", session)
60
+ end
61
+
62
+ def self.establish(session)
63
+ @instance = session
64
+ end
65
+
66
+ def self.register_telemetry_sink(telemetry_sink)
67
+ instance.register_telemetry_sink(telemetry_sink)
68
+ end
69
+
70
+ def assert(value, failure_message)
71
+ self.assertion_sequence += 1
72
+
73
+ if not value
74
+ raise Failure, failure_message
75
+ end
76
+ end
77
+
78
+ def comment(text, disposition=nil)
79
+ record_event(Events::Commented.build(text, disposition))
80
+ end
81
+
82
+ def detail(text, disposition=nil)
83
+ record_event(Events::Detailed.build(text, disposition))
84
+ end
85
+
86
+ def test(title=nil, &block)
87
+ record_event(Events::TestStarted.build(title))
88
+
89
+ pending_test_finished_event = Events::TestFinished.build(title)
90
+
91
+ evaluate(pending_test_finished_event) do
92
+ previous_sequence = self.assertion_sequence
93
+
94
+ block.()
95
+
96
+ if self.assertion_sequence == previous_sequence
97
+ raise Failure, "Test didn't perform an assertion"
98
+ end
99
+ end
100
+ end
101
+
102
+ def context(title=nil, &block)
103
+ record_event(Events::ContextStarted.build(title))
104
+
105
+ pending_context_finished_event = Events::ContextFinished.build(title)
106
+
107
+ evaluate(pending_context_finished_event, &block)
108
+ end
109
+
110
+ def skip(message=nil)
111
+ record_event(Events::Skipped.build(message))
112
+ end
113
+
114
+ def execute(file_path)
115
+ if file_not_found?(file_path)
116
+ record_event(Events::FileNotFound.build(file_path))
117
+ return
118
+ end
119
+
120
+ record_event(Events::FileQueued.build(file_path))
121
+
122
+ pended_event = Events::FileExecuted.build(file_path, result)
123
+
124
+ evaluate(pended_event) do
125
+ isolate.(file_path) do |event_data|
126
+ record_event(event_data)
127
+ end
128
+ end
129
+ end
130
+
131
+ def file_not_found?(file_path)
132
+ !File.exist?(file_path)
133
+ end
134
+
135
+ def register_telemetry_sink(telemetry_sink)
136
+ telemetry.register(telemetry_sink)
137
+ end
138
+
139
+ def inspect(raw: nil)
140
+ if raw
141
+ return super()
142
+ end
143
+
144
+ telemetry_placeholder = Struct.new(:inspect).new("(not inspected)")
145
+
146
+ original_telemetry = self.telemetry
147
+
148
+ self.telemetry = telemetry_placeholder
149
+
150
+ begin
151
+ super()
152
+
153
+ ensure
154
+ self.telemetry = original_telemetry
155
+ end
156
+ end
157
+
158
+ def update(event_or_event_data)
159
+ case event_or_event_data
160
+ in Telemetry::Event => event
161
+
162
+ in Telemetry::EventData => event_data
163
+ event_type = event_data.type
164
+ event_class = Events.const_get(event_type, false)
165
+
166
+ event = Telemetry::Event::Import.(event_data, event_class)
167
+ end
168
+
169
+ case event
170
+ when Events::ContextStarted, Events::TestStarted
171
+ title = event.title
172
+
173
+ if not title.nil?
174
+ trace.push(title)
175
+ end
176
+
177
+ when Events::Commented, Events::Detailed
178
+ trace.push(event.text)
179
+ end
180
+
181
+ telemetry.record(event)
182
+
183
+ status.update(event)
184
+
185
+ case event
186
+ when Events::Commented, Events::Detailed
187
+ trace.pop
188
+
189
+ when Events::ContextFinished, Events::TestFinished
190
+ title = event.title
191
+
192
+ if not title.nil?
193
+ trace.pop
194
+ end
195
+ end
196
+ end
197
+ alias :record_event :update
198
+
199
+ def result(previous_status=nil)
200
+ status.result(previous_status)
201
+ end
202
+
203
+ def evaluate(pending_event, &block)
204
+ previous_status = status.dup
205
+
206
+ catch(ExecutionBreak) do
207
+ block.(self)
208
+
209
+ rescue Failure => failure
210
+ message = failure.message
211
+ record_event(Events::Failed.build(message))
212
+
213
+ rescue ::Exception => exception
214
+ aborted_recorded = status.error_sequence > previous_status.error_sequence
215
+
216
+ if not aborted_recorded
217
+ location = format_backtrace.(exception)
218
+
219
+ message = exception.detailed_message
220
+
221
+ record_event(Events::Aborted.build(message, location))
222
+ end
223
+
224
+ raise exception
225
+
226
+ ensure
227
+ result = status.result(previous_status, pending_event)
228
+
229
+ pending_event.result = result
230
+ record_event(pending_event)
231
+ end
232
+
233
+ result
234
+ end
235
+ end
236
+ end
237
+ end
@@ -0,0 +1,60 @@
1
+ module TestBenchBootstrap
2
+ module TestBench
3
+ class Session
4
+ Status = Struct.new(:test_sequence, :failure_sequence, :error_sequence, :skip_sequence)
5
+
6
+ class Status
7
+ def self.initial
8
+ new(0, 0, 0, 0)
9
+ end
10
+
11
+ def result(previous_status=nil, pending_event=nil)
12
+ previous_status ||= Status.initial
13
+
14
+ compare_status = compare(previous_status)
15
+
16
+ if not pending_event.nil?
17
+ compare_status.update(pending_event)
18
+ end
19
+
20
+ if compare_status.error_sequence > 0
21
+ Result.aborted
22
+ elsif compare_status.failure_sequence > 0
23
+ Result.failed
24
+ elsif compare_status.skip_sequence > 0
25
+ Result.incomplete
26
+ elsif not compare_status.test_sequence > 0
27
+ Result.none
28
+ else
29
+ Result.passed
30
+ end
31
+ end
32
+
33
+ def update(event)
34
+ case event
35
+ when Events::TestFinished
36
+ self.test_sequence += 1
37
+ when Events::Failed
38
+ self.failure_sequence += 1
39
+ when Events::Aborted, Events::FileNotFound
40
+ self.error_sequence += 1
41
+ when Events::Skipped
42
+ self.skip_sequence += 1
43
+ end
44
+ end
45
+
46
+ def compare(previous_status)
47
+ test_sequence_difference = test_sequence - previous_status.test_sequence
48
+
49
+ failure_sequence_difference = failure_sequence - previous_status.failure_sequence
50
+
51
+ error_sequence_difference = error_sequence - previous_status.error_sequence
52
+
53
+ skip_sequence_difference = skip_sequence - previous_status.skip_sequence
54
+
55
+ Status.new(test_sequence_difference, failure_sequence_difference, error_sequence_difference, skip_sequence_difference)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,99 @@
1
+ module TestBenchBootstrap
2
+ module TestBench
3
+ class Session
4
+ module Substitute
5
+ class Sink
6
+ include Telemetry::Sink
7
+
8
+ def trace
9
+ @trace ||= Trace.new
10
+ end
11
+ attr_writer :trace
12
+
13
+ def records
14
+ @records ||= []
15
+ end
16
+ attr_writer :records
17
+
18
+ def self.build(trace=nil)
19
+ instance = new
20
+
21
+ if not trace.nil?
22
+ instance.trace = trace
23
+ end
24
+
25
+ instance
26
+ end
27
+
28
+ def receive(event_data)
29
+ trace_copy = Trace.new
30
+
31
+ trace.each do |entry|
32
+ trace_copy.push(entry)
33
+ end
34
+
35
+ record = Record.new(event_data, trace_copy)
36
+ records.push(record)
37
+
38
+ record
39
+ end
40
+
41
+ def received?(event_data=nil)
42
+ if not event_data.nil?
43
+ records.any? do |record|
44
+ record.event_data == event_data
45
+ end
46
+ else
47
+ records.any?
48
+ end
49
+ end
50
+
51
+ def one_event?(event_class, *titles, **attributes)
52
+ event_sink = event_sink(*titles)
53
+ event_sink.one_event?(event_class, **attributes)
54
+ end
55
+
56
+ def one_event(event_class, *titles, **attributes)
57
+ event_sink = event_sink(*titles)
58
+ event_sink.one_event(event_class, **attributes)
59
+ end
60
+
61
+ def any_event?(event_class, *titles, **attributes)
62
+ event_sink = event_sink(*titles)
63
+ event_sink.any_event?(event_class, **attributes)
64
+ end
65
+ alias :event? :any_event?
66
+
67
+ def events(event_class, *titles, **attributes)
68
+ event_sink = event_sink(*titles)
69
+ event_sink.events(event_class, **attributes)
70
+ end
71
+
72
+ def event_sink(*titles)
73
+ event_sink = Telemetry::Substitute::Sink.new
74
+
75
+ records.each do |record|
76
+ if record.match?(titles)
77
+ event_data = record.event_data
78
+
79
+ event_sink.receive(event_data)
80
+ end
81
+ end
82
+
83
+ event_sink
84
+ end
85
+
86
+ Record = Struct.new(:event_data, :trace) do
87
+ def match?(titles)
88
+ if titles.any?
89
+ trace.match?(*titles)
90
+ else
91
+ true
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,166 @@
1
+ module TestBenchBootstrap
2
+ module TestBench
3
+ class Session
4
+ module Substitute
5
+ def self.build
6
+ Session.build
7
+ end
8
+
9
+ class Session < Session
10
+ def sink
11
+ @sink ||= Sink.build(trace)
12
+ end
13
+
14
+ attr_accessor :record_file_not_found
15
+
16
+ def record_file_not_found!
17
+ self.record_file_not_found = true
18
+ end
19
+
20
+ def self.build
21
+ instance = new
22
+
23
+ sink = instance.sink
24
+
25
+ telemetry = instance.telemetry
26
+ telemetry.register(sink)
27
+
28
+ instance
29
+ end
30
+
31
+ def executed?(...)
32
+ isolate.executed?(...)
33
+ end
34
+
35
+ def file_not_found?(_file_path)
36
+ record_file_not_found ? true : false
37
+ end
38
+
39
+ def one_passed_test_finished_event?(*, **)
40
+ result = Result.passed
41
+
42
+ one_test_finished_event?(*, **, result:)
43
+ end
44
+ alias :one_test_passed? :one_passed_test_finished_event?
45
+
46
+ def one_passed_test_finished_event(*, **)
47
+ result = Result.passed
48
+
49
+ one_test_finished_event(*, **, result:)
50
+ end
51
+ alias :one_passed_test :one_passed_test_finished_event
52
+
53
+ def any_passed_test_finished_event?(*, **)
54
+ result = Result.passed
55
+
56
+ any_test_finished_event?(*, **, result:)
57
+ end
58
+ alias :any_test_passed? :any_passed_test_finished_event?
59
+ alias :test_passed? :any_test_passed?
60
+
61
+ def passed_test_finished_events(*, **)
62
+ result = Result.passed
63
+
64
+ test_finished_events(*, **, result:)
65
+ end
66
+ alias :passed_tests :passed_test_finished_events
67
+
68
+ def one_failed_test_finished_event?(*, **)
69
+ result = Result.failed
70
+
71
+ one_test_finished_event?(*, **, result:)
72
+ end
73
+ alias :one_test_failed? :one_failed_test_finished_event?
74
+
75
+ def one_failed_test_finished_event(*, **)
76
+ result = Result.failed
77
+
78
+ one_test_finished_event(*, **, result:)
79
+ end
80
+ alias :one_failed_test :one_failed_test_finished_event
81
+
82
+ def any_failed_test_finished_event?(*, **)
83
+ result = Result.failed
84
+
85
+ any_test_finished_event?(*, **, result:)
86
+ end
87
+ alias :any_test_failed? :any_failed_test_finished_event?
88
+ alias :test_failed? :any_test_failed?
89
+
90
+ def failed_test_finished_events(*, **)
91
+ result = Result.failed
92
+
93
+ test_finished_events(*, **, result:)
94
+ end
95
+ alias :failed_tests :failed_test_finished_events
96
+
97
+ [
98
+ Events::Failed,
99
+ Events::Aborted,
100
+ Events::Skipped,
101
+ Events::Commented,
102
+ Events::Detailed,
103
+ Events::TestStarted,
104
+ Events::TestFinished,
105
+ Events::ContextStarted,
106
+ Events::ContextFinished,
107
+ Events::FileQueued,
108
+ Events::FileExecuted,
109
+ Events::FileNotFound
110
+ ].each do |event_class|
111
+
112
+ event_name = event_class.event_name
113
+
114
+ module_eval(<<~RUBY, __FILE__, __LINE__)
115
+ def one_#{event_name}_event?(...)
116
+ one_event?(#{event_class}, ...)
117
+ end
118
+
119
+ def one_#{event_name}_event(...)
120
+ one_event(#{event_class}, ...)
121
+ end
122
+
123
+ def any_#{event_name}_event?(...)
124
+ any_event?(#{event_class}, ...)
125
+ end
126
+ alias :#{event_name}_event? :any_#{event_name}_event?
127
+
128
+ def #{event_name}_events(...)
129
+ events(#{event_class}, ...)
130
+ end
131
+ RUBY
132
+ end
133
+
134
+ alias :test? :any_test_started_event?
135
+ alias :one_test? :one_test_started_event?
136
+
137
+ alias :context? :any_context_started_event?
138
+ alias :one_context? :one_context_started_event?
139
+
140
+ alias :comment? :any_commented_event?
141
+ alias :one_comment? :one_commented_event?
142
+
143
+ alias :detail? :any_detailed_event?
144
+ alias :one_detail? :one_detailed_event?
145
+
146
+ def one_event?(...)
147
+ sink.one_event?(...)
148
+ end
149
+
150
+ def any_event?(...)
151
+ sink.any_event?(...)
152
+ end
153
+ alias :event? :any_event?
154
+
155
+ def one_event(...)
156
+ sink.one_event(...)
157
+ end
158
+
159
+ def events(...)
160
+ sink.events(...)
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,53 @@
1
+ module TestBenchBootstrap
2
+ module TestBench
3
+ class Session
4
+ class Trace
5
+ include Enumerable
6
+
7
+ def entries
8
+ @entries ||= []
9
+ end
10
+ attr_writer :entries
11
+
12
+ def push(entry)
13
+ entries.push(entry)
14
+ end
15
+
16
+ def pop
17
+ entries.pop
18
+ end
19
+
20
+ def match?(*context_titles, compare_text)
21
+ if compare_text != entries.last
22
+ return false
23
+ end
24
+
25
+ context_title_iterator = entries[0...-1].to_enum
26
+
27
+ context_titles.all? do |context_title|
28
+ title = context_title_iterator.next until title == context_title
29
+
30
+ true
31
+
32
+ rescue StopIteration
33
+ false
34
+ end
35
+ end
36
+
37
+ def each(...)
38
+ entries.each(...)
39
+ end
40
+
41
+ def join(delimiter=nil)
42
+ delimiter ||= self.class.join_delimiter
43
+
44
+ entries.join(delimiter)
45
+ end
46
+
47
+ def self.join_delimiter
48
+ ' :: '
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,22 @@
1
+ require 'test_bench_bootstrap/test_bench/telemetry'
2
+
3
+ require 'test_bench_bootstrap/test_bench/session/defaults'
4
+
5
+ require 'test_bench_bootstrap/test_bench/session/result'
6
+
7
+ require 'test_bench_bootstrap/test_bench/session/exception/format_backtrace'
8
+ require 'test_bench_bootstrap/test_bench/session/exception/format_backtrace/substitute'
9
+
10
+ require 'test_bench_bootstrap/test_bench/session/events'
11
+
12
+ require 'test_bench_bootstrap/test_bench/session/trace'
13
+
14
+ require 'test_bench_bootstrap/test_bench/session/status'
15
+
16
+ require 'test_bench_bootstrap/test_bench/session/isolate'
17
+ require 'test_bench_bootstrap/test_bench/session/isolate/substitute'
18
+
19
+ require 'test_bench_bootstrap/test_bench/session/session'
20
+
21
+ require 'test_bench_bootstrap/test_bench/session/substitute/sink'
22
+ require 'test_bench_bootstrap/test_bench/session/substitute'
@@ -0,0 +1,72 @@
1
+ module TestBenchBootstrap
2
+ module TestBench
3
+ class Telemetry
4
+ module Controls
5
+ module Event
6
+ module Metadata
7
+ def self.example(process_id: nil, time: nil)
8
+ if process_id == :none
9
+ process_id = nil
10
+ else
11
+ process_id ||= self.process_id
12
+ end
13
+
14
+ if time == :none
15
+ time = nil
16
+ else
17
+ time ||= self.time
18
+ end
19
+
20
+ metadata = Telemetry::Event::Metadata.new
21
+ metadata.process_id = process_id
22
+ metadata.time = time
23
+ metadata
24
+ end
25
+
26
+ def self.other_example
27
+ Other.example
28
+ end
29
+
30
+ def self.random
31
+ Random.example
32
+ end
33
+
34
+ def self.process_id
35
+ ProcessID.example
36
+ end
37
+
38
+ def self.time
39
+ Time.example
40
+ end
41
+
42
+ module Other
43
+ def self.example(process_id: nil, time: nil)
44
+ process_id ||= self.process_id
45
+ time ||= self.time
46
+
47
+ Metadata.example(process_id:, time:)
48
+ end
49
+
50
+ def self.process_id
51
+ ProcessID.other_example
52
+ end
53
+
54
+ def self.time
55
+ Time.other_example
56
+ end
57
+ end
58
+
59
+ module Random
60
+ def self.example(process_id: nil, time: nil)
61
+ process_id ||= ProcessID.random
62
+ time ||= Controls::Time.random
63
+
64
+ Metadata.example(process_id:, time:)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end