diff --git a/selenium/che-selenium-core/bin/webdriver.sh b/selenium/che-selenium-core/bin/webdriver.sh index 36d9640a99d..df84fef0795 100755 --- a/selenium/che-selenium-core/bin/webdriver.sh +++ b/selenium/che-selenium-core/bin/webdriver.sh @@ -830,7 +830,7 @@ storeTestReport() { if [[ -f ${TMP_SUITE_PATH} ]]; then cp ${TMP_SUITE_PATH} target/suite; fi - zip -qr ${report} target/screenshots target/htmldumps target/workspace-logs target/site target/failsafe-reports target/log target/bin target/suite + zip -qr ${report} target/screenshots target/htmldumps target/workspace-logs target/webdriver-logs target/site target/failsafe-reports target/log target/bin target/suite echo -e "[TEST] Tests results and reports are saved to ${BLUE}${report}${NO_COLOUR}" echo "[TEST]" diff --git a/selenium/che-selenium-core/pom.xml b/selenium/che-selenium-core/pom.xml index 9d439b44cde..ef0f8786184 100644 --- a/selenium/che-selenium-core/pom.xml +++ b/selenium/che-selenium-core/pom.xml @@ -90,6 +90,10 @@ org.eclipse.che.core che-core-commons-annotations + + org.eclipse.che.core + che-core-commons-json + org.eclipse.che.core che-core-commons-lang diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/SeleniumWebDriver.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/SeleniumWebDriver.java index a381aef2ba2..2f4b3eb04a5 100644 --- a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/SeleniumWebDriver.java +++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/SeleniumWebDriver.java @@ -255,7 +255,8 @@ private RemoteWebDriver doCreateDriver(URL webDriverUrl) { switch (browser) { case GOOGLE_CHROME: LoggingPreferences loggingPreferences = new LoggingPreferences(); - loggingPreferences.enable(LogType.BROWSER, Level.SEVERE); + loggingPreferences.enable(LogType.PERFORMANCE, Level.ALL); + loggingPreferences.enable(LogType.BROWSER, Level.ALL); ChromeOptions options = new ChromeOptions(); options.addArguments("--no-sandbox"); diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/inject/SeleniumTestHandler.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/inject/SeleniumTestHandler.java index 1f0f58b03c4..c7f021c1364 100644 --- a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/inject/SeleniumTestHandler.java +++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/inject/SeleniumTestHandler.java @@ -41,6 +41,7 @@ import java.util.stream.Stream; import javax.annotation.PreDestroy; import javax.validation.constraints.NotNull; +import org.eclipse.che.commons.json.JsonParseException; import org.eclipse.che.commons.lang.NameGenerator; import org.eclipse.che.selenium.core.SeleniumWebDriver; import org.eclipse.che.selenium.core.client.TestGitHubServiceClient; @@ -50,6 +51,7 @@ import org.eclipse.che.selenium.core.pageobject.PageObjectsInjector; import org.eclipse.che.selenium.core.user.InjectTestUser; import org.eclipse.che.selenium.core.user.TestUser; +import org.eclipse.che.selenium.core.webdriver.log.WebDriverLogsReaderFactory; import org.eclipse.che.selenium.core.workspace.InjectTestWorkspace; import org.eclipse.che.selenium.core.workspace.TestWorkspace; import org.eclipse.che.selenium.core.workspace.TestWorkspaceLogsReader; @@ -93,6 +95,10 @@ public abstract class SeleniumTestHandler @Named("tests.htmldumps_dir") private String htmldumpsDir; + @Inject + @Named("tests.webdriverlogs_dir") + private String webDriverLogsDir; + @Inject @Named("tests.workspacelogs_dir") private String workspaceLogsDir; @@ -128,6 +134,7 @@ public abstract class SeleniumTestHandler @Inject private TestGitHubServiceClient gitHubClientService; @Inject private TestWorkspaceLogsReader testWorkspaceLogsReader; @Inject private SeleniumTestStatistics seleniumTestStatistics; + @Inject private WebDriverLogsReaderFactory webDriverLogsReaderFactory; private final Injector injector; private final Map runningTests = new ConcurrentHashMap<>(); @@ -302,6 +309,7 @@ private void onTestFinish(ITestResult result) { captureScreenshot(result); captureHtmlSource(result); captureTestWorkspaceLogs(result); + storeWebDriverLogs(result); } } @@ -464,6 +472,32 @@ private void captureScreenshotsFromOpenedWindows( }); } + private void storeWebDriverLogs(ITestResult result) { + Set webDrivers = new HashSet<>(); + Object testInstance = result.getInstance(); + collectInjectedWebDrivers(testInstance, webDrivers); + webDrivers.forEach(webDriver -> storeWebDriverLogs(result, webDriver)); + } + + private void storeWebDriverLogs(ITestResult result, SeleniumWebDriver webDriver) { + String testReference = getTestReference(result); + + try { + String filename = NameGenerator.generate(testReference + "_", 4) + ".log"; + Path webDriverLogsDirectory = Paths.get(webDriverLogsDir, filename); + Files.createDirectories(webDriverLogsDirectory.getParent()); + Files.write( + webDriverLogsDirectory, + webDriverLogsReaderFactory + .create(webDriver) + .getAllLogs() + .getBytes(Charset.forName("UTF-8")), + StandardOpenOption.CREATE); + } catch (WebDriverException | IOException | JsonParseException e) { + LOG.error(format("Can't store web driver logs related to test %s.", testReference), e); + } + } + private void dumpHtmlCodeFromTheCurrentPage(ITestResult result, SeleniumWebDriver webDriver) { String testReference = getTestReference(result); String filename = NameGenerator.generate(testReference + "_", 8) + ".html"; diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/utils/BrowserLogsUtil.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/utils/BrowserLogsUtil.java deleted file mode 100644 index e448bd7f1a0..00000000000 --- a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/utils/BrowserLogsUtil.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2012-2018 Red Hat, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Red Hat, Inc. - initial API and implementation - */ -package org.eclipse.che.selenium.core.utils; - -import static org.openqa.selenium.logging.LogType.BROWSER; - -import com.google.inject.Inject; -import com.google.inject.Singleton; -import java.net.URL; -import java.util.List; -import org.eclipse.che.selenium.core.SeleniumWebDriver; -import org.openqa.selenium.logging.LogEntry; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Read and store browser logs to the test logs. Log level and type are defined in {@link - * org.eclipse.che.selenium.core.SeleniumWebDriver#doCreateDriver(URL)} - */ -@Singleton -public class BrowserLogsUtil { - private final SeleniumWebDriver seleniumWebDriver; - private final Logger LOG = LoggerFactory.getLogger(BrowserLogsUtil.class); - - @Inject - public BrowserLogsUtil(SeleniumWebDriver seleniumWebDriver) { - this.seleniumWebDriver = seleniumWebDriver; - } - - /** - * read logs from browser console - * - * @return log messages from browser console - */ - public List getLogs() { - return seleniumWebDriver.manage().logs().get(BROWSER).getAll(); - } - - /** store browser logs to the test logs */ - public void storeLogs() { - getLogs().forEach(logEntry -> LOG.info("{} {}", logEntry.getLevel(), logEntry.getMessage())); - } -} diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Log.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Log.java new file mode 100644 index 00000000000..cf91f7cfa89 --- /dev/null +++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Log.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2012-2018 Red Hat, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.selenium.core.webdriver.log; + +import static java.lang.String.format; +import static org.eclipse.che.selenium.core.webdriver.log.WebDriverLogsReader.LOG_TIME_FORMAT; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * This class deals with web driver log entry. + * + * @author Dmytro Nochevnov + */ +public class Log { + private Message message; + private long timestamp; + + public Message getMessage() { + return message; + } + + public void setMessage(Message message) { + this.message = message; + } + + boolean isNetworkLog() { + return isNetworkRequest() + || isNetworkResponse() + || isWebsocketCreated() + || isWebsocketRequest() + || isWebsocketResponse(); + } + + private boolean isNetworkRequest() { + return "Network.requestWillBeSent".equals(getMessage().getMethod()); + } + + private boolean isNetworkResponse() { + return "Network.responseReceived".equals(getMessage().getMethod()); + } + + private boolean isWebsocketCreated() { + return "Network.webSocketCreated".equals(getMessage().getMethod()); + } + + private boolean isWebsocketRequest() { + return "Network.webSocketFrameSent".equals(getMessage().getMethod()); + } + + private boolean isWebsocketResponse() { + return "Network.webSocketFrameReceived".equals(getMessage().getMethod()); + } + + public String getUrl() { + if (hasRequest()) { + return getMessage().getParams().getRequest().getUrl(); + + } else if (hasResponse()) { + return getMessage().getParams().getResponse().getUrl(); + + } else if (hasParams() && getMessage().getParams().getUrl() != null) { + return getMessage().getParams().getUrl(); + } + + return ""; + } + + public String getRequestId() { + if (hasParams()) { + return getMessage().getParams().getRequestId(); + } + + return ""; + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + private String getRequestMethod() { + if (hasRequest()) { + return getMessage().getParams().getRequest().getMethod(); + } + + return ""; + } + + private String getResponseStatus() { + if (hasResponse()) { + return getMessage().getParams().getResponse().getStatus(); + } + + return ""; + } + + private String getPayloadData() { + if (hasResponse()) { + return getMessage().getParams().getResponse().getPayloadData(); + } + + return ""; + } + + private boolean hasRequest() { + return hasParams() && getMessage().getParams().getRequest() != null; + } + + private boolean hasResponse() { + return hasParams() && getMessage().getParams().getResponse() != null; + } + + private boolean hasParams() { + return getMessage() != null && getMessage().getParams() != null; + } + + private String formatTime(long timestamp) { + return new SimpleDateFormat(LOG_TIME_FORMAT).format(new Date(timestamp)); + } + + @Override + public String toString() { + String prefix = format("%s (id: %s)", formatTime(getTimestamp()), getRequestId()); + + if (isNetworkRequest()) { + return format("%s [REQUEST] %s %s\n", prefix, getRequestMethod(), getUrl()); + + } else if (isNetworkResponse()) { + return format("%s [RESPONSE] %s %s\n", prefix, getResponseStatus(), getUrl()); + + } else if (isWebsocketCreated()) { + return format("%s [WEBSOCKET_CREATED] %s\n", prefix, getUrl()); + + } else if (isWebsocketRequest()) { + return format("%s [WEBSOCKET_REQUEST] %s\n", prefix, getPayloadData()); + + } else if (isWebsocketResponse()) { + return format("%s [WEBSOCKET_RESPONSE] %s\n", prefix, getPayloadData()); + } + + return super.toString(); + } +} diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Message.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Message.java new file mode 100644 index 00000000000..c61006bda06 --- /dev/null +++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Message.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2012-2018 Red Hat, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.selenium.core.webdriver.log; + +/** + * This is POJO to extract message from web driver network log entry + * + * @author Dmytro Nochevnov + */ +public interface Message { + String getMethod(); + + void setMethod(String method); + + Params getParams(); + + void setParams(Params params); +} diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Params.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Params.java new file mode 100644 index 00000000000..bd217b0385e --- /dev/null +++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Params.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2012-2018 Red Hat, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.selenium.core.webdriver.log; + +/** + * This is POJO to extract 'params' value from web driver network log entry + * + * @author Dmytro Nochevnov + */ +public interface Params { + String getRequestId(); + + void setRequestId(String requestId); + + String getUrl(); + + void setUrl(String url); + + Request getRequest(); + + void setRequest(Request request); + + Response getResponse(); + + void setResponse(Response request); + + String getTimestamp(); + + void setTimestamp(String timestamp); +} diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Request.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Request.java new file mode 100644 index 00000000000..43fda93558d --- /dev/null +++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Request.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2012-2018 Red Hat, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.selenium.core.webdriver.log; + +/** + * This is POJO to extract `request` value from web driver network log entry. + * + * @author Dmytro Nochevnov + */ +public interface Request { + String getUrl(); + + void setUrl(String url); + + String getMethod(); + + void setMethod(String method); + + String getWallTime(); + + void setWallTime(String wallTime); +} diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Response.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Response.java new file mode 100644 index 00000000000..87aa275b283 --- /dev/null +++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Response.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2012-2018 Red Hat, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.selenium.core.webdriver.log; + +/** + * This is POJO to extract 'response' value from web driver network log entry. + * + * @author Dmytro Nochevnov + */ +public interface Response { + String getUrl(); + + void setUrl(String url); + + String getStatus(); + + void setStatus(String status); + + String getPayloadData(); + + void setPayloadData(String payloadData); +} diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/WebDriverLogsReader.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/WebDriverLogsReader.java new file mode 100644 index 00000000000..1a1a6cc2b87 --- /dev/null +++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/WebDriverLogsReader.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2012-2018 Red Hat, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.selenium.core.webdriver.log; + +import static java.lang.String.format; +import static org.openqa.selenium.logging.LogType.BROWSER; +import static org.openqa.selenium.logging.LogType.PERFORMANCE; + +import com.google.inject.Inject; +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import com.google.inject.name.Named; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.eclipse.che.commons.json.JsonHelper; +import org.eclipse.che.commons.json.JsonParseException; +import org.eclipse.che.selenium.core.SeleniumWebDriver; +import org.openqa.selenium.logging.LogEntries; +import org.openqa.selenium.logging.LogEntry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class WebDriverLogsReader { + public static final String LOG_TIME_FORMAT = "yyyy-MM-dd hh:mm:ss,SSS"; + private static final Logger LOG = LoggerFactory.getLogger(WebDriverLogsReader.class); + + private final SeleniumWebDriver seleniumWebDriver; + private final String cheHost; + + @Inject + public WebDriverLogsReader( + @Named("che.host") String cheHost, SeleniumWebDriver seleniumWebDriver) { + this.seleniumWebDriver = seleniumWebDriver; + this.cheHost = cheHost; + } + + @AssistedInject + public WebDriverLogsReader( + @Assisted SeleniumWebDriver seleniumWebDriver, @Named("che.host") String cheHost) { + this.seleniumWebDriver = seleniumWebDriver; + this.cheHost = cheHost; + } + + /** + * Reads logs of browser from web driver. + * + * @return log messages from browser console + */ + private LogEntries readBrowserLogs() { + return seleniumWebDriver.manage().logs().get(BROWSER); + } + + /** + * Reads performance logs from web driver. + * + * @return all types of performance logs + */ + private LogEntries readPerformanceLogs() { + return seleniumWebDriver.manage().logs().get(PERFORMANCE); + } + + /** + * Gets all logs of web driver. + * + * @return logs from browser console and Eclipse Che network logs + */ + public String getAllLogs() throws JsonParseException { + return prepareBrowserLogs() + "\n" + prepareCheNetworkLogs(); + } + + private String prepareBrowserLogs() { + StringBuilder browserLogsOutput = + new StringBuilder("Browser console logs:\n").append("---------------------\n"); + + readBrowserLogs() + .forEach( + logEntry -> + browserLogsOutput.append( + format( + "%s %s %s\n\n", + formatTime(logEntry.getTimestamp()), + logEntry.getLevel(), + logEntry.getMessage()))); + + return browserLogsOutput.toString(); + } + + /** filter data and get requests/responses that have been sent on CHE URL */ + private String prepareCheNetworkLogs() throws JsonParseException { + StringBuilder networkLogsOutput = + new StringBuilder("Eclipse Che network logs: \n").append("-------------------------\n"); + Map> networkLogs = new HashMap<>(); + for (LogEntry logEntry : readPerformanceLogs()) { + Log log = JsonHelper.fromJson(logEntry.getMessage(), Log.class, null); + if (log.isNetworkLog()) { + log.setTimestamp(logEntry.getTimestamp()); + if (networkLogs.containsKey(log.getRequestId())) { + networkLogs.get(log.getRequestId()).add(log); + } else { + ArrayList logs = new ArrayList<>(); + logs.add(log); + networkLogs.put(log.getRequestId(), logs); + } + + if (isLogFromCheTraffic(log.getRequestId(), networkLogs)) { + networkLogsOutput.append(log.toString()); + } else { + networkLogs.remove(log.getRequestId()); + } + } + } + + return networkLogsOutput.toString(); + } + + /** + * Go through the {@code networkLogs} related to the certain {@code requestId} and return {@code + * true} if at least one of them has url from Che traffic. + */ + private boolean isLogFromCheTraffic(String requestId, Map> networkLogs) { + return networkLogs + .get(requestId) + .stream() + .filter(log -> isUrlFromCheTraffic(log.getUrl())) + .count() + > 0; + } + + private boolean isUrlFromCheTraffic(String url) { + return url != null + && (url.matches(format("https?://%s[:\\d]*/api/.*", cheHost)) + || url.matches(format("wss?://%s[:\\d]*/(api|connect|wsagent).*", cheHost))); + } + + private String formatTime(long timestamp) { + return new SimpleDateFormat(LOG_TIME_FORMAT).format(new Date(timestamp)); + } +} diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/WebDriverLogsReaderFactory.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/WebDriverLogsReaderFactory.java new file mode 100644 index 00000000000..f575c5511b9 --- /dev/null +++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/WebDriverLogsReaderFactory.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2012-2018 Red Hat, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.selenium.core.webdriver.log; + +import org.eclipse.che.selenium.core.SeleniumWebDriver; + +/** @author Dmytro Nochevnov */ +public interface WebDriverLogsReaderFactory { + + WebDriverLogsReader create(SeleniumWebDriver webdriver); +} diff --git a/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/core/CheSeleniumSuiteModule.java b/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/core/CheSeleniumSuiteModule.java index 1a98e05b6b6..289ae3ec642 100644 --- a/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/core/CheSeleniumSuiteModule.java +++ b/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/core/CheSeleniumSuiteModule.java @@ -49,6 +49,7 @@ import org.eclipse.che.selenium.core.user.CheDefaultTestUser; import org.eclipse.che.selenium.core.user.TestUser; import org.eclipse.che.selenium.core.user.TestUserFactory; +import org.eclipse.che.selenium.core.webdriver.log.WebDriverLogsReaderFactory; import org.eclipse.che.selenium.core.workspace.CheTestWorkspaceUrlResolver; import org.eclipse.che.selenium.core.workspace.TestWorkspace; import org.eclipse.che.selenium.core.workspace.TestWorkspaceProvider; @@ -97,6 +98,7 @@ public void configure() { install(new FactoryModuleBuilder().build(TestWorkspaceServiceClientFactory.class)); install(new FactoryModuleBuilder().build(TestUserFactory.class)); install(new FactoryModuleBuilder().build(TestUserServiceClientFactory.class)); + install(new FactoryModuleBuilder().build(WebDriverLogsReaderFactory.class)); bind(PageObjectsInjector.class).to(PageObjectsInjectorImpl.class); diff --git a/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/ProjectExplorer.java b/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/ProjectExplorer.java index 87d708b6f1f..36b1935a72d 100644 --- a/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/ProjectExplorer.java +++ b/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/ProjectExplorer.java @@ -58,7 +58,6 @@ import org.eclipse.che.selenium.core.constant.TestProjectExplorerContextMenuConstants.ContextMenuCommandGoals; import org.eclipse.che.selenium.core.constant.TestProjectExplorerContextMenuConstants.ContextMenuFirstLevelItems; import org.eclipse.che.selenium.core.constant.TestProjectExplorerContextMenuConstants.ContextMenuItems; -import org.eclipse.che.selenium.core.utils.BrowserLogsUtil; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.Keys; @@ -82,7 +81,6 @@ public class ProjectExplorer { private final NavigateToFile navigateToFile; private final CodenvyEditor editor; private final TestWebElementRenderChecker testWebElementRenderChecker; - private final BrowserLogsUtil browserLogsUtil; private final SeleniumWebDriverHelper seleniumWebDriverHelper; private final WebDriverWaitFactory waitFactory; private final int DEFAULT_TIMEOUT; @@ -95,7 +93,6 @@ public ProjectExplorer( NavigateToFile navigateToFile, CodenvyEditor editor, TestWebElementRenderChecker testWebElementRenderChecker, - BrowserLogsUtil browserLogsUtil, SeleniumWebDriverHelper seleniumWebDriverHelper, WebDriverWaitFactory webDriverWaitFactory) { this.seleniumWebDriver = seleniumWebDriver; @@ -104,7 +101,6 @@ public ProjectExplorer( this.navigateToFile = navigateToFile; this.editor = editor; this.testWebElementRenderChecker = testWebElementRenderChecker; - this.browserLogsUtil = browserLogsUtil; this.seleniumWebDriverHelper = seleniumWebDriverHelper; this.waitFactory = webDriverWaitFactory; this.DEFAULT_TIMEOUT = LOAD_PAGE_TIMEOUT_SEC; @@ -255,7 +251,6 @@ public void waitProjectExplorer(int timeout) { } catch (TimeoutException ex) { // remove try-catch block after issue has been resolved if (seleniumWebDriverHelper.isVisible(By.id("ide-loader-progress-bar"))) { - browserLogsUtil.storeLogs(); fail("Known issue https://github.com/eclipse/che/issues/8468", ex); } diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteProposalJavaDocTest.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteProposalJavaDocTest.java index 71fc733a9ed..d5905fb1736 100644 --- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteProposalJavaDocTest.java +++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteProposalJavaDocTest.java @@ -18,7 +18,6 @@ import java.nio.file.Paths; import org.eclipse.che.selenium.core.client.TestProjectServiceClient; import org.eclipse.che.selenium.core.project.ProjectTemplates; -import org.eclipse.che.selenium.core.utils.BrowserLogsUtil; import org.eclipse.che.selenium.core.workspace.TestWorkspace; import org.eclipse.che.selenium.pageobject.CodenvyEditor; import org.eclipse.che.selenium.pageobject.Ide; @@ -51,7 +50,6 @@ public class AutocompleteProposalJavaDocTest { @Inject private CodenvyEditor editor; @Inject private NotificationsPopupPanel notificationsPopupPanel; @Inject private TestProjectServiceClient testProjectServiceClient; - @Inject private BrowserLogsUtil browserLogsUtil; @BeforeClass public void setup() throws Exception { @@ -217,7 +215,6 @@ private void launchAutocompleteAndWaitContainer() throws Exception { logExternalLibraries(); logProjectTypeChecking(); logProjectLanguageChecking(); - browserLogsUtil.storeLogs(); // remove try-catch block after issue has been resolved fail("Known issue https://github.com/eclipse/che/issues/7161", ex); diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteWithInheritTest.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteWithInheritTest.java index cd45ade6b3e..1a232430ffb 100644 --- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteWithInheritTest.java +++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteWithInheritTest.java @@ -20,7 +20,6 @@ import org.eclipse.che.commons.lang.NameGenerator; import org.eclipse.che.selenium.core.client.TestProjectServiceClient; import org.eclipse.che.selenium.core.project.ProjectTemplates; -import org.eclipse.che.selenium.core.utils.BrowserLogsUtil; import org.eclipse.che.selenium.core.workspace.TestWorkspace; import org.eclipse.che.selenium.pageobject.CodenvyEditor; import org.eclipse.che.selenium.pageobject.CodenvyEditor.MarkerLocator; @@ -60,7 +59,6 @@ public class AutocompleteWithInheritTest { @Inject private CodenvyEditor editor; @Inject private MavenPluginStatusBar mavenPluginStatusBar; @Inject private TestProjectServiceClient testProjectServiceClient; - @Inject private BrowserLogsUtil browserLogsUtil; @BeforeClass public void prepare() throws Exception { @@ -123,7 +121,6 @@ private void waitErrorMarkerInPosition() throws Exception { logExternalLibraries(); logProjectTypeChecking(); logProjectLanguageChecking(); - browserLogsUtil.storeLogs(); // remove try-catch block after issue has been resolved fail("Known issue https://github.com/eclipse/che/issues/7161", ex); diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/ShowHintsCommandTest.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/ShowHintsCommandTest.java index 03ae5da724d..de4b16e841d 100644 --- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/ShowHintsCommandTest.java +++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/ShowHintsCommandTest.java @@ -18,7 +18,6 @@ import org.eclipse.che.commons.lang.NameGenerator; import org.eclipse.che.selenium.core.client.TestProjectServiceClient; import org.eclipse.che.selenium.core.project.ProjectTemplates; -import org.eclipse.che.selenium.core.utils.BrowserLogsUtil; import org.eclipse.che.selenium.core.workspace.TestWorkspace; import org.eclipse.che.selenium.pageobject.CodenvyEditor; import org.eclipse.che.selenium.pageobject.CodenvyEditor.MarkerLocator; @@ -62,7 +61,6 @@ public class ShowHintsCommandTest { @Inject private CodenvyEditor editor; @Inject private TestProjectServiceClient testProjectServiceClient; @Inject private Consoles console; - @Inject private BrowserLogsUtil browserLogsUtil; @BeforeClass public void prepare() throws Exception { @@ -123,7 +121,6 @@ private void waitErrorMarkerInPosition() throws Exception { logExternalLibraries(); logProjectTypeChecking(); logProjectLanguageChecking(); - browserLogsUtil.storeLogs(); // remove try-catch block after issue has been resolved fail("Known issue https://github.com/eclipse/che/issues/7161", ex); diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/factory/CheckFactoryWithPerUserCreatePolicyTest.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/factory/CheckFactoryWithPerUserCreatePolicyTest.java index 83cb42ca5a4..d7eaa550b7b 100644 --- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/factory/CheckFactoryWithPerUserCreatePolicyTest.java +++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/factory/CheckFactoryWithPerUserCreatePolicyTest.java @@ -20,7 +20,6 @@ import org.eclipse.che.selenium.core.factory.FactoryTemplate; import org.eclipse.che.selenium.core.factory.TestFactory; import org.eclipse.che.selenium.core.factory.TestFactoryInitializer; -import org.eclipse.che.selenium.core.utils.BrowserLogsUtil; import org.eclipse.che.selenium.pageobject.NotificationsPopupPanel; import org.eclipse.che.selenium.pageobject.ProjectExplorer; import org.eclipse.che.selenium.pageobject.dashboard.Dashboard; @@ -38,7 +37,6 @@ public class CheckFactoryWithPerUserCreatePolicyTest { @Inject private NotificationsPopupPanel notificationsPopupPanel; @Inject private TestFactoryInitializer testFactoryInitializer; @Inject private SeleniumWebDriver seleniumWebDriver; - @Inject private BrowserLogsUtil browserLogsUtil; private TestFactory testFactory; private final Logger LOG = LoggerFactory.getLogger(CheckFactoryWithPerUserCreatePolicyTest.class); @@ -74,7 +72,6 @@ public void checkFactoryAcceptingWithPerUserPolicy() throws Exception { try { seleniumWebDriver.switchFromDashboardIframeToIde(); } catch (TimeoutException ex) { - browserLogsUtil.storeLogs(); LOG.info( String.format( CheckFactoryWithPerUserCreatePolicyTest.class.getSimpleName(), diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0093Test.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0093Test.java index ee8651820bf..90c14b8cbcd 100644 --- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0093Test.java +++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0093Test.java @@ -19,7 +19,6 @@ import org.eclipse.che.commons.lang.NameGenerator; import org.eclipse.che.selenium.core.client.TestProjectServiceClient; import org.eclipse.che.selenium.core.project.ProjectTemplates; -import org.eclipse.che.selenium.core.utils.BrowserLogsUtil; import org.eclipse.che.selenium.core.workspace.TestWorkspace; import org.eclipse.che.selenium.pageobject.CodenvyEditor; import org.eclipse.che.selenium.pageobject.Ide; @@ -47,7 +46,6 @@ public class Eclipse0093Test { @Inject private ProjectExplorer projectExplorer; @Inject private CodenvyEditor editor; @Inject private TestProjectServiceClient testProjectServiceClient; - @Inject private BrowserLogsUtil browserLogsUtil; @BeforeClass public void prepare() throws Exception { @@ -74,12 +72,10 @@ private void waitMarkerInPosition() throws Exception { try { editor.waitMarkerInPosition(WARNING, 12); } catch (TimeoutException ex) { + // remove try-catch block after issue has been resolved logExternalLibraries(); logProjectTypeChecking(); logProjectLanguageChecking(); - browserLogsUtil.storeLogs(); - - // remove try-catch block after issue has been resolved fail("Known issue https://github.com/eclipse/che/issues/7161", ex); } } diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0115Test.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0115Test.java index ac469532727..d14dce49d46 100644 --- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0115Test.java +++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0115Test.java @@ -19,7 +19,6 @@ import org.eclipse.che.commons.lang.NameGenerator; import org.eclipse.che.selenium.core.client.TestProjectServiceClient; import org.eclipse.che.selenium.core.project.ProjectTemplates; -import org.eclipse.che.selenium.core.utils.BrowserLogsUtil; import org.eclipse.che.selenium.core.workspace.TestWorkspace; import org.eclipse.che.selenium.pageobject.CodenvyEditor; import org.eclipse.che.selenium.pageobject.Ide; @@ -47,7 +46,6 @@ public class Eclipse0115Test { @Inject private ProjectExplorer projectExplorer; @Inject private CodenvyEditor editor; @Inject private TestProjectServiceClient testProjectServiceClient; - @Inject private BrowserLogsUtil browserLogsUtil; @BeforeClass public void prepare() throws Exception { @@ -76,7 +74,6 @@ private void waitMarkerInPosition() throws Exception { logExternalLibraries(); logProjectTypeChecking(); logProjectLanguageChecking(); - browserLogsUtil.storeLogs(); // remove try-catch block after issue has been resolved fail("Known issue https://github.com/eclipse/che/issues/7161", ex); diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0121Test.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0121Test.java index 7bbc5a67a95..fea11c56d73 100644 --- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0121Test.java +++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0121Test.java @@ -18,7 +18,6 @@ import org.eclipse.che.commons.lang.NameGenerator; import org.eclipse.che.selenium.core.client.TestProjectServiceClient; import org.eclipse.che.selenium.core.project.ProjectTemplates; -import org.eclipse.che.selenium.core.utils.BrowserLogsUtil; import org.eclipse.che.selenium.core.workspace.TestWorkspace; import org.eclipse.che.selenium.pageobject.CodenvyEditor; import org.eclipse.che.selenium.pageobject.Ide; @@ -47,7 +46,6 @@ public class Eclipse0121Test { @Inject private ProjectExplorer projectExplorer; @Inject private CodenvyEditor editor; @Inject private TestProjectServiceClient testProjectServiceClient; - @Inject private BrowserLogsUtil browserLogsUtil; @BeforeClass public void prepare() throws Exception { @@ -72,7 +70,6 @@ public void test0121() throws Exception { logExternalLibraries(); logProjectTypeChecking(); logProjectLanguageChecking(); - browserLogsUtil.storeLogs(); // remove try-catch block after issue has been resolved fail("Known issue https://github.com/eclipse/che/issues/7161", ex); diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/projectexplorer/CreateNewPackagesWithHelpCreationJavaClassTest.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/projectexplorer/CreateNewPackagesWithHelpCreationJavaClassTest.java index 702e4a18442..bba70f1a939 100644 --- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/projectexplorer/CreateNewPackagesWithHelpCreationJavaClassTest.java +++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/projectexplorer/CreateNewPackagesWithHelpCreationJavaClassTest.java @@ -20,7 +20,6 @@ import org.eclipse.che.selenium.core.constant.TestMenuCommandsConstants; import org.eclipse.che.selenium.core.project.ProjectTemplates; import org.eclipse.che.selenium.core.provider.TestApiEndpointUrlProvider; -import org.eclipse.che.selenium.core.utils.BrowserLogsUtil; import org.eclipse.che.selenium.core.workspace.TestWorkspace; import org.eclipse.che.selenium.pageobject.AskForValueDialog; import org.eclipse.che.selenium.pageobject.CodenvyEditor; @@ -52,7 +51,6 @@ public class CreateNewPackagesWithHelpCreationJavaClassTest { @Inject private TestProjectServiceClient testProjectServiceClient; @Inject private HttpJsonRequestFactory httpJsonRequestFactory; @Inject private TestApiEndpointUrlProvider testApiEndpointUrlProvider; - @Inject private BrowserLogsUtil browserLogsUtil; @BeforeClass public void setUp() throws Exception { @@ -100,7 +98,6 @@ public void createNewPackageFromContextMenuTest() throws Exception { projectExplorer.waitVisibilityByName("TestClass2.java"); } catch (TimeoutException ex) { // remove try-catch block after issue has been resolved - browserLogsUtil.storeLogs(); fail("Known issue https://github.com/eclipse/che/issues/8122"); } } diff --git a/selenium/che-selenium-test/src/test/resources/conf/selenium.properties b/selenium/che-selenium-test/src/test/resources/conf/selenium.properties index c539382aae4..8d6aed62fec 100644 --- a/selenium/che-selenium-test/src/test/resources/conf/selenium.properties +++ b/selenium/che-selenium-test/src/test/resources/conf/selenium.properties @@ -13,6 +13,7 @@ tests.screenshots_dir=target/screenshots tests.htmldumps_dir=target/htmldumps tests.workspacelogs_dir=target/workspace-logs +tests.webdriverlogs_dir=target/webdriver-logs # Workspace default size workspace.default_memory_gb=2