From 6ccb242e8d35b62d86a31b44dab9950f8b930429 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 22 Jan 2025 12:48:07 +0100 Subject: [PATCH] fix JS script execution for cuprite driver --- lib/datadog/ci/contrib/cuprite/driver.rb | 12 ++++--- .../ci/contrib/cuprite/script_executor.rb | 32 +++++++++++++++++++ .../ci/contrib/selenium/capybara_driver.rb | 2 +- lib/datadog/ci/contrib/selenium/driver.rb | 2 +- lib/datadog/ci/utils/rum.rb | 31 +++++++++--------- .../ci/contrib/cuprite/script_executor.rbs | 16 ++++++++++ sig/datadog/ci/utils/rum.rbs | 2 +- .../features/step_definitions/steps.rb | 3 ++ vendor/rbs/cuprite/0/driver.rbs | 2 ++ 9 files changed, 79 insertions(+), 23 deletions(-) create mode 100644 lib/datadog/ci/contrib/cuprite/script_executor.rb create mode 100644 sig/datadog/ci/contrib/cuprite/script_executor.rbs diff --git a/lib/datadog/ci/contrib/cuprite/driver.rb b/lib/datadog/ci/contrib/cuprite/driver.rb index 63220d0e..9887c7ec 100644 --- a/lib/datadog/ci/contrib/cuprite/driver.rb +++ b/lib/datadog/ci/contrib/cuprite/driver.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true +require_relative "script_executor" require_relative "../patcher" require_relative "../../ext/rum" @@ -51,12 +52,16 @@ def visit(url) end def reset! + Datadog.logger.debug("[Cuprite] Driver reset! event") + datadog_end_rum_session super end def quit + Datadog.logger.debug("[Cuprite] Driver quit event") + datadog_end_rum_session super @@ -75,11 +80,10 @@ def datadog_configuration def datadog_end_rum_session return unless datadog_configuration[:enabled] - Datadog.logger.debug("[Cuprite] Driver quit event") - - Utils::RUM.stop_rum_session(self) + executor = ScriptExecutor.new(browser) + Utils::RUM.stop_rum_session(executor, rum_flush_wait_millis: datadog_configuration[:rum_flush_wait_millis]) - Datadog.logger.debug("[Cuprite] RUM session stopped, deleting cookie") + Datadog.logger.debug("[Cuprite] Deleting Datadog cookie") remove_cookie(CI::Ext::RUM::COOKIE_TEST_EXECUTION_ID) end end diff --git a/lib/datadog/ci/contrib/cuprite/script_executor.rb b/lib/datadog/ci/contrib/cuprite/script_executor.rb new file mode 100644 index 00000000..9e725524 --- /dev/null +++ b/lib/datadog/ci/contrib/cuprite/script_executor.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +require_relative "../../ext/rum" + +module Datadog + module CI + module Contrib + module Cuprite + class ScriptExecutor + # Ferrum::Browser requires a JS script to be wrapped in a function() { ... } block + WRAPPED_SCRIPTS = { + CI::Ext::RUM::SCRIPT_IS_RUM_ACTIVE => "function() { #{CI::Ext::RUM::SCRIPT_IS_RUM_ACTIVE}; }", + CI::Ext::RUM::SCRIPT_STOP_RUM_SESSION => <<~JS + function() { + #{CI::Ext::RUM::SCRIPT_STOP_RUM_SESSION}; + } + JS + }.freeze + + def initialize(ferrum_browser) + @ferrum_browser = ferrum_browser + end + + def execute_script(script) + script = WRAPPED_SCRIPTS.fetch(script, script) + @ferrum_browser.evaluate_func(script) + end + end + end + end + end +end diff --git a/lib/datadog/ci/contrib/selenium/capybara_driver.rb b/lib/datadog/ci/contrib/selenium/capybara_driver.rb index 6b74bab8..3f2fbc29 100644 --- a/lib/datadog/ci/contrib/selenium/capybara_driver.rb +++ b/lib/datadog/ci/contrib/selenium/capybara_driver.rb @@ -22,7 +22,7 @@ def reset! Datadog.logger.debug("[Selenium] Capybara session reset event") - Utils::RUM.stop_rum_session(@browser) + Utils::RUM.stop_rum_session(@browser, rum_flush_wait_millis: datadog_configuration[:rum_flush_wait_millis]) Datadog.logger.debug("[Selenium] RUM session stopped, deleting cookie") @browser.manage.delete_cookie(CI::Ext::RUM::COOKIE_TEST_EXECUTION_ID) diff --git a/lib/datadog/ci/contrib/selenium/driver.rb b/lib/datadog/ci/contrib/selenium/driver.rb index 90d4d83f..1d988fa4 100644 --- a/lib/datadog/ci/contrib/selenium/driver.rb +++ b/lib/datadog/ci/contrib/selenium/driver.rb @@ -22,7 +22,7 @@ def quit Datadog.logger.debug("[Selenium] Driver quit event") - Utils::RUM.stop_rum_session(@bridge) + Utils::RUM.stop_rum_session(@bridge, rum_flush_wait_millis: datadog_configuration[:rum_flush_wait_millis]) Datadog.logger.debug("[Selenium] RUM session stopped, deleting cookie") @bridge.manage.delete_cookie(CI::Ext::RUM::COOKIE_TEST_EXECUTION_ID) diff --git a/lib/datadog/ci/utils/rum.rb b/lib/datadog/ci/utils/rum.rb index ab464296..fb6ee96f 100644 --- a/lib/datadog/ci/utils/rum.rb +++ b/lib/datadog/ci/utils/rum.rb @@ -15,27 +15,26 @@ 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}" } + Datadog.logger.debug { "[RUM] 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, rum_flush_wait_millis: 500) - 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 + return unless 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 = rum_flush_wait_millis / 1000.0 + Datadog.logger.debug { "[RUM] Waiting for #{delay} seconds" } + sleep(delay) end end end diff --git a/sig/datadog/ci/contrib/cuprite/script_executor.rbs b/sig/datadog/ci/contrib/cuprite/script_executor.rbs new file mode 100644 index 00000000..d30deeb7 --- /dev/null +++ b/sig/datadog/ci/contrib/cuprite/script_executor.rbs @@ -0,0 +1,16 @@ +module Datadog + module CI + module Contrib + module Cuprite + class ScriptExecutor + @ferrum_browser: Ferrum::Browser + WRAPPED_SCRIPTS: ::Hash[::String, ::String] + + def initialize: (Ferrum::Browser ferrum_browser) -> void + + def execute_script: (String script) -> String + end + end + end + end +end diff --git a/sig/datadog/ci/utils/rum.rbs b/sig/datadog/ci/utils/rum.rbs index d26f1da6..9239048d 100644 --- a/sig/datadog/ci/utils/rum.rbs +++ b/sig/datadog/ci/utils/rum.rbs @@ -4,7 +4,7 @@ module Datadog module RUM def self.is_rum_active?: (untyped script_executor) -> bool - def self.stop_rum_session: (untyped script_executor) -> void + def self.stop_rum_session: (untyped script_executor, ?rum_flush_wait_millis: Integer) -> void end end end diff --git a/spec/datadog/ci/contrib/selenium/features/step_definitions/steps.rb b/spec/datadog/ci/contrib/selenium/features/step_definitions/steps.rb index d77c5706..7b5f8e88 100644 --- a/spec/datadog/ci/contrib/selenium/features/step_definitions/steps.rb +++ b/spec/datadog/ci/contrib/selenium/features/step_definitions/steps.rb @@ -5,8 +5,11 @@ Then "visit page" do visit "http://www.example.com" + p "visited" Capybara.reset_session! + p "reset" Capybara.current_session.quit + p "quit" end diff --git a/vendor/rbs/cuprite/0/driver.rbs b/vendor/rbs/cuprite/0/driver.rbs index 5c1f3a69..8ac0787b 100644 --- a/vendor/rbs/cuprite/0/driver.rbs +++ b/vendor/rbs/cuprite/0/driver.rbs @@ -11,6 +11,8 @@ class Ferrum::Browser def version: () -> Ferrum::Browser::VersionInfo def options: () -> Ferrum::Browser::Options + + def evaluate_func: (String script) -> String end class Ferrum::Browser::Options