datadog-ci 0.5.0 → 0.6.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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -2
  3. data/lib/datadog/ci/configuration/components.rb +13 -9
  4. data/lib/datadog/ci/configuration/extensions.rb +21 -0
  5. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +1 -1
  6. data/lib/datadog/ci/contrib/cucumber/ext.rb +7 -5
  7. data/lib/datadog/ci/contrib/cucumber/formatter.rb +99 -19
  8. data/lib/datadog/ci/contrib/minitest/configuration/settings.rb +1 -1
  9. data/lib/datadog/ci/contrib/minitest/ext.rb +6 -4
  10. data/lib/datadog/ci/contrib/minitest/helpers.rb +22 -0
  11. data/lib/datadog/ci/contrib/minitest/hooks.rb +45 -17
  12. data/lib/datadog/ci/contrib/minitest/patcher.rb +7 -0
  13. data/lib/datadog/ci/contrib/minitest/plugin.rb +73 -0
  14. data/lib/datadog/ci/contrib/minitest/runnable.rb +42 -0
  15. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +1 -1
  16. data/lib/datadog/ci/contrib/rspec/example.rb +2 -2
  17. data/lib/datadog/ci/contrib/rspec/example_group.rb +46 -0
  18. data/lib/datadog/ci/contrib/rspec/ext.rb +5 -4
  19. data/lib/datadog/ci/contrib/rspec/integration.rb +1 -1
  20. data/lib/datadog/ci/contrib/rspec/patcher.rb +5 -0
  21. data/lib/datadog/ci/contrib/rspec/runner.rb +57 -0
  22. data/lib/datadog/ci/contrib/settings.rb +1 -1
  23. data/lib/datadog/ci/ext/test.rb +2 -0
  24. data/lib/datadog/ci/span.rb +24 -0
  25. data/lib/datadog/ci/test.rb +30 -0
  26. data/lib/datadog/ci/test_session.rb +8 -0
  27. data/lib/datadog/ci/test_visibility/context/global.rb +82 -0
  28. data/lib/datadog/ci/test_visibility/context/local.rb +52 -0
  29. data/lib/datadog/ci/test_visibility/null_recorder.rb +73 -0
  30. data/lib/datadog/ci/test_visibility/recorder.rb +314 -0
  31. data/lib/datadog/ci/version.rb +1 -1
  32. data/lib/datadog/ci.rb +3 -3
  33. data/sig/datadog/ci/configuration/components.rbs +2 -2
  34. data/sig/datadog/ci/configuration/extensions.rbs +9 -0
  35. data/sig/datadog/ci/contrib/cucumber/ext.rbs +1 -5
  36. data/sig/datadog/ci/contrib/cucumber/formatter.rbs +17 -4
  37. data/sig/datadog/ci/contrib/minitest/ext.rbs +1 -5
  38. data/sig/datadog/ci/contrib/minitest/helpers.rbs +13 -0
  39. data/sig/datadog/ci/contrib/minitest/hooks.rbs +9 -1
  40. data/sig/datadog/ci/contrib/minitest/plugin.rbs +31 -0
  41. data/sig/datadog/ci/contrib/minitest/runnable.rbs +24 -0
  42. data/sig/datadog/ci/contrib/rspec/example_group.rbs +21 -0
  43. data/sig/datadog/ci/contrib/rspec/ext.rbs +2 -8
  44. data/sig/datadog/ci/contrib/rspec/runner.rbs +21 -0
  45. data/sig/datadog/ci/ext/test.rbs +2 -0
  46. data/sig/datadog/ci/span.rbs +8 -0
  47. data/sig/datadog/ci/test.rbs +5 -0
  48. data/sig/datadog/ci/test_visibility/context/global.rbs +39 -0
  49. data/sig/datadog/ci/test_visibility/context/local.rbs +23 -0
  50. data/sig/datadog/ci/test_visibility/null_recorder.rbs +45 -0
  51. data/sig/datadog/ci/test_visibility/recorder.rbs +85 -0
  52. data/sig/datadog/ci.rbs +3 -1
  53. metadata +23 -11
  54. data/lib/datadog/ci/context/global.rb +0 -80
  55. data/lib/datadog/ci/context/local.rb +0 -50
  56. data/lib/datadog/ci/extensions.rb +0 -19
  57. data/lib/datadog/ci/recorder.rb +0 -291
  58. data/sig/datadog/ci/context/global.rbs +0 -37
  59. data/sig/datadog/ci/context/local.rbs +0 -21
  60. data/sig/datadog/ci/extensions.rbs +0 -7
  61. data/sig/datadog/ci/recorder.rbs +0 -83
