diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml new file mode 100644 index 00000000..dedc74e0 --- /dev/null +++ b/.github/workflows/validate.yml @@ -0,0 +1,65 @@ +name: Sonar +on: + workflow_run: + workflows: [Java CI with Gradle] + types: + - completed +jobs: + validate_versions: + runs-on: ubuntu-latest + + strategy: + matrix: + IJ: + - 2020.2 + - 2020.3 + - 2021.1 + - 2021.2 + - 2021.3 + - 2022.1 + - 2022.2 + - 2022.3 + - 2023.1 + - 2023.2 + - 2023.3 + - 2024.1 + - 2024.2 + - 2024.3 + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 11 # Java 11 is only used for test NewProjectDialogTest/setProjectSdkIfAvailableTest + uses: actions/setup-java@v4 + with: + java-version: 11 + distribution: 'temurin' + cache: 'gradle' + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: 'temurin' + cache: 'gradle' + - name: Run integration tests + run: | + cd src/test-project + xvfb-run --server-args="-screen 0 1920x1080x24" ./gradlew integrationUITest --warning-mode none -PcommunityIdeaVersion=${{ matrix.IJ }} + - name: Archiving tests reports + uses: actions/upload-artifact@v4 + with: + name: linux-test-reports-${{ matrix.IJ }} + path: src/test-project/build/reports/tests/* + if: always() + - name: Archiving screenshots + uses: actions/upload-artifact@v4 + with: + name: linux-screenshots-${{ matrix.IJ }} + path: src/test-project/build/screenshots/* + if-no-files-found: ignore + if: always() + - name: Archiving StepLogger logs + uses: actions/upload-artifact@v4 + with: + name: linux-steplogger-logs-${{ matrix.IJ }} + path: src/test-project/build/test-results/* + if: always() diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index e2d5c8b2..697749d3 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -12,6 +12,7 @@ + @@ -116,6 +117,21 @@ + + + + + + + + + + + + + + + @@ -129,6 +145,11 @@ + + + + + @@ -147,6 +168,14 @@ + + + + + + + + @@ -155,6 +184,14 @@ + + + + + + + + @@ -163,6 +200,11 @@ + + + + + @@ -174,6 +216,7 @@ + diff --git a/src/main/java/com/redhat/devtools/intellij/commonuitest/UITestRunner.java b/src/main/java/com/redhat/devtools/intellij/commonuitest/UITestRunner.java index 21f893c0..2dd666cf 100644 --- a/src/main/java/com/redhat/devtools/intellij/commonuitest/UITestRunner.java +++ b/src/main/java/com/redhat/devtools/intellij/commonuitest/UITestRunner.java @@ -80,7 +80,7 @@ public static RemoteRobot runIde(IntelliJVersion ideaVersion, int port) { ProcessBuilder pb; if (ideaVersion.toInt() < 20242) { - pb = new ProcessBuilder("." + File.separator + "gradlew" + fileExtension, "runIdeForUiTests", "-PideaVersion=" + ideaVersion, "-Drobot-server.port=" + port); + pb = new ProcessBuilder("." + File.separator + "gradlew" + fileExtension, "runIdeForUiTests", "-PideaVersion=" + platformTypeVersion[1], "-Drobot-server.port=" + port); } else { pb = new ProcessBuilder("." + File.separator + "gradlew" + fileExtension, "runIdeForUiTests", "-Drobot-server.port=" + port, "-PplatformType=" + platformTypeVersion[0], "-PplatformVersion=" + platformTypeVersion[1]); } diff --git a/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/dialogs/navigation/SearchEverywherePopup.java b/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/dialogs/navigation/SearchEverywherePopup.java index d908ecb3..3c755894 100644 --- a/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/dialogs/navigation/SearchEverywherePopup.java +++ b/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/dialogs/navigation/SearchEverywherePopup.java @@ -67,11 +67,21 @@ public void activateTab(String tabName) { * @param cmdToEnter command that will be invoked using the search field */ public void invokeCmd(String cmdToEnter) { + invokeSearch(cmdToEnter, true); + } + + public void searchText(String searchString){ + invokeSearch(searchString, false); + } + + private void invokeSearch(String searchText, boolean invoke){ JTextFieldFixture searchField = textField(JTextFieldFixture.Companion.byType(), Duration.ofSeconds(2)); searchField.click(); - searchField.setText(cmdToEnter); - waitFor(Duration.ofSeconds(30), Duration.ofSeconds(1), "The search in the Search Everywhere popup did not finish in 30 seconds.", () -> didSearchFinish(cmdToEnter)); - new Keyboard(remoteRobot).hotKey(KeyEvent.VK_ENTER); + searchField.setText(searchText); + waitFor(Duration.ofSeconds(30), Duration.ofSeconds(1), "the search dialog in the Search Everywhere popup to load in 30 seconds.", () -> didSearchFinish(searchText)); + if(invoke){ + new Keyboard(remoteRobot).hotKey(KeyEvent.VK_ENTER); + } } private boolean didSearchFinish(String cmdToInvoke) { diff --git a/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/mainidewindow/MainIdeWindow.java b/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/mainidewindow/MainIdeWindow.java index 8728dc34..ba9ed694 100644 --- a/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/mainidewindow/MainIdeWindow.java +++ b/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/mainidewindow/MainIdeWindow.java @@ -78,10 +78,10 @@ public void maximizeIdeWindow() { * Close the currently opened project */ public void closeProject() { - if (remoteRobot.isWin()) { - new MenuBar(remoteRobot).navigateTo("File", "Close Project"); - } else { + if (remoteRobot.isMac()) { invokeCmdUsingSearchEverywherePopup("Close Project"); + } else { + new MenuBar(remoteRobot).navigateTo("File", "Close Project"); } IdeInternalErrorUtils.clearWindowsErrorsIfTheyAppear(remoteRobot); remoteRobot.find(FlatWelcomeFrame.class, Duration.ofSeconds(10)).runJs("const horizontal_offset = component.getWidth()/2;\n" + @@ -98,6 +98,11 @@ public void invokeCmdUsingSearchEverywherePopup(String cmdToInvoke) { searchEverywherePopup.invokeCmd(cmdToInvoke); } + public void searchEverywhere(String searchString) { + SearchEverywherePopup searchEverywherePopup = openSearchEverywherePopup(); + searchEverywherePopup.searchText(searchString); + } + private SearchEverywherePopup openSearchEverywherePopup() { try { find(ActionButtonFixture.class, byXpath("//div[@myicon='search.svg']"), Duration.ofSeconds(5)).click(); diff --git a/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/mainidewindow/idestatusbar/IdeStatusBar.java b/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/mainidewindow/idestatusbar/IdeStatusBar.java index 2f0d7a22..4638b8ba 100644 --- a/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/mainidewindow/idestatusbar/IdeStatusBar.java +++ b/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/mainidewindow/idestatusbar/IdeStatusBar.java @@ -67,7 +67,7 @@ public void waitUntilAllBgTasksFinish() { * Wait until all the background tasks finish */ public void waitUntilAllBgTasksFinish(int timeout) { - waitFor(Duration.ofSeconds(timeout), Duration.ofSeconds(10), "The background tasks did not finish in " + timeout + " seconds.", this::didAllBgTasksFinish); + waitFor(Duration.ofSeconds(timeout), Duration.ofSeconds(10), "the background tasks to finish in " + timeout + " seconds.", this::didAllBgTasksFinish); } private boolean didProjectImportFinish() { diff --git a/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/mainidewindow/menubar/MenuBar.java b/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/mainidewindow/menubar/MenuBar.java index c8603c5a..176dede6 100755 --- a/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/mainidewindow/menubar/MenuBar.java +++ b/src/main/java/com/redhat/devtools/intellij/commonuitest/fixtures/mainidewindow/menubar/MenuBar.java @@ -13,13 +13,20 @@ import com.intellij.remoterobot.RemoteRobot; import com.intellij.remoterobot.fixtures.ActionButtonFixture; import com.intellij.remoterobot.fixtures.CommonContainerFixture; +import com.intellij.remoterobot.fixtures.ComponentFixture; import com.intellij.remoterobot.fixtures.JButtonFixture; import com.intellij.remoterobot.fixtures.JPopupMenuFixture; +import com.intellij.remoterobot.fixtures.dataExtractor.RemoteText; +import com.intellij.remoterobot.utils.WaitForConditionTimeoutException; import com.redhat.devtools.intellij.commonuitest.UITestRunner; +import com.redhat.devtools.intellij.commonuitest.fixtures.mainidewindow.MainIdeWindow; import com.redhat.devtools.intellij.commonuitest.utils.constants.XPathDefinitions; +import com.redhat.devtools.intellij.commonuitest.utils.screenshot.ScreenshotUtils; +import org.jetbrains.annotations.NotNull; import java.time.Duration; import java.util.List; +import java.util.Optional; import static com.intellij.remoterobot.search.locators.Locators.byXpath; import static com.intellij.remoterobot.utils.RepeatUtilsKt.waitFor; @@ -35,6 +42,7 @@ public class MenuBar { public MenuBar(RemoteRobot remoteRobot) { this.remoteRobot = remoteRobot; + checkVisibility(); } /** @@ -60,7 +68,7 @@ public void navigateTo(String... path) { // Wait for the JPopupMenuFixture to appear waitFor(Duration.ofSeconds(5), Duration.ofSeconds(1), "JPopupMenu to appear", () -> - !remoteRobot.findAll(JPopupMenuFixture.class, JPopupMenuFixture.Companion.byType()).isEmpty() + !remoteRobot.findAll(JPopupMenuFixture.class, JPopupMenuFixture.Companion.byType()).isEmpty() ); } @@ -83,7 +91,11 @@ private JButtonFixture mainMenuItem(String label) { if (remoteRobot.isMac()) { return null; } + return getMainMenu().button(byXpath(XPathDefinitions.label(label)), Duration.ofSeconds(10)); + } + @NotNull + public CommonContainerFixture getMainMenu() { CommonContainerFixture cf; if (remoteRobot.isLinux() && ideaVersionInt <= 20242) { cf = remoteRobot.find(CommonContainerFixture.class, byXpath(XPathDefinitions.LINUX_MAIN_MENU), Duration.ofSeconds(10)); @@ -96,7 +108,25 @@ private JButtonFixture mainMenuItem(String label) { } else { cf = remoteRobot.find(CommonContainerFixture.class, byXpath(XPathDefinitions.WINDOWS_MAIN_MENU_2020_2_AND_OLDER), Duration.ofSeconds(10)); } + return cf; + } - return cf.button(byXpath(XPathDefinitions.label(label)), Duration.ofSeconds(10)); + private void checkVisibility() { + // check menu already visible + try { + getMainMenu(); + } catch (WaitForConditionTimeoutException e) { + // not visible + MainIdeWindow mainIdeWindow = remoteRobot.find(MainIdeWindow.class, Duration.ofSeconds(5)); + mainIdeWindow.searchEverywhere("Appearance"); + ComponentFixture appearanceDialog = remoteRobot.find(ComponentFixture.class, byXpath("//div[@class='SearchEverywhereUI']")); + List items = appearanceDialog.findAllText(); + Optional item = items.stream().filter(remoteText -> remoteText.getText().equals("View | Appearance: Main Menu")).findFirst(); + if (item.isPresent()) { + item.get().click(); + } else { + ScreenshotUtils.takeScreenshot(remoteRobot, "Can't find 'Appearance' Main menu item"); + } + } } } \ No newline at end of file diff --git a/src/main/java/com/redhat/devtools/intellij/commonuitest/utils/constants/XPathDefinitions.java b/src/main/java/com/redhat/devtools/intellij/commonuitest/utils/constants/XPathDefinitions.java index d2b8363d..5b7ab0b0 100644 --- a/src/main/java/com/redhat/devtools/intellij/commonuitest/utils/constants/XPathDefinitions.java +++ b/src/main/java/com/redhat/devtools/intellij/commonuitest/utils/constants/XPathDefinitions.java @@ -137,7 +137,7 @@ public class XPathDefinitions { @Language("XPath") public static final String SET_LANGUAGE = "//div[@class='SegmentedButtonComponent'][.//div[contains(@action.key, 'language.groovy')]]"; @Language("XPath") - public static final String SET_BUILD_SYSTEM = "//div[@class='SegmentedButtonComponent'][.//div[@action.key='buildsystem.type.intellij']]"; + public static final String SET_BUILD_SYSTEM = "//div[@class='SegmentedButtonComponent'][.//div[@visible_text='IntelliJ']]"; @Language("XPath") public static final String SET_BUILD_SYSTEM_2024_2_AND_NEWER = "//div[@accessiblename='Build system:' and @class='SegmentedButtonComponent']"; // works for IntelliJ Idea 2024.1 and higher @Language("XPath") diff --git a/src/main/java/com/redhat/devtools/intellij/commonuitest/utils/project/CreateCloseUtils.java b/src/main/java/com/redhat/devtools/intellij/commonuitest/utils/project/CreateCloseUtils.java index 357c9f8a..e9f4d978 100644 --- a/src/main/java/com/redhat/devtools/intellij/commonuitest/utils/project/CreateCloseUtils.java +++ b/src/main/java/com/redhat/devtools/intellij/commonuitest/utils/project/CreateCloseUtils.java @@ -39,6 +39,8 @@ */ public class CreateCloseUtils { + static final int ideaVersionInt = UITestRunner.getIdeaVersionInt(); + /** * Create new project with given project name according to given project type * @@ -50,8 +52,6 @@ public static void createNewProject(RemoteRobot remoteRobot, String projectName, NewProjectDialogWizard newProjectDialogWizard = openNewProjectDialogFromWelcomeDialog(remoteRobot); NewProjectFirstPage newProjectFirstPage = newProjectDialogWizard.find(NewProjectFirstPage.class, Duration.ofSeconds(10)); - final int ideaVersionInt = UITestRunner.getIdeaVersionInt(); - if (ideaVersionInt >= 20221) { newProjectFirstPage.selectNewProjectType("New Project"); newProjectFirstPage.setLanguage("Java"); @@ -119,8 +119,10 @@ public static void createEmptyProject(RemoteRobot remoteRobot, String projectNam public static void waitAfterOpeningProject(RemoteRobot remoteRobot) { IdeStatusBar ideStatusBar = remoteRobot.find(IdeStatusBar.class, Duration.ofSeconds(10)); ideStatusBar.waitUntilProjectImportIsComplete(); - MainIdeWindow mainIdeWindow = remoteRobot.find(MainIdeWindow.class, Duration.ofSeconds(5)); - mainIdeWindow.maximizeIdeWindow(); + if (ideaVersionInt > 20233) { + MainIdeWindow mainIdeWindow = remoteRobot.find(MainIdeWindow.class, Duration.ofSeconds(5)); + mainIdeWindow.maximizeIdeWindow(); + } ideStatusBar.waitUntilAllBgTasksFinish(500); CodeWithMeDialog.closeCodeWithMePopupIfItAppears(remoteRobot); } diff --git a/src/test-project/build.gradle.kts b/src/test-project/build.gradle.kts index 7a433b08..3703fab1 100644 --- a/src/test-project/build.gradle.kts +++ b/src/test-project/build.gradle.kts @@ -3,7 +3,7 @@ import org.jetbrains.intellij.platform.gradle.IntelliJPlatformType plugins { id("java") id("jacoco") - id("org.jetbrains.intellij.platform") version ("2.2.1") + id("org.jetbrains.intellij.platform") version ("2.6.0") } group = "com.redhat.devtools.intellij"