From b41117d029546e73fdbc410a4abb1a7e1c99175c Mon Sep 17 00:00:00 2001 From: Tobias Hahnen Date: Tue, 10 Dec 2024 14:56:37 +0100 Subject: [PATCH] SLE-1000: Specific ITs for the CDT integration Move the CDT tests from the SonarQube Cloud axis and remove the dead code or references. Update the CI pipeline in order to parallelize the work IT tasks. --- .cirrus.default.yml | 88 ++++++++++++++++++- .cirrus.ibuilds.yml | 2 +- its/README.md | 76 +++++++++------- .../META-INF/MANIFEST.MF | 47 ++++++++++ .../build.properties | 4 + .../its.cdt.product | 49 +++++++++++ its/org.sonarlint.eclipse.its.cdt/pom.xml | 48 ++++++++++ .../eclipse/its/cdt/CdtIntegrationTest.java | 47 ++++++++++ .../its.connected.sc.product | 1 - .../sc/SonarCloudConnectedModeTest.java | 51 ----------- .../reddeer/conditions/CFamilyLoaded.java | 24 ----- its/pom.xml | 13 +++ 12 files changed, 340 insertions(+), 110 deletions(-) create mode 100644 its/org.sonarlint.eclipse.its.cdt/META-INF/MANIFEST.MF create mode 100644 its/org.sonarlint.eclipse.its.cdt/build.properties create mode 100644 its/org.sonarlint.eclipse.its.cdt/its.cdt.product create mode 100644 its/org.sonarlint.eclipse.its.cdt/pom.xml create mode 100644 its/org.sonarlint.eclipse.its.cdt/src/org/sonarlint/eclipse/its/cdt/CdtIntegrationTest.java delete mode 100644 its/org.sonarlint.eclipse.its.shared/src/org/sonarlint/eclipse/its/shared/reddeer/conditions/CFamilyLoaded.java diff --git a/.cirrus.default.yml b/.cirrus.default.yml index a4d58e589..6b9c0832e 100644 --- a/.cirrus.default.yml +++ b/.cirrus.default.yml @@ -235,7 +235,7 @@ qa_connectedModeSonarQube_task: cd its/ mvn -B -e -V org.jacoco:jacoco-maven-plugin:prepare-agent verify \ -s ${HOME}/.m2/settings-public-auth.xml \ - -P coverage,\!standaloneMode,\!connectedModeSc \ + -P coverage,\!standaloneMode,\!connectedModeSc,\!cdtIntegration \ -Declipse.p2.mirrors=false \ -Dtarget.platform=latest-java-17_e431 \ -Dtycho.localArtifacts=ignore \ @@ -310,7 +310,7 @@ qa_connectedModeSonarCloud_task: env SONARCLOUD_IT_PASSWORD=$SONARCLOUD_IT_PASSWORD \ mvn -B -e -V org.jacoco:jacoco-maven-plugin:prepare-agent verify \ -s ${HOME}/.m2/settings-public-auth.xml \ - -P coverage,\!standaloneMode,\!connectedModeSq \ + -P coverage,\!standaloneMode,\!connectedModeSq,\!cdtIntegration \ -Declipse.p2.mirrors=false \ -Dtarget.platform=latest-java-21 \ -Dtycho.localArtifacts=ignore \ @@ -389,7 +389,7 @@ qa_standaloneMode_task: cd its/ mvn -B -e -V org.jacoco:jacoco-maven-plugin:prepare-agent verify \ -s ${HOME}/.m2/settings-public-auth.xml \ - -P coverage,\!connectedModeSq,\!connectedModeSc \ + -P coverage,\!connectedModeSq,\!connectedModeSc,\!cdtIntegration \ -Declipse.p2.mirrors=false \ -Dtarget.platform=${TARGET_PLATFORM} \ -Dtycho.localArtifacts=ignore \ @@ -424,6 +424,85 @@ qa_standaloneMode_task: slack_notification_script: | source slack-failure-notification "Cirrus CI build failure on pipeline: $CIRRUS_PIPELINE_NAME" +qa_cdtIntegration_task: + # name: "Run ITs for CDT integration" + depends_on: + - build + <<: *ONLY_IF_EXCEPT_NIGHTLY + eks_container: + <<: *BUILDER_CONTAINER_DEFINITION + cpu: 4 + memory: 12G + type: m6a.large + env: + ARTIFACTORY_API_KEY: VAULT[development/artifactory/token/${CIRRUS_REPO_OWNER}-${CIRRUS_REPO_NAME}-private-reader access_token] + GITHUB_TOKEN: VAULT[development/github/token/licenses-ro token] + DISPLAY: :10 + MAVEN_OPTS: -Xmx3072m + matrix: + - env: + TARGET_PLATFORM: 'oldest-java-11_e48' + - env: + TARGET_PLATFORM: 'latest-java-17_e431' + - env: + TARGET_PLATFORM: 'latest-java-21' + <<: *SETUP_MAVEN_CACHE_QA + download_staged_update_site_script: | + set -euo pipefail + source cirrus-env QA + source .cirrus/set_maven_build_version $BUILD_NUMBER + mvn -B -e -V dependency:unpack \ + -Declipse.p2.mirrors=false \ + -Dtycho.mode=maven \ + -Dartifact=org.sonarsource.sonarlint.eclipse:org.sonarlint.eclipse.site:${PROJECT_VERSION}:zip \ + -DoutputDirectory=${CIRRUS_WORKING_DIR}/staged-repository + prepare_background_script: | + set -euo pipefail + /etc/init.d/xvfb start + metacity --sm-disable --replace & + sleep 10 # give metacity some time to start + echo 'Recording tests on video' + ffmpeg -loglevel warning -f x11grab -video_size 1920x1080 -i ${DISPLAY} -codec:v libx264 -r 12 ${CIRRUS_WORKING_DIR}/recording_${TARGET_PLATFORM}.mp4 + run_its_script: | + echo "Run Maven ITs for CDT integration on Eclipse '${TARGET_PLATFORM}'" + cd its/ + mvn -B -e -V org.jacoco:jacoco-maven-plugin:prepare-agent verify \ + -s ${HOME}/.m2/settings-public-auth.xml \ + -P coverage,\!standaloneMode,\!connectedModeSq,\!connectedModeSc \ + -Declipse.p2.mirrors=false \ + -Dtarget.platform=${TARGET_PLATFORM} \ + -Dtycho.localArtifacts=ignore \ + -Dsonarlint-eclipse.p2.url="file://${CIRRUS_WORKING_DIR}/staged-repository" \ + -Djacoco.append=true \ + -Djacoco.destFile=${CIRRUS_WORKING_DIR}/it-coverage.exec + mv ${CIRRUS_WORKING_DIR}/it-coverage.exec ${CIRRUS_WORKING_DIR}/it-coverage-${TARGET_PLATFORM}.exec + cleanup_before_cache_script: cleanup_maven_repository + always: + stop_recording_script: | + pkill -SIGINT -f ffmpeg + while pgrep ffmpeg >/dev/null; do sleep 1; done + /etc/init.d/xvfb stop + test_recording_artifacts: + path: "${CIRRUS_WORKING_DIR}/recording_${TARGET_PLATFORM}.mp4" + jacoco_it_cdt_artifacts: + path: "${CIRRUS_WORKING_DIR}/it-coverage*.exec" + mvn_startTestLog_artifacts: + path: "${CIRRUS_WORKING_DIR}/its/**/target/work/configuration/*.log" + mvn_runTestLog_artifacts: + path: "${CIRRUS_WORKING_DIR}/its/**/target/work/data/.metadata/.log" + on_failure: + xvfb_log_artifacts: + path: "${CIRRUS_WORKING_DIR}/Xvfb.out" + reports_artifacts: + path: "**/reports/**/*" + junit_artifacts: + paths: + - "**/test-results/**/*.xml" + - "**/target/surefire-reports/TEST-*.xml" + format: junit + slack_notification_script: | + source slack-failure-notification "Cirrus CI build failure on pipeline: $CIRRUS_PIPELINE_NAME" + inspect_orchestrator_cache_task: <<: *ONLY_IF depends_on: qa_connectedModeSonarQube @@ -446,6 +525,7 @@ sonarqube_task: - qa_connectedModeSonarQube - qa_connectedModeSonarCloud - qa_standaloneMode + - qa_cdtIntegration <<: *ONLY_IF_EXCEPT_NIGHTLY eks_container: <<: *BUILDER_CONTAINER_DEFINITION @@ -468,10 +548,12 @@ sonarqube_task: curl --no-progress-meter https://api.cirrus-ci.com/v1/artifact/build/$CIRRUS_BUILD_ID/jacoco_it.zip -o jacoco_it.zip curl --no-progress-meter https://api.cirrus-ci.com/v1/artifact/build/$CIRRUS_BUILD_ID/jacoco_it_sq.zip -o jacoco_it_sq.zip curl --no-progress-meter https://api.cirrus-ci.com/v1/artifact/build/$CIRRUS_BUILD_ID/jacoco_it_sc.zip -o jacoco_it_sc.zip + curl --no-progress-meter https://api.cirrus-ci.com/v1/artifact/build/$CIRRUS_BUILD_ID/jacoco_it_cdt.zip -o jacoco_it_cdt.zip unzip jacoco_ut.zip -d ${CIRRUS_WORKING_DIR}/org.sonarlint.eclipse.core.tests/target/ unzip jacoco_it.zip -d ${CIRRUS_WORKING_DIR}/org.sonarlint.eclipse.core.tests/target/ unzip jacoco_it_sq.zip -d ${CIRRUS_WORKING_DIR}/org.sonarlint.eclipse.core.tests/target/ unzip jacoco_it_sc.zip -d ${CIRRUS_WORKING_DIR}/org.sonarlint.eclipse.core.tests/target/ + unzip jacoco_it_cdt.zip -d ${CIRRUS_WORKING_DIR}/org.sonarlint.eclipse.core.tests/target/ source cirrus-env QA .cirrus/regular_mvn_build_deploy_analyze \ -P-deploy-sonarsource,-release,-sign \ diff --git a/.cirrus.ibuilds.yml b/.cirrus.ibuilds.yml index bdaffe3dd..23a5b3525 100644 --- a/.cirrus.ibuilds.yml +++ b/.cirrus.ibuilds.yml @@ -72,7 +72,7 @@ qa_ibuilds_task: cd its/ mvn -B -e -V verify \ -s ${HOME}/.m2/settings-public-auth.xml \ - -P \!connectedModeSq,\!connectedModeSc \ + -P \!connectedModeSq,\!connectedModeSc,\!cdtIntegration \ -Declipse.p2.mirrors=false \ -Dtarget.platform=ibuilds \ -Dtycho.localArtifacts=ignore \ diff --git a/its/README.md b/its/README.md index aef2c0fe0..cea34a5d3 100644 --- a/its/README.md +++ b/its/README.md @@ -1,20 +1,20 @@ -# SonarLint for Eclipse: Integration tests +# SonarQube for Eclipse: Integration tests This project including its modules contains the integration tests (including compatibility against [iBuilds](https://download.eclipse.org/eclipse/downloads/), the in-development version of the Eclipse IDE) for -SonarLint that are relying on [Eclipse RedDeer](https://github.com/eclipse/reddeer) as the test framework connected +SonarQube that are relying on [Eclipse RedDeer](https://github.com/eclipse/reddeer) as the test framework connected to [Eclipse Tycho](https://github.com/eclipse-tycho/tycho). -The tests are split into separate modules for testing in Standalone Mode only, in Connected Mode with SonarQube and -SonarCloud. Additionally, one module is used for shared logic. This Maven/Tycho project is completely decoupled from -the main SonarLint for Eclipse project. +The tests are split into separate modules for testing in Standalone Mode only, with the integration into CDT (which is +also in Standalone Mode), in Connected Mode with SonarQube Server and SonarQube Cloud. Additionally, one module is used +for shared logic. This Maven/Tycho project is completely decoupled from the main SonarQube for Eclipse project. ## Building -In order to build the integration tests, the main SonarLint for Eclipse project must be build first to create the +In order to build the integration tests, the main SonarQube for Eclipse project must be build first to create the Eclipse Update Site. On the CI/CD pipeline this is not done in one step, but locally it has to be done. -The target platform provided must be one of the supported in the `target-platforms` folder inside the main SonarLint +The target platform provided must be one of the supported in the `target-platforms` folder inside the main SonarQube for Eclipse project directory. ``` @@ -25,7 +25,7 @@ mvn clean verify -Dtarget.platform=latest-java-17_e431 -Dtycho.localArtifacts=ig ``` When all the projects are opened inside Eclipse and the target platform correctly configured, this is done in the -background (not for the main SonarLint for Eclipse project tho if not also imported into Eclipse, which is required). +background (not for the main SonarQube for Eclipse project tho if not also imported into Eclipse, which is required). ## Running the Tests @@ -37,48 +37,64 @@ instance. ### Standalone Mode / iBuilds compatibility To run all the tests, or a specific one with the additionally command line option `-Dtest={TestClassName}`, for the -Standalone Mode, the following command has to be run that excludes the tests for the Connected Mode with SonarQube and -SonarCloud. +Standalone Mode, the following command has to be run that excludes the tests for the Connected Mode with SonarQube +Server and SonarQube Cloud and the integration into CDT. -The target platform provided must be one of the supported in the `target-platforms` folder inside the main SonarLint +The target platform provided must be one of the supported in the `target-platforms` folder inside the main SonarQube for Eclipse project directory. For Standalone Mode all target platforms are useful, for the iBuilds compatibility the `ibuilds` target platform must be used. ``` -mvn clean verify -Dtarget.platform=latest-java-17_e431 -Dtycho.localArtifacts=ignore -Dsonarlint-eclipse.p2.url="file://{path to repo}/org.sonarlint.eclipse.site/target/repository" -P \!connectedModeSc,\!connectedModeSq +mvn clean verify -Dtarget.platform=latest-java-17_e431 -Dtycho.localArtifacts=ignore -Dsonarlint-eclipse.p2.url="file://{path to repo}/org.sonarlint.eclipse.site/target/repository" -P \!connectedModeSc,\!connectedModeSq,\!cdtIntegration ``` -### Connected Mode (SQ) +### Connected Mode (SonarQube Server) To run all the tests, or a specific one with the additionally command line option `-Dtest={TestClassName}`, for the -Connected Mode with SonarQube, the following command has to be run that excludes the tests for the Standalone Mode and -the Connected Mode with SonarCloud. With the additional command line option `-Dsonar.runtimeVersion={version alias}` -(see [Orchestrator documentation](https://github.com/SonarSource/orchestrator?tab=readme-ov-file#version-aliases)) the -specific SonarQube version can be configured, the default one is `LATEST_RELEASE`. +Connected Mode with SonarQube Server, the following command has to be run that excludes the tests for the Standalone +Mode and the Connected Mode with SonarQube Cloud and the integration into CDT. With the additional command line option +`-Dsonar.runtimeVersion={version alias}` (see +[Orchestrator documentation](https://github.com/SonarSource/orchestrator?tab=readme-ov-file#version-aliases)) the +specific SonarQube Server version can be configured, the default one is `LATEST_RELEASE`. The target platform provided should be run against the latest one linked to the Eclipse IDE that is shipped with Java 17 (Eclipse IDE 2024-03 / 4.31). This is also what the CI/CD pipeline is doing in order to provide the correct runtime -for the SonarQube instance provided via [Orchestrator](https://github.com/SonarSource/orchestrator) for the latest -supported LTA version, the latest supported version and the currently in-development version (of SonarQube). +for the SonarQube Server instance provided via [Orchestrator](https://github.com/SonarSource/orchestrator) for the +latest supported LTA version, the latest supported version and the currently in-development version (of SonarQube +Server). ``` -mvn clean verify -Dtarget.platform=latest-java-17_e431 -Dtycho.localArtifacts=ignore -Dsonarlint-eclipse.p2.url="file://{path to repo}/org.sonarlint.eclipse.site/target/repository" -P \!standaloneMode,\!connectedModeSc +mvn clean verify -Dtarget.platform=latest-java-17_e431 -Dtycho.localArtifacts=ignore -Dsonarlint-eclipse.p2.url="file://{path to repo}/org.sonarlint.eclipse.site/target/repository" -P \!standaloneMode,\!connectedModeSc,\!cdtIntegration ``` -### Connected Mode (SC) +### Connected Mode (SonarQube Cloud) To run all the tests, or a specific one with the additionally command line option `-Dtest={TestClassName}`, for the -Connected Mode with SonarCloud, the following command has to be run that excludes the tests for the Standalone Mode and -the Connected Mode with SonarQube. +Connected Mode with SonarQube Cloud, the following command has to be run that excludes the tests for the Standalone +Mode and the Connected Mode with SonarQube Server and the integration into CDT. -The target platform provided must be one of the supported in the `target-platforms` folder inside the main SonarLint -for Eclipse project directory. Compared to the integration tests for the Connected Mode with SonarCloud there is no -dependency on the Java version and the CI/CD pipeline will run against the latest one linked to the Eclipse IDE that is -shipped with Java 21 (the current Java runtime used for upcoming releases as well). +The target platform provided must be one of the supported in the `target-platforms` folder inside the main SonarQube +for Eclipse project directory. Compared to the integration tests for the Connected Mode with SonarQube Cloud there is +no dependency on the Java version and the CI/CD pipeline will run against the latest one linked to the Eclipse IDE that +is shipped with Java 21 (the current Java runtime used for upcoming releases as well). -Due to us requiring the password for the SonarCloud staging environment, we have to pass it directly to the command as -the Eclipse IDE runtime won't pick it up otherwise via `System.getenv("SONARCLOUD_IT_PASSWORD")`! +Due to us requiring the password for the SonarQube Cloud staging environment, we have to pass it directly to the +command as the Eclipse IDE runtime won't pick it up otherwise via `System.getenv("SONARCLOUD_IT_PASSWORD")`! ``` -env SONARCLOUD_IT_PASSWORD=$SONARCLOUD_IT_PASSWORD mvn clean verify -Dtarget.platform=latest-java-21 -Dtycho.localArtifacts=ignore -Dsonarlint-eclipse.p2.url="file://{path to repo}/org.sonarlint.eclipse.site/target/repository" -P \!standaloneMode,\!connectedModeSq +env SONARCLOUD_IT_PASSWORD=$SONARCLOUD_IT_PASSWORD mvn clean verify -Dtarget.platform=latest-java-21 -Dtycho.localArtifacts=ignore -Dsonarlint-eclipse.p2.url="file://{path to repo}/org.sonarlint.eclipse.site/target/repository" -P \!standaloneMode,\!connectedModeSq,\!cdtIntegration +``` + +### CDT integration + +To run all the tests, or a specific one with the additionally command line option `-Dtest={TestClassName}`, for the +integration into CDT, the following command has to be run that excludes the tests for the Standalone +Mode and the Connected Mode with SonarQube Server and the Connected Mode with SonarQube Cloud. + +The target platform provided must be one of the supported in the `target-platforms` folder inside the main SonarQube +for Eclipse project directory. For the integration into CDT, all target platforms are useful, for the iBuilds +compatibility the `ibuilds` target platform must be used. + +``` +mvn clean verify -Dtarget.platform=latest-java-17_e431 -Dtycho.localArtifacts=ignore -Dsonarlint-eclipse.p2.url="file://{path to repo}/org.sonarlint.eclipse.site/target/repository" -P \!standaloneMode,\!connectedModeSc,\!connectedModeSq ``` diff --git a/its/org.sonarlint.eclipse.its.cdt/META-INF/MANIFEST.MF b/its/org.sonarlint.eclipse.its.cdt/META-INF/MANIFEST.MF new file mode 100644 index 000000000..54d9ae706 --- /dev/null +++ b/its/org.sonarlint.eclipse.its.cdt/META-INF/MANIFEST.MF @@ -0,0 +1,47 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: SonarLint for Eclipse ITs (CDT integration) +Bundle-SymbolicName: org.sonarlint.eclipse.its.cdt;singleton:=true +Bundle-Version: 1.0.0.qualifier +Bundle-ClassPath: . +Bundle-Vendor: SonarSource +Require-Bundle: org.eclipse.jdt.core, + org.eclipse.jdt.ui, + org.eclipse.debug.core, + org.eclipse.jdt.launching, + org.eclipse.jface, + org.eclipse.jface.text, + org.eclipse.ui.workbench, + org.eclipse.ui, + org.eclipse.ui.ide, + org.eclipse.core.runtime, + org.eclipse.core.resources, + org.eclipse.swt, + org.eclipse.ui.forms, + org.eclipse.search, + org.eclipse.ui.editors, + org.junit;bundle-version="4.11.0", + org.eclipse.equinox.security, + org.eclipse.ui.console, + assertj-core, + org.eclipse.reddeer.junit, + org.eclipse.reddeer.requirements, + org.eclipse.reddeer.eclipse, + org.eclipse.reddeer.swt, + org.eclipse.reddeer.common, + org.eclipse.reddeer.workbench.core, + org.eclipse.reddeer.workbench, + org.eclipse.reddeer.jface, + org.eclipse.reddeer.core, + com.google.gson;bundle-version="2.9.1", + org.apache.commons.commons-io;bundle-version="2.16.1", + org.awaitility;bundle-version="4.2.2", + org.hamcrest;bundle-version="2.2.0", + minimal-json;bundle-version="0.9.5", + org.apache.commons.exec;bundle-version="1.3.0", + com.google.protobuf;bundle-version="3.25.1", + org.sonarlint.eclipse.its.shared +Import-Package: org.sonarlint.eclipse.ui.internal.views.issues +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Bundle-ActivationPolicy: lazy +Export-Package: org.sonarlint.eclipse.its.cdt diff --git a/its/org.sonarlint.eclipse.its.cdt/build.properties b/its/org.sonarlint.eclipse.its.cdt/build.properties new file mode 100644 index 000000000..56d776555 --- /dev/null +++ b/its/org.sonarlint.eclipse.its.cdt/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = target/classes/ +bin.includes = META-INF/,\ + . diff --git a/its/org.sonarlint.eclipse.its.cdt/its.cdt.product b/its/org.sonarlint.eclipse.its.cdt/its.cdt.product new file mode 100644 index 000000000..5f7c614bd --- /dev/null +++ b/its/org.sonarlint.eclipse.its.cdt/its.cdt.product @@ -0,0 +1,49 @@ + + + + + + + + --launcher.defaultAction openFile --launcher.appendVmargs + + -Dosgi.requiredJavaVersion=17 -Dosgi.dataAreaRequiresExplicitInit=true -Dorg.eclipse.swt.graphics.Resource.reportNonDisposed=true --add-modules=ALL-SYSTEM -Djava.security.manager=allow + + -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/its/org.sonarlint.eclipse.its.cdt/pom.xml b/its/org.sonarlint.eclipse.its.cdt/pom.xml new file mode 100644 index 000000000..ad382c7b9 --- /dev/null +++ b/its/org.sonarlint.eclipse.its.cdt/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + + + org.sonarsource.sonarlint.eclipse.its + org.sonarlint.eclipse.its + 1.0.0-SNAPSHOT + ../pom.xml + + + org.sonarlint.eclipse.its.cdt + eclipse-test-plugin + + SonarLint for Eclipse ITs (CDT integration) + + + + + org.eclipse.tycho + tycho-p2-publisher-plugin + + + publish-products-for-tests + + publish-products + + pre-integration-test + + + + + + + org.eclipse.tycho + tycho-surefire-plugin + + + + org.sonarlint.eclipse.its.cdt.product + + + + + + + diff --git a/its/org.sonarlint.eclipse.its.cdt/src/org/sonarlint/eclipse/its/cdt/CdtIntegrationTest.java b/its/org.sonarlint.eclipse.its.cdt/src/org/sonarlint/eclipse/its/cdt/CdtIntegrationTest.java new file mode 100644 index 000000000..3b9e0b7eb --- /dev/null +++ b/its/org.sonarlint.eclipse.its.cdt/src/org/sonarlint/eclipse/its/cdt/CdtIntegrationTest.java @@ -0,0 +1,47 @@ +/* + * SonarLint for Eclipse ITs + * Copyright (C) 2009-2024 SonarSource SA + * sonarlint@sonarsource.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonarlint.eclipse.its.cdt; + +import org.junit.Test; +import org.sonarlint.eclipse.its.shared.AbstractSonarLintTest; +import org.sonarlint.eclipse.its.shared.reddeer.perspectives.CppPerspective; +import org.sonarlint.eclipse.its.shared.reddeer.views.OnTheFlyView; + +import static org.assertj.core.api.Assertions.tuple; + +/** + * These tests are for the CDT integration of the plug-in. It should work correctly with different kidns of C/C++ + * projects that are supported by CDT itself or other tools generating the Eclipse project files. + */ +public class CdtIntegrationTest extends AbstractSonarLintTest { + @Test + public void test_makefile_based_project() { + // i) Open C/C++ perspective and import project + new CppPerspective().open(); + var rootProject = importExistingProjectIntoWorkspace("cdt/MakefileProject", "MakefileProject"); + + // ii) Open file and await for the analysis to show issues + openFileAndWaitForAnalysisCompletion(rootProject.getResource("hello.c")); + var onTheFlyView = new OnTheFlyView(); + onTheFlyView.open(); + waitForSonarLintMarkers(onTheFlyView, + tuple("Complete the task associated to this \"TODO\" comment.", "hello.c", "few seconds ago")); + } +} diff --git a/its/org.sonarlint.eclipse.its.connected.sc/its.connected.sc.product b/its/org.sonarlint.eclipse.its.connected.sc/its.connected.sc.product index 8b73ad662..6bcda29bd 100644 --- a/its/org.sonarlint.eclipse.its.connected.sc/its.connected.sc.product +++ b/its/org.sonarlint.eclipse.its.connected.sc/its.connected.sc.product @@ -33,7 +33,6 @@ --> - diff --git a/its/org.sonarlint.eclipse.its.connected.sc/src/org/sonarlint/eclipse/its/connected/sc/SonarCloudConnectedModeTest.java b/its/org.sonarlint.eclipse.its.connected.sc/src/org/sonarlint/eclipse/its/connected/sc/SonarCloudConnectedModeTest.java index 5268e0bcb..8b325c643 100644 --- a/its/org.sonarlint.eclipse.its.connected.sc/src/org/sonarlint/eclipse/its/connected/sc/SonarCloudConnectedModeTest.java +++ b/its/org.sonarlint.eclipse.its.connected.sc/src/org/sonarlint/eclipse/its/connected/sc/SonarCloudConnectedModeTest.java @@ -36,15 +36,12 @@ import org.eclipse.reddeer.common.wait.WaitWhile; import org.eclipse.reddeer.eclipse.ui.perspectives.JavaPerspective; import org.eclipse.reddeer.swt.impl.link.DefaultLink; -import org.eclipse.reddeer.swt.impl.shell.DefaultShell; import org.eclipse.reddeer.workbench.core.condition.JobIsRunning; -import org.eclipse.reddeer.workbench.impl.editor.DefaultEditor; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.sonarlint.eclipse.its.shared.AbstractSonarLintTest; -import org.sonarlint.eclipse.its.shared.reddeer.conditions.CFamilyLoaded; import org.sonarlint.eclipse.its.shared.reddeer.conditions.ConfirmConnectionCreationDialogOpened; import org.sonarlint.eclipse.its.shared.reddeer.conditions.DialogMessageIsExpected; import org.sonarlint.eclipse.its.shared.reddeer.conditions.FixSuggestionAvailableDialogOpened; @@ -55,15 +52,11 @@ import org.sonarlint.eclipse.its.shared.reddeer.dialogs.FixSuggestionAvailableDialog; import org.sonarlint.eclipse.its.shared.reddeer.dialogs.FixSuggestionUnavailableDialog; import org.sonarlint.eclipse.its.shared.reddeer.dialogs.ProjectSelectionDialog; -import org.sonarlint.eclipse.its.shared.reddeer.perspectives.CppPerspective; import org.sonarlint.eclipse.its.shared.reddeer.views.BindingsView; -import org.sonarlint.eclipse.its.shared.reddeer.views.OnTheFlyView; -import org.sonarlint.eclipse.its.shared.reddeer.views.SonarLintConsole; import org.sonarlint.eclipse.its.shared.reddeer.wizards.ProjectBindingWizard; import org.sonarlint.eclipse.its.shared.reddeer.wizards.ServerConnectionWizard; import org.sonarqube.ws.ProjectBranches.Branch; import org.sonarqube.ws.client.HttpConnector; -import org.sonarqube.ws.client.PostRequest; import org.sonarqube.ws.client.WsClient; import org.sonarqube.ws.client.WsClientFactories; import org.sonarqube.ws.client.projectbranches.ListRequest; @@ -72,7 +65,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; -import static org.assertj.core.api.Assertions.tuple; public class SonarCloudConnectedModeTest extends AbstractSonarLintTest { private static final String TIMESTAMP = Long.toString(Instant.now().toEpochMilli()); @@ -82,8 +74,6 @@ public class SonarCloudConnectedModeTest extends AbstractSonarLintTest { private static final String SONARCLOUD_PASSWORD = System.getenv("SONARCLOUD_IT_PASSWORD"); private static final String TOKEN_NAME = "SLE-IT-" + TIMESTAMP; private static final String SAMPLE_JAVA_ISSUES_PROJECT_KEY = "sonarlint-its-sample-java-issues"; - private static final String MAKEFILE_PROJECT_KEY = "MakefileProject"; - private static final String MAKEFILE_PROJECT_SONAR_KEY = MAKEFILE_PROJECT_KEY + "-" + TIMESTAMP; private static HttpConnector connector; private static WsClient adminWsClient; @@ -100,8 +90,6 @@ public static void prepare() { .build(); adminWsClient = WsClientFactories.getDefault().newClient(connector); - createProject(MAKEFILE_PROJECT_KEY, MAKEFILE_PROJECT_SONAR_KEY); - token = adminWsClient.userTokens() .generate(new GenerateRequest().setName(TOKEN_NAME)) .getToken(); @@ -134,34 +122,6 @@ public void cleanBindings() { bindingsView.removeAllBindings(); } - @Test - public void test_makefile_based_project() { - // i) Open C/C++ perspective and import project - new CppPerspective().open(); - var rootProject = importExistingProjectIntoWorkspace("cdt/MakefileProject", MAKEFILE_PROJECT_KEY); - - // ii) Open file and await notification and no SonarLint issue to be shown - openFileAndWaitForAnalysisCompletion(rootProject.getResource("hello.c")); - shellByName("SonarQube for Eclipse - Language could not be analyzed").ifPresent(DefaultShell::close); - - var onTheFlyView = new OnTheFlyView(); - onTheFlyView.open(); - waitForNoSonarLintMarkers(onTheFlyView); - new DefaultEditor().close(); - - // iii) Create connection / bind project and SonarLint issue to be shown - createConnectionAndBindProject(MAKEFILE_PROJECT_KEY, MAKEFILE_PROJECT_SONAR_KEY); - shellByName("SonarQube - Binding Suggestion").ifPresent(DefaultShell::close); - new SonarLintConsole().clear(); - - openFileAndWaitForAnalysisCompletion(rootProject.getResource("hello.c")); - new WaitUntil(new CFamilyLoaded(new SonarLintConsole().getConsoleView()), TimePeriod.getCustom(120)); - onTheFlyView = new OnTheFlyView(); - onTheFlyView.open(); - waitForSonarLintMarkers(onTheFlyView, - tuple("Complete the task associated to this \"TODO\" comment.", "hello.c", "few seconds ago")); - } - @Test public void configureServerWithTokenAndOrganization() throws InterruptedException { var wizard = new ServerConnectionWizard(); @@ -563,15 +523,4 @@ protected static void createConnectionAndBindProject(String projectKey, String s serverProjectSelectionPage.setProjectKey(sonarProjectKey); projectBindingWizard.finish(); } - - /** Creating a project on SonarCloud with all necessary information */ - private static void createProject(String projectName, String projectKey) { - assertThat(hotspotServerPort).isNotEqualTo(-1); - - var response = connector.call(new PostRequest("/api/projects/create") - .setParam("name", projectName) - .setParam("project", projectKey) - .setParam("organization", SONARCLOUD_ORGANIZATION_KEY)); - assertThat(response.code()).isEqualTo(200); - } } diff --git a/its/org.sonarlint.eclipse.its.shared/src/org/sonarlint/eclipse/its/shared/reddeer/conditions/CFamilyLoaded.java b/its/org.sonarlint.eclipse.its.shared/src/org/sonarlint/eclipse/its/shared/reddeer/conditions/CFamilyLoaded.java deleted file mode 100644 index 541e1f767..000000000 --- a/its/org.sonarlint.eclipse.its.shared/src/org/sonarlint/eclipse/its/shared/reddeer/conditions/CFamilyLoaded.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.sonarlint.eclipse.its.shared.reddeer.conditions; - -import org.eclipse.reddeer.common.condition.AbstractWaitCondition; -import org.eclipse.reddeer.eclipse.ui.console.ConsoleView; - -/** - * When analyzing after a connection was established, make sure that everything was downloaded correctly and - * specifically await the CFamily analyzer to be available (for tests with Eclipse CDT). - */ -public class CFamilyLoaded extends AbstractWaitCondition { - private static final String PATTERN = "CFamily Code Quality and Security"; - - private final ConsoleView consoleView; - - public CFamilyLoaded(ConsoleView consoleView) { - this.consoleView = consoleView; - } - - @Override - public boolean test() { - var consoleText = consoleView.getConsoleText(); - return consoleText.lastIndexOf(PATTERN) != -1; - } -} diff --git a/its/pom.xml b/its/pom.xml index 583c7be43..19567b17e 100644 --- a/its/pom.xml +++ b/its/pom.xml @@ -216,6 +216,19 @@ + + + cdtIntegration + + + pom.xml + + + + org.sonarlint.eclipse.its.cdt + + + standaloneMode