From fc980605ea747f17e93f9d5960c9305444e719db Mon Sep 17 00:00:00 2001 From: Hani Date: Sun, 29 Jul 2018 13:36:04 +0530 Subject: [PATCH 1/3] Added browser_console_logs_url, har_logs_url, appium_logs_url to the json returned for session details. Also updated REST API endpoint to reflect latest BrowserStack API endpoint: https://www.browserstack.com/automate/rest-api --- .../com/browserstack/automate/Automate.java | 12 ++ .../browserstack/automate/AutomateClient.java | 113 +++++++++++++++++- .../browserstack/automate/model/Session.java | 84 +++++++++++++ .../automate/AutomateClientTest.java | 66 ++++++++++ 4 files changed, 274 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/browserstack/automate/Automate.java b/src/main/java/com/browserstack/automate/Automate.java index b5040f3..d3ae30f 100644 --- a/src/main/java/com/browserstack/automate/Automate.java +++ b/src/main/java/com/browserstack/automate/Automate.java @@ -42,6 +42,18 @@ Session updateSessionStatus(String sessionId, String getSessionVideo(String sessionId) throws SessionNotFound, AutomateException; + String getSessionConsoleLogs(String sessionId) throws SessionNotFound, AutomateException; + + String getSessionConsoleLogs(Session session) throws AutomateException; + + String getSessionHARLogs(String sessionId) throws SessionNotFound, AutomateException; + + String getSessionHARLogs(Session session) throws AutomateException; + + String getSessionAppiumLogs(String sessionId) throws SessionNotFound, AutomateException; + + String getSessionAppiumLogs(Session session) throws AutomateException; + boolean deleteSession(String sessionId) throws SessionNotFound, AutomateException; String recycleKey() throws AutomateException; diff --git a/src/main/java/com/browserstack/automate/AutomateClient.java b/src/main/java/com/browserstack/automate/AutomateClient.java index 7d13d3c..213f5f0 100644 --- a/src/main/java/com/browserstack/automate/AutomateClient.java +++ b/src/main/java/com/browserstack/automate/AutomateClient.java @@ -18,7 +18,7 @@ */ public final class AutomateClient extends BrowserStackClient implements Automate { - private static final String BASE_URL = "https://www.browserstack.com/automate"; + private static final String BASE_URL = "https://api.browserstack.com/automate"; private static final String CACHE_KEY_BROWSERS = "browsers"; /** @@ -434,6 +434,117 @@ public final String getSessionVideo(final String sessionId) return getSession(sessionId).getVideoUrl(); } + /** + * Fetches the console logs for a session. + * + * @param sessionId ID that uniquely identifies a session. + * @return Console logs for the session. + * @throws SessionNotFound + * @throws AutomateException + */ + public final String getSessionConsoleLogs(final String sessionId) throws SessionNotFound, AutomateException { + return getSessionConsoleLogs(getSession(sessionId)); + } + + /** + * Fetches the console logs for a session. + * + * @param session {@link Session} for which to retrieve logs. + * @return Console logs for the session. + * @throws AutomateException + */ + public final String getSessionConsoleLogs(final Session session) throws AutomateException { + if (session == null) { + throw new AutomateException("Invalid session", 400); + } + + if (session.getBrowser_console_logs_url() == null) { + throw new AutomateException("Session logs not found", 404); + } + + try { + BrowserStackRequest request = newRequest(Method.GET, session.getBrowser_console_logs_url(), false); + request.getHttpRequest().getHeaders().setAccept("*/*"); + return request.asString(); + } catch (BrowserStackException e) { + throw new AutomateException(e); + } + } + + /** + * Fetches the HAR logs for a session. + * + * @param sessionId ID that uniquely identifies a session. + * @return HAR logs for the session. + * @throws SessionNotFound + * @throws AutomateException + */ + public final String getSessionHARLogs(final String sessionId) throws SessionNotFound, AutomateException { + return getSessionHARLogs(getSession(sessionId)); + } + + /** + * Fetches the HAR logs for a session. + * + * @param session {@link Session} for which to retrieve logs. + * @return HAR logs for the session. + * @throws AutomateException + */ + public final String getSessionHARLogs(final Session session) throws AutomateException { + if (session == null) { + throw new AutomateException("Invalid session", 400); + } + + if (session.getHar_logs_url() == null) { + throw new AutomateException("Session logs not found", 404); + } + + try { + BrowserStackRequest request = newRequest(Method.GET, session.getHar_logs_url(), false); + request.getHttpRequest().getHeaders().setAccept("*/*"); + return request.asString(); + } catch (BrowserStackException e) { + throw new AutomateException(e); + } + } + + /** + * Fetches the Appium logs for a session. + * + * @param sessionId ID that uniquely identifies a session. + * @return Appium logs for the session. + * @throws SessionNotFound + * @throws AutomateException + */ + public final String getSessionAppiumLogs(final String sessionId) throws SessionNotFound, AutomateException { + return getSessionAppiumLogs(getSession(sessionId)); + } + + /** + * Fetches the Appium logs for a session. + * + * @param session {@link Session} for which to retrieve logs. + * @return Appium logs for the session. + * @throws AutomateException + */ + public final String getSessionAppiumLogs(final Session session) throws AutomateException { + if (session == null) { + throw new AutomateException("Invalid session", 400); + } + + if (session.getAppium_logs_url() == null) { + throw new AutomateException("Session logs not found", 404); + } + + try { + BrowserStackRequest request = newRequest(Method.GET, session.getAppium_logs_url(), false); + request.getHttpRequest().getHeaders().setAccept("*/*"); + return request.asString(); + } catch (BrowserStackException e) { + throw new AutomateException(e); + } + } + /** * Deletes the session identified by the supplied identifier. * diff --git a/src/main/java/com/browserstack/automate/model/Session.java b/src/main/java/com/browserstack/automate/model/Session.java index 55abb73..1322107 100644 --- a/src/main/java/com/browserstack/automate/model/Session.java +++ b/src/main/java/com/browserstack/automate/model/Session.java @@ -62,6 +62,15 @@ public class Session extends BrowserStackObject { @JsonProperty("name") private String name; + @JsonProperty("browser_console_logs_url") + private String browser_console_logs_url; + + @JsonProperty("har_logs_url") + private String har_logs_url; + + @JsonProperty("appium_logs_url") + private String appium_logs_url; + @JsonIgnore private Map additionalProperties = new HashMap(); @@ -100,6 +109,30 @@ public final String getLogs() throws AutomateException { return ((AutomateClient) getClient()).getSessionLogs(this); } + public final String getConsoleLogs() throws AutomateException { + if (browser_console_logs_url == null) { + throw new AutomateException("Session logs not found", 404); + } + + return ((AutomateClient) getClient()).getSessionConsoleLogs(this); + } + + public final String getHARLogs() throws AutomateException { + if (logUrl == null) { + throw new AutomateException("Session logs not found", 404); + } + + return ((AutomateClient) getClient()).getSessionHARLogs(this); + } + + public final String getAppiumLogs() throws AutomateException { + if (logUrl == null) { + throw new AutomateException("Session logs not found", 404); + } + + return ((AutomateClient) getClient()).getSessionAppiumLogs(this); + } + /** * @return The id */ @@ -356,6 +389,54 @@ private void setOs(String os) { this.os = os; } + /** + * @return The browser_console_logs_url + */ + @JsonProperty("browser_console_logs_url") + public String getBrowser_console_logs_url() { + return browser_console_logs_url; + } + + /** + * @param browser_console_logs_url The browser_console_logs_url + */ + @JsonProperty("browser_console_logs_url") + private void setBrowser_console_logs_url(String browser_console_logs_url) { + this.browser_console_logs_url = browser_console_logs_url; + } + + /** + * @return The har_logs_url + */ + @JsonProperty("har_logs_url") + public String getHar_logs_url() { + return har_logs_url; + } + + /** + * @param har_logs_url The har_logs_url + */ + @JsonProperty("har_logs_url") + private void setHar_logs_url(String har_logs_url) { + this.har_logs_url = har_logs_url; + } + + /** + * @return The appium_logs_url + */ + @JsonProperty("appium_logs_url") + public String getAppium_logs_url() { + return appium_logs_url; + } + + /** + * @param appium_logs_url The appium_logs_url + */ + @JsonProperty("appium_logs_url") + private void setAppium_logs_url(String appium_logs_url) { + this.appium_logs_url = appium_logs_url; + } + @JsonAnyGetter protected Map getAdditionalProperties() { return this.additionalProperties; @@ -381,6 +462,9 @@ private boolean copyFrom(Session s) { setLogUrl(s.getLogUrl()); setStatus(s.getStatus()); setReason(s.getReason()); + setBrowser_console_logs_url(s.getBrowser_console_logs_url()); + setHar_logs_url(s.getHar_logs_url()); + setAppium_logs_url(s.getAppium_logs_url()); this.additionalProperties = s.getAdditionalProperties(); return true; } diff --git a/src/test/java/com/browserstack/automate/AutomateClientTest.java b/src/test/java/com/browserstack/automate/AutomateClientTest.java index 5bd7b36..09f4b83 100644 --- a/src/test/java/com/browserstack/automate/AutomateClientTest.java +++ b/src/test/java/com/browserstack/automate/AutomateClientTest.java @@ -235,6 +235,72 @@ public void testGetSessionVideo() { } } + @Test + public void testGetSessionConsoleLogs() { + // TODO: Verify if logs are non-empty + // Cannot currently be tested during in-progress sessions + try { + String buildId = automateClient.getBuilds().get(0).getId(); + List sessions = automateClient.getSessions(buildId); + + String logs = sessions.get(0).getConsoleLogs(); + assertTrue("Session Console Logs", logs != null); + + logs = automateClient.getSessionConsoleLogs(sessions.get(0).getId()); + assertTrue("Session Console Logs", logs != null); + } catch (BuildNotFound e) { + assertTrue(false); + } catch (SessionNotFound e) { + assertTrue(false); + } catch (AutomateException e) { + assertTrue(false); + } + } + + @Test + public void testGetSessionHARLogs() { + // TODO: Verify if logs are non-empty + // Cannot currently be tested during in-progress sessions + try { + String buildId = automateClient.getBuilds().get(0).getId(); + List sessions = automateClient.getSessions(buildId); + + String logs = sessions.get(0).getHARLogs(); + assertTrue("Session HAR Logs", logs != null); + + logs = automateClient.getSessionHARLogs(sessions.get(0).getId()); + assertTrue("Session HAR Logs", logs != null); + } catch (BuildNotFound e) { + assertTrue(false); + } catch (SessionNotFound e) { + assertTrue(false); + } catch (AutomateException e) { + assertTrue(false); + } + } + + @Test + public void testGetSessionAppiumLogs() { + // TODO: Verify if logs are non-empty + // Cannot currently be tested during in-progress sessions + try { + String buildId = automateClient.getBuilds().get(0).getId(); + List sessions = automateClient.getSessions(buildId); + + String logs = sessions.get(0).getAppiumLogs(); + assertTrue("Session Appium Logs", logs != null); + + logs = automateClient.getSessionAppiumLogs(sessions.get(0).getId()); + assertTrue("Session Appium Logs", logs != null); + } catch (BuildNotFound e) { + assertTrue(false); + } catch (SessionNotFound e) { + assertTrue(false); + } catch (AutomateException e) { + assertTrue(false); + } + } + // @Test public void testRecycleKey() { try { From d5f91bb87a2e3a7919660e06caf499213b97aa37 Mon Sep 17 00:00:00 2001 From: Hani Date: Tue, 7 Aug 2018 14:32:21 +0530 Subject: [PATCH 2/3] changes method names to camel case --- .../browserstack/automate/AutomateClient.java | 12 ++++++------ .../browserstack/automate/model/Session.java | 18 +++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/browserstack/automate/AutomateClient.java b/src/main/java/com/browserstack/automate/AutomateClient.java index 213f5f0..62ecb1f 100644 --- a/src/main/java/com/browserstack/automate/AutomateClient.java +++ b/src/main/java/com/browserstack/automate/AutomateClient.java @@ -458,12 +458,12 @@ public final String getSessionConsoleLogs(final Session session) throws Automate throw new AutomateException("Invalid session", 400); } - if (session.getBrowser_console_logs_url() == null) { + if (session.getBrowserConsoleLogsUrl() == null) { throw new AutomateException("Session logs not found", 404); } try { - BrowserStackRequest request = newRequest(Method.GET, session.getBrowser_console_logs_url(), false); + BrowserStackRequest request = newRequest(Method.GET, session.getBrowserConsoleLogsUrl(), false); request.getHttpRequest().getHeaders().setAccept("*/*"); return request.asString(); } catch (BrowserStackException e) { @@ -495,12 +495,12 @@ public final String getSessionHARLogs(final Session session) throws AutomateExce throw new AutomateException("Invalid session", 400); } - if (session.getHar_logs_url() == null) { + if (session.getHarLogsUrl() == null) { throw new AutomateException("Session logs not found", 404); } try { - BrowserStackRequest request = newRequest(Method.GET, session.getHar_logs_url(), false); + BrowserStackRequest request = newRequest(Method.GET, session.getHarLogsUrl(), false); request.getHttpRequest().getHeaders().setAccept("*/*"); return request.asString(); } catch (BrowserStackException e) { @@ -532,12 +532,12 @@ public final String getSessionAppiumLogs(final Session session) throws AutomateE throw new AutomateException("Invalid session", 400); } - if (session.getAppium_logs_url() == null) { + if (session.getAppiumLogsUrl() == null) { throw new AutomateException("Session logs not found", 404); } try { - BrowserStackRequest request = newRequest(Method.GET, session.getAppium_logs_url(), false); + BrowserStackRequest request = newRequest(Method.GET, session.getAppiumLogsUrl(), false); request.getHttpRequest().getHeaders().setAccept("*/*"); return request.asString(); } catch (BrowserStackException e) { diff --git a/src/main/java/com/browserstack/automate/model/Session.java b/src/main/java/com/browserstack/automate/model/Session.java index 1322107..69ba529 100644 --- a/src/main/java/com/browserstack/automate/model/Session.java +++ b/src/main/java/com/browserstack/automate/model/Session.java @@ -393,7 +393,7 @@ private void setOs(String os) { * @return The browser_console_logs_url */ @JsonProperty("browser_console_logs_url") - public String getBrowser_console_logs_url() { + public String getBrowserConsoleLogsUrl() { return browser_console_logs_url; } @@ -401,7 +401,7 @@ public String getBrowser_console_logs_url() { * @param browser_console_logs_url The browser_console_logs_url */ @JsonProperty("browser_console_logs_url") - private void setBrowser_console_logs_url(String browser_console_logs_url) { + private void setBrowserConsoleLogsUrl(String browser_console_logs_url) { this.browser_console_logs_url = browser_console_logs_url; } @@ -409,7 +409,7 @@ private void setBrowser_console_logs_url(String browser_console_logs_url) { * @return The har_logs_url */ @JsonProperty("har_logs_url") - public String getHar_logs_url() { + public String getHarLogsUrl() { return har_logs_url; } @@ -417,7 +417,7 @@ public String getHar_logs_url() { * @param har_logs_url The har_logs_url */ @JsonProperty("har_logs_url") - private void setHar_logs_url(String har_logs_url) { + private void setHarLogsUrl(String har_logs_url) { this.har_logs_url = har_logs_url; } @@ -425,7 +425,7 @@ private void setHar_logs_url(String har_logs_url) { * @return The appium_logs_url */ @JsonProperty("appium_logs_url") - public String getAppium_logs_url() { + public String getAppiumLogsUrl() { return appium_logs_url; } @@ -433,7 +433,7 @@ public String getAppium_logs_url() { * @param appium_logs_url The appium_logs_url */ @JsonProperty("appium_logs_url") - private void setAppium_logs_url(String appium_logs_url) { + private void setAppiumLogsUrl(String appium_logs_url) { this.appium_logs_url = appium_logs_url; } @@ -462,9 +462,9 @@ private boolean copyFrom(Session s) { setLogUrl(s.getLogUrl()); setStatus(s.getStatus()); setReason(s.getReason()); - setBrowser_console_logs_url(s.getBrowser_console_logs_url()); - setHar_logs_url(s.getHar_logs_url()); - setAppium_logs_url(s.getAppium_logs_url()); + setBrowserConsoleLogsUrl(s.getBrowserConsoleLogsUrl()); + setHarLogsUrl(s.getHarLogsUrl()); + setAppiumLogsUrl(s.getAppiumLogsUrl()); this.additionalProperties = s.getAdditionalProperties(); return true; } From 27d29a818faa132964f6930cb85dbb4deb0cf488 Mon Sep 17 00:00:00 2001 From: Hani Date: Tue, 7 Aug 2018 18:27:19 +0530 Subject: [PATCH 3/3] Added zero length string check, updated variable name to reflect camel case and added comments to tests --- .../browserstack/automate/model/Session.java | 52 ++++++++++--------- .../automate/AutomateClientTest.java | 2 + 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/browserstack/automate/model/Session.java b/src/main/java/com/browserstack/automate/model/Session.java index 69ba529..a6e3c00 100644 --- a/src/main/java/com/browserstack/automate/model/Session.java +++ b/src/main/java/com/browserstack/automate/model/Session.java @@ -6,8 +6,10 @@ import com.browserstack.automate.exception.SessionNotFound; import com.browserstack.client.BrowserStackClient; import com.browserstack.client.model.BrowserStackObject; +import com.browserstack.client.util.Tools; import com.fasterxml.jackson.annotation.*; +import javax.tools.Tool; import java.util.HashMap; import java.util.Map; @@ -63,13 +65,13 @@ public class Session extends BrowserStackObject { private String name; @JsonProperty("browser_console_logs_url") - private String browser_console_logs_url; + private String browserConsoleLogsUrl; @JsonProperty("har_logs_url") - private String har_logs_url; + private String harLogsUrl; @JsonProperty("appium_logs_url") - private String appium_logs_url; + private String appiumLogsUrl; @JsonIgnore private Map additionalProperties = new HashMap(); @@ -102,7 +104,7 @@ public final Session updateStatus(final SessionStatus sessionStatus) throws Sess } public final String getLogs() throws AutomateException { - if (logUrl == null) { + if (Tools.isStringEmpty(logUrl)) { throw new AutomateException("Session logs not found", 404); } @@ -110,24 +112,24 @@ public final String getLogs() throws AutomateException { } public final String getConsoleLogs() throws AutomateException { - if (browser_console_logs_url == null) { - throw new AutomateException("Session logs not found", 404); + if (Tools.isStringEmpty(browserConsoleLogsUrl)) { + throw new AutomateException("Session console logs not found", 404); } return ((AutomateClient) getClient()).getSessionConsoleLogs(this); } public final String getHARLogs() throws AutomateException { - if (logUrl == null) { - throw new AutomateException("Session logs not found", 404); + if (Tools.isStringEmpty(harLogsUrl)) { + throw new AutomateException("Session HAR logs not found", 404); } return ((AutomateClient) getClient()).getSessionHARLogs(this); } public final String getAppiumLogs() throws AutomateException { - if (logUrl == null) { - throw new AutomateException("Session logs not found", 404); + if (Tools.isStringEmpty(appiumLogsUrl)) { + throw new AutomateException("Session Appium logs not found", 404); } return ((AutomateClient) getClient()).getSessionAppiumLogs(this); @@ -390,51 +392,51 @@ private void setOs(String os) { } /** - * @return The browser_console_logs_url + * @return The browserConsoleLogsUrl */ @JsonProperty("browser_console_logs_url") public String getBrowserConsoleLogsUrl() { - return browser_console_logs_url; + return browserConsoleLogsUrl; } /** - * @param browser_console_logs_url The browser_console_logs_url + * @param browserConsoleLogsUrl The browser_console_logs_url */ @JsonProperty("browser_console_logs_url") - private void setBrowserConsoleLogsUrl(String browser_console_logs_url) { - this.browser_console_logs_url = browser_console_logs_url; + private void setBrowserConsoleLogsUrl(String browserConsoleLogsUrl) { + this.browserConsoleLogsUrl = browserConsoleLogsUrl; } /** - * @return The har_logs_url + * @return The harLogsUrl */ @JsonProperty("har_logs_url") public String getHarLogsUrl() { - return har_logs_url; + return harLogsUrl; } /** - * @param har_logs_url The har_logs_url + * @param harLogsUrl The har_logs_url */ @JsonProperty("har_logs_url") - private void setHarLogsUrl(String har_logs_url) { - this.har_logs_url = har_logs_url; + private void setHarLogsUrl(String harLogsUrl) { + this.harLogsUrl = harLogsUrl; } /** - * @return The appium_logs_url + * @return The appiumLogsUrl */ @JsonProperty("appium_logs_url") public String getAppiumLogsUrl() { - return appium_logs_url; + return appiumLogsUrl; } /** - * @param appium_logs_url The appium_logs_url + * @param appiumLogsUrl The appium_logs_url */ @JsonProperty("appium_logs_url") - private void setAppiumLogsUrl(String appium_logs_url) { - this.appium_logs_url = appium_logs_url; + private void setAppiumLogsUrl(String appiumLogsUrl) { + this.appiumLogsUrl = appiumLogsUrl; } @JsonAnyGetter diff --git a/src/test/java/com/browserstack/automate/AutomateClientTest.java b/src/test/java/com/browserstack/automate/AutomateClientTest.java index 09f4b83..06c333c 100644 --- a/src/test/java/com/browserstack/automate/AutomateClientTest.java +++ b/src/test/java/com/browserstack/automate/AutomateClientTest.java @@ -261,6 +261,7 @@ public void testGetSessionConsoleLogs() { public void testGetSessionHARLogs() { // TODO: Verify if logs are non-empty // Cannot currently be tested during in-progress sessions + // This test may fail sometimes. If the session does not have network logs enabled. try { String buildId = automateClient.getBuilds().get(0).getId(); List sessions = automateClient.getSessions(buildId); @@ -283,6 +284,7 @@ public void testGetSessionHARLogs() { public void testGetSessionAppiumLogs() { // TODO: Verify if logs are non-empty // Cannot currently be tested during in-progress sessions + // This test may fail sometimes. If the session does not have appium logs enabled. try { String buildId = automateClient.getBuilds().get(0).getId(); List sessions = automateClient.getSessions(buildId);