[MediaWiki-commits] [Gerrit] Log SauceLabs session URLs via Cucumber logger embeds - change (mediawiki/selenium)
jenkins-bot has submitted this change and it was merged. Change subject: Log SauceLabs session URLs via Cucumber logger embeds .. Log SauceLabs session URLs via Cucumber logger embeds Refactored the SauceLabs/JUnit logger to accept embeds for WebDriver session IDs, and implemented a helper module to embed them as soon as each session is created to avoid race conditions with Cucumber hooks and loggers. Removed now unnecessary global `last_session_ids` class attribute from `RemoteBrowserFactory`. Bug: T105589 Change-Id: I19b4dfac1d6038cc3dbd2c0b63c3280d6c35c971 --- M lib/mediawiki_selenium.rb A lib/mediawiki_selenium/cucumber/embed_browser_session.rb M lib/mediawiki_selenium/cucumber/env.rb M lib/mediawiki_selenium/cucumber/sauce.rb M lib/mediawiki_selenium/remote_browser_factory.rb 5 files changed, 54 insertions(+), 32 deletions(-) Approvals: Zfilipin: Looks good to me, approved jenkins-bot: Verified diff --git a/lib/mediawiki_selenium.rb b/lib/mediawiki_selenium.rb index 659828d..61691b8 100644 --- a/lib/mediawiki_selenium.rb +++ b/lib/mediawiki_selenium.rb @@ -4,6 +4,7 @@ autoload :BrowserFactory, 'mediawiki_selenium/browser_factory' autoload :ConfigurationError, 'mediawiki_selenium/configuration_error' autoload :Environment, 'mediawiki_selenium/environment' + autoload :EmbedBrowserSession, 'mediawiki_selenium/cucumber/embed_browser_session' autoload :HeadlessHelper, 'mediawiki_selenium/helpers/headless_helper' autoload :Initializer, 'mediawiki_selenium/initializer' autoload :LoginHelper, 'mediawiki_selenium/helpers/login_helper' diff --git a/lib/mediawiki_selenium/cucumber/embed_browser_session.rb b/lib/mediawiki_selenium/cucumber/embed_browser_session.rb new file mode 100644 index 000..fbbedca --- /dev/null +++ b/lib/mediawiki_selenium/cucumber/embed_browser_session.rb @@ -0,0 +1,18 @@ +module MediawikiSelenium + # Embeds the browser session upon creation into the active Cucumber logger. + # + module EmbedBrowserSession +# Embeds the browser session into the active Cucumber logger(s) as soon as +# {Environment} is done creating it. Note that the +# 'application/vnd.webdriver-session-id' MIME used for the embedding is +# made up for this purpose. +# +# @see Environment#browser +# +def browser + super.tap do |b| +embed(b.driver.session_id, 'application/vnd.webdriver-session-id') + end +end + end +end diff --git a/lib/mediawiki_selenium/cucumber/env.rb b/lib/mediawiki_selenium/cucumber/env.rb index 8309cee..e3a50d4 100644 --- a/lib/mediawiki_selenium/cucumber/env.rb +++ b/lib/mediawiki_selenium/cucumber/env.rb @@ -9,4 +9,5 @@ World(MediawikiSelenium::PageFactory) World(MediawikiSelenium::ScreenshotHelper) World(MediawikiSelenium::StrictPending) +World(MediawikiSelenium::EmbedBrowserSession) World(MediawikiSelenium::UserFactoryHelper) diff --git a/lib/mediawiki_selenium/cucumber/sauce.rb b/lib/mediawiki_selenium/cucumber/sauce.rb index 7ac6569..51b33a9 100644 --- a/lib/mediawiki_selenium/cucumber/sauce.rb +++ b/lib/mediawiki_selenium/cucumber/sauce.rb @@ -1,17 +1,28 @@ require 'cucumber/formatter/junit' require 'mediawiki_selenium/remote_browser_factory' +require 'set' module Cucumber::Formatter class Sauce < Junit +def before_steps(_steps) + @sids = Set.new + + super +end + +def embed(session_id, mime, _label) + return unless mime == 'application/vnd.webdriver-session-id' + + @sids << session_id +end + private def format_exception(exception) - sids = MediawikiSelenium::RemoteBrowserFactory.last_session_ids - - if sids.nil? || sids.empty? + if @sids.nil? || @sids.empty? message = 'Uh-oh. Could not find link to Sauce Labs job URL.' else -message = sids.map { |sid| "Sauce Labs job URL: http://saucelabs.com/jobs/#{sid}\n; }.join +message = @sids.map { |sid| "Sauce Labs job URL: http://saucelabs.com/jobs/#{sid}\n; }.join end msgs = [message] + ["#{exception.message} (#{exception.class})"] + exception.backtrace diff --git a/lib/mediawiki_selenium/remote_browser_factory.rb b/lib/mediawiki_selenium/remote_browser_factory.rb index 66f27f4..e66ba8f 100644 --- a/lib/mediawiki_selenium/remote_browser_factory.rb +++ b/lib/mediawiki_selenium/remote_browser_factory.rb @@ -16,37 +16,32 @@ REQUIRED_CONFIG = [:sauce_ondemand_username, :sauce_ondemand_access_key] URL = 'http://ondemand.saucelabs.com/wd/hub' -class << self - # @attr [Array] SauceLabs job IDs from the most recent sessions. - attr_accessor :last_session_ids +def self.extend_object(base) + return if base.is_a?(self) - def extend_object(base) -return if base.is_a?(self) + super -super + base.configure(:sauce_ondemand_username, :sauce_ondemand_access_key) do |user, key, options| +options[:url] =
[MediaWiki-commits] [Gerrit] Log SauceLabs session URLs via Cucumber logger embeds - change (mediawiki/selenium)
Dduvall has uploaded a new change for review. https://gerrit.wikimedia.org/r/265894 Change subject: Log SauceLabs session URLs via Cucumber logger embeds .. Log SauceLabs session URLs via Cucumber logger embeds Refactored the SauceLabs/JUnit logger to accept embeds for WebDriver session IDs, and implemented a helper module to embed them as soon as each session is created to avoid race conditions with Cucumber hooks and loggers. Removed now unnecessary global `last_session_ids` class attribute from `RemoteBrowserFactory`. Bug: T105589 Change-Id: I19b4dfac1d6038cc3dbd2c0b63c3280d6c35c971 --- M lib/mediawiki_selenium.rb A lib/mediawiki_selenium/cucumber/embed_browser_session.rb M lib/mediawiki_selenium/cucumber/env.rb M lib/mediawiki_selenium/cucumber/sauce.rb M lib/mediawiki_selenium/remote_browser_factory.rb 5 files changed, 57 insertions(+), 32 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/selenium refs/changes/94/265894/1 diff --git a/lib/mediawiki_selenium.rb b/lib/mediawiki_selenium.rb index 659828d..61691b8 100644 --- a/lib/mediawiki_selenium.rb +++ b/lib/mediawiki_selenium.rb @@ -4,6 +4,7 @@ autoload :BrowserFactory, 'mediawiki_selenium/browser_factory' autoload :ConfigurationError, 'mediawiki_selenium/configuration_error' autoload :Environment, 'mediawiki_selenium/environment' + autoload :EmbedBrowserSession, 'mediawiki_selenium/cucumber/embed_browser_session' autoload :HeadlessHelper, 'mediawiki_selenium/helpers/headless_helper' autoload :Initializer, 'mediawiki_selenium/initializer' autoload :LoginHelper, 'mediawiki_selenium/helpers/login_helper' diff --git a/lib/mediawiki_selenium/cucumber/embed_browser_session.rb b/lib/mediawiki_selenium/cucumber/embed_browser_session.rb new file mode 100644 index 000..0ba3559 --- /dev/null +++ b/lib/mediawiki_selenium/cucumber/embed_browser_session.rb @@ -0,0 +1,21 @@ +module MediawikiSelenium + # Embeds the browser session upon creation into the active Cucumber logger. + # + module EmbedBrowserSession +# Overloads `MediawikiSelenium::Environment#` +# exception as a strict failure. +# +# Embeds the browser session into the active Cucumber logger(s) as soon as +# {Environment} is done creating it. Note that the +# 'application/vnd.webdriver-session-id' MIME used for the embedding is +# made up for this purpose. +# +# @see Environment#browser +# +def browser + super.tap do |b| +embed(b.driver.session_id, 'application/vnd.webdriver-session-id') + end +end + end +end diff --git a/lib/mediawiki_selenium/cucumber/env.rb b/lib/mediawiki_selenium/cucumber/env.rb index 8309cee..e3a50d4 100644 --- a/lib/mediawiki_selenium/cucumber/env.rb +++ b/lib/mediawiki_selenium/cucumber/env.rb @@ -9,4 +9,5 @@ World(MediawikiSelenium::PageFactory) World(MediawikiSelenium::ScreenshotHelper) World(MediawikiSelenium::StrictPending) +World(MediawikiSelenium::EmbedBrowserSession) World(MediawikiSelenium::UserFactoryHelper) diff --git a/lib/mediawiki_selenium/cucumber/sauce.rb b/lib/mediawiki_selenium/cucumber/sauce.rb index 7ac6569..51b33a9 100644 --- a/lib/mediawiki_selenium/cucumber/sauce.rb +++ b/lib/mediawiki_selenium/cucumber/sauce.rb @@ -1,17 +1,28 @@ require 'cucumber/formatter/junit' require 'mediawiki_selenium/remote_browser_factory' +require 'set' module Cucumber::Formatter class Sauce < Junit +def before_steps(_steps) + @sids = Set.new + + super +end + +def embed(session_id, mime, _label) + return unless mime == 'application/vnd.webdriver-session-id' + + @sids << session_id +end + private def format_exception(exception) - sids = MediawikiSelenium::RemoteBrowserFactory.last_session_ids - - if sids.nil? || sids.empty? + if @sids.nil? || @sids.empty? message = 'Uh-oh. Could not find link to Sauce Labs job URL.' else -message = sids.map { |sid| "Sauce Labs job URL: http://saucelabs.com/jobs/#{sid}\n; }.join +message = @sids.map { |sid| "Sauce Labs job URL: http://saucelabs.com/jobs/#{sid}\n; }.join end msgs = [message] + ["#{exception.message} (#{exception.class})"] + exception.backtrace diff --git a/lib/mediawiki_selenium/remote_browser_factory.rb b/lib/mediawiki_selenium/remote_browser_factory.rb index 66f27f4..e66ba8f 100644 --- a/lib/mediawiki_selenium/remote_browser_factory.rb +++ b/lib/mediawiki_selenium/remote_browser_factory.rb @@ -16,37 +16,32 @@ REQUIRED_CONFIG = [:sauce_ondemand_username, :sauce_ondemand_access_key] URL = 'http://ondemand.saucelabs.com/wd/hub' -class << self - # @attr [Array] SauceLabs job IDs from the most recent sessions. - attr_accessor :last_session_ids +def self.extend_object(base) + return if base.is_a?(self) - def extend_object(base) -return if base.is_a?(self) + super -