@@ -0,0 +1,314 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "datadog/tracing"
4
+ require "datadog/tracing/trace_digest"
5
+
6
+ require "rbconfig"
7
+
8
+ require_relative "context/global"
9
+ require_relative "context/local"
10
+
11
+ require_relative "../ext/app_types"
12
+ require_relative "../ext/test"
13
+ require_relative "../ext/environment"
14
+
15
+ require_relative "../span"
16
+ require_relative "../null_span"
17
+ require_relative "../test"
18
+ require_relative "../test_session"
19
+ require_relative "../test_module"
20
+ require_relative "../test_suite"
21
+
22
+ module Datadog
23
+ module CI
24
+ module TestVisibility
25
+ # Common behavior for CI tests
26
+ # Note: this class has too many responsibilities and should be split into multiple classes
27
+ class Recorder
28
+ attr_reader :environment_tags, :test_suite_level_visibility_enabled
29
+
30
+ def initialize(test_suite_level_visibility_enabled: false)
31
+ @test_suite_level_visibility_enabled = test_suite_level_visibility_enabled
32
+
33
+ @environment_tags = Ext::Environment.tags(ENV).freeze
34
+ @local_context = Context::Local.new
35
+ @global_context = Context::Global.new
36
+ end
37
+
38
+ def start_test_session(service: nil, tags: {})
39
+ return skip_tracing unless test_suite_level_visibility_enabled
40
+
41
+ @global_context.fetch_or_activate_test_session do
42
+ tracer_span = start_datadog_tracer_span(
43
+ "test.session", build_span_options(service, Ext::AppTypes::TYPE_TEST_SESSION)
44
+ )
45
+ set_session_context(tags, tracer_span)
46
+
47
+ build_test_session(tracer_span, tags)
48
+ end
49
+ end
50
+
51
+ def start_test_module(test_module_name, service: nil, tags: {})
52
+ return skip_tracing unless test_suite_level_visibility_enabled
53
+
54
+ @global_context.fetch_or_activate_test_module do
55
+ set_inherited_globals(tags)
56
+ set_session_context(tags)
57
+
58
+ tracer_span = start_datadog_tracer_span(
59
+ test_module_name, build_span_options(service, Ext::AppTypes::TYPE_TEST_MODULE)
60
+ )
61
+ set_module_context(tags, tracer_span)
62
+
63
+ build_test_module(tracer_span, tags)
64
+ end
65
+ end
66
+
67
+ def start_test_suite(test_suite_name, service: nil, tags: {})
68
+ return skip_tracing unless test_suite_level_visibility_enabled
69
+
70
+ @global_context.fetch_or_activate_test_suite(test_suite_name) do
71
+ set_inherited_globals(tags)
72
+ set_session_context(tags)
73
+ set_module_context(tags)
74
+
75
+ tracer_span = start_datadog_tracer_span(
76
+ test_suite_name, build_span_options(service, Ext::AppTypes::TYPE_TEST_SUITE)
77
+ )
78
+ set_suite_context(tags, span: tracer_span)
79
+
80
+ build_test_suite(tracer_span, tags)
81
+ end
82
+ end
83
+
84
+ def trace_test(test_name, test_suite_name, service: nil, tags: {}, &block)
85
+ set_inherited_globals(tags)
86
+ set_session_context(tags)
87
+ set_module_context(tags)
88
+ set_suite_context(tags, name: test_suite_name)
89
+
90
+ tags[Ext::Test::TAG_NAME] = test_name
91
+
92
+ span_options = build_span_options(
93
+ service,
94
+ Ext::AppTypes::TYPE_TEST,
95
+ # :resource is needed for the agent APM protocol to work correctly (for older agent versions)
96
+ # :continue_from is required to start a new trace for each test
97
+ {resource: test_name, continue_from: Datadog::Tracing::TraceDigest.new}
98
+ )
99
+
100
+ if block
101
+ start_datadog_tracer_span(test_name, span_options) do |tracer_span|
102
+ test = build_test(tracer_span, tags)
103
+
104
+ @local_context.activate_test!(test) do
105
+ block.call(test)
106
+ end
107
+ end
108
+ else
109
+ tracer_span = start_datadog_tracer_span(test_name, span_options)
110
+
111
+ test = build_test(tracer_span, tags)
112
+ @local_context.activate_test!(test)
113
+ test
114
+ end
115
+ end
116
+
117
+ def trace(span_type, span_name, tags: {}, &block)
118
+ span_options = build_span_options(
119
+ nil, # service name is completely optional for custom spans
120
+ span_type,
121
+ {resource: span_name}
122
+ )
123
+
124
+ if block
125
+ start_datadog_tracer_span(span_name, span_options) do |tracer_span|
126
+ block.call(build_span(tracer_span, tags))
127
+ end
128
+ else
129
+ tracer_span = start_datadog_tracer_span(span_name, span_options)
130
+
131
+ build_span(tracer_span, tags)
132
+ end
133
+ end
134
+
135
+ def active_span
136
+ tracer_span = Datadog::Tracing.active_span
137
+ Span.new(tracer_span) if tracer_span
138
+ end
139
+
140
+ def active_test
141
+ @local_context.active_test
142
+ end
143
+
144
+ def active_test_session
145
+ @global_context.active_test_session
146
+ end
147
+
148
+ def active_test_module
149
+ @global_context.active_test_module
150
+ end
151
+
152
+ def active_test_suite(test_suite_name)
153
+ @global_context.active_test_suite(test_suite_name)
154
+ end
155
+
156
+ def deactivate_test(test)
157
+ @local_context.deactivate_test!(test)
158
+ end
159
+
160
+ def deactivate_test_session
161
+ @global_context.deactivate_test_session!
162
+ end
163
+
164
+ def deactivate_test_module
165
+ @global_context.deactivate_test_module!
166
+ end
167
+
168
+ def deactivate_test_suite(test_suite_name)
169
+ @global_context.deactivate_test_suite!(test_suite_name)
170
+ end
171
+
172
+ private
173
+
174
+ def skip_tracing(block = nil)
175
+ if block
176
+ block.call(null_span)
177
+ else
178
+ null_span
179
+ end
180
+ end
181
+
182
+ # Sets trace's origin to ciapp-test
183
+ def set_trace_origin(trace)
184
+ trace.origin = Ext::Test::CONTEXT_ORIGIN if trace
185
+ end
186
+
187
+ def build_test_session(tracer_span, tags)
188
+ test_session = TestSession.new(tracer_span)
189
+ set_initial_tags(test_session, tags)
190
+ test_session
191
+ end
192
+
193
+ def build_test_module(tracer_span, tags)
194
+ test_module = TestModule.new(tracer_span)
195
+ set_initial_tags(test_module, tags)
196
+ test_module
197
+ end
198
+
199
+ def build_test_suite(tracer_span, tags)
200
+ test_suite = TestSuite.new(tracer_span)
201
+ set_initial_tags(test_suite, tags)
202
+ test_suite
203
+ end
204
+
205
+ def build_test(tracer_span, tags)
206
+ test = Test.new(tracer_span)
207
+ set_initial_tags(test, tags)
208
+ validate_test_suite_level_visibility_correctness(test)
209
+ test
210
+ end
211
+
212
+ def build_span(tracer_span, tags)
213
+ span = Span.new(tracer_span)
214
+ set_initial_tags(span, tags)
215
+ span
216
+ end
217
+
218
+ def build_span_options(service, span_type, other_options = {})
219
+ other_options[:service] = service || @global_context.service
220
+ other_options[:span_type] = span_type
221
+
222
+ other_options
223
+ end
224
+
225
+ def set_inherited_globals(tags)
226
+ # this code achieves the same as @global_context.inheritable_session_tags.merge(tags)
227
+ # but without allocating a new hash
228
+ @global_context.inheritable_session_tags.each do |key, value|
229
+ tags[key] = value unless tags.key?(key)
230
+ end
231
+ end
232
+
233
+ def set_initial_tags(ci_span, tags)
234
+ ci_span.set_default_tags
235
+ ci_span.set_environment_runtime_tags
236
+
237
+ ci_span.set_tags(tags)
238
+ ci_span.set_tags(environment_tags)
239
+ end
240
+
241
+ def set_session_context(tags, test_session = nil)
242
+ test_session ||= active_test_session
243
+ tags[Ext::Test::TAG_TEST_SESSION_ID] = test_session.id.to_s if test_session
244
+ end
245
+
246
+ def set_module_context(tags, test_module = nil)
247
+ test_module ||= active_test_module
248
+ if test_module
249
+ tags[Ext::Test::TAG_TEST_MODULE_ID] = test_module.id.to_s
250
+ tags[Ext::Test::TAG_MODULE] = test_module.name
251
+ end
252
+ end
253
+
254
+ def set_suite_context(tags, span: nil, name: nil)
255
+ return if span.nil? && name.nil?
256
+
257
+ test_suite = span || active_test_suite(name)
258
+
259
+ if test_suite
260
+ tags[Ext::Test::TAG_TEST_SUITE_ID] = test_suite.id.to_s
261
+ tags[Ext::Test::TAG_SUITE] = test_suite.name
262
+ else
263
+ tags[Ext::Test::TAG_SUITE] = name
264
+ end
265
+ end
266
+
267
+ def start_datadog_tracer_span(span_name, span_options, &block)
268
+ if block
269
+ Datadog::Tracing.trace(span_name, **span_options) do |tracer_span, trace|
270
+ set_trace_origin(trace)
271
+
272
+ yield tracer_span
273
+ end
274
+ else
275
+ tracer_span = Datadog::Tracing.trace(span_name, **span_options)
276
+ trace = Datadog::Tracing.active_trace
277
+ set_trace_origin(trace)
278
+
279
+ tracer_span
280
+ end
281
+ end
282
+
283
+ def null_span
284
+ @null_span ||= NullSpan.new
285
+ end
286
+
287
+ def validate_test_suite_level_visibility_correctness(test)
288
+ return unless test_suite_level_visibility_enabled
289
+
290
+ if test.test_suite_id.nil?
291
+ Datadog.logger.debug do
292
+ "Test [#{test.name}] does not have a test suite associated with it. " \
293
+ "Expected test suite [#{test.test_suite_name}] to be running."
294
+ end
295
+ end
296
+
297
+ if test.test_module_id.nil?
298
+ Datadog.logger.debug do
299
+ "Test [#{test.name}] does not have a test module associated with it. " \
300
+ "Make sure that there is a test module running within a session."
301
+ end
302
+ end
303
+
304
+ if test.test_session_id.nil?
305
+ Datadog.logger.debug do
306
+ "Test [#{test.name}] does not have a test session associated with it. " \
307
+ "Make sure that there is a test session running."
308
+ end
309
+ end
310
+ end
311
+ end
312
+ end
313
+ end
314
+ end
@@ -4,7 +4,7 @@ module Datadog
4
4
  module CI
