[MediaWiki-commits] [Gerrit] Log SauceLabs session URLs via Cucumber logger embeds - change (mediawiki/selenium)

2016-01-26 Thread jenkins-bot (Code Review)
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)

2016-01-22 Thread Dduvall (Code Review)
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
 
-