@Override public StoryReporter createStoryReporter(FilePrintStreamFactory filePrintStreamFactory, StoryReporterBuilder storyReporterBuilder) { return new SauceContextStoryReporter(webDriverProvider, seleniumContext, storyToSauceUrlMap); }
protected String readResponseLinesFromSauceLabToGetJobUrl(BufferedReader reader) throws IOException { String jobUrl = ""; String responseLineFromSauceLabs; while ((responseLineFromSauceLabs = reader.readLine()) != null) { jobUrl = jobUrl + processSauceLabsResponseLine(responseLineFromSauceLabs); } return jobUrl; }
@Override public void beforeScenario(String title) { try { super.beforeScenario(title); ((JavascriptExecutor) webDriverProvider.get()).executeScript("sauce:context=Scenario: " + title); // This should really be done per Story, but the webDriverProvider has not done it's thing for this thread yet :-( sessionIds.set(((RemoteWebDriver) webDriverProvider.get()).getSessionId()); String payload = "{\"tags\":[" + getJobTags() + "], " + getBuildId() + "\"name\":\" " + getJobName() + "\"}"; postJobUpdate(storyName.get(), sessionIds.get(), payload); } catch (WebDriverException e) { if (e.getMessage().startsWith("Error communicating with the remote browser. It may have died.")) { // do nothing, it's likely that SauceLabs timed out the job on their system. } else { throw e; } } }
private void postJobUpdate(String storyName, SessionId sessionId, String payload) { try { URL url = new URL("http://saucelabs.com/rest/v1/" + getSauceUser() + "/jobs/" + sessionId.toString()); Authenticator.setDefault(new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(getSauceUser(), getSauceAccessKey().toCharArray()); } }); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("PUT"); OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); writer.write(payload); writer.close(); int rc = connection.getResponseCode(); String jobUrl = null; if (rc == 200) { jobUrl = readResponseLinesFromSauceLabToGetJobUrl(new BufferedReader(new InputStreamReader(connection.getInputStream()))); storyToJobIds.put(storyName, jobUrl); } } catch (IOException e) { System.err.println("SauceContextStoryReporter: Error updating Saucelabs job info: " + e.getMessage()); } }
@Override public void afterStory(boolean givenStory) { String storyName = this.storyName.get(); if (storyName.equals("BeforeStories") || storyName.equals("AfterStories") || storyName.equals("BeforeStory") || storyName.equals("AfterStory") || storyName.equals("BeforeScenario") || storyName.equals("AfterScenario")) { return; } SessionId sessionId = sessionIds.get(); if (sessionId == null ) { // no executed scenarios, as (most likely) excluded return; } boolean pass = passed.get().equals(true); String payload = "{ \"passed\":" + pass + "}"; postJobUpdate(storyName, sessionId, payload); System.out.println("Saucelabs Job URL for " + (passed.get() ? "passing" : "failing") + " '" + storyName + "' : " + storyToJobIds.get(storyName)); }
@Override public void beforeScenario(String title) { try { super.beforeScenario(title); ((JavascriptExecutor) webDriverProvider.get()).executeScript("sauce:context=Scenario: " + title); // This should really be done per Story, but the webDriverProvider has not done it's thing for this thread yet :-( sessionIds.set(((RemoteWebDriver) webDriverProvider.get()).getSessionId()); String payload = "{\"tags\":[" + getJobTags() + "], " + getBuildId() + "\"name\":\" " + getJobName() + "\"}"; postJobUpdate(storyName.get(), sessionIds.get(), payload); } catch (WebDriverException e) { if (e.getMessage().startsWith("Error communicating with the remote browser. It may have died.")) { // do nothing, it's likely that SauceLabs timed out the job on their system. } else { throw e; } } }
private void postJobUpdate(String storyName, SessionId sessionId, String payload) { try { URL url = new URL("http://saucelabs.com/rest/v1/" + getSauceUser() + "/jobs/" + sessionId.toString()); Authenticator.setDefault(new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(getSauceUser(), getSauceAccessKey().toCharArray()); } }); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("PUT"); OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); writer.write(payload); writer.close(); int rc = connection.getResponseCode(); String jobUrl = null; if (rc == 200) { jobUrl = readResponseLinesFromSauceLabToGetJobUrl(new BufferedReader(new InputStreamReader(connection.getInputStream()))); storyToJobIds.put(storyName, jobUrl); } } catch (IOException e) { System.err.println("SauceContextStoryReporter: Error updating Saucelabs job info: " + e.getMessage()); } }
@Override public void afterStory(boolean givenStory) { String storyName = this.storyName.get(); if (storyName.equals("BeforeStories") || storyName.equals("AfterStories") || storyName.equals("BeforeStory") || storyName.equals("AfterStory") || storyName.equals("BeforeScenario") || storyName.equals("AfterScenario")) { return; } SessionId sessionId = sessionIds.get(); if (sessionId == null ) { // no executed scenarios, as (most likely) excluded return; } boolean pass = passed.get().equals(true); String payload = "{ \"passed\":" + pass + "}"; postJobUpdate(storyName, sessionId, payload); System.out.println("Saucelabs Job URL for " + (passed.get() ? "passing" : "failing") + " '" + storyName + "' : " + storyToJobIds.get(storyName)); }
@Override public StoryReporter createStoryReporter(FilePrintStreamFactory filePrintStreamFactory, StoryReporterBuilder storyReporterBuilder) { return new SauceContextStoryReporter(webDriverProvider, seleniumContext, storyToSauceUrlMap); }
protected String readResponseLinesFromSauceLabToGetJobUrl(BufferedReader reader) throws IOException { String jobUrl = ""; String responseLineFromSauceLabs; while ((responseLineFromSauceLabs = reader.readLine()) != null) { jobUrl = jobUrl + processSauceLabsResponseLine(responseLineFromSauceLabs); } return jobUrl; }