5
5
  module VERSION
6
6
  MAJOR = "0"
7
- MINOR = "5"
7
+ MINOR = "6"
8
8
  PATCH = "0"
9
9
  PRE = nil
10
10
  BUILD = nil
data/lib/datadog/ci.rb CHANGED
@@ -389,6 +389,6 @@ require_relative "ci/contrib/cucumber/integration"
389
389
  require_relative "ci/contrib/rspec/integration"
390
390
  require_relative "ci/contrib/minitest/integration"
391
391
 
392
- # Extensions
393
- require_relative "ci/extensions"
394
- Datadog::CI::Extensions.activate!
392
+ # Configuration extensions
393
+ require_relative "ci/configuration/extensions"
394
+ Datadog::CI::Configuration::Extensions.activate!
@@ -2,9 +2,9 @@ module Datadog
2
2
  module CI
3
3
  module Configuration
4
4
  module Components : Datadog::Core::Configuration::Components
5
- @ci_recorder: Datadog::CI::Recorder
5
+ @ci_recorder: Datadog::CI::TestVisibility::Recorder
6
6
 
7
- attr_reader ci_recorder: Datadog::CI::Recorder
7
+ attr_reader ci_recorder: Datadog::CI::TestVisibility::Recorder
8
8
 
9
9
  def initialize: (untyped settings) -> void
