diff --git a/Rakefile b/Rakefile index d842a7b3..9eca661a 100644 --- a/Rakefile +++ b/Rakefile @@ -68,7 +68,7 @@ TEST_METADATA = { "knapsack_pro-7-rspec-3" => "✅ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ 3.4 / ❌ jruby" }, "selenium" => { - "selenium-4-capybara-3" => "❌ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ❌ 3.4 / ✅ jruby" + "selenium-4-capybara-3" => "❌ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ 3.4 / ✅ jruby" }, "timecop" => { "timecop-0" => "✅ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ 3.4 / ✅ jruby" diff --git a/lib/datadog/ci/contrib/selenium/capybara_driver.rb b/lib/datadog/ci/contrib/selenium/capybara_driver.rb index 5dd671ce..6b74bab8 100644 --- a/lib/datadog/ci/contrib/selenium/capybara_driver.rb +++ b/lib/datadog/ci/contrib/selenium/capybara_driver.rb @@ -2,9 +2,9 @@ require_relative "../patcher" -require_relative "ext" -require_relative "rum" +require_relative "../../ext/rum" require_relative "../../ext/test" +require_relative "../../utils/rum" module Datadog module CI @@ -22,10 +22,10 @@ def reset! Datadog.logger.debug("[Selenium] Capybara session reset event") - RUM.stop_rum_session(@browser) + Utils::RUM.stop_rum_session(@browser) Datadog.logger.debug("[Selenium] RUM session stopped, deleting cookie") - @browser.manage.delete_cookie(Ext::COOKIE_TEST_EXECUTION_ID) + @browser.manage.delete_cookie(CI::Ext::RUM::COOKIE_TEST_EXECUTION_ID) rescue ::Selenium::WebDriver::Error::WebDriverError => e Datadog.logger.debug("[Selenium] Error while resetting Capybara session: #{e.message}") ensure diff --git a/lib/datadog/ci/contrib/selenium/configuration/settings.rb b/lib/datadog/ci/contrib/selenium/configuration/settings.rb index bce29ad1..cdfd202f 100644 --- a/lib/datadog/ci/contrib/selenium/configuration/settings.rb +++ b/lib/datadog/ci/contrib/selenium/configuration/settings.rb @@ -5,6 +5,8 @@ require_relative "../ext" require_relative "../../settings" +require_relative "../../../ext/rum" + module Datadog module CI module Contrib @@ -21,7 +23,7 @@ class Settings < Datadog::CI::Contrib::Settings option :rum_flush_wait_millis do |o| o.type :int - o.env Ext::ENV_RUM_FLUSH_WAIT_MILLIS + o.env CI::Ext::RUM::ENV_RUM_FLUSH_WAIT_MILLIS o.default 500 end end diff --git a/lib/datadog/ci/contrib/selenium/driver.rb b/lib/datadog/ci/contrib/selenium/driver.rb index 75a2757c..90d4d83f 100644 --- a/lib/datadog/ci/contrib/selenium/driver.rb +++ b/lib/datadog/ci/contrib/selenium/driver.rb @@ -2,8 +2,8 @@ require_relative "../patcher" -require_relative "ext" -require_relative "rum" +require_relative "../../utils/rum" +require_relative "../../ext/rum" require_relative "../../ext/test" module Datadog @@ -22,10 +22,10 @@ def quit Datadog.logger.debug("[Selenium] Driver quit event") - RUM.stop_rum_session(@bridge) + Utils::RUM.stop_rum_session(@bridge) Datadog.logger.debug("[Selenium] RUM session stopped, deleting cookie") - @bridge.manage.delete_cookie(Ext::COOKIE_TEST_EXECUTION_ID) + @bridge.manage.delete_cookie(CI::Ext::RUM::COOKIE_TEST_EXECUTION_ID) rescue ::Selenium::WebDriver::Error::WebDriverError => e Datadog.logger.debug("[Selenium] Error while quitting Selenium driver: #{e.message}") ensure diff --git a/lib/datadog/ci/contrib/selenium/ext.rb b/lib/datadog/ci/contrib/selenium/ext.rb index 4e6aae8f..47452b90 100644 --- a/lib/datadog/ci/contrib/selenium/ext.rb +++ b/lib/datadog/ci/contrib/selenium/ext.rb @@ -8,21 +8,6 @@ module Selenium # @public_api module Ext ENV_ENABLED = "DD_CIVISIBILITY_SELENIUM_ENABLED" - ENV_RUM_FLUSH_WAIT_MILLIS = "DD_CIVISIBILITY_RUM_FLUSH_WAIT_MILLIS" - - COOKIE_TEST_EXECUTION_ID = "datadog-ci-visibility-test-execution-id" - - SCRIPT_IS_RUM_ACTIVE = <<~JS - return !!window.DD_RUM - JS - SCRIPT_STOP_RUM_SESSION = <<~JS - if (window.DD_RUM && window.DD_RUM.stopSession) { - window.DD_RUM.stopSession(); - return true; - } else { - return false; - } - JS end end end diff --git a/lib/datadog/ci/contrib/selenium/navigation.rb b/lib/datadog/ci/contrib/selenium/navigation.rb index dd76b92f..187bfd5c 100644 --- a/lib/datadog/ci/contrib/selenium/navigation.rb +++ b/lib/datadog/ci/contrib/selenium/navigation.rb @@ -2,7 +2,7 @@ require_relative "../patcher" -require_relative "ext" +require_relative "../../ext/rum" require_relative "../../ext/test" module Datadog @@ -32,7 +32,7 @@ def to(url) return result unless active_test # Set the test's trace id as a cookie in browser session - cookie_hash = {name: Ext::COOKIE_TEST_EXECUTION_ID, value: active_test.trace_id.to_s} + cookie_hash = {name: CI::Ext::RUM::COOKIE_TEST_EXECUTION_ID, value: active_test.trace_id.to_s} Datadog.logger.debug { "[Selenium] Setting cookie: #{cookie_hash}" } @bridge.manage.add_cookie(cookie_hash) diff --git a/lib/datadog/ci/contrib/selenium/rum.rb b/lib/datadog/ci/contrib/selenium/rum.rb deleted file mode 100644 index f5fb25d4..00000000 --- a/lib/datadog/ci/contrib/selenium/rum.rb +++ /dev/null @@ -1,43 +0,0 @@ -# frozen_string_literal: true - -require_relative "ext" -require_relative "../../ext/test" -require_relative "../../utils/parsing" - -module Datadog - module CI - module Contrib - module Selenium - # Provides functionality to interact with Datadog Real User Monitoring product - # via executing JavaScript code in the browser. - # - # Relevant docs: https://docs.datadoghq.com/real_user_monitoring/browser/ - module RUM - def self.is_rum_active?(script_executor) - is_rum_active_script_result = script_executor.execute_script(Ext::SCRIPT_IS_RUM_ACTIVE) - Datadog.logger.debug { "[Selenium] SCRIPT_IS_RUM_ACTIVE result is #{is_rum_active_script_result.inspect}" } - Utils::Parsing.convert_to_bool(is_rum_active_script_result) - end - - def self.stop_rum_session(script_executor) - config = Datadog.configuration.ci[:selenium] - if is_rum_active?(script_executor) - Datadog::CI.active_test&.set_tag( - CI::Ext::Test::TAG_IS_RUM_ACTIVE, - "true" - ) - - result = script_executor.execute_script(Ext::SCRIPT_STOP_RUM_SESSION) - Datadog.logger.debug { "[Selenium] SCRIPT_STOP_RUM_SESSION result is #{result.inspect}" } - - # introduce a delay to allow the RUM session to be stopped - delay = config[:rum_flush_wait_millis] / 1000.0 - Datadog.logger.debug { "[Selenium] Waiting for #{delay} seconds" } - sleep(delay) - end - end - end - end - end - end -end diff --git a/lib/datadog/ci/ext/rum.rb b/lib/datadog/ci/ext/rum.rb new file mode 100644 index 00000000..3be5d576 --- /dev/null +++ b/lib/datadog/ci/ext/rum.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module Datadog + module CI + module Ext + # Defines constants for Git tags + module RUM + ENV_RUM_FLUSH_WAIT_MILLIS = "DD_CIVISIBILITY_RUM_FLUSH_WAIT_MILLIS" + + COOKIE_TEST_EXECUTION_ID = "datadog-ci-visibility-test-execution-id" + + SCRIPT_IS_RUM_ACTIVE = <<~JS + return !!window.DD_RUM + JS + SCRIPT_STOP_RUM_SESSION = <<~JS + if (window.DD_RUM && window.DD_RUM.stopSession) { + window.DD_RUM.stopSession(); + return true; + } else { + return false; + } + JS + end + end + end +end diff --git a/lib/datadog/ci/utils/rum.rb b/lib/datadog/ci/utils/rum.rb new file mode 100644 index 00000000..0b9c6d6d --- /dev/null +++ b/lib/datadog/ci/utils/rum.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require_relative "../ext/rum" +require_relative "../ext/test" +require_relative "parsing" + +module Datadog + module CI + module Utils + # Provides functionality to interact with Datadog Real User Monitoring product + # via executing JavaScript code in the browser. + # + # Relevant docs: https://docs.datadoghq.com/real_user_monitoring/browser/ + module RUM + def self.is_rum_active?(script_executor) + is_rum_active_script_result = script_executor.execute_script(Ext::RUM::SCRIPT_IS_RUM_ACTIVE) + + Datadog.logger.debug { "[Selenium] SCRIPT_IS_RUM_ACTIVE result is #{is_rum_active_script_result.inspect}" } + + Utils::Parsing.convert_to_bool(is_rum_active_script_result) + end + + def self.stop_rum_session(script_executor) + config = Datadog.configuration.ci[:selenium] + if is_rum_active?(script_executor) + Datadog::CI.active_test&.set_tag( + CI::Ext::Test::TAG_IS_RUM_ACTIVE, + "true" + ) + + result = script_executor.execute_script(Ext::RUM::SCRIPT_STOP_RUM_SESSION) + Datadog.logger.debug { "[RUM] SCRIPT_STOP_RUM_SESSION result is #{result.inspect}" } + + # introduce a delay to allow the RUM session to be stopped + delay = config[:rum_flush_wait_millis] / 1000.0 + Datadog.logger.debug { "[RUM] Waiting for #{delay} seconds" } + sleep(delay) + end + end + end + end + end +end diff --git a/sig/datadog/ci/contrib/selenium/ext.rbs b/sig/datadog/ci/contrib/selenium/ext.rbs index 0b8cdede..a3dce477 100644 --- a/sig/datadog/ci/contrib/selenium/ext.rbs +++ b/sig/datadog/ci/contrib/selenium/ext.rbs @@ -4,14 +4,6 @@ module Datadog module Selenium module Ext ENV_ENABLED: "DD_CIVISIBILITY_SELENIUM_ENABLED" - - ENV_RUM_FLUSH_WAIT_MILLIS: "DD_CIVISIBILITY_RUM_FLUSH_WAIT_MILLIS" - - COOKIE_TEST_EXECUTION_ID: "datadog-ci-visibility-test-execution-id" - - SCRIPT_IS_RUM_ACTIVE: String - - SCRIPT_STOP_RUM_SESSION: String end end end diff --git a/sig/datadog/ci/contrib/selenium/rum.rbs b/sig/datadog/ci/contrib/selenium/rum.rbs deleted file mode 100644 index a2ef5d18..00000000 --- a/sig/datadog/ci/contrib/selenium/rum.rbs +++ /dev/null @@ -1,13 +0,0 @@ -module Datadog - module CI - module Contrib - module Selenium - module RUM - def self.is_rum_active?: (untyped script_executor) -> bool - - def self.stop_rum_session: (untyped script_executor) -> void - end - end - end - end -end diff --git a/sig/datadog/ci/ext/rum.rbs b/sig/datadog/ci/ext/rum.rbs new file mode 100644 index 00000000..b5a3a492 --- /dev/null +++ b/sig/datadog/ci/ext/rum.rbs @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module Datadog + module CI + module Ext + module RUM + ENV_RUM_FLUSH_WAIT_MILLIS: "DD_CIVISIBILITY_RUM_FLUSH_WAIT_MILLIS" + + COOKIE_TEST_EXECUTION_ID: "datadog-ci-visibility-test-execution-id" + + SCRIPT_IS_RUM_ACTIVE: String + SCRIPT_STOP_RUM_SESSION: String + end + end + end +end diff --git a/sig/datadog/ci/utils/rum.rbs b/sig/datadog/ci/utils/rum.rbs new file mode 100644 index 00000000..d26f1da6 --- /dev/null +++ b/sig/datadog/ci/utils/rum.rbs @@ -0,0 +1,11 @@ +module Datadog + module CI + module Utils + module RUM + def self.is_rum_active?: (untyped script_executor) -> bool + + def self.stop_rum_session: (untyped script_executor) -> void + end + end + end +end diff --git a/spec/datadog/ci/contrib/selenium/instrumentation_spec.rb b/spec/datadog/ci/contrib/selenium/instrumentation_spec.rb index eb77668e..8f852463 100644 --- a/spec/datadog/ci/contrib/selenium/instrumentation_spec.rb +++ b/spec/datadog/ci/contrib/selenium/instrumentation_spec.rb @@ -78,12 +78,12 @@ expect(visited_urls).to eq(["http://www.example.com", "about:blank"]) expect(executed_scripts).to eq( [ - Datadog::CI::Contrib::Selenium::Ext::SCRIPT_IS_RUM_ACTIVE, - Datadog::CI::Contrib::Selenium::Ext::SCRIPT_STOP_RUM_SESSION, + Datadog::CI::Ext::RUM::SCRIPT_IS_RUM_ACTIVE, + Datadog::CI::Ext::RUM::SCRIPT_STOP_RUM_SESSION, "window.sessionStorage.clear()", "window.localStorage.clear()", - Datadog::CI::Contrib::Selenium::Ext::SCRIPT_IS_RUM_ACTIVE, - Datadog::CI::Contrib::Selenium::Ext::SCRIPT_STOP_RUM_SESSION + Datadog::CI::Ext::RUM::SCRIPT_IS_RUM_ACTIVE, + Datadog::CI::Ext::RUM::SCRIPT_STOP_RUM_SESSION ] )