test_bench-session 2.1.3.2 → 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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/lib/test_bench/session/controls/backtrace/location.rb +46 -0
  3. data/lib/test_bench/session/controls/backtrace.rb +81 -0
  4. data/lib/test_bench/session/controls/comment_disposition.rb +15 -0
  5. data/lib/test_bench/session/controls/event.rb +27 -1
  6. data/lib/test_bench/session/controls/events/aborted.rb +49 -0
  7. data/lib/test_bench/session/controls/events/commented.rb +26 -76
  8. data/lib/test_bench/session/controls/events/context_finished.rb +68 -28
  9. data/lib/test_bench/session/controls/events/context_started.rb +17 -32
  10. data/lib/test_bench/session/controls/events/detailed.rb +26 -76
  11. data/lib/test_bench/session/controls/events/failed.rb +16 -24
  12. data/lib/test_bench/session/controls/events/file_executed.rb +99 -0
  13. data/lib/test_bench/session/controls/events/file_not_found.rb +39 -0
  14. data/lib/test_bench/session/controls/events/file_queued.rb +39 -0
  15. data/lib/test_bench/session/controls/events/skipped.rb +49 -0
  16. data/lib/test_bench/session/controls/events/test_finished.rb +48 -28
  17. data/lib/test_bench/session/controls/events/test_started.rb +17 -32
  18. data/lib/test_bench/session/controls/events.rb +19 -19
  19. data/lib/test_bench/session/controls/exception/message.rb +21 -0
  20. data/lib/test_bench/session/controls/exception/raise.rb +50 -0
  21. data/lib/test_bench/session/controls/exception.rb +55 -21
  22. data/lib/test_bench/session/controls/message.rb +41 -0
  23. data/lib/test_bench/session/controls/{time.rb → metadata.rb} +1 -1
  24. data/lib/test_bench/session/controls/path/apex_directory.rb +74 -0
  25. data/lib/test_bench/session/controls/path/file/create.rb +111 -0
  26. data/lib/test_bench/session/controls/path/file.rb +40 -0
  27. data/lib/test_bench/session/controls/path.rb +85 -0
  28. data/lib/test_bench/session/controls/random.rb +1 -1
  29. data/lib/test_bench/session/controls/result.rb +3 -11
  30. data/lib/test_bench/session/controls/{events/event_data.rb → sequence.rb} +4 -2
  31. data/lib/test_bench/session/controls/status.rb +90 -0
  32. data/lib/test_bench/session/controls/telemetry.rb +13 -0
  33. data/lib/test_bench/session/controls/telemetry_sink.rb +29 -1
  34. data/lib/test_bench/session/controls/text.rb +31 -0
  35. data/lib/test_bench/session/controls/title.rb +12 -12
  36. data/lib/test_bench/session/controls.rb +31 -26
  37. data/lib/test_bench/session/defaults.rb +15 -0
  38. data/lib/test_bench/session/events.rb +12 -15
  39. data/lib/test_bench/session/exception/format_backtrace/substitute.rb +32 -0
  40. data/lib/test_bench/session/exception/format_backtrace.rb +112 -0
  41. data/lib/test_bench/session/isolate/substitute.rb +43 -0
  42. data/lib/test_bench/session/isolate.rb +157 -0
  43. data/lib/test_bench/session/result.rb +42 -0
  44. data/lib/test_bench/session/session.rb +137 -164
  45. data/lib/test_bench/session/status.rb +58 -0
  46. data/lib/test_bench/session/substitute/sink.rb +30 -45
  47. data/lib/test_bench/session/substitute.rb +88 -54
  48. data/lib/test_bench/session/trace.rb +51 -0
  49. data/lib/test_bench/session.rb +15 -15
  50. metadata +53 -45
  51. data/lib/test_bench/session/controls/comment.rb +0 -105
  52. data/lib/test_bench/session/controls/detail.rb +0 -91
  53. data/lib/test_bench/session/controls/events/context_skipped.rb +0 -47
  54. data/lib/test_bench/session/controls/events/fixture_finished.rb +0 -53
  55. data/lib/test_bench/session/controls/events/fixture_started.rb +0 -47
  56. data/lib/test_bench/session/controls/events/test_skipped.rb +0 -47
  57. data/lib/test_bench/session/controls/failure.rb +0 -19
  58. data/lib/test_bench/session/controls/fixture.rb +0 -19
  59. data/lib/test_bench/session/controls/output/detail.rb +0 -29
  60. data/lib/test_bench/session/controls/output.rb +0 -55
  61. data/lib/test_bench/session/controls/process_id.rb +0 -7
  62. data/lib/test_bench/session/controls/substitute/path.rb +0 -33
  63. data/lib/test_bench/session/output/get.rb +0 -27
  64. data/lib/test_bench/session/output/writer/buffer/interactive/viewport.rb +0 -165
  65. data/lib/test_bench/session/output/writer/buffer/interactive.rb +0 -139
  66. data/lib/test_bench/session/output/writer/buffer.rb +0 -27
  67. data/lib/test_bench/session/output/writer/defaults.rb +0 -17
  68. data/lib/test_bench/session/output/writer/substitute.rb +0 -17
  69. data/lib/test_bench/session/output/writer.rb +0 -95
  70. data/lib/test_bench/session/output.rb +0 -384
  71. data/lib/test_bench/session/projection.rb +0 -28
  72. data/lib/test_bench/session/store.rb +0 -59
  73. data/lib/test_bench/session/substitute/path.rb +0 -63