10
10
 
@@ -0,0 +1,9 @@
1
+ module Datadog
2
+ module CI
3
+ module Configuration
4
+ module Extensions
5
+ def self.activate!: () -> untyped
6
+ end
7
+ end
8
+ end
9
+ end
@@ -3,8 +3,6 @@ module Datadog
3
3
  module Contrib
4
4
  module Cucumber
5
5
  module Ext
6
- APP: String
7
-
8
6
  ENV_ENABLED: String
9
7
 
10
8
  ENV_OPERATION_NAME: String
@@ -13,11 +11,9 @@ module Datadog
13
11
 
14
12
  OPERATION_NAME: String
15
13
 
16
- SERVICE_NAME: String
14
+ DEFAULT_SERVICE_NAME: String
17
15
 
18
16
  STEP_SPAN_TYPE: String
19
-
20
- TEST_TYPE: String
21
17
  end
22
18
  end
23
19
  end
@@ -4,19 +4,22 @@ module Datadog
4
4
  module Cucumber
5
5
  class Formatter
6
6
  private
7
+ @failed_tests_count: Integer
8
+ @current_test_suite: Datadog::CI::Span?
9
+ @failed_tests_in_current_test_suite: Integer
7
10
 
8
11
  attr_reader config: untyped
9
12
 
