From 13d168c8a55df8e5cb5f3b5359f6893a1461bc3c Mon Sep 17 00:00:00 2001 From: Roman Zabaluev Date: Mon, 1 Aug 2022 20:18:24 +0400 Subject: [PATCH] Fix e2e run on m1/arm (#2371) * Fix e2e run on m1 * Update README.md --- kafka-ui-e2e-checks/README.md | 2 +- kafka-ui-e2e-checks/pom.xml | 8 +- .../kafka/ui/helpers/TestConfiguration.java | 4 +- .../com/provectus/kafka/ui/base/BaseTest.java | 205 ++++++++++-------- 4 files changed, 122 insertions(+), 97 deletions(-) diff --git a/kafka-ui-e2e-checks/README.md b/kafka-ui-e2e-checks/README.md index a970ef38dd..25dc51d658 100644 --- a/kafka-ui-e2e-checks/README.md +++ b/kafka-ui-e2e-checks/README.md @@ -18,7 +18,7 @@ This repository is for E2E UI automation. ### Prerequisites - Docker & Docker-compose -- Java +- Java (install aarch64 jdk if you have M1/arm chip) - Maven ### How to install diff --git a/kafka-ui-e2e-checks/pom.xml b/kafka-ui-e2e-checks/pom.xml index 5f013a2b28..d7f4f3ea28 100644 --- a/kafka-ui-e2e-checks/pom.xml +++ b/kafka-ui-e2e-checks/pom.xml @@ -126,6 +126,12 @@ netty-transport-native-unix-common ${netty.version} + + io.netty + netty-resolver-dns-native-macos + ${netty.version} + osx-aarch_64 + org.testcontainers @@ -208,7 +214,7 @@ org.junit.platform junit-platform-launcher - ${junit.platform-launcher.version} + ${junit.platform-launcher.version} ru.yandex.qatools.allure diff --git a/kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/helpers/TestConfiguration.java b/kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/helpers/TestConfiguration.java index 1134bf4f7e..f8cf311167 100644 --- a/kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/helpers/TestConfiguration.java +++ b/kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/helpers/TestConfiguration.java @@ -14,10 +14,8 @@ public class TestConfiguration { Boolean.parseBoolean(System.getProperty("SAVE_PAGE_SOURCE", "false")); public static Boolean REOPEN_BROWSER_ON_FAIL = Boolean.parseBoolean(System.getProperty("REOPEN_BROWSER_ON_FAIL", "true")); - public static String BROWSER = System.getProperty("BROWSER", "chrome"); + public static String BROWSER = System.getProperty("BROWSER", "chromium"); public static String BROWSER_SIZE = System.getProperty("BROWSER_SIZE", "1920x1080"); public static Boolean ENABLE_VNC = Boolean.parseBoolean(System.getProperty("ENABLE_VNC", "true")); - public static String IMAGE_NAME = System.getProperty("SELENIUM_DOCKER_IMAGE", "selenium/standalone-chrome"); - public static String IMAGE_TAG = System.getProperty("SELENIUM_IMAGE_TAG", "103.0"); } diff --git a/kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/base/BaseTest.java b/kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/base/BaseTest.java index a188d0fd7f..9ccd401b31 100644 --- a/kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/base/BaseTest.java +++ b/kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/base/BaseTest.java @@ -12,10 +12,18 @@ import com.provectus.kafka.ui.utils.qaseIO.TestCaseGenerator; import io.github.cdimascio.dotenv.Dotenv; import io.qameta.allure.Allure; import io.qameta.allure.selenide.AllureSelenide; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.*; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayNameGeneration; import org.openqa.selenium.Dimension; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; @@ -26,112 +34,125 @@ import org.testcontainers.containers.BrowserWebDriverContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.utility.DockerImageName; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.util.Arrays; - @Slf4j @DisplayNameGeneration(CamelCaseToSpacedDisplayNameGenerator.class) public class BaseTest { - protected Pages pages = Pages.INSTANCE; - protected Helpers helpers = Helpers.INSTANCE; + public static final String SELENIUM_IMAGE_NAME = "selenium/standalone-chrome"; + public static final String SELENIARM_STANDALONE_CHROMIUM = "seleniarm/standalone-chromium"; + protected Pages pages = Pages.INSTANCE; + protected Helpers helpers = Helpers.INSTANCE; - private Screenshooter screenshooter = new Screenshooter(); + private Screenshooter screenshooter = new Screenshooter(); - private static final String IMAGE_NAME = TestConfiguration.IMAGE_NAME; - private static final String IMAGE_TAG = TestConfiguration.IMAGE_TAG; - protected static BrowserWebDriverContainer webDriverContainer = null; + protected static BrowserWebDriverContainer webDriverContainer = null; - public void compareScreenshots(String name) { - screenshooter.compareScreenshots(name); + public void compareScreenshots(String name) { + screenshooter.compareScreenshots(name); + } + + public void compareScreenshots(String name, Boolean shouldUpdateScreenshots) { + screenshooter.compareScreenshots(name, shouldUpdateScreenshots); + } + + @BeforeEach + public void setWebDriver() { + RemoteWebDriver remoteWebDriver = webDriverContainer.getWebDriver(); + WebDriverRunner.setWebDriver(remoteWebDriver); + remoteWebDriver.manage().window().setSize(new Dimension(1440, 1024)); + } + + @BeforeAll + public static void start() { + + DockerImageName image = isARM64() + ? DockerImageName.parse(SELENIARM_STANDALONE_CHROMIUM).asCompatibleSubstituteFor(SELENIUM_IMAGE_NAME) + : DockerImageName.parse(SELENIUM_IMAGE_NAME); + log.info("Using [{}] as image name for chrome", image.getUnversionedPart()); + + webDriverContainer = new BrowserWebDriverContainer<>(image) + .withEnv("JAVA_OPTS", "-Dwebdriver.chrome.whitelistedIps=") + .withCapabilities(new ChromeOptions() + .addArguments("--disable-dev-shm-usage") + .addArguments("--verbose") + ) + .waitingFor(Wait.forHttp("/")) + //.withLogConsumer(new Slf4jLogConsumer(log).withPrefix("[CHROME]: ")) // uncomment for debugging + .waitingFor(Wait.forLogMessage(".*Started Selenium Standalone.*", 1)); + try { + Testcontainers.exposeHostPorts(8080); + webDriverContainer.start(); + } catch (Throwable e) { + log.error("Couldn't start a container", e); } + } - public void compareScreenshots(String name, Boolean shouldUpdateScreenshots) { - screenshooter.compareScreenshots(name, shouldUpdateScreenshots); + @AfterAll + public static void tearDown() { + if (webDriverContainer.isRunning()) { + webDriverContainer.close(); + webDriverContainer.stop(); } + } - @BeforeEach - public void setWebDriver() { - RemoteWebDriver remoteWebDriver = webDriverContainer.getWebDriver(); - WebDriverRunner.setWebDriver(remoteWebDriver); - remoteWebDriver.manage().window().setSize(new Dimension(1440, 1024)); + static { + if (!new File("./.env").exists()) { + try { + FileUtils.copyFile(new File(".env.example"), new File(".env")); + } catch (IOException e) { + log.error("couldn't copy .env.example to .env. Please add .env"); + e.printStackTrace(); + } } + Dotenv.load().entries().forEach(env -> System.setProperty(env.getKey(), env.getValue())); + if (TestConfiguration.CLEAR_REPORTS_DIR) { + clearReports(); + } + setup(); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + if (TestCaseGenerator.FAILED) { + log.error( + "Tests FAILED because some problem with @CaseId annotation. Verify that all tests annotated with @CaseId and Id is correct!"); + Runtime.getRuntime().halt(100500); + } + })); + } - @BeforeAll - public static void start() { - DockerImageName image = DockerImageName.parse(IMAGE_NAME).withTag(IMAGE_TAG); - webDriverContainer = new BrowserWebDriverContainer<>(image) - .withCapabilities(new ChromeOptions().addArguments("--disable-dev-shm-usage")) - .waitingFor(Wait.forHttp("/")) - .waitingFor(Wait.forLogMessage(".*Started Selenium Standalone.*", 1)); - Testcontainers.exposeHostPorts(8080); - webDriverContainer.start(); - webDriverContainer.isRunning(); - webDriverContainer.isHostAccessible(); - } + @AfterEach + public void afterMethod() { + Allure.addAttachment("Screenshot", + new ByteArrayInputStream( + ((TakesScreenshot) webDriverContainer.getWebDriver()).getScreenshotAs(OutputType.BYTES))); + } - @AfterAll - public static void tearDown() { - if (webDriverContainer.isRunning()) { - webDriverContainer.close(); - webDriverContainer.stop(); - } - } + @SneakyThrows + private static void setup() { + Configuration.reportsFolder = TestConfiguration.REPORTS_FOLDER; + Configuration.screenshots = TestConfiguration.SCREENSHOTS; + Configuration.savePageSource = TestConfiguration.SAVE_PAGE_SOURCE; + Configuration.reopenBrowserOnFail = TestConfiguration.REOPEN_BROWSER_ON_FAIL; + Configuration.browser = TestConfiguration.BROWSER; + Configuration.baseUrl = TestConfiguration.BASE_WEB_URL; + Configuration.timeout = 10000; + Configuration.browserSize = TestConfiguration.BROWSER_SIZE; + SelenideLogger.addListener("allure", new AllureSelenide().savePageSource(false)); + } - static { - if (!new File("./.env").exists()) { - try { - FileUtils.copyFile(new File(".env.example"), new File(".env")); - } catch (IOException e) { - log.error("couldn't copy .env.example to .env. Please add .env"); - e.printStackTrace(); - } - } - Dotenv.load().entries().forEach(env -> System.setProperty(env.getKey(), env.getValue())); - if (TestConfiguration.CLEAR_REPORTS_DIR) { - clearReports(); - } - setup(); - Runtime.getRuntime().addShutdownHook(new Thread(() -> { - if (TestCaseGenerator.FAILED) { - log.error("Tests FAILED because some problem with @CaseId annotation. Verify that all tests annotated with @CaseId and Id is correct!"); - Runtime.getRuntime().halt(100500); - } - })); + public static void clearReports() { + log.info(String.format("Clearing reports dir [%s]...", TestConfiguration.REPORTS_FOLDER)); + File allureResults = new File(TestConfiguration.REPORTS_FOLDER); + if (allureResults.isDirectory()) { + File[] list = allureResults.listFiles(); + if (list != null) { + Arrays.stream(list) + .sequential() + .filter(e -> !e.getName().equals("categories.json")) + .forEach(File::delete); + } } + } - @AfterEach - public void afterMethod() { - Allure.addAttachment("Screenshot", - new ByteArrayInputStream(((TakesScreenshot) webDriverContainer.getWebDriver()).getScreenshotAs(OutputType.BYTES))); - } - - @SneakyThrows - private static void setup() { - Configuration.reportsFolder = TestConfiguration.REPORTS_FOLDER; - Configuration.screenshots = TestConfiguration.SCREENSHOTS; - Configuration.savePageSource = TestConfiguration.SAVE_PAGE_SOURCE; - Configuration.reopenBrowserOnFail = TestConfiguration.REOPEN_BROWSER_ON_FAIL; - Configuration.browser = TestConfiguration.BROWSER; - Configuration.baseUrl = TestConfiguration.BASE_WEB_URL; - Configuration.timeout = 10000; - Configuration.browserSize = TestConfiguration.BROWSER_SIZE; - SelenideLogger.addListener("allure", new AllureSelenide().savePageSource(false)); - } - - public static void clearReports() { - log.info(String.format("Clearing reports dir [%s]...", TestConfiguration.REPORTS_FOLDER)); - File allureResults = new File(TestConfiguration.REPORTS_FOLDER); - if (allureResults.isDirectory()) { - File[] list = allureResults.listFiles(); - if (list != null) { - Arrays.stream(list) - .sequential() - .filter(e -> !e.getName().equals("categories.json")) - .forEach(File::delete); - } - } - } + private static boolean isARM64() { + return System.getProperty("os.arch").equals("aarch64"); + } }