test_bench-telemetry 2.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.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/lib/test_bench/telemetry/controls/capture_sink/path.rb +30 -0
  3. data/lib/test_bench/telemetry/controls/capture_sink/record.rb +21 -0
  4. data/lib/test_bench/telemetry/controls/comment.rb +19 -0
  5. data/lib/test_bench/telemetry/controls/detail_level.rb +15 -0
  6. data/lib/test_bench/telemetry/controls/error.rb +36 -0
  7. data/lib/test_bench/telemetry/controls/event.rb +77 -0
  8. data/lib/test_bench/telemetry/controls/events/asserted.rb +32 -0
  9. data/lib/test_bench/telemetry/controls/events/commented.rb +26 -0
  10. data/lib/test_bench/telemetry/controls/events/context_entered.rb +31 -0
  11. data/lib/test_bench/telemetry/controls/events/context_exited.rb +34 -0
  12. data/lib/test_bench/telemetry/controls/events/context_skipped.rb +31 -0
  13. data/lib/test_bench/telemetry/controls/events/detail_decreased.rb +23 -0
  14. data/lib/test_bench/telemetry/controls/events/detail_increased.rb +23 -0
  15. data/lib/test_bench/telemetry/controls/events/error_raised.rb +26 -0
  16. data/lib/test_bench/telemetry/controls/events/file_entered.rb +29 -0
  17. data/lib/test_bench/telemetry/controls/events/file_exited.rb +32 -0
  18. data/lib/test_bench/telemetry/controls/events/fixture_finished.rb +29 -0
  19. data/lib/test_bench/telemetry/controls/events/fixture_started.rb +26 -0
  20. data/lib/test_bench/telemetry/controls/events/run_aborted.rb +29 -0
  21. data/lib/test_bench/telemetry/controls/events/run_finished.rb +32 -0
  22. data/lib/test_bench/telemetry/controls/events/run_started.rb +29 -0
  23. data/lib/test_bench/telemetry/controls/events/test_finished.rb +34 -0
  24. data/lib/test_bench/telemetry/controls/events/test_skipped.rb +31 -0
  25. data/lib/test_bench/telemetry/controls/events/test_started.rb +31 -0
  26. data/lib/test_bench/telemetry/controls/events.rb +27 -0
  27. data/lib/test_bench/telemetry/controls/fixture_name.rb +19 -0
  28. data/lib/test_bench/telemetry/controls/handler.rb +76 -0
  29. data/lib/test_bench/telemetry/controls/line_number.rb +10 -0
  30. data/lib/test_bench/telemetry/controls/path.rb +87 -0
  31. data/lib/test_bench/telemetry/controls/random.rb +7 -0
  32. data/lib/test_bench/telemetry/controls/result.rb +12 -0
  33. data/lib/test_bench/telemetry/controls/sink.rb +11 -0
  34. data/lib/test_bench/telemetry/controls/time.rb +76 -0
  35. data/lib/test_bench/telemetry/controls/title.rb +43 -0
  36. data/lib/test_bench/telemetry/controls.rb +40 -0
  37. data/lib/test_bench/telemetry/event/events.rb +35 -0
  38. data/lib/test_bench/telemetry/event/serialization.rb +143 -0
  39. data/lib/test_bench/telemetry/event/type.rb +27 -0
  40. data/lib/test_bench/telemetry/event.rb +41 -0
  41. data/lib/test_bench/telemetry/sink/capture/path.rb +69 -0
  42. data/lib/test_bench/telemetry/sink/capture/record/generate.rb +49 -0
  43. data/lib/test_bench/telemetry/sink/capture/record.rb +73 -0
  44. data/lib/test_bench/telemetry/sink/capture.rb +55 -0
  45. data/lib/test_bench/telemetry/sink/file.rb +31 -0
  46. data/lib/test_bench/telemetry/sink/handler.rb +90 -0
  47. data/lib/test_bench/telemetry/substitute.rb +65 -0
  48. data/lib/test_bench/telemetry/telemetry.rb +68 -0
  49. data/lib/test_bench/telemetry.rb +19 -0
  50. metadata +118 -0