10
- attr_reader current_feature_span: untyped
11
-
12
- attr_reader current_step_span: untyped
13
-
14
13
  public
15
14
 
16
15
  def initialize: (untyped config) -> void
17
16
 
18
17
  def bind_events: (untyped config) -> untyped
19
18
 
19
+ def on_test_run_started: (untyped event) -> untyped
20
+
21
+ def on_test_run_finished: (untyped event) -> untyped
22
+
20
23
  def on_test_case_started: (untyped event) -> untyped
21
24
 
22
25
  def on_test_case_finished: (untyped event) -> (nil | untyped)
@@ -27,6 +30,16 @@ module Datadog
27
30
 
28
31
  private
29
32
 
33
+ def start_test_suite: (String test_suite_name) -> void
34
+
35
+ def finish_current_test_suite: () -> void
36
+
37
+ def same_test_suite_as_current?: (String test_suite_name) -> bool
38
+
39
+ def finish_session: (bool result) -> void
40
+
41
+ def finish_test: (Datadog::CI::Span test, Cucumber::Core::Test::Result result) -> void
42
+
30
43
  def configuration: () -> untyped
31
44
  end
32
45
  end
@@ -3,8 +3,6 @@ module Datadog
3
3
  module Contrib
4
4
  module Minitest
5
5
  module Ext
6
- APP: String
7
-
8
6
  ENV_ENABLED: String
9
7
 
10
8
  ENV_OPERATION_NAME: String
@@ -13,9 +11,7 @@ module Datadog
13
11
 
14
12
  OPERATION_NAME: String
15
13
 
16
- SERVICE_NAME: String
17
-
18
- TEST_TYPE: String
14
+ DEFAULT_SERVICE_NAME: String
19
15
  end
20
16
  end
21
17
  end
@@ -0,0 +1,13 @@
1
+ module Datadog
2
+ module CI
3
+ module Contrib
4
+ module Minitest
5
+ module Helpers
6
+ def self.test_suite_name: (untyped klass, String? method_name) -> ::String
7
+
8
+ def self.parallel?: (untyped klass) -> bool
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -11,7 +11,15 @@ module Datadog
11
11
 
12
12
  private
13
13
 
14
- def configuration: () -> untyped
14
+ def datadog_configuration: () -> untyped
15
+
16
+ def finish_test: (Datadog::CI::Test test_span, String result_code) -> void
17
+
18
+ def finish_test_suite: (Datadog::CI::TestSuite? test_suite, String result_code) -> void
19
+
20
+ def finish_with_result: (Datadog::CI::Span span, String result_code) -> void
21
+
22
+ def self.test_order: () -> (nil | :parallel | :sorted | :random | :alpha)
15
23
  end
16
24
  end
17
25
  end
@@ -0,0 +1,31 @@
1
+ module Datadog
2
+ module CI
3
+ module Contrib
4
+ module Minitest
5
+ module Plugin
6
+ def self.included: (untyped base) -> untyped
7
+
8
+ class DatadogReporter < ::Minitest::AbstractReporter
9
+ @reporter: WeakRef
10
+
11
+ def initialize: (Minitest::AbstractReporter reporter) -> void
12
+ end
13
+
14
+ module ClassMethods
15
+ def plugin_datadog_ci_init: (*untyped) -> (nil | untyped)
16
+
17
+ def initialize: (untyped reporter) -> void
18
+
19
+ def report: () -> (nil | untyped)
20
+
21
+ def reporter: () -> Minitest::CompositeReporter
22
+
23
+ private
24
+
25
+ def datadog_configuration: () -> untyped
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,24 @@
1
+ module Datadog
2
+ module CI
3
+ module Contrib
4
+ module Minitest
5
+ module Runnable
6
+ def self.included: (untyped base) -> untyped
7
+
8
+ module ClassMethods : ::Minitest::Runnable
9
+
10
+ def run: (*untyped) -> untyped
11
+
12
+ private
13
+
14
+ def datadog_configuration: () -> untyped
15
+
16
+ def test_order: () -> (nil | :parallel | :random | :sorted | :alpha)
17
+
18
+ def runnable_methods: () -> Array[String]
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ module Datadog
2
+ module CI
3
+ module Contrib
4
+ module RSpec
5
+ module ExampleGroup
6
+ def self.included: (untyped base) -> untyped
7
+
8
+ module ClassMethods
9
+ include ::RSpec::Core::ExampleGroup::ClassMethods
10
+
11
+ def run: (?untyped reporter) -> untyped
12
+
13
+ private
14
+
15
+ def configuration: () -> untyped
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -3,19 +3,13 @@ module Datadog
3
3
  module Contrib