@@ -0,0 +1,31 @@
1
+ module TestBench
2
+ class Session
3
+ module Controls
4
+ module Text
5
+ def self.example
6
+ "Some text"
7
+ end
8
+
9
+ module Comment
10
+ def self.example
11
+ "Some comment"
12
+ end
13
+
14
+ def self.other_example
15
+ "Some other comment"
16
+ end
17
+ end
18
+
19
+ module Detail
20
+ def self.example
21
+ "Some detail"
22
+ end
23
+
24
+ def self.other_example
25
+ "Some other detail"
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -2,6 +2,18 @@ module TestBench
2
2
  class Session
3
3
  module Controls
4
4
  module Title
5
+ def self.example
6
+ "Some Title"
7
+ end
8
+
9
+ def self.other_example
10
+ "Some Other Title"
11
+ end
12
+
13
+ def self.random
14
+ "#{example} #{Random.string}"
15
+ end
16
+
5
17
  module Context
6
18
  def self.example
7
19
  "Some Context"
@@ -10,12 +22,6 @@ module TestBench
10
22
  def self.other_example
11
23
  "Some Other Context"
12
24
  end
13
-
14
- def self.random
15
- suffix = Random.string
16
-
17
- "#{example} #{suffix}"
18
- end
19
25
  end
20
26
 
21
27
  module Test
@@ -26,12 +32,6 @@ module TestBench
26
32
  def self.other_example
27
33
  "Some other test"
28
34
  end
29
-
30
- def self.random
31
- suffix = Random.string
32
-
33
- "#{example} #{suffix}"
34
- end
35
35
  end
36
36
  end
37
37
  end
@@ -1,38 +1,43 @@
1
1
  require 'test_bench/telemetry/controls'
2
- require 'test_bench/output/controls'
3
2
 
3
+ require 'test_bench/session/controls/telemetry'
4
+
5
+ require 'test_bench/session/controls/event'
6
+ require 'test_bench/session/controls/metadata'
4
7
  require 'test_bench/session/controls/random'
5
- require 'test_bench/session/controls/time'
6
- require 'test_bench/session/controls/process_id'
7
8
  require 'test_bench/session/controls/result'
9
+ require 'test_bench/session/controls/sequence'
10
+ require 'test_bench/session/controls/status'
11
+ require 'test_bench/session/controls/telemetry_sink'
12
+
13
+ require 'test_bench/session/controls/path'
14
+ require 'test_bench/session/controls/path/apex_directory'
15
+ require 'test_bench/session/controls/path/file'
16
+ require 'test_bench/session/controls/path/file/create'
17
+
18
+ require 'test_bench/session/controls/exception/raise'
8
19
  require 'test_bench/session/controls/exception'
20
+ require 'test_bench/session/controls/exception/message'
21
+
22
+ require 'test_bench/session/controls/backtrace'
23
+ require 'test_bench/session/controls/backtrace/location'
9
24
 
10
- require 'test_bench/session/controls/failure'
25
+ require 'test_bench/session/controls/text'
26
+ require 'test_bench/session/controls/message'
11
27
  require 'test_bench/session/controls/title'
12
- require 'test_bench/session/controls/exception'
13
- require 'test_bench/session/controls/comment'
14
- require 'test_bench/session/controls/detail'
15
- require 'test_bench/session/controls/fixture'
16
28
 
17
- require 'test_bench/session/controls/events/event_data'
29
+ require 'test_bench/session/controls/comment_disposition'
30
+
18
31
  require 'test_bench/session/controls/events/failed'
