test_bench-telemetry 2.0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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