4
4
  module RSpec
5
5
  module Ext
6
- APP: String
7
-
8
6
  ENV_ENABLED: String
9
7
 
10
- ENV_OPERATION_NAME: String
11
-
12
8
  FRAMEWORK: String
9
+ DEFAULT_SERVICE_NAME: String
13
10
 
14
11
  OPERATION_NAME: String
15
-
16
- SERVICE_NAME: String
17
-
18
- TEST_TYPE: String
12
+ ENV_OPERATION_NAME: String
19
13
  end
20
14
  end
21
15
  end
@@ -0,0 +1,21 @@
1
+ module Datadog
2
+ module CI
3
+ module Contrib
4
+ module RSpec
5
+ module Runner
6
+ def self.included: (untyped base) -> untyped
7
+
8
+ module InstanceMethods
9
+ include ::RSpec::Core::Runner
10
+
11
+ def run_specs: (untyped example_groups) -> untyped
12
+
13
+ private
14
+
15
+ def configuration: () -> untyped
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -32,6 +32,8 @@ module Datadog
32
32
 
33
33
  TAG_TEST_SUITE_ID: String
34
34
 
35
+ TEST_TYPE: String
36
+
35
37
  SPECIAL_TAGS: Array[String]
36
38
 
37
39
  INHERITABLE_TAGS: Array[String]
@@ -13,6 +13,14 @@ module Datadog
13
13
 
14
14
  def service: () -> String
15
15
 
16
+ def undefined?: () -> bool
17
+
18
+ def passed?: () -> bool
19
+
20
+ def failed?: () -> bool
21
+
22
+ def skipped?: () -> bool
23
+
16
24
  def passed!: () -> void
17
25
 
18
26
  def failed!: (?exception: untyped?) -> void
@@ -2,6 +2,11 @@ module Datadog
2
2
  module CI
3
3
  class Test < Span
4
4
  def finish: () -> void
5
+ def test_suite: () -> Datadog::CI::TestSuite?
6
+ def test_suite_id: () -> String?
7
+ def test_suite_name: () -> String?
8
+ def test_module_id: () -> String?
9
+ def test_session_id: () -> String?
5
10
  end
6
11
  end
7
12
  end
@@ -0,0 +1,39 @@
1
+ module Datadog
2
+ module CI
3
+ module TestVisibility
4
+ module Context
5
+ class Global
6
+ @mutex: Thread::Mutex
7
+
8
+ @test_session: Datadog::CI::TestSession?
9
+ @test_module: Datadog::CI::TestModule?
10
+ @test_suites: Hash[String, Datadog::CI::TestSuite]
11
+
12
+ def initialize: () -> void
13
+
14
+ def fetch_or_activate_test_suite: (String test_suite_name) {() -> Datadog::CI::TestSuite} -> Datadog::CI::TestSuite
15
+
16
+ def fetch_or_activate_test_module: () {() -> Datadog::CI::TestModule} -> Datadog::CI::TestModule
17
+
18
+ def fetch_or_activate_test_session: () {() -> Datadog::CI::TestSession} -> Datadog::CI::TestSession
19
+
20
+ def active_test_session: () -> Datadog::CI::TestSession?
21
+
22
+ def active_test_suite: (String test_suite_name) -> Datadog::CI::TestSuite?
23
+
24
+ def service: () -> String?
25
+
26
+ def inheritable_session_tags: () -> Hash[untyped, untyped]
27
+
28
+ def active_test_module: () -> Datadog::CI::TestModule?
29
+
30
+ def deactivate_test_session!: () -> void
31
+
32
+ def deactivate_test_module!: () -> void
33
+
34
+ def deactivate_test_suite!: (String test_suite_name) -> void
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end