19
- require 'test_bench/session/controls/events/context_started'
20
- require 'test_bench/session/controls/events/context_finished'
21
- require 'test_bench/session/controls/events/context_skipped'
22
- require 'test_bench/session/controls/events/test_started'
23
- require 'test_bench/session/controls/events/test_finished'
24
- require 'test_bench/session/controls/events/test_skipped'
32
+ require 'test_bench/session/controls/events/aborted'
33
+ require 'test_bench/session/controls/events/skipped'
25
34
  require 'test_bench/session/controls/events/commented'
26
35
  require 'test_bench/session/controls/events/detailed'
27
- require 'test_bench/session/controls/events/fixture_started'
28
- require 'test_bench/session/controls/events/fixture_finished'
36
+ require 'test_bench/session/controls/events/test_started'
37
+ require 'test_bench/session/controls/events/test_finished'
38
+ require 'test_bench/session/controls/events/context_started'
39
+ require 'test_bench/session/controls/events/context_finished'
40
+ require 'test_bench/session/controls/events/file_queued'
41
+ require 'test_bench/session/controls/events/file_executed'
42
+ require 'test_bench/session/controls/events/file_not_found'
29
43
  require 'test_bench/session/controls/events'
30
-
31
- require 'test_bench/session/controls/telemetry_sink'
32
-
33
- require 'test_bench/session/controls/substitute/path'
34
-
35
- require 'test_bench/session/controls/event'
36
-
37
- require 'test_bench/session/controls/output'
38
- require 'test_bench/session/controls/output/detail'
@@ -0,0 +1,15 @@
1
+ module TestBench
2
+ class Session
3
+ module Defaults
4
+ def self.strict
5
+ disabled_value = 'off'
6
+
7
+ env_strict = ENV.fetch('TEST_BENCH_STRICT', disabled_value)
8
+
9
+ disabled = env_strict == disabled_value
10
+
11
+ !disabled
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,25 +1,22 @@
1
1
  module TestBench
2
2
  class Session
3
3
  module Events
4
- def self.each_type(&block)
5
- constants(false).each(&block)
6
- end
4
+ Failed = Telemetry::Event.define(:message)
5
+ Aborted = Telemetry::Event.define(:message, :location)
6
+ Skipped = Telemetry::Event.define(:message)
7
7
 
8
- Failed = TestBench::Telemetry::Event.define(:message)
8
+ Commented = Telemetry::Event.define(:text, :disposition)
9
+ Detailed = Telemetry::Event.define(:text, :disposition)
9
10
 
10
- ContextStarted = TestBench::Telemetry::Event.define(:title)
11
- ContextFinished = TestBench::Telemetry::Event.define(:title, :result)
12
- ContextSkipped = TestBench::Telemetry::Event.define(:title)
11
+ TestStarted = Telemetry::Event.define(:title)
12
+ TestFinished = Telemetry::Event.define(:title, :result)
13
13
 
14
- TestStarted = TestBench::Telemetry::Event.define(:title)
15
- TestFinished = TestBench::Telemetry::Event.define(:title, :result)
16
- TestSkipped = TestBench::Telemetry::Event.define(:title)
14
+ ContextStarted = Telemetry::Event.define(:title)
15
+ ContextFinished = Telemetry::Event.define(:title, :result)
17
16
 
18
- Commented = TestBench::Telemetry::Event.define(:text, :quote, :heading)
19
- Detailed = TestBench::Telemetry::Event.define(:text, :quote, :heading)
20
-
21
- FixtureStarted = TestBench::Telemetry::Event.define(:name)
22
- FixtureFinished = TestBench::Telemetry::Event.define(:name, :result)
17
+ FileQueued = Telemetry::Event.define(:file)
18
+ FileExecuted = Telemetry::Event.define(:file, :result)
19
+ FileNotFound = Telemetry::Event.define(:file)
23
20
  end
24
21
  end
25
22
  end