@@ -0,0 +1,34 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Controls
4
+ module Events
5
+ module TestFinished
6
+ def self.example(result: nil, title: nil, time: nil)
7
+ result ||= self.result
8
+ time ||= self.time
9
+
10
+ if title == :none
11
+ title = nil
12
+ else
13
+ title ||= self.title
14
+ end
15
+
16
+ TestBench::Telemetry::Event::TestFinished.new(result, title, time)
17
+ end
18
+
19
+ def self.random
20
+ result = Result.random
21
+ title = Title::Test.random
22
+ time = Time.random
23
+
24
+ example(result:, title:, time:)
25
+ end
26
+
27
+ def self.result = Result.example
28
+ def self.title = Title::Test.example
29
+ def self.time = Time.example
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,31 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Controls
4
+ module Events
5
+ module TestSkipped
6
+ def self.example(title: nil, time: nil)
7
+ time ||= self.time
8
+
9
+ if title == :none
10
+ title = nil
11
+ else
12
+ title ||= self.title
13
+ end
14
+
15
+ TestBench::Telemetry::Event::TestSkipped.new(title, time)
16
+ end
17
+
18
+ def self.random
19
+ title = Title::Test.random
20
+ time = Time.random
21
+
22
+ example(title:, time:)
23
+ end
24
+
25
+ def self.title = Title::Test.example
26
+ def self.time = Time.example
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Controls
4
+ module Events
5
+ module TestStarted
6
+ def self.example(title: nil, time: nil)
7
+ time ||= self.time
8
+
9
+ if title == :none
10
+ title = nil
11
+ else
12
+ title ||= self.title
13
+ end
14
+
15
+ TestBench::Telemetry::Event::TestStarted.new(title, time)
16
+ end
17
+
18
+ def self.random
19
+ title = Title::Test.random
20
+ time = Time.random
21
+
22
+ example(title:, time:)
23
+ end
24
+
25
+ def self.title = Title::Test.example
26
+ def self.time = Time.example
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Controls
4
+ module Events
5
+ def self.each_example(random: nil, &block)
6
+ examples(random:).each(&block)
7
+ end
8
+
9
+ def self.examples(random: nil)
10
+ random ||= false
11
+
12
+ if random
13
+ method_name = :random
14
+ else
15
+ method_name = :example
16
+ end
17
+
18
+ controls = TestBench::Telemetry::Event.each_event_type.map do |event_type|
19
+ const_get(event_type)
20
+ end
21
+
22
+ controls.map(&method_name)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Controls
4
+ module FixtureName
5
+ def self.example(suffix=nil)
6
+ suffix = "_#{suffix}" if not suffix.nil?
7
+
8
+ "SomeProject::Fixtures::SomeFixture#{suffix}"
9
+ end
10
+
11
+ def self.random
12
+ suffix = example(Random.string)
13
+
14
+ example(suffix)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,76 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Controls
4
+ module Handler
5
+ def self.example(&block)
6
+ if block.nil?
7
+ cls = Example
8
+ else
9
+ cls = example_class(&block)
10
+ end
11
+
12
+ cls.new
13
+ end
14
+
15
+ def self.example_class(&block)
16
+ Class.new do
17
+ include TestBench::Telemetry::Sink::Handler
18
+
19
+ if not block.nil?
20
+ class_exec(&block)
21
+ end
22
+ end
23
+ end
24
+
25
+ module Event
26
+ def self.example(data=nil)
27
+ data ||= self.data
28
+
29
+ Controls::Event.example(data)
30
+ end
31
+
32
+ def self.data = 'some-data'
33
+
34
+ def self.other_example
35
+ Controls::Event::OtherExample.new
36
+ end
37
+
38
+ Example = Controls::Event::Example
39
+ OtherExample = Controls::Event::OtherExample
40
+ end
41
+
42
+ module Method
43
+ def self.example(event_type=nil)
44
+ event_type ||= Event::Example.event_type
45
+
46
+ event_type_method_cased = TestBench::Telemetry::Event::Type.method_cased(event_type)
47
+
48
+ :"handle_#{event_type_method_cased}"
49
+ end
50
+
51
+ def self.other_example
52
+ event_type = Event::OtherExample.event_type
53
+
54
+ example(event_type)
55
+ end
56
+ end
57
+
58
+ Example = example_class do
59
+ attr_accessor :data
60
+
61
+ handle Event::Example do |data|
62
+ self.data = data
63
+ end
64
+
65
+ def handled?(data=nil)
66
+ if data.nil?
67
+ !self.data.nil?
68
+ else
69
+ data == self.data
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,10 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Controls
4
+ module LineNumber
5
+ def self.example = 11
6
+ def self.random = Random.integer
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,87 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Controls
4
+ module Path
5
+ def self.example(suffix=nil)
6
+ suffix = "_#{suffix}" if not suffix.nil?
7
+
8
+ "path/to/some_file#{suffix}.rb"
9
+ end
10
+
11
+ module Random
12
+ def random = example(Controls::Random.string)
13
+ end
14
+ extend Random
15
+
16
+ module Temporary
17
+ def self.example(suffix=nil, basename: nil, extension: nil)
18
+ basename ||= self.basename
19
+ extension ||= self.extension
20
+
21
+ suffix = "-#{suffix}" if not suffix.nil?
22
+
23
+ filename = "#{basename}#{suffix}#{extension}"
24
+
25
+ File.join('tmp', filename)
26
+ end
27
+
28
+ def self.random(basename: nil, extension: nil)
29
+ suffix = Controls::Random.string
30
+
31
+ example(suffix, basename:, extension:)
32
+ end
33
+
34
+ def self.basename
35
+ 'some-file'
36
+ end
37
+
38
+ def self.extension
39
+ '.some-ext'
40
+ end
41
+ end
42
+
43
+ module Absolute
44
+ extend Random
45
+
46
+ def self.example(suffix=nil)
47
+ path = Path.example(suffix)
48
+
49
+ File.join('/', path)
50
+ end
51
+
52
+ module Local
53
+ extend Random
54
+
55
+ def self.example(suffix=nil)
56
+ path = Path.example(suffix)
57
+
58
+ File.join(current_dir, path)
59
+ end
60
+
61
+ def self.current_dir
62
+ File.join('/home', 'some-user', 'some-working-dir')
63
+ end
64
+
65
+ module Gem
66
+ extend Random
67
+
68
+ def self.example(path=nil)
69
+ path ||= Path.example
70
+
71
+ path = File.join(gems_path, path)
72
+
73
+ Local.example(path)
74
+ end
75
+
76
+ def self.gems_path
77
+ ruby_version = RbConfig::CONFIG['ruby_version']
78
+
79
+ "gems/ruby/#{ruby_version}/gems"
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,7 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Controls
4
+ Random = TestBench::Random.instance
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Controls
4
+ module Result
5
+ def self.example = pass
6
+ def self.random = Random.boolean
7
+ def self.pass = true
8
+ def self.failure = false
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Controls
4
+ module Sink
5
+ def self.example
6
+ Handler.example
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,76 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Controls
4
+ module Time
5
+ def self.example(offset_milliseconds: nil, offset_nanoseconds: nil)
6
+ if offset_nanoseconds.nil?
7
+ offset_milliseconds ||= 0
8
+ offset_nanoseconds = offset_milliseconds * 1_000_000
9
+ end
10
+
11
+ nanoseconds = 111_111_111
12
+ remaining_offset, additional_nanoseconds = offset_nanoseconds.divmod(1_000_000_000 - nanoseconds)
13
+ nanoseconds += additional_nanoseconds
14
+ microseconds = Rational(nanoseconds, 1_000)
15
+
16
+ if remaining_offset.zero?
17
+ seconds = 11
18
+ else
19
+ remaining_offset, seconds = remaining_offset.divmod(60)
20
+ end
21
+
22
+ if remaining_offset.zero?
23
+ minutes = 11
24
+ else
25
+ remaining_offset, minutes = remaining_offset.divmod(60)
26
+ end
27
+
28
+ if remaining_offset.zero?
29
+ hours = 11
30
+ else
31
+ remaining_offset, hours = remaining_offset.divmod(24)
32
+ end
33
+
34
+ if remaining_offset.zero?
35
+ day = 1
36
+ else
37
+ remaining_offset, day = remaining_offset.divmod(28)
38
+ day += 1
39
+ end
40
+
41
+ if remaining_offset.zero?
42
+ month = 1
43
+ else
44
+ remaining_offset, month = remaining_offset.divmod(12)
45
+ month += 1
46
+ end
47
+
48
+ year = 2000
49
+ if not remaining_offset.zero?
50
+ year += remaining_offset
51
+ end
52
+
53
+ ::Time.utc(year, month, day, hours, minutes, seconds, microseconds)
54
+ end
55
+
56
+ def self.random
57
+ example(offset_nanoseconds: Random.integer)
58
+ end
59
+
60
+ module ISO8601
61
+ def self.example(time=nil, **arguments)
62
+ time ||= Time.example(**arguments)
63
+
64
+ time.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
65
+ end
66
+
67
+ def self.random(...)
68
+ time = Time.random
69
+
70
+ example(time)
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,43 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Controls
4
+ module Title
5
+ def self.example(suffix=nil, text: nil)
6
+ suffix = " #{suffix}" if not suffix.nil?
7
+ text ||= self.text
8
+
9
+ "#{text}#{suffix}"
10
+ end
11
+
12
+ def self.text = "Some Title"
13
+
14
+ module Random
15
+ def random = example(Controls::Random.string)
16
+ end
17
+ extend Random
18
+
19
+ module Test
20
+ extend Random
21
+
22
+ def self.example(suffix=nil)
23
+ Title.example(suffix, text: example_text)
24
+ end
25
+ def self.example_text = "Some test"
26
+
27
+ def self.other_example = "Some other test"
28
+ end
29
+
30
+ module Context
31
+ extend Random
32
+
33
+ def self.example(suffix=nil)
34
+ Title.example(suffix, text: example_text)
35
+ end
36
+ def self.example_text = "Some Context"
37
+
38
+ def self.other_example = "Some Other Context"
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,40 @@
1
+ require 'test_bench/telemetry/controls/random'
2
+ require 'test_bench/telemetry/controls/time'
3
+
4
+ require 'test_bench/telemetry/controls/comment'
5
+ require 'test_bench/telemetry/controls/line_number'
6
+ require 'test_bench/telemetry/controls/path'
7
+ require 'test_bench/telemetry/controls/error'
8
+ require 'test_bench/telemetry/controls/result'
9
+ require 'test_bench/telemetry/controls/title'
10
+ require 'test_bench/telemetry/controls/fixture_name'
11
+ require 'test_bench/telemetry/controls/detail_level'
12
+
13
+ require 'test_bench/telemetry/controls/event'
14
+
15
+ require 'test_bench/telemetry/controls/events'
16
+ require 'test_bench/telemetry/controls/events/asserted'
17
+ require 'test_bench/telemetry/controls/events/error_raised'
18
+ require 'test_bench/telemetry/controls/events/test_started'
19
+ require 'test_bench/telemetry/controls/events/test_finished'
20
+ require 'test_bench/telemetry/controls/events/test_skipped'
21
+ require 'test_bench/telemetry/controls/events/context_entered'
22
+ require 'test_bench/telemetry/controls/events/context_exited'
23
+ require 'test_bench/telemetry/controls/events/context_skipped'
24
+ require 'test_bench/telemetry/controls/events/commented'
25
+ require 'test_bench/telemetry/controls/events/detail_increased'
26
+ require 'test_bench/telemetry/controls/events/detail_decreased'
27
+ require 'test_bench/telemetry/controls/events/run_started'
28
+ require 'test_bench/telemetry/controls/events/run_finished'
29
+ require 'test_bench/telemetry/controls/events/run_aborted'
30
+ require 'test_bench/telemetry/controls/events/file_entered'
31
+ require 'test_bench/telemetry/controls/events/file_exited'
32
+ require 'test_bench/telemetry/controls/events/fixture_started'
33
+ require 'test_bench/telemetry/controls/events/fixture_finished'
34
+
35
+ require 'test_bench/telemetry/controls/handler'
36
+
37
+ require 'test_bench/telemetry/controls/capture_sink/path'
38
+ require 'test_bench/telemetry/controls/capture_sink/record'
39
+
40
+ require 'test_bench/telemetry/controls/sink'
@@ -0,0 +1,35 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Event
4
+ module Events
5
+ Asserted = Event.define(:result, :path, :line_number)
6
+
7
+ ErrorRaised = Event.define(:error_text)
8
+
9
+ TestStarted = Event.define(:title)
10
+ TestFinished = Event.define(:result, :title)
11
+ TestSkipped = Event.define(:title)
12
+
13
+ ContextEntered = Event.define(:title)
14
+ ContextExited = Event.define(:result, :title)
15
+ ContextSkipped = Event.define(:title)
16
+
17
+ Commented = Event.define(:comment)
18
+
19
+ DetailIncreased = Event.define
20
+ DetailDecreased = Event.define
21
+
22
+ RunStarted = Event.define(:random_seed, :executors)
23
+ RunFinished = Event.define(:result, :random_seed, :executors)
24
+ RunAborted = Event.define(:random_seed, :executors)
25
+
26
+ FileEntered = Event.define(:path, :executor)
27
+ FileExited = Event.define(:result, :path, :executor)
28
+
29
+ FixtureStarted = Event.define(:name)
30
+ FixtureFinished = Event.define(:result, :name)
31
+ end
32
+ include Events
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,143 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Event
4
+ module Serialization
5
+ Error = Class.new(RuntimeError)
6
+
7
+ def self.dump(event)
8
+ event_type = event.event_type.to_s
9
+
10
+ data = String.new(encoding: 'BINARY')
11
+
12
+ data << event_type
13
+
14
+ event.values.each do |value|
15
+ data << "\t"
16
+ data << dump_value(value)
17
+ end
18
+
19
+ data << "\r\n"
20
+ data
21
+ end
22
+
23
+ def self.dump_value(value)
24
+ case value
25
+ when NilClass
26
+ ''
27
+ when Time
28
+ value.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
29
+ when String
30
+ value.dump
31
+ when Integer
32
+ value.to_s
33
+ when TrueClass, FalseClass
34
+ value.to_s
35
+ end
36
+ end
37
+
38
+ def self.load(data, event_namespace)
39
+ match_data = Pattern.match(data)
40
+ if match_data.nil?
41
+ raise Error, "Cannot deserialize #{data.inspect}"
42
+ end
43
+
44
+ event_type = match_data['event_type'].to_sym
45
+ if not event_namespace.const_defined?(event_type, false)
46
+ raise Error, "Unknown event type #{event_type.inspect}"
47
+ end
48
+
49
+ values = match_data['values'].split("\t").map do |value_data|
50
+ load_value(value_data)
51
+ end
52
+
53
+ event_class = event_namespace.const_get(event_type, false)
54
+ event_class.new(*values)
55
+ end
56
+
57
+ def self.load_value(value_data)
58
+ match_data = Pattern.match_value(value_data)
59
+
60
+ if match_data['nil']
61
+ nil
62
+ elsif match_data['time']
63
+ year = match_data['year'].to_i
64
+ month = match_data['month'].to_i
65
+ day = match_data['day'].to_i
66
+ hour = match_data['hour'].to_i
67
+ minute = match_data['minute'].to_i
68
+ second = match_data['second'].to_i
69
+
70
+ nanosecond = match_data['nanosecond'].to_i
71
+ usec = Rational(nanosecond, 1_000)
72
+
73
+ Time.utc(year, month, day, hour, minute, second, usec)
74
+ elsif match_data['string']
75
+ value_data.undump
76
+ elsif match_data['integer']
77
+ Integer(value_data)
78
+ elsif match_data['true']
79
+ true
80
+ elsif match_data['false']
81
+ false
82
+ end
83
+ end
84
+
85
+ module Pattern
86
+ def self.match(data)
87
+ event.match(data)
88
+ end
89
+
90
+ def self.match_value(value_data)
91
+ pattern = %r{\A#{value}\z}
92
+
93
+ pattern.match(value_data)
94
+ end
95
+
96
+ def self.event
97
+ %r{\A#{event_type}\t#{values}\r\n\z}
98
+ end
99
+
100
+ def self.event_type
101
+ %r{(?<event_type>[A-Z][[:alpha:]]+)}
102
+ end
103
+
104
+ def self.values
105
+ %r{(?<values>#{value}(?:\t#{value})*)}
106
+ end
107
+
108
+ def self.value
109
+ %r{#{self.nil}|#{time}|#{string}|#{integer}|#{boolean}}
110
+ end
111
+
112
+ def self.nil
113
+ %r{(?<nil>(?=[\n\t])?)}
114
+ end
115
+
116
+ def self.time
117
+ year = %r{(?<year>[[:digit:]]{4})}
118
+ month = %r{(?<month>[[:digit:]]{2})}
119
+ day = %r{(?<day>[[:digit:]]{2})}
120
+ hour = %r{(?<hour>[[:digit:]]{2})}
121
+ minute = %r{(?<minute>[[:digit:]]{2})}
122
+ second = %r{(?<second>[[:digit:]]{2})}
123
+ nanosecond = %r{(?<nanosecond>[[:digit:]]{9})}
124
+
125
+ %r{(?<time>#{year}-#{month}-#{day}T#{hour}:#{minute}:#{second}\.#{nanosecond}Z)}
126
+ end
127
+
128
+ def self.string
129
+ %r{(?<string>".*")}
130
+ end
131
+
132
+ def self.integer
133
+ %r{(?<integer>[[:digit:]]+)}
134
+ end
135
+
136
+ def self.boolean
137
+ %r{(?<true>true)|(?<false>false)}
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end