From bfd4f642214c3e7f58d12669ebf138e41d8a31d8 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 30 Jul 2024 12:37:10 +0200 Subject: [PATCH 01/10] TestOptimisation ignores remote ITR config if disabled locally --- lib/datadog/ci/test_optimisation/component.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/datadog/ci/test_optimisation/component.rb b/lib/datadog/ci/test_optimisation/component.rb index b455f828..ddacb292 100644 --- a/lib/datadog/ci/test_optimisation/component.rb +++ b/lib/datadog/ci/test_optimisation/component.rb @@ -66,6 +66,8 @@ def initialize( end def configure(remote_configuration, test_session:, git_tree_upload_worker:) + return unless enabled? + Datadog.logger.debug("Configuring TestOptimisation with remote configuration: #{remote_configuration}") @enabled = Utils::Parsing.convert_to_bool( From 690d5bff3817b9effcddae37e54a8157a494f762 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 30 Jul 2024 13:06:08 +0200 Subject: [PATCH 02/10] remove test_optimisation parameter from TestVisibility::Component's cconstructor --- lib/datadog/ci/configuration/components.rb | 1 - lib/datadog/ci/test_visibility/component.rb | 20 ++++++++++--------- sig/datadog/ci/test_visibility/component.rbs | 5 +++-- .../ci/configuration/components_spec.rb | 11 +++++++--- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/lib/datadog/ci/configuration/components.rb b/lib/datadog/ci/configuration/components.rb index f587930a..40175ea2 100644 --- a/lib/datadog/ci/configuration/components.rb +++ b/lib/datadog/ci/configuration/components.rb @@ -106,7 +106,6 @@ def activate_ci!(settings) @test_optimisation = build_test_optimisation(settings, test_visibility_api) @test_visibility = TestVisibility::Component.new( - test_optimisation: @test_optimisation, test_suite_level_visibility_enabled: !settings.ci.force_test_level_visibility, remote_settings_api: build_remote_settings_client(settings, test_visibility_api), git_tree_upload_worker: build_git_upload_worker(settings, test_visibility_api) diff --git a/lib/datadog/ci/test_visibility/component.rb b/lib/datadog/ci/test_visibility/component.rb index 06dedcb5..77ae46eb 100644 --- a/lib/datadog/ci/test_visibility/component.rb +++ b/lib/datadog/ci/test_visibility/component.rb @@ -20,7 +20,6 @@ class Component attr_reader :test_suite_level_visibility_enabled def initialize( - test_optimisation:, remote_settings_api:, git_tree_upload_worker: DummyWorker.new, test_suite_level_visibility_enabled: false, @@ -29,7 +28,6 @@ def initialize( @test_suite_level_visibility_enabled = test_suite_level_visibility_enabled @context = Context.new @codeowners = codeowners - @test_optimisation = test_optimisation @remote_settings_api = remote_settings_api @git_tree_upload_worker = git_tree_upload_worker end @@ -136,7 +134,7 @@ def deactivate_test_suite(test_suite_name) end def itr_enabled? - @test_optimisation.enabled? + test_optimisation.enabled? end private @@ -171,12 +169,12 @@ def on_test_started(test) Telemetry.event_created(test) - @test_optimisation.mark_if_skippable(test) - @test_optimisation.start_coverage(test) + test_optimisation.mark_if_skippable(test) + test_optimisation.start_coverage(test) end def on_test_session_finished(test_session) - @test_optimisation.write_test_session_tags(test_session) + test_optimisation.write_test_session_tags(test_session) Telemetry.event_finished(test_session) end @@ -190,8 +188,8 @@ def on_test_suite_finished(test_suite) end def on_test_finished(test) - @test_optimisation.stop_coverage(test) - @test_optimisation.count_skipped_test(test) + test_optimisation.stop_coverage(test) + test_optimisation.count_skipped_test(test) Telemetry.event_finished(test) end @@ -216,7 +214,7 @@ def configure_library(test_session) end end - @test_optimisation.configure( + test_optimisation.configure( remote_configuration.payload, test_session: test_session, git_tree_upload_worker: @git_tree_upload_worker @@ -276,6 +274,10 @@ def validate_test_suite_level_visibility_correctness(test) end end end + + def test_optimisation + Datadog.send(:components).test_optimisation + end end end end diff --git a/sig/datadog/ci/test_visibility/component.rbs b/sig/datadog/ci/test_visibility/component.rbs index 9b413c2b..19a9d5ec 100644 --- a/sig/datadog/ci/test_visibility/component.rbs +++ b/sig/datadog/ci/test_visibility/component.rbs @@ -4,7 +4,6 @@ module Datadog class Component @test_suite_level_visibility_enabled: bool - @test_optimisation: Datadog::CI::TestOptimisation::Component @remote_settings_api: Datadog::CI::Transport::RemoteSettingsApi @codeowners: Datadog::CI::Codeowners::Matcher @git_tree_upload_worker: Datadog::CI::Worker @@ -12,7 +11,7 @@ module Datadog attr_reader test_suite_level_visibility_enabled: bool - def initialize: (?test_suite_level_visibility_enabled: bool, ?codeowners: Datadog::CI::Codeowners::Matcher, test_optimisation: Datadog::CI::TestOptimisation::Component, remote_settings_api: Datadog::CI::Transport::RemoteSettingsApi, ?git_tree_upload_worker: Datadog::CI::Worker) -> void + def initialize: (?test_suite_level_visibility_enabled: bool, ?codeowners: Datadog::CI::Codeowners::Matcher, remote_settings_api: Datadog::CI::Transport::RemoteSettingsApi, ?git_tree_upload_worker: Datadog::CI::Worker) -> void def trace_test: (String span_name, String test_suite_name, ?service: String?, ?tags: Hash[untyped, untyped]) ?{ (Datadog::CI::Test span) -> untyped } -> untyped @@ -75,6 +74,8 @@ module Datadog def on_test_suite_finished: (Datadog::CI::TestSuite test_suite) -> void def on_test_finished: (Datadog::CI::Test test) -> void + + def test_optimisation: () -> Datadog::CI::TestOptimisation::Component end end end diff --git a/spec/datadog/ci/configuration/components_spec.rb b/spec/datadog/ci/configuration/components_spec.rb index 8608edac..9bdc846b 100644 --- a/spec/datadog/ci/configuration/components_spec.rb +++ b/spec/datadog/ci/configuration/components_spec.rb @@ -77,6 +77,12 @@ allow(settings.telemetry).to receive(:enabled=).and_call_original + allow(Datadog::CI::Ext::Environment) + .to receive(:tags).and_return({}) + + logger = spy(:logger) + allow(Datadog).to receive(:logger).and_return(logger) + allow(Datadog.logger) .to receive(:debug) @@ -86,10 +92,9 @@ allow(Datadog.logger) .to receive(:error) - allow(Datadog::CI::Ext::Environment) - .to receive(:tags).and_return({}) - components + + allow(Datadog).to receive(:components).and_return(components) end let(:api_key) { nil } From 727918bbcdaf83770d9cd9e45dfad316c5fdbcd4 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 30 Jul 2024 14:08:26 +0200 Subject: [PATCH 03/10] store git_tree_upload_worker as top-level component, remove git_tree_upload_worker param from TestVisibility::Component --- lib/datadog/ci/configuration/components.rb | 9 ++++--- lib/datadog/ci/test_visibility/component.rb | 28 ++++++++++++-------- sig/datadog/ci/configuration/components.rbs | 2 ++ sig/datadog/ci/test_visibility/component.rbs | 5 ++-- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/lib/datadog/ci/configuration/components.rb b/lib/datadog/ci/configuration/components.rb index 40175ea2..5ee588de 100644 --- a/lib/datadog/ci/configuration/components.rb +++ b/lib/datadog/ci/configuration/components.rb @@ -26,11 +26,12 @@ module CI module Configuration # Adds CI behavior to Datadog trace components module Components - attr_reader :test_visibility, :test_optimisation + attr_reader :test_visibility, :test_optimisation, :git_tree_upload_worker def initialize(settings) @test_optimisation = nil @test_visibility = TestVisibility::NullComponent.new + @git_tree_upload_worker = DummyWorker.new # Activate CI mode if enabled if settings.ci.enabled @@ -45,6 +46,7 @@ def shutdown!(replacement = nil) @test_visibility&.shutdown! @test_optimisation&.shutdown! + @git_tree_upload_worker&.stop end def activate_ci!(settings) @@ -102,13 +104,14 @@ def activate_ci!(settings) settings.tracing.test_mode.writer_options = trace_writer_options + @git_tree_upload_worker = build_git_upload_worker(settings, test_visibility_api) + # @type ivar @test_optimisation: Datadog::CI::TestOptimisation::Component @test_optimisation = build_test_optimisation(settings, test_visibility_api) @test_visibility = TestVisibility::Component.new( test_suite_level_visibility_enabled: !settings.ci.force_test_level_visibility, - remote_settings_api: build_remote_settings_client(settings, test_visibility_api), - git_tree_upload_worker: build_git_upload_worker(settings, test_visibility_api) + remote_settings_api: build_remote_settings_client(settings, test_visibility_api) ) end diff --git a/lib/datadog/ci/test_visibility/component.rb b/lib/datadog/ci/test_visibility/component.rb index 77ae46eb..8ae5cc37 100644 --- a/lib/datadog/ci/test_visibility/component.rb +++ b/lib/datadog/ci/test_visibility/component.rb @@ -21,7 +21,6 @@ class Component def initialize( remote_settings_api:, - git_tree_upload_worker: DummyWorker.new, test_suite_level_visibility_enabled: false, codeowners: Codeowners::Parser.new(Git::LocalRepository.root).parse ) @@ -29,11 +28,6 @@ def initialize( @context = Context.new @codeowners = codeowners @remote_settings_api = remote_settings_api - @git_tree_upload_worker = git_tree_upload_worker - end - - def shutdown! - @git_tree_upload_worker.stop end def start_test_session(service: nil, tags: {}) @@ -137,17 +131,25 @@ def itr_enabled? test_optimisation.enabled? end + def shutdown! + # noop, there is no thread owned by test visibility component + end + private # DOMAIN EVENTS def on_test_session_started(test_session) - Telemetry.event_created(test_session) - Telemetry.test_session_started(test_session) + # signal git tree upload worker to start uploading git metadata + git_tree_upload_worker.perform(test_session.git_repository_url) # finds and instruments additional test libraries that we support (ex: selenium-webdriver) Contrib.auto_instrument_on_session_start! - @git_tree_upload_worker.perform(test_session.git_repository_url) + # sends internal telemetry events + Telemetry.test_session_started(test_session) + Telemetry.event_created(test_session) + + # signal Remote::Component to configure the library configure_library(test_session) end @@ -204,7 +206,7 @@ def configure_library(test_session) # backend needs git metadata uploaded for this test session to check if we can skip code coverage if remote_configuration.require_git? Datadog.logger.debug { "Library configuration endpoint requires git upload to be finished, waiting..." } - @git_tree_upload_worker.wait_until_done + git_tree_upload_worker.wait_until_done Datadog.logger.debug { "Requesting library configuration again..." } remote_configuration = @remote_settings_api.fetch_library_settings(test_session) @@ -217,7 +219,7 @@ def configure_library(test_session) test_optimisation.configure( remote_configuration.payload, test_session: test_session, - git_tree_upload_worker: @git_tree_upload_worker + git_tree_upload_worker: git_tree_upload_worker ) end @@ -278,6 +280,10 @@ def validate_test_suite_level_visibility_correctness(test) def test_optimisation Datadog.send(:components).test_optimisation end + + def git_tree_upload_worker + Datadog.send(:components).git_tree_upload_worker + end end end end diff --git a/sig/datadog/ci/configuration/components.rbs b/sig/datadog/ci/configuration/components.rbs index 1e3b18bd..999f8508 100644 --- a/sig/datadog/ci/configuration/components.rbs +++ b/sig/datadog/ci/configuration/components.rbs @@ -4,10 +4,12 @@ module Datadog module Components : Datadog::Core::Configuration::Components @test_visibility: Datadog::CI::TestVisibility::Component | Datadog::CI::TestVisibility::NullComponent @test_optimisation: Datadog::CI::TestOptimisation::Component? + @git_tree_upload_worker: Datadog::CI::Worker @custom_configuration: Hash[String, String] attr_reader test_visibility: Datadog::CI::TestVisibility::Component | Datadog::CI::TestVisibility::NullComponent attr_reader test_optimisation: Datadog::CI::TestOptimisation::Component? + attr_reader git_tree_upload_worker: Datadog::CI::Worker def initialize: (untyped settings) -> void diff --git a/sig/datadog/ci/test_visibility/component.rbs b/sig/datadog/ci/test_visibility/component.rbs index 19a9d5ec..6b890723 100644 --- a/sig/datadog/ci/test_visibility/component.rbs +++ b/sig/datadog/ci/test_visibility/component.rbs @@ -6,12 +6,11 @@ module Datadog @remote_settings_api: Datadog::CI::Transport::RemoteSettingsApi @codeowners: Datadog::CI::Codeowners::Matcher - @git_tree_upload_worker: Datadog::CI::Worker @context: Datadog::CI::TestVisibility::Context attr_reader test_suite_level_visibility_enabled: bool - def initialize: (?test_suite_level_visibility_enabled: bool, ?codeowners: Datadog::CI::Codeowners::Matcher, remote_settings_api: Datadog::CI::Transport::RemoteSettingsApi, ?git_tree_upload_worker: Datadog::CI::Worker) -> void + def initialize: (?test_suite_level_visibility_enabled: bool, ?codeowners: Datadog::CI::Codeowners::Matcher, remote_settings_api: Datadog::CI::Transport::RemoteSettingsApi) -> void def trace_test: (String span_name, String test_suite_name, ?service: String?, ?tags: Hash[untyped, untyped]) ?{ (Datadog::CI::Test span) -> untyped } -> untyped @@ -76,6 +75,8 @@ module Datadog def on_test_finished: (Datadog::CI::Test test) -> void def test_optimisation: () -> Datadog::CI::TestOptimisation::Component + + def git_tree_upload_worker: () -> Datadog::CI::Worker end end end From d46eedfac85beddd09c142ae0daebe225294bb63 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 30 Jul 2024 14:20:06 +0200 Subject: [PATCH 04/10] remove git_tree_upload_worker from params in TestOptimisation component's methods --- lib/datadog/ci/test_optimisation/component.rb | 10 +++++++--- lib/datadog/ci/test_visibility/component.rb | 3 +-- sig/datadog/ci/test_optimisation/component.rbs | 6 ++++-- spec/datadog/ci/test_optimisation/component_spec.rb | 3 ++- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/datadog/ci/test_optimisation/component.rb b/lib/datadog/ci/test_optimisation/component.rb index ddacb292..e93564b6 100644 --- a/lib/datadog/ci/test_optimisation/component.rb +++ b/lib/datadog/ci/test_optimisation/component.rb @@ -65,7 +65,7 @@ def initialize( Datadog.logger.debug("TestOptimisation initialized with enabled: #{@enabled}") end - def configure(remote_configuration, test_session:, git_tree_upload_worker:) + def configure(remote_configuration, test_session:) return unless enabled? Datadog.logger.debug("Configuring TestOptimisation with remote configuration: #{remote_configuration}") @@ -92,7 +92,7 @@ def configure(remote_configuration, test_session:, git_tree_upload_worker:) Datadog.logger.debug("Configured TestOptimisation with enabled: #{@enabled}, skipping_tests: #{@test_skipping_enabled}, code_coverage: #{@code_coverage_enabled}") - fetch_skippable_tests(test_session: test_session, git_tree_upload_worker: git_tree_upload_worker) + fetch_skippable_tests(test_session) end def enabled? @@ -227,7 +227,7 @@ def ensure_test_source_covered(test_source_file, coverage) coverage[absolute_test_source_file_path] = true end - def fetch_skippable_tests(test_session:, git_tree_upload_worker:) + def fetch_skippable_tests(test_session) return unless skipping_tests? # we can only request skippable tests if git metadata is already uploaded @@ -250,6 +250,10 @@ def fetch_skippable_tests(test_session:, git_tree_upload_worker:) def code_coverage_mode @use_single_threaded_coverage ? :single : :multi end + + def git_tree_upload_worker + Datadog.send(:components).git_tree_upload_worker + end end end end diff --git a/lib/datadog/ci/test_visibility/component.rb b/lib/datadog/ci/test_visibility/component.rb index 8ae5cc37..61d728a9 100644 --- a/lib/datadog/ci/test_visibility/component.rb +++ b/lib/datadog/ci/test_visibility/component.rb @@ -218,8 +218,7 @@ def configure_library(test_session) test_optimisation.configure( remote_configuration.payload, - test_session: test_session, - git_tree_upload_worker: git_tree_upload_worker + test_session: test_session ) end diff --git a/sig/datadog/ci/test_optimisation/component.rbs b/sig/datadog/ci/test_optimisation/component.rbs index f254edc5..50604c0a 100644 --- a/sig/datadog/ci/test_optimisation/component.rbs +++ b/sig/datadog/ci/test_optimisation/component.rbs @@ -28,7 +28,7 @@ module Datadog def initialize: (dd_env: String?, ?enabled: bool, ?coverage_writer: Datadog::CI::TestOptimisation::Coverage::Writer?, ?api: Datadog::CI::Transport::Api::Base?, ?config_tags: Hash[String, String]?, ?bundle_location: String?, ?use_single_threaded_coverage: bool, ?use_allocation_tracing: bool) -> void - def configure: (Hash[String, untyped] remote_configuration, test_session: Datadog::CI::TestSession, git_tree_upload_worker: Datadog::CI::Worker) -> void + def configure: (Hash[String, untyped] remote_configuration, test_session: Datadog::CI::TestSession) -> void def enabled?: () -> bool @@ -58,11 +58,13 @@ module Datadog def ensure_test_source_covered: (String test_source_file, Hash[String, untyped] coverage) -> void - def fetch_skippable_tests: (test_session: Datadog::CI::TestSession, git_tree_upload_worker: Datadog::CI::Worker) -> void + def fetch_skippable_tests: (Datadog::CI::TestSession test_session) -> void def increment_skipped_tests_counter: () -> void def code_coverage_mode: () -> Datadog::CI::TestOptimisation::Coverage::DDCov::threading_mode + + def git_tree_upload_worker: () -> Datadog::CI::Worker end end end diff --git a/spec/datadog/ci/test_optimisation/component_spec.rb b/spec/datadog/ci/test_optimisation/component_spec.rb index c05b306f..ae496ce5 100644 --- a/spec/datadog/ci/test_optimisation/component_spec.rb +++ b/spec/datadog/ci/test_optimisation/component_spec.rb @@ -15,10 +15,11 @@ let(:test_session) { Datadog::CI::TestSession.new(tracer_span) } subject(:component) { described_class.new(api: api, dd_env: "dd_env", coverage_writer: writer, enabled: itr_enabled) } - let(:configure) { component.configure(remote_configuration, test_session: test_session, git_tree_upload_worker: git_worker) } + let(:configure) { component.configure(remote_configuration, test_session: test_session) } before do allow(writer).to receive(:write) + allow(Datadog.send(:components)).to receive(:git_tree_upload_worker).and_return(git_worker) end describe "#configure" do From 28ac2535c298beb4b41d1c645368691ba2e0ed95 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 30 Jul 2024 14:34:42 +0200 Subject: [PATCH 05/10] add configuration parsing to RemoteSettingsApi::Response --- .../ci/transport/remote_settings_api.rb | 32 +++++++++++++++++-- .../ci/transport/remote_settings_api.rbs | 11 +++++++ .../ci/transport/remote_settings_api_spec.rb | 17 ++++++---- 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/lib/datadog/ci/transport/remote_settings_api.rb b/lib/datadog/ci/transport/remote_settings_api.rb index 9207c6e0..f56b6efd 100644 --- a/lib/datadog/ci/transport/remote_settings_api.rb +++ b/lib/datadog/ci/transport/remote_settings_api.rb @@ -52,7 +52,33 @@ def payload end def require_git? - Utils::Parsing.convert_to_bool(payload[Ext::Transport::DD_API_SETTINGS_RESPONSE_REQUIRE_GIT_KEY]) + return @require_git if defined?(@require_git) + + @require_git = Utils::Parsing.convert_to_bool(payload[Ext::Transport::DD_API_SETTINGS_RESPONSE_REQUIRE_GIT_KEY]) + end + + def itr_enabled? + return @itr_enabled if defined?(@itr_enabled) + + @itr_enabled = Utils::Parsing.convert_to_bool( + payload.fetch(Ext::Transport::DD_API_SETTINGS_RESPONSE_ITR_ENABLED_KEY, false) + ) + end + + def code_coverage_enabled? + return @code_coverage_enabled if defined?(@code_coverage_enabled) + + @code_coverage_enabled = Utils::Parsing.convert_to_bool( + payload.fetch(Ext::Transport::DD_API_SETTINGS_RESPONSE_CODE_COVERAGE_KEY, false) + ) + end + + def tests_skipping_enabled? + return @tests_skipping_enabled if defined?(@tests_skipping_enabled) + + @tests_skipping_enabled = Utils::Parsing.convert_to_bool( + payload.fetch(Ext::Transport::DD_API_SETTINGS_RESPONSE_TESTS_SKIPPING_KEY, false) + ) end private @@ -102,8 +128,8 @@ def fetch_library_settings(test_session) Ext::Telemetry::METRIC_GIT_REQUESTS_SETTINGS_RESPONSE, 1, { - Ext::Telemetry::TAG_COVERAGE_ENABLED => response.payload[Ext::Transport::DD_API_SETTINGS_RESPONSE_CODE_COVERAGE_KEY], - Ext::Telemetry::TAG_ITR_SKIP_ENABLED => response.payload[Ext::Transport::DD_API_SETTINGS_RESPONSE_TESTS_SKIPPING_KEY] + Ext::Telemetry::TAG_COVERAGE_ENABLED => response.code_coverage_enabled?.to_s, + Ext::Telemetry::TAG_ITR_SKIP_ENABLED => response.tests_skipping_enabled?.to_s } ) diff --git a/sig/datadog/ci/transport/remote_settings_api.rbs b/sig/datadog/ci/transport/remote_settings_api.rbs index d017100d..56589783 100644 --- a/sig/datadog/ci/transport/remote_settings_api.rbs +++ b/sig/datadog/ci/transport/remote_settings_api.rbs @@ -6,6 +6,11 @@ module Datadog @http_response: Datadog::CI::Transport::Adapters::Net::Response? @json: Hash[String, untyped]? + @require_git: bool + @itr_enabled: bool + @code_coverage_enabled: bool + @tests_skipping_enabled: bool + def initialize: (Datadog::CI::Transport::Adapters::Net::Response? http_response) -> void def ok?: () -> bool @@ -14,6 +19,12 @@ module Datadog def require_git?: () -> bool + def itr_enabled?: () -> bool + + def code_coverage_enabled?: () -> bool + + def tests_skipping_enabled?: () -> bool + private def default_payload: () -> Hash[String, untyped] diff --git a/spec/datadog/ci/transport/remote_settings_api_spec.rb b/spec/datadog/ci/transport/remote_settings_api_spec.rb index 6fc08576..f6c469d4 100644 --- a/spec/datadog/ci/transport/remote_settings_api_spec.rb +++ b/spec/datadog/ci/transport/remote_settings_api_spec.rb @@ -79,9 +79,9 @@ "id" => "123", "type" => Datadog::CI::Ext::Transport::DD_API_SETTINGS_TYPE, "attributes" => { - "code_coverage" => true, - "tests_skipping" => false, - "itr_enabled" => true, + "code_coverage" => "1", + "tests_skipping" => "false", + "itr_enabled" => "True", "require_git" => require_git } } @@ -95,15 +95,18 @@ it "parses the response" do expect(response.ok?).to be true expect(response.payload).to eq({ - "code_coverage" => true, - "tests_skipping" => false, - "itr_enabled" => true, + "code_coverage" => "1", + "tests_skipping" => "false", + "itr_enabled" => "True", "require_git" => require_git }) expect(response.require_git?).to be false + expect(response.itr_enabled?).to be true + expect(response.code_coverage_enabled?).to be true + expect(response.tests_skipping_enabled?).to be false metric = telemetry_metric(:inc, "git_requests.settings_response") - expect(metric.tags).to eq("coverage_enabled" => true, "itrskip_enabled" => false) + expect(metric.tags).to eq("coverage_enabled" => "true", "itrskip_enabled" => "false") end it_behaves_like "emits telemetry metric", :inc, "git_requests.settings", 1 From 04f87132833579032929c863d6fdace02f4bfd75 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 30 Jul 2024 15:06:08 +0200 Subject: [PATCH 06/10] pass remote configuration response object to the test optimisation component --- lib/datadog/ci/test_optimisation/component.rb | 16 +---- lib/datadog/ci/test_visibility/component.rb | 2 +- .../ci/test_optimisation/component.rbs | 2 +- .../ci/test_optimisation/component_spec.rb | 63 ++++++++++--------- spec/support/contexts/ci_mode.rb | 10 ++- 5 files changed, 46 insertions(+), 47 deletions(-) diff --git a/lib/datadog/ci/test_optimisation/component.rb b/lib/datadog/ci/test_optimisation/component.rb index e93564b6..249c58f1 100644 --- a/lib/datadog/ci/test_optimisation/component.rb +++ b/lib/datadog/ci/test_optimisation/component.rb @@ -6,7 +6,6 @@ require_relative "../ext/test" require_relative "../ext/telemetry" -require_relative "../ext/transport" require_relative "../git/local_repository" @@ -70,21 +69,12 @@ def configure(remote_configuration, test_session:) Datadog.logger.debug("Configuring TestOptimisation with remote configuration: #{remote_configuration}") - @enabled = Utils::Parsing.convert_to_bool( - remote_configuration.fetch(Ext::Transport::DD_API_SETTINGS_RESPONSE_ITR_ENABLED_KEY, false) - ) - @test_skipping_enabled = @enabled && Utils::Parsing.convert_to_bool( - remote_configuration.fetch(Ext::Transport::DD_API_SETTINGS_RESPONSE_TESTS_SKIPPING_KEY, false) - ) - @code_coverage_enabled = @enabled && Utils::Parsing.convert_to_bool( - remote_configuration.fetch(Ext::Transport::DD_API_SETTINGS_RESPONSE_CODE_COVERAGE_KEY, false) - ) + @enabled = remote_configuration.itr_enabled? + @test_skipping_enabled = @enabled && remote_configuration.tests_skipping_enabled? + @code_coverage_enabled = @enabled && remote_configuration.code_coverage_enabled? test_session.set_tag(Ext::Test::TAG_ITR_TEST_SKIPPING_ENABLED, @test_skipping_enabled) - # currently we set this tag when ITR requires collecting code coverage - # this will change as soon as we implement total code coverage support in this library test_session.set_tag(Ext::Test::TAG_CODE_COVERAGE_ENABLED, @code_coverage_enabled) - # we skip tests, not suites test_session.set_tag(Ext::Test::TAG_ITR_TEST_SKIPPING_TYPE, Ext::Test::ITR_TEST_SKIPPING_MODE) diff --git a/lib/datadog/ci/test_visibility/component.rb b/lib/datadog/ci/test_visibility/component.rb index 61d728a9..864d95f4 100644 --- a/lib/datadog/ci/test_visibility/component.rb +++ b/lib/datadog/ci/test_visibility/component.rb @@ -217,7 +217,7 @@ def configure_library(test_session) end test_optimisation.configure( - remote_configuration.payload, + remote_configuration, test_session: test_session ) end diff --git a/sig/datadog/ci/test_optimisation/component.rbs b/sig/datadog/ci/test_optimisation/component.rbs index 50604c0a..664d0251 100644 --- a/sig/datadog/ci/test_optimisation/component.rbs +++ b/sig/datadog/ci/test_optimisation/component.rbs @@ -28,7 +28,7 @@ module Datadog def initialize: (dd_env: String?, ?enabled: bool, ?coverage_writer: Datadog::CI::TestOptimisation::Coverage::Writer?, ?api: Datadog::CI::Transport::Api::Base?, ?config_tags: Hash[String, String]?, ?bundle_location: String?, ?use_single_threaded_coverage: bool, ?use_allocation_tracing: bool) -> void - def configure: (Hash[String, untyped] remote_configuration, test_session: Datadog::CI::TestSession) -> void + def configure: (Datadog::CI::Transport::RemoteSettingsApi::Response remote_configuration, test_session: Datadog::CI::TestSession) -> void def enabled?: () -> bool diff --git a/spec/datadog/ci/test_optimisation/component_spec.rb b/spec/datadog/ci/test_optimisation/component_spec.rb index ae496ce5..e35b7949 100644 --- a/spec/datadog/ci/test_optimisation/component_spec.rb +++ b/spec/datadog/ci/test_optimisation/component_spec.rb @@ -5,7 +5,9 @@ RSpec.describe Datadog::CI::TestOptimisation::Component do include_context "Telemetry spy" - let(:itr_enabled) { true } + subject(:component) { described_class.new(api: api, dd_env: "dd_env", coverage_writer: writer, enabled: local_itr_enabled) } + + let(:local_itr_enabled) { true } let(:api) { double("api") } let(:writer) { spy("writer") } @@ -14,7 +16,18 @@ let(:tracer_span) { Datadog::Tracing::SpanOperation.new("session") } let(:test_session) { Datadog::CI::TestSession.new(tracer_span) } - subject(:component) { described_class.new(api: api, dd_env: "dd_env", coverage_writer: writer, enabled: itr_enabled) } + let(:remote_configuration) do + double( + :remote_configuration, + itr_enabled?: itr_enabled, + code_coverage_enabled?: code_coverage_enabled, + tests_skipping_enabled?: tests_skipping_enabled + ) + end + let(:itr_enabled) { true } + let(:code_coverage_enabled) { true } + let(:tests_skipping_enabled) { true } + let(:configure) { component.configure(remote_configuration, test_session: test_session) } before do @@ -23,10 +36,10 @@ end describe "#configure" do - context "when remote configuration call failed" do - let(:remote_configuration) { {"itr_enabled" => false} } + context "when ITR is disabled in remote configuration" do + let(:itr_enabled) { false } - it "configures the component and test session" do + it "disables the component" do configure expect(component.enabled?).to be false @@ -36,7 +49,7 @@ end context "when remote configuration call returned correct response without tests skipping" do - let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => false} } + let(:tests_skipping_enabled) { false } before do configure @@ -58,7 +71,6 @@ end context "when remote configuration call returned correct response with tests skipping" do - let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => true} } let(:skippable) do instance_double( Datadog::CI::TestOptimisation::Skippable, @@ -72,6 +84,7 @@ before do expect(Datadog::CI::TestOptimisation::Skippable).to receive(:new).and_return(skippable) + configure end @@ -88,22 +101,10 @@ it_behaves_like "emits telemetry metric", :inc, "itr_skippable_tests.response_tests", 2 end - context "when remote configuration call returned correct response with strings instead of bools" do - let(:remote_configuration) { {"itr_enabled" => "true", "code_coverage" => "true", "tests_skipping" => "false"} } - - it "configures the component" do - configure - - expect(component.enabled?).to be true - expect(component.skipping_tests?).to be false - expect(component.code_coverage?).to be(!PlatformHelpers.jruby?) # code coverage is not supported in JRuby - end - end - - context "when remote configuration call returns empty hash" do - let(:remote_configuration) { {} } + context "when ITR is disabled locally" do + let(:local_itr_enabled) { false } - it "configures the component" do + it "does not use remote configuration" do configure expect(component.enabled?).to be false @@ -124,7 +125,8 @@ end context "when code coverage is disabled" do - let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => false, "tests_skipping" => false} } + let(:code_coverage_enabled) { false } + let(:tests_skipping_enabled) { false } it "does not start coverage" do expect(component).not_to receive(:coverage_collector) @@ -135,7 +137,9 @@ end context "when TestOptimisation is disabled" do - let(:remote_configuration) { {"itr_enabled" => false, "code_coverage" => false, "tests_skipping" => false} } + let(:itr_enabled) { false } + let(:code_coverage_enabled) { false } + let(:tests_skipping_enabled) { false } it "does not start coverage" do expect(component).not_to receive(:coverage_collector) @@ -146,7 +150,7 @@ end context "when code coverage is enabled" do - let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => false} } + let(:tests_skipping_enabled) { false } before do skip("Code coverage is not supported in JRuby") if PlatformHelpers.jruby? @@ -165,7 +169,7 @@ end context "when JRuby and code coverage is enabled" do - let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => false} } + let(:tests_skipping_enabled) { false } before do skip("Skipped for CRuby") unless PlatformHelpers.jruby? @@ -186,7 +190,7 @@ let(:test_tracer_span) { Datadog::Tracing::SpanOperation.new("test") } let(:test_span) { Datadog::CI::Test.new(tracer_span) } - let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => false} } + let(:tests_skipping_enabled) { false } before do skip("Code coverage is not supported in JRuby") if PlatformHelpers.jruby? @@ -249,7 +253,6 @@ subject { component.mark_if_skippable(test_span) } context "when skipping tests" do - let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => true} } let(:skippable) do instance_double( Datadog::CI::TestOptimisation::Skippable, @@ -297,7 +300,7 @@ end context "when not skipping tests" do - let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => false} } + let(:tests_skipping_enabled) { false } before do configure @@ -409,7 +412,7 @@ end context "when TestOptimisation is disabled" do - let(:itr_enabled) { false } + let(:local_itr_enabled) { false } it "does not add ITR/TestOptimisation tags to the session" do subject diff --git a/spec/support/contexts/ci_mode.rb b/spec/support/contexts/ci_mode.rb index 70812f8a..55b645ba 100644 --- a/spec/support/contexts/ci_mode.rb +++ b/spec/support/contexts/ci_mode.rb @@ -58,7 +58,10 @@ "code_coverage" => code_coverage_enabled, "tests_skipping" => tests_skipping_enabled }, - require_git?: require_git + require_git?: require_git, + itr_enabled?: itr_enabled, + code_coverage_enabled?: code_coverage_enabled, + tests_skipping_enabled?: tests_skipping_enabled ), # This is for the second call to fetch_library_settings instance_double( @@ -68,7 +71,10 @@ "code_coverage" => !code_coverage_enabled, "tests_skipping" => !tests_skipping_enabled }, - require_git?: !require_git + require_git?: !require_git, + itr_enabled?: itr_enabled, + code_coverage_enabled?: !code_coverage_enabled, + tests_skipping_enabled?: !tests_skipping_enabled ) ) allow_any_instance_of(Datadog::CI::TestOptimisation::Skippable).to receive(:fetch_skippable_tests).and_return(skippable_tests_response) From df1c36c8e5aaa81672f87377a6f187f30eecba08 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 30 Jul 2024 15:13:36 +0200 Subject: [PATCH 07/10] minor refactorings --- lib/datadog/ci/test_optimisation/component.rb | 2 +- lib/datadog/ci/test_visibility/component.rb | 5 +---- .../ci/transport/remote_settings_api.rb | 18 ++++++++---------- sig/datadog/ci/test_optimisation/component.rbs | 2 +- .../ci/transport/remote_settings_api.rbs | 2 ++ .../ci/test_optimisation/component_spec.rb | 2 +- 6 files changed, 14 insertions(+), 17 deletions(-) diff --git a/lib/datadog/ci/test_optimisation/component.rb b/lib/datadog/ci/test_optimisation/component.rb index 249c58f1..cb25ea2c 100644 --- a/lib/datadog/ci/test_optimisation/component.rb +++ b/lib/datadog/ci/test_optimisation/component.rb @@ -64,7 +64,7 @@ def initialize( Datadog.logger.debug("TestOptimisation initialized with enabled: #{@enabled}") end - def configure(remote_configuration, test_session:) + def configure(remote_configuration, test_session) return unless enabled? Datadog.logger.debug("Configuring TestOptimisation with remote configuration: #{remote_configuration}") diff --git a/lib/datadog/ci/test_visibility/component.rb b/lib/datadog/ci/test_visibility/component.rb index 864d95f4..9aac0115 100644 --- a/lib/datadog/ci/test_visibility/component.rb +++ b/lib/datadog/ci/test_visibility/component.rb @@ -216,10 +216,7 @@ def configure_library(test_session) end end - test_optimisation.configure( - remote_configuration, - test_session: test_session - ) + test_optimisation.configure(remote_configuration, test_session) end # HELPERS diff --git a/lib/datadog/ci/transport/remote_settings_api.rb b/lib/datadog/ci/transport/remote_settings_api.rb index f56b6efd..b951c296 100644 --- a/lib/datadog/ci/transport/remote_settings_api.rb +++ b/lib/datadog/ci/transport/remote_settings_api.rb @@ -54,35 +54,33 @@ def payload def require_git? return @require_git if defined?(@require_git) - @require_git = Utils::Parsing.convert_to_bool(payload[Ext::Transport::DD_API_SETTINGS_RESPONSE_REQUIRE_GIT_KEY]) + @require_git = bool(Ext::Transport::DD_API_SETTINGS_RESPONSE_REQUIRE_GIT_KEY) end def itr_enabled? return @itr_enabled if defined?(@itr_enabled) - @itr_enabled = Utils::Parsing.convert_to_bool( - payload.fetch(Ext::Transport::DD_API_SETTINGS_RESPONSE_ITR_ENABLED_KEY, false) - ) + @itr_enabled = bool(Ext::Transport::DD_API_SETTINGS_RESPONSE_ITR_ENABLED_KEY) end def code_coverage_enabled? return @code_coverage_enabled if defined?(@code_coverage_enabled) - @code_coverage_enabled = Utils::Parsing.convert_to_bool( - payload.fetch(Ext::Transport::DD_API_SETTINGS_RESPONSE_CODE_COVERAGE_KEY, false) - ) + @code_coverage_enabled = bool(Ext::Transport::DD_API_SETTINGS_RESPONSE_CODE_COVERAGE_KEY) end def tests_skipping_enabled? return @tests_skipping_enabled if defined?(@tests_skipping_enabled) - @tests_skipping_enabled = Utils::Parsing.convert_to_bool( - payload.fetch(Ext::Transport::DD_API_SETTINGS_RESPONSE_TESTS_SKIPPING_KEY, false) - ) + @tests_skipping_enabled = bool(Ext::Transport::DD_API_SETTINGS_RESPONSE_TESTS_SKIPPING_KEY) end private + def bool(key) + Utils::Parsing.convert_to_bool(payload.fetch(key, false)) + end + def default_payload Ext::Transport::DD_API_SETTINGS_RESPONSE_DEFAULT end diff --git a/sig/datadog/ci/test_optimisation/component.rbs b/sig/datadog/ci/test_optimisation/component.rbs index 664d0251..e26bc5ca 100644 --- a/sig/datadog/ci/test_optimisation/component.rbs +++ b/sig/datadog/ci/test_optimisation/component.rbs @@ -28,7 +28,7 @@ module Datadog def initialize: (dd_env: String?, ?enabled: bool, ?coverage_writer: Datadog::CI::TestOptimisation::Coverage::Writer?, ?api: Datadog::CI::Transport::Api::Base?, ?config_tags: Hash[String, String]?, ?bundle_location: String?, ?use_single_threaded_coverage: bool, ?use_allocation_tracing: bool) -> void - def configure: (Datadog::CI::Transport::RemoteSettingsApi::Response remote_configuration, test_session: Datadog::CI::TestSession) -> void + def configure: (Datadog::CI::Transport::RemoteSettingsApi::Response remote_configuration, Datadog::CI::TestSession test_session) -> void def enabled?: () -> bool diff --git a/sig/datadog/ci/transport/remote_settings_api.rbs b/sig/datadog/ci/transport/remote_settings_api.rbs index 56589783..8c1c661f 100644 --- a/sig/datadog/ci/transport/remote_settings_api.rbs +++ b/sig/datadog/ci/transport/remote_settings_api.rbs @@ -27,6 +27,8 @@ module Datadog private + def bool: (String key) -> bool + def default_payload: () -> Hash[String, untyped] end diff --git a/spec/datadog/ci/test_optimisation/component_spec.rb b/spec/datadog/ci/test_optimisation/component_spec.rb index e35b7949..58fde782 100644 --- a/spec/datadog/ci/test_optimisation/component_spec.rb +++ b/spec/datadog/ci/test_optimisation/component_spec.rb @@ -28,7 +28,7 @@ let(:code_coverage_enabled) { true } let(:tests_skipping_enabled) { true } - let(:configure) { component.configure(remote_configuration, test_session: test_session) } + let(:configure) { component.configure(remote_configuration, test_session) } before do allow(writer).to receive(:write) From e7e9ba784012d6a38ebb2b0f6525a3bda782b70c Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 30 Jul 2024 15:18:59 +0200 Subject: [PATCH 08/10] request remote library settings even when ITR is disabled locally: settings include flaky test retries and early flake detection --- lib/datadog/ci/test_visibility/component.rb | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/datadog/ci/test_visibility/component.rb b/lib/datadog/ci/test_visibility/component.rb index 9aac0115..75814f13 100644 --- a/lib/datadog/ci/test_visibility/component.rb +++ b/lib/datadog/ci/test_visibility/component.rb @@ -198,9 +198,6 @@ def on_test_finished(test) # TODO: move this to CI::Configuration::Remote def configure_library(test_session) - # this will change when EFD is implemented - return unless itr_enabled? - remote_configuration = @remote_settings_api.fetch_library_settings(test_session) # sometimes we can skip code coverage for default branch if there are no changes in the repository # backend needs git metadata uploaded for this test session to check if we can skip code coverage From 8b425310216fd6413d3d6b4122d283f91061f22b Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 30 Jul 2024 16:10:28 +0200 Subject: [PATCH 09/10] introduce Remote::Component and move remote library settings there --- lib/datadog/ci/configuration/components.rb | 12 +++-- lib/datadog/ci/remote/component.rb | 45 ++++++++++++++++ lib/datadog/ci/test_visibility/component.rb | 32 +++-------- sig/datadog/ci/configuration/components.rbs | 2 + sig/datadog/ci/remote/component.rbs | 18 +++++++ sig/datadog/ci/test_visibility/component.rbs | 5 +- .../knapsack_rspec_go/instrumentation_spec.rb | 4 ++ spec/datadog/ci/remote/component_spec.rb | 54 +++++++++++++++++++ 8 files changed, 141 insertions(+), 31 deletions(-) create mode 100644 lib/datadog/ci/remote/component.rb create mode 100644 sig/datadog/ci/remote/component.rbs create mode 100644 spec/datadog/ci/remote/component_spec.rb diff --git a/lib/datadog/ci/configuration/components.rb b/lib/datadog/ci/configuration/components.rb index 5ee588de..aae79244 100644 --- a/lib/datadog/ci/configuration/components.rb +++ b/lib/datadog/ci/configuration/components.rb @@ -4,6 +4,7 @@ require_relative "../ext/settings" require_relative "../git/tree_uploader" +require_relative "../remote/component" require_relative "../test_optimisation/component" require_relative "../test_optimisation/coverage/transport" require_relative "../test_optimisation/coverage/writer" @@ -26,12 +27,13 @@ module CI module Configuration # Adds CI behavior to Datadog trace components module Components - attr_reader :test_visibility, :test_optimisation, :git_tree_upload_worker + attr_reader :test_visibility, :test_optimisation, :git_tree_upload_worker, :ci_remote def initialize(settings) @test_optimisation = nil @test_visibility = TestVisibility::NullComponent.new @git_tree_upload_worker = DummyWorker.new + @ci_remote = nil # Activate CI mode if enabled if settings.ci.enabled @@ -105,13 +107,13 @@ def activate_ci!(settings) settings.tracing.test_mode.writer_options = trace_writer_options @git_tree_upload_worker = build_git_upload_worker(settings, test_visibility_api) - + @ci_remote = Remote::Component.new( + library_settings_api: build_remote_settings_client(settings, test_visibility_api) + ) # @type ivar @test_optimisation: Datadog::CI::TestOptimisation::Component @test_optimisation = build_test_optimisation(settings, test_visibility_api) - @test_visibility = TestVisibility::Component.new( - test_suite_level_visibility_enabled: !settings.ci.force_test_level_visibility, - remote_settings_api: build_remote_settings_client(settings, test_visibility_api) + test_suite_level_visibility_enabled: !settings.ci.force_test_level_visibility ) end diff --git a/lib/datadog/ci/remote/component.rb b/lib/datadog/ci/remote/component.rb new file mode 100644 index 00000000..67d601fe --- /dev/null +++ b/lib/datadog/ci/remote/component.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +module Datadog + module CI + module Remote + # Remote configuration component. + # Responsible for fetching library settings and configuring the library accordingly. + class Component + def initialize(library_settings_api:) + @library_settings_api = library_settings_api + end + + # called on test session start, uses test session info to send configuration request to the backend + def configure(test_session) + library_configuration = @library_settings_api.fetch_library_settings(test_session) + # sometimes we can skip code coverage for default branch if there are no changes in the repository + # backend needs git metadata uploaded for this test session to check if we can skip code coverage + if library_configuration.require_git? + Datadog.logger.debug { "Library configuration endpoint requires git upload to be finished, waiting..." } + git_tree_upload_worker.wait_until_done + + Datadog.logger.debug { "Requesting library configuration again..." } + library_configuration = @library_settings_api.fetch_library_settings(test_session) + + if library_configuration.require_git? + Datadog.logger.debug { "git metadata upload did not complete in time when configuring library" } + end + end + + test_optimisation.configure(library_configuration, test_session) + end + + private + + def test_optimisation + Datadog.send(:components).test_optimisation + end + + def git_tree_upload_worker + Datadog.send(:components).git_tree_upload_worker + end + end + end + end +end diff --git a/lib/datadog/ci/test_visibility/component.rb b/lib/datadog/ci/test_visibility/component.rb index 75814f13..750d0edc 100644 --- a/lib/datadog/ci/test_visibility/component.rb +++ b/lib/datadog/ci/test_visibility/component.rb @@ -20,14 +20,12 @@ class Component attr_reader :test_suite_level_visibility_enabled def initialize( - remote_settings_api:, test_suite_level_visibility_enabled: false, codeowners: Codeowners::Parser.new(Git::LocalRepository.root).parse ) @test_suite_level_visibility_enabled = test_suite_level_visibility_enabled @context = Context.new @codeowners = codeowners - @remote_settings_api = remote_settings_api end def start_test_session(service: nil, tags: {}) @@ -150,7 +148,7 @@ def on_test_session_started(test_session) Telemetry.event_created(test_session) # signal Remote::Component to configure the library - configure_library(test_session) + remote.configure(test_session) end def on_test_module_started(test_module) @@ -165,8 +163,8 @@ def on_test_started(test) # sometimes test suite is not being assigned correctly # fix it by fetching the one single running test suite from the global context fix_test_suite!(test) if test.test_suite_id.nil? - validate_test_suite_level_visibility_correctness(test) + set_codeowners(test) Telemetry.event_created(test) @@ -196,26 +194,6 @@ def on_test_finished(test) Telemetry.event_finished(test) end - # TODO: move this to CI::Configuration::Remote - def configure_library(test_session) - remote_configuration = @remote_settings_api.fetch_library_settings(test_session) - # sometimes we can skip code coverage for default branch if there are no changes in the repository - # backend needs git metadata uploaded for this test session to check if we can skip code coverage - if remote_configuration.require_git? - Datadog.logger.debug { "Library configuration endpoint requires git upload to be finished, waiting..." } - git_tree_upload_worker.wait_until_done - - Datadog.logger.debug { "Requesting library configuration again..." } - remote_configuration = @remote_settings_api.fetch_library_settings(test_session) - - if remote_configuration.require_git? - Datadog.logger.debug { "git metadata upload did not complete in time when configuring library" } - end - end - - test_optimisation.configure(remote_configuration, test_session) - end - # HELPERS def skip_tracing(block = nil) block&.call(nil) @@ -228,6 +206,8 @@ def set_codeowners(test) end def fix_test_suite!(test) + return unless test_suite_level_visibility_enabled + test_suite = @context.single_active_test_suite unless test_suite Datadog.logger.debug do @@ -277,6 +257,10 @@ def test_optimisation def git_tree_upload_worker Datadog.send(:components).git_tree_upload_worker end + + def remote + Datadog.send(:components).ci_remote + end end end end diff --git a/sig/datadog/ci/configuration/components.rbs b/sig/datadog/ci/configuration/components.rbs index 999f8508..5397cbcd 100644 --- a/sig/datadog/ci/configuration/components.rbs +++ b/sig/datadog/ci/configuration/components.rbs @@ -5,11 +5,13 @@ module Datadog @test_visibility: Datadog::CI::TestVisibility::Component | Datadog::CI::TestVisibility::NullComponent @test_optimisation: Datadog::CI::TestOptimisation::Component? @git_tree_upload_worker: Datadog::CI::Worker + @ci_remote: Datadog::CI::Remote::Component @custom_configuration: Hash[String, String] attr_reader test_visibility: Datadog::CI::TestVisibility::Component | Datadog::CI::TestVisibility::NullComponent attr_reader test_optimisation: Datadog::CI::TestOptimisation::Component? attr_reader git_tree_upload_worker: Datadog::CI::Worker + attr_reader ci_remote: Datadog::CI::Remote::Component def initialize: (untyped settings) -> void diff --git a/sig/datadog/ci/remote/component.rbs b/sig/datadog/ci/remote/component.rbs new file mode 100644 index 00000000..f4d2201a --- /dev/null +++ b/sig/datadog/ci/remote/component.rbs @@ -0,0 +1,18 @@ +module Datadog + module CI + module Remote + class Component + @library_settings_api: Datadog::CI::Transport::RemoteSettingsApi + + def initialize: (library_settings_api: Datadog::CI::Transport::RemoteSettingsApi) -> void + def configure: (Datadog::CI::TestSession test_session) -> untyped + + private + + def test_optimisation: () -> Datadog::CI::TestOptimisation::Component + + def git_tree_upload_worker: () -> Datadog::CI::Worker + end + end + end +end diff --git a/sig/datadog/ci/test_visibility/component.rbs b/sig/datadog/ci/test_visibility/component.rbs index 6b890723..519302e8 100644 --- a/sig/datadog/ci/test_visibility/component.rbs +++ b/sig/datadog/ci/test_visibility/component.rbs @@ -4,13 +4,12 @@ module Datadog class Component @test_suite_level_visibility_enabled: bool - @remote_settings_api: Datadog::CI::Transport::RemoteSettingsApi @codeowners: Datadog::CI::Codeowners::Matcher @context: Datadog::CI::TestVisibility::Context attr_reader test_suite_level_visibility_enabled: bool - def initialize: (?test_suite_level_visibility_enabled: bool, ?codeowners: Datadog::CI::Codeowners::Matcher, remote_settings_api: Datadog::CI::Transport::RemoteSettingsApi) -> void + def initialize: (?test_suite_level_visibility_enabled: bool, ?codeowners: Datadog::CI::Codeowners::Matcher) -> void def trace_test: (String span_name, String test_suite_name, ?service: String?, ?tags: Hash[untyped, untyped]) ?{ (Datadog::CI::Test span) -> untyped } -> untyped @@ -77,6 +76,8 @@ module Datadog def test_optimisation: () -> Datadog::CI::TestOptimisation::Component def git_tree_upload_worker: () -> Datadog::CI::Worker + + def remote: () -> Datadog::CI::Remote::Component end end end diff --git a/spec/datadog/ci/contrib/knapsack_rspec_go/instrumentation_spec.rb b/spec/datadog/ci/contrib/knapsack_rspec_go/instrumentation_spec.rb index 61f3dd1b..ffb69f7e 100644 --- a/spec/datadog/ci/contrib/knapsack_rspec_go/instrumentation_spec.rb +++ b/spec/datadog/ci/contrib/knapsack_rspec_go/instrumentation_spec.rb @@ -10,6 +10,10 @@ expect(Datadog::CI).to receive(:start_test).never end + include_context "CI mode activated" do + let(:integration_name) { :rspec } + end + # Yields to a block in a new RSpec global context. All RSpec # test configuration and execution should be wrapped in this method. def with_new_rspec_environment diff --git a/spec/datadog/ci/remote/component_spec.rb b/spec/datadog/ci/remote/component_spec.rb new file mode 100644 index 00000000..27db4562 --- /dev/null +++ b/spec/datadog/ci/remote/component_spec.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +require_relative "../../../../lib/datadog/ci/remote/component" + +RSpec.describe Datadog::CI::Remote::Component do + subject(:component) { described_class.new(library_settings_api: library_settings_api) } + + let(:library_settings_api) { instance_double(Datadog::CI::Transport::RemoteSettingsApi) } + let(:git_tree_upload_worker) { instance_double(Datadog::CI::Worker) } + let(:test_optimisation) { instance_double(Datadog::CI::TestOptimisation::Component) } + + before do + allow(Datadog.send(:components)).to receive(:git_tree_upload_worker).and_return(git_tree_upload_worker) + allow(Datadog.send(:components)).to receive(:test_optimisation).and_return(test_optimisation) + end + + describe "#configure" do + subject { component.configure(test_session) } + + let(:test_session) { instance_double(Datadog::CI::TestSession) } + let(:library_configuration) do + instance_double(Datadog::CI::Transport::RemoteSettingsApi::Response, require_git?: require_git) + end + + before do + expect(library_settings_api).to receive(:fetch_library_settings) + .with(test_session).and_return(library_configuration).once + end + + context "git upload is not required" do + let(:require_git) { false } + + before do + expect(test_optimisation).to receive(:configure).with(library_configuration, test_session) + end + + it { subject } + end + + context "git upload is required" do + let(:require_git) { true } + + before do + expect(git_tree_upload_worker).to receive(:wait_until_done) + expect(library_settings_api).to receive(:fetch_library_settings) + .with(test_session).and_return(library_configuration) + + expect(test_optimisation).to receive(:configure).with(library_configuration, test_session) + end + + it { subject } + end + end +end From 1ea8effd0be084c90e206b6131f0ad2e5e8aa471 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 30 Jul 2024 16:37:58 +0200 Subject: [PATCH 10/10] move remote settings API to remote component --- lib/datadog/ci/configuration/components.rb | 8 +- lib/datadog/ci/remote/component.rb | 8 +- lib/datadog/ci/remote/library_settings.rb | 85 +++++++++++++++++ .../library_settings_client.rb} | 91 +++---------------- sig/datadog/ci/configuration/components.rbs | 2 +- sig/datadog/ci/remote/component.rbs | 5 +- sig/datadog/ci/remote/library_settings.rbs | 35 +++++++ .../ci/remote/library_settings_client.rbs | 19 ++++ .../ci/test_optimisation/component.rbs | 2 +- .../ci/transport/remote_settings_api.rbs | 49 ---------- spec/datadog/ci/remote/component_spec.rb | 10 +- .../library_settings_client_spec.rb} | 10 +- spec/support/contexts/ci_mode.rb | 6 +- 13 files changed, 176 insertions(+), 154 deletions(-) create mode 100644 lib/datadog/ci/remote/library_settings.rb rename lib/datadog/ci/{transport/remote_settings_api.rb => remote/library_settings_client.rb} (51%) create mode 100644 sig/datadog/ci/remote/library_settings.rbs create mode 100644 sig/datadog/ci/remote/library_settings_client.rbs delete mode 100644 sig/datadog/ci/transport/remote_settings_api.rbs rename spec/datadog/ci/{transport/remote_settings_api_spec.rb => remote/library_settings_client_spec.rb} (95%) diff --git a/lib/datadog/ci/configuration/components.rb b/lib/datadog/ci/configuration/components.rb index aae79244..818cf802 100644 --- a/lib/datadog/ci/configuration/components.rb +++ b/lib/datadog/ci/configuration/components.rb @@ -5,6 +5,7 @@ require_relative "../ext/settings" require_relative "../git/tree_uploader" require_relative "../remote/component" +require_relative "../remote/library_settings_client" require_relative "../test_optimisation/component" require_relative "../test_optimisation/coverage/transport" require_relative "../test_optimisation/coverage/writer" @@ -16,7 +17,6 @@ require_relative "../test_visibility/transport" require_relative "../transport/adapters/telemetry_webmock_safe_adapter" require_relative "../transport/api/builder" -require_relative "../transport/remote_settings_api" require_relative "../utils/identity" require_relative "../utils/parsing" require_relative "../utils/test_run" @@ -108,7 +108,7 @@ def activate_ci!(settings) @git_tree_upload_worker = build_git_upload_worker(settings, test_visibility_api) @ci_remote = Remote::Component.new( - library_settings_api: build_remote_settings_client(settings, test_visibility_api) + library_settings_client: build_library_settings_client(settings, test_visibility_api) ) # @type ivar @test_optimisation: Datadog::CI::TestOptimisation::Component @test_optimisation = build_test_optimisation(settings, test_visibility_api) @@ -220,8 +220,8 @@ def build_git_upload_worker(settings, api) end end - def build_remote_settings_client(settings, api) - Transport::RemoteSettingsApi.new( + def build_library_settings_client(settings, api) + Remote::LibrarySettingsClient.new( api: api, dd_env: settings.env, config_tags: custom_configuration(settings) diff --git a/lib/datadog/ci/remote/component.rb b/lib/datadog/ci/remote/component.rb index 67d601fe..5bff528c 100644 --- a/lib/datadog/ci/remote/component.rb +++ b/lib/datadog/ci/remote/component.rb @@ -6,13 +6,13 @@ module Remote # Remote configuration component. # Responsible for fetching library settings and configuring the library accordingly. class Component - def initialize(library_settings_api:) - @library_settings_api = library_settings_api + def initialize(library_settings_client:) + @library_settings_client = library_settings_client end # called on test session start, uses test session info to send configuration request to the backend def configure(test_session) - library_configuration = @library_settings_api.fetch_library_settings(test_session) + library_configuration = @library_settings_client.fetch(test_session) # sometimes we can skip code coverage for default branch if there are no changes in the repository # backend needs git metadata uploaded for this test session to check if we can skip code coverage if library_configuration.require_git? @@ -20,7 +20,7 @@ def configure(test_session) git_tree_upload_worker.wait_until_done Datadog.logger.debug { "Requesting library configuration again..." } - library_configuration = @library_settings_api.fetch_library_settings(test_session) + library_configuration = @library_settings_client.fetch(test_session) if library_configuration.require_git? Datadog.logger.debug { "git metadata upload did not complete in time when configuring library" } diff --git a/lib/datadog/ci/remote/library_settings.rb b/lib/datadog/ci/remote/library_settings.rb new file mode 100644 index 00000000..05e25f8b --- /dev/null +++ b/lib/datadog/ci/remote/library_settings.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: true + +require "json" + +require_relative "../ext/telemetry" +require_relative "../ext/transport" +require_relative "../transport/telemetry" +require_relative "../utils/parsing" + +module Datadog + module CI + module Remote + # Wrapper around the settings HTTP response + class LibrarySettings + def initialize(http_response) + @http_response = http_response + @json = nil + end + + def ok? + resp = @http_response + !resp.nil? && resp.ok? + end + + def payload + cached = @json + return cached unless cached.nil? + + resp = @http_response + return @json = default_payload if resp.nil? || !ok? + + begin + @json = JSON.parse(resp.payload).dig(*Ext::Transport::DD_API_SETTINGS_RESPONSE_DIG_KEYS) || + default_payload + rescue JSON::ParserError => e + Datadog.logger.error("Failed to parse settings response payload: #{e}. Payload was: #{resp.payload}") + + Transport::Telemetry.api_requests_errors( + Ext::Telemetry::METRIC_GIT_REQUESTS_SETTINGS_ERRORS, + 1, + error_type: "invalid_json", + status_code: nil + ) + + @json = default_payload + end + end + + def require_git? + return @require_git if defined?(@require_git) + + @require_git = bool(Ext::Transport::DD_API_SETTINGS_RESPONSE_REQUIRE_GIT_KEY) + end + + def itr_enabled? + return @itr_enabled if defined?(@itr_enabled) + + @itr_enabled = bool(Ext::Transport::DD_API_SETTINGS_RESPONSE_ITR_ENABLED_KEY) + end + + def code_coverage_enabled? + return @code_coverage_enabled if defined?(@code_coverage_enabled) + + @code_coverage_enabled = bool(Ext::Transport::DD_API_SETTINGS_RESPONSE_CODE_COVERAGE_KEY) + end + + def tests_skipping_enabled? + return @tests_skipping_enabled if defined?(@tests_skipping_enabled) + + @tests_skipping_enabled = bool(Ext::Transport::DD_API_SETTINGS_RESPONSE_TESTS_SKIPPING_KEY) + end + + private + + def bool(key) + Utils::Parsing.convert_to_bool(payload.fetch(key, false)) + end + + def default_payload + Ext::Transport::DD_API_SETTINGS_RESPONSE_DEFAULT + end + end + end + end +end diff --git a/lib/datadog/ci/transport/remote_settings_api.rb b/lib/datadog/ci/remote/library_settings_client.rb similarity index 51% rename from lib/datadog/ci/transport/remote_settings_api.rb rename to lib/datadog/ci/remote/library_settings_client.rb index b951c296..43c70131 100644 --- a/lib/datadog/ci/transport/remote_settings_api.rb +++ b/lib/datadog/ci/remote/library_settings_client.rb @@ -4,97 +4,28 @@ require "datadog/core/environment/identity" +require_relative "library_settings" + +require_relative "../ext/test" require_relative "../ext/telemetry" require_relative "../ext/transport" require_relative "../transport/telemetry" -require_relative "../utils/parsing" require_relative "../utils/telemetry" module Datadog module CI - module Transport - # Datadog API client + module Remote # Calls settings endpoint to fetch library settings for given service and env - class RemoteSettingsApi - class Response - def initialize(http_response) - @http_response = http_response - @json = nil - end - - def ok? - resp = @http_response - !resp.nil? && resp.ok? - end - - def payload - cached = @json - return cached unless cached.nil? - - resp = @http_response - return @json = default_payload if resp.nil? || !ok? - - begin - @json = JSON.parse(resp.payload).dig(*Ext::Transport::DD_API_SETTINGS_RESPONSE_DIG_KEYS) || - default_payload - rescue JSON::ParserError => e - Datadog.logger.error("Failed to parse settings response payload: #{e}. Payload was: #{resp.payload}") - - Transport::Telemetry.api_requests_errors( - Ext::Telemetry::METRIC_GIT_REQUESTS_SETTINGS_ERRORS, - 1, - error_type: "invalid_json", - status_code: nil - ) - - @json = default_payload - end - end - - def require_git? - return @require_git if defined?(@require_git) - - @require_git = bool(Ext::Transport::DD_API_SETTINGS_RESPONSE_REQUIRE_GIT_KEY) - end - - def itr_enabled? - return @itr_enabled if defined?(@itr_enabled) - - @itr_enabled = bool(Ext::Transport::DD_API_SETTINGS_RESPONSE_ITR_ENABLED_KEY) - end - - def code_coverage_enabled? - return @code_coverage_enabled if defined?(@code_coverage_enabled) - - @code_coverage_enabled = bool(Ext::Transport::DD_API_SETTINGS_RESPONSE_CODE_COVERAGE_KEY) - end - - def tests_skipping_enabled? - return @tests_skipping_enabled if defined?(@tests_skipping_enabled) - - @tests_skipping_enabled = bool(Ext::Transport::DD_API_SETTINGS_RESPONSE_TESTS_SKIPPING_KEY) - end - - private - - def bool(key) - Utils::Parsing.convert_to_bool(payload.fetch(key, false)) - end - - def default_payload - Ext::Transport::DD_API_SETTINGS_RESPONSE_DEFAULT - end - end - + class LibrarySettingsClient def initialize(dd_env:, api: nil, config_tags: {}) @api = api @dd_env = dd_env @config_tags = config_tags || {} end - def fetch_library_settings(test_session) + def fetch(test_session) api = @api - return Response.new(nil) unless api + return LibrarySettings.new(nil) unless api request_payload = payload(test_session) Datadog.logger.debug("Fetching library settings with request: #{request_payload}") @@ -120,18 +51,18 @@ def fetch_library_settings(test_session) ) end - response = Response.new(http_response) + library_settings = LibrarySettings.new(http_response) Utils::Telemetry.inc( Ext::Telemetry::METRIC_GIT_REQUESTS_SETTINGS_RESPONSE, 1, { - Ext::Telemetry::TAG_COVERAGE_ENABLED => response.code_coverage_enabled?.to_s, - Ext::Telemetry::TAG_ITR_SKIP_ENABLED => response.tests_skipping_enabled?.to_s + Ext::Telemetry::TAG_COVERAGE_ENABLED => library_settings.code_coverage_enabled?.to_s, + Ext::Telemetry::TAG_ITR_SKIP_ENABLED => library_settings.tests_skipping_enabled?.to_s } ) - response + library_settings end private diff --git a/sig/datadog/ci/configuration/components.rbs b/sig/datadog/ci/configuration/components.rbs index 5397cbcd..64d870be 100644 --- a/sig/datadog/ci/configuration/components.rbs +++ b/sig/datadog/ci/configuration/components.rbs @@ -31,7 +31,7 @@ module Datadog def build_git_upload_worker: (untyped settings, Datadog::CI::Transport::Api::Base? api) -> Datadog::CI::Worker - def build_remote_settings_client: (untyped settings, Datadog::CI::Transport::Api::Base? api) -> Datadog::CI::Transport::RemoteSettingsApi + def build_library_settings_client: (untyped settings, Datadog::CI::Transport::Api::Base? api) -> Datadog::CI::Remote::LibrarySettingsClient def custom_configuration: (untyped settings) -> Hash[String, String] diff --git a/sig/datadog/ci/remote/component.rbs b/sig/datadog/ci/remote/component.rbs index f4d2201a..07c590d2 100644 --- a/sig/datadog/ci/remote/component.rbs +++ b/sig/datadog/ci/remote/component.rbs @@ -2,9 +2,10 @@ module Datadog module CI module Remote class Component - @library_settings_api: Datadog::CI::Transport::RemoteSettingsApi + @library_settings_client: Datadog::CI::Remote::LibrarySettingsClient + + def initialize: (library_settings_client: Datadog::CI::Remote::LibrarySettingsClient) -> void - def initialize: (library_settings_api: Datadog::CI::Transport::RemoteSettingsApi) -> void def configure: (Datadog::CI::TestSession test_session) -> untyped private diff --git a/sig/datadog/ci/remote/library_settings.rbs b/sig/datadog/ci/remote/library_settings.rbs new file mode 100644 index 00000000..329fcdda --- /dev/null +++ b/sig/datadog/ci/remote/library_settings.rbs @@ -0,0 +1,35 @@ +module Datadog + module CI + module Remote + class LibrarySettings + @http_response: Datadog::CI::Transport::Adapters::Net::Response? + @json: Hash[String, untyped]? + + @require_git: bool + @itr_enabled: bool + @code_coverage_enabled: bool + @tests_skipping_enabled: bool + + def initialize: (Datadog::CI::Transport::Adapters::Net::Response? http_response) -> void + + def ok?: () -> bool + + def payload: () -> Hash[String, untyped] + + def require_git?: () -> bool + + def itr_enabled?: () -> bool + + def code_coverage_enabled?: () -> bool + + def tests_skipping_enabled?: () -> bool + + private + + def bool: (String key) -> bool + + def default_payload: () -> Hash[String, untyped] + end + end + end +end diff --git a/sig/datadog/ci/remote/library_settings_client.rbs b/sig/datadog/ci/remote/library_settings_client.rbs new file mode 100644 index 00000000..4bce6baf --- /dev/null +++ b/sig/datadog/ci/remote/library_settings_client.rbs @@ -0,0 +1,19 @@ +module Datadog + module CI + module Remote + class LibrarySettingsClient + @api: Datadog::CI::Transport::Api::Base? + @dd_env: String? + @config_tags: Hash[String, String] + + def initialize: (?api: Datadog::CI::Transport::Api::Base?, dd_env: String?, ?config_tags: Hash[String, String]?) -> void + + def fetch: (Datadog::CI::TestSession test_session) -> LibrarySettings + + private + + def payload: (Datadog::CI::TestSession test_session) -> String + end + end + end +end diff --git a/sig/datadog/ci/test_optimisation/component.rbs b/sig/datadog/ci/test_optimisation/component.rbs index e26bc5ca..0cf5ca5a 100644 --- a/sig/datadog/ci/test_optimisation/component.rbs +++ b/sig/datadog/ci/test_optimisation/component.rbs @@ -28,7 +28,7 @@ module Datadog def initialize: (dd_env: String?, ?enabled: bool, ?coverage_writer: Datadog::CI::TestOptimisation::Coverage::Writer?, ?api: Datadog::CI::Transport::Api::Base?, ?config_tags: Hash[String, String]?, ?bundle_location: String?, ?use_single_threaded_coverage: bool, ?use_allocation_tracing: bool) -> void - def configure: (Datadog::CI::Transport::RemoteSettingsApi::Response remote_configuration, Datadog::CI::TestSession test_session) -> void + def configure: (Datadog::CI::Remote::LibrarySettings remote_configuration, Datadog::CI::TestSession test_session) -> void def enabled?: () -> bool diff --git a/sig/datadog/ci/transport/remote_settings_api.rbs b/sig/datadog/ci/transport/remote_settings_api.rbs deleted file mode 100644 index 8c1c661f..00000000 --- a/sig/datadog/ci/transport/remote_settings_api.rbs +++ /dev/null @@ -1,49 +0,0 @@ -module Datadog - module CI - module Transport - class RemoteSettingsApi - class Response - @http_response: Datadog::CI::Transport::Adapters::Net::Response? - @json: Hash[String, untyped]? - - @require_git: bool - @itr_enabled: bool - @code_coverage_enabled: bool - @tests_skipping_enabled: bool - - def initialize: (Datadog::CI::Transport::Adapters::Net::Response? http_response) -> void - - def ok?: () -> bool - - def payload: () -> Hash[String, untyped] - - def require_git?: () -> bool - - def itr_enabled?: () -> bool - - def code_coverage_enabled?: () -> bool - - def tests_skipping_enabled?: () -> bool - - private - - def bool: (String key) -> bool - - def default_payload: () -> Hash[String, untyped] - end - - @api: Datadog::CI::Transport::Api::Base? - @dd_env: String? - @config_tags: Hash[String, String] - - def initialize: (?api: Datadog::CI::Transport::Api::Base?, dd_env: String?, ?config_tags: Hash[String, String]?) -> void - - def fetch_library_settings: (Datadog::CI::TestSession test_session) -> Response - - private - - def payload: (Datadog::CI::TestSession test_session) -> String - end - end - end -end diff --git a/spec/datadog/ci/remote/component_spec.rb b/spec/datadog/ci/remote/component_spec.rb index 27db4562..cf7b63e7 100644 --- a/spec/datadog/ci/remote/component_spec.rb +++ b/spec/datadog/ci/remote/component_spec.rb @@ -3,9 +3,9 @@ require_relative "../../../../lib/datadog/ci/remote/component" RSpec.describe Datadog::CI::Remote::Component do - subject(:component) { described_class.new(library_settings_api: library_settings_api) } + subject(:component) { described_class.new(library_settings_client: library_settings_client) } - let(:library_settings_api) { instance_double(Datadog::CI::Transport::RemoteSettingsApi) } + let(:library_settings_client) { instance_double(Datadog::CI::Remote::LibrarySettingsClient) } let(:git_tree_upload_worker) { instance_double(Datadog::CI::Worker) } let(:test_optimisation) { instance_double(Datadog::CI::TestOptimisation::Component) } @@ -19,11 +19,11 @@ let(:test_session) { instance_double(Datadog::CI::TestSession) } let(:library_configuration) do - instance_double(Datadog::CI::Transport::RemoteSettingsApi::Response, require_git?: require_git) + instance_double(Datadog::CI::Remote::LibrarySettings, require_git?: require_git) end before do - expect(library_settings_api).to receive(:fetch_library_settings) + expect(library_settings_client).to receive(:fetch) .with(test_session).and_return(library_configuration).once end @@ -42,7 +42,7 @@ before do expect(git_tree_upload_worker).to receive(:wait_until_done) - expect(library_settings_api).to receive(:fetch_library_settings) + expect(library_settings_client).to receive(:fetch) .with(test_session).and_return(library_configuration) expect(test_optimisation).to receive(:configure).with(library_configuration, test_session) diff --git a/spec/datadog/ci/transport/remote_settings_api_spec.rb b/spec/datadog/ci/remote/library_settings_client_spec.rb similarity index 95% rename from spec/datadog/ci/transport/remote_settings_api_spec.rb rename to spec/datadog/ci/remote/library_settings_client_spec.rb index f6c469d4..98bc3a4b 100644 --- a/spec/datadog/ci/transport/remote_settings_api_spec.rb +++ b/spec/datadog/ci/remote/library_settings_client_spec.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true -require_relative "../../../../lib/datadog/ci/transport/remote_settings_api" +require_relative "../../../../lib/datadog/ci/remote/library_settings_client" -RSpec.describe Datadog::CI::Transport::RemoteSettingsApi do +RSpec.describe Datadog::CI::Remote::LibrarySettingsClient do include_context "Telemetry spy" let(:api) { spy("api") } @@ -11,8 +11,8 @@ subject(:client) { described_class.new(api: api, dd_env: dd_env, config_tags: config_tags) } - describe "#fetch_library_settings" do - subject { client.fetch_library_settings(test_session) } + describe "#fetch" do + subject { client.fetch(test_session) } let(:service) { "service" } let(:tracer_span) do @@ -62,7 +62,7 @@ end context "parsing response" do - subject(:response) { client.fetch_library_settings(test_session) } + subject(:response) { client.fetch(test_session) } context "when api is present" do before do diff --git a/spec/support/contexts/ci_mode.rb b/spec/support/contexts/ci_mode.rb index 55b645ba..21a69b92 100644 --- a/spec/support/contexts/ci_mode.rb +++ b/spec/support/contexts/ci_mode.rb @@ -50,9 +50,9 @@ allow(Datadog::CI::Utils::TestRun).to receive(:command).and_return(test_command) - allow_any_instance_of(Datadog::CI::Transport::RemoteSettingsApi).to receive(:fetch_library_settings).and_return( + allow_any_instance_of(Datadog::CI::Remote::LibrarySettingsClient).to receive(:fetch).and_return( instance_double( - Datadog::CI::Transport::RemoteSettingsApi::Response, + Datadog::CI::Remote::LibrarySettings, payload: { "itr_enabled" => itr_enabled, "code_coverage" => code_coverage_enabled, @@ -65,7 +65,7 @@ ), # This is for the second call to fetch_library_settings instance_double( - Datadog::CI::Transport::RemoteSettingsApi::Response, + Datadog::CI::Remote::LibrarySettings, payload: { "itr_enabled" => itr_enabled, "code_coverage" => !code_coverage_enabled,