@@ -0,0 +1,32 @@
1
+ module TestBench
2
+ class Session
3
+ module Exception
4
+ class FormatBacktrace
5
+ module Substitute
6
+ def self.build
7
+ FormatBacktrace.new
8
+ end
9
+
10
+ class FormatBacktrace
11
+ attr_accessor :location
12
+ alias :set_location :location=
13
+
14
+ def exceptions
15
+ @exceptions ||= []
16
+ end
17
+
18
+ def call(exception)
19
+ exceptions << exception
20
+
21
+ location
22
+ end
23
+
24
+ def formatted?(exception)
25
+ exceptions.include?(exception)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,112 @@
1
+ module TestBench
2
+ class Session
3
+ module Exception
4
+ class FormatBacktrace
5
+ def omit_patterns
6
+ @omit_patterns ||= []
7
+ end
8
+ attr_writer :omit_patterns
9
+
10
+ def apex_directory
11
+ @apex_directory ||= ::Dir.pwd
12
+ end
13
+ attr_writer :apex_directory
14
+
15
+ attr_accessor :styling
16
+ alias :styling? :styling
17
+
18
+ def self.build
19
+ instance = new
20
+
21
+ omit_patterns = Defaults.omit_patterns
22
+ instance.omit_patterns = omit_patterns
23
+
24
+ styling = Defaults.styling
25
+ instance.styling = styling
26
+
27
+ instance
28
+ end
29
+
30
+ def self.configure(receiver, attr_name: nil)
31
+ attr_name ||= :format_backtrace
32
+
33
+ instance = build
34
+ receiver.public_send(:"#{attr_name}=", instance)
35
+ end
36
+
37
+ def call(exception)
38
+ if styling?
39
+ omitted_text = "\e[2;3m*omitted*\e[23;22m"
40
+ else
41
+ omitted_text = "*omitted*"
42
+ end
43
+
44
+ backtrace = []
45
+
46
+ original_frame = exception.backtrace_locations.first.to_s
47
+ backtrace << original_frame
48
+
49
+ omitting = false
50
+
51
+ exception.backtrace_locations[1..-1].each do |backtrace_location|
52
+ if omit?(backtrace_location)
53
+ if not omitting
54
+ backtrace << omitted_text
55
+ end
56
+
57
+ omitting = true
58
+ else
59
+ omitting = false
60
+ end
61
+
62
+ if not omitting
63
+ backtrace << backtrace_location.to_s
64
+ end
65
+ end
66
+
67
+ apex_directory_prefix = ::File.join(apex_directory, '')
68
+
69
+ backtrace.each do |backtrace_location_text|
70
+ backtrace_location_text.delete_prefix!(apex_directory_prefix)
71
+ end
72
+
73
+ exception.set_backtrace(backtrace)
74
+
75
+ if exception.cause
76
+ self.(exception.cause)
77
+ end
78
+
79
+ location = exception.backtrace_locations.find do |backtrace_location|
80
+ !omit?(backtrace_location)
81
+ end
82
+
83
+ location ||= exception.backtrace_locations.first
84
+
85
+ location = "#{location.path}:#{location.lineno}"
86
+ location.delete_prefix!(apex_directory_prefix)
87
+ location
88
+ end
89
+
90
+ def omit?(backtrace_location)
91
+ backtrace_path = backtrace_location.path
92
+
93
+ omit_patterns.any? do |omit_pattern|
94
+ ::File.fnmatch?(omit_pattern, backtrace_path, ::File::FNM_EXTGLOB)
95
+ end
96
+ end
97
+
98
+ module Defaults
99
+ def self.omit_patterns
100
+ env_omit_backtrace_pattern = ENV.fetch('TEST_BENCH_OMIT_BACKTRACE_PATTERN', '')
101
+
102
+ env_omit_backtrace_pattern.split(':')
103
+ end
104
+
105
+ def self.styling
106
+ ::Exception.to_tty?
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,43 @@
1
+ module TestBench
2
+ class Session
3
+ class Isolate
4
+ module Substitute
5
+ def self.build
6
+ Isolate.new
7
+ end
8
+
9
+ class Isolate
10
+ def file_paths
11
+ @file_paths ||= []
12
+ end
13
+ attr_writer :file_paths
14
+
15
+ def events
16
+ @events ||= []
17
+ end
18
+ attr_writer :events
19
+ alias :set_events :events=
20
+
21
+ attr_accessor :stopped
22
+ def stopped?
23
+ stopped ? true : false
24
+ end
25
+
26
+ def call(file_path, &block)
27
+ file_paths << file_path
28
+
29
+ events.each(&block)
30
+ end
31
+
32
+ def stop
33
+ self.stopped = true
34
+ end
35
+
36
+ def executed?(file_path)
37
+ file_paths.include?(file_path)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,157 @@
1
+ module TestBench
2
+ class Session
3
+ class Isolate
4
+ def subprocess_sequence
5
+ @subprocess_sequence ||= 0
6
+ end
7
+ attr_writer :subprocess_sequence
8
+
9
+ def apex_directory
10
+ @apex_directory ||= ::Dir.pwd
11
+ end
12
+ attr_writer :apex_directory
13
+
14
+ attr_accessor :subprocess_id
15
+
16
+ attr_accessor :telemetry_reader
17
+ attr_accessor :file_path_writer
18
+
19
+ def self.build(apex_directory: nil)
20
+ instance = new
21
+ instance.apex_directory = apex_directory
22
+ instance
23
+ end
24
+
25
+ def self.configure(receiver, apex_directory: nil, attr_name: nil)
26
+ attr_name ||= :isolate
27
+
28
+ instance = build(apex_directory:)
29
+ receiver.public_send(:"#{attr_name}=", instance)
30
+ end
31
+
32
+ def call(file_path, &probe)
33
+ case status
34
+ when Status.stopping
35
+ stop
36
+ start
37
+ when Status.stopped
38
+ start
39
+ end
40
+
41
+ file_path_writer.puts(file_path)
42
+
43
+ loop do
44
+ event_data_text = telemetry_reader.gets
45
+
46
+ event_data = Telemetry::EventData.load(event_data_text)
47
+
48
+ if Isolated === event_data
49
+ executed_file_path, result = event_data.data
50
+
51
+ if executed_file_path == file_path
52
+ if result == Result.aborted
53
+ stop!
54
+ end
55
+
56
+ break
57
+ else
58
+ next
59
+ end
60
+ end
61
+
62
+ probe.(event_data)
63
+ end
64
+ end
65
+
66
+ def start
67
+ file_path_reader, file_path_writer = IO.pipe
68
+ telemetry_reader, telemetry_writer = IO.pipe
69
+
70
+ subprocess_id = fork do
71
+ file_path_writer.close
72
+ telemetry_reader.close
73
+
74
+ ::Dir.chdir(apex_directory)
75
+
76
+ session = Session.build
77
+
78
+ telemetry_sink = Telemetry::Sink::File.new(telemetry_writer)
79
+ session.register_telemetry_sink(telemetry_sink)
80
+
81
+ Session.establish(session)
82
+
83
+ while file_path = file_path_reader.gets(chomp: true)
84
+ pending_event = Isolated.build(file_path)
85
+
86
+ absolute_file_path = ::File.expand_path(file_path)
87
+
88
+ session.evaluate(pending_event) do
89
+ load(absolute_file_path)
90
+ end
91
+ end
92
+
93
+ ensure
94
+ # Ensure any exception raised by the subprocess is likely to be printed after the session's test output
95
+ one_millisecond = 0.001
96
+ sleep(one_millisecond)
97
+ end
98
+
99
+ telemetry_writer.close
100
+ file_path_reader.close
101
+
102
+ self.subprocess_id = subprocess_id
103
+ self.subprocess_sequence += 1
104
+
105
+ self.telemetry_reader = telemetry_reader
106
+ self.file_path_writer = file_path_writer
107
+
108
+ subprocess_id
109
+ end
110
+
111
+ def stop
112
+ stop!
113
+
114
+ if subprocess_id.nil?
115
+ return nil
116
+ end
117
+
118
+ subprocess_status = ::Process::Status.wait(subprocess_id)
119
+
120
+ self.subprocess_id = nil
121
+
122
+ subprocess_status.exitstatus
123
+ end
124
+
125
+ def stop!
126
+ telemetry_reader&.close
127
+ file_path_writer&.close
128
+ end
129
+
130
+ def status
131
+ if subprocess_id.nil?
132
+ Status.stopped
133
+ elsif telemetry_reader.closed? && file_path_writer.closed?
134
+ Status.stopping
135
+ else
136
+ Status.active
137
+ end
138
+ end
139
+
140
+ Isolated = Telemetry::Event.define(:file, :result)
141
+
142
+ module Status
143
+ def self.active
144
+ :active
145
+ end
146
+
147
+ def self.stopping
148
+ :stopping
149
+ end
150
+
151
+ def self.stopped
152
+ :stopped
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,42 @@
1
+ module TestBench
2
+ class Session
3
+ module Result
4
+ extend self
5
+
6
+ def self.resolve(result, strict: nil)
7
+ if strict.nil?
8
+ strict = Defaults.strict
9
+ end
10
+
11
+ case result
12
+ in "passed"
13
+ true
14
+ in "failed" | "aborted"
15
+ false
16
+ in "none" | "incomplete"
17
+ !strict
18
+ end
19
+ end
20
+
21
+ def passed
22
+ "passed"
23
+ end
24
+
25
+ def failed
26
+ "failed"
27
+ end
28
+
29
+ def none
30
+ "none"
31
+ end
32
+
33
+ def aborted
34
+ "aborted"
35
+ end
36
+
37
+ def incomplete
38
+ "incomplete"
39
+ end
40
+ end
41
+ end
42
+ end