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"