diff options
author | Simon Brandhof <simon.brandhof@sonarsource.com> | 2017-06-23 21:31:56 +0200 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@sonarsource.com> | 2017-06-25 23:42:50 +0200 |
commit | 70b6899988da0d2ba0a39b846e4f1bd3fa27304f (patch) | |
tree | 1ac093a87e0fba6b07c6feb6aceae89bdd9663cf /it/it-tests/src | |
parent | 5dd574819854e9ce7e2f4e181e78153a7ecbf828 (diff) | |
download | sonarqube-70b6899988da0d2ba0a39b846e4f1bd3fa27304f.tar.gz sonarqube-70b6899988da0d2ba0a39b846e4f1bd3fa27304f.zip |
Move integration tests to directory tests/
Diffstat (limited to 'it/it-tests/src')
421 files changed, 0 insertions, 40618 deletions
diff --git a/it/it-tests/src/test/java/it/Category1Suite.java b/it/it-tests/src/test/java/it/Category1Suite.java deleted file mode 100644 index af6812ff25a..00000000000 --- a/it/it-tests/src/test/java/it/Category1Suite.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it; - -import com.sonar.orchestrator.Orchestrator; -import it.administration.ProjectsAdministrationTest; -import it.administration.UsersPageTest; -import it.authorisation.ExecuteAnalysisPermissionTest; -import it.authorisation.IssuePermissionTest; -import it.authorisation.PermissionSearchTest; -import it.authorisation.ProvisioningPermissionTest; -import it.authorisation.QualityProfileAdminPermissionTest; -import it.complexity.ComplexityMeasuresTest; -import it.customMeasure.CustomMeasuresTest; -import it.i18n.I18nTest; -import it.measure.MeasuresWsTest; -import it.measure.ProjectDashboardTest; -import it.measure.ProjectMeasuresPageTest; -import it.measureHistory.DifferentialPeriodsTest; -import it.measureHistory.SincePreviousVersionHistoryTest; -import it.measureHistory.SinceXDaysHistoryTest; -import it.measureHistory.TimeMachineTest; -import it.projectAdministration.BackgroundTasksTest; -import it.projectAdministration.BulkDeletionTest; -import it.projectAdministration.ProjectAdministrationTest; -import it.projectAdministration.ProjectLinksPageTest; -import it.projectSearch.ProjectsPageTest; -import it.qualityGate.QualityGateNotificationTest; -import it.qualityGate.QualityGateTest; -import it.qualityGate.QualityGateUiTest; -import it.settings.DeprecatedPropertiesWsTest; -import it.settings.EmailsTest; -import it.settings.PropertySetsTest; -import it.settings.SettingsTest; -import it.sourceCode.EncodingTest; -import it.sourceCode.HighlightingTest; -import it.sourceCode.ProjectCodeTest; -import org.junit.ClassRule; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -import static util.ItUtils.pluginArtifact; -import static util.ItUtils.xooPlugin; - -@RunWith(Suite.class) -@Suite.SuiteClasses({ - // administration - UsersPageTest.class, - ProjectsAdministrationTest.class, - // project administration - BulkDeletionTest.class, - ProjectAdministrationTest.class, - ProjectLinksPageTest.class, - BackgroundTasksTest.class, - // settings - DeprecatedPropertiesWsTest.class, - EmailsTest.class, - PropertySetsTest.class, - SettingsTest.class, - // i18n - I18nTest.class, - // quality gate - QualityGateTest.class, - QualityGateUiTest.class, - QualityGateNotificationTest.class, - // authorisation - ExecuteAnalysisPermissionTest.class, - IssuePermissionTest.class, - PermissionSearchTest.class, - ProvisioningPermissionTest.class, - QualityProfileAdminPermissionTest.class, - // custom measure - CustomMeasuresTest.class, - // measure - ProjectMeasuresPageTest.class, - ProjectDashboardTest.class, - ProjectsPageTest.class, - MeasuresWsTest.class, - // measure history - DifferentialPeriodsTest.class, - SincePreviousVersionHistoryTest.class, - SinceXDaysHistoryTest.class, - TimeMachineTest.class, - // source code - EncodingTest.class, - HighlightingTest.class, - ProjectCodeTest.class, - // complexity - ComplexityMeasuresTest.class -}) -public class Category1Suite { - - @ClassRule - public static final Orchestrator ORCHESTRATOR = Orchestrator.builderEnv() - .setServerProperty("sonar.notifications.delay", "1") - .addPlugin(pluginArtifact("property-sets-plugin")) - .addPlugin(pluginArtifact("sonar-subcategories-plugin")) - - // Used in I18nTest - .addPlugin(pluginArtifact("l10n-fr-pack")) - - // 1 second. Required for notification test. - .setServerProperty("sonar.notifications.delay", "1") - - // Used in SettingsTest.global_property_change_extension_point - .addPlugin(pluginArtifact("global-property-change-plugin")) - - // Used in SettingsTest.should_get_settings_default_value - .addPlugin(pluginArtifact("server-plugin")) - - .addPlugin(pluginArtifact("posttask-plugin")) - - .addPlugin(xooPlugin()) - .build(); - -} diff --git a/it/it-tests/src/test/java/it/Category2Suite.java b/it/it-tests/src/test/java/it/Category2Suite.java deleted file mode 100644 index 2f59c261c95..00000000000 --- a/it/it-tests/src/test/java/it/Category2Suite.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it; - -import com.sonar.orchestrator.Orchestrator; -import it.issue.AutoAssignTest; -import it.issue.CommonRulesTest; -import it.issue.CustomRulesTest; -import it.issue.IssueActionTest; -import it.issue.IssueBulkChangeTest; -import it.issue.IssueChangelogTest; -import it.issue.IssueCreationTest; -import it.issue.IssueFilterExtensionTest; -import it.issue.IssueFilterOnCommonRulesTest; -import it.issue.IssueFilterTest; -import it.issue.IssueMeasureTest; -import it.issue.IssueNotificationsTest; -import it.issue.IssuePurgeTest; -import it.issue.IssueSearchTest; -import it.issue.IssueTrackingTest; -import it.issue.IssueWorkflowTest; -import it.issue.IssuesPageTest; -import it.issue.NewIssuesMeasureTest; -import it.qualityModel.MaintainabilityMeasureTest; -import it.qualityModel.MaintainabilityRatingMeasureTest; -import it.qualityModel.NewDebtRatioMeasureTest; -import it.qualityModel.ReliabilityMeasureTest; -import it.qualityModel.SecurityMeasureTest; -import it.qualityModel.TechnicalDebtInIssueChangelogTest; -import it.qualityModel.TechnicalDebtMeasureVariationTest; -import it.qualityModel.TechnicalDebtTest; -import it.scm.ScmTest; -import it.test.CoverageTest; -import it.test.CoverageTrackingTest; -import it.test.NewCoverageTest; -import it.test.TestExecutionTest; -import org.junit.ClassRule; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -import static util.ItUtils.pluginArtifact; -import static util.ItUtils.xooPlugin; - -@RunWith(Suite.class) -@Suite.SuiteClasses({ - // test - CoverageTrackingTest.class, - CoverageTest.class, - NewCoverageTest.class, - TestExecutionTest.class, - // scm - ScmTest.class, - // issue - AutoAssignTest.class, - CommonRulesTest.class, - CustomRulesTest.class, - IssueActionTest.class, - IssueBulkChangeTest.class, - IssueChangelogTest.class, - IssueCreationTest.class, - IssueFilterOnCommonRulesTest.class, - IssueFilterTest.class, - IssueFilterExtensionTest.class, - IssueMeasureTest.class, - IssueNotificationsTest.class, - IssuePurgeTest.class, - IssueSearchTest.class, - IssueTrackingTest.class, - IssueWorkflowTest.class, - NewIssuesMeasureTest.class, - // debt - MaintainabilityMeasureTest.class, - MaintainabilityRatingMeasureTest.class, - NewDebtRatioMeasureTest.class, - ReliabilityMeasureTest.class, - SecurityMeasureTest.class, - TechnicalDebtInIssueChangelogTest.class, - TechnicalDebtMeasureVariationTest.class, - TechnicalDebtTest.class, - // ui - IssuesPageTest.class -}) -public class Category2Suite { - - @ClassRule - public static final Orchestrator ORCHESTRATOR = Orchestrator.builderEnv() - .addPlugin(xooPlugin()) - - // issue - .addPlugin(pluginArtifact("issue-filter-plugin")) - - // 1 second. Required for notification test. - .setServerProperty("sonar.notifications.delay", "1") - - .build(); - -} diff --git a/it/it-tests/src/test/java/it/Category3Suite.java b/it/it-tests/src/test/java/it/Category3Suite.java deleted file mode 100644 index bad425d3544..00000000000 --- a/it/it-tests/src/test/java/it/Category3Suite.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it; - -import com.sonar.orchestrator.Orchestrator; -import it.analysis.ExtensionLifecycleTest; -import it.analysis.FavoriteTest; -import it.analysis.IssueJsonReportTest; -import it.analysis.IssuesModeTest; -import it.analysis.LinksTest; -import it.analysis.MultiLanguageTest; -import it.analysis.PermissionTest; -import it.analysis.ProjectBuilderTest; -import it.analysis.ReportDumpTest; -import it.analysis.SSLTest; -import it.analysis.ScannerTest; -import it.analysis.SettingsEncryptionTest; -import it.analysis.TempFolderTest; -import it.measure.DecimalScaleMetricTest; -import it.plugins.VersionPluginTest; -import it.webhook.WebhooksTest; -import org.junit.ClassRule; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -import static util.ItUtils.pluginArtifact; -import static util.ItUtils.xooPlugin; - -@RunWith(Suite.class) -@Suite.SuiteClasses({ - // analysis - PermissionTest.class, - ExtensionLifecycleTest.class, - LinksTest.class, - ProjectBuilderTest.class, - TempFolderTest.class, - MultiLanguageTest.class, - IssueJsonReportTest.class, - ScannerTest.class, - IssuesModeTest.class, - VersionPluginTest.class, - SettingsEncryptionTest.class, - ReportDumpTest.class, - SSLTest.class, - FavoriteTest.class, - // measures - DecimalScaleMetricTest.class, - WebhooksTest.class -}) -public class Category3Suite { - - @ClassRule - public static final Orchestrator ORCHESTRATOR = Orchestrator.builderEnv() - .addPlugin(xooPlugin()) - .setOrchestratorProperty("javaVersion", "LATEST_RELEASE").addPlugin("java") - - // Used by SettingsEncryptionTest - .addPlugin(pluginArtifact("settings-encryption-plugin")) - - // Used by IssuesModeTest - .addPlugin(pluginArtifact("access-secured-props-plugin")) - - // used by TempFolderTest and DecimalScaleMetricTest - .addPlugin(pluginArtifact("batch-plugin")) - - // used by ExtensionLifecycleTest - .addPlugin(pluginArtifact("extension-lifecycle-plugin")) - - // used by ProjectBuilderTest - .addPlugin(pluginArtifact("project-builder-plugin")) - - .build(); -} diff --git a/it/it-tests/src/test/java/it/Category4Suite.java b/it/it-tests/src/test/java/it/Category4Suite.java deleted file mode 100644 index cbb752d4a71..00000000000 --- a/it/it-tests/src/test/java/it/Category4Suite.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it; - -import com.sonar.orchestrator.Orchestrator; -import it.analysisExclusion.FileExclusionsTest; -import it.analysisExclusion.IssueExclusionsTest; -import it.component.ComponentsWsTest; -import it.component.ProjectsWsTest; -import it.dbCleaner.PurgeTest; -import it.duplication.CrossProjectDuplicationsOnRemoveFileTest; -import it.duplication.CrossProjectDuplicationsTest; -import it.duplication.DuplicationsTest; -import it.duplication.NewDuplicationsTest; -import it.organization.RootUserTest; -import it.projectEvent.EventTest; -import it.projectEvent.ProjectActivityPageTest; -import it.qualityProfile.QualityProfilesUiTest; -import it.serverSystem.HttpHeadersTest; -import it.serverSystem.LogsTest; -import it.serverSystem.PingTest; -import it.serverSystem.ServerSystemTest; -import it.ui.SourceViewerTest; -import it.ui.UiTest; -import it.uiExtension.UiExtensionsTest; -import it.user.BaseIdentityProviderTest; -import it.user.FavoritesWsTest; -import it.user.ForceAuthenticationTest; -import it.user.LocalAuthenticationTest; -import it.user.MyAccountPageTest; -import it.user.OAuth2IdentityProviderTest; -import it.ws.WsLocalCallTest; -import it.ws.WsTest; -import org.junit.ClassRule; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -import static util.ItUtils.pluginArtifact; -import static util.ItUtils.xooPlugin; - -@RunWith(Suite.class) -@Suite.SuiteClasses({ - // organization - RootUserTest.class, - // server system - ServerSystemTest.class, - PingTest.class, - // user - MyAccountPageTest.class, - FavoritesWsTest.class, - // authentication - ForceAuthenticationTest.class, - LocalAuthenticationTest.class, - BaseIdentityProviderTest.class, - OAuth2IdentityProviderTest.class, - // component search - ProjectsWsTest.class, - ComponentsWsTest.class, - // analysis exclusion - FileExclusionsTest.class, - IssueExclusionsTest.class, - // duplication - CrossProjectDuplicationsTest.class, - CrossProjectDuplicationsOnRemoveFileTest.class, - DuplicationsTest.class, - NewDuplicationsTest.class, - // db cleaner - PurgeTest.class, - // project event - EventTest.class, - ProjectActivityPageTest.class, - // http - HttpHeadersTest.class, - // ui - UiTest.class, - SourceViewerTest.class, - // ui extensions - UiExtensionsTest.class, - WsLocalCallTest.class, - WsTest.class, - // quality profiles - QualityProfilesUiTest.class, - LogsTest.class -}) -public class Category4Suite { - - @ClassRule - public static final Orchestrator ORCHESTRATOR = Orchestrator.builderEnv() - .addPlugin(xooPlugin()) - - // Used in BaseIdentityProviderTest - .addPlugin(pluginArtifact("base-auth-plugin")) - - // Used in OAuth2IdentityProviderTest - .addPlugin(pluginArtifact("oauth2-auth-plugin")) - - // Used in UiExtensionsTest - .addPlugin(pluginArtifact("ui-extensions-plugin")) - - // Used by WsLocalCallTest - .addPlugin(pluginArtifact("ws-plugin")) - - // Used by LogsTest - .setServerProperty("sonar.web.accessLogs.pattern", LogsTest.ACCESS_LOGS_PATTERN) - - .build(); -} diff --git a/it/it-tests/src/test/java/it/Category5Suite.java b/it/it-tests/src/test/java/it/Category5Suite.java deleted file mode 100644 index 4d952af58b9..00000000000 --- a/it/it-tests/src/test/java/it/Category5Suite.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it; - -import it.serverSystem.ClusterTest; -import it.serverSystem.RestartTest; -import it.serverSystem.ServerSystemRestartingOrchestrator; -import it.settings.LicensesPageTest; -import it.settings.SettingsTestRestartingOrchestrator; -import it.updateCenter.UpdateCenterTest; -import it.user.OnboardingTest; -import it.user.RealmAuthenticationTest; -import it.user.SsoAuthenticationTest; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -/** - * This suite is reserved to the tests that start their own instance of Orchestrator. - * Indeed multiple instances of Orchestrator can't be started in parallel, so this - * suite does not declare a shared Orchestrator. - */ -@RunWith(Suite.class) -@Suite.SuiteClasses({ - ClusterTest.class, - ServerSystemRestartingOrchestrator.class, - RestartTest.class, - SettingsTestRestartingOrchestrator.class, - LicensesPageTest.class, - // update center - UpdateCenterTest.class, - RealmAuthenticationTest.class, - SsoAuthenticationTest.class, - OnboardingTest.class -}) -public class Category5Suite { - -} diff --git a/it/it-tests/src/test/java/it/Category6Suite.java b/it/it-tests/src/test/java/it/Category6Suite.java deleted file mode 100644 index cb9c6811313..00000000000 --- a/it/it-tests/src/test/java/it/Category6Suite.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it; - -import com.sonar.orchestrator.Orchestrator; -import it.issue.IssueTagsTest; -import it.issue.OrganizationIssueAssignTest; -import it.organization.BillingTest; -import it.organization.OrganizationMembershipTest; -import it.organization.OrganizationMembershipUiTest; -import it.organization.OrganizationTest; -import it.organization.PersonalOrganizationTest; -import it.organization.RootUserOnOrganizationTest; -import it.projectSearch.LeakProjectsPageTest; -import it.projectSearch.SearchProjectsTest; -import it.qualityProfile.BuiltInQualityProfilesTest; -import it.qualityProfile.CustomQualityProfilesTest; -import it.qualityProfile.OrganizationQualityProfilesUiTest; -import it.uiExtension.OrganizationUiExtensionsTest; -import it.user.OrganizationIdentityProviderTest; -import org.junit.ClassRule; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -import static util.ItUtils.pluginArtifact; -import static util.ItUtils.xooPlugin; - -/** - * This category is used only when organizations feature is activated - */ -@RunWith(Suite.class) -@Suite.SuiteClasses({ - OrganizationIdentityProviderTest.class, - OrganizationIssueAssignTest.class, - OrganizationMembershipTest.class, - OrganizationMembershipUiTest.class, - OrganizationQualityProfilesUiTest.class, - OrganizationTest.class, - RootUserOnOrganizationTest.class, - OrganizationUiExtensionsTest.class, - PersonalOrganizationTest.class, - BuiltInQualityProfilesTest.class, - CustomQualityProfilesTest.class, - BillingTest.class, - IssueTagsTest.class, - LeakProjectsPageTest.class, - SearchProjectsTest.class -}) -public class Category6Suite { - - @ClassRule - public static final Orchestrator ORCHESTRATOR = Orchestrator.builderEnv() - .addPlugin(xooPlugin()) - .addPlugin(pluginArtifact("base-auth-plugin")) - .addPlugin(pluginArtifact("fake-billing-plugin")) - .addPlugin(pluginArtifact("ui-extensions-plugin")) - .build(); -} diff --git a/it/it-tests/src/test/java/it/LiteSuite.java b/it/it-tests/src/test/java/it/LiteSuite.java deleted file mode 100644 index b87d374c60a..00000000000 --- a/it/it-tests/src/test/java/it/LiteSuite.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it; - -import it.lite.LiteTest; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -@RunWith(Suite.class) -@Suite.SuiteClasses({ - LiteTest.class -}) -public class LiteSuite { - -} diff --git a/it/it-tests/src/test/java/it/PluginsSuite.java b/it/it-tests/src/test/java/it/PluginsSuite.java deleted file mode 100644 index 843794c8f32..00000000000 --- a/it/it-tests/src/test/java/it/PluginsSuite.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it; - -import it.plugins.PluginsTest; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -@RunWith(Suite.class) -@Suite.SuiteClasses({ - PluginsTest.class, -}) -public class PluginsSuite { - -} diff --git a/it/it-tests/src/test/java/it/administration/ProjectsAdministrationTest.java b/it/it-tests/src/test/java/it/administration/ProjectsAdministrationTest.java deleted file mode 100644 index 75f6e0163d4..00000000000 --- a/it/it-tests/src/test/java/it/administration/ProjectsAdministrationTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.administration; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import java.sql.SQLException; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.ws.WsComponents; -import org.sonarqube.ws.client.component.SearchProjectsRequest; -import org.sonarqube.ws.client.permission.RemoveGroupWsRequest; -import org.sonarqube.ws.client.project.UpdateVisibilityRequest; -import pageobjects.Navigation; -import pageobjects.ProjectsManagementPage; -import util.ItUtils; -import util.user.UserRule; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.projectDir; - -public class ProjectsAdministrationTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - private Navigation nav = Navigation.create(orchestrator); - - private String adminUser; - - @Before - public void initData() throws SQLException { - orchestrator.resetData(); - adminUser = userRule.createAdminUser(); - } - - @Test - public void return_all_projects_even_when_no_permission() throws Exception { - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample")).setProperties("sonar.projectKey", "sample1")); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample")).setProperties("sonar.projectKey", "sample2")); - ItUtils.newAdminWsClient(orchestrator).projects().updateVisibility(UpdateVisibilityRequest.builder().setProject("sample2").setVisibility("private").build()); - // Remove 'Admin' permission for admin group on project 2 -> No one can access or admin this project, expect System Admin - newAdminWsClient(orchestrator).permissions().removeGroup(new RemoveGroupWsRequest().setProjectKey("sample2").setGroupName("sonar-administrators").setPermission("admin")); - - nav.logIn().submitCredentials(adminUser).openProjectsManagement() - .shouldHaveProject("sample1") - .shouldHaveProject("sample2"); - } - - @Test - public void create_public_project() { - createProjectAndVerify("public"); - } - - @Test - public void create_private_project() { - createProjectAndVerify("private"); - } - - private void createProjectAndVerify(String visibility) { - ProjectsManagementPage page = nav.logIn().submitCredentials(adminUser, adminUser).openProjectsManagement(); - page - .shouldHaveProjectsCount(0) - .createProject("foo", "foo", visibility) - .shouldHaveProjectsCount(1); - - WsComponents.SearchProjectsWsResponse response = newAdminWsClient(orchestrator).components().searchProjects( - SearchProjectsRequest.builder().build()); - assertThat(response.getComponentsCount()).isEqualTo(1); - assertThat(response.getComponents(0).getKey()).isEqualTo("foo"); - assertThat(response.getComponents(0).getName()).isEqualTo("foo"); - assertThat(response.getComponents(0).getVisibility()).isEqualTo(visibility); - } - -} diff --git a/it/it-tests/src/test/java/it/administration/UsersPageTest.java b/it/it-tests/src/test/java/it/administration/UsersPageTest.java deleted file mode 100644 index 9779a6f82f9..00000000000 --- a/it/it-tests/src/test/java/it/administration/UsersPageTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.administration; - -import com.sonar.orchestrator.Orchestrator; -import it.Category1Suite; -import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.ws.WsUsers; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.user.GroupsRequest; -import util.selenium.Selenese; -import util.user.UserRule; - -import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; - -public class UsersPageTest { - - private static final String ADMIN_USER_LOGIN = "admin-user"; - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - private WsClient adminClient = newAdminWsClient(orchestrator); - - @Before - public void initAdminUser() throws Exception { - userRule.createAdminUser(ADMIN_USER_LOGIN, ADMIN_USER_LOGIN); - } - - @After - public void deleteAdminUser() { - userRule.resetUsers(); - } - - @Test - public void generate_and_revoke_user_token() { - Selenese.runSelenese(orchestrator, "/administration/UsersPageTest/generate_and_revoke_user_token.html"); - } - - @Test - public void admin_should_change_its_own_password() { - Selenese.runSelenese(orchestrator, "/administration/UsersPageTest/admin_should_change_its_own_password.html"); - } - - @Test - public void return_groups_belonging_to_a_user() { - String login = randomAlphabetic(10); - String group = randomAlphabetic(10); - userRule.createUser(login, login); - userRule.createGroup(group); - userRule.associateGroupsToUser(login, group); - - List<WsUsers.GroupsWsResponse.Group> result = adminClient.users().groups(GroupsRequest.builder().setLogin(login).build()).getGroupsList(); - - assertThat(result).extracting(WsUsers.GroupsWsResponse.Group::getName).contains(group); - } -} diff --git a/it/it-tests/src/test/java/it/analysis/ExtensionLifecycleTest.java b/it/it-tests/src/test/java/it/analysis/ExtensionLifecycleTest.java deleted file mode 100644 index 07069cfdad6..00000000000 --- a/it/it-tests/src/test/java/it/analysis/ExtensionLifecycleTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysis; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.MavenBuild; -import it.Category3Suite; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import util.ItUtils; - -public class ExtensionLifecycleTest { - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - @Before - public void cleanup() { - orchestrator.resetData(); - } - - @Test - public void testInstantiationStrategyAndLifecycleOfBatchExtensions() { - MavenBuild build = MavenBuild.create(ItUtils.projectPom("analysis/extension-lifecycle")) - .setCleanSonarGoals() - .setProperty("extension.lifecycle", "true") - .setProperty("sonar.dynamicAnalysis", "false"); - - // Build fails if the extensions provided in the extension-lifecycle-plugin are not correctly - // managed. - orchestrator.executeBuild(build); - } -} diff --git a/it/it-tests/src/test/java/it/analysis/FavoriteTest.java b/it/it-tests/src/test/java/it/analysis/FavoriteTest.java deleted file mode 100644 index b0fc74c09e9..00000000000 --- a/it/it-tests/src/test/java/it/analysis/FavoriteTest.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysis; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category3Suite; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.Favorites; -import org.sonarqube.ws.Favorites.Favorite; -import org.sonarqube.ws.WsPermissions; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.favorite.SearchRequest; -import org.sonarqube.ws.client.permission.AddProjectCreatorToTemplateWsRequest; -import org.sonarqube.ws.client.permission.RemoveProjectCreatorFromTemplateWsRequest; -import org.sonarqube.ws.client.permission.SearchTemplatesWsRequest; - -import static com.sonar.orchestrator.container.Server.ADMIN_LOGIN; -import static com.sonar.orchestrator.container.Server.ADMIN_PASSWORD; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.projectDir; - -public class FavoriteTest { - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - private static WsClient adminWsClient; - - private static final String PROJECT_KEY = "sample"; - - @Before - public void setUp() { - orchestrator.resetData(); - } - - @After - public void tearDown() { - removeProjectCreatorPermission(); - } - - @BeforeClass - public static void classSetUp() { - adminWsClient = newAdminWsClient(orchestrator); - } - - @Test - public void project_as_favorite_when_authenticated_and_first_analysis_and_a_project_creator_permission() { - SonarScanner sampleProject = createScannerWithUserCredentials(); - addProjectCreatorPermission(); - - orchestrator.executeBuild(sampleProject); - - Favorites.SearchResponse response = adminWsClient.favorites().search(new SearchRequest()); - assertThat(response.getFavoritesList()).extracting(Favorite::getKey).contains(PROJECT_KEY); - } - - @Test - public void no_project_as_favorite_when_no_project_creator_permission() { - SonarScanner sampleProject = createScannerWithUserCredentials(); - - orchestrator.executeBuild(sampleProject); - - Favorites.SearchResponse response = adminWsClient.favorites().search(new SearchRequest()); - assertThat(response.getFavoritesList()).extracting(Favorite::getKey).doesNotContain(PROJECT_KEY); - } - - @Test - public void no_project_as_favorite_when_second_analysis() { - SonarScanner sampleProject = SonarScanner.create(projectDir("shared/xoo-sample")); - orchestrator.executeBuild(sampleProject); - sampleProject = createScannerWithUserCredentials(); - addProjectCreatorPermission(); - - orchestrator.executeBuild(sampleProject); - - Favorites.SearchResponse response = adminWsClient.favorites().search(new SearchRequest()); - assertThat(response.getFavoritesList()).extracting(Favorite::getKey).doesNotContain(PROJECT_KEY); - } - - private static SonarScanner createScannerWithUserCredentials() { - return SonarScanner.create(projectDir("shared/xoo-sample")) - .setProperty("sonar.login", ADMIN_LOGIN) - .setProperty("sonar.password", ADMIN_PASSWORD); - } - - private void addProjectCreatorPermission() { - WsPermissions.SearchTemplatesWsResponse permissionTemplates = adminWsClient.permissions().searchTemplates(new SearchTemplatesWsRequest()); - assertThat(permissionTemplates.getDefaultTemplatesCount()).isEqualTo(1); - adminWsClient.permissions().addProjectCreatorToTemplate(AddProjectCreatorToTemplateWsRequest.builder() - .setTemplateId(permissionTemplates.getDefaultTemplates(0).getTemplateId()) - .setPermission("admin") - .build()); - } - - private void removeProjectCreatorPermission() { - WsPermissions.SearchTemplatesWsResponse permissionTemplates = adminWsClient.permissions().searchTemplates(new SearchTemplatesWsRequest()); - assertThat(permissionTemplates.getDefaultTemplatesCount()).isEqualTo(1); - adminWsClient.permissions().removeProjectCreatorFromTemplate(RemoveProjectCreatorFromTemplateWsRequest.builder() - .setTemplateId(permissionTemplates.getDefaultTemplates(0).getTemplateId()) - .setPermission("admin") - .build()); - } -} diff --git a/it/it-tests/src/test/java/it/analysis/IssueJsonReportTest.java b/it/it-tests/src/test/java/it/analysis/IssueJsonReportTest.java deleted file mode 100644 index 23c73d8c393..00000000000 --- a/it/it-tests/src/test/java/it/analysis/IssueJsonReportTest.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysis; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import com.sonar.orchestrator.locator.FileLocation; -import com.sonar.orchestrator.locator.ResourceLocation; -import it.Category3Suite; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.skyscreamer.jsonassert.JSONAssert; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsResponse; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newWsClient; - -public class IssueJsonReportTest { - - private static final String SONAR_VERSION_PLACEHOLDER = "<SONAR_VERSION>"; - private static final String RESOURCE_PATH = "/analysis/IssueJsonReportTest/"; - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @Before - public void resetData() { - orchestrator.resetData(); - } - - @Test - public void issue_line() throws IOException { - ItUtils.restoreProfile(orchestrator, getClass().getResource(RESOURCE_PATH + "one-issue-per-line.xml")); - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - File projectDir = ItUtils.projectDir("shared/xoo-sample"); - SonarScanner runner = SonarScanner.create(projectDir, - "sonar.analysis.mode", "issues", - "sonar.verbose", "true", - "sonar.report.export.path", "sonar-report.json"); - BuildResult result = orchestrator.executeBuild(runner); - assertThat(ItUtils.countIssuesInJsonReport(result, true)).isEqualTo(17); - - JSONObject obj = ItUtils.getJSONReport(result); - JSONArray issues = (JSONArray) obj.get("issues"); - for (Object issue : issues) { - JSONObject jsonIssue = (JSONObject) issue; - assertThat(jsonIssue.get("startLine")).isNotNull(); - assertThat(jsonIssue.get("line")).isEqualTo(jsonIssue.get("startLine")); - assertThat(jsonIssue.get("endLine")).isEqualTo(jsonIssue.get("startLine")); - - assertThat(jsonIssue.get("endOffset")).isNotNull(); - assertThat(jsonIssue.get("startOffset")).isNotNull(); - } - - List<Long> lineNumbers = new ArrayList<>(16); - for (long i = 1L; i < 18; i++) { - lineNumbers.add(i); - } - assertThat(issues).extracting("startLine").containsAll(lineNumbers); - assertThat(issues).extracting("endLine").containsAll(lineNumbers); - } - - @Test - public void precise_issue_location() throws IOException { - ItUtils.restoreProfile(orchestrator, getClass().getResource(RESOURCE_PATH + "multiline.xml")); - orchestrator.getServer().provisionProject("sample-multiline", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample-multiline", "xoo", "multiline"); - - File projectDir = ItUtils.projectDir("shared/xoo-precise-issues"); - SonarScanner runner = SonarScanner.create(projectDir, - "sonar.analysis.mode", "issues", - "sonar.verbose", "true", - "sonar.report.export.path", "sonar-report.json"); - BuildResult result = orchestrator.executeBuild(runner); - assertThat(ItUtils.countIssuesInJsonReport(result, true)).isEqualTo(2); - - JSONObject obj = ItUtils.getJSONReport(result); - JSONArray issues = (JSONArray) obj.get("issues"); - - JSONObject issue1 = (JSONObject) issues.get(0); - JSONObject issue2 = (JSONObject) issues.get(1); - - assertThat(issue1.get("startLine")).isIn(6L); - assertThat(issue1.get("line")).isIn(6L); - assertThat(issue1.get("endLine")).isIn(6L); - assertThat(issue1.get("startOffset")).isIn(27L); - assertThat(issue1.get("endOffset")).isIn(32L); - - assertThat(issue2.get("startLine")).isIn(9L); - assertThat(issue2.get("line")).isIn(9L); - assertThat(issue2.get("endLine")).isIn(15L); - assertThat(issue2.get("startOffset")).isIn(20L); - assertThat(issue2.get("endOffset")).isIn(2L); - - } - - @Test - public void test_json_report_no_server_analysis() throws Exception { - ItUtils.restoreProfile(orchestrator, getClass().getResource(RESOURCE_PATH + "one-issue-per-line.xml")); - orchestrator.getServer().provisionProject("sample", "tracking"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - File projectDir = ItUtils.projectDir("analysis/tracking/v1"); - SonarScanner issuesModeScan = SonarScanner.create(projectDir) - .setProperty("sonar.analysis.mode", "issues") - .setProperty("sonar.userHome", temp.newFolder().getAbsolutePath()) - .setProperty("sonar.report.export.path", "sonar-report.json") - .setProperty("sonar.projectDate", "2013-05-02"); - orchestrator.executeBuild(issuesModeScan); - - File report = new File(projectDir, ".sonar/sonar-report.json"); - assertThat(report).isFile().exists(); - - String json = sanitize(FileUtils.readFileToString(report)); - String expectedJson = expected("no-server-analysis.json"); - JSONAssert.assertEquals(expectedJson, json, false); - } - - @Test - public void test_json_report() throws Exception { - ItUtils.restoreProfile(orchestrator, getClass().getResource(RESOURCE_PATH + "one-issue-per-line.xml")); - orchestrator.getServer().provisionProject("sample", "tracking"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - SonarScanner scan = SonarScanner.create(ItUtils.projectDir("analysis/tracking/v1")) - .setProperty("sonar.projectDate", "2013-05-01"); - orchestrator.executeBuild(scan); - - // Issues mode scan -> 2 new issues and 13 existing issues - File projectDir = ItUtils.projectDir("analysis/tracking/v2"); - SonarScanner issuesModeScan = SonarScanner.create(projectDir) - .setProperty("sonar.analysis.mode", "issues") - .setProperty("sonar.userHome", temp.newFolder().getAbsolutePath()) - .setProperty("sonar.report.export.path", "sonar-report.json") - .setProperty("sonar.projectDate", "2013-05-02"); - orchestrator.executeBuild(issuesModeScan); - - File report = new File(projectDir, ".sonar/sonar-report.json"); - assertThat(report).isFile().exists(); - - String json = sanitize(FileUtils.readFileToString(report)); - String expectedJson = expected("report-on-single-module.json"); - JSONAssert.assertEquals(expectedJson, json, false); - } - - @Test - public void test_json_report_on_branch() throws Exception { - ItUtils.restoreProfile(orchestrator, getClass().getResource(getResource("one-issue-per-line.xml").getPath())); - orchestrator.getServer().provisionProject("sample:mybranch", "Sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample:mybranch", "xoo", "one-issue-per-line"); - - SonarScanner scan = SonarScanner.create(ItUtils.projectDir("analysis/tracking/v1")) - .setProperty("sonar.projectDate", "2013-05-01") - .setProperty("sonar.branch", "mybranch"); - orchestrator.executeBuild(scan); - - // issues mode scan -> 2 new issues and 13 existing issues - File projectDir = ItUtils.projectDir("analysis/tracking/v2"); - SonarScanner issuesModeScan = SonarScanner.create(projectDir) - .setProperty("sonar.analysis.mode", "issues") - .setProperty("sonar.userHome", temp.newFolder().getAbsolutePath()) - .setProperty("sonar.report.export.path", "sonar-report.json") - .setProperty("sonar.issuesReport.console.enable", "true") - .setProperty("sonar.projectDate", "2013-05-02") - .setProperty("sonar.verbose", "true") - .setProperty("sonar.branch", "mybranch"); - orchestrator.executeBuild(issuesModeScan); - - File report = new File(projectDir, ".sonar/sonar-report.json"); - assertThat(report).isFile().exists(); - - String json = sanitize(FileUtils.readFileToString(report)); - String expectedJson = expected("report-on-single-module-branch.json"); - JSONAssert.assertEquals(expectedJson, json, false); - } - - /** - * Multi-modules project but Eclipse scans only a single module - */ - @Test - public void test_json_report_on_sub_module() throws Exception { - ItUtils.restoreProfile(orchestrator, getClass().getResource(RESOURCE_PATH + "one-issue-per-line.xml")); - orchestrator.getServer().provisionProject("com.sonarsource.it.samples:multi-modules-sample", "Multi-module sample"); - orchestrator.getServer().associateProjectToQualityProfile("com.sonarsource.it.samples:multi-modules-sample", "xoo", "one-issue-per-line"); - - File rootDir = ItUtils.projectDir("shared/xoo-multi-modules-sample"); - SonarScanner scan = SonarScanner.create(rootDir) - .setProperty("sonar.projectDate", "2013-05-01"); - orchestrator.executeBuild(scan); - - // Issues mode scan on a module -> no new issues - File moduleDir = ItUtils.projectDir("shared/xoo-multi-modules-sample/module_a/module_a1"); - SonarScanner issuesModeScan = SonarScanner.create(moduleDir) - .setProperty("sonar.projectKey", "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1") - .setProperty("sonar.projectVersion", "1.0-SNAPSHOT") - .setProperty("sonar.projectName", "ModuleA1") - .setProperty("sonar.sources", "src/main/xoo") - .setProperty("sonar.language", "xoo") - .setProperty("sonar.analysis.mode", "issues") - .setProperty("sonar.userHome", temp.newFolder().getAbsolutePath()) - .setProperty("sonar.report.export.path", "sonar-report.json") - .setProperty("sonar.projectDate", "2013-05-02"); - orchestrator.executeBuild(issuesModeScan); - - File report = new File(moduleDir, ".sonar/sonar-report.json"); - assertThat(report).isFile().exists(); - - String json = sanitize(FileUtils.readFileToString(report)); - // SONAR-5218 All issues are updated as their root project id has changed (it's now the sub module) - String expectedJson = expected("report-on-sub-module.json"); - JSONAssert.assertEquals(expectedJson, json, false); - } - - /** - * Multi-modules project - */ - @Test - public void test_json_report_on_root_module() throws Exception { - ItUtils.restoreProfile(orchestrator, getClass().getResource(RESOURCE_PATH + "one-issue-per-line.xml")); - orchestrator.getServer().provisionProject("com.sonarsource.it.samples:multi-modules-sample", "Sonar :: Integration Tests :: Multi-modules Sample"); - orchestrator.getServer().associateProjectToQualityProfile("com.sonarsource.it.samples:multi-modules-sample", "xoo", "one-issue-per-line"); - - File rootDir = ItUtils.projectDir("shared/xoo-multi-modules-sample"); - SonarScanner scan = SonarScanner.create(rootDir) - .setProperty("sonar.projectDate", "2013-05-01"); - orchestrator.executeBuild(scan); - - // issues mode scan -> no new issues - SonarScanner issuesModeScan = SonarScanner.create(rootDir) - .setProperty("sonar.analysis.mode", "issues") - .setProperty("sonar.userHome", temp.newFolder().getAbsolutePath()) - .setProperty("sonar.report.export.path", "sonar-report.json") - .setProperty("sonar.projectDate", "2013-05-02"); - orchestrator.executeBuild(issuesModeScan); - - File report = new File(rootDir, ".sonar/sonar-report.json"); - assertThat(report).isFile().exists(); - - String json = sanitize(FileUtils.readFileToString(report)); - String expectedJson = expected("report-on-root-module.json"); - JSONAssert.assertEquals(expectedJson, json, false); - } - - private String expected(String path) throws IOException { - try (WsResponse response = newWsClient(orchestrator).wsConnector().call(new GetRequest("api/server/version"))) { - String version = response.content(); - - return sanitize(IOUtils.toString(getResourceInputStream(path))) - .replaceAll(Pattern.quote(SONAR_VERSION_PLACEHOLDER), version); - } - } - - @Test - public void issueSanityCheck() { - assertThat(sanitize("s\"0150F1EBDB8E000003\"f")).isEqualTo("s<ISSUE_KEY>f"); - } - - private static String sanitize(String s) { - // sanitize issue uuid keys - s = s.replaceAll("\"[a-zA-Z_0-9\\-]{15,20}\"", "<ISSUE_KEY>"); - - return ItUtils.sanitizeTimezones(s); - } - - private InputStream getResourceInputStream(String resource) throws FileNotFoundException { - ResourceLocation res = getResource(resource); - return getClass().getResourceAsStream(res.getPath()); - } - - private ResourceLocation getResource(String resource) { - return FileLocation.ofClasspath(RESOURCE_PATH + resource); - } - -} diff --git a/it/it-tests/src/test/java/it/analysis/IssuesModeTest.java b/it/it-tests/src/test/java/it/analysis/IssuesModeTest.java deleted file mode 100644 index d2038ab073c..00000000000 --- a/it/it-tests/src/test/java/it/analysis/IssuesModeTest.java +++ /dev/null @@ -1,461 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysis; - -import com.google.common.collect.Maps; -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildFailureException; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import com.sonar.orchestrator.build.SonarScannerInstaller; -import com.sonar.orchestrator.config.FileSystem; -import com.sonar.orchestrator.version.Version; -import it.Category3Suite; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import javax.annotation.Nullable; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.ObjectUtils; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.rules.TemporaryFolder; -import org.sonar.wsclient.SonarClient; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueClient; -import org.sonar.wsclient.issue.IssueQuery; -import org.sonar.wsclient.issue.Issues; -import org.sonar.wsclient.user.UserParameters; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; -import static util.ItUtils.getComponent; - -public class IssuesModeTest { - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @Before - public void deleteData() throws IOException { - orchestrator.resetData(); - } - - @Test - public void issues_analysis_on_new_project() throws IOException { - restoreProfile("one-issue-per-line.xml"); - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - SonarScanner runner = configureRunnerIssues("shared/xoo-sample", null, "sonar.verbose", "true"); - BuildResult result = orchestrator.executeBuild(runner); - assertThat(ItUtils.countIssuesInJsonReport(result, true)).isEqualTo(17); - } - - @Test - public void invalid_incremental_mode() throws IOException { - restoreProfile("one-issue-per-line.xml"); - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - SonarScanner runner = configureRunner("shared/xoo-sample"); - runner.setProperty("sonar.analysis.mode", "incremental"); - - thrown.expect(BuildFailureException.class); - BuildResult res = orchestrator.executeBuild(runner); - - assertThat(res.getLogs()).contains("Invalid analysis mode: incremental. This mode was removed in SonarQube 5.2"); - } - - @Test - public void project_key_with_slash() throws IOException { - restoreProfile("one-issue-per-line.xml"); - setDefaultQualityProfile("xoo", "one-issue-per-line"); - - SonarScanner runner = configureRunner("shared/xoo-sample"); - runner.setProjectKey("sample/project"); - runner.setProperty("sonar.analysis.mode", "issues"); - BuildResult result = orchestrator.executeBuild(runner); - assertThat(ItUtils.countIssuesInJsonReport(result, true)).isEqualTo(17); - } - - // SONAR-6931 - @Test - public void only_scan_changed_files_qps() throws IOException { - restoreProfile("one-issue-per-line.xml"); - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - SonarScanner runner = configureRunner("shared/xoo-sample", "sonar.verbose", "true"); - BuildResult result = orchestrator.executeBuild(runner); - List<Issue> serverIssues = ItUtils.getAllServerIssues(orchestrator); - for (Issue i : serverIssues) { - assertThat(i.status()).isEqualTo("OPEN"); - } - assertThat(serverIssues).hasSize(17); - - // change quality profile - restoreProfile("with-many-rules.xml"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "with-many-rules"); - - // do it again, scanning nothing (all files should be unchanged) - runner = configureRunnerIssues("shared/xoo-sample", null, - "sonar.verbose", "true"); - result = orchestrator.executeBuild(runner); - assertThat(result.getLogs()).contains("Scanning only changed files"); - assertThat(result.getLogs()).contains("'One Issue Per Line' skipped because there is no related file in current project"); - ItUtils.assertIssuesInJsonReport(result, 0, 0, 17); - } - - // SONAR-6931 - @Test - public void only_scan_changed_files_transitions() throws IOException { - restoreProfile("one-issue-per-line.xml"); - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - SonarScanner runner = configureRunner("shared/xoo-sample", "sonar.verbose", "true"); - BuildResult result = orchestrator.executeBuild(runner); - List<Issue> serverIssues = ItUtils.getAllServerIssues(orchestrator); - for (Issue i : serverIssues) { - assertThat(i.status()).isEqualTo("OPEN"); - } - assertThat(serverIssues).hasSize(17); - - // resolve 2 issues - IssueClient issueClient = orchestrator.getServer().wsClient("admin", "admin").issueClient(); - issueClient.doTransition(serverIssues.get(0).key(), "wontfix"); - issueClient.doTransition(serverIssues.get(1).key(), "wontfix"); - - // do it again, scanning nothing (all files should be unchanged) - runner = configureRunnerIssues("shared/xoo-sample", null, - "sonar.verbose", "true"); - result = orchestrator.executeBuild(runner); - assertThat(result.getLogs()).contains("Scanning only changed files"); - assertThat(result.getLogs()).contains("'One Issue Per Line' skipped because there is no related file in current project"); - ItUtils.assertIssuesInJsonReport(result, 0, 0, 15); - } - - // SONAR-6931 - @Test - public void only_scan_changed_files_on_change() throws IOException { - restoreProfile("one-issue-per-line.xml"); - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - SonarScanner runner = configureRunner("shared/xoo-sample", "sonar.verbose", "true"); - BuildResult result = orchestrator.executeBuild(runner); - - // change QP - restoreProfile("with-many-rules.xml"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "with-many-rules"); - - // now change file hash in a temporary location - File tmpProjectDir = temp.newFolder(); - FileUtils.copyDirectory(ItUtils.projectDir("shared/xoo-sample"), tmpProjectDir); - File srcFile = new File(tmpProjectDir, "src/main/xoo/sample/Sample.xoo"); - FileUtils.write(srcFile, "\n", StandardCharsets.UTF_8, true); - - // scan again, with different QP - runner = SonarScanner.create(tmpProjectDir, - "sonar.working.directory", temp.newFolder().getAbsolutePath(), - "sonar.analysis.mode", "issues", - "sonar.report.export.path", "sonar-report.json", - "sonar.userHome", temp.newFolder().getAbsolutePath(), - "sonar.verbose", "true", - "sonar.scanChangedFilesOnly", "true"); - result = orchestrator.executeBuild(runner); - assertThat(result.getLogs()).contains("Scanning only changed files"); - assertThat(result.getLogs()).doesNotContain("'One Issue Per Line' skipped because there is no related file in current project"); - ItUtils.assertIssuesInJsonReport(result, 3, 0, 17); - } - - // SONAR-8518 - @Test - public void should_support_sonar_profile_prop() throws IOException { - restoreProfile("one-issue-per-line.xml"); - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "empty"); - - SonarScanner runner = configureRunner("shared/xoo-sample", - "sonar.verbose", "true", - "sonar.analysis.mode", "issues", - "sonar.profile", "one-issue-per-line"); - BuildResult result = orchestrator.executeBuild(runner); - ItUtils.assertIssuesInJsonReport(result, 17, 0, 0); - } - - // SONAR-5715 - @Test - public void test_issues_mode_on_project_with_space_in_filename() throws IOException { - restoreProfile("with-many-rules.xml"); - orchestrator.getServer().provisionProject("sample", "xoo-sample-with-spaces"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "with-many-rules"); - - SonarScanner runner = configureRunner("analysis/xoo-sample-with-spaces/v2"); - orchestrator.executeBuild(runner); - assertThat(getComponent(orchestrator, "sample:my sources/main/xoo/sample/My Sample.xoo")).isNotNull(); - - runner = configureRunnerIssues("analysis/xoo-sample-with-spaces/v2", null); - BuildResult result = orchestrator.executeBuild(runner); - // Analysis is not persisted in database - assertThat(getComponent(orchestrator, "com.sonarsource.it.samples:simple-sample")).isNull(); - assertThat(result.getLogs()).contains("Issues"); - assertThat(result.getLogs()).contains("ANALYSIS SUCCESSFUL"); - } - - @Test - public void should_not_fail_on_resources_that_have_existed_before() throws IOException { - restoreProfile("with-many-rules.xml"); - orchestrator.getServer().provisionProject("sample", "xoo-history"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "with-many-rules"); - - // First real scan with source - SonarScanner runner = configureRunner("shared/xoo-history-v2"); - orchestrator.executeBuild(runner); - assertThat(getComponent(orchestrator, "sample:src/main/xoo/sample/ClassAdded.xoo")).isNotNull(); - - // Second scan should remove ClassAdded.xoo - runner = configureRunner("shared/xoo-history-v1"); - orchestrator.executeBuild(runner); - assertThat(getComponent(orchestrator, "sample:src/main/xoo/sample/ClassAdded.xoo")).isNull(); - - // Re-add ClassAdded.xoo in local workspace - runner = configureRunnerIssues("shared/xoo-history-v2", null); - BuildResult result = orchestrator.executeBuild(runner); - - assertThat(getComponent(orchestrator, "sample:src/main/xoo/sample/ClassAdded.xoo")).isNull(); - assertThat(result.getLogs()).contains("Issues"); - assertThat(result.getLogs()).contains("ANALYSIS SUCCESSFUL"); - } - - @Test - public void should_fail_if_plugin_access_secured_properties() throws IOException { - // Test access from task (ie BatchSettings) - SonarScanner runner = configureRunnerIssues("shared/xoo-sample", null, - "accessSecuredFromTask", "true"); - BuildResult result = orchestrator.executeBuildQuietly(runner); - - assertThat(result.getLogs()).contains("Access to the secured property 'foo.bar.secured' is not possible in issues mode. " - + "The SonarQube plugin which requires this property must be deactivated in issues mode."); - - // Test access from sensor (ie ModuleSettings) - runner = configureRunnerIssues("shared/xoo-sample", null, - "accessSecuredFromSensor", "true"); - result = orchestrator.executeBuildQuietly(runner); - - assertThat(result.getLogs()).contains("Access to the secured property 'foo.bar.secured' is not possible in issues mode. " - + "The SonarQube plugin which requires this property must be deactivated in issues mode."); - } - - // SONAR-4602 - @Test - public void no_issues_mode_cache_by_default() throws Exception { - File homeDir = runFirstAnalysisAndFlagIssueAsWontFix(); - - // Second issues mode using same cache dir but cache disabled by default - SonarScanner runner = configureRunnerIssues("shared/xoo-sample", homeDir); - BuildResult result = orchestrator.executeBuild(runner); - - // False positive is not returned - assertThat(ItUtils.countIssuesInJsonReport(result, false)).isEqualTo(16); - } - - private File runFirstAnalysisAndFlagIssueAsWontFix() throws IOException { - restoreProfile("one-issue-per-line.xml"); - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - // First run (publish mode) - SonarScanner runner = configureRunner("shared/xoo-sample"); - orchestrator.executeBuild(runner); - - // First issues mode - File homeDir = temp.newFolder(); - runner = configureRunnerIssues("shared/xoo-sample", homeDir); - BuildResult result = orchestrator.executeBuild(runner); - - // 17 issues - assertThat(ItUtils.countIssuesInJsonReport(result, false)).isEqualTo(17); - - // Flag one issue as false positive - JSONObject obj = ItUtils.getJSONReport(result); - String key = ((JSONObject) ((JSONArray) obj.get("issues")).get(0)).get("key").toString(); - orchestrator.getServer().adminWsClient().issueClient().doTransition(key, "falsepositive"); - return homeDir; - } - - // SONAR-6522 - @Test - public void load_user_name_in_json_report() throws Exception { - restoreProfile("one-issue-per-line.xml"); - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - // First run (publish mode) - SonarScanner runner = configureRunner("shared/xoo-sample"); - orchestrator.executeBuild(runner); - - SonarClient client = orchestrator.getServer().adminWsClient(); - - Issues issues = client.issueClient().find(IssueQuery.create()); - Issue issue = issues.list().get(0); - - UserParameters creationParameters = UserParameters.create().login("julien").name("Julien H") - .password("password").passwordConfirmation("password"); - client.userClient().create(creationParameters); - - // Assign issue - client.issueClient().assign(issue.key(), "julien"); - - // Issues - runner = configureRunnerIssues("shared/xoo-sample", null, "sonar.login", "julien", "sonar.password", "password"); - BuildResult result = orchestrator.executeBuild(runner); - - JSONObject obj = ItUtils.getJSONReport(result); - - Map<String, String> userNameByLogin = Maps.newHashMap(); - final JSONArray users = (JSONArray) obj.get("users"); - if (users != null) { - for (Object user : users) { - String login = ObjectUtils.toString(((JSONObject) user).get("login")); - String name = ObjectUtils.toString(((JSONObject) user).get("name")); - userNameByLogin.put(login, name); - } - } - assertThat(userNameByLogin.get("julien")).isEqualTo("julien"); - - for (Object issueJson : (JSONArray) obj.get("issues")) { - JSONObject jsonObject = (JSONObject) issueJson; - if (issue.key().equals(jsonObject.get("key"))) { - assertThat(jsonObject.get("assignee")).isEqualTo("julien"); - return; - } - } - fail("Issue not found"); - } - - @Test - public void concurrent_issue_mode_on_existing_project() throws Exception { - restoreProfile("one-issue-per-line.xml"); - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - // use same working dir, because lock file is in it - String workDirPath = temp.newFolder().getAbsolutePath(); - SonarScanner runner = configureRunner("shared/xoo-sample", - "sonar.working.directory", workDirPath); - - orchestrator.executeBuild(runner); - - runConcurrentIssues(workDirPath); - } - - private void runConcurrentIssues(final String workDirPath) throws Exception { - // Install sonar-runner in advance to avoid concurrent unzip issues - FileSystem fileSystem = orchestrator.getConfiguration().fileSystem(); - new SonarScannerInstaller(fileSystem).install(Version.create(SonarScanner.DEFAULT_SCANNER_VERSION), fileSystem.workspace(), true); - final int nThreads = 3; - ExecutorService executorService = Executors.newFixedThreadPool(nThreads); - List<Callable<BuildResult>> tasks = new ArrayList<>(); - final File homeDir = temp.newFolder(); - for (int i = 0; i < nThreads; i++) { - tasks.add(new Callable<BuildResult>() { - - public BuildResult call() throws Exception { - SonarScanner runner = configureRunnerIssues("shared/xoo-sample", homeDir, - "sonar.it.enableWaitingSensor", "true", - "sonar.working.directory", workDirPath); - return orchestrator.executeBuild(runner); - } - }); - } - - boolean expectedError = false; - for (Future<BuildResult> result : executorService.invokeAll(tasks)) { - try { - result.get(); - } catch (ExecutionException e) { - if (e.getCause() instanceof BuildFailureException) { - BuildFailureException bfe = (BuildFailureException) e.getCause(); - assertThat(bfe.getResult().getLogs()).contains("Another SonarQube analysis is already in progress for this project"); - expectedError = true; - } else { - throw e; - } - } - } - if (!expectedError) { - fail("At least one of the threads should have failed"); - } - } - - private void restoreProfile(String fileName) { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/analysis/IssuesModeTest/" + fileName)); - } - - private SonarScanner configureRunnerIssues(String projectDir, @Nullable File homeDir, String... props) throws IOException { - SonarScanner scanner = SonarScanner.create(ItUtils.projectDir(projectDir), - "sonar.working.directory", temp.newFolder().getAbsolutePath(), - "sonar.analysis.mode", "issues", - "sonar.report.export.path", "sonar-report.json"); - if (homeDir != null) { - scanner.setProperty("sonar.userHome", homeDir.getAbsolutePath()); - } else { - scanner.setProperty("sonar.userHome", temp.newFolder().getAbsolutePath()); - } - scanner.setProperties(props); - return scanner; - } - - private SonarScanner configureRunner(String projectDir, String... props) throws IOException { - SonarScanner runner = SonarScanner.create(ItUtils.projectDir(projectDir), - "sonar.working.directory", temp.newFolder().getAbsolutePath(), - "sonar.report.export.path", "sonar-report.json", - "sonar.userHome", temp.newFolder().getAbsolutePath()); - runner.setProperties(props); - return runner; - } - - private void setDefaultQualityProfile(String languageKey, String profileName) { - orchestrator.getServer().adminWsClient().post("api/qualityprofiles/set_default", - "language", languageKey, - "profileName", profileName); - } - -} diff --git a/it/it-tests/src/test/java/it/analysis/LinksTest.java b/it/it-tests/src/test/java/it/analysis/LinksTest.java deleted file mode 100644 index fe31968935b..00000000000 --- a/it/it-tests/src/test/java/it/analysis/LinksTest.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysis; - -import com.google.common.collect.ImmutableMap; -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.MavenBuild; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category3Suite; -import java.util.List; -import java.util.Optional; -import org.junit.After; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.WsProjectLinks; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.projectlinks.SearchWsRequest; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; - -public class LinksTest { - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - private static final String PROJECT_KEY = "com.sonarsource.it.samples:simple-sample"; - - @After - public void cleanProjectLinksTable() { - orchestrator.getServer().post("api/projects/delete", ImmutableMap.of("key", PROJECT_KEY)); - } - - /** - * SONAR-3676 - */ - @Test - public void shouldUseLinkProperties() { - SonarScanner runner = SonarScanner.create(ItUtils.projectDir("analysis/links-project")) - .setProperty("sonar.scm.disabled", "true"); - orchestrator.executeBuild(runner); - - verifyLinks(); - } - - /** - * SONAR-3676 - */ - @Test - public void shouldUseLinkPropertiesOverPomLinksInMaven() { - MavenBuild build = MavenBuild.create(ItUtils.projectPom("analysis/links-project")) - .setCleanPackageSonarGoals() - .setProperty("sonar.scm.disabled", "true"); - orchestrator.executeBuild(build); - - verifyLinks(); - } - - private void verifyLinks() { - WsClient wsClient = ItUtils.newWsClient(orchestrator); - List<WsProjectLinks.Link> links = wsClient.projectLinks().search(new SearchWsRequest().setProjectKey(PROJECT_KEY)).getLinksList(); - verifyLink(links, "homepage", "http://www.simplesample.org_OVERRIDDEN"); - verifyLink(links, "ci", "http://bamboo.ci.codehaus.org/browse/SIMPLESAMPLE"); - verifyLink(links, "issue", "http://jira.codehaus.org/browse/SIMPLESAMPLE"); - verifyLink(links, "scm", "https://github.com/SonarSource/simplesample"); - verifyLink(links, "scm_dev", "scm:git:git@github.com:SonarSource/simplesample.git"); - } - - private void verifyLink(List<WsProjectLinks.Link> links, String expectedType, String expectedUrl) { - Optional<WsProjectLinks.Link> link = links.stream() - .filter(l -> l.getType().equals(expectedType)) - .findFirst(); - assertThat(link).isPresent(); - assertThat(link.get().getUrl()).isEqualTo(expectedUrl); - } -} diff --git a/it/it-tests/src/test/java/it/analysis/MultiLanguageTest.java b/it/it-tests/src/test/java/it/analysis/MultiLanguageTest.java deleted file mode 100644 index 5496c4e18ae..00000000000 --- a/it/it-tests/src/test/java/it/analysis/MultiLanguageTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysis; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category3Suite; -import java.util.Map; -import org.junit.After; -import org.junit.ClassRule; -import org.junit.Test; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasureAsDouble; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; - -public class MultiLanguageTest { - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - @After - public void cleanDatabase() { - orchestrator.resetData(); - } - - /** - * SONAR-926 - * SONAR-5069 - */ - @Test - public void test_sonar_runner_inspection() { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/analysis/MultiLanguageTest/one-issue-per-line.xml")); - ItUtils.restoreProfile(orchestrator, getClass().getResource("/analysis/MultiLanguageTest/one-issue-per-line-xoo2.xml")); - - orchestrator.getServer().provisionProject("multi-language-sample", "multi-language-sample"); - - orchestrator.getServer().associateProjectToQualityProfile("multi-language-sample", "xoo", "one-issue-per-line"); - orchestrator.getServer().associateProjectToQualityProfile("multi-language-sample", "xoo2", "one-issue-per-line-xoo2"); - - SonarScanner build = SonarScanner.create().setProjectDir(ItUtils.projectDir("analysis/xoo-multi-languages")); - BuildResult result = orchestrator.executeBuild(build); - - // 4 files: 1 .xoo, 1.xoo2, 2 .measures - assertThat(result.getLogs()).contains("4 files indexed"); - assertThat(result.getLogs()).contains("Quality profile for xoo: one-issue-per-line"); - assertThat(result.getLogs()).contains("Quality profile for xoo2: one-issue-per-line-xoo2"); - - // modules - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(orchestrator, "multi-language-sample", "files", "violations"); - assertThat(measures.get("files")).isEqualTo(2); - assertThat(measures.get("violations")).isEqualTo(26); - - assertThat(getMeasureAsDouble(orchestrator, "multi-language-sample:src/sample/Sample.xoo", "violations")).isEqualTo(13); - assertThat(getMeasureAsDouble(orchestrator, "multi-language-sample:src/sample/Sample.xoo2", "violations")).isEqualTo(13); - } -} diff --git a/it/it-tests/src/test/java/it/analysis/PermissionTest.java b/it/it-tests/src/test/java/it/analysis/PermissionTest.java deleted file mode 100644 index 372865fa411..00000000000 --- a/it/it-tests/src/test/java/it/analysis/PermissionTest.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysis; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category3Suite; -import javax.annotation.Nullable; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.ws.WsUserTokens; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.permission.AddUserWsRequest; -import org.sonarqube.ws.client.usertoken.GenerateWsRequest; -import org.sonarqube.ws.client.usertoken.RevokeWsRequest; -import org.sonarqube.ws.client.usertoken.UserTokensService; -import util.ItUtils; -import util.user.UserRule; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.projectDir; -import static util.ItUtils.resetSettings; -import static util.ItUtils.setServerProperty; - -public class PermissionTest { - - private static final String A_LOGIN = "a_login"; - private static final String A_PASSWORD = "a_password"; - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - private WsClient adminWsClient; - private UserTokensService userTokensWsClient; - - @Before - public void setUp() { - orchestrator.resetData(); - - // enforce scanners to be authenticated - setServerProperty(orchestrator, "sonar.forceAuthentication", "true"); - - adminWsClient = newAdminWsClient(orchestrator); - userTokensWsClient = adminWsClient.userTokens(); - } - - @After - public void tearDown() throws Exception { - resetSettings(orchestrator, null, "sonar.forceAuthentication"); - userRule.resetUsers(); - } - - @Test - public void scanner_can_authenticate_with_authentication_token() { - createUserWithProvisioningAndScanPermissions(); - - String tokenName = "For test"; - WsUserTokens.GenerateWsResponse generateWsResponse = userTokensWsClient.generate(new GenerateWsRequest() - .setLogin(A_LOGIN) - .setName(tokenName)); - SonarScanner sampleProject = SonarScanner.create(projectDir("shared/xoo-sample")); - sampleProject.setProperties( - "sonar.login", generateWsResponse.getToken(), - "sonar.password", ""); - - BuildResult buildResult = orchestrator.executeBuild(sampleProject); - - assertThat(buildResult.isSuccess()).isTrue(); - userTokensWsClient.revoke(new RevokeWsRequest().setLogin(A_LOGIN).setName(tokenName)); - } - - @Test - public void scanner_fails_if_authentication_token_is_not_valid() { - SonarScanner sampleProject = SonarScanner.create(projectDir("shared/xoo-sample")); - sampleProject.setProperties( - "sonar.login", "unknown-token", - "sonar.password", ""); - - BuildResult buildResult = orchestrator.executeBuildQuietly(sampleProject); - - assertThat(buildResult.isSuccess()).isFalse(); - } - - /** - * SONAR-4211 Test Sonar Runner when server requires authentication - */ - @Test - public void scanner_can_authenticate_with_login_password() { - createUserWithProvisioningAndScanPermissions(); - - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - - BuildResult buildResult = scanQuietly("shared/xoo-sample", - "sonar.login", "", - "sonar.password", ""); - assertThat(buildResult.getLastStatus()).isEqualTo(1); - assertThat(buildResult.getLogs()).contains( - "Not authorized. Analyzing this project requires to be authenticated. Please provide the values of the properties sonar.login and sonar.password."); - - // SONAR-4048 - buildResult = scanQuietly("shared/xoo-sample", - "sonar.login", "wrong_login", - "sonar.password", "wrong_password"); - assertThat(buildResult.getLastStatus()).isEqualTo(1); - assertThat(buildResult.getLogs()).contains( - "Not authorized. Please check the properties sonar.login and sonar.password."); - - buildResult = scan("shared/xoo-sample", - "sonar.login", A_LOGIN, - "sonar.password", A_PASSWORD); - assertThat(buildResult.getLastStatus()).isEqualTo(0); - } - - @Test - public void run_scanner_with_user_having_scan_permission_only_on_project() throws Exception { - userRule.createUser(A_LOGIN, A_PASSWORD); - orchestrator.getServer().provisionProject("sample", "sample"); - addUserPermission(A_LOGIN, "scan", "sample"); - - BuildResult buildResult = scanQuietly("shared/xoo-sample", "sonar.login", A_LOGIN, "sonar.password", A_PASSWORD); - - assertThat(buildResult.isSuccess()).isTrue(); - } - - private void addUserPermission(String login, String permission, @Nullable String projectKey) { - adminWsClient.permissions().addUser(new AddUserWsRequest() - .setLogin(login) - .setPermission(permission) - .setProjectKey(projectKey)); - } - - private BuildResult scan(String projectPath, String... props) { - SonarScanner scanner = configureScanner(projectPath, props); - return orchestrator.executeBuild(scanner); - } - - private BuildResult scanQuietly(String projectPath, String... props) { - SonarScanner scanner = configureScanner(projectPath, props); - return orchestrator.executeBuildQuietly(scanner); - } - - private SonarScanner configureScanner(String projectPath, String... props) { - return SonarScanner.create(ItUtils.projectDir(projectPath)) - .setProperties(props); - } - - private void createUserWithProvisioningAndScanPermissions() { - userRule.createUser(A_LOGIN, A_PASSWORD); - addUserPermission(A_LOGIN, "provisioning", null); - addUserPermission(A_LOGIN, "scan", null); - } - -} diff --git a/it/it-tests/src/test/java/it/analysis/ProjectBuilderTest.java b/it/it-tests/src/test/java/it/analysis/ProjectBuilderTest.java deleted file mode 100644 index b6561ebf346..00000000000 --- a/it/it-tests/src/test/java/it/analysis/ProjectBuilderTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysis; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.MavenBuild; -import it.Category3Suite; -import java.util.Map; -import org.junit.ClassRule; -import org.junit.Test; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getComponent; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; - -/** - * Test the extension point org.sonar.api.batch.bootstrap.ProjectBuilder - * <p/> - * A Sonar plugin can override the project definition injected by build-tool. - * Example: C# plugin loads project structure and modules from Visual Studio metadata file. - * - * @since 2.9 - */ -public class ProjectBuilderTest { - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - @Test - public void shouldDefineProjectFromPlugin() { - MavenBuild build = MavenBuild.create(ItUtils.projectPom("analysis/project-builder")) - .setCleanSonarGoals() - .setProperty("sonar.enableProjectBuilder", "true") - .setProperty("sonar.dynamicAnalysis", "false"); - orchestrator.executeBuild(build); - - checkProject(); - checkSubProject("project-builder-module-a"); - checkSubProject("project-builder-module-b"); - checkFile("project-builder-module-a", "src/HelloA.java"); - checkFile("project-builder-module-b", "src/HelloB.java"); - assertThat(getComponent(orchestrator, "com.sonarsource.it.projects.batch:project-builder-module-b:src/IgnoredFile.java")).isNull(); - } - - private void checkProject() { - // name has been changed by plugin - assertThat(getComponent(orchestrator, "com.sonarsource.it.projects.batch:project-builder").getName()).isEqualTo("Name changed by plugin"); - - Map<String, Double> measures = getMeasures("com.sonarsource.it.projects.batch:project-builder"); - assertThat(measures.get("files")).isEqualTo(2); - assertThat(measures.get("lines")).isGreaterThan(10); - } - - private void checkSubProject(String subProjectKey) { - Map<String, Double> measures = getMeasures("com.sonarsource.it.projects.batch:" + subProjectKey); - assertThat(measures.get("files")).isEqualTo(1); - assertThat(measures.get("lines")).isGreaterThan(5); - } - - private void checkFile(String subProjectKey, String fileKey) { - Map<String, Double> measures = getMeasures("com.sonarsource.it.projects.batch:" + subProjectKey + ":" + fileKey); - assertThat(measures.get("lines")).isGreaterThan(5); - } - - private Map<String, Double> getMeasures(String key) { - return getMeasuresAsDoubleByMetricKey(orchestrator, key, "lines", "files"); - } -} diff --git a/it/it-tests/src/test/java/it/analysis/ReportDumpTest.java b/it/it-tests/src/test/java/it/analysis/ReportDumpTest.java deleted file mode 100644 index e6c46b4a8a2..00000000000 --- a/it/it-tests/src/test/java/it/analysis/ReportDumpTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysis; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import com.sonar.orchestrator.http.HttpResponse; -import it.Category3Suite; -import java.io.File; -import java.io.IOException; -import java.io.StringReader; -import java.nio.charset.StandardCharsets; -import java.util.Properties; -import org.apache.commons.io.FileUtils; -import org.junit.ClassRule; -import org.junit.Test; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; - -public class ReportDumpTest { - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - /** - * SONAR-6905 - */ - @Test - public void dump_metadata_of_uploaded_report() throws Exception { - File projectDir = ItUtils.projectDir("shared/xoo-sample"); - orchestrator.executeBuild(SonarScanner.create(projectDir, "sonar.projectKey", "dump_metadata_of_uploaded_report", "sonar.projectName", "dump_metadata_of_uploaded_report")); - - File metadata = new File(projectDir, ".sonar/report-task.txt"); - assertThat(metadata).exists().isFile(); - - // verify properties - Properties props = new Properties(); - props.load(new StringReader(FileUtils.readFileToString(metadata, StandardCharsets.UTF_8))); - assertThat(props).hasSize(6); - assertThat(props.getProperty("projectKey")).isEqualTo("dump_metadata_of_uploaded_report"); - assertThat(props.getProperty("ceTaskId")).isNotEmpty(); - String serverVersion = orchestrator.getServer().newHttpCall("api/server/version").execute().getBodyAsString(); - assertThat(props.getProperty("serverVersion")).isEqualTo(serverVersion); - verifyUrl(props.getProperty("serverUrl")); - verifyUrl(props.getProperty("dashboardUrl")); - verifyUrl(props.getProperty("ceTaskUrl")); - } - - private void verifyUrl(String url) throws IOException { - HttpResponse response = orchestrator.getServer().newHttpCall(url).execute(); - assertThat(response.isSuccessful()).as(url).isTrue(); - assertThat(response.getBodyAsString()).as(url).isNotEmpty(); - } - -} diff --git a/it/it-tests/src/test/java/it/analysis/SSLTest.java b/it/it-tests/src/test/java/it/analysis/SSLTest.java deleted file mode 100644 index 97b40550297..00000000000 --- a/it/it-tests/src/test/java/it/analysis/SSLTest.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysis; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import com.sonar.orchestrator.util.NetworkUtils; -import it.Category3Suite; -import java.net.InetAddress; -import java.nio.file.Path; -import java.nio.file.Paths; -import org.eclipse.jetty.http.HttpVersion; -import org.eclipse.jetty.proxy.ProxyServlet; -import org.eclipse.jetty.server.Handler; -import org.eclipse.jetty.server.HttpConfiguration; -import org.eclipse.jetty.server.HttpConnectionFactory; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.server.SslConnectionFactory; -import org.eclipse.jetty.server.handler.DefaultHandler; -import org.eclipse.jetty.server.handler.HandlerCollection; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.util.ssl.SslContextFactory; -import org.eclipse.jetty.util.thread.QueuedThreadPool; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; - -public class SSLTest { - - private static final String CLIENT_KEYSTORE = "/analysis/SSLTest/clientkeystore.jks"; - private static final String CLIENT_KEYSTORE_PWD = "clientp12pwd"; - - private static final String CLIENT_TRUSTSTORE = "/analysis/SSLTest/clienttruststore.jks"; - private static final String CLIENT_TRUSTSTORE_PWD = "clienttruststorepwd"; - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - private static Server server; - private static int httpsPort; - - @Before - public void deleteData() { - orchestrator.resetData(); - } - - public static void startSSLTransparentReverseProxy(boolean requireClientAuth) throws Exception { - int httpPort = NetworkUtils.getNextAvailablePort(InetAddress.getLoopbackAddress()); - httpsPort = NetworkUtils.getNextAvailablePort(InetAddress.getLoopbackAddress()); - - // Setup Threadpool - QueuedThreadPool threadPool = new QueuedThreadPool(); - threadPool.setMaxThreads(500); - - server = new Server(threadPool); - - // HTTP Configuration - HttpConfiguration httpConfig = new HttpConfiguration(); - httpConfig.setSecureScheme("https"); - httpConfig.setSecurePort(httpsPort); - httpConfig.setSendServerVersion(true); - httpConfig.setSendDateHeader(false); - - // Handler Structure - HandlerCollection handlers = new HandlerCollection(); - handlers.setHandlers(new Handler[] {proxyHandler(), new DefaultHandler()}); - server.setHandler(handlers); - - ServerConnector http = new ServerConnector(server, new HttpConnectionFactory(httpConfig)); - http.setPort(httpPort); - server.addConnector(http); - - Path serverKeyStore = Paths.get(SSLTest.class.getResource("/analysis/SSLTest/serverkeystore.jks").toURI()).toAbsolutePath(); - String keyStorePassword = "serverkeystorepwd"; - String serverKeyPassword = "serverp12pwd"; - Path serverTrustStore = Paths.get(SSLTest.class.getResource("/analysis/SSLTest/servertruststore.jks").toURI()).toAbsolutePath(); - String trustStorePassword = "servertruststorepwd"; - - // SSL Context Factory - SslContextFactory sslContextFactory = new SslContextFactory(); - sslContextFactory.setKeyStorePath(serverKeyStore.toString()); - sslContextFactory.setKeyStorePassword(keyStorePassword); - sslContextFactory.setKeyManagerPassword(serverKeyPassword); - sslContextFactory.setTrustStorePath(serverTrustStore.toString()); - sslContextFactory.setTrustStorePassword(trustStorePassword); - sslContextFactory.setNeedClientAuth(requireClientAuth); - sslContextFactory.setExcludeCipherSuites("SSL_RSA_WITH_DES_CBC_SHA", - "SSL_DHE_RSA_WITH_DES_CBC_SHA", "SSL_DHE_DSS_WITH_DES_CBC_SHA", - "SSL_RSA_EXPORT_WITH_RC4_40_MD5", - "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", - "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", - "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"); - - // SSL HTTP Configuration - HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig); - - // SSL Connector - ServerConnector sslConnector = new ServerConnector(server, - new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()), - new HttpConnectionFactory(httpsConfig)); - sslConnector.setPort(httpsPort); - server.addConnector(sslConnector); - - server.start(); - } - - private static ServletContextHandler proxyHandler() { - ServletContextHandler contextHandler = new ServletContextHandler(); - contextHandler.setServletHandler(newServletHandler()); - return contextHandler; - } - - private static ServletHandler newServletHandler() { - ServletHandler handler = new ServletHandler(); - ServletHolder holder = handler.addServletWithMapping(ProxyServlet.Transparent.class, "/*"); - holder.setInitParameter("proxyTo", orchestrator.getServer().getUrl()); - return handler; - } - - @After - public void stopProxy() throws Exception { - if (server != null && server.isStarted()) { - server.stop(); - } - } - - @Test - public void simple_analysis_with_server_and_client_certificate() throws Exception { - startSSLTransparentReverseProxy(true); - - SonarScanner sonarScanner = SonarScanner.create(ItUtils.projectDir("shared/xoo-sample")) - .setScannerVersion("2.7") - .setProperty("sonar.host.url", "https://localhost:" + httpsPort); - - BuildResult buildResult = orchestrator.executeBuildQuietly(sonarScanner); - assertThat(buildResult.getLastStatus()).isNotEqualTo(0); - assertThat(buildResult.getLogs()).contains("javax.net.ssl.SSLHandshakeException"); - - Path clientTruststore = Paths.get(SSLTest.class.getResource(CLIENT_TRUSTSTORE).toURI()).toAbsolutePath(); - String truststorePassword = CLIENT_TRUSTSTORE_PWD; - Path clientKeystore = Paths.get(SSLTest.class.getResource(CLIENT_KEYSTORE).toURI()).toAbsolutePath(); - String keystorePassword = CLIENT_KEYSTORE_PWD; - - buildResult = orchestrator.executeBuild(sonarScanner - .setEnvironmentVariable("SONAR_SCANNER_OPTS", - "-Djavax.net.ssl.trustStore=" + clientTruststore.toString() + - " -Djavax.net.ssl.trustStorePassword=" + truststorePassword + - " -Djavax.net.ssl.keyStore=" + clientKeystore.toString() + - " -Djavax.net.ssl.keyStorePassword=" + keystorePassword)); - } - - @Test - public void simple_analysis_with_server_certificate() throws Exception { - startSSLTransparentReverseProxy(false); - - SonarScanner sonarScanner = SonarScanner.create(ItUtils.projectDir("shared/xoo-sample")) - .setScannerVersion("2.7") - .setProperty("sonar.host.url", "https://localhost:" + httpsPort); - - BuildResult buildResult = orchestrator.executeBuildQuietly(sonarScanner); - assertThat(buildResult.getLastStatus()).isNotEqualTo(0); - assertThat(buildResult.getLogs()).contains("javax.net.ssl.SSLHandshakeException"); - - Path clientTruststore = Paths.get(SSLTest.class.getResource(CLIENT_TRUSTSTORE).toURI()).toAbsolutePath(); - String truststorePassword = CLIENT_TRUSTSTORE_PWD; - - buildResult = orchestrator.executeBuild(sonarScanner - .setEnvironmentVariable("SONAR_SCANNER_OPTS", - "-Djavax.net.ssl.trustStore=" + clientTruststore.toString() + - " -Djavax.net.ssl.trustStorePassword=" + truststorePassword)); - } -} diff --git a/it/it-tests/src/test/java/it/analysis/ScannerTest.java b/it/it-tests/src/test/java/it/analysis/ScannerTest.java deleted file mode 100644 index 60baeecb9bd..00000000000 --- a/it/it-tests/src/test/java/it/analysis/ScannerTest.java +++ /dev/null @@ -1,395 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysis; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category3Suite; -import java.io.File; -import java.io.IOException; -import java.util.Map; -import org.apache.commons.io.FileUtils; -import org.junit.Assume; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.rules.TemporaryFolder; -import org.sonarqube.ws.client.component.SearchWsRequest; -import util.ItUtils; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getComponent; -import static util.ItUtils.getComponentNavigation; -import static util.ItUtils.getMeasureAsDouble; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.resetSettings; -import static util.ItUtils.setServerProperty; - -public class ScannerTest { - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @Before - public void deleteData() { - orchestrator.resetData(); - ItUtils.restoreProfile(orchestrator, getClass().getResource("/analysis/BatchTest/one-issue-per-line.xml")); - } - - /** - * SONAR-3718 - */ - @Test - public void should_scan_branch_with_forward_slash() { - scan("shared/xoo-multi-modules-sample"); - scan("shared/xoo-multi-modules-sample", "sonar.branch", "branch/0.x"); - - assertThat(newAdminWsClient(orchestrator).components().search(new SearchWsRequest().setQualifiers(singletonList("TRK"))).getComponentsList()).hasSize(2); - assertThat(getComponent(orchestrator, "com.sonarsource.it.samples:multi-modules-sample").getName()).isEqualTo("Sonar :: Integration Tests :: Multi-modules Sample"); - assertThat(getComponent(orchestrator, "com.sonarsource.it.samples:multi-modules-sample:branch/0.x").getName()) - .isEqualTo("Sonar :: Integration Tests :: Multi-modules Sample branch/0.x"); - } - - @Test - public void use_sonar_profile_without_provisioning_project() { - scan("shared/xoo-multi-modules-sample", - "sonar.profile", "one-issue-per-line", - "sonar.verbose", "true"); - assertThat(getMeasureAsDouble(orchestrator, "com.sonarsource.it.samples:multi-modules-sample", "violations")).isEqualTo(61); - } - - // SONAR-4680 - @Test - public void module_should_load_own_settings_from_database() { - String rootModuleKey = "com.sonarsource.it.samples:multi-modules-sample"; - orchestrator.getServer().provisionProject(rootModuleKey, "Sonar :: Integration Tests :: Multi-modules Sample"); - - String propKey = "myFakeProperty"; - String moduleBKey = rootModuleKey + ":module_b"; - resetSettings(orchestrator, rootModuleKey, propKey); - - BuildResult result = scan("shared/xoo-multi-modules-sample", "sonar.showSettings", propKey); - - assertThat(result.getLogs()).doesNotContain(rootModuleKey + ":" + propKey); - assertThat(result.getLogs()).doesNotContain(moduleBKey + ":" + propKey); - - // Set property only on root project - setServerProperty(orchestrator, rootModuleKey, propKey, "project"); - - result = scan("shared/xoo-multi-modules-sample", "sonar.showSettings", propKey); - - assertThat(result.getLogs()).contains(rootModuleKey + ":" + propKey + " = project"); - assertThat(result.getLogs()).contains(moduleBKey + ":" + propKey + " = project"); - - // Override property on moduleB - setServerProperty(orchestrator, moduleBKey, propKey, "moduleB"); - - result = scan("shared/xoo-multi-modules-sample", "sonar.showSettings", propKey); - - assertThat(result.getLogs()).contains(rootModuleKey + ":" + propKey + " = project"); - assertThat(result.getLogs()).contains(moduleBKey + ":" + propKey + " = moduleB"); - } - - // SONAR-4680 - @Test - public void module_should_load_settings_from_parent() { - String rootModuleKey = "com.sonarsource.it.samples:multi-modules-sample"; - orchestrator.getServer().provisionProject(rootModuleKey, "Sonar :: Integration Tests :: Multi-modules Sample"); - - String propKey = "myFakeProperty"; - String moduleBKey = rootModuleKey + ":module_b"; - - // Set property on provisioned project - setServerProperty(orchestrator, rootModuleKey, propKey, "project"); - - BuildResult result = scan("shared/xoo-multi-modules-sample", "sonar.showSettings", propKey); - - assertThat(result.getLogs()).contains(rootModuleKey + ":" + propKey + " = project"); - // Module should inherit from parent - assertThat(result.getLogs()).contains(moduleBKey + ":" + propKey + " = project"); - } - - /** - * SONAR-3024 - */ - @Test - public void should_support_source_files_with_same_deprecated_key() { - orchestrator.getServer().provisionProject("com.sonarsource.it.projects.batch:duplicate-source", "exclusions"); - orchestrator.getServer().associateProjectToQualityProfile("com.sonarsource.it.projects.batch:duplicate-source", "xoo", "one-issue-per-line"); - scan("analysis/duplicate-source"); - - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(orchestrator, "com.sonarsource.it.projects.batch:duplicate-source", "files", "directories"); - // 2 main files and 1 test file all with same deprecated key - assertThat(measures.get("files")).isEqualTo(2); - assertThat(measures.get("directories")).isEqualTo(2); - } - - /** - * SONAR-3125 - */ - @Test - public void should_display_explicit_message_when_no_plugin_language_available() { - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - BuildResult buildResult = scanQuietly("shared/xoo-sample", - "sonar.language", "foo", - "sonar.profile", ""); - assertThat(buildResult.getLastStatus()).isEqualTo(1); - assertThat(buildResult.getLogs()).contains( - "You must install a plugin that supports the language 'foo'"); - } - - @Test - public void should_display_explicit_message_when_wrong_profile() { - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - BuildResult buildResult = scanQuietly("shared/xoo-sample", - "sonar.profile", "unknow"); - assertThat(buildResult.getLastStatus()).isEqualTo(1); - assertThat(buildResult.getLogs()).contains( - "sonar.profile was set to 'unknow' but didn't match any profile for any language. Please check your configuration."); - } - - @Test - public void should_create_project_without_name_version() { - // some of the sub-modules have a name defined, others don't - BuildResult buildResult = scan("shared/xoo-multi-module-sample-without-project-name-version"); - assertThat(buildResult.isSuccess()).isTrue(); - - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample", "com.sonarsource.it.samples:multi-modules-sample", "not provided"); - - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample:module_b", "module_b", "not provided"); - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1", "module_b1", "not provided"); - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2", "Sub-module B2", "not provided"); - - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample:module_a", "Module A", "not provided"); - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1", "Sub-module A1", "not provided"); - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2", "Sub-module A2", "not provided"); - } - - @Test - public void should_analyze_project_without_name_version() { - orchestrator.getServer().provisionProject("com.sonarsource.it.samples:multi-modules-sample", "My project name"); - BuildResult buildResult = scan("shared/xoo-multi-module-sample-without-project-name-version", - "sonar.projectName", "My project name", - "sonar.projectVersion", "1.0"); - assertThat(buildResult.isSuccess()).isTrue(); - - buildResult = scan("shared/xoo-multi-module-sample-without-project-name-version"); - assertThat(buildResult.isSuccess()).isTrue(); - - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample", "My project name", "1.0"); - - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample:module_b", "module_b", "1.0"); - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1", "module_b1", "1.0"); - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2", "Sub-module B2", "1.0"); - - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample:module_a", "Module A", "1.0"); - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1", "Sub-module A1", "1.0"); - assertNameAndVersion("com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2", "Sub-module A2", "1.0"); - } - - private void assertNameAndVersion(String projectKey, String expectedProjectName, String expectedProjectVersion) { - assertThat(getComponent(orchestrator, projectKey).getName()).isEqualTo(expectedProjectName); - assertThat(getComponentNavigation(orchestrator, projectKey).getVersion()).isEqualTo(expectedProjectVersion); - } - - @Test - public void should_honor_sonarUserHome() { - File userHome = temp.getRoot(); - - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - SonarScanner scanner = configureScanner("shared/xoo-sample", - "sonar.verbose", "true"); - scanner.setEnvironmentVariable("SONAR_USER_HOME", "/dev/null"); - BuildResult buildResult = orchestrator.executeBuildQuietly(scanner); - assertThat(buildResult.getLastStatus()).isEqualTo(1); - - buildResult = scan("shared/xoo-sample", - "sonar.verbose", "true", - "sonar.userHome", userHome.getAbsolutePath()); - assertThat(buildResult.isSuccess()).isTrue(); - } - - /** - * SONAR-2291 - */ - @Test - public void batch_should_cache_plugin_jars() throws IOException { - File userHome = temp.newFolder(); - - BuildResult result = scan("shared/xoo-sample", - "sonar.userHome", userHome.getAbsolutePath()); - - File cache = new File(userHome, "cache"); - assertThat(cache).exists().isDirectory(); - int cachedFiles = FileUtils.listFiles(cache, new String[] {"jar"}, true).size(); - assertThat(cachedFiles).isGreaterThan(5); - assertThat(result.getLogs()).contains("User cache: " + cache.getAbsolutePath()); - assertThat(result.getLogs()).contains("Download sonar-xoo-plugin-"); - - result = scan("shared/xoo-sample", - "sonar.userHome", userHome.getAbsolutePath()); - assertThat(cachedFiles).isEqualTo(cachedFiles); - assertThat(result.getLogs()).contains("User cache: " + cache.getAbsolutePath()); - assertThat(result.getLogs()).doesNotContain("Download sonar-xoo-plugin-"); - } - - @Test - public void batch_should_keep_report_verbose() { - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - scanQuietly("shared/xoo-sample", "sonar.verbose", "true"); - File reportDir = new File(new File(ItUtils.projectDir("shared/xoo-sample"), ".sonar"), "batch-report"); - assertThat(reportDir).isDirectory(); - assertThat(reportDir.list()).isNotEmpty(); - } - - /** - * SONAR-4239 - */ - @Test - public void should_display_project_url_after_analysis() throws IOException { - orchestrator.getServer().provisionProject("com.sonarsource.it.samples:multi-modules-sample", "Sonar :: Integration Tests :: Multi-modules Sample"); - orchestrator.getServer().associateProjectToQualityProfile("com.sonarsource.it.samples:multi-modules-sample", "xoo", "one-issue-per-line"); - Assume.assumeTrue(orchestrator.getServer().version().isGreaterThanOrEquals("3.6")); - - BuildResult result = scan("shared/xoo-multi-modules-sample"); - - assertThat(result.getLogs()).contains("/dashboard/index/com.sonarsource.it.samples:multi-modules-sample"); - - result = scan("shared/xoo-multi-modules-sample", - "sonar.branch", "mybranch"); - - assertThat(result.getLogs()).contains("/dashboard/index/com.sonarsource.it.samples:multi-modules-sample:mybranch"); - - try { - setServerProperty(orchestrator, null, "sonar.core.serverBaseURL", "http://foo:123/sonar"); - result = scan("shared/xoo-multi-modules-sample"); - assertThat(result.getLogs()).contains("http://foo:123/sonar/dashboard/index/com.sonarsource.it.samples:multi-modules-sample"); - } finally { - resetSettings(orchestrator, null, "sonar.core.serverBaseURL"); - } - } - - /** - * SONAR-4188, SONAR-5178, SONAR-5915 - */ - @Test - public void should_display_explicit_message_when_invalid_project_key_or_branch() { - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - BuildResult buildResult = scanQuietly("shared/xoo-sample", - "sonar.projectKey", "ar g$l:"); - assertThat(buildResult.getLastStatus()).isEqualTo(1); - assertThat(buildResult.getLogs()).contains("\"ar g$l:\" is not a valid project or module key") - .contains("Allowed characters"); - - // SONAR-4629 - buildResult = scanQuietly("shared/xoo-sample", - "sonar.projectKey", "12345"); - assertThat(buildResult.getLastStatus()).isEqualTo(1); - assertThat(buildResult.getLogs()).contains("\"12345\" is not a valid project or module key") - .contains("Allowed characters"); - - buildResult = scanQuietly("shared/xoo-sample", - "sonar.branch", "ar g$l:"); - assertThat(buildResult.getLastStatus()).isEqualTo(1); - assertThat(buildResult.getLogs()).contains("\"ar g$l:\" is not a valid branch") - .contains("Allowed characters"); - } - - /** - * SONAR-4547 - */ - @Test - public void display_MessageException_without_stacktrace() throws Exception { - orchestrator.getServer().provisionProject("sample", "xoo-sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - BuildResult result = scanQuietly("shared/xoo-sample", "raiseMessageException", "true"); - assertThat(result.getLastStatus()).isNotEqualTo(0); - assertThat(result.getLogs()) - // message - .contains("Error message from plugin") - - // but not stacktrace - .doesNotContain("at com.sonarsource.RaiseMessageException"); - } - - /** - * SONAR-4751 - */ - @Test - public void file_extensions_are_case_insensitive() throws Exception { - orchestrator.getServer().provisionProject("case-sensitive-file-extensions", "Case Sensitive"); - orchestrator.getServer().associateProjectToQualityProfile("case-sensitive-file-extensions", "xoo", "one-issue-per-line"); - scan("analysis/case-sensitive-file-extensions"); - - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(orchestrator, "case-sensitive-file-extensions", "files", "ncloc"); - assertThat(measures.get("files")).isEqualTo(2); - assertThat(measures.get("ncloc")).isEqualTo(5 + 2); - } - - /** - * SONAR-4876 - */ - @Test - public void custom_module_key() { - orchestrator.getServer().provisionProject("com.sonarsource.it.samples:multi-modules-sample", "Sonar :: Integration Tests :: Multi-modules Sample"); - orchestrator.getServer().associateProjectToQualityProfile("com.sonarsource.it.samples:multi-modules-sample", "xoo", "one-issue-per-line"); - scan("analysis/custom-module-key"); - assertThat(getComponent(orchestrator, "com.sonarsource.it.samples:moduleA")).isNotNull(); - assertThat(getComponent(orchestrator, "com.sonarsource.it.samples:moduleB")).isNotNull(); - } - - private BuildResult scan(String projectPath, String... props) { - SonarScanner scanner = configureScanner(projectPath, props); - return orchestrator.executeBuild(scanner); - } - - private BuildResult scanQuietly(String projectPath, String... props) { - SonarScanner scanner = configureScanner(projectPath, props); - return orchestrator.executeBuildQuietly(scanner); - } - - private SonarScanner configureScanner(String projectPath, String... props) { - SonarScanner scanner = SonarScanner.create(ItUtils.projectDir(projectPath)) - .setProperties(props); - return scanner; - } - -} diff --git a/it/it-tests/src/test/java/it/analysis/SettingsEncryptionTest.java b/it/it-tests/src/test/java/it/analysis/SettingsEncryptionTest.java deleted file mode 100644 index 43768e309a2..00000000000 --- a/it/it-tests/src/test/java/it/analysis/SettingsEncryptionTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysis; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildFailureException; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category3Suite; -import java.io.File; -import java.net.URL; -import org.junit.ClassRule; -import org.junit.Test; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; - -public class SettingsEncryptionTest { - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - /** - * SONAR-2084 - * SONAR-4061 - */ - @Test - public void testEncryptedProperty() throws Exception { - SonarScanner build = SonarScanner.create(ItUtils.projectDir("shared/xoo-sample")) - .setProperty("sonar.secretKeyPath", pathToValidSecretKey()) - .setProperty("sonar.login", "admin") - // wrong password - .setProperty("sonar.password", "{aes}wrongencryption==")// wrong password - // "this is a secret" encrypted with the above secret key - .setProperty("encryptedProperty", "{aes}9mx5Zq4JVyjeChTcVjEide4kWCwusFl7P2dSVXtg9IY="); - BuildResult result = orchestrator.executeBuildQuietly(build); - assertThat(result.getStatus()).isNotEqualTo(0); - assertThat(result.getLogs()).contains("Fail to decrypt the property sonar.password. Please check your secret key"); - - build = SonarScanner.create(ItUtils.projectDir("shared/xoo-sample")) - .setProperty("sonar.secretKeyPath", pathToValidSecretKey()) - // "admin" encrypted with the above secret key - .setProperty("sonar.login", "{aes}evRHXHsEyPr5RjEuxUJcHA==") - .setProperty("sonar.password", "{aes}evRHXHsEyPr5RjEuxUJcHA==") - // "this is a secret" encrypted with the above secret key - .setProperty("encryptedProperty", "{aes}9mx5Zq4JVyjeChTcVjEide4kWCwusFl7P2dSVXtg9IY="); - // no error - orchestrator.executeBuild(build); - } - - /** - * SONAR-2084 - */ - @Test(expected = BuildFailureException.class) - public void failIfEncryptedPropertyButNoSecretKey() throws Exception { - // path to secret key is missing - SonarScanner build = SonarScanner.create(ItUtils.projectDir("shared/xoo-sample")) - .setProperty("encryptedProperty", "{aes}9mx5Zq4JVyjeChTcVjEide4kWCwusFl7P2dSVXtg9IY="); - orchestrator.executeBuild(build); - } - - private String pathToValidSecretKey() throws Exception { - URL resource = getClass().getResource("/analysis/SettingsEncryptionTest/sonar-secret.txt"); - return new File(resource.toURI()).getCanonicalPath(); - } -} diff --git a/it/it-tests/src/test/java/it/analysis/TempFolderTest.java b/it/it-tests/src/test/java/it/analysis/TempFolderTest.java deleted file mode 100644 index 0af1543b3ed..00000000000 --- a/it/it-tests/src/test/java/it/analysis/TempFolderTest.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysis; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category3Suite; -import java.io.File; -import java.io.IOException; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.rules.TemporaryFolder; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; - -public class TempFolderTest { - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @Before - public void deleteData() { - orchestrator.resetData(); - ItUtils.restoreProfile(orchestrator, getClass().getResource("/analysis/TempFolderTest/one-issue-per-line.xml")); - orchestrator.getServer().provisionProject("sample", "Sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - } - - // SONAR-4748 - @Test - public void should_create_in_temp_folder() throws IOException { - File projectDir = ItUtils.projectDir("shared/xoo-sample"); - BuildResult result = scan(); - - assertThat(result.getLogs()).doesNotContain("Creating temp directory:"); - assertThat(result.getLogs()).doesNotContain("Creating temp file:"); - - result = scan("sonar.createTempFiles", "true"); - assertThat(result.getLogs()).contains( - "Creating temp directory: " + projectDir.getCanonicalPath() + File.separator + ".sonar" + File.separator + ".sonartmp" + File.separator + "sonar-it"); - assertThat(result.getLogs()).contains( - "Creating temp file: " + projectDir.getCanonicalPath() + File.separator + ".sonar" + File.separator + ".sonartmp" + File.separator + "sonar-it"); - - // Verify temp folder is deleted after analysis - assertThat(new File(projectDir, ".sonar/.sonartmp/sonar-it")).doesNotExist(); - } - - // SONAR-4748 - @Test - public void should_not_use_system_tmp_dir() throws Exception { - File tmp = temp.newFolder(); - SonarScanner runner = configureScanner() - .setEnvironmentVariable("SONAR_RUNNER_OPTS", "-Djava.io.tmpdir=" + tmp.getAbsolutePath()); - orchestrator.executeBuild(runner); - - // temp directory is clean-up - assertThat(tmp.list()).isEmpty(); - } - - private BuildResult scan(String... props) { - SonarScanner runner = configureScanner(props); - return orchestrator.executeBuild(runner); - } - - private SonarScanner configureScanner(String... props) { - return SonarScanner.create(ItUtils.projectDir("shared/xoo-sample")) - .setProperties(props); - } - -} diff --git a/it/it-tests/src/test/java/it/analysisExclusion/FileExclusionsTest.java b/it/it-tests/src/test/java/it/analysisExclusion/FileExclusionsTest.java deleted file mode 100644 index c949f993240..00000000000 --- a/it/it-tests/src/test/java/it/analysisExclusion/FileExclusionsTest.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysisExclusion; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import java.util.List; -import java.util.Map; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.WsComponents.Component; -import org.sonarqube.ws.client.component.TreeWsRequest; -import util.ItUtils; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; -import static util.ItUtils.newWsClient; - -public class FileExclusionsTest { - static final String PROJECT = "exclusions"; - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Before - public void resetData() { - orchestrator.resetData(); - } - - @Test - public void exclude_source_files() { - scan( - "sonar.global.exclusions", "**/*Ignore*.xoo", - "sonar.exclusions", "**/*Exclude*.xoo,src/main/xoo/org/sonar/tests/packageToExclude/**", - "sonar.test.exclusions", "**/ClassTwoTest.xoo"); - - Map<String, Double> measures = getMeasuresAsDouble("ncloc", "files", "directories"); - assertThat(measures.get("files").intValue()).isEqualTo(4); - assertThat(measures.get("ncloc").intValue()).isEqualTo(60); - assertThat(measures.get("directories").intValue()).isEqualTo(2); - } - - /** - * SONAR-2444 / SONAR-3758 - */ - @Test - public void exclude_test_files() { - scan( - "sonar.global.exclusions", "**/*Ignore*.xoo", - "sonar.exclusions", "**/*Exclude*.xoo,org/sonar/tests/packageToExclude/**", - "sonar.test.exclusions", "**/ClassTwoTest.xoo"); - - List<Component> testFiles = getComponents("UTS"); - assertThat(testFiles).hasSize(2); - assertThat(testFiles).extracting(Component::getName).doesNotContain("ClassTwoTest.xoo"); - } - - /** - * SONAR-1896 - */ - @Test - public void include_source_files() { - scan( - "sonar.dynamicAnalysis", "false", - "sonar.inclusions", "**/*One.xoo,**/*Two.xoo"); - - assertThat(getMeasuresAsDouble("files").get("files")).isEqualTo(2); - - List<Component> sourceFiles = getComponents("FIL"); - assertThat(sourceFiles).hasSize(2); - assertThat(sourceFiles).extracting(Component::getName).containsOnly("ClassOne.xoo", "ClassTwo.xoo"); - } - - /** - * SONAR-1896 - */ - @Test - public void include_test_files() { - scan("sonar.test.inclusions", "src/test/xoo/**/*One*.xoo,src/test/xoo/**/*Two*.xoo"); - - assertThat(getMeasuresAsDouble("tests").get("tests")).isEqualTo(2); - - List<Component> testFiles = getComponents("UTS"); - assertThat(testFiles).hasSize(2); - assertThat(testFiles).extracting(Component::getName).containsOnly("ClassOneTest.xoo", "ClassTwoTest.xoo"); - } - - /** - * SONAR-2760 - */ - @Test - public void include_and_exclude_files_by_absolute_path() { - scan( - // includes everything except ClassOnDefaultPackage - "sonar.inclusions", "file:**/src/main/xoo/org/**/*.xoo", - - // exclude ClassThree and ClassToExclude - "sonar.exclusions", "file:**/src/main/xoo/org/**/packageToExclude/*.xoo,file:**/src/main/xoo/org/**/*Exclude.xoo"); - - List<Component> sourceFiles = getComponents("FIL"); - assertThat(sourceFiles).hasSize(4); - assertThat(sourceFiles).extracting(Component::getName).containsOnly("ClassOne.xoo", "ClassToIgnoreGlobally.xoo", "ClassTwo.xoo", "NoSonarComment.xoo"); - } - - static Map<String, Double> getMeasuresAsDouble(String... metricKeys) { - return getMeasuresAsDoubleByMetricKey(orchestrator, PROJECT, metricKeys); - } - - private void scan(String... properties) { - SonarScanner build = SonarScanner - .create(ItUtils.projectDir("exclusions/exclusions")) - .setProperties(properties); - orchestrator.executeBuild(build); - } - - public static List<Component> getComponents(String qualifier) { - return newWsClient(orchestrator).components().tree(new TreeWsRequest().setBaseComponentKey(PROJECT).setQualifiers(singletonList(qualifier))).getComponentsList(); - } -} diff --git a/it/it-tests/src/test/java/it/analysisExclusion/IssueExclusionsTest.java b/it/it-tests/src/test/java/it/analysisExclusion/IssueExclusionsTest.java deleted file mode 100644 index 46292024bd5..00000000000 --- a/it/it-tests/src/test/java/it/analysisExclusion/IssueExclusionsTest.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.analysisExclusion; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import java.util.Map; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; - -public class IssueExclusionsTest { - - private static final String PROJECT_KEY = "com.sonarsource.it.samples:multi-modules-exclusions"; - private static final String PROJECT_DIR = "exclusions/xoo-multi-modules"; - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Before - public void resetData() { - orchestrator.resetData(); - } - - @Test - public void should_not_exclude_anything() { - scan(); - - checkIssueCountBySeverity(67, 2, 57, 4, 0, 4); - } - - @Test - public void should_ignore_all_files() { - scan( - "sonar.issue.ignore.multicriteria", "1", - "sonar.issue.ignore.multicriteria.1.resourceKey", "**/*.xoo", - "sonar.issue.ignore.multicriteria.1.ruleKey", "*"); - - checkIssueCountBySeverity(4, 0, 0, 0, 0, 4); - } - - @Test - public void should_enforce_only_on_one_file() { - scan( - "sonar.issue.enforce.multicriteria", "1", - "sonar.issue.enforce.multicriteria.1.resourceKey", "**/HelloA1.xoo", - "sonar.issue.enforce.multicriteria.1.ruleKey", "*"); - - checkIssueCountBySeverity( - 1 /* tag */ + 18 /* lines in HelloA1.xoo */ + 1 /* file */, - 0 + 1, - 0 + 18, - 0 + 1, - 0, - 0); - } - - @Test - public void should_enforce_on_two_files_with_same_rule() { - scan( - "sonar.issue.enforce.multicriteria", "1,2", - "sonar.issue.enforce.multicriteria.1.resourceKey", "**/HelloA1.xoo", - "sonar.issue.enforce.multicriteria.1.ruleKey", "*", - "sonar.issue.enforce.multicriteria.2.resourceKey", "**/HelloA2.xoo", - "sonar.issue.enforce.multicriteria.2.ruleKey", "*"); - - checkIssueCountBySeverity( - 2 /* tags */ + 18 /* lines in HelloA1.xoo */ + 15 /* lines in HelloA2.xoo */ + 2 /* files */, - 0 + 2, - 0 + 18 + 15, - 0 + 2, - 0, - 0); - } - - @Test - public void should_enforce_on_two_files_with_different_rule() { - scan( - "sonar.issue.enforce.multicriteria", "1,2", - "sonar.issue.enforce.multicriteria.1.resourceKey", "**/HelloA1.xoo", - "sonar.issue.enforce.multicriteria.1.ruleKey", "xoo:OneIssuePerLine", - "sonar.issue.enforce.multicriteria.2.resourceKey", "**/HelloA2.xoo", - "sonar.issue.enforce.multicriteria.2.ruleKey", "xoo:HasTag"); - - checkIssueCountBySeverity( - 1 /* tag in HelloA2 */ + 18 /* lines in HelloA1.xoo */ + 4 /* files */ + 4 /* modules */, - 0 + 1, - 0 + 18, - 4, - 0, - 4); - } - - @Test - public void should_ignore_files_with_regexp() { - scan( - "sonar.issue.ignore.allfile", "1", - "sonar.issue.ignore.allfile.1.fileRegexp", "EXTERMINATE-ALL-ISSUES"); - - checkIssueCountBySeverity( - 67 - 1 /* tag */ - 18 /* lines in HelloA1.xoo */ - 1 /* file */, - 2 - 1, - 57 - 18, - 4 - 1, - 0, - 4); - } - - @Test - public void should_ignore_block_with_regexp() { - scan( - "sonar.issue.ignore.block", "1", - "sonar.issue.ignore.block.1.beginBlockRegexp", "MUTE-SONAR", - "sonar.issue.ignore.block.1.endBlockRegexp", "UNMUTE-SONAR"); - - checkIssueCountBySeverity( - 67 - 1 /* tag */ - 5 /* lines in HelloA2.xoo */, - 2 - 1, - 57 - 5, - 4, - 0, - 4); - } - - @Test - public void should_ignore_to_end_of_file() { - scan( - "sonar.issue.ignore.block", "1", - "sonar.issue.ignore.block.1.beginBlockRegexp", "MUTE-SONAR", - "sonar.issue.ignore.block.1.endBlockRegexp", ""); - - checkIssueCountBySeverity( - 67 - 1 /* tag */ - 7 /* remaining lines in HelloA2.xoo */, - 2 - 1, - 57 - 7, - 4, - 0, - 4); - } - - @Test - public void should_ignore_one_per_line_on_single_package() { - scan( - "sonar.issue.ignore.multicriteria", "1", - "sonar.issue.ignore.multicriteria.1.resourceKey", "**/com/sonar/it/samples/modules/a1/*", - "sonar.issue.ignore.multicriteria.1.ruleKey", "xoo:OneIssuePerLine"); - - checkIssueCountBySeverity( - 67 - 18 /* lines in HelloA1.xoo */, - 2, - 57 - 18, - 4, - 0, - 4); - } - - @Test - public void should_apply_exclusions_from_multiple_sources() { - scan( - "sonar.issue.ignore.allfile", "1", - "sonar.issue.ignore.allfile.1.fileRegexp", "EXTERMINATE-ALL-ISSUES", - "sonar.issue.ignore.block", "1", - "sonar.issue.ignore.block.1.beginBlockRegexp", "MUTE-SONAR", - "sonar.issue.ignore.block.1.endBlockRegexp", "UNMUTE-SONAR", - "sonar.issue.ignore.multicriteria", "1", - "sonar.issue.ignore.multicriteria.1.resourceKey", "**/com/sonar/it/samples/modules/b1/*", - "sonar.issue.ignore.multicriteria.1.ruleKey", "xoo:OneIssuePerLine"); - - checkIssueCountBySeverity( - 67 - 1 /* tag in HelloA1.xoo */ - 1 /* tag in HelloA2.xoo */ - - 18 /* lines in HelloA1.xoo */ - 5 /* lines in HelloA2.xoo */ - 12 /* lines in HelloB1.xoo */ - - 1 /* HelloA1.xoo file */, - 0, - 57 - 18 - 5 - 12, - 4 - 1, - 0, - 4); - } - - @Test - public void should_log_missing_resource_key() { - checkAnalysisFails( - "sonar.issue.ignore.multicriteria", "1", - "sonar.issue.ignore.multicriteria.1.resourceKey", "", - "sonar.issue.ignore.multicriteria.1.ruleKey", "*"); - } - - @Test - public void should_log_missing_rule_key() { - checkAnalysisFails( - "sonar.issue.ignore.multicriteria", "1", - "sonar.issue.ignore.multicriteria.1.resourceKey", "*", - "sonar.issue.ignore.multicriteria.1.ruleKey", ""); - } - - @Test - public void should_log_missing_block_start() { - checkAnalysisFails( - "sonar.issue.ignore.block", "1", - "sonar.issue.ignore.block.1.beginBlockRegexp", "", - "sonar.issue.ignore.block.1.endBlockRegexp", "UNMUTE-SONAR"); - } - - @Test - public void should_log_missing_whole_file_regexp() { - checkAnalysisFails( - "sonar.issue.ignore.allfile", "1", - "sonar.issue.ignore.allfile.1.fileRegexp", ""); - } - - protected BuildResult scan(String... properties) { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/exclusions/IssueExclusionsTest/with-many-rules.xml")); - orchestrator.getServer().provisionProject("com.sonarsource.it.samples:multi-modules-exclusions", - "Sonar :: Integration Tests :: Multi-modules With Exclusions"); - orchestrator.getServer().associateProjectToQualityProfile("com.sonarsource.it.samples:multi-modules-exclusions", "xoo", "with-many-rules"); - - SonarScanner scan = SonarScanner.create(ItUtils.projectDir(PROJECT_DIR)) - .setProperty("sonar.cpd.exclusions", "**/*") - .setProperties(properties) - .setProperty("sonar.verbose", "true"); - return orchestrator.executeBuildQuietly(scan); - } - - private void checkIssueCountBySeverity(int total, int taggedXoo, int perLine, int perFile, int blocker, int perModule) { - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(orchestrator, PROJECT_KEY, "violations", "info_violations", "minor_violations", "major_violations", - "blocker_violations", "critical_violations"); - assertThat(measures.get("violations").intValue()).isEqualTo(total); - assertThat(measures.get("info_violations").intValue()).isEqualTo(taggedXoo); // Has tag 'xoo' - assertThat(measures.get("minor_violations").intValue()).isEqualTo(perLine); // One per line - assertThat(measures.get("major_violations").intValue()).isEqualTo(perFile); // One per file - assertThat(measures.get("blocker_violations").intValue()).isEqualTo(blocker); - assertThat(measures.get("critical_violations").intValue()).isEqualTo(perModule); // One per module - } - - private void checkAnalysisFails(String... properties) { - BuildResult buildResult = scan(properties); - assertThat(buildResult.getStatus()).isNotEqualTo(0); - assertThat(buildResult.getLogs().indexOf("IllegalStateException")).isGreaterThan(0); - } -} diff --git a/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java b/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java deleted file mode 100644 index e315c731c44..00000000000 --- a/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.authorisation; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildFailureException; -import it.Category1Suite; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonar.wsclient.SonarClient; -import org.sonar.wsclient.user.UserParameters; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.permission.AddGroupWsRequest; -import org.sonarqube.ws.client.permission.AddProjectCreatorToTemplateWsRequest; -import org.sonarqube.ws.client.permission.RemoveGroupWsRequest; -import org.sonarqube.ws.client.project.UpdateVisibilityRequest; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.runProjectAnalysis; - -/** - * SONAR-4397 - */ -public class ExecuteAnalysisPermissionTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - private final static String USER_LOGIN = "scanperm"; - private final static String USER_PASSWORD = "thewhite"; - private final static String PROJECT_KEY = "sample"; - - private static WsClient adminWsClient; - private static SonarClient oldAdminWsClient; - - @Before - public void setUp() { - orchestrator.resetData(); - oldAdminWsClient = orchestrator.getServer().adminWsClient(); - oldAdminWsClient.userClient().create(UserParameters.create().login(USER_LOGIN).name(USER_LOGIN).password(USER_PASSWORD).passwordConfirmation(USER_PASSWORD)); - orchestrator.getServer().provisionProject(PROJECT_KEY, "Sample"); - adminWsClient = newAdminWsClient(orchestrator); - } - - @After - public void tearDown() { - addGlobalPermission("anyone", "scan"); - oldAdminWsClient.userClient().deactivate(USER_LOGIN); - } - - @Test - public void should_fail_if_logged_but_no_scan_permission() throws Exception { - executeLoggedAnalysis(); - - removeGlobalPermission("anyone", "scan"); - try { - // Execute logged analysis, but without the "Execute Analysis" permission - executeLoggedAnalysis(); - fail(); - } catch (BuildFailureException e) { - assertThat(e.getResult().getLogs()).contains( - "You're only authorized to execute a local (preview) SonarQube analysis without pushing the results to the SonarQube server. Please contact your SonarQube administrator."); - } - - ItUtils.newAdminWsClient(orchestrator).projects().updateVisibility(UpdateVisibilityRequest.builder().setProject(PROJECT_KEY).setVisibility("private").build()); - try { - // Execute anonymous analysis - executeAnonymousAnalysis(); - fail(); - } catch (BuildFailureException e) { - assertThat(e.getResult().getLogs()).contains( - "You're not authorized to execute any SonarQube analysis. Please contact your SonarQube administrator."); - } - } - - @Test - public void no_need_for_browse_permission_to_scan() throws Exception { - // Do a first analysis, no error - executeAnonymousAnalysis(); - - // make project private - ItUtils.newAdminWsClient(orchestrator).projects().updateVisibility(UpdateVisibilityRequest.builder().setProject("sample").setVisibility("private").build()); - - // still no error - executeAnonymousAnalysis(); - } - - @Test - public void execute_analysis_with_scan_permission_only_on_project() throws Exception { - removeGlobalPermission("anyone", "scan"); - addProjectPermission("anyone", PROJECT_KEY, "scan"); - - executeLoggedAnalysis(); - } - - @Test - public void execute_analysis_with_scan_on_default_template() { - removeGlobalPermission("anyone", "scan"); - adminWsClient.permissions().addProjectCreatorToTemplate(AddProjectCreatorToTemplateWsRequest.builder() - .setPermission("scan") - .setTemplateId("default_template") - .build()); - - runProjectAnalysis(orchestrator, "shared/xoo-sample", "sonar.login", USER_LOGIN, "sonar.password", USER_PASSWORD, "sonar.projectKey", "ANOTHER_PROJECT_KEY"); - } - - private static void addProjectPermission(String groupName, String projectKey, String permission) { - adminWsClient.permissions().addGroup(new AddGroupWsRequest().setGroupName(groupName).setProjectKey(projectKey).setPermission(permission)); - } - - private static void addGlobalPermission(String groupName, String permission) { - adminWsClient.permissions().addGroup(new AddGroupWsRequest().setGroupName(groupName).setPermission(permission)); - } - - private static void removeProjectPermission(String groupName, String projectKey, String permission) { - adminWsClient.permissions().removeGroup(new RemoveGroupWsRequest().setGroupName(groupName).setProjectKey(projectKey).setPermission(permission)); - } - - private static void removeGlobalPermission(String groupName, String permission) { - adminWsClient.permissions().removeGroup(new RemoveGroupWsRequest().setGroupName(groupName).setPermission(permission)); - } - - private static void executeLoggedAnalysis() { - runProjectAnalysis(orchestrator, "shared/xoo-sample", "sonar.login", USER_LOGIN, "sonar.password", USER_PASSWORD); - } - - private static void executeAnonymousAnalysis() { - runProjectAnalysis(orchestrator, "shared/xoo-sample"); - } -} diff --git a/it/it-tests/src/test/java/it/authorisation/IssuePermissionTest.java b/it/it-tests/src/test/java/it/authorisation/IssuePermissionTest.java deleted file mode 100644 index 61cc647c47a..00000000000 --- a/it/it-tests/src/test/java/it/authorisation/IssuePermissionTest.java +++ /dev/null @@ -1,276 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.authorisation; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonar.wsclient.SonarClient; -import org.sonar.wsclient.base.HttpException; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueQuery; -import org.sonar.wsclient.user.UserParameters; -import org.sonarqube.ws.Issues; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.issue.BulkChangeRequest; -import org.sonarqube.ws.client.permission.AddUserWsRequest; -import org.sonarqube.ws.client.project.UpdateVisibilityRequest; -import util.ItUtils; - -import static java.util.Arrays.asList; -import static junit.framework.TestCase.fail; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.newUserWsClient; -import static util.ItUtils.projectDir; - -public class IssuePermissionTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - public WsClient adminWsClient = newAdminWsClient(orchestrator); - - @Before - public void init() { - orchestrator.resetData(); - - ItUtils.restoreProfile(orchestrator, getClass().getResource("/authorisation/one-issue-per-line-profile.xml")); - - orchestrator.getServer().provisionProject("privateProject", "PrivateProject"); - ItUtils.newAdminWsClient(orchestrator).projects().updateVisibility(UpdateVisibilityRequest.builder().setProject("privateProject").setVisibility("private").build()); - orchestrator.getServer().associateProjectToQualityProfile("privateProject", "xoo", "one-issue-per-line"); - SonarScanner privateProject = SonarScanner.create(projectDir("shared/xoo-sample")) - .setProperty("sonar.projectKey", "privateProject") - .setProperty("sonar.projectName", "PrivateProject"); - orchestrator.executeBuild(privateProject); - - orchestrator.getServer().provisionProject("publicProject", "PublicProject"); - orchestrator.getServer().associateProjectToQualityProfile("publicProject", "xoo", "one-issue-per-line"); - SonarScanner publicProject = SonarScanner.create(projectDir("shared/xoo-sample")) - .setProperty("sonar.projectKey", "publicProject") - .setProperty("sonar.projectName", "PublicProject"); - - - orchestrator.executeBuild(publicProject); - } - - @Test - public void need_user_permission_on_project_to_see_issue() { - SonarClient client = orchestrator.getServer().adminWsClient(); - - String withBrowsePermission = "with-browse-permission"; - String withoutBrowsePermission = "without-browse-permission"; - - try { - client.userClient().create(UserParameters.create().login(withBrowsePermission).name(withBrowsePermission) - .password("password").passwordConfirmation("password")); - addUserPermission(withBrowsePermission, "privateProject", "user"); - - client.userClient().create(UserParameters.create().login(withoutBrowsePermission).name(withoutBrowsePermission) - .password("password").passwordConfirmation("password")); - - // Without user permission, a user cannot see issues on the project - assertThat(orchestrator.getServer().wsClient(withoutBrowsePermission, "password").issueClient().find( - IssueQuery.create().componentRoots("privateProject")).list()).isEmpty(); - - // With user permission, a user can see issues on the project - assertThat(orchestrator.getServer().wsClient(withBrowsePermission, "password").issueClient().find( - IssueQuery.create().componentRoots("privateProject")).list()).isNotEmpty(); - - } finally { - client.userClient().deactivate(withBrowsePermission); - client.userClient().deactivate(withoutBrowsePermission); - } - } - - /** - * SONAR-4839 - */ - @Test - public void need_user_permission_on_project_to_see_issue_changelog() { - SonarClient client = orchestrator.getServer().adminWsClient(); - Issue issue = client.issueClient().find(IssueQuery.create().componentRoots("privateProject")).list().get(0); - client.issueClient().assign(issue.key(), "admin"); - - String withBrowsePermission = "with-browse-permission"; - String withoutBrowsePermission = "without-browse-permission"; - - try { - client.userClient().create(UserParameters.create().login(withBrowsePermission).name(withBrowsePermission) - .password("password").passwordConfirmation("password")); - addUserPermission(withBrowsePermission, "privateProject", "user"); - - client.userClient().create(UserParameters.create().login(withoutBrowsePermission).name(withoutBrowsePermission) - .password("password").passwordConfirmation("password")); - - // Without user permission, a user cannot see issue changelog on the project - try { - changelog(issue.key(), withoutBrowsePermission, "password"); - fail(); - } catch (Exception e) { - assertThat(e).isInstanceOf(org.sonarqube.ws.client.HttpException.class).describedAs("403"); - } - - // Without user permission, a user cannot see issues on the project - assertThat(changelog(issue.key(), withBrowsePermission, "password").getChangelogList()).isNotEmpty(); - - } finally { - client.userClient().deactivate(withBrowsePermission); - client.userClient().deactivate(withoutBrowsePermission); - } - } - - /** - * SONAR-2447 - */ - @Test - public void need_administer_issue_permission_on_project_to_set_severity() { - SonarClient client = orchestrator.getServer().adminWsClient(); - Issue issueOnPrivateProject = client.issueClient().find(IssueQuery.create().componentRoots("privateProject")).list().get(0); - Issue issueOnPublicProject = client.issueClient().find(IssueQuery.create().componentRoots("publicProject")).list().get(0); - - String user = "user"; - - try { - client.userClient().create(UserParameters.create().login(user).name(user).password("password").passwordConfirmation("password")); - addUserPermission(user, "publicProject", "issueadmin"); - - // Without issue admin permission, a user cannot set severity on the issue - try { - orchestrator.getServer().wsClient(user, "password").issueClient().setSeverity(issueOnPrivateProject.key(), "BLOCKER"); - fail(); - } catch (Exception e) { - assertThat(e).isInstanceOf(HttpException.class).describedAs("404"); - } - - // With issue admin permission, a user can set severity on the issue - assertThat(orchestrator.getServer().wsClient(user, "password").issueClient().setSeverity(issueOnPublicProject.key(), "BLOCKER").severity()).isEqualTo("BLOCKER"); - - } finally { - client.userClient().deactivate(user); - } - } - - /** - * SONAR-2447 - */ - @Test - public void need_administer_issue_permission_on_project_to_flag_as_false_positive() { - SonarClient client = orchestrator.getServer().adminWsClient(); - Issue issueOnPrivateProject = client.issueClient().find(IssueQuery.create().componentRoots("privateProject")).list().get(0); - Issue issueOnPublicProject = client.issueClient().find(IssueQuery.create().componentRoots("publicProject")).list().get(0); - - String user = "user"; - - try { - client.userClient().create(UserParameters.create().login(user).name(user).password("password").passwordConfirmation("password")); - addUserPermission(user, "publicProject", "issueadmin"); - - // Without issue admin permission, a user cannot flag an issue as false positive - try { - orchestrator.getServer().wsClient(user, "password").issueClient().doTransition(issueOnPrivateProject.key(), "falsepositive"); - fail(); - } catch (Exception e) { - assertThat(e).isInstanceOf(HttpException.class).describedAs("404"); - } - - // With issue admin permission, a user can flag an issue as false positive - assertThat(orchestrator.getServer().wsClient(user, "password").issueClient().doTransition(issueOnPublicProject.key(), "falsepositive").status()).isEqualTo("RESOLVED"); - - } finally { - client.userClient().deactivate(user); - } - } - - /** - * SONAR-2447 - */ - @Test - public void need_administer_issue_permission_on_project_to_bulk_change_severity_and_false_positive() { - SonarClient client = orchestrator.getServer().adminWsClient(); - Issue issueOnPrivateProject = client.issueClient().find(IssueQuery.create().componentRoots("privateProject")).list().get(0); - Issue issueOnPublicProject = client.issueClient().find(IssueQuery.create().componentRoots("publicProject")).list().get(0); - - String user = "user"; - - try { - client.userClient().create(UserParameters.create().login(user).name(user).password("password").passwordConfirmation("password")); - addUserPermission(user, "privateProject", "issueadmin"); - - Issues.BulkChangeWsResponse response = makeBlockerAndFalsePositive(user, issueOnPrivateProject, issueOnPublicProject); - - // public project but no issueadmin permission on publicProject => issue visible but not updated - // no user permission on privateproject => issue invisible and not updated - assertThat(response.getTotal()).isEqualTo(1); - assertThat(response.getSuccess()).isEqualTo(0); - assertThat(response.getIgnored()).isEqualTo(1); - - addUserPermission(user, "privateProject", "user"); - response = makeBlockerAndFalsePositive(user, issueOnPrivateProject, issueOnPublicProject); - - // public project but no issueadmin permission on publicProject => unsuccessful on issueOnPublicProject - // user and issueadmin permission on privateproject => successful and 1 more issue visible - assertThat(response.getTotal()).isEqualTo(2); - assertThat(response.getSuccess()).isEqualTo(1); - assertThat(response.getIgnored()).isEqualTo(1); - - addUserPermission(user, "publicProject", "issueadmin"); - response = makeBlockerAndFalsePositive(user, issueOnPrivateProject, issueOnPublicProject); - - // public and issueadmin permission on publicProject => successful on issueOnPublicProject - // issueOnPrivateProject already in specified state => unsuccessful - assertThat(response.getTotal()).isEqualTo(2); - assertThat(response.getSuccess()).isEqualTo(1); - assertThat(response.getIgnored()).isEqualTo(1); - - response = makeBlockerAndFalsePositive(user, issueOnPrivateProject, issueOnPublicProject); - - // issueOnPublicProject and issueOnPrivateProject already in specified state => unsuccessful - assertThat(response.getTotal()).isEqualTo(2); - assertThat(response.getSuccess()).isEqualTo(0); - assertThat(response.getIgnored()).isEqualTo(2); - } finally { - client.userClient().deactivate(user); - } - } - - private Issues.BulkChangeWsResponse makeBlockerAndFalsePositive(String user, Issue issueOnPrivateProject, Issue issueOnPublicProject) { - return newUserWsClient(orchestrator, user, "password").issues() - .bulkChange(BulkChangeRequest.builder().setIssues(asList(issueOnPrivateProject.key(), issueOnPublicProject.key())) - .setSetSeverity("BLOCKER") - .setDoTransition("falsepositive") - .build()); - } - - private void addUserPermission(String login, String projectKey, String permission) { - adminWsClient.permissions().addUser( - new AddUserWsRequest() - .setLogin(login) - .setProjectKey(projectKey) - .setPermission(permission)); - } - - private static Issues.ChangelogWsResponse changelog(String issueKey, String login, String password) { - return newUserWsClient(orchestrator, login, password).issues().changelog(issueKey); - } -} diff --git a/it/it-tests/src/test/java/it/authorisation/PermissionSearchTest.java b/it/it-tests/src/test/java/it/authorisation/PermissionSearchTest.java deleted file mode 100644 index 8b91e3777e5..00000000000 --- a/it/it-tests/src/test/java/it/authorisation/PermissionSearchTest.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.authorisation; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.WsPermissions; -import org.sonarqube.ws.WsPermissions.Permission; -import org.sonarqube.ws.WsPermissions.SearchTemplatesWsResponse; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.permission.AddGroupToTemplateWsRequest; -import org.sonarqube.ws.client.permission.AddGroupWsRequest; -import org.sonarqube.ws.client.permission.AddProjectCreatorToTemplateWsRequest; -import org.sonarqube.ws.client.permission.AddUserToTemplateWsRequest; -import org.sonarqube.ws.client.permission.AddUserWsRequest; -import org.sonarqube.ws.client.permission.CreateTemplateWsRequest; -import org.sonarqube.ws.client.permission.GroupsWsRequest; -import org.sonarqube.ws.client.permission.PermissionsService; -import org.sonarqube.ws.client.permission.RemoveGroupFromTemplateWsRequest; -import org.sonarqube.ws.client.permission.RemoveProjectCreatorFromTemplateWsRequest; -import org.sonarqube.ws.client.permission.RemoveUserFromTemplateWsRequest; -import org.sonarqube.ws.client.permission.SearchTemplatesWsRequest; -import org.sonarqube.ws.client.permission.UsersWsRequest; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.tuple; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.projectDir; - -public class PermissionSearchTest { - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - private static WsClient adminWsClient; - private static PermissionsService permissionsWsClient; - - private static final String PROJECT_KEY = "sample"; - private static final String LOGIN = "george.orwell"; - private static final String GROUP_NAME = "1984"; - - @BeforeClass - public static void analyzeProject() { - orchestrator.resetData(); - - ItUtils.restoreProfile(orchestrator, PermissionSearchTest.class.getResource("/authorisation/one-issue-per-line-profile.xml")); - - orchestrator.getServer().provisionProject(PROJECT_KEY, "Sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - SonarScanner sampleProject = SonarScanner.create(projectDir("shared/xoo-sample")); - orchestrator.executeBuild(sampleProject); - - adminWsClient = newAdminWsClient(orchestrator); - permissionsWsClient = adminWsClient.permissions(); - - createUser(LOGIN, "George Orwell"); - createGroup(GROUP_NAME); - } - - @AfterClass - public static void delete_data() { - deactivateUser(LOGIN); - deleteGroup(GROUP_NAME); - } - - @Test - public void permission_web_services() { - permissionsWsClient.addUser( - new AddUserWsRequest() - .setPermission("admin") - .setLogin(LOGIN)); - permissionsWsClient.addGroup( - new AddGroupWsRequest() - .setPermission("admin") - .setGroupName(GROUP_NAME)); - - WsPermissions.WsSearchGlobalPermissionsResponse searchGlobalPermissionsWsResponse = permissionsWsClient.searchGlobalPermissions(); - assertThat(searchGlobalPermissionsWsResponse.getPermissionsList().get(0).getKey()).isEqualTo("admin"); - assertThat(searchGlobalPermissionsWsResponse.getPermissionsList().get(0).getUsersCount()).isEqualTo(1); - // by default, a group has the global admin permission - assertThat(searchGlobalPermissionsWsResponse.getPermissionsList().get(0).getGroupsCount()).isEqualTo(2); - - WsPermissions.UsersWsResponse users = permissionsWsClient - .users(new UsersWsRequest().setPermission("admin")); - assertThat(users.getUsersList()).extracting("login").contains(LOGIN); - - WsPermissions.WsGroupsResponse groupsResponse = permissionsWsClient - .groups(new GroupsWsRequest() - .setPermission("admin")); - assertThat(groupsResponse.getGroupsList()).extracting("name").contains(GROUP_NAME); - } - - @Test - public void template_permission_web_services() { - WsPermissions.CreateTemplateWsResponse createTemplateWsResponse = permissionsWsClient.createTemplate( - new CreateTemplateWsRequest() - .setName("my-new-template") - .setDescription("template-used-in-tests")); - assertThat(createTemplateWsResponse.getPermissionTemplate().getName()).isEqualTo("my-new-template"); - - permissionsWsClient.addUserToTemplate( - new AddUserToTemplateWsRequest() - .setPermission("admin") - .setTemplateName("my-new-template") - .setLogin(LOGIN)); - - permissionsWsClient.addGroupToTemplate( - new AddGroupToTemplateWsRequest() - .setPermission("admin") - .setTemplateName("my-new-template") - .setGroupName(GROUP_NAME)); - - permissionsWsClient.addProjectCreatorToTemplate( - AddProjectCreatorToTemplateWsRequest.builder() - .setPermission("admin") - .setTemplateName("my-new-template") - .build()); - - SearchTemplatesWsResponse searchTemplatesWsResponse = permissionsWsClient.searchTemplates( - new SearchTemplatesWsRequest() - .setQuery("my-new-template")); - assertThat(searchTemplatesWsResponse.getPermissionTemplates(0).getName()).isEqualTo("my-new-template"); - assertThat(searchTemplatesWsResponse.getPermissionTemplates(0).getPermissions(0).getKey()).isEqualTo("admin"); - assertThat(searchTemplatesWsResponse.getPermissionTemplates(0).getPermissions(0).getUsersCount()).isEqualTo(1); - assertThat(searchTemplatesWsResponse.getPermissionTemplates(0).getPermissions(0).getGroupsCount()).isEqualTo(1); - assertThat(searchTemplatesWsResponse.getPermissionTemplates(0).getPermissions(0).getWithProjectCreator()).isTrue(); - - permissionsWsClient.removeGroupFromTemplate( - new RemoveGroupFromTemplateWsRequest() - .setPermission("admin") - .setTemplateName("my-new-template") - .setGroupName(GROUP_NAME)); - - permissionsWsClient.removeUserFromTemplate( - new RemoveUserFromTemplateWsRequest() - .setPermission("admin") - .setTemplateName("my-new-template") - .setLogin(LOGIN)); - - permissionsWsClient.removeProjectCreatorFromTemplate( - RemoveProjectCreatorFromTemplateWsRequest.builder() - .setPermission("admin") - .setTemplateName("my-new-template") - .build() - ); - - SearchTemplatesWsResponse clearedSearchTemplatesWsResponse = permissionsWsClient.searchTemplates( - new SearchTemplatesWsRequest() - .setQuery("my-new-template")); - assertThat(clearedSearchTemplatesWsResponse.getPermissionTemplates(0).getPermissionsList()) - .extracting(Permission::getUsersCount, Permission::getGroupsCount, Permission::getWithProjectCreator) - .hasSize(5) - .containsOnly(tuple(0, 0, false)); - } - - private static void createUser(String login, String name) { - adminWsClient.wsConnector().call( - new PostRequest("api/users/create") - .setParam("login", login) - .setParam("name", name) - .setParam("password", "123456")); - } - - private static void deactivateUser(String login) { - adminWsClient.wsConnector().call( - new PostRequest("api/users/deactivate") - .setParam("login", login)); - } - - private static void createGroup(String groupName) { - adminWsClient.wsConnector().call( - new PostRequest("api/user_groups/create") - .setParam("name", groupName)); - } - - private static void deleteGroup(String groupName) { - adminWsClient.wsConnector().call( - new PostRequest("api/user_groups/delete") - .setParam("name", groupName)); - } -} diff --git a/it/it-tests/src/test/java/it/authorisation/PermissionTemplatesPageTest.java b/it/it-tests/src/test/java/it/authorisation/PermissionTemplatesPageTest.java deleted file mode 100644 index 568c5302da8..00000000000 --- a/it/it-tests/src/test/java/it/authorisation/PermissionTemplatesPageTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.authorisation; - -import com.sonar.orchestrator.Orchestrator; -import it.Category1Suite; -import org.junit.ClassRule; -import org.junit.Test; - -import static util.selenium.Selenese.runSelenese; - -public class PermissionTemplatesPageTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Test - public void should_display_page() throws Exception { - runSelenese(orchestrator, - "/authorisation/PermissionTemplatesPageTest/should_display_page.html", - "/authorisation/PermissionTemplatesPageTest/should_create.html"); - } - - @Test - public void should_manage_project_creators() throws Exception { - runSelenese(orchestrator, "/authorisation/PermissionTemplatesPageTest/should_manage_project_creators.html"); - } -} diff --git a/it/it-tests/src/test/java/it/authorisation/ProvisioningPermissionTest.java b/it/it-tests/src/test/java/it/authorisation/ProvisioningPermissionTest.java deleted file mode 100644 index 17b91aca415..00000000000 --- a/it/it-tests/src/test/java/it/authorisation/ProvisioningPermissionTest.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.authorisation; - -import com.sonar.orchestrator.Orchestrator; -import it.Category1Suite; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonarqube.ws.WsProjects.CreateWsResponse.Project; -import org.sonarqube.ws.client.HttpException; -import org.sonarqube.ws.client.permission.AddGroupWsRequest; -import org.sonarqube.ws.client.permission.AddUserWsRequest; -import org.sonarqube.ws.client.permission.PermissionsService; -import org.sonarqube.ws.client.permission.RemoveGroupWsRequest; -import org.sonarqube.ws.client.permission.RemoveUserWsRequest; -import org.sonarqube.ws.client.project.CreateRequest; -import util.user.UserRule; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.newUserWsClient; -import static util.selenium.Selenese.runSelenese; - -public class ProvisioningPermissionTest { - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @ClassRule - public static UserRule userRule = UserRule.from(orchestrator); - - private static final String PASSWORD = "password"; - - private static final String ADMIN_WITH_PROVISIONING = "admin-with-provisioning"; - private static final String ADMIN_WITHOUT_PROVISIONING = "admin-without-provisioning"; - private static final String USER_WITH_PROVISIONING = "user-with-provisioning"; - private static final String USER_WITHOUT_PROVISIONING = "user-without-provisioning"; - - private static PermissionsService permissionsWsClient; - - @BeforeClass - public static void init() { - permissionsWsClient = newAdminWsClient(orchestrator).permissions(); - - // remove default permission "provisioning" from anyone(); - permissionsWsClient.removeGroup(new RemoveGroupWsRequest().setGroupName("anyone").setPermission("provisioning")); - - userRule.createUser(ADMIN_WITH_PROVISIONING, PASSWORD); - addUserPermission(ADMIN_WITH_PROVISIONING, "admin"); - addUserPermission(ADMIN_WITH_PROVISIONING, "provisioning"); - - userRule.createUser(ADMIN_WITHOUT_PROVISIONING, PASSWORD); - addUserPermission(ADMIN_WITHOUT_PROVISIONING, "admin"); - removeUserPermission(ADMIN_WITHOUT_PROVISIONING, "provisioning"); - - userRule.createUser(USER_WITH_PROVISIONING, PASSWORD); - addUserPermission(USER_WITH_PROVISIONING, "provisioning"); - - userRule.createUser(USER_WITHOUT_PROVISIONING, PASSWORD); - removeUserPermission(USER_WITHOUT_PROVISIONING, "provisioning"); - } - - @AfterClass - public static void restoreData() throws Exception { - userRule.resetUsers(); - permissionsWsClient.addGroup(new AddGroupWsRequest().setGroupName("anyone").setPermission("provisioning")); - } - - /** - * SONAR-3871 - * SONAR-4709 - */ - @Test - public void organization_administrator_cannot_provision_project_if_he_doesnt_have_provisioning_permission() { - runSelenese(orchestrator, "/authorisation/ProvisioningPermissionTest/should-not-be-able-to-provision-project.html"); - } - - /** - * SONAR-3871 - * SONAR-4709 - */ - @Test - public void organization_administrator_can_provision_project_if_he_has_provisioning_permission() { - runSelenese(orchestrator, "/authorisation/ProvisioningPermissionTest/should-be-able-to-provision-project.html"); - } - - /** - * SONAR-3871 - * SONAR-4709 - */ - @Test - public void user_can_provision_project_through_ws_if_he_has_provisioning_permission() { - final String newKey = "new-project"; - final String newName = "New Project"; - - Project created = newUserWsClient(orchestrator, USER_WITH_PROVISIONING, PASSWORD).projects() - .create(CreateRequest.builder().setKey(newKey).setName(newName).build()) - .getProject(); - - assertThat(created).isNotNull(); - assertThat(created.getKey()).isEqualTo(newKey); - assertThat(created.getName()).isEqualTo(newName); - } - - /** - * SONAR-3871 - * SONAR-4709 - */ - @Test - public void user_cannot_provision_project_through_ws_if_he_doesnt_have_provisioning_permission() { - thrown.expect(HttpException.class); - thrown.expectMessage("403"); - - newUserWsClient(orchestrator, USER_WITHOUT_PROVISIONING, PASSWORD).projects() - .create(CreateRequest.builder().setKey("new-project").setName("New Project").build()) - .getProject(); - } - - private static void addUserPermission(String login, String permission) { - permissionsWsClient.addUser(new AddUserWsRequest().setLogin(login).setPermission(permission)); - } - - private static void removeUserPermission(String login, String permission) { - permissionsWsClient.removeUser(new RemoveUserWsRequest().setLogin(login).setPermission(permission)); - } -} diff --git a/it/it-tests/src/test/java/it/authorisation/QualityProfileAdminPermissionTest.java b/it/it-tests/src/test/java/it/authorisation/QualityProfileAdminPermissionTest.java deleted file mode 100644 index 2afa6a4e07f..00000000000 --- a/it/it-tests/src/test/java/it/authorisation/QualityProfileAdminPermissionTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.authorisation; - -import com.sonar.orchestrator.Orchestrator; -import it.Category1Suite; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.permission.AddUserWsRequest; -import util.user.UserRule; - -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.runProjectAnalysis; -import static util.selenium.Selenese.runSelenese; - -/** - * SONAR-4210 - */ -public class QualityProfileAdminPermissionTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @ClassRule - public static UserRule userRule = UserRule.from(orchestrator); - - private static WsClient adminWsClient; - - @BeforeClass - public static void init() { - orchestrator.resetData(); - adminWsClient = newAdminWsClient(orchestrator); - runProjectAnalysis(orchestrator, "shared/xoo-sample"); - } - - @AfterClass - public static void clearUsers() throws Exception { - userRule.resetUsers(); - } - - @Test - public void permission_should_grant_access_to_profile() { - userRule.createUser("not_profileadm", "userpwd"); - userRule.createUser("profileadm", "papwd"); - adminWsClient.permissions().addUser(new AddUserWsRequest().setLogin("profileadm").setPermission("profileadmin")); - createProfile("xoo", "foo"); - - runSelenese(orchestrator, - // Verify normal user is not allowed to do any modification - "/authorisation/QualityProfileAdminPermissionTest/normal-user.html", - // Verify profile admin is allowed to do modifications - "/authorisation/QualityProfileAdminPermissionTest/profile-admin.html"); - } - - private static void createProfile(String language, String name) { - adminWsClient.wsConnector().call( - new PostRequest("api/qualityprofiles/create") - .setParam("language", language) - .setParam("name", name)); - } - -} diff --git a/it/it-tests/src/test/java/it/ce/CeWsTest.java b/it/it-tests/src/test/java/it/ce/CeWsTest.java deleted file mode 100644 index 29445245618..00000000000 --- a/it/it-tests/src/test/java/it/ce/CeWsTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.ce; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.WsCe; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.ce.ActivityWsRequest; -import util.ItUtils; - -import static com.google.common.collect.Lists.newArrayList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.projectDir; - -public class CeWsTest { - @ClassRule - public static final Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - private WsClient wsClient; - private String taskUuid; - - @Before - public void inspectProject() { - orchestrator.resetData(); - BuildResult buildResult = orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - this.taskUuid = ItUtils.extractCeTaskId(buildResult); - this.wsClient = ItUtils.newAdminWsClient(orchestrator); - } - - @Test - public void activity() { - WsCe.ActivityResponse response = wsClient.ce().activity(new ActivityWsRequest() - .setStatus(newArrayList("SUCCESS")) - .setType("REPORT") - .setOnlyCurrents(true) - .setPage(1) - .setPageSize(100)); - - assertThat(response).isNotNull(); - assertThat(response.getTasksCount()).isGreaterThan(0); - WsCe.Task firstTask = response.getTasks(0); - assertThat(firstTask.getId()).isNotEmpty(); - } - - @Test - public void task() { - WsCe.TaskResponse taskResponse = wsClient.ce().task(taskUuid); - - assertThat(taskResponse.hasTask()).isTrue(); - WsCe.Task task = taskResponse.getTask(); - assertThat(task.getId()).isEqualTo(taskUuid); - assertThat(task.hasErrorMessage()).isFalse(); - assertThat(task.hasHasScannerContext()).isTrue(); - assertThat(task.getScannerContext()).isNotNull(); - } - - @Test - public void task_types() { - WsCe.TaskTypesWsResponse response = wsClient.ce().taskTypes(); - - assertThat(response).isNotNull(); - assertThat(response.getTaskTypesCount()).isGreaterThan(0); - } -} diff --git a/it/it-tests/src/test/java/it/complexity/ComplexityMeasuresTest.java b/it/it-tests/src/test/java/it/complexity/ComplexityMeasuresTest.java deleted file mode 100644 index ce192047f07..00000000000 --- a/it/it-tests/src/test/java/it/complexity/ComplexityMeasuresTest.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.complexity; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Java6Assertions.entry; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; -import static util.ItUtils.projectDir; - -// TODO complete the test with other complexity metrics -public class ComplexityMeasuresTest { - - private static final String PROJECT = "com.sonarsource.it.samples:multi-modules-sample"; - private static final String MODULE = "com.sonarsource.it.samples:multi-modules-sample:module_a"; - private static final String SUB_MODULE = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1"; - private static final String DIRECTORY = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1"; - private static final String FILE = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo"; - - private static final String COMPLEXITY_METRIC = "complexity"; - private static final String COGNITIVE_COMPLEXITY_METRIC = "cognitive_complexity"; - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @BeforeClass - public static void inspectProject() { - orchestrator.resetData(); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample"))); - } - - @Test - public void compute_complexity_metrics_on_file() { - assertThat(getMeasuresAsDoubleByMetricKey(orchestrator, FILE, COMPLEXITY_METRIC, COGNITIVE_COMPLEXITY_METRIC)).containsOnly( - entry(COMPLEXITY_METRIC, 3d), - entry(COGNITIVE_COMPLEXITY_METRIC, 4d)); - } - - @Test - public void compute_complexity_metrics_on_directory() { - assertThat(getMeasuresAsDoubleByMetricKey(orchestrator, DIRECTORY, COMPLEXITY_METRIC, COGNITIVE_COMPLEXITY_METRIC)).containsOnly( - entry(COMPLEXITY_METRIC, 3d), - entry(COGNITIVE_COMPLEXITY_METRIC, 4d)); - } - - @Test - public void compute_complexity_metrics_on_sub_module() { - assertThat(getMeasuresAsDoubleByMetricKey(orchestrator, SUB_MODULE, COMPLEXITY_METRIC, COGNITIVE_COMPLEXITY_METRIC)).containsOnly( - entry(COMPLEXITY_METRIC, 3d), - entry(COGNITIVE_COMPLEXITY_METRIC, 4d)); - } - - @Test - public void compute_complexity_metrics_on_module() { - assertThat(getMeasuresAsDoubleByMetricKey(orchestrator, MODULE, COMPLEXITY_METRIC, COGNITIVE_COMPLEXITY_METRIC)).containsOnly( - entry(COMPLEXITY_METRIC, 7d), - entry(COGNITIVE_COMPLEXITY_METRIC, 9d)); - } - - @Test - public void compute_complexity_metrics_on_project() { - assertThat(getMeasuresAsDoubleByMetricKey(orchestrator, PROJECT, COMPLEXITY_METRIC, COGNITIVE_COMPLEXITY_METRIC)).containsOnly( - entry(COMPLEXITY_METRIC, 13d), - entry(COGNITIVE_COMPLEXITY_METRIC, 17d)); - } - -} diff --git a/it/it-tests/src/test/java/it/component/ComponentsWsTest.java b/it/it-tests/src/test/java/it/component/ComponentsWsTest.java deleted file mode 100644 index 4820f670cf8..00000000000 --- a/it/it-tests/src/test/java/it/component/ComponentsWsTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.component; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonarqube.ws.WsComponents; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.component.SearchWsRequest; -import org.sonarqube.ws.client.component.ShowWsRequest; -import util.ItUtils; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.projectDir; - -public class ComponentsWsTest { - @ClassRule - public static final Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - private static final String FILE_KEY = "sample:src/main/xoo/sample/Sample.xoo"; - - @Rule - public ExpectedException expectedException = ExpectedException.none(); - - WsClient wsClient; - - @Before - public void inspectProject() { - orchestrator.resetData(); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - - wsClient = ItUtils.newAdminWsClient(orchestrator); - } - - @Test - public void show() { - WsComponents.ShowWsResponse response = wsClient.components().show(new ShowWsRequest().setKey(FILE_KEY)); - - assertThat(response).isNotNull(); - assertThat(response.getComponent().getKey()).isEqualTo(FILE_KEY); - assertThat(response.getAncestorsList()).isNotEmpty(); - } - - @Test - public void search() { - WsComponents.SearchWsResponse response = wsClient.components().search(new SearchWsRequest() - .setQualifiers(singletonList("FIL"))); - - assertThat(response).isNotNull(); - assertThat(response.getComponents(0).getKey()).isEqualTo(FILE_KEY); - } -} diff --git a/it/it-tests/src/test/java/it/component/ProjectsWsTest.java b/it/it-tests/src/test/java/it/component/ProjectsWsTest.java deleted file mode 100644 index a8f760178d9..00000000000 --- a/it/it-tests/src/test/java/it/component/ProjectsWsTest.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.component; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import java.io.IOException; -import org.apache.commons.io.IOUtils; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.util.EntityUtils; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonarqube.ws.WsComponents; -import org.sonarqube.ws.WsProjects.BulkUpdateKeyWsResponse; -import org.sonarqube.ws.WsProjects.BulkUpdateKeyWsResponse.Key; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.component.ShowWsRequest; -import org.sonarqube.ws.client.project.BulkUpdateKeyWsRequest; -import org.sonarqube.ws.client.project.UpdateKeyWsRequest; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.projectDir; - -public class ProjectsWsTest { - - @ClassRule - public static final Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - private static final String PROJECT_KEY = "sample"; - - @Rule - public ExpectedException expectedException = ExpectedException.none(); - - private WsClient wsClient; - - @Before - public void inspectProject() { - orchestrator.resetData(); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - - wsClient = ItUtils.newAdminWsClient(orchestrator); - } - - /** - * SONAR-3105 - */ - @Test - public void projects_web_service() throws IOException { - SonarScanner build = SonarScanner.create(projectDir("shared/xoo-sample")); - orchestrator.executeBuild(build); - - String url = orchestrator.getServer().getUrl() + "/api/projects/index?key=sample&versions=true"; - HttpClient httpclient = new DefaultHttpClient(); - try { - HttpGet get = new HttpGet(url); - HttpResponse response = httpclient.execute(get); - - assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200); - String content = IOUtils.toString(response.getEntity().getContent()); - assertThat(content).doesNotContain("error"); - assertThat(content).contains("sample"); - EntityUtils.consume(response.getEntity()); - - } finally { - httpclient.getConnectionManager().shutdown(); - } - } - - @Test - public void update_key() { - String newProjectKey = "another_project_key"; - WsComponents.Component project = wsClient.components().show(new ShowWsRequest().setKey(PROJECT_KEY)).getComponent(); - assertThat(project.getKey()).isEqualTo(PROJECT_KEY); - - wsClient.projects().updateKey(UpdateKeyWsRequest.builder() - .setKey(PROJECT_KEY) - .setNewKey(newProjectKey) - .build()); - - assertThat(wsClient.components().show(new ShowWsRequest().setId(project.getId())).getComponent().getKey()).isEqualTo(newProjectKey); - } - - @Test - public void bulk_update_key() { - String newProjectKey = "another_project_key"; - WsComponents.Component project = wsClient.components().show(new ShowWsRequest().setKey(PROJECT_KEY)).getComponent(); - assertThat(project.getKey()).isEqualTo(PROJECT_KEY); - - BulkUpdateKeyWsResponse result = wsClient.projects().bulkUpdateKey(BulkUpdateKeyWsRequest.builder() - .setKey(PROJECT_KEY) - .setFrom(PROJECT_KEY) - .setTo(newProjectKey) - .build()); - - assertThat(wsClient.components().show(new ShowWsRequest().setId(project.getId())).getComponent().getKey()).isEqualTo(newProjectKey); - assertThat(result.getKeysCount()).isEqualTo(1); - assertThat(result.getKeys(0)) - .extracting(Key::getKey, Key::getNewKey, Key::getDuplicate) - .containsOnlyOnce(PROJECT_KEY, newProjectKey, false); - } -} diff --git a/it/it-tests/src/test/java/it/customMeasure/CustomMeasuresTest.java b/it/it-tests/src/test/java/it/customMeasure/CustomMeasuresTest.java deleted file mode 100644 index f7c1149fefb..00000000000 --- a/it/it-tests/src/test/java/it/customMeasure/CustomMeasuresTest.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.customMeasure; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.projectDir; - -public class CustomMeasuresTest { - - private static final String PROJECT_KEY = "sample"; - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Before - public void deleteProjects() { - orchestrator.resetData(); - } - - @Test - public void custom_measures_should_be_integrated_during_project_analysis() { - analyzeProject(); - setBurnedBudget(1200.3); - setTeamSize(4); - - assertThat(getMeasureAsDouble("team_size")).isNull(); - assertThat(getMeasureAsDouble("burned_budget")).isNull(); - - analyzeProject(); - - assertThat(getMeasureAsDouble("burned_budget")).isEqualTo(1200.3); - assertThat(getMeasureAsDouble("team_size")).isEqualTo(4d); - } - - @Test - public void should_update_value() { - analyzeProject(); - setTeamSize(4); - analyzeProject(); - updateTeamSize(15); - assertThat(getMeasureAsDouble("team_size")).isEqualTo(4d); - analyzeProject();// the value is available when the project is analyzed again - assertThat(getMeasureAsDouble("team_size")).isEqualTo(15d); - } - - @Test - public void should_delete_custom_measure() { - analyzeProject(); - setTeamSize(4); - analyzeProject(); - deleteCustomMeasure("team_size"); - assertThat(getMeasureAsDouble("team_size")).isEqualTo(4d);// the value is still available. It will be removed during next - // analyzed - - analyzeProject(); - assertThat(getMeasureAsDouble("team_size")).isNull(); - } - - private void analyzeProject() { - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - } - - private void setTeamSize(int i) { - orchestrator.getServer().adminWsClient().post("api/custom_measures/create", "projectKey", PROJECT_KEY, "metricKey", "team_size", "value", String.valueOf(i)); - } - - private void updateTeamSize(int i) { - String response = orchestrator.getServer().adminWsClient().get("api/custom_measures/search", "projectKey", PROJECT_KEY, "metricKey", "team_size"); - Matcher jsonObjectMatcher = Pattern.compile(".*?\"id\"\\s*:\\s*\"(.*?)\".*", Pattern.MULTILINE).matcher(response); - jsonObjectMatcher.find(); - String customMeasureId = jsonObjectMatcher.group(1); - orchestrator.getServer().adminWsClient().post("api/custom_measures/update", "id", customMeasureId, "value", String.valueOf(i)); - } - - private void setBurnedBudget(double d) { - orchestrator.getServer().adminWsClient().post("api/custom_measures/create", "projectKey", PROJECT_KEY, "metricKey", "burned_budget", "value", String.valueOf(d)); - } - - private void deleteCustomMeasure(String metricKey) { - String response = orchestrator.getServer().adminWsClient().get("api/custom_measures/search", "projectKey", PROJECT_KEY, "metricKey", metricKey); - Matcher jsonObjectMatcher = Pattern.compile(".*?\"id\"\\s*:\\s*\"(.*?)\".*", Pattern.MULTILINE).matcher(response); - jsonObjectMatcher.find(); - String customMeasureId = jsonObjectMatcher.group(1); - orchestrator.getServer().adminWsClient().post("api/custom_measures/delete", "id", customMeasureId); - } - - private Double getMeasureAsDouble(String metricKey) { - return ItUtils.getMeasureAsDouble(orchestrator, PROJECT_KEY, metricKey); - } -} diff --git a/it/it-tests/src/test/java/it/dbCleaner/PurgeTest.java b/it/it-tests/src/test/java/it/dbCleaner/PurgeTest.java deleted file mode 100644 index 5c5b450dced..00000000000 --- a/it/it-tests/src/test/java/it/dbCleaner/PurgeTest.java +++ /dev/null @@ -1,377 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.dbCleaner; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import java.util.Calendar; -import java.util.Date; -import java.util.List; -import java.util.Map; -import org.apache.commons.lang.time.DateFormatUtils; -import org.apache.commons.lang.time.DateUtils; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ErrorCollector; -import org.sonarqube.ws.WsMeasures; -import org.sonarqube.ws.WsMeasures.SearchHistoryResponse.HistoryValue; -import org.sonarqube.ws.client.measure.SearchHistoryRequest; -import util.ItUtils; - -import static java.util.Collections.singletonList; -import static org.apache.commons.lang.time.DateUtils.addDays; -import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static util.ItUtils.formatDate; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.runProjectAnalysis; -import static util.ItUtils.setServerProperty; - -@Ignore -public class PurgeTest { - - private static final String COUNT_FILE_MEASURES = "project_measures pm, projects p where p.uuid = pm.component_uuid and p.scope='FIL'"; - private static final String COUNT_DIR_MEASURES = "project_measures pm, projects p where p.uuid = pm.component_uuid and p.scope='DIR'"; - private static final String PROJECT_KEY = "com.sonarsource.it.samples:multi-modules-sample"; - private static final String PROJECT_SAMPLE_PATH = "dbCleaner/xoo-multi-modules-sample"; - - private static final String ONE_DAY_AGO = DateFormatUtils.ISO_DATE_FORMAT.format(addDays(new Date(), -1)); - private static final String TWO_DAYS_AGO = DateFormatUtils.ISO_DATE_FORMAT.format(addDays(new Date(), -2)); - - @ClassRule - public static final Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Rule - public ErrorCollector collector = new ErrorCollector(); - - @Before - public void deleteProjectData() { - orchestrator.resetData(); - - orchestrator.getServer().provisionProject(PROJECT_KEY, PROJECT_KEY); - - ItUtils.restoreProfile(orchestrator, getClass().getResource("/dbCleaner/one-issue-per-line-profile.xml")); - - setServerProperty(orchestrator, "sonar.dbcleaner.cleanDirectory", null); - setServerProperty(orchestrator, "sonar.dbcleaner.hoursBeforeKeepingOnlyOneSnapshotByDay", null); - setServerProperty(orchestrator, "sonar.dbcleaner.weeksBeforeKeepingOnlyOneSnapshotByWeek", null); - } - - @Test - public void test_evolution_of_number_of_rows_when_scanning_two_times_the_same_project() { - Date today = new Date(); - Date yesterday = DateUtils.addDays(today, -1); - - scan(PROJECT_SAMPLE_PATH, DateFormatUtils.ISO_DATE_FORMAT.format(yesterday)); - - // count components - collector.checkThat("Wrong number of projects", count("projects where qualifier in ('TRK','BRC')"), equalTo(7)); - collector.checkThat("Wrong number of directories", count("projects where qualifier in ('DIR')"), equalTo(4)); - collector.checkThat("Wrong number of files", count("projects where qualifier in ('FIL')"), equalTo(4)); - collector.checkThat("Wrong number of unit test files", count("projects where qualifier in ('UTS')"), equalTo(0)); - - int measuresOnTrk = 45; - int measuresOnBrc = 222; - int measuresOnDir = 141; - int measuresOnFil = 69; - - // count measures - assertMeasuresCountForQualifier("TRK", measuresOnTrk); - assertMeasuresCountForQualifier("BRC", measuresOnBrc); - assertMeasuresCountForQualifier("DIR", measuresOnDir); - assertMeasuresCountForQualifier("FIL", measuresOnFil); - - // No new_* metrics measure should be recorded the first time - collector.checkThat( - "Wrong number of measure of new_ metrics", - count("project_measures, metrics where metrics.id = project_measures.metric_id and metrics.name like 'new_%'"), - equalTo(0)); - - int expectedMeasures = measuresOnTrk + measuresOnBrc + measuresOnDir + measuresOnFil; - collector.checkThat("Wrong number of measures", count("project_measures"), equalTo(expectedMeasures)); - collector.checkThat("Wrong number of measure data", count("project_measures where measure_data is not null"), equalTo(0)); - - // count other tables that are constant between 2 scans - int expectedIssues = 52; - - collector.checkThat("Wrong number of issues", count("issues"), equalTo(expectedIssues)); - - // must be a different date, else a single snapshot is kept per day - scan(PROJECT_SAMPLE_PATH, DateFormatUtils.ISO_DATE_FORMAT.format(today)); - - int newMeasuresOnTrk = 58; - int newMeasuresOnBrc = 304; - int newMeasuresOnDir = 56; - int newMeasuresOnFil = 0; - - assertMeasuresCountForQualifier("TRK", measuresOnTrk + newMeasuresOnTrk); - assertMeasuresCountForQualifier("BRC", measuresOnBrc + newMeasuresOnBrc); - assertMeasuresCountForQualifier("DIR", measuresOnDir + newMeasuresOnDir); - assertMeasuresCountForQualifier("FIL", measuresOnFil + newMeasuresOnFil); - - // Measures on new_* metrics should be recorded - collector.checkThat( - "Wrong number of measure of new_ metrics", - count("project_measures, metrics where metrics.id = project_measures.metric_id and metrics.name like 'new_%'"), - equalTo(154)); - - // added measures relate to project and new_* metrics - expectedMeasures += newMeasuresOnTrk + newMeasuresOnBrc + newMeasuresOnDir + newMeasuresOnFil; - collector.checkThat("Wrong number of measures after second analysis", count("project_measures"), equalTo(expectedMeasures)); - collector.checkThat("Wrong number of measure data", count("project_measures where measure_data is not null"), equalTo(0)); - collector.checkThat("Wrong number of issues", count("issues"), equalTo(expectedIssues)); - } - - /** - * SONAR-3378 - */ - @Test - public void should_keep_all_snapshots_the_first_day() { - // analyse once - scan(PROJECT_SAMPLE_PATH); - // analyse twice - scan(PROJECT_SAMPLE_PATH); - // and check we have 2 snapshots - assertThat(count("snapshots s where s.component_uuid=(select p.uuid from projects p where p.kee='com.sonarsource.it.samples:multi-modules-sample')")).isEqualTo(2); - } - - /** - * SONAR-2807 & SONAR-3378 & SONAR-4710 - */ - @Test - public void should_keep_only_one_snapshot_per_day() { - scan(PROJECT_SAMPLE_PATH); - - int snapshotsCount = count("snapshots"); - int measuresCount = count("project_measures"); - // Using the "sonar.dbcleaner.hoursBeforeKeepingOnlyOneSnapshotByDay" property set to '0' is the way - // to keep only 1 snapshot per day - setServerProperty(orchestrator, "sonar.dbcleaner.hoursBeforeKeepingOnlyOneSnapshotByDay", "0"); - scan(PROJECT_SAMPLE_PATH); - assertThat(count("snapshots")).as("Different number of snapshots").isEqualTo(snapshotsCount); - - int measureOnNewMetrics = count("project_measures, metrics where metrics.id = project_measures.metric_id and metrics.name like 'new_%'"); - // Number of measures should be the same as previous, with the measures on new metrics - assertThat(count("project_measures")).as("Different number of measures").isEqualTo(measuresCount + measureOnNewMetrics); - } - - /** - * SONAR-7175 - */ - @Test - public void keep_latest_snapshot() { - // Keep all snapshots from last 4 weeks - setServerProperty(orchestrator, "sonar.dbcleaner.weeksBeforeKeepingOnlyOneSnapshotByWeek", "4"); - - Date oneWeekAgo = addDays(new Date(), -7); - - // Execute an analysis wednesday last week - Calendar lastWednesday = Calendar.getInstance(); - lastWednesday.setTime(oneWeekAgo); - lastWednesday.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY); - String lastWednesdayFormatted = formatDate(lastWednesday.getTime()); - runProjectAnalysis(orchestrator, PROJECT_SAMPLE_PATH, "sonar.projectDate", lastWednesdayFormatted); - - // Execute an analysis thursday last week - Calendar lastThursday = Calendar.getInstance(); - lastThursday.setTime(oneWeekAgo); - lastThursday.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY); - String lastThursdayFormatted = formatDate(lastThursday.getTime()); - runProjectAnalysis(orchestrator, PROJECT_SAMPLE_PATH, "sonar.projectDate", lastThursdayFormatted); - - // Now only keep 1 snapshot per week - setServerProperty(orchestrator, "sonar.dbcleaner.weeksBeforeKeepingOnlyOneSnapshotByWeek", "0"); - - // Execute an analysis today to execute the purge of previous weeks snapshots - runProjectAnalysis(orchestrator, PROJECT_SAMPLE_PATH); - - // Check that only analysis from last thursday is kept (as it's the last one from previous week) - WsMeasures.SearchHistoryResponse response = newAdminWsClient(orchestrator).measures().searchHistory(SearchHistoryRequest.builder() - .setComponent(PROJECT_KEY) - .setMetrics(singletonList("ncloc")) - .build()); - assertThat(response.getMeasuresCount()).isEqualTo(1); - assertThat(response.getMeasuresList().get(0).getHistoryList()).extracting(HistoryValue::getDate).doesNotContain(lastWednesdayFormatted, lastThursdayFormatted); - } - - /** - * SONAR-3120 - */ - @Test - public void should_delete_removed_modules() { - scan("dbCleaner/modules/before"); - assertExists("com.sonarsource.it.samples:multi-modules-sample:module_b"); - assertExists("com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1"); - - // we want the previous snapshot to be purged - setServerProperty(orchestrator, "sonar.dbcleaner.hoursBeforeKeepingOnlyOneSnapshotByDay", "0"); - - scan("dbCleaner/modules/after"); - assertDisabled("com.sonarsource.it.samples:multi-modules-sample:module_b"); - assertDisabled("com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1"); - assertExists("com.sonarsource.it.samples:multi-modules-sample:module_c:module_c1"); - } - - /** - * SONAR-3120 - */ - @Test - public void should_delete_removed_files() { - String fileKey = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo"; - scan("dbCleaner/files/before"); - assertExists(fileKey); - - scan("dbCleaner/files/after"); - assertDisabled(fileKey); - assertExists("com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/NewHelloA1.xoo"); - } - - /** - * SONAR-2754 - */ - @Test - public void should_delete_historical_data_of_directories_by_default() { - scan(PROJECT_SAMPLE_PATH, TWO_DAYS_AGO); - - int fileMeasures = count(COUNT_FILE_MEASURES); - int dirMeasures = count(COUNT_DIR_MEASURES); - - scan(PROJECT_SAMPLE_PATH, ONE_DAY_AGO); - - // second analysis with new_* metrics - assertThat(count(COUNT_FILE_MEASURES)).isLessThan(2 * fileMeasures); - assertThat(count(COUNT_DIR_MEASURES)).isLessThan(2 * dirMeasures); - } - - /** - * SONAR-2754 - */ - @Test - public void should_not_delete_historical_data_of_directories() { - scan(PROJECT_SAMPLE_PATH, TWO_DAYS_AGO); - - int fileMeasures = count(COUNT_FILE_MEASURES); - int dirMeasures = count(COUNT_DIR_MEASURES); - - setServerProperty(orchestrator, "sonar.dbcleaner.cleanDirectory", "false"); - - scan(PROJECT_SAMPLE_PATH, ONE_DAY_AGO); - - // second analysis as NEW_* metrics - assertThat(count(COUNT_FILE_MEASURES)).isLessThan(2 * fileMeasures); - assertThat(count(COUNT_DIR_MEASURES)).isGreaterThan(2 * dirMeasures); - } - - /** - * SONAR-2061 - */ - @Test - public void should_delete_historical_data_of_flagged_metrics() { - scan(PROJECT_SAMPLE_PATH, TWO_DAYS_AGO); - - // historical data of complexity_in_classes is supposed to be deleted (see CoreMetrics) - String selectNcloc = "project_measures where metric_id in (select id from metrics where name='ncloc')"; - String selectComplexityInClasses = "project_measures where metric_id in (select id from metrics where name='complexity_in_classes')"; - int nclocCount = count(selectNcloc); - int complexitInClassesCount = count(selectComplexityInClasses); - - scan(PROJECT_SAMPLE_PATH, ONE_DAY_AGO); - assertThat(count(selectNcloc)).isGreaterThan(nclocCount); - assertThat(count(selectComplexityInClasses)).isEqualTo(complexitInClassesCount); - } - - private void assertDisabled(String key) { - assertThat(enabledStatusOfComponent(key)).isFalse(); - } - - private void assertExists(String key) { - assertThat(enabledStatusOfComponent(key)).isTrue(); - } - - private Boolean enabledStatusOfComponent(String key) { - return orchestrator.getDatabase().executeSql("select enabled from projects p where p.kee='" + key + "'") - .stream() - .findFirst() - .map(PurgeTest::toBoolean) - .orElse(null); - } - - private static Boolean toBoolean(Map<String, String> s) { - String value = s.get("ENABLED"); - if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("t") || value.equals("1")) { - return true; - } - if (value.equalsIgnoreCase("false") || value.equalsIgnoreCase("f") || value.equals("0")) { - return false; - } - throw new IllegalArgumentException("Unsupported value can not be converted to boolean " + value); - } - - private BuildResult scan(String path, String date) { - return scan(path, "sonar.projectDate", date); - } - - private BuildResult scan(String path, String... extraProperties) { - SonarScanner runner = configureRunner(path, extraProperties); - return orchestrator.executeBuild(runner); - } - - private SonarScanner configureRunner(String projectPath, String... props) { - orchestrator.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "one-issue-per-line-profile"); - return SonarScanner.create(ItUtils.projectDir(projectPath)).setProperties(props); - } - - private int count(String condition) { - return orchestrator.getDatabase().countSql("select count(1) from " + condition); - } - - private void assertMeasuresCountForQualifier(String qualifier, int count) { - int result = countMeasures(qualifier); - if (result != count) { - logMeasures("GOT", qualifier); - } - collector.checkThat("Wrong number of measures for qualifier " + qualifier, result, equalTo(count)); - } - - private int countMeasures(String qualifier) { - String sql = "SELECT count(1) FROM project_measures pm, projects p, metrics m where p.uuid=pm.component_uuid and pm.metric_id=m.id and p.qualifier='" + qualifier + "'"; - return orchestrator.getDatabase().countSql(sql); - } - - private void logMeasures(String title, String qualifier) { - String sql = "SELECT m.name as metricName, pm.value as value, pm.text_value as textValue, pm.variation_value_1, pm.variation_value_2, pm.variation_value_3 " - + - "FROM project_measures pm, projects p, metrics m " + - "WHERE pm.component_uuid=p.uuid and pm.metric_id=m.id and p.qualifier='" - + qualifier + "'"; - List<Map<String, String>> rows = orchestrator.getDatabase().executeSql(sql); - - System.out.println("---- " + title + " - measures on qualifier " + qualifier); - for (Map<String, String> row : rows) { - System.out.println(" " + row); - } - } - -} diff --git a/it/it-tests/src/test/java/it/duplication/CrossModuleDuplicationsTest.java b/it/it-tests/src/test/java/it/duplication/CrossModuleDuplicationsTest.java deleted file mode 100644 index b88e5d64982..00000000000 --- a/it/it-tests/src/test/java/it/duplication/CrossModuleDuplicationsTest.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.duplication; - -import com.google.common.collect.ImmutableMap; -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import java.io.File; -import java.io.IOException; -import java.util.Map; -import org.apache.commons.io.FileUtils; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; - -public class CrossModuleDuplicationsTest { - private static final String PROJECT_KEY = "cross-module"; - private static final String PROJECT_DIR = "duplications/" + PROJECT_KEY; - private File projectDir; - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @BeforeClass - public static void analyzeProjects() { - - } - - @Before - public void setUpProject() throws IOException { - orchestrator.resetData(); - ItUtils.restoreProfile(orchestrator, getClass().getResource("/duplication/xoo-duplication-profile.xml")); - - FileUtils.copyDirectory(ItUtils.projectDir(PROJECT_DIR), temp.getRoot()); - projectDir = temp.getRoot(); - } - - @Test - public void testDuplications() throws IOException { - analyzeProject(projectDir, PROJECT_KEY, true); - verifyDuplicationMeasures(PROJECT_KEY, 2, 54, 2, 56.3); - - // File1 is the one duplicated in both modules - verifyDuplicationMeasures(PROJECT_KEY + ":module1:src/main/xoo/sample/File1.xoo", 1, 27, 1, 75); - verifyDuplicationMeasures(PROJECT_KEY + ":module2:src/main/xoo/sample/File1.xoo", 1, 27, 1, 75); - } - - @Test - // SONAR-6184 - public void testGhostDuplication() throws IOException { - analyzeProject(projectDir, PROJECT_KEY, true); - - verifyDuplicationMeasures(PROJECT_KEY + ":module1", 1, 27, 1, 45); - verifyDuplicationMeasures(PROJECT_KEY + ":module2", 1, 27, 1, 75); - - // move File2 from module1 to module2 - File src = FileUtils.getFile(projectDir, "module1", "src", "main", "xoo", "sample", "File2.xoo"); - File dst = FileUtils.getFile(projectDir, "module2", "src", "main", "xoo", "sample", "File2.xoo"); - FileUtils.moveFile(src, dst); - - src = new File(src.getParentFile(), "File2.xoo.measures"); - dst = new File(dst.getParentFile(), "File2.xoo.measures"); - FileUtils.moveFile(src, dst); - - // duplication should remain unchanged (except for % of duplication) - analyzeProject(projectDir, PROJECT_KEY, false); - verifyDuplicationMeasures(PROJECT_KEY + ":module1", 1, 27, 1, 75); - verifyDuplicationMeasures(PROJECT_KEY + ":module2", 1, 27, 1, 45); - } - - @Test - // SONAR-6184 - public void testDuplicationFix() throws IOException { - analyzeProject(projectDir, PROJECT_KEY, true); - - verifyDuplicationMeasures(PROJECT_KEY + ":module1", 1, 27, 1, 45); - verifyDuplicationMeasures(PROJECT_KEY + ":module2", 1, 27, 1, 75); - - // remove File1 from module1 - File f1 = FileUtils.getFile(projectDir, "module1", "src", "main", "xoo", "sample", "File1.xoo"); - File f1m = FileUtils.getFile(projectDir, "module2", "src", "main", "xoo", "sample", "File1.xoo.measures"); - f1.delete(); - f1m.delete(); - - // duplication should be 0 - analyzeProject(projectDir, PROJECT_KEY, false); - verifyDuplicationMeasures(PROJECT_KEY + ":module1", 0, 0, 0, 0); - verifyDuplicationMeasures(PROJECT_KEY + ":module2", 0, 0, 0, 0); - } - - private static SonarScanner analyzeProject(File projectDir, String projectKey, boolean create, String... additionalProperties) { - if (create) { - orchestrator.getServer().provisionProject(projectKey, projectKey); - orchestrator.getServer().associateProjectToQualityProfile(projectKey, "xoo", "xoo-duplication-profile"); - } - - SonarScanner sonarRunner = SonarScanner.create(projectDir); - ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); - - for (int i = 0; i < additionalProperties.length; i += 2) { - builder.put(additionalProperties[i], additionalProperties[i + 1]); - } - SonarScanner scan = sonarRunner.setDebugLogs(true).setProperties(builder.build()); - orchestrator.executeBuild(scan); - return scan; - } - - private static void verifyDuplicationMeasures(String componentKey, int duplicatedBlocks, int duplicatedLines, int duplicatedFiles, double duplicatedLinesDensity) { - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(orchestrator, componentKey, "duplicated_lines", "duplicated_blocks", "duplicated_files", "duplicated_lines_density"); - assertThat(measures.get("duplicated_blocks").intValue()).isEqualTo(duplicatedBlocks); - assertThat(measures.get("duplicated_lines").intValue()).isEqualTo(duplicatedLines); - assertThat(measures.get("duplicated_files").intValue()).isEqualTo(duplicatedFiles); - assertThat(measures.get("duplicated_lines_density")).isEqualTo(duplicatedLinesDensity); - } -} diff --git a/it/it-tests/src/test/java/it/duplication/CrossProjectDuplicationsOnRemoveFileTest.java b/it/it-tests/src/test/java/it/duplication/CrossProjectDuplicationsOnRemoveFileTest.java deleted file mode 100644 index f43cdeda5cb..00000000000 --- a/it/it-tests/src/test/java/it/duplication/CrossProjectDuplicationsOnRemoveFileTest.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.duplication; - -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import org.apache.commons.io.IOUtils; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.skyscreamer.jsonassert.JSONAssert.assertEquals; -import static util.ItUtils.getComponent; -import static util.ItUtils.runProjectAnalysis; -import static util.selenium.Selenese.runSelenese; - -public class CrossProjectDuplicationsOnRemoveFileTest { - - static final String ORIGIN_PROJECT = "origin-project"; - static final String DUPLICATE_PROJECT = "duplicate-project"; - static final String DUPLICATE_FILE = DUPLICATE_PROJECT + ":src/main/xoo/sample/File1.xoo"; - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @BeforeClass - public static void analyzeProjects() { - orchestrator.resetData(); - ItUtils.restoreProfile(orchestrator, CrossProjectDuplicationsOnRemoveFileTest.class.getResource("/duplication/xoo-duplication-profile.xml")); - - analyzeProject(ORIGIN_PROJECT, "duplications/cross-project/origin"); - analyzeProject(DUPLICATE_PROJECT, "duplications/cross-project/duplicate"); - - // Remove origin project - orchestrator.getServer().adminWsClient().post("api/projects/bulk_delete", "keys", ORIGIN_PROJECT); - assertThat(getComponent(orchestrator, ORIGIN_PROJECT)).isNull(); - } - - @Test - public void duplications_show_ws_does_not_contain_key_of_deleted_file() throws Exception { - String duplication = orchestrator.getServer().adminWsClient().get("api/duplications/show", "key", DUPLICATE_FILE); - - assertEquals(IOUtils.toString(CrossProjectDuplicationsTest.class.getResourceAsStream( - "/duplication/CrossProjectDuplicationsOnRemoveFileTest/duplications_on_removed_file-expected.json"), "UTF-8"), - duplication, false); - - // Only one file should be reference, so the reference 2 on origin-project must not exist - assertThat(duplication).doesNotContain("\"2\""); - assertThat(duplication).doesNotContain("origin-project"); - } - - /** - * SONAR-3277 - */ - @Test - public void display_message_in_viewer_when_duplications_with_deleted_files_are_found() throws Exception { - // TODO stas, please replace this IT by a medium test - runSelenese(orchestrator, - "/duplication/CrossProjectDuplicationsOnRemoveFileTest/duplications-with-deleted-project.html"); - } - - private static void analyzeProject(String projectKey, String path) { - orchestrator.getServer().provisionProject(projectKey, projectKey); - orchestrator.getServer().associateProjectToQualityProfile(projectKey, "xoo", "xoo-duplication-profile"); - - runProjectAnalysis(orchestrator, path, - "sonar.cpd.cross_project", "true", - "sonar.projectKey", projectKey, - "sonar.projectName", projectKey); - } - -} diff --git a/it/it-tests/src/test/java/it/duplication/CrossProjectDuplicationsTest.java b/it/it-tests/src/test/java/it/duplication/CrossProjectDuplicationsTest.java deleted file mode 100644 index 9e9529cba7a..00000000000 --- a/it/it-tests/src/test/java/it/duplication/CrossProjectDuplicationsTest.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.duplication; - -import com.google.common.collect.ObjectArrays; -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import java.util.Map; -import org.apache.commons.io.IOUtils; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.issue.SearchWsRequest; -import util.ItUtils; -import util.issue.IssueRule; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.skyscreamer.jsonassert.JSONAssert.assertEquals; -import static util.ItUtils.getMeasureAsDouble; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.runProjectAnalysis; -import static util.ItUtils.setServerProperty; -import static util.selenium.Selenese.runSelenese; - -public class CrossProjectDuplicationsTest { - - static final String ORIGIN_PROJECT = "origin-project"; - static final String DUPLICATE_PROJECT = "duplicate-project"; - static final String PROJECT_WITH_EXCLUSION = "project-with-exclusion"; - static final String PROJECT_WITHOUT_ENOUGH_TOKENS = "project_without_enough_tokens"; - - static final String DUPLICATE_FILE = DUPLICATE_PROJECT + ":src/main/xoo/sample/File1.xoo"; - static final String BRANCH = "with-branch"; - - static final String ORIGIN_PATH = "duplications/cross-project/origin"; - static final String DUPLICATE_PATH = "duplications/cross-project/duplicate"; - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @ClassRule - public static final IssueRule issueRule = IssueRule.from(orchestrator); - - @BeforeClass - public static void analyzeProjects() { - orchestrator.resetData(); - ItUtils.restoreProfile(orchestrator, CrossProjectDuplicationsTest.class.getResource("/duplication/xoo-duplication-profile.xml")); - - analyzeProject(ORIGIN_PROJECT, ORIGIN_PATH); - analyzeProject(DUPLICATE_PROJECT, DUPLICATE_PATH); - analyzeProjectWithBranch(DUPLICATE_PROJECT, DUPLICATE_PATH, BRANCH); - analyzeProject(PROJECT_WITH_EXCLUSION, DUPLICATE_PATH, "sonar.cpd.exclusions", "**/File*"); - - // Set minimum tokens to a big value in order to not get duplications - setServerProperty(orchestrator, "sonar.cpd.xoo.minimumTokens", "1000"); - analyzeProject(PROJECT_WITHOUT_ENOUGH_TOKENS, DUPLICATE_PATH); - } - - @AfterClass - public static void resetServerProperties() throws Exception { - setServerProperty(orchestrator, "sonar.cpd.xoo.minimumTokens", null); - } - - @Test - public void origin_project_has_no_duplication_as_it_has_not_been_analyzed_twice() throws Exception { - assertProjectHasNoDuplication(ORIGIN_PROJECT); - } - - @Test - public void duplicate_project_has_duplication_as_it_has_been_analyzed_twice() throws Exception { - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(orchestrator, DUPLICATE_PROJECT, "duplicated_lines", "duplicated_blocks", "duplicated_files", "duplicated_lines_density"); - assertThat(measures.get("duplicated_lines").intValue()).isEqualTo(27); - assertThat(measures.get("duplicated_blocks").intValue()).isEqualTo(1); - assertThat(measures.get("duplicated_files").intValue()).isEqualTo(1); - assertThat(measures.get("duplicated_lines_density")).isEqualTo(45d); - } - - @Test - public void issue_on_duplicated_blocks_is_generated_on_file() throws Exception { - assertThat(issueRule.search(new SearchWsRequest().setComponentKeys(singletonList(DUPLICATE_FILE)).setRules(singletonList("common-xoo:DuplicatedBlocks"))).getIssuesList()) - .hasSize(1); - } - - @Test - public void verify_sources_lines_ws_duplication_information() throws Exception { - verifyWsResultOnDuplicateFile("api/sources/lines", "sources_lines_duplication-expected.json"); - } - - @Test - public void verify_duplications_show_ws() throws Exception { - verifyWsResultOnDuplicateFile("api/duplications/show", "duplications_show-expected.json"); - } - - @Test - public void project_with_branch_has_no_duplication() throws Exception { - assertProjectHasNoDuplication(DUPLICATE_PROJECT + ":" + BRANCH); - } - - @Test - public void project_with_exclusion_has_no_duplication() throws Exception { - assertProjectHasNoDuplication(PROJECT_WITH_EXCLUSION); - } - - @Test - public void project_without_enough_tokens_has_duplication() throws Exception { - assertProjectHasNoDuplication(PROJECT_WITHOUT_ENOUGH_TOKENS); - } - - @Test - public void verify_viewer() { - runSelenese(orchestrator, "/duplication/CrossProjectDuplicationsTest/cross-project-duplications-viewer.html"); - } - - private static void analyzeProject(String projectKey, String path, String... additionalProperties) { - initProject(projectKey); - executeAnalysis(projectKey, path, additionalProperties); - } - - private static void analyzeProjectWithBranch(String projectKey, String path, String branch) { - initProject(projectKey + ":" + branch); - executeAnalysis(projectKey, path, "sonar.branch", branch); - } - - private static void initProject(String effectiveProjectKey) { - orchestrator.getServer().provisionProject(effectiveProjectKey, effectiveProjectKey); - orchestrator.getServer().associateProjectToQualityProfile(effectiveProjectKey, "xoo", "xoo-duplication-profile"); - } - - private static void executeAnalysis(String projectKey, String path, String... additionalProperties) { - runProjectAnalysis(orchestrator, path, - ObjectArrays.concat( - new String[] { - "sonar.cpd.cross_project", "true", - "sonar.projectKey", projectKey, - "sonar.projectName", projectKey - }, - additionalProperties, String.class)); - } - - private static void assertProjectHasNoDuplication(String projectKey) { - assertThat(getMeasureAsDouble(orchestrator, projectKey, "duplicated_lines")).isZero(); - } - - private static void verifyWsResultOnDuplicateFile(String ws, String expectedFilePath) throws Exception { - String duplication = newAdminWsClient(orchestrator).wsConnector().call(new GetRequest(ws).setParam("key", DUPLICATE_FILE)).content(); - assertEquals(IOUtils.toString(CrossProjectDuplicationsTest.class.getResourceAsStream("/duplication/CrossProjectDuplicationsTest/" + expectedFilePath), "UTF-8"), duplication, - false); - } - -} diff --git a/it/it-tests/src/test/java/it/duplication/DuplicationsTest.java b/it/it-tests/src/test/java/it/duplication/DuplicationsTest.java deleted file mode 100644 index 6eddcee5915..00000000000 --- a/it/it-tests/src/test/java/it/duplication/DuplicationsTest.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.duplication; - -import com.google.common.collect.ObjectArrays; -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import java.util.Map; -import org.apache.commons.io.IOUtils; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.WsResponse; -import org.sonarqube.ws.client.issue.SearchWsRequest; -import util.ItUtils; -import util.issue.IssueRule; - -import static java.net.HttpURLConnection.HTTP_BAD_REQUEST; -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.skyscreamer.jsonassert.JSONAssert.assertEquals; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.runProjectAnalysis; -import static util.ItUtils.setServerProperty; - -public class DuplicationsTest { - - static final String DUPLICATIONS = "file-duplications"; - static final String DUPLICATIONS_WITH_EXCLUSIONS = "file-duplications-with-exclusions"; - static final String WITHOUT_ENOUGH_TOKENS = "project_without_enough_tokens"; - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @ClassRule - public static final IssueRule issueRule = IssueRule.from(orchestrator); - - private static WsClient adminWsClient; - - @BeforeClass - public static void analyzeProjects() { - orchestrator.resetData(); - - ItUtils.restoreProfile(orchestrator, DuplicationsTest.class.getResource("/duplication/xoo-duplication-profile.xml")); - analyzeProject(DUPLICATIONS); - analyzeProject(DUPLICATIONS_WITH_EXCLUSIONS, "sonar.cpd.exclusions", "**/File*"); - - // Set minimum tokens to a big value in order to not get duplications - setServerProperty(orchestrator, "sonar.cpd.xoo.minimumTokens", "1000"); - analyzeProject(WITHOUT_ENOUGH_TOKENS); - - adminWsClient = newAdminWsClient(orchestrator); - } - - @AfterClass - public static void resetProperties() throws Exception { - setServerProperty(orchestrator, "sonar.cpd.xoo.minimumTokens", null); - } - - private static Map<String, Double> getMeasures(String key) { - return getMeasuresAsDoubleByMetricKey(orchestrator, key, "duplicated_lines", "duplicated_blocks", "duplicated_files", "duplicated_lines_density"); - } - - private static void verifyDuplicationMeasures(String componentKey, int duplicatedBlocks, int duplicatedLines, int duplicatedFiles, double duplicatedLinesDensity) { - Map<String, Double> measures = getMeasures(componentKey); - assertThat(measures.get("duplicated_blocks").intValue()).isEqualTo(duplicatedBlocks); - assertThat(measures.get("duplicated_lines").intValue()).isEqualTo(duplicatedLines); - assertThat(measures.get("duplicated_files").intValue()).isEqualTo(duplicatedFiles); - assertThat(measures.get("duplicated_lines_density")).isEqualTo(duplicatedLinesDensity); - } - - private static void analyzeProject(String projectKey, String... additionalProperties) { - orchestrator.getServer().provisionProject(projectKey, projectKey); - orchestrator.getServer().associateProjectToQualityProfile(projectKey, "xoo", "xoo-duplication-profile"); - - runProjectAnalysis(orchestrator, "duplications/file-duplications", - ObjectArrays.concat( - new String[] { - "sonar.projectKey", projectKey, - "sonar.projectName", projectKey - }, - additionalProperties, String.class)); - } - - private static void verifyWsResultOnDuplicateFile(String fileKey, String ws, String expectedFilePath) throws Exception { - String duplication = orchestrator.getServer().adminWsClient().get(ws, "key", fileKey); - assertEquals(IOUtils.toString(CrossProjectDuplicationsTest.class.getResourceAsStream("/duplication/DuplicationsTest/" + expectedFilePath), "UTF-8"), duplication, - false); - } - - @Test - public void duplicated_lines_within_same_file() { - verifyDuplicationMeasures(DUPLICATIONS + ":src/main/xoo/duplicated_lines_within_same_file/DuplicatedLinesInSameFile.xoo", - 2, - 30 * 2, // 2 blocks with 30 lines - 1, - 84.5); - } - - @Test - public void duplicated_same_lines_within_3_classes() { - verifyDuplicationMeasures(DUPLICATIONS + ":src/main/xoo/duplicated_same_lines_within_3_files/File1.xoo", 1, 33, 1, 78.6); - verifyDuplicationMeasures(DUPLICATIONS + ":src/main/xoo/duplicated_same_lines_within_3_files/File2.xoo", 1, 31, 1, 75.6); - verifyDuplicationMeasures(DUPLICATIONS + ":src/main/xoo/duplicated_same_lines_within_3_files/File3.xoo", 1, 31, 1, 70.5); - verifyDuplicationMeasures(DUPLICATIONS + ":src/main/xoo/duplicated_same_lines_within_3_files", 3, 95, 3, 74.8); - } - - @Test - public void duplicated_lines_within_directory() { - verifyDuplicationMeasures(DUPLICATIONS + ":src/main/xoo/duplicated_lines_within_dir/DuplicatedLinesInSameDirectory1.xoo", 1, 30, 1, 28.3); - verifyDuplicationMeasures(DUPLICATIONS + ":src/main/xoo/duplicated_lines_within_dir/DuplicatedLinesInSameDirectory2.xoo", 1, 30, 1, 41.7); - verifyDuplicationMeasures(DUPLICATIONS + ":src/main/xoo/duplicated_lines_within_dir", 2, 60, 2, 33.7); - } - - @Test - public void duplicated_lines_with_other_directory() { - verifyDuplicationMeasures(DUPLICATIONS + ":src/main/xoo/duplicated_lines_with_other_dir1/DuplicatedLinesWithOtherDirectory.xoo", 1, 39, 1, 92.9); - verifyDuplicationMeasures(DUPLICATIONS + ":src/main/xoo/duplicated_lines_with_other_dir1", 1, 39, 1, 92.9); - - verifyDuplicationMeasures(DUPLICATIONS + ":src/main/xoo/duplicated_lines_with_other_dir2/DuplicatedLinesWithOtherDirectory.xoo", 1, 39, 1, 92.9); - verifyDuplicationMeasures(DUPLICATIONS + ":src/main/xoo/duplicated_lines_with_other_dir2", 1, 39, 1, 92.9); - } - - @Test - public void duplication_measures_on_project() { - verifyDuplicationMeasures(DUPLICATIONS, 9, 293, 8, 63.7); - } - - @Test - public void project_without_enough_tokens_has_duplication() { - verifyDuplicationMeasures(WITHOUT_ENOUGH_TOKENS, 0, 0, 0, 0d); - } - - /** - * SONAR-3108 - */ - @Test - public void use_duplication_exclusions() { - verifyDuplicationMeasures(DUPLICATIONS_WITH_EXCLUSIONS, 6, 198, 5, 43d); - } - - @Test - public void issues_on_duplicated_blocks_are_generated_on_each_file() throws Exception { - assertThat(issueRule.search(new SearchWsRequest().setRules(singletonList("common-xoo:DuplicatedBlocks"))).getIssuesList()).hasSize(13); - } - - @Test - public void verify_sources_lines_ws_duplication_information() throws Exception { - verifyWsResultOnDuplicateFile(DUPLICATIONS + ":src/main/xoo/duplicated_lines_within_same_file/DuplicatedLinesInSameFile.xoo", - "api/sources/lines", "sources_lines_duplication-expected.json"); - } - - @Test - public void verify_duplications_show_ws() throws Exception { - verifyWsResultOnDuplicateFile(DUPLICATIONS + ":src/main/xoo/duplicated_lines_within_same_file/DuplicatedLinesInSameFile.xoo", - "api/duplications/show", "duplications_show-expected.json"); - } - - // SONAR-9441 - @Test - public void fail_properly_when_no_parameter() { - WsResponse result = adminWsClient.wsConnector().call(new GetRequest("api/duplications/show")); - - assertThat(result.code()).isEqualTo(HTTP_BAD_REQUEST); - assertThat(result.content()).contains("Either 'uuid' or 'key' must be provided, not both"); - } - -} diff --git a/it/it-tests/src/test/java/it/duplication/NewDuplicationsTest.java b/it/it-tests/src/test/java/it/duplication/NewDuplicationsTest.java deleted file mode 100644 index e3dfa701dc4..00000000000 --- a/it/it-tests/src/test/java/it/duplication/NewDuplicationsTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.duplication; - -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import java.util.Map; -import org.assertj.core.data.Offset; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.WsMeasures; - -import static java.lang.Double.parseDouble; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasuresWithVariationsByMetricKey; -import static util.ItUtils.runProjectAnalysis; - -public class NewDuplicationsTest { - - static final Offset<Double> DEFAULT_OFFSET = Offset.offset(0.1d); - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @BeforeClass - public static void analyzeProjects() { - orchestrator.resetData(); - - runProjectAnalysis(orchestrator, "duplications/new-duplications-v1", - "sonar.projectDate", "2015-02-01", - "sonar.scm.disabled", "false"); - runProjectAnalysis(orchestrator, "duplications/new-duplications-v2", - "sonar.scm.disabled", "false"); - } - - @Test - public void new_duplications_on_project() throws Exception { - Map<String, WsMeasures.Measure> measures = getMeasures("new-duplications"); - assertThat(parseDouble(measures.get("new_lines").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(83d, DEFAULT_OFFSET); - assertThat(parseDouble(measures.get("new_duplicated_lines").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(71d, DEFAULT_OFFSET); - assertThat(parseDouble(measures.get("new_duplicated_lines_density").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(85.5d, DEFAULT_OFFSET); - assertThat(parseDouble(measures.get("new_duplicated_blocks").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(12d, DEFAULT_OFFSET); - } - - @Test - public void new_duplications_on_directory() throws Exception { - Map<String, WsMeasures.Measure> measures = getMeasures("new-duplications:src/main/xoo/duplicated_lines_with_other_dir1"); - assertThat(parseDouble(measures.get("new_lines").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(24d, DEFAULT_OFFSET); - assertThat(parseDouble(measures.get("new_duplicated_lines").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(24d, DEFAULT_OFFSET); - assertThat(parseDouble(measures.get("new_duplicated_lines_density").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(100d, DEFAULT_OFFSET); - assertThat(parseDouble(measures.get("new_duplicated_blocks").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(7d, DEFAULT_OFFSET); - } - - @Test - public void new_duplications_on_file() throws Exception { - Map<String, WsMeasures.Measure> measures = getMeasures("new-duplications:src/main/xoo/duplicated_lines_within_same_file/DuplicatedLinesInSameFile.xoo"); - assertThat(parseDouble(measures.get("new_lines").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(41d, DEFAULT_OFFSET); - assertThat(parseDouble(measures.get("new_duplicated_lines").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(29d, DEFAULT_OFFSET); - assertThat(parseDouble(measures.get("new_duplicated_lines_density").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(70.7d, DEFAULT_OFFSET); - assertThat(parseDouble(measures.get("new_duplicated_blocks").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(2d, DEFAULT_OFFSET); - } - - private static Map<String, WsMeasures.Measure> getMeasures(String key) { - return getMeasuresWithVariationsByMetricKey(orchestrator, key, "new_lines", "new_duplicated_lines", "new_duplicated_lines_density", "new_duplicated_blocks"); - } -} diff --git a/it/it-tests/src/test/java/it/i18n/I18nTest.java b/it/it-tests/src/test/java/it/i18n/I18nTest.java deleted file mode 100644 index fad347688f5..00000000000 --- a/it/it-tests/src/test/java/it/i18n/I18nTest.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.i18n; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Ignore; -import org.junit.Test; - -import static util.ItUtils.projectDir; -import static util.selenium.Selenese.runSelenese; - -public class I18nTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Before - public void cleanDatabase() { - orchestrator.resetData(); - } - - /** - * TODO This test should use a fake widget that display a fake metric with decimals instead of using provided metric - * Ignored because there is not a good idea to force a display language by GET parameter - * The displayed language is based on browser/system locale - */ - @Test - @Ignore - public void test_localization() { - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - - runSelenese(orchestrator, - "/i18n/default-locale-is-english.html", - "/i18n/french-locale.html", - "/i18n/french-pack.html", - "/i18n/locale-with-france-country.html", - "/i18n/locale-with-swiss-country.html"); - } - -} diff --git a/it/it-tests/src/test/java/it/issue/AbstractIssueTest.java b/it/it-tests/src/test/java/it/issue/AbstractIssueTest.java deleted file mode 100644 index 55ddc987572..00000000000 --- a/it/it-tests/src/test/java/it/issue/AbstractIssueTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import com.sonar.orchestrator.Orchestrator; -import it.Category2Suite; -import java.util.List; -import org.junit.ClassRule; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueClient; -import org.sonar.wsclient.issue.IssueQuery; -import org.sonar.wsclient.issue.Issues; - -import static org.assertj.core.api.Assertions.assertThat; - -public abstract class AbstractIssueTest { - - @ClassRule - public static final Orchestrator ORCHESTRATOR = Category2Suite.ORCHESTRATOR; - - static IssueClient adminIssueClient() { - return ORCHESTRATOR.getServer().adminWsClient().issueClient(); - } - - static IssueClient issueClient() { - return ORCHESTRATOR.getServer().wsClient().issueClient(); - } - - static Issue searchRandomIssue() { - List<Issue> issues = searchIssues(IssueQuery.create()); - assertThat(issues).isNotEmpty(); - return issues.get(0); - } - - static Issues search(IssueQuery issueQuery) { - issueQuery.urlParams().put("additionalFields", "_all"); - return issueClient().find(issueQuery); - } - - static List<Issue> searchIssues() { - return searchIssues(IssueQuery.create()); - } - - static List<Issue> searchIssues(IssueQuery issueQuery) { - return issueClient().find(issueQuery).list(); - } - - static List<Issue> searchIssuesByProject(String projectKey) { - return search(IssueQuery.create().componentRoots(projectKey)).list(); - } -} diff --git a/it/it-tests/src/test/java/it/issue/AutoAssignTest.java b/it/it-tests/src/test/java/it/issue/AutoAssignTest.java deleted file mode 100644 index 6110c02f245..00000000000 --- a/it/it-tests/src/test/java/it/issue/AutoAssignTest.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.util.Arrays; -import java.util.List; -import javax.annotation.Nullable; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueQuery; -import org.sonarqube.ws.WsUsers; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.user.CreateRequest; -import org.sonarqube.ws.client.user.SearchRequest; -import util.ProjectAnalysis; -import util.ProjectAnalysisRule; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.setServerProperty; - -public class AutoAssignTest extends AbstractIssueTest { - - @Rule - public final ProjectAnalysisRule projectAnalysisRule = ProjectAnalysisRule.from(ORCHESTRATOR); - - ProjectAnalysis projectAnalysis; - - @Before - public void setup() { - String qualityProfileKey = projectAnalysisRule.registerProfile("/issue/IssueActionTest/xoo-one-issue-per-line-profile.xml"); - String projectKey = projectAnalysisRule.registerProject("issue/AutoAssignTest"); - projectAnalysis = projectAnalysisRule.newProjectAnalysis(projectKey) - .withQualityProfile(qualityProfileKey) - .withProperties("sonar.scm.disabled", "false", "sonar.scm.provider", "xoo"); - } - - @After - public void resetData() throws Exception { - newAdminWsClient(ORCHESTRATOR).wsConnector().call(new PostRequest("api/projects/delete").setParam("project", "AutoAssignTest")); - deleteAllUsers(); - - // Reset default assignee - setServerProperty(ORCHESTRATOR, "sonar.issues.defaultAssigneeLogin", null); - } - - @Test - public void auto_assign_issues_to_user() throws Exception { - // verify that login matches, case-sensitive - createUser("user1", "User 1", "user1@email.com"); - createUser("USER2", "User 2", "user2@email.com"); - // verify that name is not used to match, whatever the case - createUser("user3", "User 3", "user3@email.com"); - createUser("user4", "USER 4", "user4@email.com"); - // verify that email matches, case-insensitive - createUser("user5", "User 5", "user5@email.com"); - createUser("user6", "User 6", "USER6@email.COM"); - // verify that SCM account matches, case-insensitive - createUser("user7", "User 7", "user7@email.com", "user7ScmAccount"); - createUser("user8", "User 8", "user8@email.com", "user8SCMaccOUNT"); - - projectAnalysis.run(); - - List<Issue> issues = search(IssueQuery.create().components("AutoAssignTest:src/sample.xoo").sort("FILE_LINE")).list(); - // login match, case-sensitive - verifyIssueAssignee(issues, 1, "user1"); - verifyIssueAssignee(issues, 2, null); - // user name is not used to match - verifyIssueAssignee(issues, 3, null); - verifyIssueAssignee(issues, 4, null); - // email match, case-insensitive - verifyIssueAssignee(issues, 5, "user5"); - verifyIssueAssignee(issues, 6, "user6"); - // SCM account match, case-insensitive - verifyIssueAssignee(issues, 7, "user7"); - verifyIssueAssignee(issues, 8, "user8"); - } - - private static void verifyIssueAssignee(List<Issue> issues, int line, @Nullable String expectedAssignee) { - assertThat(issues.get(line - 1).assignee()).isEqualTo(expectedAssignee); - } - - @Test - public void auto_assign_issues_to_default_assignee() throws Exception { - createUser("user1", "User 1", "user1@email.com"); - createUser("user2", "User 2", "user2@email.com"); - setServerProperty(ORCHESTRATOR, "sonar.issues.defaultAssigneeLogin", "user2"); - projectAnalysis.run(); - - // user1 is assigned to his issues. All other issues are assigned to the default assignee. - assertThat(search(IssueQuery.create().assignees("user1")).list()).hasSize(1); - assertThat(search(IssueQuery.create().assignees("user2")).list()).hasSize(8); - // No unassigned issues - assertThat(search(IssueQuery.create().assigned(false)).list()).isEmpty(); - } - - /** - * SONAR-7098 - * - * Given two versions of same project: - * v1: issue, but no SCM data - * v2: old issue and SCM data - * Expected: all issues should be associated with authors - */ - @Test - public void update_author_and_assignee_when_scm_is_activated() { - createUser("user1", "User 1", "user1@email.com"); - - // Run a first analysis without SCM - projectAnalysis.withProperties("sonar.scm.disabled", "true").run(); - List<Issue> issues = searchIssues(); - assertThat(issues).isNotEmpty(); - - // No author and assignee are set - for (Issue issue : issues) { - assertThat(issue.author()).isEmpty(); - } - assertThat(search(IssueQuery.create().assigned(true)).list()).isEmpty(); - - // Run a second analysis with SCM - projectAnalysis.run(); - issues = searchIssues(); - assertThat(issues).isNotEmpty(); - - // Authors and assignees are set - for (Issue issue : issues) { - assertThat(issue.author()).isNotEmpty(); - } - assertThat(search(IssueQuery.create().assignees("user1")).list()).hasSize(1); - } - - private static void createUser(String login, String name, String email, String... scmAccounts) { - newAdminWsClient(ORCHESTRATOR).users().create( - CreateRequest.builder() - .setLogin(login) - .setName(name) - .setEmail(email) - .setPassword("xxxxxxx") - .setScmAccounts(Arrays.asList(scmAccounts)) - .build()); - } - - private static void deleteAllUsers() { - WsClient wsClient = newAdminWsClient(ORCHESTRATOR); - WsUsers.SearchWsResponse searchResponse = wsClient.users().search(SearchRequest.builder().build()); - searchResponse.getUsersList().forEach(user -> { - wsClient.wsConnector().call(new PostRequest("api/users/deactivate").setParam("login", user.getLogin())); - }); - } -} diff --git a/it/it-tests/src/test/java/it/issue/CommonRulesTest.java b/it/it-tests/src/test/java/it/issue/CommonRulesTest.java deleted file mode 100644 index c9c7635949f..00000000000 --- a/it/it-tests/src/test/java/it/issue/CommonRulesTest.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.util.List; -import org.junit.BeforeClass; -import org.junit.Test; -import org.sonarqube.ws.Issues.Issue; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.issue.SearchWsRequest; -import util.ItUtils; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.runProjectAnalysis; - -public class CommonRulesTest extends AbstractIssueTest { - - public static final String FILE_KEY = "common-rules-project:src/Sample.xoo"; - public static final String TEST_FILE_KEY = "common-rules-project:test/SampleTest.xoo"; - - private static WsClient adminWsClient; - - @BeforeClass - public static void setUp() { - ORCHESTRATOR.resetData(); - ItUtils.restoreProfile(ORCHESTRATOR, CommonRulesTest.class.getResource("/issue/CommonRulesTest/xoo-common-rules-profile.xml")); - ORCHESTRATOR.getServer().provisionProject("common-rules-project", "Sample"); - ORCHESTRATOR.getServer().associateProjectToQualityProfile("common-rules-project", "xoo", "xoo-common-rules"); - runProjectAnalysis(ORCHESTRATOR, "issue/common-rules", - "sonar.cpd.xoo.minimumTokens", "2", - "sonar.cpd.xoo.minimumLines", "2"); - - adminWsClient = newAdminWsClient(ORCHESTRATOR); - } - - @Test - public void test_rule_on_duplicated_blocks() { - List<Issue> issues = findIssues(FILE_KEY, "common-xoo:DuplicatedBlocks"); - assertThat(issues).hasSize(1); - } - - @Test - public void test_rule_on_comments() { - List<Issue> issues = findIssues(FILE_KEY, "common-xoo:InsufficientCommentDensity"); - assertThat(issues.size()).isEqualTo(1); - } - - @Test - public void test_rule_on_coverage() { - List<Issue> issues = findIssues(FILE_KEY, "common-xoo:InsufficientBranchCoverage"); - assertThat(issues.size()).isEqualTo(1); - - issues = findIssues(FILE_KEY, "common-xoo:InsufficientLineCoverage"); - assertThat(issues.size()).isEqualTo(1); - } - - @Test - public void test_rule_on_skipped_tests() { - List<Issue> issues = findIssues(TEST_FILE_KEY, "common-xoo:SkippedUnitTests"); - assertThat(issues.size()).isEqualTo(1); - } - - @Test - public void test_rule_on_test_errors() { - List<Issue> issues = findIssues(TEST_FILE_KEY, "common-xoo:FailedUnitTests"); - assertThat(issues.size()).isEqualTo(1); - } - - private List<Issue> findIssues(String componentKey, String ruleKey) { - return adminWsClient.issues().search( - new SearchWsRequest() - .setComponents(singletonList(componentKey)) - .setRules(singletonList(ruleKey))) - .getIssuesList(); - } -} diff --git a/it/it-tests/src/test/java/it/issue/CustomRulesTest.java b/it/it-tests/src/test/java/it/issue/CustomRulesTest.java deleted file mode 100644 index e8423ccf603..00000000000 --- a/it/it-tests/src/test/java/it/issue/CustomRulesTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.util.List; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.sonar.wsclient.issue.Issue; -import util.ProjectAnalysis; -import util.ProjectAnalysisRule; - -import static org.assertj.core.api.Assertions.assertThat; - -public class CustomRulesTest extends AbstractIssueTest { - - @Rule - public final ProjectAnalysisRule projectAnalysisRule = ProjectAnalysisRule.from(ORCHESTRATOR); - - private ProjectAnalysis xooSampleAnalysis; - - @Before - public void setup() { - String profileKey = projectAnalysisRule.registerProfile("/issue/CustomRulesTest/custom.xml"); - String projectKey = projectAnalysisRule.registerProject("shared/xoo-sample"); - this.xooSampleAnalysis = projectAnalysisRule.newProjectAnalysis(projectKey) - .withQualityProfile(profileKey); - } - - @Test - public void analyzeProjectWithCustomRules() throws Exception { - ORCHESTRATOR.getServer().adminWsClient().post("api/rules/create", - "template_key", "xoo:TemplateRule", - "custom_key", "MyCustomRule", - "markdown_description", "My description", - "name", "My custom rule", - "severity", "BLOCKER", - "params", "line=2"); - - xooSampleAnalysis.run(); - - List<Issue> issues = searchIssues(); - assertThat(issues).hasSize(1); - - Issue issue = issues.get(0); - assertThat(issue.ruleKey()).isEqualTo("xoo:MyCustomRule"); - assertThat(issue.line()).isEqualTo(2); - // Overriden in quality profile - assertThat(issue.severity()).isEqualTo("CRITICAL"); - } -} diff --git a/it/it-tests/src/test/java/it/issue/IssueActionTest.java b/it/it-tests/src/test/java/it/issue/IssueActionTest.java deleted file mode 100644 index 0006ac98646..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueActionTest.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.util.List; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.ws.Issues; -import org.sonarqube.ws.Issues.Issue; -import org.sonarqube.ws.client.issue.AddCommentRequest; -import org.sonarqube.ws.client.issue.AssignRequest; -import org.sonarqube.ws.client.issue.EditCommentRequest; -import org.sonarqube.ws.client.issue.IssuesService; -import org.sonarqube.ws.client.issue.SearchWsRequest; -import org.sonarqube.ws.client.issue.SetSeverityRequest; -import util.ProjectAnalysis; -import util.ProjectAnalysisRule; -import util.issue.IssueRule; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; -import static org.sonarqube.ws.Common.Severity.BLOCKER; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.toDatetime; - -public class IssueActionTest extends AbstractIssueTest { - - @Rule - public final ProjectAnalysisRule projectAnalysisRule = ProjectAnalysisRule.from(ORCHESTRATOR); - - @ClassRule - public static final IssueRule issueRule = IssueRule.from(ORCHESTRATOR); - - private ProjectAnalysis projectAnalysis; - private IssuesService issuesService; - - private Issue randomIssue; - - @Before - public void setup() { - String qualityProfileKey = projectAnalysisRule.registerProfile("/issue/IssueActionTest/xoo-one-issue-per-line-profile.xml"); - String projectKey = projectAnalysisRule.registerProject("shared/xoo-sample"); - - this.projectAnalysis = projectAnalysisRule.newProjectAnalysis(projectKey).withQualityProfile(qualityProfileKey); - this.projectAnalysis.run(); - this.issuesService = newAdminWsClient(ORCHESTRATOR).issues(); - this.randomIssue = issueRule.getRandomIssue(); - } - - @Test - public void no_comments_by_default() throws Exception { - assertThat(randomIssue.getComments().getCommentsList()).isEmpty(); - } - - @Test - public void add_comment() throws Exception { - Issues.Comment comment = issuesService.addComment(new AddCommentRequest(randomIssue.getKey(), "this is my *comment*")).getIssue().getComments().getComments(0); - assertThat(comment.getKey()).isNotNull(); - assertThat(comment.getHtmlText()).isEqualTo("this is my <strong>comment</strong>"); - assertThat(comment.getLogin()).isEqualTo("admin"); - assertThat(comment.getCreatedAt()).isNotNull(); - - // reload issue - Issue reloaded = issueRule.getByKey(randomIssue.getKey()); - assertThat(reloaded.getComments().getCommentsList()).hasSize(1); - assertThat(reloaded.getComments().getComments(0).getKey()).isEqualTo(comment.getKey()); - assertThat(reloaded.getComments().getComments(0).getHtmlText()).isEqualTo("this is my <strong>comment</strong>"); - assertThat(toDatetime(reloaded.getUpdateDate())).isAfter(toDatetime(randomIssue.getUpdateDate())); - } - - /** - * SONAR-4450 - */ - @Test - public void should_reject_blank_comment() throws Exception { - try { - issuesService.addComment(new AddCommentRequest(randomIssue.getKey(), " ")); - fail(); - } catch (org.sonarqube.ws.client.HttpException ex) { - assertThat(ex.code()).isEqualTo(400); - } - - Issue reloaded = issueRule.getByKey(randomIssue.getKey()); - assertThat(reloaded.getComments().getCommentsList()).isEmpty(); - } - - @Test - public void edit_comment() throws Exception { - Issues.Comment comment = issuesService.addComment(new AddCommentRequest(randomIssue.getKey(), "this is my *comment*")).getIssue().getComments().getComments(0); - Issues.Comment editedComment = issuesService.editComment(new EditCommentRequest(comment.getKey(), "new *comment*")).getIssue().getComments().getComments(0); - assertThat(editedComment.getHtmlText()).isEqualTo("new <strong>comment</strong>"); - - // reload issue - Issue reloaded = issueRule.getByKey(randomIssue.getKey()); - assertThat(reloaded.getComments().getCommentsList()).hasSize(1); - assertThat(reloaded.getComments().getComments(0).getHtmlText()).isEqualTo("new <strong>comment</strong>"); - } - - @Test - public void delete_comment() throws Exception { - Issues.Comment comment = issuesService.addComment(new AddCommentRequest(randomIssue.getKey(), "this is my *comment*")).getIssue().getComments().getComments(0); - Issue issue = issuesService.deleteComment(comment.getKey()).getIssue(); - assertThat(issue.getComments().getCommentsList()).isEmpty(); - - // reload issue - Issue reloaded = issueRule.getByKey(randomIssue.getKey()); - assertThat(reloaded.getComments().getCommentsList()).isEmpty(); - } - - /** - * SONAR-4352 - */ - @Test - public void change_severity() { - String componentKey = "sample"; - - // there are no blocker issues - assertThat(searchIssuesBySeverities(componentKey, "BLOCKER")).isEmpty(); - - // increase the severity of an issue - issuesService.setSeverity(new SetSeverityRequest(randomIssue.getKey(), "BLOCKER")); - - assertThat(searchIssuesBySeverities(componentKey, "BLOCKER")).hasSize(1); - - projectAnalysis.run(); - Issue reloaded = issueRule.getByKey(randomIssue.getKey()); - assertThat(reloaded.getSeverity()).isEqualTo(BLOCKER); - assertThat(reloaded.getStatus()).isEqualTo("OPEN"); - assertThat(reloaded.hasResolution()).isFalse(); - assertThat(reloaded.getCreationDate()).isEqualTo(randomIssue.getCreationDate()); - assertThat(toDatetime(reloaded.getCreationDate())).isBefore(toDatetime(reloaded.getUpdateDate())); - } - - /** - * SONAR-4287 - */ - @Test - public void assign() { - assertThat(randomIssue.hasAssignee()).isFalse(); - Issues.SearchWsResponse response = issueRule.search(new SearchWsRequest().setIssues(singletonList(randomIssue.getKey()))); - assertThat(response.getUsers().getUsersList()).isEmpty(); - - issuesService.assign(new AssignRequest(randomIssue.getKey(), "admin")); - assertThat(issueRule.search(new SearchWsRequest().setAssignees(singletonList("admin"))).getIssuesList()).hasSize(1); - - projectAnalysis.run(); - Issue reloaded = issueRule.getByKey(randomIssue.getKey()); - assertThat(reloaded.getAssignee()).isEqualTo("admin"); - assertThat(reloaded.getCreationDate()).isEqualTo(randomIssue.getCreationDate()); - - response = issueRule.search(new SearchWsRequest().setIssues(singletonList(randomIssue.getKey())).setAdditionalFields(singletonList("users"))); - assertThat(response.getUsers().getUsersList().stream().filter(user -> "admin".equals(user.getLogin())).findFirst()).isPresent(); - assertThat(response.getUsers().getUsersList().stream().filter(user -> "Administrator".equals(user.getName())).findFirst()).isPresent(); - - // unassign - issuesService.assign(new AssignRequest(randomIssue.getKey(), null)); - reloaded = issueRule.getByKey(randomIssue.getKey()); - assertThat(reloaded.hasAssignee()).isFalse(); - assertThat(issueRule.search(new SearchWsRequest().setAssignees(singletonList("admin"))).getIssuesList()).isEmpty(); - } - - /** - * SONAR-4287 - */ - @Test - public void fail_assign_if_assignee_does_not_exist() { - assertThat(randomIssue.hasAssignee()).isFalse(); - try { - issuesService.assign(new AssignRequest(randomIssue.getKey(), "unknown")); - fail(); - } catch (org.sonarqube.ws.client.HttpException ex) { - assertThat(ex.code()).isEqualTo(404); - } - } - - private static List<Issue> searchIssuesBySeverities(String projectKey, String severity) { - return issueRule.search(new SearchWsRequest().setProjectKeys(singletonList(projectKey)).setSeverities(singletonList(severity))).getIssuesList(); - } - -} diff --git a/it/it-tests/src/test/java/it/issue/IssueBulkChangeTest.java b/it/it-tests/src/test/java/it/issue/IssueBulkChangeTest.java deleted file mode 100644 index bbb4192e4c9..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueBulkChangeTest.java +++ /dev/null @@ -1,272 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import com.google.common.collect.FluentIterable; -import java.util.List; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonar.wsclient.base.HttpException; -import org.sonarqube.ws.Issues; -import org.sonarqube.ws.Issues.BulkChangeWsResponse; -import org.sonarqube.ws.client.issue.BulkChangeRequest; -import org.sonarqube.ws.client.issue.IssuesService; -import org.sonarqube.ws.client.issue.SearchWsRequest; -import util.ProjectAnalysis; -import util.ProjectAnalysisRule; -import util.issue.IssueRule; - -import static java.util.Arrays.asList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.sonarqube.ws.Common.Severity.BLOCKER; -import static org.sonarqube.ws.Issues.Issue; -import static util.ItUtils.newAdminWsClient; - -/** - * SONAR-4421 - */ -public class IssueBulkChangeTest extends AbstractIssueTest { - - private static final int BULK_EDITED_ISSUE_COUNT = 3; - private static final String COMMENT_AS_MARKDOWN = "this is my *comment*"; - private static final String COMMENT_AS_HTML = "this is my <strong>comment</strong>"; - - @Rule - public ExpectedException expectedException = ExpectedException.none(); - - @ClassRule - public static IssueRule issueRule = IssueRule.from(ORCHESTRATOR); - - @Rule - public final ProjectAnalysisRule projectAnalysisRule = ProjectAnalysisRule.from(ORCHESTRATOR); - - private IssuesService issuesService; - private ProjectAnalysis xooSampleLittleIssuesAnalysis; - - @Before - public void setUp() throws Exception { - String qualityProfileKey = projectAnalysisRule.registerProfile("/issue/IssueBulkChangeTest/one-issue-per-line-profile.xml"); - String projectKey = projectAnalysisRule.registerProject("shared/xoo-sample"); - this.xooSampleLittleIssuesAnalysis = projectAnalysisRule.newProjectAnalysis(projectKey) - .withQualityProfile(qualityProfileKey); - this.issuesService = newAdminWsClient(ORCHESTRATOR).issues(); - } - - @Test - public void should_change_severity() { - xooSampleLittleIssuesAnalysis.run(); - - String newSeverity = "BLOCKER"; - String[] issueKeys = searchIssueKeys(BULK_EDITED_ISSUE_COUNT); - BulkChangeWsResponse bulkChange = bulkChangeSeverityOfIssues(issueKeys, newSeverity); - - assertThat(bulkChange.getSuccess()).isEqualTo(BULK_EDITED_ISSUE_COUNT); - assertIssueSeverity(issueKeys, newSeverity); - } - - @Test - public void should_do_transition() { - xooSampleLittleIssuesAnalysis.run(); - String[] issueKeys = searchIssueKeys(BULK_EDITED_ISSUE_COUNT); - BulkChangeWsResponse bulkChangeResponse = bulkTransitionStatusOfIssues(issueKeys, "confirm"); - - assertThat(bulkChangeResponse.getSuccess()).isEqualTo(BULK_EDITED_ISSUE_COUNT); - assertIssueStatus(issueKeys, "CONFIRMED"); - } - - @Test - public void should_assign() { - xooSampleLittleIssuesAnalysis.run(); - - String[] issueKeys = searchIssueKeys(BULK_EDITED_ISSUE_COUNT); - BulkChangeWsResponse bulkChangeResponse = buldChangeAssigneeOfIssues(issueKeys, "admin"); - - assertThat(bulkChangeResponse.getSuccess()).isEqualTo(BULK_EDITED_ISSUE_COUNT); - for (Issue issue : issueRule.getByKeys(issueKeys)) { - assertThat(issue.getAssignee()).isEqualTo("admin"); - } - } - - @Test - public void should_setSeverity_add_comment_in_single_WS_call() { - xooSampleLittleIssuesAnalysis.run(); - - String newSeverity = "BLOCKER"; - String[] issueKeys = searchIssueKeys(BULK_EDITED_ISSUE_COUNT); - - BulkChangeWsResponse bulkChangeResponse = issuesService.bulkChange(BulkChangeRequest.builder() - .setIssues(asList(issueKeys)) - .setSetSeverity(newSeverity) - .setComment(COMMENT_AS_MARKDOWN) - .build()); - - assertThat(bulkChangeResponse.getSuccess()).isEqualTo(BULK_EDITED_ISSUE_COUNT); - for (Issue issue : issueRule.getByKeys(issueKeys)) { - assertThat(issue.getComments().getCommentsList()).hasSize(1); - assertThat(issue.getComments().getComments(0).getHtmlText()).isEqualTo(COMMENT_AS_HTML); - } - } - - @Test - public void should_apply_bulk_change_on_many_actions() { - xooSampleLittleIssuesAnalysis.run(); - String[] issueKeys = searchIssueKeys(BULK_EDITED_ISSUE_COUNT); - - BulkChangeWsResponse bulkChangeResponse = issuesService.bulkChange(BulkChangeRequest.builder() - .setIssues(asList(issueKeys)) - .setDoTransition("confirm") - .setAssign("admin") - .setSetSeverity("BLOCKER") - .setComment(COMMENT_AS_MARKDOWN) - .build()); - - assertThat(bulkChangeResponse.getSuccess()).isEqualTo(BULK_EDITED_ISSUE_COUNT); - for (Issue issue : issueRule.getByKeys(issueKeys)) { - assertThat(issue.getStatus()).isEqualTo("CONFIRMED"); - assertThat(issue.getAssignee()).isEqualTo("admin"); - assertThat(issue.getSeverity()).isEqualTo(BLOCKER); - assertThat(issue.getComments().getCommentsList()).hasSize(1); - assertThat(issue.getComments().getComments(0).getHtmlText()).isEqualTo(COMMENT_AS_HTML); - } - } - - @Test - public void should_not_apply_bulk_change_if_not_logged() { - xooSampleLittleIssuesAnalysis.run(); - - String newSeverity = "BLOCKER"; - String[] issueKeys = searchIssueKeys(BULK_EDITED_ISSUE_COUNT); - - try { - issuesService.bulkChange(createBulkChangeSeverityOfIssuesQuery(issueKeys, newSeverity)); - } catch (Exception e) { - assertHttpException(e, 401); - } - } - - @Test - public void should_not_apply_bulk_change_if_no_change_to_do() { - xooSampleLittleIssuesAnalysis.run(); - - String newSeverity = "BLOCKER"; - String[] issueKeys = searchIssueKeys(BULK_EDITED_ISSUE_COUNT); - - // Apply the bulk change a first time - BulkChangeWsResponse bulkChangeResponse = bulkChangeSeverityOfIssues(issueKeys, newSeverity); - assertThat(bulkChangeResponse.getSuccess()).isEqualTo(BULK_EDITED_ISSUE_COUNT); - - // Re apply the same bulk change -> no issue should be changed - bulkChangeResponse = bulkChangeSeverityOfIssues(issueKeys, newSeverity); - assertThat(bulkChangeResponse.getSuccess()).isEqualTo(0); - assertThat(bulkChangeResponse.getIgnored()).isEqualTo(BULK_EDITED_ISSUE_COUNT); - } - - @Test - public void should_not_apply_bulk_change_if_no_action() { - xooSampleLittleIssuesAnalysis.run(); - - try { - int limit = BULK_EDITED_ISSUE_COUNT; - String[] issueKeys = searchIssueKeys(limit); - issuesService.bulkChange(BulkChangeRequest.builder().setIssues(asList(issueKeys)).build()); - } catch (Exception e) { - assertHttpException(e, 400); - } - } - - @Test - public void should_add_comment_only_on_issues_that_will_be_changed() { - xooSampleLittleIssuesAnalysis.run(); - int nbIssues = BULK_EDITED_ISSUE_COUNT; - String[] issueKeys = searchIssueKeys(nbIssues); - - // Confirm an issue - adminIssueClient().doTransition(searchIssues().iterator().next().key(), "confirm"); - - // Apply a bulk change on unconfirm transition - BulkChangeWsResponse bulkChangeResponse = issuesService.bulkChange(BulkChangeRequest.builder().setIssues(asList(issueKeys)) - .setDoTransition("unconfirm") - .setComment("this is my comment") - .build()); - assertThat(bulkChangeResponse.getSuccess()).isEqualTo(1); - - int nbIssuesWithComment = 0; - for (Issues.Issue issue : issueRule.getByKeys(issueKeys)) { - if (!issue.getComments().getCommentsList().isEmpty()) { - nbIssuesWithComment++; - } - } - // Only one issue should have the comment - assertThat(nbIssuesWithComment).isEqualTo(1); - } - - private static void assertIssueSeverity(String[] issueKeys, String expectedSeverity) { - for (Issues.Issue issue : issueRule.getByKeys(issueKeys)) { - assertThat(issue.getSeverity().name()).isEqualTo(expectedSeverity); - } - } - - private static void assertIssueStatus(String[] issueKeys, String expectedStatus) { - for (Issues.Issue issue : issueRule.getByKeys(issueKeys)) { - assertThat(issue.getStatus()).isEqualTo(expectedStatus); - } - } - - private static void assertHttpException(Exception e, int expectedCode) { - assertThat(e).isInstanceOf(HttpException.class); - assertThat(((HttpException) e).status()).isEqualTo(expectedCode); - } - - private BulkChangeWsResponse bulkChangeSeverityOfIssues(String[] issueKeys, String newSeverity) { - BulkChangeRequest bulkChangeQuery = createBulkChangeSeverityOfIssuesQuery(issueKeys, newSeverity); - return issuesService.bulkChange(bulkChangeQuery); - } - - private static BulkChangeRequest createBulkChangeSeverityOfIssuesQuery(String[] issueKeys, String newSeverity) { - BulkChangeRequest.Builder request = BulkChangeRequest.builder().setSetSeverity(newSeverity); - if (issueKeys != null && issueKeys.length > 0) { - request.setIssues(asList(issueKeys)); - } - return request.build(); - } - - private BulkChangeWsResponse bulkTransitionStatusOfIssues(String[] issueKeys, String newSeverity) { - return issuesService.bulkChange(BulkChangeRequest.builder().setIssues(asList(issueKeys)).setDoTransition(newSeverity).build()); - } - - private BulkChangeWsResponse buldChangeAssigneeOfIssues(String[] issueKeys, String newAssignee) { - return issuesService.bulkChange(BulkChangeRequest.builder().setIssues(asList(issueKeys)).setAssign(newAssignee).build()); - } - - private static String[] searchIssueKeys(int limit) { - return getIssueKeys(issueRule.search(new SearchWsRequest()).getIssuesList(), limit); - } - - private static String[] getIssueKeys(List<Issues.Issue> issues, int nbIssues) { - return FluentIterable.from(issues) - .limit(nbIssues) - .transform(Issue::getKey) - .toArray(String.class); - } - -} diff --git a/it/it-tests/src/test/java/it/issue/IssueChangelogTest.java b/it/it-tests/src/test/java/it/issue/IssueChangelogTest.java deleted file mode 100644 index d9c833e9a41..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueChangelogTest.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.util.List; -import org.junit.Before; -import org.junit.Test; -import org.sonar.wsclient.issue.Issue; -import org.sonarqube.ws.Issues; -import org.sonarqube.ws.Issues.ChangelogWsResponse.Changelog; -import org.sonarqube.ws.client.WsClient; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.tuple; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.runProjectAnalysis; - -public class IssueChangelogTest extends AbstractIssueTest { - - private static WsClient adminClient; - - @Before - public void prepareData() { - ORCHESTRATOR.resetData(); - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/IssueChangelogTest/one-issue-per-line-profile.xml")); - ORCHESTRATOR.getServer().provisionProject("sample", "sample"); - ORCHESTRATOR.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - adminClient = newAdminWsClient(ORCHESTRATOR); - } - - @Test - public void update_changelog_when_assigning_issue_by_user() throws Exception { - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample"); - Issue issue = searchRandomIssue(); - assertIssueHasNoChange(issue.key()); - - adminIssueClient().assign(issue.key(), "admin"); - - List<Changelog> changes = changelog(issue.key()).getChangelogList(); - assertThat(changes).hasSize(1); - Changelog change = changes.get(0); - assertThat(change.getUser()).isEqualTo("admin"); - assertThat(change.getCreationDate()).isNotNull(); - assertThat(change.getDiffsList()) - .extracting(Changelog.Diff::getKey, Changelog.Diff::hasOldValue, Changelog.Diff::getNewValue) - .containsOnly(tuple("assignee", false, "Administrator")); - } - - @Test - public void update_changelog_when_reopening_unresolved_issue_by_scan() throws Exception { - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample"); - Issue issue = searchRandomIssue(); - assertIssueHasNoChange(issue.key()); - - // re analyse the project after resolving an issue in order to reopen it - adminIssueClient().doTransition(issue.key(), "resolve"); - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample"); - - List<Changelog> changes = changelog(issue.key()).getChangelogList(); - assertThat(changes).hasSize(2); - - // Change done by the user (first change is be the oldest one) - Changelog change1 = changes.get(0); - assertThat(change1.getUser()).isEqualTo("admin"); - assertThat(change1.getCreationDate()).isNotNull(); - assertThat(change1.getDiffsList()) - .extracting(Changelog.Diff::getKey, Changelog.Diff::getOldValue, Changelog.Diff::getNewValue) - .containsOnly(tuple("resolution", "", "FIXED"), tuple("status", "OPEN", "RESOLVED")); - - // Change done by scan - Changelog change2 = changes.get(1); - assertThat(change2.hasUser()).isFalse(); - assertThat(change2.getCreationDate()).isNotNull(); - assertThat(change2.getDiffsList()) - .extracting(Changelog.Diff::getKey, Changelog.Diff::getOldValue, Changelog.Diff::getNewValue) - .containsOnly(tuple("resolution", "", ""), tuple("status", "RESOLVED", "REOPENED")); - } - - @Test - public void display_file_name_in_changelog_during_file_move() { - // version 1 - runProjectAnalysis(ORCHESTRATOR, "issue/xoo-tracking-v1"); - - // version 2 - runProjectAnalysis(ORCHESTRATOR, "issue/xoo-tracking-v3"); - - Issue issue = searchRandomIssue(); - List<Changelog> changes = changelog(issue.key()).getChangelogList(); - assertThat(changes).hasSize(1); - Changelog change = changes.get(0); - assertThat(change.hasUser()).isFalse(); - assertThat(change.getCreationDate()).isNotNull(); - assertThat(change.getDiffsList()) - .extracting(Changelog.Diff::getKey, Changelog.Diff::getOldValue, Changelog.Diff::getNewValue) - .containsOnly(tuple("file", "src/main/xoo/sample/Sample.xoo", "src/main/xoo/sample/Sample2.xoo")); - } - - private void assertIssueHasNoChange(String issueKey) { - assertThat(changelog(issueKey).getChangelogList()).isEmpty(); - } - - private static Issues.ChangelogWsResponse changelog(String issueKey) { - return adminClient.issues().changelog(issueKey); - } - -} diff --git a/it/it-tests/src/test/java/it/issue/IssueCreationDateTest.java b/it/it-tests/src/test/java/it/issue/IssueCreationDateTest.java deleted file mode 100644 index 0dd27ca82fd..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueCreationDateTest.java +++ /dev/null @@ -1,378 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import com.sonar.orchestrator.build.SonarScanner; -import com.sonar.orchestrator.container.Server; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Stream; -import org.junit.Before; -import org.junit.Test; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueQuery; -import org.sonarqube.ws.ProjectAnalyses; -import org.sonarqube.ws.client.projectanalysis.SearchRequest; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.projectDir; - -/** - * @see <a href="https://jira.sonarsource.com/browse/MMF-567">MMF-567</a> - */ -public class IssueCreationDateTest extends AbstractIssueTest { - - private static final String ISSUE_STATUS_OPEN = "OPEN"; - - private static final String LANGUAGE_XOO = "xoo"; - - private static final String DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ"; - private static final String DATE_FORMAT = "yyyy-MM-dd"; - - private static final String SAMPLE_PROJECT_KEY = "creation-date-sample"; - private static final String SAMPLE_PROJECT_NAME = "Creation date sample"; - private static final String SAMPLE_QUALITY_PROFILE_NAME = "creation-date-quality-profile"; - private static final String SAMPLE_EXPLICIT_DATE_1 = todayMinusDays(2); - private static final String SAMPLE_EXPLICIT_DATE_2 = todayMinusDays(1); - - private Server server = ORCHESTRATOR.getServer(); - - @Before - public void resetData() { - ORCHESTRATOR.resetData(); - server.provisionProject(SAMPLE_PROJECT_KEY, SAMPLE_PROJECT_NAME); - } - - @Test - public void should_use_scm_date_for_new_issues_if_scm_is_available() { - analysis(QProfile.ONE_RULE, SourceCode.INITIAL, ScannerFeature.SCM); - - assertNumberOfIssues(3); - assertIssueCreationDate(Component.OnlyInInitial, IssueCreationDate.OnlyInInitial_R1); - assertIssueCreationDate(Component.ForeverAndModified, IssueCreationDate.ForeverAndModified_R1); - assertIssueCreationDate(Component.ForeverAndUnmodified, IssueCreationDate.ForeverAndUnmodified_R1); - } - - @Test - public void should_use_analysis_date_for_new_issues_if_scm_is_not_available() { - analysis(QProfile.ONE_RULE, SourceCode.INITIAL); - - assertNumberOfIssues(3); - assertIssueCreationDates(COMPONENTS_OF_SOURCE_INITIAL, IssueCreationDate.FIRST_ANALYSIS); - } - - @Test - public void use_explicit_project_date_if_scm_is_not_available() { - analysis(QProfile.ONE_RULE, SourceCode.INITIAL, ScannerFeature.EXPLICIT_DATE_1); - - assertNumberOfIssues(3); - assertIssueCreationDates(COMPONENTS_OF_SOURCE_INITIAL, IssueCreationDate.EXPLICIT_DATE_1); - } - - @Test - public void use_scm_date_even_if_explicit_project_date_is_set() { - analysis(QProfile.ONE_RULE, SourceCode.INITIAL, ScannerFeature.SCM, ScannerFeature.EXPLICIT_DATE_1); - - assertNumberOfIssues(3); - assertIssueCreationDate(Component.OnlyInInitial, IssueCreationDate.OnlyInInitial_R1); - assertIssueCreationDate(Component.ForeverAndModified, IssueCreationDate.ForeverAndModified_R1); - assertIssueCreationDate(Component.ForeverAndUnmodified, IssueCreationDate.ForeverAndUnmodified_R1); - } - - @Test - public void no_rules_no_issues_if_scm_is_available() { - analysis(QProfile.NO_RULES, SourceCode.INITIAL, ScannerFeature.SCM); - - assertNoIssue(); - } - - @Test - public void no_rules_no_issues_if_scm_is_not_available() { - analysis(QProfile.NO_RULES, SourceCode.INITIAL); - - assertNoIssue(); - } - - @Test - public void use_scm_date_for_issues_raised_by_new_rules_if_scm_is_newly_available() { - analysis(QProfile.NO_RULES, SourceCode.INITIAL); - analysis(QProfile.ONE_RULE, SourceCode.CHANGED, ScannerFeature.SCM); - - assertNumberOfIssues(3); - assertIssueCreationDate(Component.ForeverAndModified, IssueCreationDate.ForeverAndModified_R2); - assertIssueCreationDate(Component.ForeverAndUnmodified, IssueCreationDate.ForeverAndUnmodified_R1); - assertIssueCreationDate(Component.OnlyInChanged, IssueCreationDate.OnlyInChanged_R1); - } - - @Test - public void use_scm_date_for_issues_raised_by_new_rules_if_scm_is_available_and_ever_has_been_available() { - analysis(QProfile.NO_RULES, SourceCode.INITIAL, ScannerFeature.SCM); - analysis(QProfile.ONE_RULE, SourceCode.CHANGED, ScannerFeature.SCM); - - assertNumberOfIssues(3); - assertIssueCreationDate(Component.ForeverAndModified, IssueCreationDate.ForeverAndModified_R2); - assertIssueCreationDate(Component.ForeverAndUnmodified, IssueCreationDate.ForeverAndUnmodified_R1); - assertIssueCreationDate(Component.OnlyInChanged, IssueCreationDate.OnlyInChanged_R1); - } - - @Test - public void use_analysis_date_for_issues_raised_by_new_rules_if_scm_is_not_available() { - analysis(QProfile.NO_RULES, SourceCode.INITIAL); - analysis(QProfile.ONE_RULE, SourceCode.CHANGED); - - assertNumberOfIssues(3); - Stream.of(COMPONENTS_OF_SOURCE_CHANGED) - .forEach(component -> { - assertIssueCreationDate(component, IssueCreationDate.LATEST_ANALYSIS); - }); - } - - @Test - public void keep_the_date_of_an_existing_issue_even_if_the_blame_information_changes() { - analysis(QProfile.ONE_RULE, SourceCode.INITIAL, ScannerFeature.SCM); - analysis(QProfile.ONE_RULE, SourceCode.CHANGED, ScannerFeature.SCM); - - assertNumberOfIssues(3); - assertIssueCreationDate(Component.ForeverAndModified, IssueCreationDate.ForeverAndModified_R1); - assertIssueCreationDate(Component.ForeverAndUnmodified, IssueCreationDate.ForeverAndUnmodified_R1); - - // this file is new to the second analysis - assertIssueCreationDate(Component.OnlyInChanged, IssueCreationDate.LATEST_ANALYSIS); - } - - @Test - public void ignore_explicit_date_for_issues_related_to_new_rules_if_scm_is_available() { - analysis(QProfile.NO_RULES, SourceCode.INITIAL, ScannerFeature.SCM, ScannerFeature.EXPLICIT_DATE_1); - analysis(QProfile.ONE_RULE, SourceCode.CHANGED, ScannerFeature.SCM, ScannerFeature.EXPLICIT_DATE_2); - - assertNumberOfIssues(3); - assertIssueCreationDate(Component.ForeverAndModified, IssueCreationDate.ForeverAndModified_R2); - assertIssueCreationDate(Component.ForeverAndUnmodified, IssueCreationDate.ForeverAndUnmodified_R1); - assertIssueCreationDate(Component.OnlyInChanged, IssueCreationDate.OnlyInChanged_R1); - } - - @Test - public void use_explicit_date_for_issues_related_to_new_rules_if_scm_is_not_available() { - analysis(QProfile.NO_RULES, SourceCode.INITIAL, ScannerFeature.EXPLICIT_DATE_1); - analysis(QProfile.ONE_RULE, SourceCode.CHANGED, ScannerFeature.EXPLICIT_DATE_2); - - assertNumberOfIssues(3); - assertIssueCreationDates(COMPONENTS_OF_SOURCE_CHANGED, IssueCreationDate.EXPLICIT_DATE_2); - } - - private void analysis(QProfile qProfile, SourceCode sourceCode, ScannerFeature... scm) { - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource(qProfile.path)); - server.associateProjectToQualityProfile(SAMPLE_PROJECT_KEY, LANGUAGE_XOO, SAMPLE_QUALITY_PROFILE_NAME); - - SonarScanner scanner = SonarScanner.create(projectDir(sourceCode.path)); - Arrays.stream(scm).forEach(s -> s.configure(scanner)); - ORCHESTRATOR.executeBuild(scanner); - } - - private static void assertNoIssue() { - assertNumberOfIssues(0); - } - - private static void assertNumberOfIssues(int number) { - assertThat(getIssues(issueQuery())).hasSize(number); - } - - private static void assertIssueCreationDate(Component component, IssueCreationDate expectedDate) { - assertIssueCreationDates(new Component[] {component}, expectedDate); - } - - private static void assertIssueCreationDates(Component[] components, IssueCreationDate expectedDate) { - String[] keys = Arrays.stream(components).map(Component::getKey).toArray(String[]::new); - List<Issue> issues = getIssues(issueQuery().components(keys)); - Date[] dates = Arrays.stream(components).map(x -> expectedDate.getDate()).toArray(Date[]::new); - - assertThat(issues) - .extracting(Issue::creationDate) - .containsExactly(dates); - } - - private static List<Issue> getIssues(IssueQuery query) { - return issueClient().find(query).list(); - } - - private static IssueQuery issueQuery() { - return IssueQuery.create().statuses(ISSUE_STATUS_OPEN); - } - - private static Date dateTimeParse(String expectedDate) { - try { - return new SimpleDateFormat(DATETIME_FORMAT).parse(expectedDate); - } catch (ParseException e) { - throw new RuntimeException(e); - } - } - - private static Date dateParse(String expectedDate) { - try { - return new SimpleDateFormat(DATE_FORMAT).parse(expectedDate); - } catch (ParseException e) { - throw new RuntimeException(e); - } - } - - private static String todayMinusDays(int numberOfDays) { - return DateTimeFormatter.ofPattern(DATE_FORMAT).format(LocalDate.now().atStartOfDay().minusDays(numberOfDays)); - } - - private enum SourceCode { - INITIAL("issue/creationDateSampleInitial"), - CHANGED("issue/creationDateSampleChanged"), - ; - - private final String path; - - private SourceCode(String path) { - this.path = path; - } - } - - private enum Component { - OnlyInInitial("creation-date-sample:src/main/xoo/sample/OnlyInInitial.xoo"), - ForeverAndModified("creation-date-sample:src/main/xoo/sample/ForeverAndModified.xoo"), - ForeverAndUnmodified("creation-date-sample:src/main/xoo/sample/ForeverAndUnmodified.xoo"), - OnlyInChanged("creation-date-sample:src/main/xoo/sample/OnlyInChanged.xoo"), - ; - private final String key; - - private Component(String key) { - this.key = key; - } - - public String getKey() { - return key; - } - } - - private static final Component[] COMPONENTS_OF_SOURCE_INITIAL = {Component.OnlyInInitial, Component.ForeverAndModified, Component.ForeverAndUnmodified}; - private static final Component[] COMPONENTS_OF_SOURCE_CHANGED = {Component.ForeverAndModified, Component.ForeverAndUnmodified, Component.OnlyInChanged}; - - private enum QProfile { - ONE_RULE("/issue/IssueCreationDateTest/one-rule.xml"), - NO_RULES("/issue/IssueCreationDateTest/no-rules.xml"), - ; - - private final String path; - - private QProfile(String path) { - this.path = path; - } - } - - private enum ScannerFeature { - SCM { - @Override - void configure(SonarScanner scanner) { - scanner - .setProperty("sonar.scm.provider", "xoo") - .setProperty("sonar.scm.disabled", "false"); - } - }, - EXPLICIT_DATE_1 { - @Override - void configure(SonarScanner scanner) { - scanner - .setProperty("sonar.projectDate", SAMPLE_EXPLICIT_DATE_1); - } - }, - EXPLICIT_DATE_2 { - @Override - void configure(SonarScanner scanner) { - scanner - .setProperty("sonar.projectDate", SAMPLE_EXPLICIT_DATE_2); - } - }, - ; - - void configure(SonarScanner scanner) { - } - } - - private enum IssueCreationDate { - OnlyInInitial_R1(dateTimeParse("2001-01-01T00:00:00+0000")), - ForeverAndUnmodified_R1(dateTimeParse("2002-01-01T00:00:00+0000")), - ForeverAndModified_R1(dateTimeParse("2003-01-01T00:00:00+0000")), - ForeverAndModified_R2(dateTimeParse("2004-01-01T00:00:00+0000")), - OnlyInChanged_R1(dateTimeParse("2005-01-01T00:00:00+0000")), - EXPLICIT_DATE_1(dateParse(SAMPLE_EXPLICIT_DATE_1)), - EXPLICIT_DATE_2(dateParse(SAMPLE_EXPLICIT_DATE_2)), - FIRST_ANALYSIS { - @Override - Date getDate() { - return getAnalysisDate(l -> { - if (l.isEmpty()) { - return Optional.empty(); - } - return Optional.of(l.get(l.size() - 1)); - }); - } - }, - LATEST_ANALYSIS { - @Override - Date getDate() { - return getAnalysisDate(l -> { - if (l.size() > 0) { - return Optional.of(l.get(0)); - } - return Optional.empty(); - }); - } - }, - ; - - private final Date date; - - private IssueCreationDate() { - this.date = null; - } - - private IssueCreationDate(Date date) { - this.date = date; - } - - Date getDate() { - return date; - } - - private static Date getAnalysisDate(Function<List<ProjectAnalyses.Analysis>, Optional<ProjectAnalyses.Analysis>> chooseItem) { - return Optional.of( - ItUtils.newWsClient(ORCHESTRATOR) - .projectAnalysis() - .search(SearchRequest.builder().setProject(SAMPLE_PROJECT_KEY).build()) - .getAnalysesList()) - .flatMap(chooseItem) - .map(ProjectAnalyses.Analysis::getDate) - .map(IssueCreationDateTest::dateTimeParse) - .orElseThrow(() -> new IllegalStateException("There is no analysis")); - } - } -} diff --git a/it/it-tests/src/test/java/it/issue/IssueCreationTest.java b/it/it-tests/src/test/java/it/issue/IssueCreationTest.java deleted file mode 100644 index 7f7a819a3b1..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueCreationTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueQuery; -import org.sonar.wsclient.issue.Issues; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.runProjectAnalysis; - -public class IssueCreationTest extends AbstractIssueTest { - - private static final String SAMPLE_PROJECT_KEY = "sample"; - - @Before - public void resetData() { - ORCHESTRATOR.resetData(); - } - - /** - * See SONAR-4785 - */ - @Test - public void use_rule_name_if_issue_has_no_message() { - ORCHESTRATOR.getServer().provisionProject(SAMPLE_PROJECT_KEY, SAMPLE_PROJECT_KEY); - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/IssueCreationTest/with-custom-message.xml")); - ORCHESTRATOR.getServer().associateProjectToQualityProfile(SAMPLE_PROJECT_KEY, "xoo", "with-custom-message"); - - // First analysis, the issue is generated with a message - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample", "sonar.customMessage.message", "a message"); - Issue issue = issueClient().find(IssueQuery.create()).list().get(0); - assertThat(issue.message()).isEqualTo("a message"); - - // Second analysis, the issue is generated without any message, the name of the rule is used - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample"); - issue = issueClient().find(IssueQuery.create()).list().get(0); - assertThat(issue.message()).isEqualTo("Issue With Custom Message"); - } - - @Test - public void plugin_can_override_profile_severity() throws Exception { - ORCHESTRATOR.getServer().provisionProject(SAMPLE_PROJECT_KEY, SAMPLE_PROJECT_KEY); - - // The rule "OneBlockerIssuePerFile" is enabled with severity "INFO" - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/IssueCreationTest/override-profile-severity.xml")); - ORCHESTRATOR.getServer().associateProjectToQualityProfile(SAMPLE_PROJECT_KEY, "xoo", "override-profile-severity"); - - // But it's hardcoded "blocker" when plugin generates the issue - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample"); - - Issues issues = search(IssueQuery.create().rules("xoo:OneBlockerIssuePerFile")); - assertThat(issues.size()).isGreaterThan(0); - for (Issue issue : issues.list()) { - assertThat(issue.severity()).isEqualTo("BLOCKER"); - } - } -} diff --git a/it/it-tests/src/test/java/it/issue/IssueFilterExtensionTest.java b/it/it-tests/src/test/java/it/issue/IssueFilterExtensionTest.java deleted file mode 100644 index 3232a6c0720..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueFilterExtensionTest.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.util.List; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueQuery; -import util.ProjectAnalysis; -import util.ProjectAnalysisRule; -import util.issue.IssueRule; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasureAsDouble; - -/** - * Tests the extension point IssueFilter - */ -public class IssueFilterExtensionTest extends AbstractIssueTest { - - @Rule - public final ProjectAnalysisRule projectAnalysisRule = ProjectAnalysisRule.from(ORCHESTRATOR); - - @ClassRule - public static final IssueRule issueRule = IssueRule.from(ORCHESTRATOR); - - private final String manyRuleProfileKey = projectAnalysisRule.registerProfile("/issue/IssueFilterExtensionTest/xoo-with-many-rules.xml"); - private final String xooMultiModuleProjectKey = projectAnalysisRule.registerProject("shared/xoo-multi-modules-sample"); - private final ProjectAnalysis analysis = projectAnalysisRule.newProjectAnalysis(xooMultiModuleProjectKey) - .withQualityProfile(manyRuleProfileKey); - - @Test - public void should_filter_files() throws Exception { - analysis.withProperties("sonar.exclusions", "**/HelloA1.xoo").run(); - - List<Issue> issues = searchIssues(); - assertThat(issues).isNotEmpty(); - for (Issue issue : issues) { - // verify exclusion to avoid false positive - assertThat(issue.componentKey()).doesNotContain("HelloA1"); - } - - assertThat(getMeasureAsDouble(ORCHESTRATOR, xooMultiModuleProjectKey, "violations").intValue()).isEqualTo(issues.size()); - } - - @Test - public void should_filter_issues() { - // first analysis without issue-filter - analysis.run(); - - // Issue filter removes issues on lines < 5 - // Deprecated violation filter removes issues detected by PMD - List<Issue> unresolvedIssues = searchResolvedIssues(xooMultiModuleProjectKey); - int issuesBeforeLine5 = countIssuesBeforeLine5(unresolvedIssues); - int pmdIssues = countModuleIssues(unresolvedIssues); - assertThat(issuesBeforeLine5).isGreaterThan(0); - assertThat(pmdIssues).isGreaterThan(0); - - // Enable issue filters - analysis.withProperties("enableIssueFilters", "true").run(); - - unresolvedIssues = searchResolvedIssues(xooMultiModuleProjectKey); - List<Issue> resolvedIssues = searchUnresolvedIssues(xooMultiModuleProjectKey); - assertThat(countIssuesBeforeLine5(unresolvedIssues)).isZero(); - assertThat(countModuleIssues(unresolvedIssues)).isZero(); - assertThat(countModuleIssues(resolvedIssues)).isGreaterThan(0); - for (Issue issue : resolvedIssues) { - // SONAR-6364 no line number on closed issues - assertThat(issue.line()).isNull(); - } - } - - private static List<Issue> searchUnresolvedIssues(String projectKey) { - return searchIssues(IssueQuery.create().componentRoots(projectKey).resolved(true)); - } - - private static List<Issue> searchResolvedIssues(String projectKey) { - return searchIssues(IssueQuery.create().componentRoots(projectKey).resolved(false)); - } - - private static int countModuleIssues(List<Issue> issues) { - int count = 0; - for (Issue issue : issues) { - if (issue.ruleKey().equals("xoo:OneIssuePerModule")) { - count++; - } - } - return count; - } - - private static int countIssuesBeforeLine5(List<Issue> issues) { - int count = 0; - for (Issue issue : issues) { - if (issue.line() != null && issue.line() < 5) { - count++; - } - } - return count; - } -} diff --git a/it/it-tests/src/test/java/it/issue/IssueFilterOnCommonRulesTest.java b/it/it-tests/src/test/java/it/issue/IssueFilterOnCommonRulesTest.java deleted file mode 100644 index 0c2e5a48f98..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueFilterOnCommonRulesTest.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.util.List; -import org.apache.commons.lang.ArrayUtils; -import org.junit.Before; -import org.junit.Test; -import org.sonarqube.ws.Issues; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.issue.SearchWsRequest; -import util.ItUtils; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.runProjectAnalysis; -import static util.ItUtils.setServerProperties; - -public class IssueFilterOnCommonRulesTest extends AbstractIssueTest { - - private static WsClient adminWsClient; - - private static final String PROJECT_KEY = "common-rules-project"; - private static final String PROJECT_DIR = "issue/common-rules"; - - private static final String FILE_KEY = "common-rules-project:src/Sample.xoo"; - - @Before - public void resetData() { - ORCHESTRATOR.resetData(); - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/IssueFilterOnCommonRulesTest/xoo-common-rules-profile.xml")); - ORCHESTRATOR.getServer().provisionProject(PROJECT_KEY, "Sample"); - ORCHESTRATOR.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "xoo-common-rules"); - - adminWsClient = newAdminWsClient(ORCHESTRATOR); - } - - @Test - public void ignore_all() { - executeAnalysis("sonar.issue.ignore.multicriteria", "1", - "sonar.issue.ignore.multicriteria.1.ruleKey", "*", - "sonar.issue.ignore.multicriteria.1.resourceKey", "**/*.xoo"); - - assertThat(findAllIssues()).hasSize(0); - } - - @Test - public void ignore_some_rule_and_file() { - executeAnalysis( - "sonar.issue.ignore.multicriteria", "1,2", - "sonar.issue.ignore.multicriteria.1.ruleKey", "common-xoo:DuplicatedBlocks", - "sonar.issue.ignore.multicriteria.1.resourceKey", "**/Sample.xoo", - "sonar.issue.ignore.multicriteria.2.ruleKey", "common-xoo:SkippedUnitTests", - "sonar.issue.ignore.multicriteria.2.resourceKey", "**/SampleTest.xoo"); - - assertThat(findAllIssues()).hasSize(4); - assertThat(findIssuesByRuleKey("common-xoo:DuplicatedBlocks")).isEmpty(); - assertThat(findIssuesByRuleKey("common-xoo:SkippedUnitTests")).isEmpty(); - } - - @Test - public void enforce_one_file() { - executeAnalysis( - "sonar.issue.enforce.multicriteria", "1", - "sonar.issue.enforce.multicriteria.1.ruleKey", "*", - // Only issues on this file will be accepted - "sonar.issue.enforce.multicriteria.1.resourceKey", "**/Sample.xoo"); - - assertThat(findAllIssues()).hasSize(4); - } - - @Test - public void enforce_on_rules() { - executeAnalysis( - "sonar.issue.enforce.multicriteria", "1,2", - "sonar.issue.enforce.multicriteria.1.ruleKey", "common-xoo:DuplicatedBlocks", - "sonar.issue.enforce.multicriteria.1.resourceKey", "**/Sample.xoo", - // This rule should only be applied on a file that do not exist => no issue for this rule - "sonar.issue.enforce.multicriteria.2.ruleKey", "common-xoo:InsufficientCommentDensity", - "sonar.issue.enforce.multicriteria.2.resourceKey", "**/OtherFile.xoo"); - - assertThat(findAllIssues()).hasSize(5); - assertThat(findIssuesByRuleKey("common-xoo:DuplicatedBlocks")).hasSize(1); - assertThat(findIssuesByRuleKey("common-xoo:InsufficientCommentDensity")).isEmpty(); - } - - private void executeAnalysis(String... serverProperties) { - String[] cpdProperties = new String[] { - "sonar.cpd.xoo.minimumTokens", "2", - "sonar.cpd.xoo.minimumLines", "2" - }; - setServerProperties(ORCHESTRATOR, PROJECT_KEY, (String[]) ArrayUtils.addAll(serverProperties, cpdProperties)); - runProjectAnalysis(ORCHESTRATOR, PROJECT_DIR); - } - - private List<Issues.Issue> findIssuesByRuleKey(String ruleKey) { - return adminWsClient.issues().search( - new SearchWsRequest() - .setComponents(singletonList(FILE_KEY)) - .setRules(singletonList(ruleKey))) - .getIssuesList(); - } - - private List<Issues.Issue> findAllIssues() { - return adminWsClient.issues().search(new SearchWsRequest()).getIssuesList(); - } - -} diff --git a/it/it-tests/src/test/java/it/issue/IssueFilterTest.java b/it/it-tests/src/test/java/it/issue/IssueFilterTest.java deleted file mode 100644 index 1e848f6d55c..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueFilterTest.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.util.Map; -import org.junit.Before; -import org.junit.Test; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; -import static util.ItUtils.runProjectAnalysis; -import static util.ItUtils.setServerProperties; - -public class IssueFilterTest extends AbstractIssueTest { - - private static final String PROJECT_KEY = "com.sonarsource.it.samples:multi-modules-exclusions"; - private static final String PROJECT_DIR = "exclusions/xoo-multi-modules"; - - @Before - public void resetData() { - ORCHESTRATOR.resetData(); - - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/IssueFilterTest/with-many-rules.xml")); - ORCHESTRATOR.getServer().provisionProject(PROJECT_KEY, "project"); - ORCHESTRATOR.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "with-many-rules"); - } - - @Test - public void ignore_all_files() { - executeAnalysis( - "sonar.issue.ignore.multicriteria", "1", - "sonar.issue.ignore.multicriteria.1.resourceKey", "**/*.xoo", - "sonar.issue.ignore.multicriteria.1.ruleKey", "*"); - - checkIssueCountBySeverity(4, 0, 0, 4); - } - - @Test - public void enforce_only_on_one_file() { - executeAnalysis( - "sonar.issue.enforce.multicriteria", "1", - "sonar.issue.enforce.multicriteria.1.resourceKey", "**/HelloA1.xoo", - "sonar.issue.enforce.multicriteria.1.ruleKey", "*"); - - checkIssueCountBySeverity( - 1 /* tag */ + 18 /* lines in HelloA1.xoo */ + 1 /* file */, - 0 + 1, - 0, - 0); - } - - @Test - public void enforce_on_two_files_with_same_rule() { - executeAnalysis( - "sonar.issue.enforce.multicriteria", "1,2", - "sonar.issue.enforce.multicriteria.1.resourceKey", "**/HelloA1.xoo", - "sonar.issue.enforce.multicriteria.1.ruleKey", "*", - "sonar.issue.enforce.multicriteria.2.resourceKey", "**/HelloA2.xoo", - "sonar.issue.enforce.multicriteria.2.ruleKey", "*"); - - checkIssueCountBySeverity( - 2 /* tags */ + 18 /* lines in HelloA1.xoo */ + 15 /* lines in HelloA2.xoo */ + 2 /* files */, - 0 + 2, - 0, - 0); - } - - @Test - public void enforce_on_two_files_with_different_rules() { - executeAnalysis( - "sonar.issue.enforce.multicriteria", "1,2", - "sonar.issue.enforce.multicriteria.1.resourceKey", "**/HelloA1.xoo", - "sonar.issue.enforce.multicriteria.1.ruleKey", "xoo:OneIssuePerLine", - "sonar.issue.enforce.multicriteria.2.resourceKey", "**/HelloA2.xoo", - "sonar.issue.enforce.multicriteria.2.ruleKey", "xoo:HasTag"); - - checkIssueCountBySeverity( - 1 /* tag in HelloA2 */ + 18 /* lines in HelloA1.xoo */ + 4 /* files */ + 4 /* modules */, - 4, - 0, - 4); - } - - private void executeAnalysis(String... serverProperties) { - setServerProperties(ORCHESTRATOR, PROJECT_KEY, serverProperties); - runProjectAnalysis(ORCHESTRATOR, PROJECT_DIR); - } - - private void checkIssueCountBySeverity(int total, int perFile, int perCommonRule, int perModule) { - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(ORCHESTRATOR, PROJECT_KEY, "violations", "major_violations", "blocker_violations", "critical_violations"); - assertThat(measures.get("violations").intValue()).isEqualTo(total); - assertThat(measures.get("major_violations").intValue()).isEqualTo(perFile); // One per file - assertThat(measures.get("blocker_violations").intValue()).isEqualTo(perCommonRule); // On per common rule - assertThat(measures.get("critical_violations").intValue()).isEqualTo(perModule); // One per module - } - -} diff --git a/it/it-tests/src/test/java/it/issue/IssueMeasureTest.java b/it/it-tests/src/test/java/it/issue/IssueMeasureTest.java deleted file mode 100644 index 47860b72875..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueMeasureTest.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.util.List; -import java.util.Map; -import org.junit.Before; -import org.junit.Test; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueQuery; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; -import static util.ItUtils.runProjectAnalysis; - -public class IssueMeasureTest extends AbstractIssueTest { - - private static final String MULTI_MODULE_SAMPLE_PROJECT_KEY = "com.sonarsource.it.samples:multi-modules-sample"; - private static final String SAMPLE_PROJECT_KEY = "sample"; - - @Before - public void resetData() { - ORCHESTRATOR.resetData(); - } - - @Test - public void issues_by_severity_measures() { - ORCHESTRATOR.getServer().provisionProject(MULTI_MODULE_SAMPLE_PROJECT_KEY, MULTI_MODULE_SAMPLE_PROJECT_KEY); - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/with-many-rules.xml")); - ORCHESTRATOR.getServer().associateProjectToQualityProfile(MULTI_MODULE_SAMPLE_PROJECT_KEY, "xoo", "with-many-rules"); - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-multi-modules-sample"); - - assertThat(search(IssueQuery.create().componentRoots(MULTI_MODULE_SAMPLE_PROJECT_KEY)).paging().total()).isEqualTo(136); - - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(ORCHESTRATOR, MULTI_MODULE_SAMPLE_PROJECT_KEY, "violations", "info_violations", "minor_violations", - "major_violations", - "blocker_violations", "critical_violations"); - assertThat(measures.get("violations")).isEqualTo(136); - assertThat(measures.get("info_violations")).isEqualTo(2); - assertThat(measures.get("minor_violations")).isEqualTo(61); - assertThat(measures.get("major_violations")).isEqualTo(65); - assertThat(measures.get("blocker_violations")).isEqualTo(4); - assertThat(measures.get("critical_violations")).isEqualTo(4); - } - - /** - * SONAR-4330 - * SONAR-7555 - */ - @Test - public void issues_by_resolution_and_status_measures() { - ORCHESTRATOR.getServer().provisionProject(SAMPLE_PROJECT_KEY, SAMPLE_PROJECT_KEY); - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/one-issue-per-line-profile.xml")); - ORCHESTRATOR.getServer().associateProjectToQualityProfile(SAMPLE_PROJECT_KEY, "xoo", "one-issue-per-line-profile"); - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample"); - - List<Issue> issues = searchIssuesByProject(SAMPLE_PROJECT_KEY); - assertThat(issues).hasSize(17); - - // 1 is a false-positive, 1 is a won't fix, 1 is confirmed, 1 is reopened, and the remaining ones stays open - adminIssueClient().doTransition(issues.get(0).key(), "falsepositive"); - adminIssueClient().doTransition(issues.get(1).key(), "wontfix"); - adminIssueClient().doTransition(issues.get(2).key(), "confirm"); - adminIssueClient().doTransition(issues.get(3).key(), "resolve"); - adminIssueClient().doTransition(issues.get(3).key(), "reopen"); - - // Re analyze the project to compute measures - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample"); - - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(ORCHESTRATOR, SAMPLE_PROJECT_KEY, "false_positive_issues", "wont_fix_issues", "open_issues", "reopened_issues", - "confirmed_issues"); - assertThat(measures.get("false_positive_issues")).isEqualTo(1); - assertThat(measures.get("wont_fix_issues")).isEqualTo(1); - assertThat(measures.get("open_issues")).isEqualTo(13); - assertThat(measures.get("reopened_issues")).isEqualTo(1); - assertThat(measures.get("confirmed_issues")).isEqualTo(1); - } - - @Test - public void no_issue_are_computed_on_empty_profile() { - ORCHESTRATOR.getServer().provisionProject(SAMPLE_PROJECT_KEY, SAMPLE_PROJECT_KEY); - - // no active rules - ORCHESTRATOR.getServer().associateProjectToQualityProfile(SAMPLE_PROJECT_KEY, "xoo", "empty"); - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample"); - - assertThat(searchIssuesByProject(SAMPLE_PROJECT_KEY)).isEmpty(); - - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(ORCHESTRATOR, SAMPLE_PROJECT_KEY, "violations", "blocker_violations"); - assertThat(measures.get("violations")).isEqualTo(0); - assertThat(measures.get("blocker_violations")).isEqualTo(0); - } - - /** - * SONAR-3746 - */ - @Test - public void issues_measures_on_test_files() { - String projectKey = "sample-with-tests"; - String testKey = "sample-with-tests:src/test/xoo/sample/SampleTest.xoo"; - - ORCHESTRATOR.getServer().provisionProject(projectKey, projectKey); - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/one-issue-per-file-profile.xml")); - ORCHESTRATOR.getServer().associateProjectToQualityProfile(projectKey, "xoo", "one-issue-per-file-profile"); - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample-with-tests"); - - // Store current number of issues - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(ORCHESTRATOR, testKey, "violations"); - assertThat(measures.get("violations")).isEqualTo(1); - } - -} diff --git a/it/it-tests/src/test/java/it/issue/IssueNotificationsTest.java b/it/it-tests/src/test/java/it/issue/IssueNotificationsTest.java deleted file mode 100644 index a77a85b7bd3..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueNotificationsTest.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.util.Iterator; -import javax.mail.internet.MimeMessage; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueClient; -import org.sonar.wsclient.issue.IssueQuery; -import org.sonar.wsclient.issue.Issues; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.issue.BulkChangeRequest; -import org.sonarqube.ws.client.issue.IssuesService; -import org.subethamail.wiser.Wiser; -import org.subethamail.wiser.WiserMessage; -import util.ItUtils; -import util.user.UserRule; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.newUserWsClient; -import static util.ItUtils.resetEmailSettings; -import static util.ItUtils.runProjectAnalysis; -import static util.ItUtils.setServerProperty; - -public class IssueNotificationsTest extends AbstractIssueTest { - - private final static String PROJECT_KEY = "sample"; - private final static String USER_LOGIN = "tester"; - private final static String USER_PASSWORD = "tester"; - private static final String USER_EMAIL = "tester@example.org"; - - private static Wiser smtpServer; - - private IssueClient issueClient; - - private IssuesService issuesService; - - @ClassRule - public static UserRule userRule = UserRule.from(ORCHESTRATOR); - - @BeforeClass - public static void before() throws Exception { - smtpServer = new Wiser(0); - smtpServer.start(); - System.out.println("SMTP Server port: " + smtpServer.getServer().getPort()); - - // Configure Sonar - resetEmailSettings(ORCHESTRATOR); - setServerProperty(ORCHESTRATOR, "email.smtp_host.secured", "localhost"); - setServerProperty(ORCHESTRATOR, "email.smtp_port.secured", Integer.toString(smtpServer.getServer().getPort())); - - // Send test email to the test user - newAdminWsClient(ORCHESTRATOR).wsConnector().call(new PostRequest("api/emails/send") - .setParam("to", USER_EMAIL) - .setParam("message", "This is a test message from SonarQube")) - .failIfNotSuccessful(); - - // We need to wait until all notifications will be delivered - waitUntilAllNotificationsAreDelivered(1); - - Iterator<WiserMessage> emails = smtpServer.getMessages().iterator(); - - MimeMessage message = emails.next().getMimeMessage(); - assertThat(message.getHeader("To", null)).isEqualTo("<" + USER_EMAIL + ">"); - assertThat((String) message.getContent()).contains("This is a test message from SonarQube"); - - assertThat(emails.hasNext()).isFalse(); - } - - @AfterClass - public static void stop() { - if (smtpServer != null) { - smtpServer.stop(); - } - userRule.deactivateUsers(USER_LOGIN); - setServerProperty(ORCHESTRATOR, "sonar.issues.defaultAssigneeLogin", null); - resetEmailSettings(ORCHESTRATOR); - } - - @Before - public void prepare() { - ORCHESTRATOR.resetData(); - - // Create test user - userRule.createUser(USER_LOGIN, "Tester", USER_EMAIL, USER_LOGIN); - - smtpServer.getMessages().clear(); - issueClient = ORCHESTRATOR.getServer().adminWsClient().issueClient(); - issuesService = newAdminWsClient(ORCHESTRATOR).issues(); - - setServerProperty(ORCHESTRATOR, "sonar.issues.defaultAssigneeLogin", null); - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/one-issue-per-line-profile.xml")); - ORCHESTRATOR.getServer().provisionProject(PROJECT_KEY, "Sample"); - ORCHESTRATOR.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "one-issue-per-line-profile"); - - // Add notifications to the test user - WsClient wsClient = newUserWsClient(ORCHESTRATOR, USER_LOGIN, USER_PASSWORD); - wsClient.wsConnector().call(new PostRequest("api/notifications/add") - .setParam("type", "NewIssues") - .setParam("channel", "EmailNotificationChannel")) - .failIfNotSuccessful(); - wsClient.wsConnector().call(new PostRequest("api/notifications/add") - .setParam("type", "ChangesOnMyIssue") - .setParam("channel", "EmailNotificationChannel")) - .failIfNotSuccessful(); - wsClient.wsConnector().call(new PostRequest("api/notifications/add") - .setParam("type", "SQ-MyNewIssues") - .setParam("channel", "EmailNotificationChannel")) - .failIfNotSuccessful(); - - } - - @Test - public void notifications_for_new_issues_and_issue_changes() throws Exception { - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample", "sonar.projectDate", "2015-12-15"); - - // change assignee - Issues issues = issueClient.find(IssueQuery.create().componentRoots(PROJECT_KEY)); - Issue issue = issues.list().get(0); - issueClient.assign(issue.key(), USER_LOGIN); - - waitUntilAllNotificationsAreDelivered(2); - - Iterator<WiserMessage> emails = smtpServer.getMessages().iterator(); - - assertThat(emails.hasNext()).isTrue(); - MimeMessage message = emails.next().getMimeMessage(); - assertThat(message.getHeader("To", null)).isEqualTo("<tester@example.org>"); - assertThat((String) message.getContent()).contains("Sample"); - assertThat((String) message.getContent()).contains("17 new issues (new debt: 17min)"); - assertThat((String) message.getContent()).contains("Severity"); - assertThat((String) message.getContent()).contains("One Issue Per Line (xoo): 17"); - assertThat((String) message.getContent()).contains( - "See it in SonarQube: http://localhost:9000/project/issues?id=sample&createdAt=2015-12-15T00%3A00%3A00%2B"); - - assertThat(emails.hasNext()).isTrue(); - message = emails.next().getMimeMessage(); - assertThat(message.getHeader("To", null)).isEqualTo("<tester@example.org>"); - assertThat((String) message.getContent()).contains("sample/Sample.xoo"); - assertThat((String) message.getContent()).contains("Assignee changed to Tester"); - assertThat((String) message.getContent()).contains( - "See it in SonarQube: http://localhost:9000/project/issues?id=sample&issues=" + issue.key() + "&open=" + issue.key()); - - assertThat(emails.hasNext()).isFalse(); - } - - @Test - public void notifications_for_personalized_emails() throws Exception { - setServerProperty(ORCHESTRATOR, "sonar.issues.defaultAssigneeLogin", USER_LOGIN); - runProjectAnalysis(ORCHESTRATOR, "issue/xoo-with-scm", "sonar.scm.provider", "xoo", "sonar.scm.disabled", "false"); - - waitUntilAllNotificationsAreDelivered(2); - - Iterator<WiserMessage> emails = smtpServer.getMessages().iterator(); - emails.next(); - // the second email sent is the personalized one - MimeMessage message = emails.next().getMimeMessage(); - - assertThat(message.getHeader("To", null)).isEqualTo("<tester@example.org>"); - assertThat(message.getSubject()).contains("You have 13 new issues"); - } - - /** - * SONAR-4606 - */ - @Test - public void notifications_for_bulk_change_ws() throws Exception { - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample", "sonar.projectDate", "2015-12-15"); - - Issues issues = issueClient.find(IssueQuery.create().componentRoots(PROJECT_KEY)); - Issue issue = issues.list().get(0); - - // bulk change without notification by default - issuesService.bulkChange(BulkChangeRequest.builder() - .setIssues(singletonList(issue.key())) - .setAssign(USER_LOGIN) - .setSetSeverity("MINOR") - .build()); - - // bulk change with notification - issuesService.bulkChange(BulkChangeRequest.builder() - .setIssues(singletonList(issue.key())) - .setSetSeverity("BLOCKER") - .setSendNotifications(true) - .build()); - - waitUntilAllNotificationsAreDelivered(2); - - Iterator<WiserMessage> emails = smtpServer.getMessages().iterator(); - - emails.next(); - MimeMessage message = emails.next().getMimeMessage(); - assertThat(message.getHeader("To", null)).isEqualTo("<tester@example.org>"); - assertThat((String) message.getContent()).contains("sample/Sample.xoo"); - assertThat((String) message.getContent()).contains("Severity: BLOCKER (was MINOR)"); - assertThat((String) message.getContent()).contains( - "See it in SonarQube: http://localhost:9000/project/issues?id=sample&issues=" + issue.key() + "&open=" + issue.key()); - - assertThat(emails.hasNext()).isFalse(); - } - - private static void waitUntilAllNotificationsAreDelivered(int expectedNumberOfEmails) throws InterruptedException { - for (int i = 0; i < 10; i++) { - if (smtpServer.getMessages().size() == expectedNumberOfEmails) { - break; - } - Thread.sleep(1_000); - } - } - -} diff --git a/it/it-tests/src/test/java/it/issue/IssuePurgeTest.java b/it/it-tests/src/test/java/it/issue/IssuePurgeTest.java deleted file mode 100644 index c230d918e67..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssuePurgeTest.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.util.List; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueQuery; -import org.sonar.wsclient.issue.Issues; -import util.ProjectAnalysis; -import util.ProjectAnalysisRule; - -import static org.assertj.core.api.Assertions.assertThat; - -public class IssuePurgeTest extends AbstractIssueTest { - - @Rule - public final ProjectAnalysisRule projectAnalysisRule = ProjectAnalysisRule.from(ORCHESTRATOR); - - private ProjectAnalysis xooSampleAnalysis; - private ProjectAnalysis xooMultiModuleAnalysis; - - @Before - public void setUp() throws Exception { - String manyRulesProfile = projectAnalysisRule.registerProfile("/issue/IssuePurgeTest/with-many-rules.xml"); - String xooSampleProjectKey = projectAnalysisRule.registerProject("shared/xoo-sample"); - this.xooSampleAnalysis = projectAnalysisRule.newProjectAnalysis(xooSampleProjectKey) - .withQualityProfile(manyRulesProfile); - String xooMultiModuleProjectKey = projectAnalysisRule.registerProject("shared/xoo-multi-modules-sample"); - this.xooMultiModuleAnalysis = projectAnalysisRule.newProjectAnalysis(xooMultiModuleProjectKey) - .withQualityProfile(manyRulesProfile); - } - - /** - * SONAR-4308 - */ - @Test - public void purge_old_closed_issues() throws Exception { - projectAnalysisRule.setServerProperty("sonar.dbcleaner.daysBeforeDeletingClosedIssues", "5000"); - - // Generate some issues - xooSampleAnalysis.withProperties( - "sonar.dynamicAnalysis", "false", - "sonar.projectDate", "2014-10-01") - .run(); - - // All the issues are open - List<Issue> issuesList = searchIssues(); - for (Issue issue : issuesList) { - assertThat(issue.resolution()).isNull(); - } - - // Second scan with empty profile -> all issues are resolved and closed - // -> Not deleted because less than 5000 days long - xooSampleAnalysis - .withXooEmptyProfile() - .withProperties( - "sonar.dynamicAnalysis", "false", - "sonar.projectDate", "2014-10-15") - .run(); - issuesList = searchIssues(); - assertThat(issuesList).isNotEmpty(); - for (Issue issue : issuesList) { - assertThat(issue.resolution()).isNotNull(); - assertThat(issue.status()).isEqualTo("CLOSED"); - } - - // Third scan -> closed issues are deleted - projectAnalysisRule.setServerProperty("sonar.dbcleaner.daysBeforeDeletingClosedIssues", "1"); - - xooSampleAnalysis.withXooEmptyProfile() - .withProperties( - "sonar.dynamicAnalysis", "false", - "sonar.projectDate", "2014-10-20") - .run(); - Issues issues = issueClient().find(IssueQuery.create()); - assertThat(issues.list()).isEmpty(); - assertThat(issues.paging().total()).isZero(); - } - - /** - * SONAR-7108 - */ - @Test - public void purge_old_closed_issues_when_zero_closed_issues_wanted() throws Exception { - projectAnalysisRule.setServerProperty("sonar.dbcleaner.daysBeforeDeletingClosedIssues", "5000"); - - // Generate some issues - xooSampleAnalysis.withProperties( - "sonar.dynamicAnalysis", "false", - "sonar.projectDate", "2014-10-01") - .run(); - - // All the issues are open - List<Issue> issueList = searchIssues(); - for (Issue issue : issueList) { - assertThat(issue.resolution()).isNull(); - } - - // Second scan with empty profile -> all issues are resolved and closed - // -> Not deleted because less than 5000 days long - xooSampleAnalysis - .withXooEmptyProfile() - .withProperties( - "sonar.dynamicAnalysis", "false", - "sonar.projectDate", "2014-10-15") - .run(); - issueList = searchIssues(); - assertThat(issueList).isNotEmpty(); - for (Issue issue : issueList) { - assertThat(issue.resolution()).isNotNull(); - assertThat(issue.status()).isEqualTo("CLOSED"); - } - - // Third scan -> closed issues are deleted - projectAnalysisRule.setServerProperty("sonar.dbcleaner.daysBeforeDeletingClosedIssues", "0"); - - xooSampleAnalysis.withXooEmptyProfile() - .withProperties( - "sonar.dynamicAnalysis", "false", - "sonar.projectDate", "2014-10-20") - .run(); - - Issues issues = issueClient().find(IssueQuery.create()); - assertThat(issues.list()).isEmpty(); - assertThat(issues.paging().total()).isZero(); - } - - /** - * SONAR-5200 - */ - @Test - public void resolve_issues_when_removing_module() throws Exception { - // Generate some issues - xooMultiModuleAnalysis - .withProperties("sonar.dynamicAnalysis", "false") - .run(); - - // All the issues are open - List<Issue> issues = searchIssues(); - for (Issue issue : issues) { - assertThat(issue.resolution()).isNull(); - } - Issue issue = issues.get(0); - - int issuesOnModuleB = searchIssues(IssueQuery.create().componentRoots("com.sonarsource.it.samples:multi-modules-sample:module_b")).size(); - assertThat(issuesOnModuleB).isEqualTo(28); - - // Second scan without module B -> issues on module B are resolved as removed and closed - xooMultiModuleAnalysis - .withProperties( - "sonar.dynamicAnalysis", "false", - "sonar.modules", "module_a") - .run(); - - // Resolved should should all be mark as REMOVED and affect to module b - List<Issue> reloadedIssues = searchIssues(IssueQuery.create().resolved(true)); - assertThat(reloadedIssues).hasSize(issuesOnModuleB); - for (Issue reloadedIssue : reloadedIssues) { - assertThat(reloadedIssue.resolution()).isEqualTo("FIXED"); - assertThat(reloadedIssue.status()).isEqualTo("CLOSED"); - assertThat(reloadedIssue.componentKey()).contains("com.sonarsource.it.samples:multi-modules-sample:module_b"); - assertThat(reloadedIssue.updateDate().before(issue.updateDate())).isFalse(); - assertThat(reloadedIssue.closeDate()).isNotNull(); - assertThat(reloadedIssue.closeDate().before(reloadedIssue.creationDate())).isFalse(); - } - } -} diff --git a/it/it-tests/src/test/java/it/issue/IssueSearchTest.java b/it/it-tests/src/test/java/it/issue/IssueSearchTest.java deleted file mode 100644 index a0fd5dd81c3..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueSearchTest.java +++ /dev/null @@ -1,277 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; -import org.apache.commons.lang.time.DateUtils; -import org.assertj.core.api.Fail; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.sonar.wsclient.base.HttpException; -import org.sonar.wsclient.base.Paging; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueQuery; -import org.sonar.wsclient.issue.Issues; -import org.sonarqube.ws.Common; -import org.sonarqube.ws.client.issue.SearchWsRequest; -import util.ItUtils; - -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.sonarqube.ws.Issues.SearchWsResponse; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.runProjectAnalysis; -import static util.ItUtils.setServerProperty; -import static util.ItUtils.toDate; - -public class IssueSearchTest extends AbstractIssueTest { - - private static final String PROJECT_KEY = "com.sonarsource.it.samples:multi-modules-sample"; - private static final String PROJECT_KEY2 = "com.sonarsource.it.samples:multi-modules-sample2"; - - private static int DEFAULT_PAGINATED_RESULTS = 100; - private static int TOTAL_NB_ISSUES = 272; - - @BeforeClass - public static void prepareData() { - ORCHESTRATOR.resetData(); - - ItUtils.restoreProfile(ORCHESTRATOR, IssueSearchTest.class.getResource("/issue/with-many-rules.xml")); - - // Launch 2 analysis to have more than 100 issues in total - ORCHESTRATOR.getServer().provisionProject(PROJECT_KEY, PROJECT_KEY); - ORCHESTRATOR.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "with-many-rules"); - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-multi-modules-sample"); - - ORCHESTRATOR.getServer().provisionProject(PROJECT_KEY2, PROJECT_KEY2); - ORCHESTRATOR.getServer().associateProjectToQualityProfile(PROJECT_KEY2, "xoo", "with-many-rules"); - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-multi-modules-sample", "sonar.projectKey", PROJECT_KEY2); - - // Assign a issue to test search by assignee - adminIssueClient().assign(searchRandomIssue().key(), "admin"); - - // Resolve a issue to test search by status and by resolution - adminIssueClient().doTransition(searchRandomIssue().key(), "resolve"); - } - - @Before - public void resetProperties() throws Exception { - setServerProperty(ORCHESTRATOR, "sonar.forceAuthentication", "false"); - } - - @Test - public void search_all_issues() { - assertThat(search(IssueQuery.create()).list()).hasSize(DEFAULT_PAGINATED_RESULTS); - } - - @Test - public void search_issues_by_component_roots() { - assertThat(search(IssueQuery.create().componentRoots("com.sonarsource.it.samples:multi-modules-sample")).list()).hasSize(DEFAULT_PAGINATED_RESULTS); - assertThat(search(IssueQuery.create().componentRoots("com.sonarsource.it.samples:multi-modules-sample:module_a")).list()).hasSize(82); - assertThat(search(IssueQuery.create().componentRoots("com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1")).list()).hasSize(36); - - assertThat(search(IssueQuery.create().componentRoots("unknown")).list()).isEmpty(); - } - - @Test - public void search_issues_by_components() { - assertThat( - search(IssueQuery.create().components("com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo")).list()) - .hasSize(34); - assertThat(search(IssueQuery.create().components("unknown")).list()).isEmpty(); - } - - @Test - public void search_issues_by_severities() { - assertThat(search(IssueQuery.create().severities("BLOCKER")).list()).hasSize(8); - assertThat(search(IssueQuery.create().severities("CRITICAL")).list()).hasSize(8); - assertThat(search(IssueQuery.create().severities("MAJOR")).list()).hasSize(DEFAULT_PAGINATED_RESULTS); - assertThat(search(IssueQuery.create().severities("MINOR")).list()).hasSize(DEFAULT_PAGINATED_RESULTS); - assertThat(search(IssueQuery.create().severities("INFO")).list()).hasSize(4); - } - - @Test - public void search_issues_by_statuses() { - assertThat(search(IssueQuery.create().statuses("OPEN")).list()).hasSize(DEFAULT_PAGINATED_RESULTS); - assertThat(search(IssueQuery.create().statuses("RESOLVED")).list()).hasSize(1); - assertThat(search(IssueQuery.create().statuses("CLOSED")).list()).isEmpty(); - } - - @Test - public void search_issues_by_resolutions() { - assertThat(search(IssueQuery.create().resolutions("FIXED")).list()).hasSize(1); - assertThat(search(IssueQuery.create().resolutions("FALSE-POSITIVE")).list()).isEmpty(); - assertThat(search(IssueQuery.create().resolved(true)).list()).hasSize(1); - assertThat(search(IssueQuery.create().resolved(false)).paging().total()).isEqualTo(TOTAL_NB_ISSUES - 1); - } - - @Test - public void search_issues_by_assignees() { - assertThat(search(IssueQuery.create().assignees("admin")).list()).hasSize(1); - assertThat(search(IssueQuery.create().assignees("unknown")).list()).isEmpty(); - assertThat(search(IssueQuery.create().assigned(true)).list()).hasSize(1); - assertThat(search(IssueQuery.create().assigned(false)).paging().total()).isEqualTo(TOTAL_NB_ISSUES - 1); - } - - @Test - public void search_issues_by_rules() { - assertThat(search(IssueQuery.create().rules("xoo:OneIssuePerLine")).list()).hasSize(DEFAULT_PAGINATED_RESULTS); - assertThat(search(IssueQuery.create().rules("xoo:OneIssuePerFile")).list()).hasSize(8); - - try { - search(IssueQuery.create().rules("unknown")); - Assert.fail(); - } catch (org.sonar.wsclient.base.HttpException e) { - assertThat(e.status()).isEqualTo(400); - } - } - - /** - * SONAR-2981 - */ - @Test - public void search_issues_by_dates() { - // issues have been created today - Date today = toDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date())); - Date past = toDate("2013-01-01"); - Date future = toDate("2020-12-31"); - - // createdAfter in the future => bad request - try { - search(IssueQuery.create().createdAfter(future)).list(); - Fail.fail("Expecting 400 from issues search WS"); - } catch (HttpException exception) { - assertThat(exception.getMessage()).contains("Start bound cannot be in the future"); - } - - // after date - assertThat(search(IssueQuery.create().createdAfter(today)).list().size()).isGreaterThan(0); - assertThat(search(IssueQuery.create().createdAfter(past)).list().size()).isGreaterThan(0); - - // before - assertThat(search(IssueQuery.create().createdBefore(future)).list().size()).isGreaterThan(0); - assertThat(search(IssueQuery.create().createdBefore(past)).list()).isEmpty(); - - // before and after - assertThat(search(IssueQuery.create().createdBefore(future).createdAfter(past)).list().size()).isGreaterThan(0); - - // createdAfter > createdBefore => bad request - try { - search(IssueQuery.create().createdBefore(past).createdAfter(today)).list(); - Fail.fail("Expecting 400 from issues search WS"); - } catch (HttpException exception) { - assertThat(exception.getMessage()).contains("Start bound cannot be larger or equal to end bound"); - } - - } - - /** - * SONAR-5132 - */ - @Test - public void search_issues_by_languages() { - assertThat(search(IssueQuery.create().languages("xoo")).list()).hasSize(DEFAULT_PAGINATED_RESULTS); - assertThat(search(IssueQuery.create().languages("foo")).list()).isEmpty(); - } - - @Test - public void paginate_results() { - Issues issues = search(IssueQuery.create().pageSize(20).pageIndex(2)); - - assertThat(issues.list()).hasSize(20); - Paging paging = issues.paging(); - assertThat(paging.pageIndex()).isEqualTo(2); - assertThat(paging.pageSize()).isEqualTo(20); - assertThat(paging.total()).isEqualTo(TOTAL_NB_ISSUES); - - // SONAR-3257 - // return max page size results when using negative page size value - assertThat(search(IssueQuery.create().pageSize(0)).list()).hasSize(TOTAL_NB_ISSUES); - assertThat(search(IssueQuery.create().pageSize(-1)).list()).hasSize(TOTAL_NB_ISSUES); - } - - @Test - public void sort_results() { - List<Issue> issues = search(IssueQuery.create().sort("SEVERITY").asc(false)).list(); - assertThat(issues.get(0).severity()).isEqualTo("BLOCKER"); - assertThat(issues.get(8).severity()).isEqualTo("CRITICAL"); - assertThat(issues.get(17).severity()).isEqualTo("MAJOR"); - } - - /** - * SONAR-4563 - */ - @Test - public void search_by_exact_creation_date() { - final Issue issue = search(IssueQuery.create()).list().get(0); - assertThat(issue.creationDate()).isNotNull(); - - // search the issue key with the same date - assertThat(search(IssueQuery.create().issues().issues(issue.key()).createdAt(issue.creationDate())).list()).hasSize(1); - - // search issue key with 1 second more and less should return nothing - assertThat(search(IssueQuery.create().issues().issues(issue.key()).createdAt(DateUtils.addSeconds(issue.creationDate(), 1))).size()).isEqualTo(0); - assertThat(search(IssueQuery.create().issues().issues(issue.key()).createdAt(DateUtils.addSeconds(issue.creationDate(), -1))).size()).isEqualTo(0); - - // search with future and past dates that do not match any issues - assertThat(search(IssueQuery.create().createdAt(toDate("2020-01-01"))).size()).isEqualTo(0); - assertThat(search(IssueQuery.create().createdAt(toDate("2010-01-01"))).size()).isEqualTo(0); - } - - @Test - public void return_issue_type() throws Exception { - List<org.sonarqube.ws.Issues.Issue> issues = searchByRuleKey("xoo:OneBugIssuePerLine"); - assertThat(issues).isNotEmpty(); - org.sonarqube.ws.Issues.Issue issue = issues.get(0); - assertThat(issue.getType()).isEqualTo(Common.RuleType.BUG); - - issues = searchByRuleKey("xoo:OneVulnerabilityIssuePerModule"); - assertThat(issues).isNotEmpty(); - issue = issues.get(0); - assertThat(issue.getType()).isEqualTo(Common.RuleType.VULNERABILITY); - - issues = searchByRuleKey("xoo:OneIssuePerLine"); - assertThat(issues).isNotEmpty(); - issue = issues.get(0); - assertThat(issue.getType()).isEqualTo(Common.RuleType.CODE_SMELL); - } - - @Test - public void search_issues_by_types() throws IOException { - assertThat(searchIssues(new SearchWsRequest().setTypes(singletonList("CODE_SMELL"))).getPaging().getTotal()).isEqualTo(142); - assertThat(searchIssues(new SearchWsRequest().setTypes(singletonList("BUG"))).getPaging().getTotal()).isEqualTo(122); - assertThat(searchIssues(new SearchWsRequest().setTypes(singletonList("VULNERABILITY"))).getPaging().getTotal()).isEqualTo(8); - } - - private List<org.sonarqube.ws.Issues.Issue> searchByRuleKey(String... ruleKey) throws IOException { - return searchIssues(new SearchWsRequest().setRules(asList(ruleKey))).getIssuesList(); - } - - private SearchWsResponse searchIssues(SearchWsRequest request) throws IOException { - return newAdminWsClient(ORCHESTRATOR).issues().search(request); - } - -} diff --git a/it/it-tests/src/test/java/it/issue/IssueTagsTest.java b/it/it-tests/src/test/java/it/issue/IssueTagsTest.java deleted file mode 100644 index f5563924b6d..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueTagsTest.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category6Suite; -import java.util.ArrayList; -import java.util.List; -import javax.annotation.Nullable; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Organizations.Organization; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import org.sonarqube.ws.client.issue.SearchWsRequest; -import org.sonarqube.ws.client.permission.AddUserWsRequest; -import org.sonarqube.ws.client.project.CreateRequest; -import util.ItUtils; - -import static java.util.Arrays.asList; -import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newProjectKey; -import static util.ItUtils.projectDir; -import static util.ItUtils.restoreProfile; - -/** - * Tests WS api/issues/tags - */ -public class IssueTagsTest { - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator); - - private Organization organization; - - @Before - public void setUp() { - organization = tester.organizations().generate(); - } - - @Test - public void getTags() { - restoreProfile(orchestrator, IssueTagsTest.class.getResource("/issue/one-issue-per-line-profile.xml"), organization.getKey()); - String projectKey = newProjectKey(); - tester.wsClient().projects().create( - CreateRequest.builder() - .setKey(projectKey) - .setOrganization(organization.getKey()) - .setName(randomAlphabetic(10)) - .setVisibility("private") - .build()); - analyzeProject(projectKey); - - String issue = tester.wsClient().issues().search(new SearchWsRequest()).getIssues(0).getKey(); - tester.wsClient().issues().setTags(issue, "bla", "blubb"); - - String[] publicTags = {"bad-practice", "convention", "pitfall"}; - String[] privateTags = {"bad-practice", "bla", "blubb", "convention", "pitfall"}; - String defaultOrganization = null; - - // anonymous must not see custom tags of private project - { - String anonymous = null; - assertTags(anonymous, organization.getKey(), publicTags); - assertTags(anonymous, defaultOrganization, publicTags); - } - - // stranger must not see custom tags of private project - { - User stranger = tester.users().generate(); - assertTags(stranger.getLogin(), organization.getKey(), publicTags); - assertTags(stranger.getLogin(), defaultOrganization, publicTags); - } - - // member with user permission must be able to see custom tags of private project, if he provides the organization parameter - { - User member = tester.users().generate(); - addMemberToOrganization(member); - grantUserPermission(projectKey, member); - assertTags(member.getLogin(), organization.getKey(), privateTags); - assertTags(member.getLogin(), defaultOrganization, publicTags); - } - } - - private void addMemberToOrganization(User member) { - tester.organizations().service().addMember(organization.getKey(), member.getLogin()); - } - - private void grantUserPermission(String projectKey, User member) { - tester.wsClient().permissions().addUser( - new AddUserWsRequest() - .setLogin(member.getLogin()) - .setPermission("user") - .setProjectKey(projectKey)); - } - - private void assertTags(@Nullable String userLogin, @Nullable String organization, String... expectedTags) { - assertThat( - (List<String>) ItUtils.jsonToMap( - tester.as(userLogin) - .wsClient() - .issues() - .getTags(organization) - .content()) - .get("tags")).containsExactly( - expectedTags); - } - - private void analyzeProject(String projectKey) { - List<String> keyValueProperties = new ArrayList<>(asList( - "sonar.projectKey", projectKey, - "sonar.organization", organization.getKey(), - "sonar.profile", "one-issue-per-line-profile", - "sonar.login", "admin", "sonar.password", "admin", - "sonar.scm.disabled", "false")); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"), keyValueProperties.toArray(new String[0]))); - } -} diff --git a/it/it-tests/src/test/java/it/issue/IssueTrackingTest.java b/it/it-tests/src/test/java/it/issue/IssueTrackingTest.java deleted file mode 100644 index a1e2e89ad11..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueTrackingTest.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; -import org.junit.Before; -import org.junit.Test; -import org.sonarqube.ws.Issues.Issue; -import org.sonarqube.ws.Issues.SearchWsResponse; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.issue.SearchWsRequest; -import util.ItUtils; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.runProjectAnalysis; -import static util.ItUtils.toDate; - -public class IssueTrackingTest extends AbstractIssueTest { - - private static final String SAMPLE_PROJECT_KEY = "sample"; - - private static final String OLD_DATE = "2014-03-01"; - private static final Date NEW_DATE = new Date(); - private static final String NEW_DATE_STR = new SimpleDateFormat("yyyy-MM-dd").format(NEW_DATE); - - private static WsClient adminClient; - - @Before - public void prepareData() { - ORCHESTRATOR.resetData(); - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/issue-on-tag-foobar.xml")); - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/IssueTrackingTest/one-issue-per-module-profile.xml")); - ORCHESTRATOR.getServer().provisionProject(SAMPLE_PROJECT_KEY, SAMPLE_PROJECT_KEY); - adminClient = newAdminWsClient(ORCHESTRATOR); - } - - @Test - public void close_issues_on_removed_components() throws Exception { - ORCHESTRATOR.getServer().associateProjectToQualityProfile(SAMPLE_PROJECT_KEY, "xoo", "issue-on-tag-foobar"); - - // version 1 - runProjectAnalysis(ORCHESTRATOR, "issue/xoo-tracking-v1", - "sonar.projectDate", OLD_DATE); - - List<Issue> issues = searchUnresolvedIssuesByComponent("sample:src/main/xoo/sample/Sample.xoo"); - assertThat(issues).hasSize(1); - - // version 2 - runProjectAnalysis(ORCHESTRATOR, "issue/xoo-tracking-v1", - "sonar.projectDate", NEW_DATE_STR, - "sonar.exclusions", "**/*.xoo"); - - issues = searchIssues(new SearchWsRequest().setProjectKeys(singletonList("sample"))).getIssuesList(); - assertThat(issues).hasSize(1); - assertThat(issues.get(0).getStatus()).isEqualTo("CLOSED"); - assertThat(issues.get(0).getResolution()).isEqualTo("FIXED"); - } - - /** - * SONAR-3072 - */ - @Test - public void track_issues_based_on_blocks_recognition() throws Exception { - ORCHESTRATOR.getServer().associateProjectToQualityProfile(SAMPLE_PROJECT_KEY, "xoo", "issue-on-tag-foobar"); - - // version 1 - ORCHESTRATOR.getServer().associateProjectToQualityProfile(SAMPLE_PROJECT_KEY, "xoo", "issue-on-tag-foobar"); - runProjectAnalysis(ORCHESTRATOR, "issue/xoo-tracking-v1", - "sonar.projectDate", OLD_DATE); - - List<Issue> issues = searchUnresolvedIssuesByComponent("sample:src/main/xoo/sample/Sample.xoo"); - assertThat(issues).hasSize(1); - Date issueDate = toDate(issues.iterator().next().getCreationDate()); - - // version 2 - runProjectAnalysis(ORCHESTRATOR, "issue/xoo-tracking-v2", - "sonar.projectDate", NEW_DATE_STR); - - issues = searchUnresolvedIssuesByComponent("sample:src/main/xoo/sample/Sample.xoo"); - assertThat(issues).hasSize(3); - - // issue created during the first scan and moved during the second scan - assertThat(toDate(getIssueOnLine(6, "xoo:HasTag", issues).getCreationDate())).isEqualTo(issueDate); - - // issues created during the second scan - assertThat(toDate(getIssueOnLine(10, "xoo:HasTag", issues).getCreationDate())).isAfter(issueDate); - assertThat(toDate(getIssueOnLine(14, "xoo:HasTag", issues).getCreationDate())).isAfter(issueDate); - } - - /** - * SONAR-4310 - */ - @Test - public void track_existing_unchanged_issues_on_module() throws Exception { - // The custom rule on module is enabled - - ORCHESTRATOR.getServer().associateProjectToQualityProfile(SAMPLE_PROJECT_KEY, "xoo", "one-issue-per-module"); - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample"); - - // Only one issue is created - assertThat(searchIssues(new SearchWsRequest()).getIssuesList()).hasSize(1); - Issue issue = getRandomIssue(); - - // Re analysis of the same project - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample"); - - // No new issue should be created - assertThat(searchIssues(new SearchWsRequest()).getIssuesList()).hasSize(1); - - // The issue on module should stay open and be the same from the first analysis - Issue reloadIssue = getIssueByKey(issue.getKey()); - assertThat(reloadIssue.getCreationDate()).isEqualTo(issue.getCreationDate()); - assertThat(reloadIssue.getStatus()).isEqualTo("OPEN"); - assertThat(reloadIssue.hasResolution()).isFalse(); - } - - /** - * SONAR-4310 - */ - @Test - public void track_existing_unchanged_issues_on_multi_modules() throws Exception { - // The custom rule on module is enabled - ORCHESTRATOR.getServer().provisionProject("com.sonarsource.it.samples:multi-modules-sample", "com.sonarsource.it.samples:multi-modules-sample"); - ORCHESTRATOR.getServer().associateProjectToQualityProfile("com.sonarsource.it.samples:multi-modules-sample", "xoo", "one-issue-per-module"); - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-multi-modules-sample"); - - // One issue by module are created - List<Issue> issues = searchIssues(new SearchWsRequest()).getIssuesList(); - assertThat(issues).hasSize(4); - - // Re analysis of the same project - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-multi-modules-sample"); - - // No new issue should be created - assertThat(searchIssues(new SearchWsRequest()).getIssuesList()).hasSize(issues.size()); - - // Issues on modules should stay open and be the same from the first analysis - for (Issue issue : issues) { - Issue reloadIssue = getIssueByKey(issue.getKey()); - assertThat(reloadIssue.getStatus()).isEqualTo("OPEN"); - assertThat(reloadIssue.hasResolution()).isFalse(); - assertThat(reloadIssue.getCreationDate()).isEqualTo(issue.getCreationDate()); - assertThat(reloadIssue.getUpdateDate()).isEqualTo(issue.getUpdateDate()); - } - } - - @Test - public void track_file_moves_based_on_identical_content() { - ORCHESTRATOR.getServer().associateProjectToQualityProfile(SAMPLE_PROJECT_KEY, "xoo", "issue-on-tag-foobar"); - - // version 1 - runProjectAnalysis(ORCHESTRATOR, "issue/xoo-tracking-v1", - "sonar.projectDate", OLD_DATE); - - List<Issue> issues = searchUnresolvedIssuesByComponent("sample:src/main/xoo/sample/Sample.xoo"); - assertThat(issues).hasSize(1); - Issue issueOnSample = issues.iterator().next(); - - // version 2 - runProjectAnalysis(ORCHESTRATOR, "issue/xoo-tracking-v3", - "sonar.projectDate", NEW_DATE_STR); - - assertThat(searchUnresolvedIssuesByComponent("sample:src/main/xoo/sample/Sample.xoo")).isEmpty(); - - issues = searchUnresolvedIssuesByComponent("sample:src/main/xoo/sample/Sample2.xoo"); - assertThat(issues).hasSize(1); - Issue issueOnSample2 = issues.get(0); - assertThat(issueOnSample2.getKey()).isEqualTo(issueOnSample.getKey()); - assertThat(issueOnSample2.getCreationDate()).isEqualTo(issueOnSample.getCreationDate()); - assertThat(issueOnSample2.getUpdateDate()).isNotEqualTo(issueOnSample.getUpdateDate()); - assertThat(issueOnSample2.getStatus()).isEqualTo("OPEN"); - } - - private Issue getIssueOnLine(int line, String rule, List<Issue> issues) { - return issues.stream() - .filter(issue -> issue.getRule().equals(rule)) - .filter(issue -> issue.getLine() == line) - .findFirst().orElseThrow(IllegalArgumentException::new); - } - - private List<Issue> searchUnresolvedIssuesByComponent(String componentKey) { - return searchIssues(new SearchWsRequest().setComponentKeys(singletonList(componentKey)).setResolved(false)).getIssuesList(); - } - - private static Issue getRandomIssue() { - return searchIssues(new SearchWsRequest()).getIssues(0); - } - - private static Issue getIssueByKey(String issueKey) { - SearchWsResponse search = searchIssues(new SearchWsRequest().setIssues(singletonList(issueKey))); - assertThat(search.getTotal()).isEqualTo(1); - return search.getIssues(0); - } - - private static SearchWsResponse searchIssues(SearchWsRequest request) { - return adminClient.issues().search(request); - } - -} diff --git a/it/it-tests/src/test/java/it/issue/IssueWorkflowTest.java b/it/it-tests/src/test/java/it/issue/IssueWorkflowTest.java deleted file mode 100644 index a0e366792cf..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssueWorkflowTest.java +++ /dev/null @@ -1,314 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import java.util.List; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.ws.Issues; -import org.sonarqube.ws.Issues.Issue; -import org.sonarqube.ws.client.issue.DoTransitionRequest; -import org.sonarqube.ws.client.issue.IssuesService; -import org.sonarqube.ws.client.issue.SearchWsRequest; -import util.ProjectAnalysis; -import util.ProjectAnalysisRule; -import util.issue.IssueRule; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.toDatetime; - -public class IssueWorkflowTest extends AbstractIssueTest { - - @Rule - public final ProjectAnalysisRule projectAnalysisRule = ProjectAnalysisRule.from(ORCHESTRATOR); - - @ClassRule - public static final IssueRule issueRule = IssueRule.from(ORCHESTRATOR); - - private ProjectAnalysis analysisWithIssues; - private ProjectAnalysis analysisWithoutIssues; - private IssuesService issuesService; - - private Issue issue; - - @Before - public void before() { - issuesService = newAdminWsClient(ORCHESTRATOR).issues(); - String oneIssuePerFileProfileKey = projectAnalysisRule.registerProfile("/issue/IssueWorkflowTest/xoo-one-issue-per-line-profile.xml"); - String analyzedProjectKey = projectAnalysisRule.registerProject("issue/workflow"); - analysisWithIssues = projectAnalysisRule.newProjectAnalysis(analyzedProjectKey).withQualityProfile(oneIssuePerFileProfileKey); - analysisWithoutIssues = analysisWithIssues.withXooEmptyProfile(); - analysisWithIssues.run(); - - issue = issueRule.getRandomIssue(); - } - - /** - * Issue on a disabled rule (uninstalled plugin or rule deactivated from quality profile) must - * be CLOSED with resolution REMOVED - */ - @Test - public void issue_is_closed_as_removed_when_rule_is_disabled() throws Exception { - SearchWsRequest ruleSearchRequest = new SearchWsRequest().setRules(singletonList("xoo:OneIssuePerLine")); - List<Issue> issues = issueRule.search(ruleSearchRequest).getIssuesList(); - assertThat(issues).isNotEmpty(); - - // re-analyze with profile "empty". The rule is disabled so the issues must be closed - analysisWithoutIssues.run(); - issues = issueRule.search(ruleSearchRequest).getIssuesList(); - assertThat(issues).isNotEmpty(); - for (Issue issue : issues) { - assertThat(issue.getStatus()).isEqualTo("CLOSED"); - assertThat(issue.getResolution()).isEqualTo("REMOVED"); - } - } - - /** - * SONAR-4329 - */ - @Test - public void user_should_confirm_issue() { - // mark as confirmed - issuesService.doTransition(new DoTransitionRequest(issue.getKey(), "confirm")); - - Issue confirmed = issueRule.getByKey(issue.getKey()); - assertThat(confirmed.getStatus()).isEqualTo("CONFIRMED"); - assertThat(confirmed.hasResolution()).isFalse(); - assertThat(confirmed.getCreationDate()).isEqualTo(issue.getCreationDate()); - - // user unconfirm the issue - assertThat(transitions(confirmed.getKey())).contains("unconfirm"); - issuesService.doTransition(new DoTransitionRequest(confirmed.getKey(), "unconfirm")); - - Issue unconfirmed = issueRule.getByKey(issue.getKey()); - assertThat(unconfirmed.getStatus()).isEqualTo("REOPENED"); - assertThat(unconfirmed.hasResolution()).isFalse(); - assertThat(unconfirmed.getCreationDate()).isEqualTo(confirmed.getCreationDate()); - } - - /** - * SONAR-4329 - */ - @Test - public void user_should_mark_as_false_positive_confirmed_issue() { - // mark as confirmed - issuesService.doTransition(new DoTransitionRequest(issue.getKey(), "confirm")); - - Issue confirmed = issueRule.getByKey(issue.getKey()); - assertThat(confirmed.getStatus()).isEqualTo("CONFIRMED"); - assertThat(confirmed.hasResolution()).isFalse(); - assertThat(confirmed.getCreationDate()).isEqualTo(issue.getCreationDate()); - - // user mark the issue as false-positive - assertThat(transitions(confirmed.getKey())).contains("falsepositive"); - issuesService.doTransition(new DoTransitionRequest(confirmed.getKey(), "falsepositive")); - - Issue falsePositive = issueRule.getByKey(issue.getKey()); - assertThat(falsePositive.getStatus()).isEqualTo("RESOLVED"); - assertThat(falsePositive.getResolution()).isEqualTo("FALSE-POSITIVE"); - assertThat(falsePositive.getCreationDate()).isEqualTo(confirmed.getCreationDate()); - } - - /** - * SONAR-4329 - */ - @Test - public void scan_should_close_no_more_existing_confirmed() { - // mark as confirmed - issuesService.doTransition(new DoTransitionRequest(issue.getKey(), "confirm")); - Issue falsePositive = issueRule.getByKey(issue.getKey()); - assertThat(falsePositive.getStatus()).isEqualTo("CONFIRMED"); - assertThat(falsePositive.hasResolution()).isFalse(); - assertThat(falsePositive.getCreationDate()).isEqualTo(issue.getCreationDate()); - - // scan without any rules -> confirmed is closed - analysisWithoutIssues.run(); - Issue closed = issueRule.getByKey(issue.getKey()); - assertThat(closed.getStatus()).isEqualTo("CLOSED"); - assertThat(closed.getResolution()).isEqualTo("REMOVED"); - assertThat(closed.getCreationDate()).isEqualTo(issue.getCreationDate()); - } - - /** - * SONAR-4288 - */ - @Test - public void scan_should_reopen_unresolved_issue_but_marked_as_resolved() { - // mark as resolved - issuesService.doTransition(new DoTransitionRequest(issue.getKey(), "resolve")); - Issue resolvedIssue = issueRule.getByKey(issue.getKey()); - assertThat(resolvedIssue.getStatus()).isEqualTo("RESOLVED"); - assertThat(resolvedIssue.getResolution()).isEqualTo("FIXED"); - assertThat(resolvedIssue.getCreationDate()).isEqualTo(issue.getCreationDate()); - - // re-execute scan, with the same Q profile -> the issue has not been fixed - analysisWithIssues.run(); - - // reload issue - Issue reopenedIssue = issueRule.getByKey(issue.getKey()); - - // the issue has been reopened - assertThat(reopenedIssue.getStatus()).isEqualTo("REOPENED"); - assertThat(reopenedIssue.hasResolution()).isFalse(); - assertThat(reopenedIssue.getCreationDate()).isEqualTo(issue.getCreationDate()); - assertThat(toDatetime(reopenedIssue.getUpdateDate())).isAfter(toDatetime(issue.getUpdateDate())); - } - - /** - * SONAR-4288 - */ - @Test - public void scan_should_close_resolved_issue() { - // mark as resolved - issuesService.doTransition(new DoTransitionRequest(issue.getKey(), "resolve")); - Issue resolvedIssue = issueRule.getByKey(issue.getKey()); - assertThat(resolvedIssue.getStatus()).isEqualTo("RESOLVED"); - assertThat(resolvedIssue.getResolution()).isEqualTo("FIXED"); - assertThat(resolvedIssue.getCreationDate()).isEqualTo(issue.getCreationDate()); - assertThat(resolvedIssue.hasCloseDate()).isFalse(); - - // re-execute scan without rules -> the issue is removed with resolution "REMOVED" - analysisWithoutIssues.run(); - - // reload issue - Issue closedIssue = issueRule.getByKey(issue.getKey()); - assertThat(closedIssue.getStatus()).isEqualTo("CLOSED"); - assertThat(closedIssue.getResolution()).isEqualTo("REMOVED"); - assertThat(closedIssue.getCreationDate()).isEqualTo(issue.getCreationDate()); - assertThat(toDatetime(closedIssue.getUpdateDate())).isAfter(toDatetime(resolvedIssue.getUpdateDate())); - assertThat(closedIssue.hasCloseDate()).isTrue(); - assertThat(toDatetime(closedIssue.getCloseDate())).isAfter(toDatetime(closedIssue.getCreationDate())); - } - - /** - * SONAR-4288 - */ - @Test - public void user_should_reopen_issue_marked_as_resolved() { - // user marks issue as resolved - issuesService.doTransition(new DoTransitionRequest(issue.getKey(), "resolve")); - Issue resolved = issueRule.getByKey(issue.getKey()); - assertThat(resolved.getStatus()).isEqualTo("RESOLVED"); - assertThat(resolved.getResolution()).isEqualTo("FIXED"); - assertThat(resolved.getCreationDate()).isEqualTo(issue.getCreationDate()); - - // user reopens the issue - assertThat(transitions(resolved.getKey())).contains("reopen"); - adminIssueClient().doTransition(resolved.getKey(), "reopen"); - - Issue reopened = issueRule.getByKey(resolved.getKey()); - assertThat(reopened.getStatus()).isEqualTo("REOPENED"); - assertThat(reopened.hasResolution()).isFalse(); - assertThat(reopened.getCreationDate()).isEqualTo(resolved.getCreationDate()); - } - - /** - * SONAR-4286 - */ - @Test - public void scan_should_not_reopen_or_close_false_positives() { - // user marks issue as false-positive - issuesService.doTransition(new DoTransitionRequest(issue.getKey(), "falsepositive")); - - Issue falsePositive = issueRule.getByKey(issue.getKey()); - assertThat(falsePositive.getStatus()).isEqualTo("RESOLVED"); - assertThat(falsePositive.getResolution()).isEqualTo("FALSE-POSITIVE"); - assertThat(falsePositive.getCreationDate()).isEqualTo(issue.getCreationDate()); - - // re-execute the same scan - analysisWithIssues.run(); - - // refresh - Issue reloaded = issueRule.getByKey(falsePositive.getKey()); - assertThat(reloaded.getStatus()).isEqualTo("RESOLVED"); - assertThat(reloaded.getResolution()).isEqualTo("FALSE-POSITIVE"); - assertThat(reloaded.getCreationDate()).isEqualTo(issue.getCreationDate()); - assertThat(toDatetime(reloaded.getUpdateDate())).isEqualTo(toDatetime(falsePositive.getUpdateDate())); - } - - /** - * SONAR-4286 - */ - @Test - public void scan_should_close_no_more_existing_false_positive() { - // user marks as false-positive - issuesService.doTransition(new DoTransitionRequest(issue.getKey(), "falsepositive")); - Issue falsePositive = issueRule.getByKey(issue.getKey()); - assertThat(falsePositive.getStatus()).isEqualTo("RESOLVED"); - assertThat(falsePositive.getResolution()).isEqualTo("FALSE-POSITIVE"); - assertThat(falsePositive.getCreationDate()).isEqualTo(issue.getCreationDate()); - - // scan without any rules -> false-positive is closed - analysisWithoutIssues.run(); - Issue closed = issueRule.getByKey(issue.getKey()); - assertThat(closed.getStatus()).isEqualTo("CLOSED"); - assertThat(closed.getResolution()).isEqualTo("REMOVED"); - assertThat(closed.getCreationDate()).isEqualTo(issue.getCreationDate()); - } - - /** - * SONAR-4286 - */ - @Test - public void user_should_reopen_false_positive() { - // user marks as false-positive - issuesService.doTransition(new DoTransitionRequest(issue.getKey(), "falsepositive")); - - Issue falsePositive = issueRule.getByKey(issue.getKey()); - assertThat(falsePositive.getStatus()).isEqualTo("RESOLVED"); - assertThat(falsePositive.getResolution()).isEqualTo("FALSE-POSITIVE"); - assertThat(falsePositive.getCreationDate()).isEqualTo(issue.getCreationDate()); - - // user reopens the issue - assertThat(transitions(falsePositive.getKey())).contains("reopen"); - adminIssueClient().doTransition(falsePositive.getKey(), "reopen"); - - Issue reopened = issueRule.getByKey(issue.getKey()); - assertThat(reopened.getStatus()).isEqualTo("REOPENED"); - assertThat(reopened.hasResolution()).isFalse(); - assertThat(reopened.getCreationDate()).isEqualTo(falsePositive.getCreationDate()); - } - - @Test - public void user_should_not_reopen_closed_issue() { - issuesService.doTransition(new DoTransitionRequest(issue.getKey(), "resolve")); - - // re-execute scan without rules -> the issue is closed - analysisWithoutIssues.run(); - - // user try to reopen the issue - assertThat(transitions(issue.getKey())).isEmpty(); - } - - private List<String> transitions(String issueKey) { - Issues.SearchWsResponse response = searchIssues(new SearchWsRequest().setIssues(singletonList(issueKey)).setAdditionalFields(singletonList("transitions"))); - assertThat(response.getTotal()).isEqualTo(1); - return response.getIssues(0).getTransitions().getTransitionsList(); - } - - private Issues.SearchWsResponse searchIssues(SearchWsRequest request) { - return newAdminWsClient(ORCHESTRATOR).issues().search(request); - } - -} diff --git a/it/it-tests/src/test/java/it/issue/IssuesPageTest.java b/it/it-tests/src/test/java/it/issue/IssuesPageTest.java deleted file mode 100644 index 3af55ed447f..00000000000 --- a/it/it-tests/src/test/java/it/issue/IssuesPageTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import com.sonar.orchestrator.Orchestrator; -import it.Category2Suite; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import pageobjects.Navigation; -import pageobjects.issues.Issue; -import pageobjects.issues.IssuesPage; -import util.ItUtils; -import util.user.UserRule; - -import static util.ItUtils.runProjectAnalysis; - -public class IssuesPageTest { - private static final String PROJECT_KEY = "sample"; - - @ClassRule - public static Orchestrator ORCHESTRATOR = Category2Suite.ORCHESTRATOR; - - @Rule - public UserRule userRule = UserRule.from(ORCHESTRATOR); - - public Navigation nav = Navigation.create(ORCHESTRATOR); - - private String adminUser; - - @BeforeClass - public static void prepareData() { - ORCHESTRATOR.resetData(); - - ItUtils.restoreProfile(ORCHESTRATOR, IssuesPageTest.class.getResource("/issue/with-many-rules.xml")); - - ORCHESTRATOR.getServer().provisionProject(PROJECT_KEY, PROJECT_KEY); - ORCHESTRATOR.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "with-many-rules"); - runProjectAnalysis(ORCHESTRATOR, "shared/xoo-multi-modules-sample"); - } - - @Before - public void before() { - adminUser = userRule.createAdminUser(); - } - - @Test - public void should_display_actions() { - IssuesPage page = nav.logIn().submitCredentials(adminUser).openIssues(); - Issue issue = page.getFirstIssue(); - issue.shouldAllowAssign().shouldAllowChangeType(); - } - - @Test - public void should_not_display_actions() { - Navigation nav = Navigation.create(ORCHESTRATOR); - IssuesPage page = nav.openIssues(); - Issue issue = page.getFirstIssue(); - issue.shouldNotAllowAssign().shouldNotAllowChangeType(); - } -} diff --git a/it/it-tests/src/test/java/it/issue/NewIssuesMeasureTest.java b/it/it-tests/src/test/java/it/issue/NewIssuesMeasureTest.java deleted file mode 100644 index f5f409cb87d..00000000000 --- a/it/it-tests/src/test/java/it/issue/NewIssuesMeasureTest.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import com.sonar.orchestrator.build.SonarScanner; -import java.util.Map; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Test; -import org.sonar.wsclient.issue.IssueQuery; -import org.sonarqube.ws.WsMeasures; -import org.sonarqube.ws.WsMeasures.Measure; -import util.ItUtils; - -import static java.lang.Integer.parseInt; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getLeakPeriodValue; -import static util.ItUtils.getMeasuresWithVariationsByMetricKey; -import static util.ItUtils.projectDir; -import static util.ItUtils.setServerProperty; - -/** - * SONAR-4564 - */ -public class NewIssuesMeasureTest extends AbstractIssueTest { - - @AfterClass - public static void resetPeriod() { - ItUtils.resetPeriod(ORCHESTRATOR); - } - - @Before - public void cleanUpAnalysisData() { - ORCHESTRATOR.resetData(); - } - - @Test - public void new_issues_measures() throws Exception { - setServerProperty(ORCHESTRATOR, "sonar.leak.period", "previous_analysis"); - ORCHESTRATOR.getServer().provisionProject("sample", "Sample"); - - // Execute an analysis in the past with no issue to have a past snapshot - ORCHESTRATOR.getServer().associateProjectToQualityProfile("sample", "xoo", "empty"); - ORCHESTRATOR.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample")).setProperty("sonar.projectDate", "2013-01-01")); - - // Execute a analysis now with some issues - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/one-issue-per-line-profile.xml")); - ORCHESTRATOR.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line-profile"); - ORCHESTRATOR.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - - assertThat(ORCHESTRATOR.getServer().wsClient().issueClient().find(IssueQuery.create()).list()).isNotEmpty(); - assertThat(getLeakPeriodValue(ORCHESTRATOR, "sample:src/main/xoo/sample/Sample.xoo", "new_violations")).isEqualTo(17); - - // second analysis, with exactly the same profile -> no new issues - ORCHESTRATOR.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - - assertThat(ORCHESTRATOR.getServer().wsClient().issueClient().find(IssueQuery.create()).list()).isNotEmpty(); - assertThat(getLeakPeriodValue(ORCHESTRATOR, "sample:src/main/xoo/sample/Sample.xoo", "new_violations")).isZero(); - } - - @Test - public void new_issues_measures_should_be_zero_on_project_when_no_new_issues_since_x_days() throws Exception { - setServerProperty(ORCHESTRATOR, "sonar.leak.period", "30"); - ORCHESTRATOR.getServer().provisionProject("sample", "Sample"); - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/one-issue-per-line-profile.xml")); - ORCHESTRATOR.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line-profile"); - - ORCHESTRATOR.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample")) - // Analyse a project in the past, with a date older than 30 last days (second period) - .setProperty("sonar.projectDate", "2013-01-01")); - ORCHESTRATOR.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - - // new issues measures should be to 0 on project on 2 periods as new issues has been created - assertThat(getLeakPeriodValue(ORCHESTRATOR, "sample", "new_violations")).isZero(); - } - - /** - * SONAR-3647 - */ - @Test - public void new_issues_measures_consistent_with_variations() throws Exception { - setServerProperty(ORCHESTRATOR, "sonar.leak.period", "previous_analysis"); - ORCHESTRATOR.getServer().provisionProject("sample", "Sample"); - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/one-issue-per-line-profile.xml")); - ORCHESTRATOR.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line-profile"); - - // Execute an analysis in the past to have a past snapshot - // version 1 - ORCHESTRATOR.executeBuilds(SonarScanner.create(projectDir("shared/xoo-history-v1"))); - - // version 2 with 2 new violations and 3 more ncloc - ORCHESTRATOR.executeBuilds(SonarScanner.create(projectDir("shared/xoo-history-v2"))); - - assertThat(ORCHESTRATOR.getServer().wsClient().issueClient().find(IssueQuery.create()).list()).isNotEmpty(); - - Map<String, Measure> measures = getMeasuresWithVariationsByMetricKey(ORCHESTRATOR, "sample", "new_violations", "violations", "ncloc"); - assertThat(measures.get("new_violations").getPeriods().getPeriodsValueList()).extracting(WsMeasures.PeriodValue::getValue).containsOnly("17"); - - Measure violations = measures.get("violations"); - assertThat(parseInt(violations.getValue())).isEqualTo(43); - assertThat(violations.getPeriods().getPeriodsValueList()).extracting(periodValue -> parseInt(periodValue.getValue())).containsOnly(17); - - Measure ncloc = measures.get("ncloc"); - assertThat(parseInt(ncloc.getValue())).isEqualTo(40); - assertThat(ncloc.getPeriods().getPeriodsValueList()).extracting(periodValue -> parseInt(periodValue.getValue())).containsOnly(16); - } - - @Test - public void new_issues_measures_should_be_correctly_calculated_when_adding_a_new_module() throws Exception { - setServerProperty(ORCHESTRATOR, "sonar.leak.period", "previous_analysis"); - ORCHESTRATOR.getServer().provisionProject("com.sonarsource.it.samples:multi-modules-sample", "com.sonarsource.it.samples:multi-modules-sample"); - - // First analysis without module b - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/NewIssuesMeasureTest/profile1.xml")); - ORCHESTRATOR.getServer().associateProjectToQualityProfile("com.sonarsource.it.samples:multi-modules-sample", "xoo", "profile1"); - ORCHESTRATOR.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample")) - .setProperties("sonar.modules", "module_a")); - - // Second analysis with module b and with a new rule activated to have new issues on module a since last analysis - ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/NewIssuesMeasureTest/profile2.xml")); - ORCHESTRATOR.getServer().associateProjectToQualityProfile("com.sonarsource.it.samples:multi-modules-sample", "xoo", "profile2"); - ORCHESTRATOR.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample"))); - - assertThat(getLeakPeriodValue(ORCHESTRATOR, "com.sonarsource.it.samples:multi-modules-sample", "new_violations")).isEqualTo(65); - } - -} diff --git a/it/it-tests/src/test/java/it/issue/OrganizationIssueAssignTest.java b/it/it-tests/src/test/java/it/issue/OrganizationIssueAssignTest.java deleted file mode 100644 index ffe6ac715f3..00000000000 --- a/it/it-tests/src/test/java/it/issue/OrganizationIssueAssignTest.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issue; - -import com.sonar.orchestrator.Orchestrator; -import it.Category6Suite; -import java.util.List; -import java.util.stream.Collectors; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Issues; -import org.sonarqube.ws.Issues.Issue; -import org.sonarqube.ws.Organizations; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import org.sonarqube.ws.client.issue.AssignRequest; -import org.sonarqube.ws.client.issue.BulkChangeRequest; -import org.sonarqube.ws.client.issue.SearchWsRequest; -import org.sonarqube.ws.client.project.CreateRequest; -import org.sonarqube.ws.client.qualityprofile.AddProjectRequest; -import pageobjects.issues.IssuesPage; -import util.issue.IssueRule; - -import static java.lang.String.format; -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.expectHttpError; -import static util.ItUtils.restoreProfile; -import static util.ItUtils.runProjectAnalysis; -import static util.ItUtils.setServerProperty; - -public class OrganizationIssueAssignTest { - - private final static String SAMPLE_PROJECT_KEY = "sample"; - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - @Rule - public Tester tester = new Tester(orchestrator); - - @Rule - public IssueRule issueRule = IssueRule.from(orchestrator); - - private Organizations.Organization org1; - private Organizations.Organization org2; - private User user; - - @Before - public void setUp() throws Exception { - org1 = tester.organizations().generate(); - org2 = tester.organizations().generate(); - user = tester.users().generate(); - restoreProfile(orchestrator, getClass().getResource("/organization/IssueAssignTest/one-issue-per-file-profile.xml"), org1.getKey()); - } - - @Test - public void auto_assign_issues_to_user_if_default_assignee_is_member_of_project_organization() { - tester.organizations().addMember(org1, user); - - provisionProject(SAMPLE_PROJECT_KEY, org1.getKey()); - setServerProperty(orchestrator, "sample", "sonar.issues.defaultAssigneeLogin", user.getLogin()); - - analyseProject(SAMPLE_PROJECT_KEY, org1.getKey()); - - assertThat(issueRule.getRandomIssue().getAssignee()).isEqualTo(user.getLogin()); - } - - @Test - public void does_not_auto_assign_issues_to_user_if_default_assignee_is_not_member_of_project_organization() { - tester.organizations().addMember(org2, user); - provisionProject(SAMPLE_PROJECT_KEY, org1.getKey()); - setServerProperty(orchestrator, "sample", "sonar.issues.defaultAssigneeLogin", user.getLogin()); - - analyseProject(SAMPLE_PROJECT_KEY, org1.getKey()); - - assertThat(issueRule.getRandomIssue().hasAssignee()).isFalse(); - } - - @Test - public void assign_issue_to_user_being_member_of_same_organization_as_project_issue_organization() { - tester.organizations().addMember(org1, user); - provisionAndAnalyseProject(SAMPLE_PROJECT_KEY, org1.getKey()); - Issue issue = issueRule.getRandomIssue(); - - assignIssueTo(issue, user); - - assertThat(issueRule.getByKey(issue.getKey()).getAssignee()).isEqualTo(user.getLogin()); - } - - @Test - public void fail_to_assign_issue_to_user_not_being_member_of_same_organization_as_project_issue_organization() { - tester.organizations().addMember(org2, user); - provisionAndAnalyseProject(SAMPLE_PROJECT_KEY, org1.getKey()); - Issue issue = issueRule.getRandomIssue(); - - expectHttpError(400, - format("User '%s' is not member of organization '%s'", user.getLogin(), org1.getKey()), - () -> assignIssueTo(issue, user)); - } - - @Test - public void bulk_assign_issues_to_user_being_only_member_of_same_organization_as_project_issue_organization() { - restoreProfile(orchestrator, getClass().getResource("/organization/IssueAssignTest/one-issue-per-file-profile.xml"), org2.getKey()); - // User is only member of org1, not of org2 - tester.organizations().addMember(org1, user); - provisionAndAnalyseProject(SAMPLE_PROJECT_KEY, org1.getKey()); - provisionAndAnalyseProject("sample2", org2.getKey()); - List<String> issues = issueRule.search(new org.sonarqube.ws.client.issue.SearchWsRequest()).getIssuesList().stream().map(Issue::getKey).collect(Collectors.toList()); - - Issues.BulkChangeWsResponse response = tester.wsClient().issues() - .bulkChange(BulkChangeRequest.builder().setIssues(issues).setAssign(user.getLogin()).build()); - - assertThat(response.getIgnored()).isGreaterThan(0); - assertThat(issueRule.search(new SearchWsRequest().setProjectKeys(singletonList("sample"))).getIssuesList()).extracting(Issue::getAssignee) - .containsOnly(user.getLogin()); - assertThat(issueRule.search(new SearchWsRequest().setProjectKeys(singletonList("sample2"))).getIssuesList()).extracting(Issue::hasAssignee) - .containsOnly(false); - } - - @Test - public void single_assign_search_show_only_members_in_global_issues() { - tester.organizations().addMember(org1, user); - User otherUser = tester.users().generate(); - provisionAndAnalyseProject(SAMPLE_PROJECT_KEY, org1.getKey()); - IssuesPage page = tester.openBrowser().logIn().submitCredentials(user.getLogin()).openIssues(); - page.getFirstIssue() - .shouldAllowAssign() - .assigneeSearchResultCount(otherUser.getLogin(), 0) - .assigneeSearchResultCount(user.getLogin(), 1); - } - - @Test - public void bulk_assign_search_only_members_of_organization_in_project_issues() { - tester.organizations().addMember(org1, user); - User otherUser = tester.users().generate(); - - provisionAndAnalyseProject(SAMPLE_PROJECT_KEY, org1.getKey()); - IssuesPage page = tester.openBrowser() - .logIn().submitCredentials(user.getLogin()) - .openComponentIssues(SAMPLE_PROJECT_KEY); - page - .bulkChangeOpen() - .bulkChangeAssigneeSearchCount(user.getLogin(), 1) - .bulkChangeAssigneeSearchCount(otherUser.getLogin(), 0); - } - - @Test - public void bulk_assign_search_all_users_in_global_issues() { - tester.organizations().addMember(org1, user); - User otherUser = tester.users().generate(); - provisionAndAnalyseProject(SAMPLE_PROJECT_KEY, org1.getKey()); - IssuesPage page = tester.openBrowser() - .logIn().submitCredentials(user.getLogin()) - .openIssues(); - page - .bulkChangeOpen() - .bulkChangeAssigneeSearchCount(user.getLogin(), 1) - .bulkChangeAssigneeSearchCount(otherUser.getLogin(), 1); - } - - private void provisionAndAnalyseProject(String projectKey, String organization) { - provisionProject(projectKey, organization); - analyseProject(projectKey, organization); - } - - private void provisionProject(String projectKey, String organization) { - tester.wsClient().projects().create( - CreateRequest.builder() - .setKey(projectKey) - .setName(projectKey) - .setOrganization(organization) - .build()); - } - - private void analyseProject(String projectKey, String organization) { - addQualityProfileToProject(organization, projectKey); - runProjectAnalysis(orchestrator, "issue/xoo-with-scm", - "sonar.projectKey", projectKey, - "sonar.organization", organization, - "sonar.login", "admin", - "sonar.password", "admin", - "sonar.scm.disabled", "false", - "sonar.scm.provider", "xoo"); - } - - private void addQualityProfileToProject(String organization, String projectKey) { - tester.wsClient().qualityProfiles().addProject( - AddProjectRequest.builder() - .setProjectKey(projectKey) - .setOrganization(organization) - .setLanguage("xoo") - .setProfileName("one-issue-per-file-profile") - .build()); - } - - private Issues.Operation assignIssueTo(Issue issue, User u) { - return tester.wsClient().issues().assign(new AssignRequest(issue.getKey(), u.getLogin())); - } -} diff --git a/it/it-tests/src/test/java/it/issueFilter/ToDoTest.java b/it/it-tests/src/test/java/it/issueFilter/ToDoTest.java deleted file mode 100644 index eea805f8902..00000000000 --- a/it/it-tests/src/test/java/it/issueFilter/ToDoTest.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.issueFilter; - -public class ToDoTest { -} diff --git a/it/it-tests/src/test/java/it/lite/LiteTest.java b/it/it-tests/src/test/java/it/lite/LiteTest.java deleted file mode 100644 index 1537c8af6c3..00000000000 --- a/it/it-tests/src/test/java/it/lite/LiteTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.lite; - -import com.sonar.orchestrator.Orchestrator; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Issues; -import org.sonarqube.ws.WsComponents; -import org.sonarqube.ws.WsMeasures; -import org.sonarqube.ws.client.component.TreeWsRequest; -import org.sonarqube.ws.client.issue.IssuesService; -import org.sonarqube.ws.client.issue.SearchWsRequest; -import org.sonarqube.ws.client.measure.ComponentTreeWsRequest; -import org.sonarqube.ws.client.measure.ComponentWsRequest; -import org.sonarqube.ws.client.measure.MeasuresService; - -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.runProjectAnalysis; -import static util.ItUtils.xooPlugin; - -public class LiteTest { - - private static final String PROJECT_KEY = "com.sonarsource.it.samples:multi-modules-sample"; - - @ClassRule - public static Orchestrator orchestrator = Orchestrator.builderEnv() - .setOrchestratorProperty("sonar.web.context", "/sonarqube") - .addPlugin(xooPlugin()) - .build(); - - @Rule - public Tester tester = new Tester(orchestrator) - .disableOrganizations(); - - @BeforeClass - public static void setUp() { - runProjectAnalysis(orchestrator, "shared/xoo-multi-modules-sample"); - } - - @Test - public void call_issues_ws() { - // all issues - IssuesService issuesService = tester.wsClient().issues(); - Issues.SearchWsResponse response = issuesService.search(new SearchWsRequest()); - assertThat(response.getIssuesCount()).isGreaterThan(0); - - // project issues - response = issuesService.search(new SearchWsRequest().setProjectKeys(singletonList(PROJECT_KEY))); - assertThat(response.getIssuesCount()).isGreaterThan(0); - } - - @Test - public void call_components_ws() { - // files in project - WsComponents.TreeWsResponse tree = tester.wsClient().components().tree(new TreeWsRequest() - .setBaseComponentKey(PROJECT_KEY) - .setQualifiers(singletonList("FIL"))); - assertThat(tree.getComponentsCount()).isEqualTo(4); - tree.getComponentsList().forEach(c -> { - assertThat(c.getQualifier()).isEqualTo("FIL"); - assertThat(c.getName()).endsWith(".xoo"); - }); - } - - @Test - public void call_measures_ws() { - // project measures - MeasuresService measuresService = tester.wsClient().measures(); - WsMeasures.ComponentWsResponse component = measuresService.component(new ComponentWsRequest() - .setComponentKey(PROJECT_KEY) - .setMetricKeys(asList("lines", "ncloc", "files"))); - assertThat(component.getComponent().getMeasuresCount()).isEqualTo(3); - - // file measures - WsMeasures.ComponentTreeWsResponse tree = measuresService.componentTree(new ComponentTreeWsRequest() - .setBaseComponentKey(PROJECT_KEY) - .setQualifiers(singletonList("FIL")) - .setMetricKeys(asList("lines", "ncloc"))); - assertThat(tree.getComponentsCount()).isEqualTo(4); - tree.getComponentsList().forEach(c -> { - assertThat(c.getMeasuresList()).extracting(m -> m.getMetric()).containsOnly("lines", "ncloc"); - }); - } -} diff --git a/it/it-tests/src/test/java/it/measure/DecimalScaleMetricTest.java b/it/it-tests/src/test/java/it/measure/DecimalScaleMetricTest.java deleted file mode 100644 index 6671cb30611..00000000000 --- a/it/it-tests/src/test/java/it/measure/DecimalScaleMetricTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.measure; - -import com.sonar.orchestrator.Orchestrator; -import it.Category3Suite; -import org.junit.ClassRule; -import org.junit.Test; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasureAsDouble; - -/** - * SONAR-6939 - */ -public class DecimalScaleMetricTest { - - /** - * Requires the plugin "batch-plugin" - */ - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - @Test - public void override_decimal_scale_of_numeric_metric() { - String projectKey = "DecimalScaleMetricTest.override_decimal_scale_of_numeric_metric"; - // see DecimalScaleMetric - String metricKey = "decimal_scale"; - ItUtils.runProjectAnalysis(orchestrator, "shared/xoo-sample", - "sonar.projectKey", projectKey, - "sonar.scanner.feedDecimalScaleMetric", String.valueOf(true)); - - assertThat(getMeasureAsDouble(orchestrator, projectKey, metricKey)).isEqualTo(0.0001); - } -} diff --git a/it/it-tests/src/test/java/it/measure/MeasuresWsTest.java b/it/it-tests/src/test/java/it/measure/MeasuresWsTest.java deleted file mode 100644 index f30c4d66003..00000000000 --- a/it/it-tests/src/test/java/it/measure/MeasuresWsTest.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.measure; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import java.util.List; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.WsMeasures; -import org.sonarqube.ws.WsMeasures.ComponentTreeWsResponse; -import org.sonarqube.ws.WsMeasures.ComponentWsResponse; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.measure.ComponentTreeWsRequest; -import org.sonarqube.ws.client.measure.ComponentWsRequest; -import util.ItUtils; - -import static com.google.common.collect.Lists.newArrayList; -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.projectDir; -import static util.ItUtils.setServerProperty; - -public class MeasuresWsTest { - @ClassRule - public static final Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - private static final String FILE_KEY = "sample:src/main/xoo/sample/Sample.xoo"; - private static final String DIR_KEY = "sample:src/main/xoo/sample"; - WsClient wsClient; - - @BeforeClass - public static void initPeriod() throws Exception { - setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis"); - } - - @AfterClass - public static void resetPeriod() throws Exception { - ItUtils.resetPeriod(orchestrator); - } - - @Before - public void inspectProject() { - orchestrator.resetData(); - - wsClient = ItUtils.newAdminWsClient(orchestrator); - } - - @Test - public void component_tree() { - scanXooSample(); - - ComponentTreeWsResponse response = wsClient.measures().componentTree(new ComponentTreeWsRequest() - .setBaseComponentKey("sample") - .setMetricKeys(singletonList("ncloc")) - .setAdditionalFields(newArrayList("metrics", "periods"))); - - assertThat(response).isNotNull(); - assertThat(response.getBaseComponent().getKey()).isEqualTo("sample"); - assertThat(response.getMetrics().getMetricsList()).extracting("key").containsOnly("ncloc"); - List<WsMeasures.Component> components = response.getComponentsList(); - assertThat(components).hasSize(2).extracting("key").containsOnly(DIR_KEY, FILE_KEY); - assertThat(components.get(0).getMeasuresList().get(0).getValue()).isEqualTo("13"); - } - - /** - * @see SONAR-7958 - */ - @Test - public void component_tree_supports_module_move_down() { - String projectKey = "sample"; - String newModuleKey = "sample:new_module"; - String moduleAKey = "module_a"; - String dirKey = "module_a:src/main/xoo/sample"; - String fileKey = "module_a:src/main/xoo/sample/Sample.xoo"; - - scanXooSampleModuleMoveV1(); - - verifyComponentTreeWithChildren(projectKey, moduleAKey); - verifyComponentTreeWithChildren(moduleAKey, dirKey); - verifyComponentTreeWithChildren(dirKey, fileKey); - - scanXooSampleModuleMoveV2(); - - verifyComponentTreeWithChildren(projectKey, newModuleKey); - verifyComponentTreeWithChildren(newModuleKey, moduleAKey); - verifyComponentTreeWithChildren(moduleAKey, dirKey); - verifyComponentTreeWithChildren(dirKey, fileKey); - } - - /** - * @see SONAR-7958 - */ - @Test - public void component_tree_supports_module_move_up() { - String projectKey = "sample"; - String newModuleKey = "sample:new_module"; - String moduleAKey = "module_a"; - String dirKey = "module_a:src/main/xoo/sample"; - String fileKey = "module_a:src/main/xoo/sample/Sample.xoo"; - - scanXooSampleModuleMoveV2(); - - verifyComponentTreeWithChildren(projectKey, newModuleKey); - verifyComponentTreeWithChildren(newModuleKey, moduleAKey); - verifyComponentTreeWithChildren(moduleAKey, dirKey); - verifyComponentTreeWithChildren(dirKey, fileKey); - - scanXooSampleModuleMoveV1(); - - verifyComponentTreeWithChildren(projectKey, moduleAKey); - verifyComponentTreeWithChildren(moduleAKey, dirKey); - verifyComponentTreeWithChildren(dirKey, fileKey); - } - - private void verifyComponentTreeWithChildren(String baseComponentKey, String... childKeys) { - ComponentTreeWsResponse response = wsClient.measures().componentTree(new ComponentTreeWsRequest() - .setBaseComponentKey(baseComponentKey) - .setMetricKeys(singletonList("ncloc")) - .setStrategy("children")); - - assertThat(response.getBaseComponent().getKey()).isEqualTo(baseComponentKey); - assertThat(response.getComponentsList()) - .extracting("key").containsOnly(childKeys); - } - - @Test - public void component() { - scanXooSample(); - - ComponentWsResponse response = wsClient.measures().component(new ComponentWsRequest() - .setComponentKey("sample") - .setMetricKeys(singletonList("ncloc")) - .setAdditionalFields(newArrayList("metrics", "periods"))); - - WsMeasures.Component component = response.getComponent(); - assertThat(component.getKey()).isEqualTo("sample"); - assertThat(component.getMeasuresList()).isNotEmpty(); - assertThat(response.getMetrics().getMetricsList()).extracting("key").containsOnly("ncloc"); - } - - private void scanXooSample() { - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - } - - private void scanXooSampleModuleMoveV1() { - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample-module-move-v1"))); - } - - private void scanXooSampleModuleMoveV2() { - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample-module-move-v2"))); - } -} diff --git a/it/it-tests/src/test/java/it/measure/ProjectDashboardTest.java b/it/it-tests/src/test/java/it/measure/ProjectDashboardTest.java deleted file mode 100644 index b0054d9d3af..00000000000 --- a/it/it-tests/src/test/java/it/measure/ProjectDashboardTest.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.measure; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.openqa.selenium.Keys; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import pageobjects.Navigation; -import pageobjects.ProjectDashboardPage; -import util.user.UserRule; - -import static com.codeborne.selenide.Condition.hasText; -import static com.codeborne.selenide.Condition.text; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.projectDir; -import static util.selenium.Selenese.runSelenese; - -public class ProjectDashboardTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - private Navigation nav = Navigation.create(orchestrator); - - private static WsClient wsClient; - private String adminUser; - - @Before - public void setUp() throws Exception { - wsClient = newAdminWsClient(orchestrator); - orchestrator.resetData(); - adminUser = userRule.createAdminUser(); - } - - @Test - public void after_first_analysis() throws Exception { - executeBuild("shared/xoo-sample", "project-for-overview", "Project For Overview"); - - runSelenese(orchestrator, "/measure/ProjectDashboardTest/test_project_overview_after_first_analysis.html"); - } - - @Test - public void display_size() { - executeBuild("shared/xoo-sample", "sample", "Sample"); - - ProjectDashboardPage page = Navigation.create(orchestrator).openProjectDashboard("sample"); - - page.getLinesOfCode().should(hasText("13")); - page.getLanguageDistribution().should(hasText("Xoo"), hasText("13")); - } - - @Test - public void display_tags_without_edit() { - executeBuild("shared/xoo-sample", "sample", "Sample"); - - // Add some tags to the project - wsClient.wsConnector().call( - new PostRequest("api/project_tags/set") - .setParam("project", "sample") - .setParam("tags", "foo,bar,baz")); - - ProjectDashboardPage page = Navigation.create(orchestrator).openProjectDashboard("sample"); - page - .shouldHaveTags("foo", "bar", "baz") - .shouldNotBeEditable(); - } - - @Test - public void display_tags_with_edit() { - executeBuild("shared/xoo-sample", "sample-with-tags", "Sample with tags"); - // Add some tags to another project to have them in the list - wsClient.wsConnector().call( - new PostRequest("api/project_tags/set") - .setParam("project", "sample-with-tags") - .setParam("tags", "foo,bar,baz")); - - executeBuild("shared/xoo-sample", "sample", "Sample"); - ProjectDashboardPage page = nav.logIn().submitCredentials(adminUser).openProjectDashboard("sample"); - page - .shouldHaveTags("No tags") - .shouldBeEditable() - .openTagEditor() - .getTagAtIdx(2).click(); - page - .shouldHaveTags("foo") - .sendKeysToTagsInput("test") - .getTagAtIdx(0).should(hasText("+ test")).click(); - page - .shouldHaveTags("foo", "test") - .getTagAtIdx(1).should(hasText("test")); - page - .sendKeysToTagsInput(Keys.ENTER) - .shouldHaveTags("test"); - } - - @Test - @Ignore("there is no more place to show the error") - public void display_a_nice_error_when_requesting_unknown_project() { - Navigation nav = Navigation.create(orchestrator); - nav.open("/dashboard/index?id=unknown"); - nav.getErrorMessage().should(text("The requested project does not exist. Either it has never been analyzed successfully or it has been deleted.")); - // TODO verify that on global homepage - } - - private void executeBuild(String projectLocation, String projectKey, String projectName) { - orchestrator.executeBuild( - SonarScanner.create(projectDir(projectLocation)) - .setProjectKey(projectKey) - .setProjectName(projectName)); - } - -} diff --git a/it/it-tests/src/test/java/it/measure/ProjectMeasuresPageTest.java b/it/it-tests/src/test/java/it/measure/ProjectMeasuresPageTest.java deleted file mode 100644 index 8c83f7bc3a8..00000000000 --- a/it/it-tests/src/test/java/it/measure/ProjectMeasuresPageTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.measure; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import pageobjects.Navigation; - -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; -import static util.ItUtils.projectDir; -import static util.selenium.Selenese.runSelenese; - -public class ProjectMeasuresPageTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @BeforeClass - public static void inspectProject() { - orchestrator.executeBuild( - SonarScanner - .create(projectDir("shared/xoo-sample")) - .setProperty("sonar.projectKey", "project-measures-page-test-project") - .setProperty("sonar.projectName", "ProjectMeasuresPageTest Project")); - - // one more time - orchestrator.executeBuild( - SonarScanner - .create(projectDir("shared/xoo-sample")) - .setProperty("sonar.projectKey", "project-measures-page-test-project") - .setProperty("sonar.projectName", "ProjectMeasuresPageTest Project")); - } - - @Test - public void should_display_measures_page() { - runSelenese(orchestrator, "/measure/ProjectMeasuresPageTest/should_display_measures_page.html"); - } - - @Test - public void should_drilldown_on_list_view() { - runSelenese(orchestrator, "/measure/ProjectMeasuresPageTest/should_drilldown_on_list_view.html"); - } - - @Test - public void should_drilldown_on_tree_view() { - runSelenese(orchestrator, "/measure/ProjectMeasuresPageTest/should_drilldown_on_tree_view.html"); - } - - @Test - public void should_show_history() { - Navigation nav = Navigation.create(orchestrator); - nav.open("/component_measures/metric/reliability_rating/history?id=project-measures-page-test-project"); - $(".line-chart").shouldBe(visible); - $$(".line-chart-tick-x").shouldHaveSize(5); - } - -} diff --git a/it/it-tests/src/test/java/it/measureHistory/DifferentialPeriodsTest.java b/it/it-tests/src/test/java/it/measureHistory/DifferentialPeriodsTest.java deleted file mode 100644 index 03f40dc23d8..00000000000 --- a/it/it-tests/src/test/java/it/measureHistory/DifferentialPeriodsTest.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.measureHistory; - -import com.sonar.orchestrator.Orchestrator; -import it.Category1Suite; -import java.util.Date; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.ws.client.WsClient; -import pageobjects.Navigation; -import util.ItUtils; -import util.user.UserRule; - -import static org.apache.commons.lang.time.DateUtils.addDays; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.formatDate; -import static util.ItUtils.getLeakPeriodValue; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.resetPeriod; -import static util.ItUtils.runProjectAnalysis; -import static util.ItUtils.setServerProperty; - -public class DifferentialPeriodsTest { - - static final String PROJECT_KEY = "sample"; - static final String MULTI_MODULE_PROJECT_KEY = "com.sonarsource.it.samples:multi-modules-sample"; - - static WsClient CLIENT; - - @ClassRule - public static final Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - private String adminUser; - - @BeforeClass - public static void createWsClient() throws Exception { - CLIENT = newAdminWsClient(orchestrator); - } - - @Before - public void cleanUpAnalysisData() { - orchestrator.resetData(); - adminUser = userRule.createAdminUser(); - } - - @After - public void reset() throws Exception { - resetPeriod(orchestrator); - } - - /** - * SONAR-7093 - */ - @Test - public void ensure_leak_period_defined_at_project_level_is_taken_into_account() throws Exception { - orchestrator.getServer().provisionProject(PROJECT_KEY, PROJECT_KEY); - - // Set a global property and a project property to ensure project property is used - setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis"); - setServerProperty(orchestrator, PROJECT_KEY, "sonar.leak.period", "30"); - - // Execute an analysis in the past to have a past snapshot without any issues - orchestrator.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "empty"); - runProjectAnalysis(orchestrator, "shared/xoo-sample", "sonar.projectDate", formatDate(addDays(new Date(), -15))); - - // Second analysis -> issues will be created - ItUtils.restoreProfile(orchestrator, getClass().getResource("/measureHistory/one-issue-per-line-profile.xml")); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "one-issue-per-line"); - runProjectAnalysis(orchestrator, "shared/xoo-sample"); - - // Third analysis -> There's no new issue from previous analysis - runProjectAnalysis(orchestrator, "shared/xoo-sample"); - - // Project should have 17 new issues for leak period - assertThat(getLeakPeriodValue(orchestrator, PROJECT_KEY, "violations")).isEqualTo(17); - - // Check on ui that it's possible to define leak period on project - Navigation.create(orchestrator).openHome().logIn().submitCredentials(adminUser).openSettings("sample") - .assertSettingDisplayed("sonar.leak.period"); - } - - /** - * SONAR-7237 - */ - @Test - public void ensure_differential_measures_are_computed_when_adding_new_component_after_period() throws Exception { - orchestrator.getServer().provisionProject(MULTI_MODULE_PROJECT_KEY, MULTI_MODULE_PROJECT_KEY); - setServerProperty(orchestrator, MULTI_MODULE_PROJECT_KEY, "sonar.leak.period", "30"); - - // Execute an analysis 60 days ago without module b - orchestrator.getServer().associateProjectToQualityProfile(MULTI_MODULE_PROJECT_KEY, "xoo", "empty"); - runProjectAnalysis(orchestrator, "shared/xoo-multi-modules-sample", - "sonar.projectDate", formatDate(addDays(new Date(), -60)), - "sonar.modules", "module_a"); - - // Second analysis, 20 days ago, issues will be created - ItUtils.restoreProfile(orchestrator, getClass().getResource("/measureHistory/one-issue-per-line-profile.xml")); - orchestrator.getServer().associateProjectToQualityProfile(MULTI_MODULE_PROJECT_KEY, "xoo", "one-issue-per-line"); - runProjectAnalysis(orchestrator, "shared/xoo-multi-modules-sample", - "sonar.projectDate", formatDate(addDays(new Date(), -20)), - "sonar.modules", "module_a,module_b"); - - // Variation on module b should exist - assertThat(getLeakPeriodValue(orchestrator, MULTI_MODULE_PROJECT_KEY + ":module_b", "ncloc")).isEqualTo(24); - } - - @Test - public void compute_no_new_lines_measures_when_changes_but_no_scm() throws Exception { - orchestrator.getServer().provisionProject(MULTI_MODULE_PROJECT_KEY, MULTI_MODULE_PROJECT_KEY); - setServerProperty(orchestrator, MULTI_MODULE_PROJECT_KEY, "sonar.leak.period", "previous_analysis"); - - // Execute an analysis 60 days ago without module b - orchestrator.getServer().associateProjectToQualityProfile(MULTI_MODULE_PROJECT_KEY, "xoo", "empty"); - runProjectAnalysis(orchestrator, "shared/xoo-multi-modules-sample", - "sonar.projectDate", formatDate(addDays(new Date(), -60)), - "sonar.modules", "module_a"); - - // Second analysis, 20 days ago - ItUtils.restoreProfile(orchestrator, getClass().getResource("/measureHistory/one-issue-per-line-profile.xml")); - orchestrator.getServer().associateProjectToQualityProfile(MULTI_MODULE_PROJECT_KEY, "xoo", "one-issue-per-line"); - runProjectAnalysis(orchestrator, "shared/xoo-multi-modules-sample", - "sonar.projectDate", formatDate(addDays(new Date(), -20)), - "sonar.modules", "module_a,module_b"); - - // No new lines measure - assertNoMeasures(MULTI_MODULE_PROJECT_KEY, "new_lines", "new_lines_to_cover"); - } - - @Test - public void compute_zero_new_lines_measures_when_no_changes_and_scm_available() throws Exception { - String projectKey = "sample-scm"; - orchestrator.getServer().provisionProject(projectKey, projectKey); - setServerProperty(orchestrator, projectKey, "sonar.leak.period", "previous_analysis"); - - // Execute an analysis 60 days ago - runProjectAnalysis(orchestrator, "scm/xoo-sample-with-scm", "sonar.projectDate", formatDate(addDays(new Date(), -60)), - "sonar.scm.provider", "xoo", "sonar.scm.disabled", "false"); - - // Second analysis, 20 days ago - runProjectAnalysis(orchestrator, "scm/xoo-sample-with-scm", "sonar.projectDate", formatDate(addDays(new Date(), -20)), - "sonar.scm.provider", "xoo", "sonar.scm.disabled", "false"); - - // New lines measures is zero - assertThat(getLeakPeriodValue(orchestrator, projectKey, "new_lines")).isEqualTo(0); - assertThat(getLeakPeriodValue(orchestrator, projectKey, "new_lines_to_cover")).isEqualTo(0); - } - - private void assertNoMeasures(String projectKey, String... metrics) { - assertThat(getMeasuresAsDoubleByMetricKey(orchestrator, projectKey, metrics)).isEmpty(); - } -} diff --git a/it/it-tests/src/test/java/it/measureHistory/SincePreviousVersionHistoryTest.java b/it/it-tests/src/test/java/it/measureHistory/SincePreviousVersionHistoryTest.java deleted file mode 100644 index 888072186ef..00000000000 --- a/it/it-tests/src/test/java/it/measureHistory/SincePreviousVersionHistoryTest.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.measureHistory; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import java.text.SimpleDateFormat; -import java.util.Date; -import javax.annotation.Nullable; -import org.apache.commons.lang.time.DateUtils; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import util.ItUtils; - -import static java.lang.Integer.parseInt; -import static org.assertj.core.api.Assertions.assertThat; -import static org.sonarqube.ws.WsMeasures.Measure; -import static org.sonarqube.ws.WsMeasures.PeriodValue; -import static util.ItUtils.getLeakPeriodValue; -import static util.ItUtils.getMeasureWithVariation; -import static util.ItUtils.projectDir; -import static util.ItUtils.setServerProperty; - -public class SincePreviousVersionHistoryTest { - - private static final String PROJECT = "com.sonarsource.it.samples:multi-modules-sample"; - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @BeforeClass - public static void initPeriod() throws Exception { - setServerProperty(orchestrator, "sonar.leak.period", "previous_version"); - } - - @AfterClass - public static void resetPeriod() throws Exception { - ItUtils.resetPeriod(orchestrator); - } - - private static void analyzeProject(String version) { - analyzeProject(version, null, null); - } - - private static void analyzeProjectWithExclusions(String version, String exclusions) { - analyzeProject(version, exclusions, null); - } - - private static void analyzeProjectWithDate(String version, String date) { - analyzeProject(version, null, date); - } - - private static void analyzeProject(String version, @Nullable String exclusions, @Nullable String date) { - SonarScanner build = SonarScanner.create(projectDir("shared/xoo-multi-modules-sample")) - .setProperties("sonar.projectVersion", version); - if (exclusions != null) { - build.setProperties("sonar.exclusions", exclusions); - } - if (date != null) { - build.setProperty("sonar.projectDate", date); - } - orchestrator.executeBuild(build); - } - - public static String toStringDate(Date date) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - return sdf.format(date); - } - - @Before - public void resetData() throws Exception { - orchestrator.resetData(); - } - - /** - * SONAR-2496 - */ - @Test - public void test_since_previous_version_period() { - analyzeProjectWithExclusions("0.9", "**/*2.xoo"); - analyzeProject("1.0-SNAPSHOT"); - analyzeProject("1.0-SNAPSHOT"); - - Measure measure = getMeasureWithVariation(orchestrator, PROJECT, "files"); - - // There are 4 files - assertThat(parseInt(measure.getValue())).isEqualTo(4); - // 2 files were added since the first analysis which was version 0.9 - assertThat(measure.getPeriods().getPeriodsValueList()).extracting(PeriodValue::getValue).contains("2"); - } - - /** - * SONAR-6356 - */ - @Test - public void since_previous_version_should_use_first_analysis_when_no_version_found() { - Date now = new Date(); - - // Analyze project by excluding some files - analyzeProject("1.0-SNAPSHOT", "**/*2.xoo", toStringDate(DateUtils.addDays(now, -2))); - // No difference measure after first analysis - assertThat(getLeakPeriodValue(orchestrator, PROJECT, "files")).isNull(); - - analyzeProjectWithDate("1.0-SNAPSHOT", toStringDate(DateUtils.addDays(now, -1))); - // No new version, first analysis is used -> 2 new files - assertThat(getLeakPeriodValue(orchestrator, PROJECT, "files")).isEqualTo(2); - - analyzeProjectWithDate("1.0-SNAPSHOT", toStringDate(now)); - // Still no new version, first analysis is used -> 2 new files - assertThat(getLeakPeriodValue(orchestrator, PROJECT, "files")).isEqualTo(2); - } - -} diff --git a/it/it-tests/src/test/java/it/measureHistory/SinceXDaysHistoryTest.java b/it/it-tests/src/test/java/it/measureHistory/SinceXDaysHistoryTest.java deleted file mode 100644 index 1c53d3df87c..00000000000 --- a/it/it-tests/src/test/java/it/measureHistory/SinceXDaysHistoryTest.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.measureHistory; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import java.text.SimpleDateFormat; -import java.util.Date; -import javax.annotation.Nullable; -import org.apache.commons.lang.time.DateUtils; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.WsMeasures; -import util.ItUtils; - -import static java.lang.Integer.parseInt; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasureWithVariation; -import static util.ItUtils.projectDir; -import static util.ItUtils.setServerProperty; - -public class SinceXDaysHistoryTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - private static final String PROJECT = "multi-files-sample"; - - @BeforeClass - public static void analyseProjectWithHistory() { - initPeriod(); - - orchestrator.resetData(); - ItUtils.restoreProfile(orchestrator, SinceXDaysHistoryTest.class.getResource("/measureHistory/one-issue-per-line-profile.xml")); - orchestrator.getServer().provisionProject(PROJECT, PROJECT); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT, "xoo", "one-issue-per-line"); - - // Execute a analysis in the past before since 30 days period -> 0 issue, 0 file - analyzeProject("2013-01-01", "**/File1*,**/File2*,**/File3*,**/File4*"); - - // Execute a analysis 20 days ago, after since 30 days period -> 16 issues, 1 file - analyzeProject(getPastDate(20), "**/File2*,**/File3*,**/File4*"); - - // Execute a analysis 10 days ago, after since 30 days period -> 28 issues, 2 files - analyzeProject(getPastDate(10), "**/File3*,**/File4*"); - - // Execute a analysis in the present with all modules -> 52 issues, 4 files - analyzeProject(); - } - - private static void initPeriod() { - setServerProperty(orchestrator, "sonar.leak.period", "30"); - } - - @AfterClass - public static void resetPeriods() throws Exception { - ItUtils.resetPeriod(orchestrator); - } - - @Test - public void check_files_variation() throws Exception { - checkMeasure("files", 3); - } - - @Test - public void check_issues_variation() throws Exception { - checkMeasure("violations", 45); - } - - @Test - public void check_new_issues_measures() throws Exception { - checkMeasure("new_violations", 45); - } - - private void checkMeasure(String metric, int variation) { - WsMeasures.Measure measure = getMeasureWithVariation(orchestrator, PROJECT, metric); - assertThat(measure.getPeriods().getPeriodsValueList()).extracting(periodValue -> parseInt(periodValue.getValue())).containsOnly(variation); - } - - private static void analyzeProject() { - analyzeProject(null, null); - } - - private static void analyzeProject(@Nullable String date, @Nullable String exclusions) { - SonarScanner runner = SonarScanner.create(projectDir("measureHistory/xoo-multi-files-sample")); - if (date != null) { - runner.setProperty("sonar.projectDate", date); - } - if (exclusions != null) { - runner.setProperties("sonar.exclusions", exclusions); - } - orchestrator.executeBuild(runner); - } - - private static String getPastDate(int nbPastDays) { - return new SimpleDateFormat("yyyy-MM-dd").format(DateUtils.addDays(new Date(), nbPastDays * -1)); - } - -} diff --git a/it/it-tests/src/test/java/it/measureHistory/TimeMachineTest.java b/it/it-tests/src/test/java/it/measureHistory/TimeMachineTest.java deleted file mode 100644 index 56d4ad6ae92..00000000000 --- a/it/it-tests/src/test/java/it/measureHistory/TimeMachineTest.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.measureHistory; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import java.util.Arrays; -import java.util.Date; -import java.util.Map; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.WsMeasures.Measure; -import org.sonarqube.ws.WsMeasures.SearchHistoryResponse; -import org.sonarqube.ws.WsMeasures.SearchHistoryResponse.HistoryValue; -import org.sonarqube.ws.client.measure.MeasuresService; -import org.sonarqube.ws.client.measure.SearchHistoryRequest; -import util.ItUtils; -import util.ItUtils.ComponentNavigation; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.formatDate; -import static util.ItUtils.getComponentNavigation; -import static util.ItUtils.getMeasuresByMetricKey; -import static util.ItUtils.getMeasuresWithVariationsByMetricKey; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.projectDir; -import static util.ItUtils.setServerProperty; - -public class TimeMachineTest { - - private static final String PROJECT = "sample"; - private static final String FIRST_ANALYSIS_DATE = "2014-10-19"; - private static final String SECOND_ANALYSIS_DATE = "2014-11-13"; - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - private static MeasuresService wsMeasures; - - @BeforeClass - public static void initialize() { - orchestrator.resetData(); - initPeriod(); - ItUtils.restoreProfile(orchestrator, TimeMachineTest.class.getResource("/measureHistory/one-issue-per-line-profile.xml")); - orchestrator.getServer().provisionProject("sample", "Sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - analyzeProject("measure/xoo-history-v1", FIRST_ANALYSIS_DATE); - analyzeProject("measure/xoo-history-v2", SECOND_ANALYSIS_DATE); - - wsMeasures = newAdminWsClient(orchestrator).measures(); - } - - private static void initPeriod() { - setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis"); - } - - @AfterClass - public static void resetPeriod() throws Exception { - ItUtils.resetPeriod(orchestrator); - } - - private static BuildResult analyzeProject(String path, String date) { - return orchestrator.executeBuild(SonarScanner.create(projectDir(path), "sonar.projectDate", date)); - } - - @Test - public void projectIsAnalyzed() { - ComponentNavigation component = getComponentNavigation(orchestrator, PROJECT); - assertThat(component.getVersion()).isEqualTo("1.0-SNAPSHOT"); - assertThat(component.getDate().getMonth()).isEqualTo(10); // November - } - - @Test - public void testHistoryOfIssues() { - SearchHistoryResponse response = searchHistory("blocker_violations", "critical_violations", "info_violations", "major_violations", "minor_violations"); - assertThat(response.getPaging().getTotal()).isEqualTo(2); - - assertHistory(response, "blocker_violations", "0", "0"); - assertHistory(response, "critical_violations", "0", "0"); - assertHistory(response, "info_violations", "0", "0"); - assertHistory(response, "major_violations", "0", "0"); - assertHistory(response, "minor_violations", "26", "43"); - } - - @Test - public void testHistoryOfMeasures() { - SearchHistoryResponse response = searchHistory("lines", "ncloc"); - - assertThat(response.getPaging().getTotal()).isEqualTo(2); - assertHistory(response, "lines", "26", "43"); - assertHistory(response, "ncloc", "24", "40"); - } - - @Test - public void noDataForInterval() { - Date now = new Date(); - - SearchHistoryResponse response = wsMeasures.searchHistory(SearchHistoryRequest.builder() - .setComponent(PROJECT) - .setMetrics(singletonList("lines")) - .setFrom(formatDate(now)) - .setTo(formatDate(now)) - .build()); - - assertThat(response.getPaging().getTotal()).isEqualTo(0); - assertThat(response.getMeasures(0).getHistoryList()).isEmpty(); - } - - /** - * SONAR-4962 - */ - @Test - public void measure_variations_are_only_meaningful_when_additional_fields_contains_periods() { - Map<String, Measure> measures = getMeasuresWithVariationsByMetricKey(orchestrator, PROJECT, "violations", "new_violations"); - assertThat(measures.get("violations")).isNotNull(); - assertThat(measures.get("new_violations")).isNotNull(); - SearchHistoryResponse response = searchHistory("new_violations"); - assertThat(response.getMeasures(0).getHistoryCount()).isGreaterThan(0); - - measures = getMeasuresByMetricKey(orchestrator, PROJECT, "violations", "new_violations"); - assertThat(measures.get("violations")).isNotNull(); - assertThat(measures.get("new_violations")).isNull(); - } - - private static SearchHistoryResponse searchHistory(String... metrics) { - return wsMeasures.searchHistory(SearchHistoryRequest.builder() - .setComponent(PROJECT) - .setMetrics(Arrays.asList(metrics)) - .build()); - } - - private static void assertHistory(SearchHistoryResponse response, String metric, String... expectedMeasures) { - for (SearchHistoryResponse.HistoryMeasure measures : response.getMeasuresList()) { - if (metric.equals(measures.getMetric())) { - assertThat(measures.getHistoryList()).extracting(HistoryValue::getValue).containsExactly(expectedMeasures); - return; - } - } - - throw new IllegalArgumentException("Metric not found"); - } -} diff --git a/it/it-tests/src/test/java/it/organization/BillingTest.java b/it/it-tests/src/test/java/it/organization/BillingTest.java deleted file mode 100644 index 975db8b260e..00000000000 --- a/it/it-tests/src/test/java/it/organization/BillingTest.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.organization; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category6Suite; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Organizations; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsResponse; -import org.sonarqube.ws.client.organization.UpdateProjectVisibilityWsRequest; -import org.sonarqube.ws.client.project.CreateRequest; -import org.sonarqube.ws.client.project.UpdateVisibilityRequest; -import pageobjects.Navigation; -import util.ItUtils; - -import static java.lang.String.format; -import static org.assertj.core.api.Java6Assertions.assertThat; -import static org.sonarqube.ws.WsCe.TaskResponse; -import static util.ItUtils.expectHttpError; -import static util.ItUtils.newProjectKey; -import static util.ItUtils.newUserWsClient; -import static util.ItUtils.projectDir; -import static util.ItUtils.resetSettings; -import static util.ItUtils.setServerProperty; - -public class BillingTest { - - private static final String PROPERTY_PREVENT_ANALYSIS = "sonar.billing.preventProjectAnalysis"; - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator); - - private Organizations.Organization organization; - private User orgAdministrator; - - @Before - @After - public void reset() { - resetSettings(orchestrator, null, PROPERTY_PREVENT_ANALYSIS, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate"); - } - - @Before - public void setUp() { - organization = tester.organizations().generate(); - orgAdministrator = tester.users().generateAdministrator(organization); - } - - @Test - public void execute_successfully_ce_analysis_on_organization() { - setServerProperty(orchestrator, PROPERTY_PREVENT_ANALYSIS, "false"); - - String taskUuid = executeAnalysis(newProjectKey()); - - TaskResponse taskResponse = tester.wsClient().ce().task(taskUuid); - assertThat(taskResponse.getTask().hasErrorMessage()).isFalse(); - } - - @Test - public void fail_to_execute_ce_analysis_on_organization() { - setServerProperty(orchestrator, PROPERTY_PREVENT_ANALYSIS, "true"); - - String taskUuid = executeAnalysis(newProjectKey()); - - TaskResponse taskResponse = tester.wsClient().ce().task(taskUuid); - assertThat(taskResponse.getTask().hasErrorMessage()).isTrue(); - assertThat(taskResponse.getTask().getErrorMessage()).contains(format("Organization %s cannot perform analysis", organization.getKey())); - } - - @Test - public void api_navigation_organization_returns_canUpdateProjectsVisibilityToPrivate() { - User user = tester.users().generate(); - tester.organizations().addMember(organization, user); - - setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "false"); - assertWsResponseAsAdmin(new GetRequest("api/navigation/organization").setParam("organization", organization.getKey()), - "\"canUpdateProjectsVisibilityToPrivate\":true"); - - setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "true"); - assertWsResponseAsAdmin(new GetRequest("api/navigation/organization").setParam("organization", organization.getKey()), - "\"canUpdateProjectsVisibilityToPrivate\":false"); - - setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "true"); - assertWsResponseAsUser(new GetRequest("api/navigation/organization").setParam("organization", organization.getKey()), - "\"canUpdateProjectsVisibilityToPrivate\":false", user); - } - - @Test - public void api_navigation_component_returns_canUpdateProjectVisibilityToPrivate() { - String projectKey = createPublicProject(); - - setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "false"); - assertWsResponseAsAdmin(new GetRequest("api/navigation/component").setParam("componentKey", projectKey), - "\"canUpdateProjectVisibilityToPrivate\":true"); - - setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "true"); - assertWsResponseAsAdmin(new GetRequest("api/navigation/component").setParam("componentKey", projectKey), - "\"canUpdateProjectVisibilityToPrivate\":false"); - } - - @Test - public void does_not_fail_to_update_default_projects_visibility_to_private() { - setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "false"); - - tester.wsClient().organizations().updateProjectVisibility(UpdateProjectVisibilityWsRequest.builder() - .setOrganization(organization.getKey()) - .setProjectVisibility("private") - .build()); - - assertWsResponseAsAdmin(new GetRequest("api/navigation/organization").setParam("organization", organization.getKey()), - "\"projectVisibility\":\"private\""); - } - - @Test - public void fail_to_update_organization_default_visibility_to_private() { - setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "true"); - - expectHttpError(400, - format("Organization %s cannot use private project", organization.getKey()), - () -> tester.wsClient().organizations() - .updateProjectVisibility(UpdateProjectVisibilityWsRequest.builder().setOrganization(organization.getKey()).setProjectVisibility("private").build())); - } - - @Test - public void does_not_fail_to_update_project_visibility_to_private() { - String projectKey = createPublicProject(); - setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "false"); - - tester.wsClient().projects().updateVisibility(UpdateVisibilityRequest.builder().setProject(projectKey).setVisibility("private").build()); - - assertWsResponseAsAdmin(new GetRequest("api/navigation/component").setParam("componentKey", projectKey), "\"visibility\":\"private\""); - } - - @Test - public void fail_to_update_project_visibility_to_private() { - String projectKey = createPublicProject(); - setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "true"); - - expectHttpError(400, - format("Organization %s cannot use private project", organization.getKey()), - () -> tester.wsClient().projects().updateVisibility(UpdateVisibilityRequest.builder().setProject(projectKey).setVisibility("private").build())); - } - - @Test - public void does_not_fail_to_create_private_project() { - String projectKey = newProjectKey(); - setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "false"); - - tester.wsClient().projects().create(CreateRequest.builder().setKey(projectKey).setName(projectKey).setOrganization(organization.getKey()).setVisibility("public").build()); - - assertWsResponseAsAdmin(new GetRequest("api/navigation/component").setParam("componentKey", projectKey), "\"visibility\":\"public\""); - } - - @Test - public void fail_to_create_private_project() { - String projectKey = newProjectKey(); - setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "true"); - - expectHttpError(400, - format("Organization %s cannot use private project", organization.getKey()), - () -> tester.wsClient().projects() - .create(CreateRequest.builder().setKey(projectKey).setName(projectKey).setOrganization(organization.getKey()).setVisibility("private").build())); - } - - @Test - public void ui_does_not_allow_to_turn_project_to_private() { - String projectKey = createPublicProject(); - setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "true"); - - Navigation.create(orchestrator) - .logIn().submitCredentials(orgAdministrator.getLogin()) - .openProjectPermissions(projectKey) - .shouldBePublic() - .shouldNotAllowPrivate(); - } - - @Test - public void ui_allows_to_turn_project_to_private() { - String projectKey = createPublicProject(); - setServerProperty(orchestrator, "sonar.billing.preventUpdatingProjectsVisibilityToPrivate", "false"); - - tester.openBrowser() - .logIn().submitCredentials(orgAdministrator.getLogin()) - .openProjectPermissions(projectKey) - .shouldBePublic() - .turnToPrivate(); - } - - private String createPublicProject() { - String projectKey = newProjectKey(); - tester.wsClient().projects().create(CreateRequest.builder() - .setKey(projectKey) - .setName(projectKey) - .setOrganization(organization.getKey()) - .setVisibility("public") - .build()); - return projectKey; - } - - private String executeAnalysis(String projectKey) { - BuildResult buildResult = orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"), - "sonar.organization", organization.getKey(), - "sonar.projectKey", projectKey, - "sonar.login", orgAdministrator.getLogin(), - "sonar.password", orgAdministrator.getLogin())); - return ItUtils.extractCeTaskId(buildResult); - } - - private void assertWsResponseAsAdmin(GetRequest request, String expectedContent) { - WsResponse response = tester.wsClient().wsConnector().call(request).failIfNotSuccessful(); - assertThat(response.content()).contains(expectedContent); - } - - private void assertWsResponseAsUser(GetRequest request, String expectedContent, User user) { - WsResponse response = newUserWsClient(orchestrator, user.getLogin(), user.getLogin()).wsConnector().call(request).failIfNotSuccessful(); - assertThat(response.content()).contains(expectedContent); - } -} diff --git a/it/it-tests/src/test/java/it/organization/OrganizationMembershipTest.java b/it/it-tests/src/test/java/it/organization/OrganizationMembershipTest.java deleted file mode 100644 index 3f71e96d99e..00000000000 --- a/it/it-tests/src/test/java/it/organization/OrganizationMembershipTest.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.organization; - -import com.sonar.orchestrator.Orchestrator; -import it.Category6Suite; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Organizations.Organization; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import org.sonarqube.ws.client.HttpException; -import org.sonarqube.ws.client.permission.AddUserWsRequest; - -import static util.ItUtils.setServerProperty; - -public class OrganizationMembershipTest { - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator); - - @Rule - public ExpectedException expectedException = ExpectedException.none(); - - @BeforeClass - public static void setUp() { - setServerProperty(orchestrator, "sonar.organizations.anyoneCanCreate", "true"); - } - - @AfterClass - public static void tearDown() { - setServerProperty(orchestrator, "sonar.organizations.anyoneCanCreate", null); - } - - @Test - public void new_user_should_not_become_member_of_default_organization() { - User user = tester.users().generate(); - tester.organizations().assertThatNotMemberOf(null, user); - } - - @Test - public void add_and_remove_member() { - Organization organization = tester.organizations().generate(); - User user = tester.users().generate(); - - addMembership(organization, user); - tester.organizations().assertThatMemberOf(organization, user); - - removeMembership(organization, user); - tester.organizations().assertThatNotMemberOf(organization, user); - } - - @Test - public void remove_organization_admin_member() { - Organization organization = tester.organizations().generate(); - User user = tester.users().generate(); - addMembership(organization, user); - - tester.wsClient().permissions().addUser(new AddUserWsRequest().setLogin(user.getLogin()).setPermission("admin").setOrganization(organization.getKey())); - tester.organizations().assertThatMemberOf(organization, user); - - removeMembership(organization, user); - tester.organizations().assertThatNotMemberOf(organization, user); - } - - @Test - public void fail_to_remove_organization_admin_member_when_last_admin() { - Organization organization = tester.organizations().generate(); - User user = tester.users().generate(); - addMembership(organization, user); - - tester.wsClient().permissions().addUser(new AddUserWsRequest().setLogin(user.getLogin()).setPermission("admin").setOrganization(organization.getKey())); - tester.organizations().assertThatMemberOf(organization, user); - // Admin is the creator of the organization so he was granted with admin permission - tester.wsClient().organizations().removeMember(organization.getKey(), "admin"); - - expectedException.expect(HttpException.class); - expectedException.expectMessage("The last administrator member cannot be removed"); - removeMembership(organization, user); - } - - @Test - public void remove_user_remove_its_membership() { - Organization organization = tester.organizations().generate(); - User user = tester.users().generate(); - addMembership(organization, user); - - tester.users().service().deactivate(user.getLogin()); - tester.organizations().assertThatNotMemberOf(organization, user); - } - - @Test - public void user_creating_an_organization_becomes_member_of_this_organization() { - User user = tester.users().generate(); - - Organization organization = tester.as(user.getLogin()).organizations().generate(); - - tester.organizations().assertThatMemberOf(organization, user); - } - - private void addMembership(Organization organization, User user) { - tester.organizations().addMember(organization, user); - } - - private void removeMembership(Organization organization, User user) { - tester.wsClient().organizations().removeMember(organization.getKey(), user.getLogin()); - } -} diff --git a/it/it-tests/src/test/java/it/organization/OrganizationMembershipUiTest.java b/it/it-tests/src/test/java/it/organization/OrganizationMembershipUiTest.java deleted file mode 100644 index 8f39de54af8..00000000000 --- a/it/it-tests/src/test/java/it/organization/OrganizationMembershipUiTest.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.organization; - -import com.sonar.orchestrator.Orchestrator; -import it.Category6Suite; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.OrganizationTester; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Organizations.Organization; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import pageobjects.organization.MembersPage; - -import static util.ItUtils.setServerProperty; - -public class OrganizationMembershipUiTest { - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator); - - private User root; - - @Before - public void setUp() { - setServerProperty(orchestrator, "sonar.organizations.anyoneCanCreate", "true"); - root = tester.users().generate(); - tester.wsClient().roots().setRoot(root.getLogin()); - } - - @After - public void tearDown() { - setServerProperty(orchestrator, "sonar.organizations.anyoneCanCreate", null); - } - - @Test - public void should_display_members_page() { - Organization organization = tester.organizations().generate(); - User member1 = tester.users().generate(p -> p.setName("foo")); - addMember(organization, member1); - User member2 = tester.users().generate(p -> p.setName("bar")); - addMember(organization, member2); - User nonMember = tester.users().generate(); - - MembersPage page = tester.openBrowser().openOrganizationMembers(organization.getKey()); - page - .canNotAddMember() - .shouldHaveTotal(3); - page.getMembersByIdx(0).shouldBeNamed("admin", "Administrator"); - page.getMembersByIdx(1) - .shouldBeNamed(member2.getLogin(), member2.getName()); - page.getMembersByIdx(2) - .shouldBeNamed(member1.getLogin(), member1.getName()) - .shouldNotHaveActions(); - } - - @Test - public void search_for_members() { - Organization organization = tester.organizations().generate(); - User member1 = tester.users().generate(p -> p.setName("foo")); - addMember(organization, member1); - User member2 = tester.users().generate(p -> p.setName("sameprefixuser1")); - addMember(organization, member2); - // Created to verify that only the user part of the org is returned - User userWithSameNamePrefix = tester.users().generate(p -> p.setName(member2.getName() + "sameprefixuser2")); - - MembersPage page = tester.openBrowser().openOrganizationMembers(organization.getKey()); - page - .searchForMember("sameprefixuser") - .shouldHaveTotal(1); - page.getMembersByIdx(0).shouldBeNamed(member2.getLogin(), member2.getName()); - page - .searchForMember(member1.getLogin()) - .shouldHaveTotal(1); - page.getMembersByIdx(0).shouldBeNamed(member1.getLogin(), member1.getName()); - } - - @Test - public void admin_can_add_members() { - Organization organization = tester.organizations().generate(); - User user1 = tester.users().generate(u -> u.setLogin("foo")); - User user2 = tester.users().generate(); - - MembersPage page = tester.openBrowser() - .logIn().submitCredentials(root.getLogin()) - .openOrganizationMembers(organization.getKey()); - page - .shouldHaveTotal(1) - .addMember(user1.getLogin()) - .shouldHaveTotal(2); - page.getMembersByIdx(0).shouldBeNamed("admin", "Administrator").shouldHaveGroups(2); - page.getMembersByIdx(1).shouldBeNamed(user1.getLogin(), user1.getName()).shouldHaveGroups(1); - } - - @Test - public void admin_can_remove_members() { - Organization organization = tester.organizations().generate(); - User user1 = tester.users().generate(); - addMember(organization, user1); - User user2 = tester.users().generate(); - addMember(organization, user2); - - MembersPage page = tester.openBrowser() - .logIn().submitCredentials(root.getLogin()) - .openOrganizationMembers(organization.getKey()); - page.shouldHaveTotal(3) - .getMembersByIdx(1).removeMembership(); - page.shouldHaveTotal(2); - } - - @Test - public void admin_can_manage_groups() { - Organization organization = tester.organizations().generate(); - User user = tester.users().generate(u -> u.setLogin("foo")); - addMember(organization, user); - - MembersPage page = tester.openBrowser() - .logIn().submitCredentials(root.getLogin()) - .openOrganizationMembers(organization.getKey()); - // foo user - page.getMembersByIdx(1) - .manageGroupsOpen() - .manageGroupsSelect("owners") - .manageGroupsSave() - .shouldHaveGroups(2); - // admin user - page.getMembersByIdx(0) - .manageGroupsOpen() - .manageGroupsSelect("owners") - .manageGroupsSave() - .shouldHaveGroups(1); - } - - @Test - public void groups_count_should_be_updated_when_a_member_was_just_added() { - Organization organization = tester.organizations().generate(); - User user = tester.users().generate(); - - MembersPage page = tester.openBrowser() - .logIn().submitCredentials(root.getLogin()) - .openOrganizationMembers(organization.getKey()); - page - .addMember(user.getLogin()) - .getMembersByIdx(1) - .shouldHaveGroups(1) - .manageGroupsOpen() - .manageGroupsSelect("owners") - .manageGroupsSave() - .shouldHaveGroups(2); - } - - private OrganizationTester addMember(Organization organization, User member1) { - return tester.organizations().addMember(organization, member1); - } -} diff --git a/it/it-tests/src/test/java/it/organization/OrganizationTest.java b/it/it-tests/src/test/java/it/organization/OrganizationTest.java deleted file mode 100644 index fcde79399e2..00000000000 --- a/it/it-tests/src/test/java/it/organization/OrganizationTest.java +++ /dev/null @@ -1,373 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.organization; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildFailureException; -import it.Category6Suite; -import java.util.List; -import java.util.Locale; -import org.junit.After; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonarqube.test.OrganizationTester; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Organizations.Organization; -import org.sonarqube.ws.QualityProfiles; -import org.sonarqube.ws.Rules; -import org.sonarqube.ws.WsComponents; -import org.sonarqube.ws.WsUserGroups.Group; -import org.sonarqube.ws.WsUsers; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import org.sonarqube.ws.client.component.ComponentsService; -import org.sonarqube.ws.client.organization.CreateWsRequest; -import org.sonarqube.ws.client.organization.OrganizationService; -import org.sonarqube.ws.client.organization.SearchWsRequest; -import org.sonarqube.ws.client.organization.UpdateWsRequest; -import org.sonarqube.ws.client.permission.AddUserWsRequest; -import org.sonarqube.ws.client.permission.PermissionsService; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; -import static util.ItUtils.expectBadRequestError; -import static util.ItUtils.expectForbiddenError; -import static util.ItUtils.expectNotFoundError; -import static util.ItUtils.expectUnauthorizedError; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.newUserWsClient; -import static util.ItUtils.newWsClient; -import static util.ItUtils.runProjectAnalysis; -import static util.ItUtils.setServerProperty; - -public class OrganizationTest { - - private static final String SETTING_ANYONE_CAN_CREATE_ORGANIZATIONS = "sonar.organizations.anyoneCanCreate"; - private static final String DEFAULT_ORGANIZATION_KEY = "default-organization"; - private static final String NAME = "Foo Company"; - // private static final String KEY = "foo-company"; - private static final String DESCRIPTION = "the description of Foo company"; - private static final String URL = "https://www.foo.fr"; - private static final String AVATAR_URL = "https://www.foo.fr/corporate_logo.png"; - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - @Rule - public Tester tester = new Tester(orchestrator); - @Rule - public ExpectedException expectedException = ExpectedException.none(); - - @After - public void tearDown() { - setServerProperty(orchestrator, SETTING_ANYONE_CAN_CREATE_ORGANIZATIONS, null); - } - - @Test - public void default_organization_should_exist() { - Organization defaultOrg = tester.organizations().service().search(SearchWsRequest.builder().build()) - .getOrganizationsList() - .stream() - .filter(Organization::getGuarded) - .findFirst() - .orElseThrow(IllegalStateException::new); - assertThat(defaultOrg.getKey()).isEqualTo(DEFAULT_ORGANIZATION_KEY); - assertThat(defaultOrg.getName()).isEqualTo("Default Organization"); - } - - @Test - public void default_organization_can_not_be_deleted() { - expectBadRequestError(() -> tester.organizations().service().delete(DEFAULT_ORGANIZATION_KEY)); - } - - @Test - public void create_update_and_delete_organizations() { - OrganizationService service = tester.organizations().service(); - - Organization org = tester.organizations().generate(o -> o - .setName(NAME) - .setDescription(DESCRIPTION) - .setUrl(URL) - .setAvatar(AVATAR_URL) - .build()); - assertThat(org.getName()).isEqualTo(NAME); - assertThat(org.getDescription()).isEqualTo(DESCRIPTION); - assertThat(org.getUrl()).isEqualTo(URL); - assertThat(org.getAvatar()).isEqualTo(AVATAR_URL); - - verifyOrganization(org, NAME, DESCRIPTION, URL, AVATAR_URL); - assertThatBuiltInQualityProfilesExist(org); - - // update by key - service.update(new UpdateWsRequest.Builder() - .setKey(org.getKey()) - .setName("new name") - .setDescription("new description") - .setUrl("new url") - .setAvatar("new avatar url") - .build()); - verifyOrganization(org, "new name", "new description", "new url", "new avatar url"); - - // remove optional fields - service.update(new UpdateWsRequest.Builder() - .setKey(org.getKey()) - .setName("new name 2") - .setDescription("") - .setUrl("") - .setAvatar("") - .build()); - verifyOrganization(org, "new name 2", null, null, null); - - // delete organization - service.delete(org.getKey()); - assertThatOrganizationDoesNotExit(org); - assertThatQualityProfilesDoNotExist(org); - - // create again - service.create(new CreateWsRequest.Builder() - .setName(NAME) - .setKey(org.getKey()) - .build()) - .getOrganization(); - verifyOrganization(org, NAME, null, null, null); - } - - @Test - public void create_generates_key_from_name() { - // create organization without key - String name = "Foo Company to keyize"; - String expectedKey = "foo-company-to-keyize"; - Organization createdOrganization = tester.organizations().service().create(new CreateWsRequest.Builder() - .setName(name) - .build()) - .getOrganization(); - assertThat(createdOrganization.getKey()).isEqualTo(expectedKey); - verifyOrganization(createdOrganization, name, null, null, null); - } - - @Test - public void anonymous_user_cannot_administrate_organization() { - Organization org = tester.organizations().generate(); - OrganizationTester anonymousTester = tester.asAnonymous().organizations(); - - expectForbiddenError(() -> anonymousTester.generate()); - expectUnauthorizedError(() -> anonymousTester.service().update(new UpdateWsRequest.Builder().setKey(org.getKey()).setName("new name").build())); - expectUnauthorizedError(() -> anonymousTester.service().delete(org.getKey())); - } - - @Test - public void logged_in_user_cannot_administrate_organization() { - Organization org = tester.organizations().generate(); - User user = tester.users().generate(); - OrganizationTester userTester = tester.as(user.getLogin()).organizations(); - - expectForbiddenError(() -> userTester.generate()); - expectForbiddenError(() -> userTester.service().update(new UpdateWsRequest.Builder().setKey(org.getKey()).setName("new name").build())); - expectForbiddenError(() -> userTester.service().delete(org.getKey())); - } - - @Test - public void logged_in_user_can_administrate_organization_if_root() { - User user = tester.users().generate(); - OrganizationTester asUser = tester.as(user.getLogin()).organizations(); - - tester.wsClient().roots().setRoot(user.getLogin()); - Organization org = asUser.generate(); - - // delete org, attempt recreate when no root anymore and ensure it can't anymore - asUser.service().delete(org.getKey()); - - tester.wsClient().roots().unsetRoot(user.getLogin()); - expectForbiddenError(() -> asUser.generate()); - } - - @Test - public void an_organization_member_can_analyze_project() { - Organization organization = tester.organizations().generate(); - User user = tester.users().generate(); - Group group = tester.groups().generate(organization); - // users.removeGroups("sonar-users"); - tester.organizations().service().addMember(organization.getKey(), user.getLogin()); - addPermissionsToUser(organization.getKey(), user.getLogin(), "provisioning", "scan"); - - runProjectAnalysis(orchestrator, "shared/xoo-sample", - "sonar.organization", organization.getKey(), - "sonar.login", user.getLogin(), - "sonar.password", user.getLogin()); - ComponentsService componentsService = newUserWsClient(orchestrator, user.getLogin(), user.getLogin()).components(); - assertThat(searchSampleProject(organization.getKey(), componentsService).getComponentsList()).hasSize(1); - } - - @Test - public void by_default_anonymous_cannot_analyse_project_on_organization() { - Organization organization = tester.organizations().generate(); - - try { - runProjectAnalysis(orchestrator, "shared/xoo-sample", - "sonar.organization", organization.getKey()); - fail(); - } catch (BuildFailureException e) { - assertThat(e.getResult().getLogs()).contains("Insufficient privileges"); - } - - ComponentsService componentsService = newAdminWsClient(orchestrator).components(); - assertThat(searchSampleProject(organization.getKey(), componentsService).getComponentsCount()).isEqualTo(0); - } - - @Test - public void by_default_anonymous_can_browse_project_on_organization() { - Organization organization = tester.organizations().generate(); - - runProjectAnalysis(orchestrator, "shared/xoo-sample", "sonar.organization", organization.getKey(), "sonar.login", "admin", "sonar.password", "admin"); - - ComponentsService componentsService = newWsClient(orchestrator).components(); - assertThat(searchSampleProject(organization.getKey(), componentsService).getComponentsList()).hasSize(1); - } - - private void addPermissionsToUser(String orgKeyAndName, String login, String permission, String... otherPermissions) { - PermissionsService permissionsService = newAdminWsClient(orchestrator).permissions(); - permissionsService.addUser(new AddUserWsRequest().setLogin(login).setOrganization(orgKeyAndName).setPermission(permission)); - for (String otherPermission : otherPermissions) { - permissionsService.addUser(new AddUserWsRequest().setLogin(login).setOrganization(orgKeyAndName).setPermission(otherPermission)); - } - } - - @Test - public void deleting_an_organization_deletes_its_projects() { - Organization organization = tester.organizations().generate(); - - runProjectAnalysis(orchestrator, "shared/xoo-sample", - "sonar.organization", organization.getKey(), - "sonar.login", "admin", - "sonar.password", "admin"); - ComponentsService componentsService = tester.wsClient().components(); - assertThat(searchSampleProject(organization.getKey(), componentsService).getComponentsList()).hasSize(1); - - tester.organizations().service().delete(organization.getKey()); - - expectNotFoundError(() -> searchSampleProject(organization.getKey(), componentsService)); - assertThatOrganizationDoesNotExit(organization); - } - - @Test - public void return_groups_belonging_to_a_user_on_an_organization() throws Exception { - Organization organization = tester.organizations().generate(); - User user = tester.users().generate(); - tester.organizations().service().addMember(organization.getKey(), user.getLogin()); - - Group group = tester.groups().generate(organization); - tester.groups().addMemberToGroups(organization, user.getLogin(), group.getName()); - - List<WsUsers.GroupsWsResponse.Group> memberOfGroups = tester.groups().getGroupsOfUser(organization, user.getLogin()); - - assertThat(memberOfGroups).extracting(WsUsers.GroupsWsResponse.Group::getName) - .containsExactlyInAnyOrder(group.getName(), "Members"); - } - - @Test - public void anonymous_cannot_create_organizations_even_if_anyone_is_allowed_to() { - setServerProperty(orchestrator, SETTING_ANYONE_CAN_CREATE_ORGANIZATIONS, "true"); - - expectUnauthorizedError(() -> tester.asAnonymous().organizations().generate()); - } - - @Test - public void logged_in_user_can_create_organizations_if_anyone_is_allowed_to() { - setServerProperty(orchestrator, SETTING_ANYONE_CAN_CREATE_ORGANIZATIONS, "true"); - User user = tester.users().generate(); - - Organization organization = tester.as(user.getLogin()).organizations().generate(); - - assertThat(organization.getName()).isNotEmpty(); - assertThat(organization.getKey()).isNotEmpty(); - assertThat(organization.getGuarded()).isFalse(); - - List<Organization> reloadedOrgs = tester.organizations().service().search(SearchWsRequest.builder().build()).getOrganizationsList(); - assertThat(reloadedOrgs) - .filteredOn(o -> o.getKey().equals(organization.getKey())) - .hasSize(1); - } - - private WsComponents.SearchWsResponse searchSampleProject(String organizationKey, ComponentsService componentsService) { - return componentsService - .search(new org.sonarqube.ws.client.component.SearchWsRequest() - .setOrganization(organizationKey) - .setQualifiers(singletonList("TRK")) - .setQuery("sample")); - } - - private void assertThatOrganizationDoesNotExit(Organization org) { - SearchWsRequest request = new SearchWsRequest.Builder().setOrganizations(org.getKey()).build(); - assertThat(tester.organizations().service().search(request).getOrganizationsList()).isEmpty(); - } - - private void verifyOrganization(Organization createdOrganization, String name, String description, String url, - String avatarUrl) { - SearchWsRequest request = new SearchWsRequest.Builder().setOrganizations(createdOrganization.getKey()).build(); - List<Organization> result = tester.organizations().service().search(request).getOrganizationsList(); - assertThat(result).hasSize(1); - Organization searchedOrganization = result.get(0); - assertThat(searchedOrganization.getKey()).isEqualTo(createdOrganization.getKey()); - assertThat(searchedOrganization.getName()).isEqualTo(name); - if (description == null) { - assertThat(searchedOrganization.hasDescription()).isFalse(); - } else { - assertThat(searchedOrganization.getDescription()).isEqualTo(description); - } - if (url == null) { - assertThat(searchedOrganization.hasUrl()).isFalse(); - } else { - assertThat(searchedOrganization.getUrl()).isEqualTo(url); - } - if (avatarUrl == null) { - assertThat(searchedOrganization.hasAvatar()).isFalse(); - } else { - assertThat(searchedOrganization.getAvatar()).isEqualTo(avatarUrl); - } - } - - private void assertThatBuiltInQualityProfilesExist(Organization org) { - org.sonarqube.ws.client.qualityprofile.SearchWsRequest profilesRequest = new org.sonarqube.ws.client.qualityprofile.SearchWsRequest() - .setOrganizationKey(org.getKey()); - QualityProfiles.SearchWsResponse response = tester.wsClient().qualityProfiles().search(profilesRequest); - assertThat(response.getProfilesCount()).isGreaterThan(0); - - response.getProfilesList().forEach(p -> { - assertThat(p.getIsInherited()).isFalse(); - assertThat(p.getProjectCount()).isEqualTo(0); - assertThat(p.getIsBuiltIn()).isTrue(); - if (p.getName().toLowerCase(Locale.ENGLISH).contains("empty")) { - assertThat(p.getActiveRuleCount()).isEqualTo(0); - } else { - assertThat(p.getActiveRuleCount()).isGreaterThan(0); - // that allows to check the Elasticsearch index of active rules - Rules.SearchResponse activeRulesResponse = tester.wsClient().rules().search(new org.sonarqube.ws.client.rule.SearchWsRequest().setActivation(true).setQProfile(p.getKey())); - assertThat(activeRulesResponse.getTotal()).as("profile " + p.getName()).isEqualTo(p.getActiveRuleCount()); - assertThat(activeRulesResponse.getRulesCount()).isEqualTo((int) p.getActiveRuleCount()); - } - }); - } - - private void assertThatQualityProfilesDoNotExist(Organization org) { - expectNotFoundError(() -> tester.wsClient().qualityProfiles().search( - new org.sonarqube.ws.client.qualityprofile.SearchWsRequest().setOrganizationKey(org.getKey()))); - } -} diff --git a/it/it-tests/src/test/java/it/organization/PersonalOrganizationTest.java b/it/it-tests/src/test/java/it/organization/PersonalOrganizationTest.java deleted file mode 100644 index 76bf2f9eec3..00000000000 --- a/it/it-tests/src/test/java/it/organization/PersonalOrganizationTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.organization; - -import com.sonar.orchestrator.Orchestrator; -import it.Category6Suite; -import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Organizations; -import org.sonarqube.ws.WsUsers; -import org.sonarqube.ws.client.organization.SearchWsRequest; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.setServerProperty; - -public class PersonalOrganizationTest { - - private static final String SETTING_CREATE_PERSONAL_ORG = "sonar.organizations.createPersonalOrg"; - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator); - - @Before - public void setUp() { - setServerProperty(orchestrator, SETTING_CREATE_PERSONAL_ORG, "true"); - } - - @After - public void tearDown() { - setServerProperty(orchestrator, SETTING_CREATE_PERSONAL_ORG, null); - } - - @Test - public void personal_organizations_are_created_for_new_users() { - WsUsers.CreateWsResponse.User user = tester.users().generate(); - - List<Organizations.Organization> existing = tester.wsClient().organizations().search(SearchWsRequest.builder().build()).getOrganizationsList(); - assertThat(existing) - .filteredOn(o -> o.getGuarded()) - .filteredOn(o -> o.getKey().equals(user.getLogin())) - .hasSize(1) - .matches(l -> l.get(0).getName().equals(user.getName())); - - tester.organizations().assertThatMemberOf(existing.get(0), user); - } -} diff --git a/it/it-tests/src/test/java/it/organization/RootUserOnOrganizationTest.java b/it/it-tests/src/test/java/it/organization/RootUserOnOrganizationTest.java deleted file mode 100644 index 75c66ba02df..00000000000 --- a/it/it-tests/src/test/java/it/organization/RootUserOnOrganizationTest.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.organization; - -import com.sonar.orchestrator.Orchestrator; -import it.Category6Suite; -import java.sql.SQLException; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Session; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.WsRoot; -import org.sonarqube.ws.WsUsers; -import util.user.UserRule; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.expectBadRequestError; -import static util.ItUtils.expectForbiddenError; - -public class RootUserOnOrganizationTest { - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator); - - @Test - public void system_administrator_is_flagged_as_root_when_he_enables_organization_support() { - assertThat(tester.wsClient().roots().search().getRootsList()) - .extracting(WsRoot.Root::getLogin) - .containsExactly(UserRule.ADMIN_LOGIN); - } - - @Test - public void a_root_can_flag_other_user_as_root() { - WsUsers.CreateWsResponse.User user = tester.users().generate(); - tester.wsClient().roots().setRoot(user.getLogin()); - - assertThat(tester.wsClient().roots().search().getRootsList()) - .extracting(WsRoot.Root::getLogin) - .containsExactlyInAnyOrder(UserRule.ADMIN_LOGIN, user.getLogin()); - } - - @Test - public void last_root_can_not_be_unset_root() throws SQLException { - expectBadRequestError(() -> tester.wsClient().roots().unsetRoot(UserRule.ADMIN_LOGIN)); - } - - @Test - public void root_can_be_set_and_unset_via_web_services() { - WsUsers.CreateWsResponse.User user1 = tester.users().generate(); - WsUsers.CreateWsResponse.User user2 = tester.users().generate(); - Session user1Session = tester.as(user1.getLogin()); - Session user2Session = tester.as(user2.getLogin()); - - // non root can not set or unset root another user not itself - expectForbiddenError(() -> user1Session.wsClient().roots().setRoot(user2.getLogin())); - expectForbiddenError(() -> user1Session.wsClient().roots().setRoot(user1.getLogin())); - expectForbiddenError(() -> user1Session.wsClient().roots().unsetRoot(user1.getLogin())); - expectForbiddenError(() -> user2Session.wsClient().roots().unsetRoot(user1.getLogin())); - expectForbiddenError(() -> user2Session.wsClient().roots().unsetRoot(user2.getLogin())); - // admin (the first root) sets root1 as root - tester.wsClient().roots().setRoot(user1.getLogin()); - // root1 can set root root2 - user1Session.wsClient().roots().setRoot(user2.getLogin()); - // root2 can unset root root1 - user2Session.wsClient().roots().unsetRoot(user1.getLogin()); - // root2 can unset root itself as it's not the last root - user2Session.wsClient().roots().unsetRoot(user2.getLogin()); - } - -} diff --git a/it/it-tests/src/test/java/it/organization/RootUserTest.java b/it/it-tests/src/test/java/it/organization/RootUserTest.java deleted file mode 100644 index c8bdc4c8b0b..00000000000 --- a/it/it-tests/src/test/java/it/organization/RootUserTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.organization; - -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; - -import static util.ItUtils.expectForbiddenError; - -public class RootUserTest { - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator).disableOrganizations(); - - @Test - public void nobody_is_root_by_default_when_organizations_are_disabled() { - // anonymous - expectForbiddenError(() -> tester.wsClient().roots().search()); - - // admin - expectForbiddenError(() -> tester.wsClient().roots().search()); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/PluginsTest.java b/it/it-tests/src/test/java/it/plugins/PluginsTest.java deleted file mode 100644 index 7757d130d26..00000000000 --- a/it/it-tests/src/test/java/it/plugins/PluginsTest.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins; - -import com.google.common.collect.Sets; -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.OrchestratorBuilder; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import it.plugins.checks.AbapCheck; -import it.plugins.checks.CCheck; -import it.plugins.checks.Check; -import it.plugins.checks.CobolCheck; -import it.plugins.checks.CppCheck; -import it.plugins.checks.FlexCheck; -import it.plugins.checks.GroovyCheck; -import it.plugins.checks.JavaCheck; -import it.plugins.checks.JavascriptCheck; -import it.plugins.checks.PhpCheck; -import it.plugins.checks.PliCheck; -import it.plugins.checks.PythonCheck; -import it.plugins.checks.RpgCheck; -import it.plugins.checks.SwiftCheck; -import it.plugins.checks.Validation; -import it.plugins.checks.VbCheck; -import it.plugins.checks.WebCheck; -import java.io.File; -import java.util.Arrays; -import java.util.List; -import java.util.Set; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ErrorCollector; - -import static com.sonar.orchestrator.locator.FileLocation.byWildcardMavenFilename; -import static org.assertj.core.api.Assertions.fail; - -/** - * Verify that latest releases of the plugins available in update center - * are correctly supported. - */ -public class PluginsTest { - - private static final Set<String> LICENSED_PLUGINS = Sets.newHashSet( - "abap", "cobol", "cpp", "objc", "pli", "plsql", "rpg", - "swift", "vb", "vbnet"); - - private static final List<Check> CHECKS = Arrays.asList( - new AbapCheck(), - new CCheck(), new CppCheck(), - new CobolCheck(), - // FIXME css plugin is temporary disabled as for the moment incompatible with the web plugin - // new CssCheck(), - new FlexCheck(), - new GroovyCheck(), - new JavaCheck(), - new JavascriptCheck(), - new PhpCheck(), - new PliCheck(), - new PythonCheck(), - new RpgCheck(), - new SwiftCheck(), - new VbCheck(), - new WebCheck()); - - private static Orchestrator ORCHESTRATOR; - - @BeforeClass - public static void startServer() { - OrchestratorBuilder builder = Orchestrator.builderEnv() - .setZipFile(byWildcardMavenFilename(new File("../../sonar-application/target"), "sonar*.zip").getFile()); - - // FIXME JSON plugin is temporarily disabled as for the moment the github repo doesn't exist anymore installPlugin(builder, "JSON");; - installPlugin(builder, "Sonargraph"); - installPlugin(builder, "abap"); - // FIXME AEM Rules plugin is disabled because it is no more compatible with SonarQube 6.4 (ClassNotFoundException: com.google.common.base.Functions) installPlugin(builder, "aemrules"); - installPlugin(builder, "android"); - installPlugin(builder, "authbitbucket"); - installPlugin(builder, "authgithub"); - installPlugin(builder, "checkstyle"); - installPlugin(builder, "clover"); - installPlugin(builder, "cobol"); - installPlugin(builder, "codecrackercsharp"); - installPlugin(builder, "cpp"); - installPlugin(builder, "csharp"); - // FIXME css plugin is temporarily disabled as for the moment incompatible with the web plugin installPlugin(builder, "css"); - // FIXME erlang plugin is temporarily disabled because it is not compatible with SQ 6.4 until usage of Colorizer API is removed - // FIXME findbugs plugin is temporarily disabled because it is not compatible with SQ 6.4 until usage of Colorizer API is removed - installPlugin(builder, "flex"); - installPlugin(builder, "github"); - installPlugin(builder, "googleanalytics"); - installPlugin(builder, "groovy"); - installPlugin(builder, "java"); - // FIXME javaProperties plugin is temporarily disabled as for the moment the github repo doesn't exist anymore installPlugin(builder, "javaProperties"); - installPlugin(builder, "javascript"); - installPlugin(builder, "jdepend"); - installPlugin(builder, "l10nde"); - installPlugin(builder, "l10nel"); - installPlugin(builder, "l10nes"); - installPlugin(builder, "l10nfr"); - installPlugin(builder, "l10nit"); - installPlugin(builder, "l10nja"); - installPlugin(builder, "l10nko"); - installPlugin(builder, "l10npt"); - installPlugin(builder, "l10nru"); - installPlugin(builder, "l10nzh"); - installPlugin(builder, "ldap"); - installPlugin(builder, "lua"); - installPlugin(builder, "php"); - installPlugin(builder, "pitest"); - installPlugin(builder, "pli"); - installPlugin(builder, "plsql"); - installPlugin(builder, "pmd"); - // FIXME puppet plugin is temporarily disabled because it is not compatible with SQ 6.4 until usage of Colorizer API is removed - installPlugin(builder, "python"); - installPlugin(builder, "rci"); - installPlugin(builder, "rpg"); - installPlugin(builder, "scmclearcase"); - installPlugin(builder, "scmcvs"); - installPlugin(builder, "scmgit"); - installPlugin(builder, "scmjazzrtc"); - installPlugin(builder, "scmmercurial"); - installPlugin(builder, "scmperforce"); - installPlugin(builder, "scmsvn"); - installPlugin(builder, "scmtfvc"); - installPlugin(builder, "softvis3d"); - installPlugin(builder, "sonargraphintegration"); - installPlugin(builder, "status"); - installPlugin(builder, "swift"); - installPlugin(builder, "vb"); - installPlugin(builder, "vbnet"); - installPlugin(builder, "web"); - installPlugin(builder, "xanitizer"); - installPlugin(builder, "xml"); - - activateLicenses(builder); - ORCHESTRATOR = builder.build(); - ORCHESTRATOR.start(); - } - - @Rule - public ErrorCollector errorCollector = new ErrorCollector(); - - @Test - public void analysis_of_project_with_all_supported_languages() { - SonarScanner analysis = newAnalysis(); - BuildResult result = ORCHESTRATOR.executeBuildQuietly(analysis); - if (result.getLastStatus() != 0) { - fail(result.getLogs()); - } - for (Check check : CHECKS) { - System.out.println(check.getClass().getSimpleName() + "..."); - check.validate(new Validation(ORCHESTRATOR, errorCollector)); - } - } - - @Test - public void preview_analysis_of_project_with_all_supported_languages() { - SonarScanner analysis = newAnalysis(); - analysis.setProperty("sonar.analysis.mode", "issues"); - BuildResult result = ORCHESTRATOR.executeBuildQuietly(analysis); - if (result.getLastStatus() != 0) { - fail(result.getLogs()); - } - } - - private static SonarScanner newAnalysis() { - SonarScanner analysis = SonarScanner.create(Project.basedir()); - - // required to bypass usage of build-wrapper - analysis.setProperties("sonar.cfamily.build-wrapper-output.bypass", "true"); - return analysis; - } - - private static void activateLicenses(OrchestratorBuilder builder) { - LICENSED_PLUGINS.forEach(builder::activateLicense); - } - - private static void installPlugin(OrchestratorBuilder builder, String pluginKey) { - builder.setOrchestratorProperty(pluginKey + "Version", "LATEST_RELEASE"); - builder.addPlugin(pluginKey); - } - -} diff --git a/it/it-tests/src/test/java/it/plugins/Project.java b/it/it-tests/src/test/java/it/plugins/Project.java deleted file mode 100644 index c1c950f3fc0..00000000000 --- a/it/it-tests/src/test/java/it/plugins/Project.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins; - -import com.google.common.base.Function; -import java.io.File; -import java.util.Collection; -import javax.annotation.Nullable; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.lang.StringUtils; -import util.ItUtils; - -import static com.google.common.collect.FluentIterable.from; - -public class Project { - - public static File basedir() { - return ItUtils.projectDir("plugins/project"); - } - - public static Iterable<String> allFilesInDir(final String dirPath) { - Collection<File> files = FileUtils.listFiles(new File(basedir(), dirPath), null, true); - return from(files).transform(new Function<File, String>() { - @Nullable - public String apply(File file) { - // transforms /absolute/path/to/src/java/Foo.java to src/java/Foo.java - String filePath = FilenameUtils.separatorsToUnix(file.getPath()); - return dirPath + StringUtils.substringAfterLast(filePath, dirPath); - } - }); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/VersionPluginTest.java b/it/it-tests/src/test/java/it/plugins/VersionPluginTest.java deleted file mode 100644 index aecf8658c7b..00000000000 --- a/it/it-tests/src/test/java/it/plugins/VersionPluginTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins; - -import com.sonar.orchestrator.Orchestrator; -import it.Category3Suite; -import java.io.IOException; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsClient; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; - -public class VersionPluginTest { - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - private static WsClient wsClient; - - @BeforeClass - public static void init_ws_cient() { - wsClient = newAdminWsClient(orchestrator); - } - - @Before - public void deleteData() throws IOException { - orchestrator.resetData(); - } - - @Test - public void check_functional_version() { - assertThat(wsClient.wsConnector().call(new GetRequest("api/plugins/installed")).content()).contains("1.0.2 (build 42)"); - - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/AbapCheck.java b/it/it-tests/src/test/java/it/plugins/checks/AbapCheck.java deleted file mode 100644 index b734cc84bd5..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/AbapCheck.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class AbapCheck implements Check { - - public static final String DIR = "src/abap"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveIssues(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComments(DIR); - validation.mustHaveComplexity(DIR); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/CCheck.java b/it/it-tests/src/test/java/it/plugins/checks/CCheck.java deleted file mode 100644 index 7cab14f8067..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/CCheck.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class CCheck implements Check { - - public static final String DIR = "src/c"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveIssues(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComments(DIR); - validation.mustHaveComplexity(DIR); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/Check.java b/it/it-tests/src/test/java/it/plugins/checks/Check.java deleted file mode 100644 index 8427692fbd8..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/Check.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public interface Check { - void validate(Validation validation); -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/CobolCheck.java b/it/it-tests/src/test/java/it/plugins/checks/CobolCheck.java deleted file mode 100644 index bcd77d8ecad..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/CobolCheck.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class CobolCheck implements Check { - - public static final String DIR = "src/cobol"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveIssues(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComments(DIR); - validation.mustHaveComplexity(DIR); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/CppCheck.java b/it/it-tests/src/test/java/it/plugins/checks/CppCheck.java deleted file mode 100644 index 5628c900907..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/CppCheck.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class CppCheck implements Check { - - public static final String DIR = "src/cpp"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveIssues(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComments(DIR); - validation.mustHaveComplexity(DIR); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/CssCheck.java b/it/it-tests/src/test/java/it/plugins/checks/CssCheck.java deleted file mode 100644 index 5902e593042..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/CssCheck.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class CssCheck implements Check { - - public static final String DIR = "src/css"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveIssues(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComments(DIR); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/FlexCheck.java b/it/it-tests/src/test/java/it/plugins/checks/FlexCheck.java deleted file mode 100644 index aed16f64262..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/FlexCheck.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class FlexCheck implements Check { - - public static final String DIR = "src/flex"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComments(DIR); - validation.mustHaveComplexity(DIR); - validation.mustHaveIssues(DIR + "/HasIssues.as"); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/GroovyCheck.java b/it/it-tests/src/test/java/it/plugins/checks/GroovyCheck.java deleted file mode 100644 index 3b26ae89537..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/GroovyCheck.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class GroovyCheck implements Check { - - public static final String DIR = "src/groovy"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveIssues(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComments(DIR); - validation.mustHaveComplexity(DIR); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/JavaCheck.java b/it/it-tests/src/test/java/it/plugins/checks/JavaCheck.java deleted file mode 100644 index 7c9cb90ec8c..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/JavaCheck.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class JavaCheck implements Check { - - public static final String DIR = "src/java"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveIssues(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComments(DIR); - validation.mustHaveComplexity(DIR); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/JavascriptCheck.java b/it/it-tests/src/test/java/it/plugins/checks/JavascriptCheck.java deleted file mode 100644 index 0ed806a4b16..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/JavascriptCheck.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class JavascriptCheck implements Check { - - public static final String SRC_DIR = "src/js"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(SRC_DIR); - validation.mustHaveSize(SRC_DIR); - validation.mustHaveComments(SRC_DIR); - validation.mustHaveComplexity(SRC_DIR); - validation.mustHaveIssues(SRC_DIR + "/HasIssues.js"); - validation.mustHaveMeasuresGreaterThan(SRC_DIR + "/Person.js", 0, "coverage"); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/PhpCheck.java b/it/it-tests/src/test/java/it/plugins/checks/PhpCheck.java deleted file mode 100644 index c9593b1b70f..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/PhpCheck.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class PhpCheck implements Check { - - public static final String DIR = "src/php"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveIssues(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComments(DIR); - validation.mustHaveComplexity(DIR); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/PliCheck.java b/it/it-tests/src/test/java/it/plugins/checks/PliCheck.java deleted file mode 100644 index 464faadbafb..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/PliCheck.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class PliCheck implements Check { - - public static final String DIR = "src/pli"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComments(DIR); - validation.mustHaveComplexity(DIR); - validation.mustHaveIssues(DIR + "/hasissues.pli"); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/PythonCheck.java b/it/it-tests/src/test/java/it/plugins/checks/PythonCheck.java deleted file mode 100644 index 7b316faac25..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/PythonCheck.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -import it.plugins.Project; - -public class PythonCheck implements Check { - - public static final String DIR = "src/python"; - - @Override - public void validate(Validation validation) { - // all files have size measures, even empty __init__.py - validation.mustHaveSize(DIR); - - for (String filePath : Project.allFilesInDir(DIR)) { - if (filePath.endsWith("__init__.py")) { - validation.mustHaveSource(filePath); - } else { - validation.mustHaveNonEmptySource(filePath); - validation.mustHaveComments(filePath); - validation.mustHaveComplexity(filePath); - } - } - - validation.mustHaveIssues(DIR + "/hasissues.py"); - } - -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/RpgCheck.java b/it/it-tests/src/test/java/it/plugins/checks/RpgCheck.java deleted file mode 100644 index 790d3858d1b..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/RpgCheck.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class RpgCheck implements Check { - - public static final String DIR = "src/rpg"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveIssues(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComments(DIR); - validation.mustHaveComplexity(DIR); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/SwiftCheck.java b/it/it-tests/src/test/java/it/plugins/checks/SwiftCheck.java deleted file mode 100644 index 8a4329c5962..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/SwiftCheck.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class SwiftCheck implements Check { - - public static final String DIR = "src/swift"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveIssues(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComplexity(DIR); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/Validation.java b/it/it-tests/src/test/java/it/plugins/checks/Validation.java deleted file mode 100644 index de214a9e65e..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/Validation.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -import com.google.common.base.Joiner; -import com.google.gson.Gson; -import com.sonar.orchestrator.Orchestrator; -import it.plugins.Project; -import java.io.File; -import java.util.List; -import java.util.Map; -import org.hamcrest.Matchers; -import org.junit.rules.ErrorCollector; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsResponse; - -import static java.util.Arrays.asList; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; -import static util.ItUtils.newAdminWsClient; - -/** - * - * TODO must have syntax highlighting - * TODO must have duplications - * TODO must have issues with debt - * TODO must have tests - * TODO must have coverage - */ -public class Validation { - - private final Orchestrator orchestrator; - private final ErrorCollector errorCollector; - - public Validation(Orchestrator orchestrator, ErrorCollector errorCollector) { - this.orchestrator = orchestrator; - this.errorCollector = errorCollector; - } - - public void mustHaveIssues(String path) { - // TODO use the WS api/issues - mustHaveMeasuresGreaterThan(path, 1, "violations"); - } - - public void mustHaveComments(String path) { - mustHaveMeasuresGreaterThan(path, 0, "comment_lines", "comment_lines_density"); - } - - public void mustHaveComplexity(String path) { - mustHaveMeasuresGreaterThan(path, 0, "complexity"); - } - - public void mustHaveSize(String path) { - mustHaveMeasuresGreaterThan(path, 0, "ncloc", "lines"); - } - - public void mustHaveMeasuresGreaterThan(String path, int min, String... metricKeys) { - for (String filePath : toFiles(path)) { - fileMustHaveMeasures(filePath, metricKeys, min); - } - } - - private void fileMustHaveMeasures(String filePath, String[] metricKeys, int min) { - String componentKey = filePathToKey(filePath); - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(orchestrator, componentKey, metricKeys); - errorCollector.checkThat("Measures " + Joiner.on(",").join(metricKeys) + " are set on file " + filePath, componentKey, notNullValue()); - if (!measures.isEmpty()) { - for (String metricKey : metricKeys) { - Double measure = measures.get(metricKey); - errorCollector.checkThat("Measure " + metricKey + " is set on file " + filePath, measure, notNullValue()); - if (measure != null) { - errorCollector.checkThat("Measure " + metricKey + " is positive on file " + filePath, measure.intValue(), Matchers.greaterThanOrEqualTo(min)); - } - } - } - } - - /** - * Checks that each source file of the given directory is uploaded to server. - * @param path relative path to source directory or source file - */ - public void mustHaveNonEmptySource(String path) { - mustHaveSourceWithAtLeast(path, 1); - } - - public void mustHaveSource(String path) { - mustHaveSourceWithAtLeast(path, 0); - } - - private void mustHaveSourceWithAtLeast(String path, int minLines) { - for (String filePath : toFiles(path)) { - WsResponse response = newAdminWsClient(orchestrator).wsConnector().call(new GetRequest("api/sources/lines").setParam("key", filePathToKey(filePath))); - errorCollector.checkThat("Source is set on file " + filePath, response.isSuccessful(), is(true)); - Sources source = Sources.parse(response.content()); - if (source != null) { - errorCollector.checkThat("Source is empty on file " + filePath, source.getSources().size(), Matchers.greaterThanOrEqualTo(minLines)); - } - } - } - - private Iterable<String> toFiles(String path) { - File fileOrDir = new File(Project.basedir(), path); - if (!fileOrDir.exists()) { - throw new IllegalArgumentException("Path does not exist: " + fileOrDir); - } - if (fileOrDir.isDirectory()) { - return Project.allFilesInDir(path); - } - return asList(path); - } - - private String filePathToKey(String filePath) { - return "all-langs:" + filePath; - } - - public static class Sources { - - private List<Source> sources; - - private Sources(List<Source> sources) { - this.sources = sources; - } - - public List<Source> getSources() { - return sources; - } - - public static Sources parse(String json) { - Gson gson = new Gson(); - return gson.fromJson(json, Sources.class); - } - - public static class Source { - private final String line; - - private Source(String line) { - this.line = line; - } - - public String getLine() { - return line; - } - } - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/VbCheck.java b/it/it-tests/src/test/java/it/plugins/checks/VbCheck.java deleted file mode 100644 index 6cd1ca7669b..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/VbCheck.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class VbCheck implements Check { - - public static final String DIR = "src/vb"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveIssues(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComments(DIR); - validation.mustHaveComplexity(DIR); - } -} diff --git a/it/it-tests/src/test/java/it/plugins/checks/WebCheck.java b/it/it-tests/src/test/java/it/plugins/checks/WebCheck.java deleted file mode 100644 index b0cf9550a43..00000000000 --- a/it/it-tests/src/test/java/it/plugins/checks/WebCheck.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.plugins.checks; - -public class WebCheck implements Check { - - public static final String DIR = "src/web"; - - @Override - public void validate(Validation validation) { - validation.mustHaveNonEmptySource(DIR); - validation.mustHaveIssues(DIR); - validation.mustHaveSize(DIR); - validation.mustHaveComments(DIR); - } -} diff --git a/it/it-tests/src/test/java/it/previewAnalysis/ToDoTest.java b/it/it-tests/src/test/java/it/previewAnalysis/ToDoTest.java deleted file mode 100644 index ce3d94d6d55..00000000000 --- a/it/it-tests/src/test/java/it/previewAnalysis/ToDoTest.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.previewAnalysis; - -public class ToDoTest { -} diff --git a/it/it-tests/src/test/java/it/projectAdministration/BackgroundTasksTest.java b/it/it-tests/src/test/java/it/projectAdministration/BackgroundTasksTest.java deleted file mode 100644 index 33651550e75..00000000000 --- a/it/it-tests/src/test/java/it/projectAdministration/BackgroundTasksTest.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.projectAdministration; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import pageobjects.BackgroundTaskItem; -import pageobjects.BackgroundTasksPage; -import pageobjects.Navigation; -import util.user.UserRule; - -import static com.codeborne.selenide.CollectionCondition.sizeGreaterThan; -import static util.ItUtils.projectDir; -import static util.selenium.Selenese.runSelenese; - -public class BackgroundTasksTest { - - private static final String ADMIN_USER_LOGIN = "admin-user"; - - @ClassRule - public static Orchestrator ORCHESTRATOR = Category1Suite.ORCHESTRATOR; - - @Rule - public UserRule userRule = UserRule.from(ORCHESTRATOR); - - private Navigation nav = Navigation.create(ORCHESTRATOR); - - @BeforeClass - public static void beforeClass() { - executeBuild("test-project", "Test Project"); - executeBuild("test-project-2", "Another Test Project"); - } - - @Before - public void before() { - userRule.createAdminUser(ADMIN_USER_LOGIN, ADMIN_USER_LOGIN); - } - - @After - public void deleteAdminUser() { - userRule.resetUsers(); - } - - @Test - public void should_not_display_failing_and_search_and_filter_elements_on_project_level_page() throws Exception { - runSelenese(ORCHESTRATOR, "/projectAdministration/BackgroundTasksTest/should_not_display_failing_and_search_and_filter_elements_on_project_level_page.html"); - } - - @Test - public void display_scanner_context() { - nav.logIn().submitCredentials(ADMIN_USER_LOGIN); - BackgroundTasksPage page = nav.openBackgroundTasksPage(); - - page.getTasks().shouldHave(sizeGreaterThan(0)); - BackgroundTaskItem task = page.getTasksAsItems().get(0); - task.openActions() - .openScannerContext() - .assertScannerContextContains("SonarQube plugins:") - .assertScannerContextContains("Global properties:"); - } - - @Test - public void display_error_stacktrace() { - Navigation nav = Navigation.create(ORCHESTRATOR); - executeBuild("test-project", "Test Project", "2010-01-01"); - - nav.logIn().submitCredentials(ADMIN_USER_LOGIN); - BackgroundTasksPage page = nav.openBackgroundTasksPage(); - - page.getTasks().shouldHave(sizeGreaterThan(0)); - BackgroundTaskItem task = page.getTasksAsItems().get(0); - task.openActions() - .openErrorStacktrace() - .assertErrorStacktraceContains("Date of analysis cannot be older than the date of the last known analysis"); - } - - private static void executeBuild(String projectKey, String projectName) { - ORCHESTRATOR.executeBuild( - SonarScanner.create(projectDir("shared/xoo-sample")) - .setProjectKey(projectKey) - .setProjectName(projectName)); - } - - private static void executeBuild(String projectKey, String projectName, String date) { - ORCHESTRATOR.executeBuild( - SonarScanner.create(projectDir("shared/xoo-sample")) - .setProjectKey(projectKey) - .setProjectName(projectName) - .setProperty("sonar.projectDate", date)); - } -} diff --git a/it/it-tests/src/test/java/it/projectAdministration/BulkDeletionTest.java b/it/it-tests/src/test/java/it/projectAdministration/BulkDeletionTest.java deleted file mode 100644 index 602eeaab829..00000000000 --- a/it/it-tests/src/test/java/it/projectAdministration/BulkDeletionTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.projectAdministration; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import util.user.UserRule; - -import static util.ItUtils.projectDir; -import static util.selenium.Selenese.runSelenese; - -public class BulkDeletionTest { - - private static final String ADMIN_USER_LOGIN = "admin-user"; - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - @Before - public void deleteData() { - orchestrator.resetData(); - userRule.createAdminUser(ADMIN_USER_LOGIN, ADMIN_USER_LOGIN); - } - - @After - public void deleteAdminUser() { - userRule.resetUsers(); - } - - /** - * SONAR-2614, SONAR-3805 - */ - @Test - public void test_bulk_deletion_on_selected_projects() throws Exception { - // we must have several projects to test the bulk deletion - executeBuild("cameleon-1", "Sample-Project"); - executeBuild("cameleon-2", "Foo-Application"); - executeBuild("cameleon-3", "Bar-Sonar-Plugin"); - - runSelenese(orchestrator, "/projectAdministration/BulkDeletionTest/bulk-delete-filter-projects.html"); - } - - private void executeBuild(String projectKey, String projectName) { - orchestrator.executeBuild( - SonarScanner.create(projectDir("shared/xoo-sample")) - .setProjectKey(projectKey) - .setProjectName(projectName)); - } - -} diff --git a/it/it-tests/src/test/java/it/projectAdministration/ProjectAdministrationTest.java b/it/it-tests/src/test/java/it/projectAdministration/ProjectAdministrationTest.java deleted file mode 100644 index 716463c2fde..00000000000 --- a/it/it-tests/src/test/java/it/projectAdministration/ProjectAdministrationTest.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.projectAdministration; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import java.io.UnsupportedEncodingException; -import java.sql.SQLException; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import javax.annotation.Nullable; -import org.apache.commons.lang.time.DateFormatUtils; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonar.wsclient.SonarClient; -import org.sonar.wsclient.base.HttpException; -import org.sonar.wsclient.user.UserParameters; -import pageobjects.Navigation; -import pageobjects.settings.SettingsPage; -import util.user.UserRule; - -import static org.apache.commons.lang.time.DateUtils.addDays; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getComponent; -import static util.ItUtils.projectDir; -import static util.selenium.Selenese.runSelenese; - -public class ProjectAdministrationTest { - private static final String DELETE_WS_ENDPOINT = "api/projects/bulk_delete"; - - // take some day in the past - private static final String ANALYSIS_DATE = DateFormatUtils.ISO_DATE_FORMAT.format(addDays(new Date(), -1)); - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Rule - public ExpectedException expectedException = ExpectedException.none(); - - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - private Navigation nav = Navigation.create(orchestrator); - - private static final String PROJECT_KEY = "sample"; - private static final String FILE_KEY = "sample:src/main/xoo/sample/Sample.xoo"; - private String adminUser; - - @Before - public void deleteAnalysisData() throws SQLException { - orchestrator.resetData(); - adminUser = userRule.createAdminUser(); - } - - @Test - public void delete_project_by_web_service() { - scanSampleWithDate(ANALYSIS_DATE); - - assertThat(getComponent(orchestrator, PROJECT_KEY)).isNotNull(); - assertThat(getComponent(orchestrator, FILE_KEY)).isNotNull(); - - orchestrator.getServer().adminWsClient().post(DELETE_WS_ENDPOINT, "keys", PROJECT_KEY); - - assertThat(getComponent(orchestrator, PROJECT_KEY)).isNull(); - assertThat(getComponent(orchestrator, FILE_KEY)).isNull(); - } - - @Test - public void fail_when_trying_to_delete_a_file() { - expectedException.expect(HttpException.class); - scanSampleWithDate(ANALYSIS_DATE); - - assertThat(getComponent(orchestrator, PROJECT_KEY)).isNotNull(); - assertThat(getComponent(orchestrator, FILE_KEY)).isNotNull(); - - // it's forbidden to delete only some files - orchestrator.getServer().adminWsClient().post(DELETE_WS_ENDPOINT, "keys", FILE_KEY); - } - - @Test - public void fail_when_insufficient_privilege() { - expectedException.expect(HttpException.class); - scanSampleWithDate(ANALYSIS_DATE); - - assertThat(getComponent(orchestrator, PROJECT_KEY)).isNotNull(); - - // use wsClient() instead of adminWsClient() - orchestrator.getServer().wsClient().post(DELETE_WS_ENDPOINT, "keys", PROJECT_KEY); - } - - /** - * Test updated for SONAR-3570 and SONAR-5923 - */ - @Test - public void project_deletion() { - String projectAdminUser = "project-deletion-with-admin-permission-on-project"; - SonarClient wsClient = orchestrator.getServer().adminWsClient(); - try { - SonarScanner scan = SonarScanner.create(projectDir("shared/xoo-sample")); - orchestrator.executeBuild(scan); - - // Create user having admin permission on previously analysed project - wsClient.userClient().create( - UserParameters.create().login(projectAdminUser).name(projectAdminUser).password("password").passwordConfirmation("password")); - - wsClient.post("api/permissions/add_user", - "login", projectAdminUser, - "projectKey", "sample", - "permission", "admin"); - - runSelenese(orchestrator, "/projectAdministration/ProjectAdministrationTest/project-deletion/project-deletion.html"); - } finally { - wsClient.userClient().deactivate(projectAdminUser); - } - } - - // SONAR-4203 - @Test - @Ignore("refactor with wsClient") - public void delete_version_of_multimodule_project() { - GregorianCalendar today = new GregorianCalendar(); - SonarScanner build = SonarScanner.create(projectDir("shared/xoo-multi-modules-sample")) - .setProperty("sonar.dynamicAnalysis", "false") - .setProperty("sonar.projectDate", (today.get(Calendar.YEAR) - 1) + "-01-01"); - orchestrator.executeBuild(build); - - // The analysis must be run once again to have an history so that it is possible - // to set/delete version on old snapshot - build.setProperty("sonar.projectDate", today.get(Calendar.YEAR) + "-01-01"); - orchestrator.executeBuild(build); - - // There are 7 modules - assertThat(count("events where category='Version'")).as("Different number of events").isEqualTo(1); - - runSelenese(orchestrator, "/projectAdministration/ProjectAdministrationTest/project-administration/multimodule-project-modify-version.html"); - - assertThat(count("events where category='Version'")).as("Different number of events").isEqualTo(2); - - runSelenese(orchestrator, "/projectAdministration/ProjectAdministrationTest/project-administration/multimodule-project-delete-version.html"); - - assertThat(count("events where category='Version'")).as("Different number of events").isEqualTo(1); - } - - @Test - public void display_project_settings() throws UnsupportedEncodingException { - scanSample(null, null); - - SettingsPage page = nav.logIn().submitCredentials(adminUser).openSettings("sample") - .assertMenuContains("Analysis Scope") - .assertMenuContains("Category 1") - .assertMenuContains("DEV") - .assertMenuContains("project-only") - .assertMenuContains("Xoo") - .assertSettingDisplayed("sonar.dbcleaner.daysBeforeDeletingClosedIssues"); - - page.openCategory("project-only") - .assertSettingDisplayed("prop_only_on_project"); - - page.openCategory("General") - .assertStringSettingValue("sonar.dbcleaner.daysBeforeDeletingClosedIssues", "30") - .assertStringSettingValue("sonar.leak.period", "previous_version") - .assertBooleanSettingValue("sonar.dbcleaner.cleanDirectory", true) - .setStringValue("sonar.dbcleaner.daysBeforeDeletingClosedIssues", "1") - .assertStringSettingValue("sonar.dbcleaner.daysBeforeDeletingClosedIssues", "1"); - } - - @Test - public void display_module_settings() throws UnsupportedEncodingException { - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample"))); - - nav.logIn().submitCredentials(adminUser) - .openSettings("com.sonarsource.it.samples:multi-modules-sample:module_a") - .assertMenuContains("Analysis Scope") - .assertSettingDisplayed("sonar.coverage.exclusions"); - } - - private void scanSampleWithDate(String date) { - scanSample(date, null); - } - - private void scanSample(@Nullable String date, @Nullable String profile) { - SonarScanner scan = SonarScanner.create(projectDir("shared/xoo-sample")) - .setProperty("sonar.cpd.exclusions", "**/*"); - if (date != null) { - scan.setProperty("sonar.projectDate", date); - } - if (profile != null) { - scan.setProfile(profile); - } - orchestrator.executeBuild(scan); - } - - private int count(String condition) { - return orchestrator.getDatabase().countSql("select count(1) from " + condition); - } - -} diff --git a/it/it-tests/src/test/java/it/projectAdministration/ProjectKeyPageTest.java b/it/it-tests/src/test/java/it/projectAdministration/ProjectKeyPageTest.java deleted file mode 100644 index ec55c8fe7ae..00000000000 --- a/it/it-tests/src/test/java/it/projectAdministration/ProjectKeyPageTest.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.projectAdministration; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import pageobjects.Navigation; -import pageobjects.ProjectKeyPage; - -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.WebDriverRunner.url; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.projectDir; - -public class ProjectKeyPageTest { - - @ClassRule - public static Orchestrator ORCHESTRATOR = Category1Suite.ORCHESTRATOR; - - private static WsClient wsClient; - - @BeforeClass - public static void setUp() { - wsClient = newAdminWsClient(ORCHESTRATOR); - } - - @Before - public void cleanUp() { - ORCHESTRATOR.resetData(); - } - - private Navigation nav = Navigation.create(ORCHESTRATOR); - - @Test - public void change_key_when_no_modules() { - createProject("sample"); - - ProjectKeyPage page = openPage("sample"); - page.assertSimpleUpdate().trySimpleUpdate("another"); - - assertThat(url()).endsWith("/project/key?id=another"); - } - - @Test - public void fail_to_change_key_when_no_modules() { - createProject("sample"); - createProject("another"); - - ProjectKeyPage page = openPage("sample"); - page.assertSimpleUpdate().trySimpleUpdate("another"); - - $(".alert.alert-danger").shouldBe(visible); - assertThat(url()).endsWith("/project/key?id=sample"); - } - - @Test - public void change_key_of_multi_modules_project() { - analyzeProject("shared/xoo-multi-modules-sample", "sample"); - - ProjectKeyPage page = openPage("sample"); - page.openFineGrainedUpdate().tryFineGrainedUpdate("sample", "another"); - - assertThat(url()).endsWith("/project/key?id=another"); - } - - @Test - public void fail_to_change_key_of_multi_modules_project() { - analyzeProject("shared/xoo-multi-modules-sample", "sample"); - createProject("another"); - - ProjectKeyPage page = openPage("sample"); - page.openFineGrainedUpdate().tryFineGrainedUpdate("sample", "another"); - - $(".alert.alert-danger").shouldBe(visible); - assertThat(url()).endsWith("/project/key?id=sample"); - } - - @Test - public void change_key_of_module_of_multi_modules_project() { - analyzeProject("shared/xoo-multi-modules-sample", "sample"); - - ProjectKeyPage page = openPage("sample"); - page.openFineGrainedUpdate().tryFineGrainedUpdate("sample:module_a:module_a1", "another"); - - $("#update-key-confirmation-form").shouldNotBe(visible); - - nav.openProjectKey("another"); - assertThat(url()).endsWith("/project/key?id=another"); - } - - @Test - public void fail_to_change_key_of_module_of_multi_modules_project() { - analyzeProject("shared/xoo-multi-modules-sample", "sample"); - createProject("another"); - - ProjectKeyPage page = openPage("sample"); - page.openFineGrainedUpdate().tryFineGrainedUpdate("sample:module_a:module_a1", "another"); - - $(".alert.alert-danger").shouldBe(visible); - } - - @Test - public void bulk_change() { - analyzeProject("shared/xoo-multi-modules-sample", "sample"); - - ProjectKeyPage page = openPage("sample"); - page.assertBulkChange().simulateBulkChange("sample", "another"); - - $("#bulk-update-results").shouldBe(visible); - page.assertBulkChangeSimulationResult("sample", "another") - .assertBulkChangeSimulationResult("sample:module_a:module_a1", "another:module_a:module_a1"); - - page.confirmBulkUpdate().assertSuccessfulBulkUpdate(); - } - - @Test - public void fail_to_bulk_change_because_no_changed_key() { - analyzeProject("shared/xoo-multi-modules-sample", "sample"); - - ProjectKeyPage page = openPage("sample"); - page.assertBulkChange().simulateBulkChange("random", "another"); - - $("#bulk-update-nothing").shouldBe(visible); - $("#bulk-update-results").shouldNotBe(visible); - } - - @Test - public void fail_to_bulk_change_because_of_duplications() { - analyzeProject("shared/xoo-multi-modules-sample", "sample"); - - ProjectKeyPage page = openPage("sample"); - page.assertBulkChange().simulateBulkChange("module_a1", "module_a2"); - - $("#bulk-update-duplicate").shouldBe(visible); - $("#bulk-update-results").shouldBe(visible); - - page.assertBulkChangeSimulationResult("sample:module_a:module_a1", "sample:module_a:module_a2") - .assertDuplicated("sample:module_a:module_a1"); - } - - private ProjectKeyPage openPage(String projectKey) { - nav.logIn().submitCredentials("admin", "admin"); - return nav.openProjectKey(projectKey); - } - - private static void createProject(String projectKey) { - wsClient.wsConnector().call(new PostRequest("api/projects/create") - .setParam("key", projectKey) - .setParam("name", projectKey)); - } - - private static void analyzeProject(String path, String projectKey) { - ORCHESTRATOR.executeBuild(SonarScanner.create(projectDir(path)) - .setProjectKey(projectKey)); - } -} diff --git a/it/it-tests/src/test/java/it/projectAdministration/ProjectLinksPageTest.java b/it/it-tests/src/test/java/it/projectAdministration/ProjectLinksPageTest.java deleted file mode 100644 index e9a96bd5a9a..00000000000 --- a/it/it-tests/src/test/java/it/projectAdministration/ProjectLinksPageTest.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.projectAdministration; - -import com.codeborne.selenide.Condition; -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.ws.WsProjectLinks.CreateWsResponse; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.projectlinks.CreateWsRequest; -import org.sonarqube.ws.client.projectlinks.DeleteWsRequest; -import pageobjects.Navigation; -import pageobjects.ProjectLinkItem; -import pageobjects.ProjectLinksPage; -import util.user.UserRule; - -import static com.codeborne.selenide.Condition.hasText; -import static com.codeborne.selenide.Selenide.$; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.projectDir; - -public class ProjectLinksPageTest { - - @ClassRule - public static Orchestrator ORCHESTRATOR = Category1Suite.ORCHESTRATOR; - - private Navigation nav = Navigation.create(ORCHESTRATOR); - - @Rule - public UserRule userRule = UserRule.from(ORCHESTRATOR); - - private static WsClient wsClient; - private long customLinkId; - private String adminUser; - - @BeforeClass - public static void setUp() { - wsClient = newAdminWsClient(ORCHESTRATOR); - - ORCHESTRATOR.resetData(); - ORCHESTRATOR.executeBuild( - SonarScanner.create(projectDir("shared/xoo-sample")) - .setProperty("sonar.links.homepage", "http://example.com")); - } - - @Before - public void prepare() { - customLinkId = Long.parseLong(createCustomLink().getLink().getId()); - adminUser = userRule.createAdminUser(); - } - - @After - public void clean() { - deleteLink(customLinkId); - } - - @Test - public void should_list_links() { - ProjectLinksPage page = openPage(); - - page.getLinks().shouldHaveSize(2); - - List<ProjectLinkItem> links = page.getLinksAsItems(); - ProjectLinkItem homepageLink = links.get(0); - ProjectLinkItem customLink = links.get(1); - - homepageLink.getName().should(hasText("Home")); - homepageLink.getType().should(hasText("sonar.links.homepage")); - homepageLink.getUrl().should(hasText("http://example.com")); - homepageLink.getDeleteButton().shouldNot(Condition.present); - - customLink.getName().should(hasText("Custom")); - customLink.getType().shouldNot(Condition.present); - customLink.getUrl().should(hasText("http://example.org/custom")); - customLink.getDeleteButton().shouldBe(Condition.visible); - } - - @Test - public void should_create_link() { - ProjectLinksPage page = openPage(); - - page.getLinks().shouldHaveSize(2); - - $("#create-project-link").click(); - $("#create-link-name").setValue("Test"); - $("#create-link-url").setValue("http://example.com/test"); - $("#create-link-confirm").click(); - - page.getLinks().shouldHaveSize(3); - - ProjectLinkItem testLink = page.getLinksAsItems().get(2); - - testLink.getName().should(hasText("Test")); - testLink.getType().shouldNot(Condition.present); - testLink.getUrl().should(hasText("http://example.com/test")); - testLink.getDeleteButton().shouldBe(Condition.visible); - } - - @Test - public void should_delete_link() { - ProjectLinksPage page = openPage(); - - page.getLinks().shouldHaveSize(2); - - List<ProjectLinkItem> links = page.getLinksAsItems(); - ProjectLinkItem customLink = links.get(1); - - customLink.getDeleteButton().click(); - $("#delete-link-confirm").click(); - - page.getLinks().shouldHaveSize(1); - } - - private CreateWsResponse createCustomLink() { - return wsClient.projectLinks().create(new CreateWsRequest() - .setProjectKey("sample") - .setName("Custom") - .setUrl("http://example.org/custom")); - } - - private void deleteLink(long id) { - try { - wsClient.projectLinks().delete(new DeleteWsRequest().setId(id)); - } catch (Exception e) { - // fail silently - } - } - - private ProjectLinksPage openPage() { - nav.logIn().submitCredentials(adminUser, adminUser); - return nav.openProjectLinks("sample"); - } -} diff --git a/it/it-tests/src/test/java/it/projectAdministration/ProjectPermissionsTest.java b/it/it-tests/src/test/java/it/projectAdministration/ProjectPermissionsTest.java deleted file mode 100644 index e1b3c33cb52..00000000000 --- a/it/it-tests/src/test/java/it/projectAdministration/ProjectPermissionsTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.projectAdministration; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import pageobjects.Navigation; -import pageobjects.ProjectPermissionsPage; -import util.user.UserRule; - -import static util.ItUtils.projectDir; -import static util.selenium.Selenese.runSelenese; - -public class ProjectPermissionsTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - private Navigation nav = Navigation.create(orchestrator); - private String adminUser; - - @BeforeClass - public static void beforeClass() { - executeBuild("project-permissions-project", "Test Project"); - executeBuild("project-permissions-project-2", "Another Test Project"); - } - - @Before - public void before() { - adminUser = userRule.createAdminUser(); - } - - @Test - public void test_project_permissions_page_shows_only_single_project() throws Exception { - runSelenese(orchestrator, "/projectAdministration/ProjectPermissionsTest/test_project_permissions_page_shows_only_single_project.html"); - } - - @Test - public void change_project_visibility() { - ProjectPermissionsPage page = nav.logIn().submitCredentials(adminUser).openProjectPermissions("project-permissions-project"); - page - .shouldBePublic() - .turnToPrivate() - .turnToPublic(); - } - - private static void executeBuild(String projectKey, String projectName) { - orchestrator.executeBuild( - SonarScanner.create(projectDir("shared/xoo-sample")) - .setProjectKey(projectKey) - .setProjectName(projectName) - ); - } -} diff --git a/it/it-tests/src/test/java/it/projectAdministration/ProjectQualityGatePageTest.java b/it/it-tests/src/test/java/it/projectAdministration/ProjectQualityGatePageTest.java deleted file mode 100644 index 2484cd298b6..00000000000 --- a/it/it-tests/src/test/java/it/projectAdministration/ProjectQualityGatePageTest.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.projectAdministration; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import com.sonar.orchestrator.Orchestrator; -import it.Category1Suite; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Ignore; -import org.junit.Test; -import org.sonar.wsclient.qualitygate.QualityGate; -import org.sonar.wsclient.qualitygate.QualityGateClient; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.qualitygate.SelectWsRequest; -import pageobjects.Navigation; -import pageobjects.ProjectQualityGatePage; - -import static util.ItUtils.newAdminWsClient; - -public class ProjectQualityGatePageTest { - - @ClassRule - public static Orchestrator ORCHESTRATOR = Category1Suite.ORCHESTRATOR; - - private Navigation nav = Navigation.create(ORCHESTRATOR); - - private static WsClient wsClient; - - @BeforeClass - public static void prepare() { - wsClient = newAdminWsClient(ORCHESTRATOR); - } - - @Before - public void setUp() { - ORCHESTRATOR.resetData(); - - wsClient.wsConnector().call(new PostRequest("api/projects/create") - .setParam("name", "Sample") - .setParam("key", "sample")); - } - - @Test - public void should_display_default() { - QualityGate customQualityGate = createCustomQualityGate("should_display_default"); - qualityGateClient().setDefault(customQualityGate.id()); - - ProjectQualityGatePage page = openPage(); - SelenideElement selectedQualityGate = page.getSelectedQualityGate(); - selectedQualityGate.should(Condition.hasText("Default")); - selectedQualityGate.should(Condition.hasText(customQualityGate.name())); - } - - @Test - public void should_display_custom() { - QualityGate customQualityGate = createCustomQualityGate("should_display_custom"); - associateWithQualityGate(customQualityGate); - - ProjectQualityGatePage page = openPage(); - SelenideElement selectedQualityGate = page.getSelectedQualityGate(); - selectedQualityGate.shouldNot(Condition.hasText("Default")); - selectedQualityGate.should(Condition.hasText(customQualityGate.name())); - } - - @Test - public void should_display_none() { - qualityGateClient().unsetDefault(); - - ProjectQualityGatePage page = openPage(); - page.assertNotSelected(); - } - - @Test - public void should_set_custom() { - QualityGate customQualityGate = createCustomQualityGate("should_set_custom"); - - ProjectQualityGatePage page = openPage(); - page.setQualityGate(customQualityGate.name()); - - SelenideElement selectedQualityGate = page.getSelectedQualityGate(); - selectedQualityGate.should(Condition.hasText(customQualityGate.name())); - } - - @Test - public void should_set_default() { - QualityGate customQualityGate = createCustomQualityGate("should_set_default"); - qualityGateClient().setDefault(customQualityGate.id()); - - ProjectQualityGatePage page = openPage(); - page.setQualityGate(customQualityGate.name()); - - SelenideElement selectedQualityGate = page.getSelectedQualityGate(); - selectedQualityGate.should(Condition.hasText("Default")); - selectedQualityGate.should(Condition.hasText(customQualityGate.name())); - } - - @Test - @Ignore("find a way to select None") - public void should_set_none() { - qualityGateClient().unsetDefault(); - QualityGate customQualityGate = createCustomQualityGate("should_set_none"); - associateWithQualityGate(customQualityGate); - - ProjectQualityGatePage page = openPage(); - page.setQualityGate(""); - - page.assertNotSelected(); - } - - private ProjectQualityGatePage openPage() { - nav.logIn().submitCredentials("admin", "admin"); - return nav.openProjectQualityGate("sample"); - } - - private static QualityGate createCustomQualityGate(String name) { - return qualityGateClient().create(name); - } - - private void associateWithQualityGate(QualityGate qualityGate) { - wsClient.qualityGates().associateProject(new SelectWsRequest().setProjectKey("sample").setGateId(qualityGate.id())); - } - - private static QualityGateClient qualityGateClient() { - return ORCHESTRATOR.getServer().adminWsClient().qualityGateClient(); - } -} diff --git a/it/it-tests/src/test/java/it/projectEvent/EventTest.java b/it/it-tests/src/test/java/it/projectEvent/EventTest.java deleted file mode 100644 index ec7b9df723d..00000000000 --- a/it/it-tests/src/test/java/it/projectEvent/EventTest.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.projectEvent; - -import com.google.common.collect.Lists; -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import java.util.List; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Ignore; -import org.junit.Test; -import org.sonar.wsclient.services.Event; -import org.sonar.wsclient.services.EventQuery; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsConnector; -import org.sonarqube.ws.client.WsResponse; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.projectDir; - -@Ignore("refactor using wsClient") -public class EventTest { - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Before - public void setUp() throws Exception { - orchestrator.resetData(); - } - - @Test - public void old_ws_events_does_not_allow_creating_events_on_modules() { - SonarScanner sampleProject = SonarScanner.create(projectDir("shared/xoo-multi-modules-sample")); - orchestrator.executeBuild(sampleProject); - - WsConnector wsConnector = ItUtils.newAdminWsClient(orchestrator).wsConnector(); - WsResponse response = wsConnector.call(newCreateEventRequest("com.sonarsource.it.samples:multi-modules-sample", "bar")); - assertThat(response.code()) - .isEqualTo(200); - - assertThat(wsConnector.call(newCreateEventRequest("com.sonarsource.it.samples:multi-modules-sample:module_a", "bar")).code()) - .isEqualTo(400); - } - - private static PostRequest newCreateEventRequest(String componentKey, String eventName) { - return new PostRequest("/api/events") - .setParam("resource", componentKey) - .setParam("name", eventName) - .setParam("category", "Foo"); - } - - /** - * SONAR-3308 - */ - @Test - public void keep_only_one_event_per_version_in_project_history() throws Exception { - // first analyse the 1.0-SNAPSHOT version - executeAnalysis(); - // then analyse the 1.0 version - executeAnalysis("sonar.projectVersion", "1.0"); - // and do this all over again - executeAnalysis(); - executeAnalysis("sonar.projectVersion", "1.0"); - - // there should be only 1 "0.1-SNAPSHOT" event and only 1 "0.1" event - List<Event> events = orchestrator.getServer().getWsClient().findAll(new EventQuery().setResourceKey("sample")); - assertThat(events.size()).isEqualTo(2); - List<String> eventNames = Lists.newArrayList(events.get(0).getName(), events.get(1).getName()); - assertThat(eventNames).contains("1.0", "1.0-SNAPSHOT"); - } - - private static void executeAnalysis(String... properties) { - SonarScanner sampleProject = SonarScanner.create(projectDir("shared/xoo-sample")).setProperties(properties); - orchestrator.executeBuild(sampleProject); - } -} diff --git a/it/it-tests/src/test/java/it/projectEvent/ProjectActivityPageTest.java b/it/it-tests/src/test/java/it/projectEvent/ProjectActivityPageTest.java deleted file mode 100644 index 8128fb2dc7d..00000000000 --- a/it/it-tests/src/test/java/it/projectEvent/ProjectActivityPageTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.projectEvent; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import java.util.List; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import pageobjects.Navigation; -import pageobjects.ProjectActivityPage; -import pageobjects.ProjectAnalysisItem; -import util.user.UserRule; - -import static util.ItUtils.projectDir; - -public class ProjectActivityPageTest { - - @ClassRule - public static Orchestrator ORCHESTRATOR = Category4Suite.ORCHESTRATOR; - - @Rule - public UserRule userRule = UserRule.from(ORCHESTRATOR); - - private Navigation nav = Navigation.create(ORCHESTRATOR); - - @Before - public void setUp() throws Exception { - ORCHESTRATOR.resetData(); - } - - @Test - public void should_list_snapshots() { - analyzeProject("shared/xoo-history-v1", "2014-10-19"); - analyzeProject("shared/xoo-history-v2", "2014-11-13"); - - ProjectActivityPage page = openPage(); - page.getAnalyses().shouldHaveSize(2); - - List<ProjectAnalysisItem> analyses = page.getAnalysesAsItems(); - analyses.get(0) - .shouldHaveEventWithText("1.0-SNAPSHOT") - .shouldNotHaveDeleteButton(); - - analyses.get(1) - .shouldHaveEventWithText("0.9-SNAPSHOT") - .shouldHaveDeleteButton(); - } - - @Test - public void add_change_delete_custom_event() { - analyzeProject(); - openPage().getLastAnalysis() - .addCustomEvent("foo") - .changeLastEvent("bar") - .deleteLastEvent(); - } - - @Test - public void delete_analysis() { - analyzeProject(); - analyzeProject(); - openPage().getFirstAnalysis().delete(); - } - - private ProjectActivityPage openPage() { - String userAdmin = userRule.createAdminUser(); - nav.logIn().submitCredentials(userAdmin, userAdmin); - return nav.openProjectActivity("sample"); - } - - private static void analyzeProject() { - ORCHESTRATOR.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - } - - private static void analyzeProject(String path, String date) { - ORCHESTRATOR.executeBuild(SonarScanner.create(projectDir(path)).setProperties("sonar.projectDate", date)); - } -} diff --git a/it/it-tests/src/test/java/it/projectSearch/LeakProjectsPageTest.java b/it/it-tests/src/test/java/it/projectSearch/LeakProjectsPageTest.java deleted file mode 100644 index 0e799250639..00000000000 --- a/it/it-tests/src/test/java/it/projectSearch/LeakProjectsPageTest.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.projectSearch; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category6Suite; -import java.util.ArrayList; -import java.util.List; -import javax.annotation.Nullable; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Organizations.Organization; -import pageobjects.projects.ProjectsPage; - -import static com.codeborne.selenide.WebDriverRunner.url; -import static java.util.Arrays.asList; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newProjectKey; -import static util.ItUtils.projectDir; -import static util.ItUtils.resetSettings; -import static util.ItUtils.restoreProfile; -import static util.ItUtils.setServerProperty; - -public class LeakProjectsPageTest { - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator); - - private Organization organization; - - @BeforeClass - public static void beforeClass() { - setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis"); - } - - @AfterClass - public static void tearDown() { - resetSettings(orchestrator, null, "sonar.leak.period"); - } - - @Before - public void setUp() { - organization = tester.organizations().generate(); - restoreProfile(orchestrator, SearchProjectsTest.class.getResource("/projectSearch/SearchProjectsTest/with-many-rules.xml"), organization.getKey()); - } - - @Test - public void should_display_leak_information() { - // This project has 0% duplication on new code - String projectKey2 = newProjectKey(); - analyzeProject(projectKey2, "projectSearch/xoo-history-v1", "2016-12-31"); - analyzeProject(projectKey2, "projectSearch/xoo-history-v2", null); - - // This project has no duplication on new code - String projectKey1 = newProjectKey(); - analyzeProject(projectKey1, "shared/xoo-sample", "2016-12-31"); - analyzeProject(projectKey1, "shared/xoo-sample", null); - - // Check the facets and project cards - ProjectsPage page = tester.openBrowser().openProjects(organization.getKey()); - page.changePerspective("Leak"); - assertThat(url()).endsWith("/projects?view=leak"); - page.shouldHaveTotal(2); - page.getProjectByKey(projectKey2) - .shouldHaveMeasure("new_reliability_rating", "0A") - .shouldHaveMeasure("new_security_rating", "0A") - .shouldHaveMeasure("new_maintainability_rating", "17A") - .shouldHaveMeasure("new_coverage", "–") - .shouldHaveMeasure("new_duplicated_lines_density", "0.0%") - .shouldHaveMeasure("new_lines", "17"); - page.getFacetByProperty("new_duplications") - .shouldHaveValue("1", "1") - .shouldHaveValue("2", "0") - .shouldHaveValue("3", "0") - .shouldHaveValue("4", "0") - .shouldHaveValue("5", "0") - .shouldHaveValue("6", "1"); - } - - private void analyzeProject(String projectKey, String relativePath, @Nullable String analysisDate) { - List<String> keyValueProperties = new ArrayList<>(asList( - "sonar.projectKey", projectKey, - "sonar.organization", organization.getKey(), - "sonar.profile", "with-many-rules", - "sonar.login", "admin", "sonar.password", "admin", - "sonar.scm.disabled", "false")); - if (analysisDate != null) { - keyValueProperties.add("sonar.projectDate"); - keyValueProperties.add(analysisDate); - } - orchestrator.executeBuild(SonarScanner.create(projectDir(relativePath), keyValueProperties.toArray(new String[0]))); - } -} diff --git a/it/it-tests/src/test/java/it/projectSearch/ProjectsPageTest.java b/it/it-tests/src/test/java/it/projectSearch/ProjectsPageTest.java deleted file mode 100644 index 6ce32eccae5..00000000000 --- a/it/it-tests/src/test/java/it/projectSearch/ProjectsPageTest.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.projectSearch; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.rules.RuleChain; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.WsUsers; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.project.DeleteRequest; -import pageobjects.Navigation; -import pageobjects.projects.ProjectsPage; - -import static com.codeborne.selenide.Selenide.clearBrowserLocalStorage; -import static com.codeborne.selenide.WebDriverRunner.url; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.projectDir; - -public class ProjectsPageTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - private static final String PROJECT_KEY = "key-foo"; - private static Tester tester = new Tester(orchestrator).disableOrganizations(); - - @ClassRule - public static RuleChain ruleChain = RuleChain.outerRule(orchestrator) - .around(tester); - - @BeforeClass - public static void setUp() { - orchestrator.resetData(); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample")).setProjectKey(PROJECT_KEY)); - orchestrator.executeBuild(SonarScanner.create(projectDir("duplications/file-duplications")).setProjectKey("key-bar")); - } - - @AfterClass - public static void tearDown() { - tester.wsClient().projects().delete(DeleteRequest.builder().setKey(PROJECT_KEY).build()); - tester.wsClient().projects().delete(DeleteRequest.builder().setKey("key-bar").build()); - } - - @Before - public void before() { - clearBrowserLocalStorage(); - } - - @Test - public void should_display_projects() { - ProjectsPage page = tester.openBrowser().openProjects(); - page.shouldHaveTotal(2); - page.getProjectByKey(PROJECT_KEY) - .shouldHaveMeasure("reliability_rating", "A") - .shouldHaveMeasure("security_rating", "A") - .shouldHaveMeasure("sqale_rating", "A") - .shouldHaveMeasure("duplicated_lines_density", "0.0%") - .shouldHaveMeasure("ncloc", "13") - .shouldHaveMeasure("ncloc", "Xoo"); - } - - @Test - public void should_display_facets() { - ProjectsPage page = tester.openBrowser().openProjects(); - page.getFacetByProperty("duplications") - .shouldHaveValue("1", "1") - .shouldHaveValue("2", "1") - .shouldHaveValue("3", "1") - .shouldHaveValue("4", "1") - .shouldHaveValue("5", "1") - .shouldHaveValue("6", "0"); - } - - @Test - public void should_filter_using_facet() { - ProjectsPage page = tester.openBrowser().openProjects(); - page.shouldHaveTotal(2); - page.getFacetByProperty("duplications").selectValue("3"); - page.shouldHaveTotal(1); - } - - @Test - public void should_open_default_page() { - // default page can be "All Projects" or "Favorite Projects" depending on your last choice - Navigation nav = tester.openBrowser(); - ProjectsPage page = nav.openProjects(); - - // all projects for anonymous user with default sorting to analysis date - page.shouldHaveTotal(2).shouldDisplayAllProjectsWidthSort("-analysis_date"); - - // all projects by default for logged in user - WsUsers.CreateWsResponse.User administrator = tester.users().generateAdministrator(); - page = nav.logIn().submitCredentials(administrator.getLogin()).openProjects(); - page.shouldHaveTotal(2).shouldDisplayAllProjects(); - - // favorite one project - WsClient administratorWsClient = tester.as(administrator.getLogin()).wsClient(); - administratorWsClient.favorites().add(PROJECT_KEY); - page = nav.openProjects(); - page.shouldHaveTotal(1).shouldDisplayFavoriteProjects(); - - // un-favorite this project - administratorWsClient.favorites().remove(PROJECT_KEY); - page = nav.openProjects(); - page.shouldHaveTotal(2).shouldDisplayAllProjects(); - - // select favorite - page.selectFavoriteProjects(); - page = nav.openProjects(); - page.shouldHaveTotal(0).shouldDisplayFavoriteProjects(); - - // select all - page.selectAllProjects(); - page = nav.openProjects(); - page.shouldHaveTotal(2).shouldDisplayAllProjects(); - } - - @Test - public void should_add_language_to_facet() { - ProjectsPage page = tester.openBrowser().openProjects(); - page.getFacetByProperty("languages") - .selectOptionItem("xoo2") - .shouldHaveValue("xoo2", "0"); - } - - @Test - public void should_add_tag_to_facet() { - // Add some tags to this project - tester.wsClient().wsConnector().call( - new PostRequest("api/project_tags/set") - .setParam("project", PROJECT_KEY) - .setParam("tags", "aa,bb,cc,dd,ee,ff,gg,hh,ii,jj,zz")); - - ProjectsPage page = tester.openBrowser().openProjects(); - page.getFacetByProperty("tags") - .shouldHaveValue("aa", "1") - .shouldHaveValue("ii", "1") - .selectOptionItem("zz") - .shouldHaveValue("zz", "1"); - } - - @Test - public void should_switch_between_perspectives() { - WsUsers.CreateWsResponse.User administrator = tester.users().generateAdministrator(); - ProjectsPage page = tester.openBrowser() - .logIn().submitCredentials(administrator.getLogin()) - .openProjects(); - page.changePerspective("Risk"); - assertThat(url()).endsWith("/projects?view=visualizations&visualization=risk"); - page.changePerspective("Leak"); - assertThat(url()).endsWith("/projects?view=leak"); - } - - @Test - public void should_sort_by_facet() { - ProjectsPage page = tester.openBrowser().openProjects(); - page.sortProjects("Duplications"); - page.getProjectByIdx(0).shouldHaveMeasure("duplicated_lines_density", "63.7%"); - page.invertSorting(); - page.getProjectByIdx(0).shouldHaveMeasure("duplicated_lines_density", "0.0%"); - } - - @Test - public void should_search_for_project() { - ProjectsPage page = tester.openBrowser().openProjects(); - page.searchProject("s").shouldHaveTotal(2); - page.searchProject("sam").shouldHaveTotal(1); - } - - @Test - public void should_search_for_project_and_keep_other_filters() { - ProjectsPage page = tester.openBrowser().openProjects(); - page.shouldHaveTotal(2); - page.getFacetByProperty("duplications").selectValue("3"); - page.shouldHaveTotal(1); - page.searchProject("sample").shouldHaveTotal(0); - } -} diff --git a/it/it-tests/src/test/java/it/projectSearch/SearchProjectsTest.java b/it/it-tests/src/test/java/it/projectSearch/SearchProjectsTest.java deleted file mode 100644 index 534e0688156..00000000000 --- a/it/it-tests/src/test/java/it/projectSearch/SearchProjectsTest.java +++ /dev/null @@ -1,306 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.projectSearch; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category6Suite; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import org.assertj.core.groups.Tuple; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Common; -import org.sonarqube.ws.Organizations.Organization; -import org.sonarqube.ws.WsComponents.Component; -import org.sonarqube.ws.WsComponents.SearchProjectsWsResponse; -import org.sonarqube.ws.client.component.SearchProjectsRequest; -import org.sonarqube.ws.client.project.CreateRequest; - -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.groups.Tuple.tuple; -import static util.ItUtils.concat; -import static util.ItUtils.newProjectKey; -import static util.ItUtils.projectDir; -import static util.ItUtils.restoreProfile; -import static util.ItUtils.sanitizeTimezones; -import static util.ItUtils.setServerProperty; - -/** - * Tests WS api/components/search_projects - */ -public class SearchProjectsTest { - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator); - - private Organization organization; - - @Before - public void setUp() { - organization = tester.organizations().generate(); - restoreProfile(orchestrator, SearchProjectsTest.class.getResource("/projectSearch/SearchProjectsTest/with-many-rules.xml"), organization.getKey()); - } - - @Test - public void filter_projects_by_measure_values() throws Exception { - String projectKey = newProjectKey(); - analyzeProject(projectKey, "shared/xoo-sample"); - - verifyFilterMatches(projectKey, "ncloc > 1"); - verifyFilterMatches(projectKey, "ncloc > 1 and duplicated_lines_density <= 100"); - verifyFilterDoesNotMatch("ncloc <= 1"); - } - - @Test - public void find_projects_with_no_data() throws Exception { - String projectKey = newProjectKey(); - analyzeProject(projectKey, "shared/xoo-sample"); - - verifyFilterMatches(projectKey, "coverage = NO_DATA"); - verifyFilterDoesNotMatch("ncloc = NO_DATA"); - } - - @Test - public void provisioned_projects_should_be_included_to_results() throws Exception { - String projectKey = newProjectKey(); - tester.wsClient().projects().create(CreateRequest.builder().setKey(projectKey).setName(projectKey).setOrganization(organization.getKey()).build()); - - SearchProjectsWsResponse response = searchProjects(SearchProjectsRequest.builder().setOrganization(organization.getKey()).build()); - - assertThat(response.getComponentsList()).extracting(Component::getKey).containsOnly(projectKey); - } - - @Test - public void return_leak_period_date() throws Exception { - setServerProperty(orchestrator, "sonar.leak.period", "previous_version"); - // This project has a leak period - String projectKey1 = newProjectKey(); - analyzeProject(projectKey1, "shared/xoo-sample", "sonar.projectDate", "2016-12-31"); - analyzeProject(projectKey1, "shared/xoo-sample"); - // This project has only one analysis, so no leak period - String projectKey2 = newProjectKey(); - analyzeProject(projectKey2, "shared/xoo-sample"); - // This project is provisioned, so has no leak period - String projectKey3 = newProjectKey(); - tester.wsClient().projects().create(CreateRequest.builder().setKey(projectKey3).setName(projectKey3).setOrganization(organization.getKey()).build()); - - SearchProjectsWsResponse response = searchProjects( - SearchProjectsRequest.builder().setAdditionalFields(singletonList("leakPeriodDate")).setOrganization(organization.getKey()).build()); - - assertThat(response.getComponentsList()).extracting(Component::getKey, Component::hasLeakPeriodDate) - .containsOnly( - tuple(projectKey1, true), - tuple(projectKey2, false), - tuple(projectKey3, false)); - Component project1 = response.getComponentsList().stream().filter(component -> component.getKey().equals(projectKey1)).findFirst() - .orElseThrow(() -> new IllegalStateException("Project1 is not found")); - assertThat(sanitizeTimezones(project1.getLeakPeriodDate())).isEqualTo("2016-12-31T00:00:00+0000"); - } - - @Test - public void filter_by_text_query() throws IOException { - analyzeProject("project1", "shared/xoo-sample", "sonar.projectName", "apachee"); - analyzeProject("project2", "shared/xoo-sample", "sonar.projectName", "Apache"); - analyzeProject("project3", "shared/xoo-multi-modules-sample", "sonar.projectName", "Apache Foundation"); - analyzeProject("project4", "shared/xoo-multi-modules-sample", "sonar.projectName", "Windows"); - - // Search only by text query - assertThat(searchProjects("query = \"apache\"").getComponentsList()).extracting(Component::getKey).containsExactly("project2", "project3", "project1"); - assertThat(searchProjects("query = \"pAch\"").getComponentsList()).extracting(Component::getKey).containsExactly("project2", "project3", "project1"); - assertThat(searchProjects("query = \"hee\"").getComponentsList()).extracting(Component::getKey).containsExactly("project1"); - assertThat(searchProjects("query = \"project1\"").getComponentsList()).extracting(Component::getKey).containsExactly("project1"); - assertThat(searchProjects("query = \"unknown\"").getComponentsList()).isEmpty(); - - // Search by metric criteria and text query - assertThat(searchProjects(SearchProjectsRequest.builder().setFilter("query = \"pAch\" AND ncloc > 50").build()).getComponentsList()) - .extracting(Component::getKey).containsExactly("project3"); - assertThat(searchProjects(SearchProjectsRequest.builder().setFilter("query = \"nd\" AND ncloc > 50").build()).getComponentsList()) - .extracting(Component::getKey).containsExactly("project3", "project4"); - assertThat(searchProjects(SearchProjectsRequest.builder().setFilter("query = \"unknown\" AND ncloc > 50").build()).getComponentsList()).isEmpty(); - ; - - // Check facets - assertThat(searchProjects(SearchProjectsRequest.builder().setFilter("query = \"apache\"").setFacets(singletonList("ncloc")).build()).getFacets().getFacets(0).getValuesList()) - .extracting(Common.FacetValue::getVal, Common.FacetValue::getCount) - .containsOnly(tuple("*-1000.0", 3L), tuple("1000.0-10000.0", 0L), tuple("10000.0-100000.0", 0L), tuple("100000.0-500000.0", 0L), tuple("500000.0-*", 0L)); - assertThat(searchProjects(SearchProjectsRequest.builder().setFilter("query = \"unknown\"").setFacets(singletonList("ncloc")).build()).getFacets().getFacets(0) - .getValuesList()).extracting(Common.FacetValue::getVal, Common.FacetValue::getCount) - .containsOnly(tuple("*-1000.0", 0L), tuple("1000.0-10000.0", 0L), tuple("10000.0-100000.0", 0L), tuple("100000.0-500000.0", 0L), tuple("500000.0-*", 0L)); - } - - @Test - public void should_return_facets() throws Exception { - analyzeProject(newProjectKey(), "shared/xoo-sample"); - analyzeProject(newProjectKey(), "shared/xoo-multi-modules-sample"); - - SearchProjectsWsResponse response = searchProjects(SearchProjectsRequest.builder().setOrganization(organization.getKey()).setFacets(asList( - "alert_status", - "coverage", - "duplicated_lines_density", - "languages", - "ncloc", - "reliability_rating", - "security_rating", - "sqale_rating", - "tags")).build()); - - checkFacet(response, "alert_status", - tuple("OK", 2L), - tuple("WARN", 0L), - tuple("ERROR", 0L)); - checkFacet(response, "coverage", - tuple("NO_DATA", 2L), - tuple("*-30.0", 0L), - tuple("30.0-50.0", 0L), - tuple("50.0-70.0", 0L), - tuple("70.0-80.0", 0L), - tuple("80.0-*", 0L)); - checkFacet(response, "duplicated_lines_density", - tuple("NO_DATA", 0L), - tuple("*-3.0", 2L), - tuple("3.0-5.0", 0L), - tuple("5.0-10.0", 0L), - tuple("10.0-20.0", 0L), - tuple("20.0-*", 0L)); - checkFacet(response, "languages", - tuple("xoo", 2L)); - checkFacet(response, "ncloc", - tuple("*-1000.0", 2L), - tuple("1000.0-10000.0", 0L), - tuple("10000.0-100000.0", 0L), - tuple("100000.0-500000.0", 0L), - tuple("500000.0-*", 0L)); - checkFacet(response, "reliability_rating", - tuple("1", 2L), - tuple("2", 0L), - tuple("3", 0L), - tuple("4", 0L), - tuple("5", 0L)); - checkFacet(response, "security_rating", - tuple("1", 2L), - tuple("2", 0L), - tuple("3", 0L), - tuple("4", 0L), - tuple("5", 0L)); - checkFacet(response, "sqale_rating", - tuple("1", 0L), - tuple("2", 0L), - tuple("3", 0L), - tuple("4", 2L), - tuple("5", 0L)); - checkFacet(response, "tags"); - } - - @Test - public void should_return_facets_on_leak() throws Exception { - setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis"); - // This project has no duplication on new code - String projectKey1 = newProjectKey(); - analyzeProject(projectKey1, "shared/xoo-sample", "sonar.projectDate", "2016-12-31"); - analyzeProject(projectKey1, "shared/xoo-sample"); - // This project has 0% duplication on new code - String projectKey2 = newProjectKey(); - analyzeProject(projectKey2, "projectSearch/xoo-history-v1", "sonar.projectDate", "2016-12-31"); - analyzeProject(projectKey2, "projectSearch/xoo-history-v2"); - - SearchProjectsWsResponse response = searchProjects(SearchProjectsRequest.builder().setOrganization(organization.getKey()).setFacets(asList( - "new_reliability_rating", "new_security_rating", "new_maintainability_rating", "new_coverage", "new_duplicated_lines_density", "new_lines")).build()); - - checkFacet(response, "new_reliability_rating", - tuple("1", 2L), - tuple("2", 0L), - tuple("3", 0L), - tuple("4", 0L), - tuple("5", 0L)); - checkFacet(response, "new_security_rating", - tuple("1", 2L), - tuple("2", 0L), - tuple("3", 0L), - tuple("4", 0L), - tuple("5", 0L)); - checkFacet(response, "new_maintainability_rating", - tuple("1", 2L), - tuple("2", 0L), - tuple("3", 0L), - tuple("4", 0L), - tuple("5", 0L)); - checkFacet(response, "new_coverage", - tuple("NO_DATA", 2L), - tuple("*-30.0", 0L), - tuple("30.0-50.0", 0L), - tuple("50.0-70.0", 0L), - tuple("70.0-80.0", 0L), - tuple("80.0-*", 0L)); - checkFacet(response, "new_duplicated_lines_density", - tuple("NO_DATA", 1L), - tuple("*-3.0", 1L), - tuple("3.0-5.0", 0L), - tuple("5.0-10.0", 0L), - tuple("10.0-20.0", 0L), - tuple("20.0-*", 0L)); - checkFacet(response, "new_lines", - tuple("*-1000.0", 1L), - tuple("1000.0-10000.0", 0L), - tuple("10000.0-100000.0", 0L), - tuple("100000.0-500000.0", 0L), - tuple("500000.0-*", 0L)); - } - - private void checkFacet(SearchProjectsWsResponse response, String facetKey, Tuple... values) { - Common.Facet facet = response.getFacets().getFacetsList().stream().filter(f -> f.getProperty().equals(facetKey)).findAny().get(); - assertThat(facet.getValuesList()).extracting(Common.FacetValue::getVal, Common.FacetValue::getCount).containsExactlyInAnyOrder(values); - } - - private void analyzeProject(String projectKey, String relativePath, String... properties) { - List<String> keyValueProperties = new ArrayList<>(asList( - "sonar.projectKey", projectKey, - "sonar.organization", organization.getKey(), - "sonar.profile", "with-many-rules", - "sonar.login", "admin", "sonar.password", "admin", - "sonar.scm.disabled", "false")); - orchestrator.executeBuild(SonarScanner.create(projectDir(relativePath), concat(keyValueProperties.toArray(new String[0]), properties))); - } - - private SearchProjectsWsResponse searchProjects(String filter) throws IOException { - return searchProjects(SearchProjectsRequest.builder().setOrganization(organization.getKey()).setFilter(filter).build()); - } - - private SearchProjectsWsResponse searchProjects(SearchProjectsRequest request) throws IOException { - return tester.wsClient().components().searchProjects(request); - } - - private void verifyFilterMatches(String projectKey, String filter) throws IOException { - assertThat(searchProjects(filter).getComponentsList()).extracting(Component::getKey).containsOnly(projectKey); - } - - private void verifyFilterDoesNotMatch(String filter) throws IOException { - assertThat(searchProjects(filter).getComponentsCount()).isZero(); - } -} diff --git a/it/it-tests/src/test/java/it/qualityGate/QualityGateNotificationTest.java b/it/it-tests/src/test/java/it/qualityGate/QualityGateNotificationTest.java deleted file mode 100644 index 64f8dffa974..00000000000 --- a/it/it-tests/src/test/java/it/qualityGate/QualityGateNotificationTest.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityGate; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import java.util.Iterator; -import javax.mail.internet.MimeMessage; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonar.wsclient.qualitygate.NewCondition; -import org.sonar.wsclient.qualitygate.QualityGate; -import org.sonar.wsclient.qualitygate.QualityGateClient; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import org.subethamail.wiser.Wiser; -import org.subethamail.wiser.WiserMessage; -import util.user.UserRule; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.sonarqube.ws.WsMeasures.Measure; -import static util.ItUtils.getMeasure; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.newUserWsClient; -import static util.ItUtils.projectDir; -import static util.ItUtils.resetEmailSettings; -import static util.ItUtils.resetPeriod; -import static util.ItUtils.setServerProperty; - -public class QualityGateNotificationTest { - - private static long DEFAULT_QUALITY_GATE; - - private static final String PROJECT_KEY = "sample"; - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @ClassRule - public static UserRule userRule = UserRule.from(orchestrator); - - private static Wiser smtpServer; - - @BeforeClass - public static void init() throws Exception { - DEFAULT_QUALITY_GATE = qgClient().list().defaultGate().id(); - - setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis"); - resetEmailSettings(orchestrator); - - smtpServer = new Wiser(0); - smtpServer.start(); - } - - @AfterClass - public static void resetData() throws Exception { - qgClient().setDefault(DEFAULT_QUALITY_GATE); - - resetPeriod(orchestrator); - resetEmailSettings(orchestrator); - - if (smtpServer != null) { - smtpServer.stop(); - } - } - - @Before - public void cleanUp() { - orchestrator.resetData(); - } - - @Test - public void status_on_metric_variation_and_send_notifications() throws Exception { - setServerProperty(orchestrator, "email.smtp_host.secured", "localhost"); - setServerProperty(orchestrator, "email.smtp_port.secured", Integer.toString(smtpServer.getServer().getPort())); - - // Create user, who will receive notifications for new violations - userRule.createUser("tester", "Tester", "tester@example.org", "tester"); - // Send test email to the test user - newAdminWsClient(orchestrator).wsConnector().call(new PostRequest("api/emails/send") - .setParam("to", "test@example.org") - .setParam("message", "This is a test message from SonarQube")) - .failIfNotSuccessful(); - // Add notifications to the test user - WsClient wsClient = newUserWsClient(orchestrator, "tester", "tester"); - wsClient.wsConnector().call(new PostRequest("api/notifications/add") - .setParam("type", "NewAlerts") - .setParam("channel", "EmailNotificationChannel")) - .failIfNotSuccessful(); - - // Create quality gate with conditions on variations - QualityGate simple = qgClient().create("SimpleWithDifferential"); - qgClient().setDefault(simple.id()); - qgClient().createCondition(NewCondition.create(simple.id()).metricKey("ncloc").period(1).operator("EQ").warningThreshold("0")); - - SonarScanner analysis = SonarScanner.create(projectDir("qualitygate/xoo-sample")); - orchestrator.executeBuild(analysis); - assertThat(getGateStatusMeasure().getValue()).isEqualTo("OK"); - - orchestrator.executeBuild(analysis); - assertThat(getGateStatusMeasure().getValue()).isEqualTo("WARN"); - - qgClient().unsetDefault(); - qgClient().destroy(simple.id()); - - waitUntilAllNotificationsAreDelivered(smtpServer); - - Iterator<WiserMessage> emails = smtpServer.getMessages().iterator(); - - MimeMessage message = emails.next().getMimeMessage(); - assertThat(message.getHeader("To", null)).isEqualTo("<test@example.org>"); - assertThat((String) message.getContent()).contains("This is a test message from SonarQube"); - - assertThat(emails.hasNext()).isTrue(); - message = emails.next().getMimeMessage(); - assertThat(message.getHeader("To", null)).isEqualTo("<tester@example.org>"); - assertThat((String) message.getContent()).contains("Quality gate status: Orange (was Green)"); - assertThat((String) message.getContent()).contains("Quality gate threshold: Lines of Code variation = 0 since previous analysis"); - assertThat((String) message.getContent()).contains("/dashboard?id=sample"); - assertThat(emails.hasNext()).isFalse(); - } - - private Measure getGateStatusMeasure() { - return getMeasure(orchestrator, PROJECT_KEY, "alert_status"); - } - - private static QualityGateClient qgClient() { - return orchestrator.getServer().adminWsClient().qualityGateClient(); - } - - private static void waitUntilAllNotificationsAreDelivered(Wiser smtpServer) throws InterruptedException { - for (int i = 0; i < 10; i++) { - if (smtpServer.getMessages().size() == 2) { - break; - } - Thread.sleep(1_000); - } - } -} diff --git a/it/it-tests/src/test/java/it/qualityGate/QualityGateOnRatingMeasuresTest.java b/it/it-tests/src/test/java/it/qualityGate/QualityGateOnRatingMeasuresTest.java deleted file mode 100644 index 39946f4d24b..00000000000 --- a/it/it-tests/src/test/java/it/qualityGate/QualityGateOnRatingMeasuresTest.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityGate; - -import com.sonar.orchestrator.Orchestrator; -import it.Category1Suite; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonar.wsclient.qualitygate.QualityGateClient; -import org.sonarqube.ws.WsMeasures; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.qualitygate.CreateConditionRequest; -import org.sonarqube.ws.client.qualitygate.QualityGatesService; -import org.sonarqube.ws.client.qualitygate.SelectWsRequest; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasure; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.resetSettings; -import static util.ItUtils.runProjectAnalysis; -import static util.ItUtils.setServerProperty; - -public class QualityGateOnRatingMeasuresTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - private static final String PROJECT_KEY = "sample"; - - static WsClient wsClient; - - static QualityGatesService QUALITY_GATES; - - Long qualityGateId; - - @BeforeClass - public static void init() { - wsClient = newAdminWsClient(orchestrator); - QUALITY_GATES = wsClient.qualityGates(); - } - - @Before - public void prepareData() { - orchestrator.resetData(); - qualityGateId = QUALITY_GATES.create("QualityGate").getId(); - orchestrator.getServer().provisionProject(PROJECT_KEY, PROJECT_KEY); - QUALITY_GATES.associateProject(new SelectWsRequest().setGateId(qualityGateId).setProjectKey(PROJECT_KEY)); - } - - @After - public void resetData() throws Exception { - qgClient().destroy(qualityGateId); - resetSettings(orchestrator, null, "sonar.leak.period"); - } - - @Test - public void generate_warning_qgate_on_rating_metric() throws Exception { - QUALITY_GATES.createCondition(CreateConditionRequest.builder() - .setQualityGateId(qualityGateId.intValue()) - .setMetricKey("security_rating") - .setOperator("GT") - .setWarning("3") - .build()); - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityGate/QualityGateOnRatingMeasuresTest/with-many-rules.xml")); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "with-many-rules"); - - runProjectAnalysis(orchestrator, "qualitygate/xoo-sample"); - - assertThat(getGateStatusMeasure().getValue()).isEqualTo("WARN"); - } - - @Test - public void generate_error_qgate_on_rating_metric_on_leak_period() throws Exception { - setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis"); - QUALITY_GATES.createCondition(CreateConditionRequest.builder() - .setQualityGateId(qualityGateId.intValue()) - .setMetricKey("new_security_rating") - .setOperator("GT") - .setError("3") - .setPeriod(1) - .build()); - - // Run first analysis with empty quality gate -> quality gate is green - orchestrator.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "empty"); - runProjectAnalysis(orchestrator, "qualitygate/xoo-sample"); - assertThat(getGateStatusMeasure().getValue()).isEqualTo("OK"); - - // Run second analysis with some rules that makes Security Rating to E -> quality gate is red - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityGate/QualityGateOnRatingMeasuresTest/with-many-rules.xml")); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "with-many-rules"); - runProjectAnalysis(orchestrator, "qualitygate/xoo-sample"); - assertThat(getGateStatusMeasure().getValue()).isEqualTo("ERROR"); - } - - private WsMeasures.Measure getGateStatusMeasure() { - return getMeasure(orchestrator, PROJECT_KEY, "alert_status"); - } - - private static QualityGateClient qgClient() { - return orchestrator.getServer().adminWsClient().qualityGateClient(); - } - -} diff --git a/it/it-tests/src/test/java/it/qualityGate/QualityGateTest.java b/it/it-tests/src/test/java/it/qualityGate/QualityGateTest.java deleted file mode 100644 index e5675df4a4f..00000000000 --- a/it/it-tests/src/test/java/it/qualityGate/QualityGateTest.java +++ /dev/null @@ -1,405 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityGate; - -import com.google.gson.Gson; -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import java.io.File; -import java.io.IOException; -import java.io.StringReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; -import org.apache.commons.io.Charsets; -import org.apache.commons.io.FileUtils; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonar.wsclient.qualitygate.NewCondition; -import org.sonar.wsclient.qualitygate.QualityGate; -import org.sonar.wsclient.qualitygate.QualityGateClient; -import org.sonarqube.ws.MediaTypes; -import org.sonarqube.ws.WsCe; -import org.sonarqube.ws.WsMeasures.Measure; -import org.sonarqube.ws.WsQualityGates.ProjectStatusWsResponse; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.WsResponse; -import org.sonarqube.ws.client.qualitygate.ProjectStatusWsRequest; - -import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.groups.Tuple.tuple; -import static util.ItUtils.concat; -import static util.ItUtils.extractCeTaskId; -import static util.ItUtils.getMeasure; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.newProjectKey; -import static util.ItUtils.projectDir; - -public class QualityGateTest { - - private static final String TASK_STATUS_SUCCESS = "SUCCESS"; - private static final String QG_STATUS_NO_QG = "null"; - private static final String QG_STATUS_OK = "OK"; - private static final String QG_STATUS_ERROR = "ERROR"; - private static final String QG_STATUS_WARN = "WARN"; - - private static long DEFAULT_QUALITY_GATE; - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - private static WsClient wsClient; - - @BeforeClass - public static void startOrchestrator() { - wsClient = newAdminWsClient(orchestrator); - DEFAULT_QUALITY_GATE = qgClient().list().defaultGate().id(); - } - - @AfterClass - public static void restoreDefaultQualitGate() throws Exception { - qgClient().setDefault(DEFAULT_QUALITY_GATE); - } - - @Test - public void do_not_compute_status_if_no_gate() throws IOException { - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey); - - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_NO_QG); - - assertThat(getGateStatusMeasure(projectKey)).isNull(); - } - - @Test - public void status_ok_if_empty_gate() throws IOException { - QualityGate empty = qgClient().create("Empty"); - qgClient().setDefault(empty.id()); - - try { - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey); - - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_OK); - - assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("OK"); - } finally { - qgClient().unsetDefault(); - qgClient().destroy(empty.id()); - } - } - - @Test - public void test_status_ok() throws IOException { - QualityGate simple = qgClient().create("SimpleWithHighThreshold"); - qgClient().setDefault(simple.id()); - qgClient().createCondition(NewCondition.create(simple.id()).metricKey("ncloc").operator("GT").warningThreshold("40")); - - try { - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey); - - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_OK); - - assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("OK"); - } finally { - qgClient().unsetDefault(); - qgClient().destroy(simple.id()); - } - } - - @Test - public void test_status_warning() throws IOException { - QualityGate simple = qgClient().create("SimpleWithLowThreshold"); - qgClient().setDefault(simple.id()); - qgClient().createCondition(NewCondition.create(simple.id()).metricKey("ncloc").operator("GT").warningThreshold("10")); - - try { - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey); - - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_WARN); - - assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("WARN"); - } finally { - qgClient().unsetDefault(); - qgClient().destroy(simple.id()); - } - } - - @Test - public void test_status_error() throws IOException { - QualityGate simple = qgClient().create("SimpleWithLowThreshold"); - qgClient().setDefault(simple.id()); - qgClient().createCondition(NewCondition.create(simple.id()).metricKey("ncloc").operator("GT").errorThreshold("10")); - - try { - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey); - - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_ERROR); - - assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("ERROR"); - } finally { - qgClient().unsetDefault(); - qgClient().destroy(simple.id()); - } - } - - @Test - public void use_server_settings_instead_of_default_gate() throws IOException { - QualityGate alert = qgClient().create("AlertWithLowThreshold"); - qgClient().createCondition(NewCondition.create(alert.id()).metricKey("ncloc").operator("GT").warningThreshold("10")); - QualityGate error = qgClient().create("ErrorWithLowThreshold"); - qgClient().createCondition(NewCondition.create(error.id()).metricKey("ncloc").operator("GT").errorThreshold("10")); - - qgClient().setDefault(alert.id()); - String projectKey = newProjectKey(); - orchestrator.getServer().provisionProject(projectKey, projectKey); - associateQualityGateToProject(error.id(), projectKey); - - try { - BuildResult buildResult = executeAnalysis(projectKey); - - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_ERROR); - - assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("ERROR"); - } finally { - qgClient().unsetDefault(); - qgClient().destroy(alert.id()); - qgClient().destroy(error.id()); - } - } - - @Test - public void conditions_on_multiple_metric_types() throws IOException { - QualityGate allTypes = qgClient().create("AllMetricTypes"); - qgClient().createCondition(NewCondition.create(allTypes.id()).metricKey("ncloc").operator("GT").warningThreshold("10")); - qgClient().createCondition(NewCondition.create(allTypes.id()).metricKey("duplicated_lines_density").operator("GT").warningThreshold("20")); - qgClient().setDefault(allTypes.id()); - - try { - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey, "sonar.cpd.xoo.minimumLines", "2", "sonar.cpd.xoo.minimumTokens", "5"); - - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_WARN); - - Measure alertStatus = getGateStatusMeasure(projectKey); - assertThat(alertStatus.getValue()).isEqualTo("WARN"); - - String qualityGateDetailJson = getMeasure(orchestrator, projectKey, "quality_gate_details").getValue(); - assertThat(QualityGateDetails.parse(qualityGateDetailJson).getConditions()) - .extracting(QualityGateDetails.Conditions::getMetric, QualityGateDetails.Conditions::getOp, QualityGateDetails.Conditions::getWarning) - .contains(tuple("ncloc", "GT", "10"), tuple("duplicated_lines_density", "GT", "20")); - } finally { - qgClient().unsetDefault(); - qgClient().destroy(allTypes.id()); - } - } - - @Test - public void ad_hoc_build_break_strategy() throws IOException { - QualityGate simple = qgClient().create("SimpleWithLowThresholdForBuildBreakStrategy"); - qgClient().setDefault(simple.id()); - qgClient().createCondition(NewCondition.create(simple.id()).metricKey("ncloc").operator("GT").errorThreshold("7")); - - try { - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey); - - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_ERROR); - - String taskId = getTaskIdInLocalReport(projectDir("qualitygate/xoo-sample")); - String analysisId = getAnalysisId(taskId); - - ProjectStatusWsResponse projectStatusWsResponse = wsClient.qualityGates().projectStatus(new ProjectStatusWsRequest().setAnalysisId(analysisId)); - ProjectStatusWsResponse.ProjectStatus projectStatus = projectStatusWsResponse.getProjectStatus(); - assertThat(projectStatus.getStatus()).isEqualTo(ProjectStatusWsResponse.Status.ERROR); - assertThat(projectStatus.getConditionsCount()).isEqualTo(1); - ProjectStatusWsResponse.Condition condition = projectStatus.getConditionsList().get(0); - assertThat(condition.getMetricKey()).isEqualTo("ncloc"); - assertThat(condition.getErrorThreshold()).isEqualTo("7"); - } finally { - qgClient().unsetDefault(); - qgClient().destroy(simple.id()); - } - } - - @Test - public void does_not_fail_when_condition_is_on_removed_metric() throws IOException { - String customMetricKey = randomAlphabetic(10); - createCustomIntMetric(orchestrator, customMetricKey); - QualityGate simple = qgClient().create("OnCustomMetric"); - qgClient().setDefault(simple.id()); - qgClient().createCondition(NewCondition.create(simple.id()).metricKey(customMetricKey).operator("GT").warningThreshold("40")); - try { - deleteCustomMetric(orchestrator, customMetricKey); - String projectKey = newProjectKey(); - BuildResult buildResult = executeAnalysis(projectKey); - - verifyQGStatusInPostTask(buildResult, projectKey, TASK_STATUS_SUCCESS, QG_STATUS_OK); - - assertThat(getGateStatusMeasure(projectKey).getValue()).isEqualTo("OK"); - } finally { - deleteCustomMetric(orchestrator, customMetricKey); - qgClient().unsetDefault(); - qgClient().destroy(simple.id()); - } - } - - private BuildResult executeAnalysis(String projectKey, String... keyValueProperties) { - return orchestrator.executeBuild(SonarScanner.create( - projectDir("qualitygate/xoo-sample"), concat(keyValueProperties, "sonar.projectKey", projectKey))); - } - - private void verifyQGStatusInPostTask(BuildResult buildResult, String projectKey, String taskStatus, String qgStatus) throws IOException { - List<String> logsLines = FileUtils.readLines(orchestrator.getServer().getCeLogs(), Charsets.UTF_8); - List<String> postTaskLogLines = extractPosttaskPluginLogs(extractCeTaskId(buildResult), logsLines); - - assertThat(postTaskLogLines).hasSize(1); - assertThat(postTaskLogLines.iterator().next()) - .contains("CeTask[" + taskStatus + "]") - .contains("Project[" + projectKey + "]") - .contains("QualityGate[" + qgStatus + "]"); - } - - private String getAnalysisId(String taskId) throws IOException { - WsResponse activity = wsClient - .wsConnector() - .call(new GetRequest("api/ce/task") - .setParam("id", taskId) - .setMediaType(MediaTypes.PROTOBUF)); - WsCe.TaskResponse activityWsResponse = WsCe.TaskResponse.parseFrom(activity.contentStream()); - return activityWsResponse.getTask().getAnalysisId(); - } - - private String getTaskIdInLocalReport(File projectDirectory) throws IOException { - File metadata = new File(projectDirectory, ".sonar/report-task.txt"); - assertThat(metadata).exists().isFile(); - // verify properties - Properties props = new Properties(); - props.load(new StringReader(FileUtils.readFileToString(metadata, StandardCharsets.UTF_8))); - assertThat(props.getProperty("ceTaskId")).isNotEmpty(); - - return props.getProperty("ceTaskId"); - } - - private Measure getGateStatusMeasure(String projectKey) { - return getMeasure(orchestrator, projectKey, "alert_status"); - } - - private static QualityGateClient qgClient() { - return orchestrator.getServer().adminWsClient().qualityGateClient(); - } - - private static void associateQualityGateToProject(long qGateId, String projectKey) { - newAdminWsClient(orchestrator).wsConnector() - .call(new PostRequest("api/qualitygates/select") - .setParam("gateId", qGateId) - .setParam("projectKey", projectKey)) - .failIfNotSuccessful(); - } - - private static List<String> extractPosttaskPluginLogs(String taskUuid, Iterable<String> ceLogs) { - return StreamSupport.stream(ceLogs.spliterator(), false) - .filter(s -> s.contains("POSTASKPLUGIN: finished()")) - .filter(s -> s.contains(taskUuid)) - .collect(Collectors.toList()); - } - - private static void createCustomIntMetric(Orchestrator orchestrator, String metricKey) { - newAdminWsClient(orchestrator).wsConnector().call(new PostRequest("api/metrics/create") - .setParam("key", metricKey) - .setParam("name", metricKey) - .setParam("type", "INT")) - .failIfNotSuccessful(); - } - - private static void deleteCustomMetric(Orchestrator orchestrator, String metricKey) { - newAdminWsClient(orchestrator).wsConnector().call(new PostRequest("api/metrics/delete") - .setParam("keys", metricKey)) - .failIfNotSuccessful(); - } - - static class QualityGateDetails { - - private String level; - - private List<Conditions> conditions = new ArrayList<>(); - - String getLevel() { - return level; - } - - List<Conditions> getConditions() { - return conditions; - } - - public static QualityGateDetails parse(String json) { - Gson gson = new Gson(); - return gson.fromJson(json, QualityGateDetails.class); - } - - public static class Conditions { - private final String metric; - private final String op; - private final String warning; - private final String actual; - private final String level; - - private Conditions(String metric, String op, String values, String actual, String level) { - this.metric = metric; - this.op = op; - this.warning = values; - this.actual = actual; - this.level = level; - } - - String getMetric() { - return metric; - } - - String getOp() { - return op; - } - - String getWarning() { - return warning; - } - - String getActual() { - return actual; - } - - String getLevel() { - return level; - } - } - } -} diff --git a/it/it-tests/src/test/java/it/qualityGate/QualityGateUiTest.java b/it/it-tests/src/test/java/it/qualityGate/QualityGateUiTest.java deleted file mode 100644 index 9d09e69aebf..00000000000 --- a/it/it-tests/src/test/java/it/qualityGate/QualityGateUiTest.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityGate; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import java.util.Date; -import javax.annotation.Nullable; -import org.apache.commons.lang.time.DateFormatUtils; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonar.wsclient.qualitygate.NewCondition; -import org.sonar.wsclient.qualitygate.QualityGate; -import org.sonar.wsclient.qualitygate.QualityGateClient; -import org.sonar.wsclient.qualitygate.QualityGateCondition; -import org.sonar.wsclient.qualitygate.UpdateCondition; -import pageobjects.Navigation; -import pageobjects.ProjectActivityPage; - -import static org.apache.commons.lang.time.DateUtils.addDays; -import static util.ItUtils.projectDir; -import static util.ItUtils.resetPeriod; -import static util.ItUtils.setServerProperty; -import static util.selenium.Selenese.runSelenese; - -public class QualityGateUiTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - private static long DEFAULT_QUALITY_GATE; - - @BeforeClass - public static void initPeriod() throws Exception { - setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis"); - DEFAULT_QUALITY_GATE = qgClient().list().defaultGate().id(); - } - - @AfterClass - public static void resetData() throws Exception { - resetPeriod(orchestrator); - qgClient().setDefault(DEFAULT_QUALITY_GATE); - } - - @Before - public void cleanUp() { - orchestrator.resetData(); - } - - /** - * SONAR-3326 - */ - @Test - public void display_alerts_correctly_in_history_page() { - QualityGateClient qgClient = qgClient(); - QualityGate qGate = qgClient.create("AlertsForHistory"); - qgClient.setDefault(qGate.id()); - - String firstAnalysisDate = DateFormatUtils.ISO_DATE_FORMAT.format(addDays(new Date(), -2)); - String secondAnalysisDate = DateFormatUtils.ISO_DATE_FORMAT.format(addDays(new Date(), -1)); - - // with this configuration, project should have an Orange alert - QualityGateCondition lowThresholds = qgClient.createCondition(NewCondition.create(qGate.id()).metricKey("lines").operator("GT").warningThreshold("5").errorThreshold("50")); - scanSampleWithDate(firstAnalysisDate); - // with this configuration, project should have a Green alert - qgClient.updateCondition(UpdateCondition.create(lowThresholds.id()).metricKey("lines").operator("GT").warningThreshold("5000").errorThreshold("5000")); - scanSampleWithDate(secondAnalysisDate); - - Navigation nav = Navigation.create(orchestrator); - ProjectActivityPage page = nav.openProjectActivity("sample"); - page - .assertFirstAnalysisOfTheDayHasText(secondAnalysisDate, "Green (was Orange)") - .assertFirstAnalysisOfTheDayHasText(firstAnalysisDate, "Orange"); - - qgClient.unsetDefault(); - qgClient.destroy(qGate.id()); - } - - @Test - public void should_display_quality_gates_page() { - runSelenese(orchestrator, "/qualityGate/QualityGateUiTest/should_display_quality_gates_page.html"); - } - - private void scanSampleWithDate(String date) { - scanSample(date, null); - } - - private void scanSample(@Nullable String date, @Nullable String profile) { - SonarScanner scan = SonarScanner.create(projectDir("shared/xoo-sample")) - .setProperty("sonar.cpd.exclusions", "**/*"); - if (date != null) { - scan.setProperty("sonar.projectDate", date); - } - if (profile != null) { - scan.setProfile(profile); - } - orchestrator.executeBuild(scan); - } - - private static QualityGateClient qgClient() { - return orchestrator.getServer().adminWsClient().qualityGateClient(); - } - -} diff --git a/it/it-tests/src/test/java/it/qualityModel/DebtConfigurationRule.java b/it/it-tests/src/test/java/it/qualityModel/DebtConfigurationRule.java deleted file mode 100644 index 7ab6e14f657..00000000000 --- a/it/it-tests/src/test/java/it/qualityModel/DebtConfigurationRule.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityModel; - -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableSet; -import com.sonar.orchestrator.Orchestrator; -import java.util.Set; -import org.junit.rules.ExternalResource; - -import static com.google.common.base.Preconditions.checkState; -import static util.ItUtils.setServerProperty; - -/** - * This rule should be used when dealing with technical debt properties, in order to always be sure that the properties are correctly reset between each tests. - */ -public class DebtConfigurationRule extends ExternalResource { - - private static final String DEV_COST_PROPERTY = "sonar.technicalDebt.developmentCost"; - private static final String RATING_GRID_PROPERTY = "sonar.technicalDebt.ratingGrid"; - - private static final String DEV_COST_LANGUAGE_PROPERTY = "languageSpecificParameters"; - private static final String DEV_COST_LANGUAGE_NAME_PROPERTY = DEV_COST_LANGUAGE_PROPERTY + ".0.language"; - private static final String DEV_COST_LANGUAGE_COST_PROPERTY = DEV_COST_LANGUAGE_PROPERTY + ".0.man_days"; - - private static final Joiner COMA_JOINER = Joiner.on(","); - - private static final Set<String> DEV_COST_PROPERTIES = ImmutableSet.of( - DEV_COST_PROPERTY, - DEV_COST_LANGUAGE_PROPERTY, - DEV_COST_LANGUAGE_NAME_PROPERTY, - DEV_COST_LANGUAGE_COST_PROPERTY, - RATING_GRID_PROPERTY); - - private final Orchestrator orchestrator; - - private DebtConfigurationRule(Orchestrator orchestrator) { - this.orchestrator = orchestrator; - } - - public static DebtConfigurationRule create(Orchestrator orchestrator) { - return new DebtConfigurationRule(orchestrator); - } - - @Override - protected void before() throws Throwable { - reset(); - } - - @Override - protected void after() { - reset(); - } - - public void reset() { - resetDevelopmentCost(); - resetRatingGrid(); - } - - public DebtConfigurationRule updateDevelopmentCost(int developmentCost) { - setProperty(DEV_COST_PROPERTY, Integer.toString(developmentCost)); - return this; - } - - public DebtConfigurationRule updateLanguageDevelopmentCost(String language, int developmentCost) { - setServerProperty(orchestrator, DEV_COST_LANGUAGE_PROPERTY, "0"); - setServerProperty(orchestrator, DEV_COST_LANGUAGE_NAME_PROPERTY, language); - setServerProperty(orchestrator, DEV_COST_LANGUAGE_COST_PROPERTY, Integer.toString(developmentCost)); - return this; - } - - public void resetDevelopmentCost() { - for (String property : DEV_COST_PROPERTIES) { - resetProperty(property); - } - } - - public DebtConfigurationRule updateRatingGrid(Double... ratingGrid) { - checkState(ratingGrid.length == 4, "Rating grid must contains 4 values"); - setProperty(RATING_GRID_PROPERTY, COMA_JOINER.join(ratingGrid)); - return this; - } - - public DebtConfigurationRule resetRatingGrid() { - resetProperty(RATING_GRID_PROPERTY); - return this; - } - - private void setProperty(String property, String value) { - setServerProperty(orchestrator, property, value); - } - - private void resetProperty(String property) { - setProperty(property, null); - } - -} diff --git a/it/it-tests/src/test/java/it/qualityModel/MaintainabilityMeasureTest.java b/it/it-tests/src/test/java/it/qualityModel/MaintainabilityMeasureTest.java deleted file mode 100644 index 53afb199131..00000000000 --- a/it/it-tests/src/test/java/it/qualityModel/MaintainabilityMeasureTest.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityModel; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category2Suite; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasureAsDouble; -import static util.ItUtils.projectDir; - -/** - * SONAR-4715 - */ -public class MaintainabilityMeasureTest { - - private static final String PROJECT = "com.sonarsource.it.samples:multi-modules-sample"; - private static final String MODULE = "com.sonarsource.it.samples:multi-modules-sample:module_a"; - private static final String SUB_MODULE = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1"; - private static final String DIRECTORY = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1"; - private static final String FILE = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo"; - - private static final String CODE_SMELLS_METRIC = "code_smells"; - private static final String MAINTAINABILITY_REMEDIATION_EFFORT_METRIC = "sqale_index"; - private static final String MAINTAINABILITY_RATING_METRIC = "sqale_rating"; - private static final String EFFORT_TO_REACH_MAINTAINABILITY_RATING_A_METRIC = "effort_to_reach_maintainability_rating_a"; - - @ClassRule - public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR; - - @Rule - public DebtConfigurationRule debtConfiguration = DebtConfigurationRule.create(orchestrator); - - @Before - public void init() { - orchestrator.resetData(); - - // Set rating grid values to not depend from default value - debtConfiguration.updateRatingGrid(0.1d, 0.2d, 0.5d, 1d); - - orchestrator.getServer().provisionProject(PROJECT, PROJECT); - } - - @Test - public void verify_maintainability_measures_when_code_smells_rules_activated() { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/with-many-rules.xml")); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT, "xoo", "with-many-rules"); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample"))); - - assertThat(getMeasureAsDouble(orchestrator, PROJECT, CODE_SMELLS_METRIC)).isEqualTo(71); - assertThat(getMeasureAsDouble(orchestrator, PROJECT, MAINTAINABILITY_REMEDIATION_EFFORT_METRIC)).isEqualTo(445); - assertThat(getMeasureAsDouble(orchestrator, PROJECT, MAINTAINABILITY_RATING_METRIC)).isEqualTo(3); - assertThat(getMeasureAsDouble(orchestrator, PROJECT, EFFORT_TO_REACH_MAINTAINABILITY_RATING_A_METRIC)).isEqualTo(292); - - assertThat(getMeasureAsDouble(orchestrator, MODULE, CODE_SMELLS_METRIC)).isEqualTo(43); - assertThat(getMeasureAsDouble(orchestrator, MODULE, MAINTAINABILITY_REMEDIATION_EFFORT_METRIC)).isEqualTo(231); - assertThat(getMeasureAsDouble(orchestrator, MODULE, MAINTAINABILITY_RATING_METRIC)).isEqualTo(3); - assertThat(getMeasureAsDouble(orchestrator, MODULE, EFFORT_TO_REACH_MAINTAINABILITY_RATING_A_METRIC)).isEqualTo(150); - - assertThat(getMeasureAsDouble(orchestrator, SUB_MODULE, CODE_SMELLS_METRIC)).isEqualTo(19); - assertThat(getMeasureAsDouble(orchestrator, SUB_MODULE, MAINTAINABILITY_REMEDIATION_EFFORT_METRIC)).isEqualTo(113); - assertThat(getMeasureAsDouble(orchestrator, SUB_MODULE, MAINTAINABILITY_RATING_METRIC)).isEqualTo(3); - assertThat(getMeasureAsDouble(orchestrator, SUB_MODULE, EFFORT_TO_REACH_MAINTAINABILITY_RATING_A_METRIC)).isEqualTo(77); - - assertThat(getMeasureAsDouble(orchestrator, DIRECTORY, CODE_SMELLS_METRIC)).isEqualTo(18); - assertThat(getMeasureAsDouble(orchestrator, DIRECTORY, MAINTAINABILITY_REMEDIATION_EFFORT_METRIC)).isEqualTo(28); - assertThat(getMeasureAsDouble(orchestrator, DIRECTORY, MAINTAINABILITY_RATING_METRIC)).isEqualTo(1); - assertThat(getMeasureAsDouble(orchestrator, DIRECTORY, EFFORT_TO_REACH_MAINTAINABILITY_RATING_A_METRIC)).isZero(); - - assertThat(getMeasureAsDouble(orchestrator, FILE, CODE_SMELLS_METRIC)).isEqualTo(18); - assertThat(getMeasureAsDouble(orchestrator, FILE, MAINTAINABILITY_REMEDIATION_EFFORT_METRIC)).isEqualTo(28); - assertThat(getMeasureAsDouble(orchestrator, FILE, MAINTAINABILITY_RATING_METRIC)).isEqualTo(1); - assertThat(getMeasureAsDouble(orchestrator, FILE, EFFORT_TO_REACH_MAINTAINABILITY_RATING_A_METRIC)).isZero(); - } - - @Test - public void verify_reliability_measures_when_no_code_smells_rule() { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/without-type-code-smells.xml")); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT, "xoo", "without-type-code-smells"); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample"))); - - assertThat(getMeasureAsDouble(orchestrator, PROJECT, CODE_SMELLS_METRIC)).isZero(); - assertThat(getMeasureAsDouble(orchestrator, PROJECT, MAINTAINABILITY_REMEDIATION_EFFORT_METRIC)).isZero(); - assertThat(getMeasureAsDouble(orchestrator, PROJECT, MAINTAINABILITY_RATING_METRIC)).isEqualTo(1); - assertThat(getMeasureAsDouble(orchestrator, PROJECT, EFFORT_TO_REACH_MAINTAINABILITY_RATING_A_METRIC)).isZero(); - } - -} diff --git a/it/it-tests/src/test/java/it/qualityModel/MaintainabilityRatingMeasureTest.java b/it/it-tests/src/test/java/it/qualityModel/MaintainabilityRatingMeasureTest.java deleted file mode 100644 index bac82dfc695..00000000000 --- a/it/it-tests/src/test/java/it/qualityModel/MaintainabilityRatingMeasureTest.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityModel; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category2Suite; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasureAsDouble; -import static util.ItUtils.projectDir; - -/** - * SONAR-4715 - */ -public class MaintainabilityRatingMeasureTest { - - private static final String PROJECT = "com.sonarsource.it.samples:multi-modules-sample"; - private static final String MODULE = "com.sonarsource.it.samples:multi-modules-sample:module_a"; - private static final String SUB_MODULE = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1"; - private static final String DIRECTORY = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1"; - private static final String FILE = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo"; - - @ClassRule - public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR; - - @Rule - public DebtConfigurationRule debtConfiguration = DebtConfigurationRule.create(orchestrator); - - @Before - public void init() { - orchestrator.resetData(); - - // Set rating grid values to not depend from default value - debtConfiguration.updateRatingGrid(0.1d, 0.2d, 0.5d, 1d); - } - - @Test - public void sqale_rating_measures() { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/with-many-rules.xml")); - orchestrator.getServer().provisionProject(PROJECT, PROJECT); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT, "xoo", "with-many-rules"); - - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample"))); - - assertThat(getMeasureAsDouble(orchestrator, PROJECT, "sqale_rating")).isEqualTo(3); - assertThat(getMeasureAsDouble(orchestrator, MODULE, "sqale_rating")).isEqualTo(3); - assertThat(getMeasureAsDouble(orchestrator, SUB_MODULE, "sqale_rating")).isEqualTo(3); - assertThat(getMeasureAsDouble(orchestrator, DIRECTORY, "sqale_rating")).isEqualTo(1); - assertThat(getMeasureAsDouble(orchestrator, FILE, "sqale_rating")).isEqualTo(1); - } - - @Test - public void sqale_debt_ratio_measures() { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/with-many-rules.xml")); - orchestrator.getServer().provisionProject(PROJECT, PROJECT); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT, "xoo", "with-many-rules"); - - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample"))); - - assertThat(getMeasureAsDouble(orchestrator, PROJECT, "sqale_debt_ratio")).isEqualTo(29.1d); - assertThat(getMeasureAsDouble(orchestrator, MODULE, "sqale_debt_ratio")).isEqualTo(28.5d); - assertThat(getMeasureAsDouble(orchestrator, SUB_MODULE, "sqale_debt_ratio")).isEqualTo(31.4d); - assertThat(getMeasureAsDouble(orchestrator, DIRECTORY, "sqale_debt_ratio")).isEqualTo(7.8d); - assertThat(getMeasureAsDouble(orchestrator, FILE, "sqale_debt_ratio")).isEqualTo(7.8d); - } - - @Test - public void use_development_cost_parameter() throws Exception { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/one-issue-per-line.xml")); - orchestrator.getServer().provisionProject("sample", "sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - - assertThat(getMeasureAsDouble(orchestrator, "sample", "sqale_rating")).isEqualTo(1); - - debtConfiguration.updateDevelopmentCost(2); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - - assertThat(getMeasureAsDouble(orchestrator, "sample", "sqale_rating")).isEqualTo(4); - } - - @Test - public void use_language_specific_parameters() throws Exception { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/one-issue-per-line.xml")); - orchestrator.getServer().provisionProject(PROJECT, PROJECT); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT, "xoo", "one-issue-per-line"); - - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample"))); - - assertThat(getMeasureAsDouble(orchestrator, PROJECT, "sqale_rating")).isEqualTo(1); - - debtConfiguration.updateLanguageDevelopmentCost("xoo", 1); - orchestrator.executeBuild( - SonarScanner.create(projectDir("shared/xoo-multi-modules-sample")) - .setProfile("one-issue-per-line")); - - assertThat(getMeasureAsDouble(orchestrator, PROJECT, "sqale_rating")).isEqualTo(5); - } - - @Test - public void use_rating_grid_parameter() throws Exception { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/one-issue-per-line.xml")); - orchestrator.getServer().provisionProject("sample", "sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - - assertThat(getMeasureAsDouble(orchestrator, "sample", "sqale_rating")).isEqualTo(1); - - debtConfiguration.updateRatingGrid(0.001d, 0.005d, 0.01d, 0.015d); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - - assertThat(getMeasureAsDouble(orchestrator, "sample", "sqale_rating")).isEqualTo(5); - } - - @Test - public void effort_to_reach_maintainability_rating_a() { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/with-many-rules.xml")); - orchestrator.getServer().provisionProject(PROJECT, PROJECT); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT, "xoo", "with-many-rules"); - - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample"))); - - assertThat(getMeasureAsDouble(orchestrator, PROJECT, "sqale_rating")).isEqualTo(3); - assertThat(getMeasureAsDouble(orchestrator, PROJECT, "effort_to_reach_maintainability_rating_a")).isEqualTo(292); - - assertThat(getMeasureAsDouble(orchestrator, MODULE, "sqale_rating")).isEqualTo(3); - assertThat(getMeasureAsDouble(orchestrator, MODULE, "effort_to_reach_maintainability_rating_a")).isEqualTo(150); - - assertThat(getMeasureAsDouble(orchestrator, SUB_MODULE, "sqale_rating")).isEqualTo(3); - assertThat(getMeasureAsDouble(orchestrator, SUB_MODULE, "effort_to_reach_maintainability_rating_a")).isEqualTo(77); - - assertThat(getMeasureAsDouble(orchestrator, DIRECTORY, "sqale_rating")).isEqualTo(1); - assertThat(getMeasureAsDouble(orchestrator, DIRECTORY, "effort_to_reach_maintainability_rating_a")).isZero(); - - assertThat(getMeasureAsDouble(orchestrator, FILE, "sqale_rating")).isEqualTo(1); - assertThat(getMeasureAsDouble(orchestrator, FILE, "effort_to_reach_maintainability_rating_a")).isZero(); - } - -} diff --git a/it/it-tests/src/test/java/it/qualityModel/NewDebtRatioMeasureTest.java b/it/it-tests/src/test/java/it/qualityModel/NewDebtRatioMeasureTest.java deleted file mode 100644 index 66bcad3470f..00000000000 --- a/it/it-tests/src/test/java/it/qualityModel/NewDebtRatioMeasureTest.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityModel; - -import com.sonar.orchestrator.Orchestrator; -import it.Category2Suite; -import java.util.Date; -import javax.annotation.Nullable; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import util.ItUtils; - -import static org.apache.commons.lang.time.DateUtils.addDays; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.within; -import static util.ItUtils.formatDate; -import static util.ItUtils.getLeakPeriodValue; -import static util.ItUtils.resetPeriod; -import static util.ItUtils.setServerProperty; -import static util.ItUtils.toDate; - -/** - * SONAR-5876 - */ -public class NewDebtRatioMeasureTest { - - private static final String NEW_DEBT_RATIO_METRIC_KEY = "new_sqale_debt_ratio"; - - private static final Date FIRST_COMMIT_DATE = toDate("2016-09-01"); - private static final Date SECOND_COMMIT_DATE = toDate("2016-09-17"); - private static final Date THIRD_COMMIT_DATE = toDate("2016-09-20"); - - @ClassRule - public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR; - - @AfterClass - public static void reset() throws Exception { - resetPeriod(orchestrator); - } - - @Before - public void cleanUpAnalysisData() { - orchestrator.resetData(); - } - - @Test - public void new_debt_ratio_is_computed_from_new_debt_and_new_ncloc_count_per_file() throws Exception { - setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis"); - - // run analysis on the day of after the first commit, with 'one-issue-per-line' profile - defineQualityProfile("one-issue-per-line"); - provisionSampleProject(); - setSampleProjectQualityProfile("one-issue-per-line"); - runSampleProjectAnalysis("v1", "sonar.projectDate", formatDate(addDays(FIRST_COMMIT_DATE, 1))); - - // first analysis, no previous snapshot => periods not resolved => no value - assertNoNewDebtRatio(); - - // run analysis on the day after of second commit 'one-issue-per-line' profile* - // => 3 new issues will be created - runSampleProjectAnalysis("v2", "sonar.projectDate", formatDate(addDays(SECOND_COMMIT_DATE, 1))); - assertNewDebtRatio(4.44); - - // run analysis on the day after of third commit 'one-issue-per-line' profile* - // => 4 new issues will be created - runSampleProjectAnalysis("v3", "sonar.projectDate", formatDate(addDays(THIRD_COMMIT_DATE, 1))); - assertNewDebtRatio(4.17); - } - - @Test - public void compute_new_debt_ratio_using_number_days_in_leak_period() throws Exception { - setServerProperty(orchestrator, "sonar.leak.period", "30"); - - // run analysis on the day of after the first commit, with 'one-issue-per-line' profile - defineQualityProfile("one-issue-per-line"); - provisionSampleProject(); - setSampleProjectQualityProfile("one-issue-per-line"); - runSampleProjectAnalysis("v1", "sonar.projectDate", formatDate(addDays(FIRST_COMMIT_DATE, 1))); - - // first analysis, no previous snapshot => periods not resolved => no value - assertNoNewDebtRatio(); - - // run analysis on the day after of second commit 'one-issue-per-line' profile* - // => 3 new issues will be created - runSampleProjectAnalysis("v2", "sonar.projectDate", formatDate(addDays(SECOND_COMMIT_DATE, 1))); - assertNewDebtRatio(4.44); - - // run analysis on the day after of third commit 'one-issue-per-line' profile* - // => previous 3 issues plus 4 new issues will be taking into account - runSampleProjectAnalysis("v3", "sonar.projectDate", formatDate(addDays(THIRD_COMMIT_DATE, 1))); - assertNewDebtRatio(4.28); - } - - private void assertNoNewDebtRatio() { - assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", NEW_DEBT_RATIO_METRIC_KEY)).isZero(); - } - - private void assertNewDebtRatio(@Nullable Double valuePeriod) { - assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", NEW_DEBT_RATIO_METRIC_KEY)).isEqualTo(valuePeriod, within(0.01)); - } - - private void setSampleProjectQualityProfile(String qualityProfileKey) { - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", qualityProfileKey); - } - - private void provisionSampleProject() { - orchestrator.getServer().provisionProject("sample", "sample"); - } - - private void defineQualityProfile(String qualityProfileKey) { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/measure/" + qualityProfileKey + ".xml")); - } - - private void runSampleProjectAnalysis(String projectVersion, String... properties) { - ItUtils.runVerboseProjectAnalysis( - NewDebtRatioMeasureTest.orchestrator, - "measure/xoo-new-debt-ratio-" + projectVersion, - ItUtils.concat(properties, - // disable standard scm support so that it does not interfere with Xoo Scm sensor - "sonar.scm.disabled", "false")); - } - -} diff --git a/it/it-tests/src/test/java/it/qualityModel/ReliabilityMeasureTest.java b/it/it-tests/src/test/java/it/qualityModel/ReliabilityMeasureTest.java deleted file mode 100644 index 05358f4e66f..00000000000 --- a/it/it-tests/src/test/java/it/qualityModel/ReliabilityMeasureTest.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityModel; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category2Suite; -import java.util.Map; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.WsMeasures; -import util.ItUtils; - -import static java.lang.Double.parseDouble; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasuresByMetricKey; -import static util.ItUtils.projectDir; - -public class ReliabilityMeasureTest { - - private static final String PROJECT = "com.sonarsource.it.samples:multi-modules-sample"; - private static final String MODULE = "com.sonarsource.it.samples:multi-modules-sample:module_a"; - private static final String SUB_MODULE = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1"; - private static final String DIRECTORY = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1"; - private static final String FILE = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo"; - - private static final String BUGS_METRIC = "bugs"; - private static final String RELIABILITY_REMEDIATION_EFFORT_METRIC = "reliability_remediation_effort"; - private static final String RELIABILITY_RATING_METRIC = "reliability_rating"; - - private static final String[] METRICS = new String[] {BUGS_METRIC, RELIABILITY_RATING_METRIC, RELIABILITY_REMEDIATION_EFFORT_METRIC}; - - @ClassRule - public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR; - - @Before - public void init() { - orchestrator.resetData(); - - orchestrator.getServer().provisionProject(PROJECT, PROJECT); - } - - @Test - public void verify_reliability_measures_when_bug_rules_activated() { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/with-many-rules.xml")); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT, "xoo", "with-many-rules"); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample"))); - - assertMeasures(PROJECT, 61, 305, 4); - assertMeasures(MODULE, 37, 185, 4); - assertMeasures(SUB_MODULE, 16, 80, 4); - assertMeasures(DIRECTORY, 16, 80, 4); - assertMeasures(FILE, 16, 80, 4); - } - - @Test - public void verify_reliability_measures_when_no_bug_rule() { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/without-type-bug.xml")); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT, "xoo", "without-type-bug"); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample"))); - - assertMeasures(PROJECT, 0, 0, 1); - } - - private void assertMeasures(String componentKey, int expectedBugs, int expectedReliabilityRemediationEffort, int expectedReliabilityRating) { - Map<String, WsMeasures.Measure> measures = getMeasuresByMetricKey(orchestrator, componentKey, METRICS); - assertThat(parseDouble(measures.get(BUGS_METRIC).getValue())).isEqualTo(expectedBugs); - assertThat(parseDouble(measures.get(RELIABILITY_REMEDIATION_EFFORT_METRIC).getValue())).isEqualTo(expectedReliabilityRemediationEffort); - assertThat(parseDouble(measures.get(RELIABILITY_RATING_METRIC).getValue())).isEqualTo(expectedReliabilityRating); - } - -} diff --git a/it/it-tests/src/test/java/it/qualityModel/SecurityMeasureTest.java b/it/it-tests/src/test/java/it/qualityModel/SecurityMeasureTest.java deleted file mode 100644 index 4ea301408d9..00000000000 --- a/it/it-tests/src/test/java/it/qualityModel/SecurityMeasureTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityModel; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category2Suite; -import java.util.Map; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.WsMeasures; -import util.ItUtils; - -import static java.lang.Double.parseDouble; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasuresByMetricKey; -import static util.ItUtils.projectDir; - -public class SecurityMeasureTest { - - private static final String PROJECT = "com.sonarsource.it.samples:multi-modules-sample"; - private static final String MODULE = "com.sonarsource.it.samples:multi-modules-sample:module_a"; - private static final String SUB_MODULE = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1"; - private static final String DIRECTORY = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1"; - private static final String FILE = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo"; - - private static final String VULNERABILITIES_METRIC = "vulnerabilities"; - private static final String SECURITY_REMEDIATION_EFFORT_METRIC = "security_remediation_effort"; - private static final String SECURITY_RATING_METRIC = "security_rating"; - - private static final String[] METRICS = new String[] {VULNERABILITIES_METRIC, SECURITY_REMEDIATION_EFFORT_METRIC, SECURITY_RATING_METRIC}; - - @ClassRule - public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR; - - @Before - public void init() { - orchestrator.resetData(); - - orchestrator.getServer().provisionProject(PROJECT, PROJECT); - } - - @Test - public void verify_security_measures_when_vulnerability_rules_activated() { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/with-many-rules.xml")); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT, "xoo", "with-many-rules"); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample"))); - - assertMeasures(PROJECT, 4, 340, 5); - assertMeasures(MODULE, 2, 170, 5); - assertMeasures(SUB_MODULE, 1, 85, 5); - assertMeasures(DIRECTORY, 0, 0, 1); - assertMeasures(FILE, 0, 0, 1); - } - - @Test - public void verify_security_measures_when_no_vulnerability_rule() { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/without-type-vulnerability.xml")); - orchestrator.getServer().associateProjectToQualityProfile(PROJECT, "xoo", "without-type-vulnerability"); - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-multi-modules-sample"))); - - assertMeasures(PROJECT, 0, 0, 1); - } - - private void assertMeasures(String componentKey, int expectedVulnerabilities, int expectedReliabilityRemediationEffort, int expectedReliabilityRating) { - Map<String, WsMeasures.Measure> measures = getMeasuresByMetricKey(orchestrator, componentKey, METRICS); - assertThat(parseDouble(measures.get(VULNERABILITIES_METRIC).getValue())).isEqualTo(expectedVulnerabilities); - assertThat(parseDouble(measures.get(SECURITY_REMEDIATION_EFFORT_METRIC).getValue())).isEqualTo(expectedReliabilityRemediationEffort); - assertThat(parseDouble(measures.get(SECURITY_RATING_METRIC).getValue())).isEqualTo(expectedReliabilityRating); - } -} diff --git a/it/it-tests/src/test/java/it/qualityModel/TechnicalDebtInIssueChangelogTest.java b/it/it-tests/src/test/java/it/qualityModel/TechnicalDebtInIssueChangelogTest.java deleted file mode 100644 index 2389846f764..00000000000 --- a/it/it-tests/src/test/java/it/qualityModel/TechnicalDebtInIssueChangelogTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityModel; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category2Suite; -import java.util.List; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueClient; -import org.sonar.wsclient.issue.IssueQuery; -import org.sonarqube.ws.Issues; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.tuple; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.projectDir; - -/** - * SONAR-4834 - */ -public class TechnicalDebtInIssueChangelogTest { - - @ClassRule - public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR; - - @Rule - public DebtConfigurationRule debtConfiguration = DebtConfigurationRule.create(orchestrator); - - @Before - public void deleteAnalysisData() { - orchestrator.resetData(); - } - - @Test - public void display_debt_in_issue_changelog() throws Exception { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/one-issue-per-file.xml")); - orchestrator.getServer().provisionProject("sample", "sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-file"); - - // Execute a first analysis to have a past snapshot - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - - // Second analysis, existing issues on OneIssuePerFile will have their technical debt updated with the effort to fix - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample")) - .setProperties("sonar.oneIssuePerFile.effortToFix", "10")); - - IssueClient issueClient = orchestrator.getServer().wsClient().issueClient(); - Issue issue = issueClient.find(IssueQuery.create()).list().get(0); - - List<Issues.ChangelogWsResponse.Changelog> changes = changelog(issue.key()).getChangelogList(); - assertThat(changes).hasSize(1); - assertThat(changes.get(0).getDiffsList()) - .extracting(Issues.ChangelogWsResponse.Changelog.Diff::getKey, Issues.ChangelogWsResponse.Changelog.Diff::getOldValue, Issues.ChangelogWsResponse.Changelog.Diff::getNewValue) - .containsOnly(tuple("effort", "10", "100")); - } - - private static Issues.ChangelogWsResponse changelog(String issueKey) { - return newAdminWsClient(orchestrator).issues().changelog(issueKey); - } - -} diff --git a/it/it-tests/src/test/java/it/qualityModel/TechnicalDebtMeasureVariationTest.java b/it/it-tests/src/test/java/it/qualityModel/TechnicalDebtMeasureVariationTest.java deleted file mode 100644 index bfc83b21ccf..00000000000 --- a/it/it-tests/src/test/java/it/qualityModel/TechnicalDebtMeasureVariationTest.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityModel; - -import com.sonar.orchestrator.Orchestrator; -import it.Category2Suite; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getLeakPeriodValue; -import static util.ItUtils.setServerProperty; - -/** - * SONAR-4776 - */ -public class TechnicalDebtMeasureVariationTest { - - @ClassRule - public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR; - - @AfterClass - public static void resetPeriod() throws Exception { - ItUtils.resetPeriod(orchestrator); - } - - @Before - public void cleanUpAnalysisData() { - orchestrator.resetData(); - } - - @Test - public void new_technical_debt_measures_from_new_issues() throws Exception { - setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis"); - - // Execute an analysis in the past to have a past snapshot without any issues - provisionSampleProject(); - setSampleProjectQualityProfile("empty"); - runSampleProjectAnalysis("sonar.projectDate", "2013-01-01"); - - // Second analysis -> issues will be created - defineQualityProfile("one-issue-per-line"); - setSampleProjectQualityProfile("one-issue-per-line"); - runSampleProjectAnalysis(); - - // New technical debt only comes from new issues - assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(17d); - - // Third analysis, with exactly the same profile -> no new issues so no new technical debt - runSampleProjectAnalysis(); - // No variation => measure is 0 (best value) - assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isZero(); - } - - @Test - public void new_technical_debt_measures_from_technical_debt_update_since_previous_analysis() throws Exception { - setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis"); - - // Execute twice analysis - defineQualityProfile("one-issue-per-file"); - provisionSampleProject(); - setSampleProjectQualityProfile("one-issue-per-file"); - runSampleProjectAnalysis(); - runSampleProjectAnalysis(); - - // Third analysis, existing issues on OneIssuePerFile will have their technical debt updated with the effort to fix - runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10"); - assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(90); - - // Fourth analysis, with exactly the same profile -> no new issues so no new technical debt since previous analysis - runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10"); - assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isZero(); - } - - @Test - public void new_technical_debt_measures_from_technical_debt_update_since_30_days() throws Exception { - setServerProperty(orchestrator, "sonar.leak.period", "30"); - - // Execute an analysis in the past to have a past snapshot without any issues - provisionSampleProject(); - setSampleProjectQualityProfile("empty"); - runSampleProjectAnalysis("sonar.projectDate", "2013-01-01"); - - // Second analysis -> issues will be created - String profileXmlFile = "one-issue-per-file"; - defineQualityProfile(profileXmlFile); - setSampleProjectQualityProfile("one-issue-per-file"); - runSampleProjectAnalysis(); - - // Third analysis, existing issues on OneIssuePerFile will have their technical debt updated with the effort to fix - runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10"); - assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(90); - - // Fourth analysis, with exactly the same profile -> no new issues so no new technical debt since previous analysis but still since 30 - // days - runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10"); - assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isEqualTo(90); - } - - /** - * SONAR-5059 - */ - @Test - public void new_technical_debt_measures_should_never_be_negative() throws Exception { - setServerProperty(orchestrator, "sonar.leak.period", "previous_analysis"); - - // Execute an analysis with a big effort to fix - defineQualityProfile("one-issue-per-file"); - provisionSampleProject(); - setSampleProjectQualityProfile("one-issue-per-file"); - runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "100"); - - // Execute a second analysis with a smaller effort to fix -> Added technical debt should be 0, not negative - runSampleProjectAnalysis("sonar.oneIssuePerFile.effortToFix", "10"); - assertThat(getLeakPeriodValue(orchestrator, "sample:src/main/xoo/sample/Sample.xoo", "new_technical_debt")).isZero(); - } - - private void setSampleProjectQualityProfile(String qualityProfileKey) { - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", qualityProfileKey); - } - - private void provisionSampleProject() { - orchestrator.getServer().provisionProject("sample", "sample"); - } - - private void defineQualityProfile(String qualityProfileKey) { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/measure/" + qualityProfileKey + ".xml")); - } - - private void runSampleProjectAnalysis(String... properties) { - ItUtils.runVerboseProjectAnalysis(TechnicalDebtMeasureVariationTest.orchestrator, "shared/xoo-sample", properties); - } - -} diff --git a/it/it-tests/src/test/java/it/qualityModel/TechnicalDebtTest.java b/it/it-tests/src/test/java/it/qualityModel/TechnicalDebtTest.java deleted file mode 100644 index a69e2c72e31..00000000000 --- a/it/it-tests/src/test/java/it/qualityModel/TechnicalDebtTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityModel; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category2Suite; -import java.util.List; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueQuery; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.projectDir; - -public class TechnicalDebtTest { - - @ClassRule - public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR; - - @Rule - public DebtConfigurationRule debtConfiguration = DebtConfigurationRule.create(orchestrator); - - @Before - public void deleteAnalysisData() { - orchestrator.resetData(); - } - - /** - * SONAR-4716 - */ - @Test - public void technical_debt_on_issue() throws Exception { - ItUtils.restoreProfile(orchestrator, getClass().getResource("/qualityModel/one-issue-per-line.xml")); - orchestrator.getServer().provisionProject("sample", "sample"); - orchestrator.getServer().associateProjectToQualityProfile("sample", "xoo", "one-issue-per-line"); - - // Generate some issues - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - - // All the issues should have a technical debt - List<Issue> issues = orchestrator.getServer().wsClient().issueClient().find(IssueQuery.create()).list(); - assertThat(issues).isNotEmpty(); - for (Issue issue : issues) { - assertThat(issue.debt()).isEqualTo("1min"); - } - } - -} diff --git a/it/it-tests/src/test/java/it/qualityProfile/BuiltInQualityProfilesTest.java b/it/it-tests/src/test/java/it/qualityProfile/BuiltInQualityProfilesTest.java deleted file mode 100644 index fa9a4e8ccd0..00000000000 --- a/it/it-tests/src/test/java/it/qualityProfile/BuiltInQualityProfilesTest.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityProfile; - -import com.sonar.orchestrator.Orchestrator; -import it.Category6Suite; -import java.util.function.Predicate; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Session; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Organizations.Organization; -import org.sonarqube.ws.QualityProfiles; -import org.sonarqube.ws.QualityProfiles.CreateWsResponse; -import org.sonarqube.ws.QualityProfiles.SearchWsResponse; -import org.sonarqube.ws.QualityProfiles.SearchWsResponse.QualityProfile; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import org.sonarqube.ws.client.qualityprofile.ChangeParentRequest; -import org.sonarqube.ws.client.qualityprofile.CopyRequest; -import org.sonarqube.ws.client.qualityprofile.QualityProfilesService; -import org.sonarqube.ws.client.qualityprofile.SearchWsRequest; -import org.sonarqube.ws.client.qualityprofile.SetDefaultRequest; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.tuple; -import static util.ItUtils.expectBadRequestError; - -public class BuiltInQualityProfilesTest { - private static final String RULE_ONE_BUG_PER_LINE = "xoo:OneBugIssuePerLine"; - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator); - - @Test - public void built_in_profiles_are_available_in_new_organization() { - Organization org = tester.organizations().generate(); - SearchWsResponse result = tester.qProfiles().service().search(new SearchWsRequest().setOrganizationKey(org.getKey())); - - assertThat(result.getProfilesList()) - .extracting(QualityProfile::getName, QualityProfile::getLanguage, QualityProfile::getIsBuiltIn, QualityProfile::getIsDefault) - .containsExactlyInAnyOrder( - tuple("Basic", "xoo", true, true), - tuple("empty", "xoo", true, false), - tuple("Basic", "xoo2", true, true)); - } - - @Test - public void built_in_profiles_are_available_in_default_organization() { - SearchWsResponse result = tester.qProfiles().service().search(new SearchWsRequest().setOrganizationKey("default-organization")); - - assertThat(result.getProfilesList()) - .extracting(QualityProfile::getOrganization, QualityProfile::getName, QualityProfile::getLanguage, QualityProfile::getIsBuiltIn, QualityProfile::getIsDefault) - .containsExactlyInAnyOrder( - tuple("default-organization", "Basic", "xoo", true, true), - tuple("default-organization", "empty", "xoo", true, false), - tuple("default-organization", "Basic", "xoo2", true, true)); - } - - @Test - public void cannot_delete_built_in_profile_even_when_not_the_default_profile() { - Organization org = tester.organizations().generate(); - QualityProfile builtInProfile = getProfile(org, p -> p.getIsBuiltIn() && p.getIsDefault() && "Basic".equals(p.getName()) && "xoo".equals(p.getLanguage())); - - CreateWsResponse.QualityProfile profileInOrg = tester.qProfiles().createXooProfile(org); - tester.qProfiles().service().setDefault(new SetDefaultRequest(profileInOrg.getKey())); - - expectBadRequestError(() -> tester.qProfiles().service().delete(builtInProfile.getKey())); - } - - @Test - public void built_in_profile_cannot_be_modified() { - Organization org = tester.organizations().generate(); - QualityProfile builtInProfile = getProfile(org, p -> p.getIsBuiltIn() && p.getIsDefault() && "Basic".equals(p.getName()) && "xoo".equals(p.getLanguage())); - - QualityProfilesService service = tester.qProfiles().service(); - expectBadRequestError(() -> tester.qProfiles().activateRule(builtInProfile.getKey(), RULE_ONE_BUG_PER_LINE)); - expectBadRequestError(() -> service.deactivateRule(builtInProfile.getKey(), RULE_ONE_BUG_PER_LINE)); - expectBadRequestError(() -> service.delete(builtInProfile.getKey())); - } - - @Test - public void copy_built_in_profile_to_a_custom_profile() { - Organization org = tester.organizations().generate(); - User administrator = tester.users().generateAdministrator(org); - QualityProfile builtInProfile = getProfile(org, p -> p.getIsBuiltIn() && "Basic".equals(p.getName()) && "xoo".equals(p.getLanguage())); - Session adminSession = tester.as(administrator.getLogin()); - - QualityProfiles.CopyWsResponse copyResponse = adminSession.qProfiles().service().copy(new CopyRequest(builtInProfile.getKey(), "My copy")); - - assertThat(copyResponse.getIsDefault()).isFalse(); - assertThat(copyResponse.getKey()).isNotEmpty().isNotEqualTo(builtInProfile.getKey()); - assertThat(copyResponse.getLanguage()).isEqualTo(builtInProfile.getLanguage()); - assertThat(copyResponse.getName()).isEqualTo("My copy"); - assertThat(copyResponse.getIsInherited()).isFalse(); - - QualityProfile copy = getProfile(org, p -> "My copy".equals(p.getName()) && "xoo".equals(p.getLanguage())); - assertThat(copy.getIsBuiltIn()).isFalse(); - assertThat(copy.getIsDefault()).isFalse(); - assertThat(builtInProfile.getActiveRuleCount()).isGreaterThan(0); - adminSession.qProfiles().assertThatNumberOfActiveRulesEqualsTo(copy.getKey(), (int) builtInProfile.getActiveRuleCount()); - } - - @Test - public void can_inherit_and_disinherit_from_built_in_profile_to_a_custom_profile() { - Organization org = tester.organizations().generate(); - User administrator = tester.users().generateAdministrator(org); - QualityProfile builtInProfile = getProfile(org, p -> p.getIsBuiltIn() && "Basic".equals(p.getName()) && "xoo".equals(p.getLanguage())); - Session adminSession = tester.as(administrator.getLogin()); - - QualityProfiles.CopyWsResponse copyResponse = adminSession.qProfiles().service().copy(new CopyRequest(builtInProfile.getKey(), "My copy")); - adminSession.qProfiles().service().changeParent( - ChangeParentRequest.builder().setParentKey(builtInProfile.getKey()).setProfileKey(copyResponse.getKey()).build()); - - QualityProfile inheritedQualityPropfile = getProfile(org, p -> p.getKey().equals(copyResponse.getKey())); - - assertThat(inheritedQualityPropfile.getParentKey()).isEqualTo(builtInProfile.getKey()); - assertThat(inheritedQualityPropfile.getParentName()).isEqualTo(builtInProfile.getName()); - - // Remove inheritance - adminSession.qProfiles().service().changeParent( - new ChangeParentRequest(ChangeParentRequest.builder().setProfileKey(inheritedQualityPropfile.getKey()))); - - inheritedQualityPropfile = getProfile(org, p -> p.getKey().equals(copyResponse.getKey())); - - assertThat(inheritedQualityPropfile.getParentKey()).isEmpty(); - assertThat(inheritedQualityPropfile.getParentName()).isEmpty(); - } - - private QualityProfile getProfile(Organization organization, Predicate<QualityProfile> filter) { - return tester.qProfiles().service().search(new SearchWsRequest() - .setOrganizationKey(organization.getKey())).getProfilesList() - .stream() - .filter(filter) - .findAny().orElseThrow(IllegalStateException::new); - } -} diff --git a/it/it-tests/src/test/java/it/qualityProfile/CustomQualityProfilesTest.java b/it/it-tests/src/test/java/it/qualityProfile/CustomQualityProfilesTest.java deleted file mode 100644 index ab9cd6b6582..00000000000 --- a/it/it-tests/src/test/java/it/qualityProfile/CustomQualityProfilesTest.java +++ /dev/null @@ -1,328 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityProfile; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category6Suite; -import java.util.List; -import java.util.Map; -import java.util.function.Predicate; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.QProfileTester; -import org.sonarqube.test.Session; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Organizations.Organization; -import org.sonarqube.ws.QualityProfiles; -import org.sonarqube.ws.QualityProfiles.CreateWsResponse.QualityProfile; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.qualityprofile.AddProjectRequest; -import org.sonarqube.ws.client.qualityprofile.ChangeParentRequest; -import org.sonarqube.ws.client.qualityprofile.CopyRequest; -import org.sonarqube.ws.client.qualityprofile.CreateRequest; -import org.sonarqube.ws.client.qualityprofile.SearchWsRequest; -import org.sonarqube.ws.client.qualityprofile.SetDefaultRequest; -import util.ItUtils; - -import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.expectForbiddenError; -import static util.ItUtils.expectMissingError; -import static util.ItUtils.expectUnauthorizedError; -import static util.ItUtils.projectDir; - -public class CustomQualityProfilesTest { - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator); - - @Test - public void activation_of_rules_is_isolated_among_organizations() { - // create two profiles with same names in two organizations - Organization org1 = tester.organizations().generate(); - Organization org2 = tester.organizations().generate(); - QualityProfile profileInOrg1 = tester.qProfiles().createXooProfile(org1, p -> p.setProfileName("foo")); - QualityProfile profileInOrg2 = tester.qProfiles().createXooProfile(org2, p -> p.setProfileName("foo")); - - tester.qProfiles() - .assertThatNumberOfActiveRulesEqualsTo(profileInOrg1, 0) - .assertThatNumberOfActiveRulesEqualsTo(profileInOrg2, 0); - - tester.qProfiles() - .activateRule(profileInOrg1, "xoo:OneIssuePerLine") - .assertThatNumberOfActiveRulesEqualsTo(profileInOrg1, 1) - .assertThatNumberOfActiveRulesEqualsTo(profileInOrg2, 0); - - tester.qProfiles() - .activateRule(profileInOrg1, "xoo:OneIssuePerFile") - .assertThatNumberOfActiveRulesEqualsTo(profileInOrg1, 2) - .assertThatNumberOfActiveRulesEqualsTo(profileInOrg2, 0); - - tester.qProfiles() - .deactivateRule(profileInOrg1, "xoo:OneIssuePerFile") - .assertThatNumberOfActiveRulesEqualsTo(profileInOrg1, 1) - .assertThatNumberOfActiveRulesEqualsTo(profileInOrg2, 0); - - tester.qProfiles() - .activateRule(profileInOrg2, "xoo:OneIssuePerFile") - .assertThatNumberOfActiveRulesEqualsTo(profileInOrg1, 1) - .assertThatNumberOfActiveRulesEqualsTo(profileInOrg2, 1); - - delete(profileInOrg1); - tester.qProfiles() - .assertThatNumberOfActiveRulesEqualsTo(profileInOrg1, 0) - .assertThatNumberOfActiveRulesEqualsTo(profileInOrg2, 1); - } - - @Test - public void an_organization_administrator_can_manage_the_profiles_of_organization() { - Organization org = tester.organizations().generate(); - User user = tester.users().generateAdministrator(org); - - QProfileTester adminSession = tester.as(user.getLogin()).qProfiles(); - QualityProfile profile = adminSession.createXooProfile(org); - adminSession.assertThatNumberOfActiveRulesEqualsTo(profile, 0); - - adminSession - .activateRule(profile, "xoo:OneIssuePerFile") - .assertThatNumberOfActiveRulesEqualsTo(profile, 1); - - adminSession.service().delete(profile.getKey()); - adminSession.assertThatNumberOfActiveRulesEqualsTo(profile, 0); - } - - @Test - public void deleting_an_organization_delete_all_profiles_on_this_organization() { - Organization org = tester.organizations().generate(); - User user = tester.users().generateAdministrator(org); - - QProfileTester adminSession = tester.as(user.getLogin()).qProfiles(); - // Profile - QualityProfile parentProfile = adminSession.createXooProfile(org); - - // Copied profile - QualityProfiles.SearchWsResponse.QualityProfile builtInProfile = getProfile(org, p -> p.getIsBuiltIn() && "Basic".equals(p.getName()) && "xoo".equals(p.getLanguage())); - QualityProfiles.CopyWsResponse copyResponse = adminSession.service().copy(new CopyRequest(builtInProfile.getKey(), "My copy")); - - // Inherited profile from custom - QualityProfile inheritedProfile1 = adminSession.service().create( - CreateRequest.builder() - .setLanguage(parentProfile.getLanguage()) - .setOrganizationKey(org.getKey()) - .setProfileName("inherited_profile") - .build()) - .getProfile(); - - adminSession.service().changeParent( - ChangeParentRequest.builder().setParentKey(parentProfile.getKey()).setProfileKey(inheritedProfile1.getKey()).build()); - - // Inherited profile from builtIn - QualityProfile inheritedProfile2 = adminSession.service().create( - CreateRequest.builder() - .setLanguage(parentProfile.getLanguage()) - .setOrganizationKey(org.getKey()) - .setProfileName("inherited_profile2") - .build()) - .getProfile(); - - adminSession.service().changeParent( - ChangeParentRequest.builder().setParentKey(builtInProfile.getKey()).setProfileKey(inheritedProfile2.getKey()).build()); - - tester.organizations().service().delete(org.getKey()); - - expectMissingError(() -> tester.qProfiles().service().search(new SearchWsRequest() - .setOrganizationKey(org.getKey()))); - - tester.qProfiles().service().search(new SearchWsRequest()).getProfilesList() - .forEach(p -> { - assertThat(p.getOrganization()).isNotEqualTo(org.getKey()); - assertThat(p.getKey()).isNotIn(parentProfile.getKey(), copyResponse.getKey(), inheritedProfile1.getKey(), inheritedProfile2.getKey()); - }); - } - - @Test - public void an_organization_administrator_cannot_manage_the_profiles_of_other_organizations() { - Organization org1 = tester.organizations().generate(); - Organization org2 = tester.organizations().generate(); - QualityProfile profileInOrg2 = tester.qProfiles().createXooProfile(org2); - User adminOfOrg1 = tester.users().generateAdministrator(org1); - - QProfileTester adminSession = tester.as(adminOfOrg1.getLogin()).qProfiles(); - - expectForbiddenError(() -> adminSession.createXooProfile(org2)); - expectForbiddenError(() -> adminSession.service().delete(profileInOrg2.getKey())); - expectForbiddenError(() -> adminSession.activateRule(profileInOrg2, "xoo:OneIssuePerFile")); - expectForbiddenError(() -> adminSession.deactivateRule(profileInOrg2, "xoo:OneIssuePerFile")); - } - - private void delete(QualityProfile profile) { - tester.qProfiles().service().delete(profile.getKey()); - } - - @Test - public void anonymous_cannot_manage_the_profiles_of_an_organization() { - Organization org = tester.organizations().generate(); - QualityProfile profile = tester.qProfiles().createXooProfile(org); - - Session anonymousSession = tester.asAnonymous(); - - expectUnauthorizedError(() -> anonymousSession.qProfiles().createXooProfile(org)); - expectUnauthorizedError(() -> anonymousSession.qProfiles().service().delete(profile.getKey())); - expectUnauthorizedError(() -> anonymousSession.qProfiles().activateRule(profile, "xoo:OneIssuePerFile")); - expectUnauthorizedError(() -> anonymousSession.qProfiles().deactivateRule(profile, "xoo:OneIssuePerFile")); - } - - @Test - public void root_can_manage_the_profiles_of_any_organization() { - Organization org = tester.organizations().generate(); - - User orgAdmin = tester.users().generateAdministrator(org); - Session adminSession = tester.as(orgAdmin.getLogin()); - QualityProfile profile = adminSession.qProfiles().createXooProfile(org); - - // root can activate rule and delete the profile - tester.qProfiles() - .activateRule(profile, "xoo:OneIssuePerFile") - .assertThatNumberOfActiveRulesEqualsTo(profile, 1); - tester.qProfiles().service().delete(profile.getKey()); - tester.qProfiles().assertThatNumberOfActiveRulesEqualsTo(profile, 0); - } - - @Test - public void can_inherit_and_disinherit_and__from_another_custom_profile() { - Organization org = tester.organizations().generate(); - User user = tester.users().generateAdministrator(org); - - Session adminSession = tester.as(user.getLogin()); - QualityProfile parentProfile = adminSession.qProfiles().createXooProfile(org); - QualityProfile inheritedProfile = adminSession.qProfiles().service().create( - CreateRequest.builder() - .setLanguage(parentProfile.getLanguage()) - .setOrganizationKey(org.getKey()) - .setProfileName("inherited_profile") - .build()) - .getProfile(); - - adminSession.qProfiles().service().changeParent( - ChangeParentRequest.builder().setParentKey(parentProfile.getKey()).setProfileKey(inheritedProfile.getKey()).build()); - - QualityProfiles.SearchWsResponse.QualityProfile inheritedQualityPropfile = getProfile(org, p -> p.getKey().equals(inheritedProfile.getKey())); - - assertThat(inheritedQualityPropfile.getParentKey()).isEqualTo(parentProfile.getKey()); - assertThat(inheritedQualityPropfile.getParentName()).isEqualTo(parentProfile.getName()); - - // Remove inheritance - adminSession.qProfiles().service().changeParent( - new ChangeParentRequest(ChangeParentRequest.builder().setProfileKey(inheritedQualityPropfile.getKey()))); - - inheritedQualityPropfile = getProfile(org, p -> p.getKey().equals(inheritedProfile.getKey())); - - assertThat(inheritedQualityPropfile.getParentKey()).isEmpty(); - assertThat(inheritedQualityPropfile.getParentName()).isEmpty(); - } - - @Test - public void analysis_must_use_default_profile() { - Organization org = tester.organizations().generate(); - User admin = tester.users().generateAdministrator(org); - - Session adminSession = tester.as(admin.getLogin()); - - String projectKey = randomAlphanumeric(10); - String projectName = randomAlphanumeric(10); - orchestrator.executeBuild( - SonarScanner.create(projectDir("shared/xoo-sample"), - "sonar.login", admin.getLogin(), - "sonar.password", admin.getLogin(), - "sonar.organization", org.getKey()) - .setProjectKey(projectKey) - .setProjectName(projectName)); - - QualityProfiles.SearchWsResponse.QualityProfile defaultProfile = getProfile(org, p -> "xoo".equals(p.getLanguage()) && - p.getIsDefault()); - assertThatQualityProfileIsUsedFor(projectKey, defaultProfile.getKey()); - - QualityProfile newXooProfile = adminSession.qProfiles().createXooProfile(org); - adminSession.qProfiles().service().setDefault(new SetDefaultRequest(newXooProfile.getKey())); - - orchestrator.executeBuild( - SonarScanner.create(projectDir("shared/xoo-sample"), - "sonar.login", admin.getLogin(), - "sonar.password", admin.getLogin(), - "sonar.organization", org.getKey()) - .setProjectKey(projectKey) - .setProjectName(projectName)); - - assertThatQualityProfileIsUsedFor(projectKey, newXooProfile.getKey()); - } - - @Test - public void analysis_must_use_associated_profile() { - Organization org = tester.organizations().generate(); - User admin = tester.users().generateAdministrator(org); - String projectKey = randomAlphanumeric(10); - String projectName = randomAlphanumeric(10); - Session adminSession = tester.as(admin.getLogin()); - QualityProfile newXooProfile = adminSession.qProfiles().createXooProfile(org); - - adminSession.wsClient().wsConnector().call(new PostRequest("api/projects/create") - .setParam("project", projectKey) - .setParam("name", projectName) - .setParam("organization", org.getKey())); - - adminSession.qProfiles().service().addProject(AddProjectRequest.builder() - .setProfileKey(newXooProfile.getKey()) - .setProjectKey(projectKey) - .build()); - - orchestrator.executeBuild( - SonarScanner.create(projectDir("shared/xoo-sample"), - "sonar.login", admin.getLogin(), - "sonar.password", admin.getLogin(), - "sonar.organization", org.getKey()) - .setProjectKey(projectKey) - .setProjectName(projectName)); - - assertThatQualityProfileIsUsedFor(projectKey, newXooProfile.getKey()); - } - - private void assertThatQualityProfileIsUsedFor(String projectKey, String qualityProfileKey) { - GetRequest request = new GetRequest("api/navigation/component") - .setParam("componentKey", projectKey); - Map components = ItUtils.jsonToMap(tester.wsClient().wsConnector().call(request).content()); - - assertThat(((Map) ((List) components.get("qualityProfiles")).get(0)).get("key")).isEqualTo(qualityProfileKey); - } - - private QualityProfiles.SearchWsResponse.QualityProfile getProfile(Organization organization, Predicate<QualityProfiles.SearchWsResponse.QualityProfile> filter) { - return tester.qProfiles().service().search(new SearchWsRequest() - .setOrganizationKey(organization.getKey())).getProfilesList() - .stream() - .filter(filter) - .findAny().orElseThrow(IllegalStateException::new); - } -} diff --git a/it/it-tests/src/test/java/it/qualityProfile/OrganizationQualityProfilesUiTest.java b/it/it-tests/src/test/java/it/qualityProfile/OrganizationQualityProfilesUiTest.java deleted file mode 100644 index 11d31a89a65..00000000000 --- a/it/it-tests/src/test/java/it/qualityProfile/OrganizationQualityProfilesUiTest.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityProfile; - -import com.codeborne.selenide.Condition; -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category6Suite; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Organizations; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.qualityprofile.AddProjectRequest; -import org.sonarqube.ws.client.qualityprofile.ChangeParentRequest; -import pageobjects.Navigation; - -import static com.codeborne.selenide.Selenide.$; -import static util.ItUtils.projectDir; - -public class OrganizationQualityProfilesUiTest { - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator); - - private Organizations.Organization organization; - - @Before - public void setUp() { - // key and name are overridden for HTML Selenese tests - organization = tester.organizations().generate(o -> o.setKey("test-org").setName("test-org")); - tester.users().generateAdministrator(organization, u -> u.setLogin("admin2").setPassword("admin2")); - createProfile("xoo", "sample"); - inheritProfile("xoo", "sample", "Basic"); - analyzeProject("shared/xoo-sample"); - addProfileToProject("xoo", "sample", "sample"); - } - - @Test - public void testNoGlobalPage() { - Navigation nav = tester.openBrowser(); - nav.open("/profiles"); - $(".page-wrapper-simple").should(Condition.visible); - } - - @Test - public void testHomePage() { - tester.runHtmlTests( - "/organization/OrganizationQualityProfilesUiTest/should_display_list.html", - "/organization/OrganizationQualityProfilesUiTest/should_open_from_list.html", - "/organization/OrganizationQualityProfilesUiTest/should_filter_by_language.html"); - } - - @Test - public void testProfilePage() { - tester.runHtmlTests( - "/organization/OrganizationQualityProfilesUiTest/should_display_profile_rules.html", - "/organization/OrganizationQualityProfilesUiTest/should_display_profile_inheritance.html", - "/organization/OrganizationQualityProfilesUiTest/should_display_profile_projects.html", - "/organization/OrganizationQualityProfilesUiTest/should_display_profile_exporters.html"); - } - - @Test - public void testNotFound() { - Navigation nav = tester.openBrowser(); - nav.open("/organizations/" + organization.getKey() + "/quality_profiles/show?key=unknown"); - $(".quality-profile-not-found").should(Condition.visible); - - nav.open("/organizations/" + organization.getKey() + "/quality_profiles/show?language=xoo&name=unknown"); - $(".quality-profile-not-found").should(Condition.visible); - } - - @Test - public void testProfileChangelog() { - tester.runHtmlTests( - "/organization/OrganizationQualityProfilesUiTest/should_display_changelog.html"); - } - - @Ignore("to be replaced by selenide test in order to inject profile key") - @Test - public void testComparison() { - tester.runHtmlTests("/organization/OrganizationQualityProfilesUiTest/should_compare.html"); - } - - @Test - public void testCreation() { - tester.runHtmlTests("/organization/OrganizationQualityProfilesUiTest/should_create.html"); - } - - @Test - public void testDeletion() { - tester.runHtmlTests("/organization/OrganizationQualityProfilesUiTest/should_delete.html"); - } - - @Test - public void testCopying() { - tester.runHtmlTests("/organization/OrganizationQualityProfilesUiTest/should_copy.html"); - } - - @Test - public void testRenaming() { - tester.runHtmlTests("/organization/OrganizationQualityProfilesUiTest/should_rename.html"); - } - - @Test - public void testSettingDefault() { - tester.runHtmlTests("/organization/OrganizationQualityProfilesUiTest/should_set_default.html"); - } - - @Test - public void testRestoration() { - deleteProfile("xoo", "empty"); - - tester.runHtmlTests("/organization/OrganizationQualityProfilesUiTest/should_restore.html"); - } - - private void createProfile(String language, String name) { - tester.wsClient().wsConnector().call( - new PostRequest("api/qualityprofiles/create") - .setParam("language", language) - .setParam("name", name) - .setParam("organization", organization.getKey())); - } - - private void inheritProfile(String language, String name, String parentName) { - tester.wsClient().qualityProfiles().changeParent(ChangeParentRequest.builder() - .setLanguage(language) - .setProfileName(name) - .setParentName(parentName) - .setOrganization(organization.getKey()) - .build()); - } - - private void analyzeProject(String path) { - orchestrator.executeBuild(SonarScanner.create(projectDir(path)).setProperties( - "sonar.organization", organization.getKey(), - "sonar.login", "admin", - "sonar.password", "admin")); - } - - private void addProfileToProject(String language, String profileName, String projectKey) { - tester.wsClient().qualityProfiles().addProject(AddProjectRequest.builder() - .setLanguage(language) - .setProfileName(profileName) - .setProjectKey(projectKey) - .setOrganization(organization.getKey()) - .build()); - } - - private void deleteProfile(String language, String name) { - tester.wsClient().wsConnector().call( - new PostRequest("api/qualityprofiles/delete") - .setParam("language", language) - .setParam("profileName", name) - .setParam("organization", organization.getKey())); - } - -} diff --git a/it/it-tests/src/test/java/it/qualityProfile/QualityProfilesUiTest.java b/it/it-tests/src/test/java/it/qualityProfile/QualityProfilesUiTest.java deleted file mode 100644 index 4aa69ae1978..00000000000 --- a/it/it-tests/src/test/java/it/qualityProfile/QualityProfilesUiTest.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.qualityProfile; - -import com.codeborne.selenide.Condition; -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.qualityprofile.AddProjectRequest; -import org.sonarqube.ws.client.qualityprofile.ChangeParentRequest; -import org.sonarqube.ws.client.qualityprofile.CreateRequest; -import pageobjects.Navigation; -import util.user.UserRule; - -import static com.codeborne.selenide.Selenide.$; -import static util.ItUtils.projectDir; - -public class QualityProfilesUiTest { - - private static final String ADMIN_USER_LOGIN = "admin-user"; - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - private static WsClient adminWsClient; - - @Rule - public Tester tester = new Tester(orchestrator).disableOrganizations(); - - @Before - public void initAdminUser() throws Exception { - userRule.createAdminUser(ADMIN_USER_LOGIN, ADMIN_USER_LOGIN); - } - - @After - public void deleteAdminUser() { - userRule.resetUsers(); - } - - @Before - public void createSampleProfile() { - createProfile("xoo", "sample"); - inheritProfile("xoo", "sample", "Basic"); - analyzeProject("shared/xoo-sample"); - addProfileToProject("xoo", "sample", "sample"); - } - - @After - public void tearDown() { - setDefault("xoo", "Basic"); - deleteProfile("xoo", "sample"); - deleteProfile("xoo", "new name"); - } - - @Test - public void testHomePage() { - tester.runHtmlTests( - "/qualityProfile/QualityProfilesUiTest/should_display_list.html", - "/qualityProfile/QualityProfilesUiTest/should_open_from_list.html", - "/qualityProfile/QualityProfilesUiTest/should_filter_by_language.html"); - } - - @Test - public void testProfilePage() { - tester.runHtmlTests( - "/qualityProfile/QualityProfilesUiTest/should_display_profile_rules.html", - "/qualityProfile/QualityProfilesUiTest/should_display_profile_inheritance.html", - "/qualityProfile/QualityProfilesUiTest/should_display_profile_projects.html", - "/qualityProfile/QualityProfilesUiTest/should_display_profile_exporters.html"); - } - - @Test - public void testNotFound() { - Navigation nav = tester.openBrowser(); - - nav.open("/profiles/show?key=unknown"); - $(".quality-profile-not-found").should(Condition.visible); - - nav.open("/profiles/show?language=xoo&name=unknown"); - $(".quality-profile-not-found").should(Condition.visible); - } - - @Test - public void testProfileChangelog() { - tester.runHtmlTests( - "/qualityProfile/QualityProfilesUiTest/should_display_changelog.html"); - } - - @Ignore("find a way to know profile key inside selenium tests") - @Test - public void testComparison() { - tester.runHtmlTests("/qualityProfile/QualityProfilesUiTest/should_compare.html"); - } - - @Test - public void testCreation() { - tester.runHtmlTests("/qualityProfile/QualityProfilesUiTest/should_create.html"); - } - - @Test - public void testDeletion() { - tester.runHtmlTests("/qualityProfile/QualityProfilesUiTest/should_delete.html"); - } - - @Test - public void testCopying() { - tester.runHtmlTests("/qualityProfile/QualityProfilesUiTest/should_copy.html"); - } - - @Test - public void testRenaming() { - tester.runHtmlTests("/qualityProfile/QualityProfilesUiTest/should_rename.html"); - } - - @Test - public void testSettingDefault() { - tester.runHtmlTests("/qualityProfile/QualityProfilesUiTest/should_set_default.html"); - } - - @Test - public void testRestore() { - deleteProfile("xoo", "empty"); - - tester.runHtmlTests("/qualityProfile/QualityProfilesUiTest/should_restore.html"); - } - - private void createProfile(String language, String name) { - tester.wsClient().qualityProfiles().create(CreateRequest.builder() - .setLanguage(language) - .setProfileName(name) - .build()); - } - - private void inheritProfile(String language, String name, String parentName) { - tester.wsClient().qualityProfiles().changeParent(ChangeParentRequest.builder() - .setLanguage(language) - .setProfileName(name) - .setParentName(parentName) - .build()); - } - - private static void analyzeProject(String path) { - orchestrator.executeBuild(SonarScanner.create(projectDir(path))); - } - - private void addProfileToProject(String language, String profileName, String projectKey) { - tester.wsClient().qualityProfiles().addProject(AddProjectRequest.builder() - .setLanguage(language) - .setProfileName(profileName) - .setProjectKey(projectKey) - .build()); - } - - private void deleteProfile(String language, String name) { - tester.wsClient().wsConnector().call( - new PostRequest("api/qualityprofiles/delete") - .setParam("language", language) - .setParam("profileName", name)); - } - - private void setDefault(String language, String name) { - tester.wsClient().wsConnector().call( - new PostRequest("api/qualityprofiles/set_default") - .setParam("language", language) - .setParam("profileName", name)); - } -} diff --git a/it/it-tests/src/test/java/it/rule/RuleTagsTest.java b/it/it-tests/src/test/java/it/rule/RuleTagsTest.java deleted file mode 100644 index 28267882459..00000000000 --- a/it/it-tests/src/test/java/it/rule/RuleTagsTest.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.rule; - -import com.sonar.orchestrator.Orchestrator; -import it.Category6Suite; -import java.util.List; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Organizations; -import org.sonarqube.ws.client.PostRequest; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; - -public class RuleTagsTest { - - private static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - private static Tester tester = new Tester(orchestrator); - - @ClassRule - public static TestRule chain = RuleChain.outerRule(orchestrator) - .around(tester); - - private static Organizations.Organization organization1; - private static Organizations.Organization organization2; - - @BeforeClass - public static void setUp() { - organization1 = tester.organizations().generate(); - organization2 = tester.organizations().generate(); - } - - @Test - public void should_not_show_tags_of_other_organization() { - updateTag("foo-tag", organization1); - updateTag("bar-tag", organization2); - assertThat(showRuleTags(organization1)).containsExactly("foo-tag"); - assertThat(showRuleTags(organization2)).containsExactly("bar-tag"); - } - - @Test - public void should_not_list_tags_of_other_organization() { - updateTag("foo-tag", organization1); - updateTag("bar-tag", organization2); - assertThat(listTags(organization1)) - .contains("foo-tag") - .doesNotContain("bar-tag"); - } - - @Test - public void should_not_show_removed_tags() { - updateTag("foo-tag", organization1); - assertThat(showRuleTags(organization1)).contains("foo-tag"); - - updateTag("", organization1); - assertThat(showRuleTags(organization1)).isEmpty(); - } - - @Test - public void should_not_list_removed_tags() { - updateTag("foo-tag", organization1); - assertThat(listTags(organization1)).contains("foo-tag"); - - updateTag("", organization1); - assertThat(listTags(organization1)).doesNotContain("foo-tag"); - } - - private List<String> listTags(Organizations.Organization organization) { - String json = orchestrator.getServer().newHttpCall("/api/rules/tags") - .setParam("organization", organization.getKey()) - .execute() - .getBodyAsString(); - return (List<String>) ItUtils.jsonToMap(json).get("tags"); - } - - private List<String> showRuleTags(Organizations.Organization organization) { - return tester.wsClient().rules().show(organization.getKey(), "xoo:OneIssuePerFile") - .getRule().getTags().getTagsList(); - } - - private void updateTag(String tag, Organizations.Organization organization) { - tester.wsClient().wsConnector().call(new PostRequest("/api/rules/update") - .setParam("organization", organization.getKey()) - .setParam("key", "xoo:OneIssuePerFile") - .setParam("tags", tag)) - .failIfNotSuccessful(); - } -} diff --git a/it/it-tests/src/test/java/it/scm/ScmTest.java b/it/it-tests/src/test/java/it/scm/ScmTest.java deleted file mode 100644 index 17ec36b8066..00000000000 --- a/it/it-tests/src/test/java/it/scm/ScmTest.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.scm; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category2Suite; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import org.apache.commons.lang.builder.EqualsBuilder; -import org.apache.commons.lang.builder.HashCodeBuilder; -import org.apache.commons.lang.builder.ToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; -import org.assertj.core.data.MapEntry; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonar.wsclient.jsonsimple.JSONArray; -import org.sonar.wsclient.jsonsimple.JSONObject; -import org.sonar.wsclient.jsonsimple.JSONValue; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.projectDir; - -public class ScmTest { - - @ClassRule - public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR; - - private static final SimpleDateFormat DATETIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); - - @Before - public void delete_data() { - orchestrator.resetData(); - } - - @Test - public void scm_optimization() throws Exception { - SonarScanner build = SonarScanner.create(projectDir("scm/xoo-sample-with-scm")) - .setProperty("sonar.scm.provider", "xoo") - .setProperty("sonar.scm.disabled", "false"); - - // First run - BuildResult buildResult = orchestrator.executeBuild(build); - - assertThat(getScmData("sample-scm:src/main/xoo/sample/Sample.xoo")) - .containsExactly( - MapEntry.entry(1, new LineData("1", "2013-01-04T00:00:00+0000", "jhenry")), - MapEntry.entry(3, new LineData("2", "2013-01-04T00:00:00+0000", "jhenry")), - MapEntry.entry(4, new LineData("1", "2013-01-04T00:00:00+0000", "jhenry")), - MapEntry.entry(8, new LineData("3", "2014-01-04T00:00:00+0000", "toto"))); - - assertThat(buildResult.getLogs()).containsSequence("1 files to be analyzed", "1/1 files analyzed"); - - // Second run with same file should not trigger blame but SCM data are copied from previous analysis - buildResult = orchestrator.executeBuild(build); - - assertThat(getScmData("sample-scm:src/main/xoo/sample/Sample.xoo")) - .containsExactly( - MapEntry.entry(1, new LineData("1", "2013-01-04T00:00:00+0000", "jhenry")), - MapEntry.entry(3, new LineData("2", "2013-01-04T00:00:00+0000", "jhenry")), - MapEntry.entry(4, new LineData("1", "2013-01-04T00:00:00+0000", "jhenry")), - MapEntry.entry(8, new LineData("3", "2014-01-04T00:00:00+0000", "toto"))); - - assertThat(buildResult.getLogs()).doesNotContain("1 files to be analyzed"); - assertThat(buildResult.getLogs()).doesNotContain("1/1 files analyzed"); - - // Now if SCM is explicitely disabled it should clear SCM data on server side - buildResult = orchestrator.executeBuild(build.setProperty("sonar.scm.disabled", "true")); - - assertThat(getScmData("sample-scm:src/main/xoo/sample/Sample.xoo")).isEmpty(); - - assertThat(buildResult.getLogs()).doesNotContain("1 files to be analyzed"); - assertThat(buildResult.getLogs()).doesNotContain("1/1 files analyzed"); - } - - private class LineData { - - final String revision; - final Date date; - final String author; - - public LineData(String revision, String datetime, String author) throws ParseException { - this.revision = revision; - this.date = DATETIME_FORMAT.parse(datetime); - this.author = author; - } - - @Override - public boolean equals(Object obj) { - return EqualsBuilder.reflectionEquals(this, obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(revision).append(date).append(author).toHashCode(); - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE); - } - } - - private Map<Integer, LineData> getScmData(String fileKey) throws ParseException { - Map<Integer, LineData> result = new HashMap<>(); - String json = orchestrator.getServer().adminWsClient().get("api/sources/scm", "key", fileKey); - JSONObject obj = (JSONObject) JSONValue.parse(json); - JSONArray array = (JSONArray) obj.get("scm"); - for (Object anArray : array) { - JSONArray item = (JSONArray) anArray; - String datetime = (String) item.get(2); - result.put(((Long) item.get(0)).intValue(), new LineData((String) item.get(3), datetime, (String) item.get(1))); - } - return result; - } - -} diff --git a/it/it-tests/src/test/java/it/serverSystem/ClusterTest.java b/it/it-tests/src/test/java/it/serverSystem/ClusterTest.java deleted file mode 100644 index 99b974df50d..00000000000 --- a/it/it-tests/src/test/java/it/serverSystem/ClusterTest.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.serverSystem; - -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableMap; -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.server.StartupLogWatcher; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.StringUtils; -import org.junit.Ignore; -import org.junit.Test; -import org.sonarqube.ws.Issues; -import org.sonarqube.ws.Settings; -import org.sonarqube.ws.client.rule.SearchWsRequest; -import org.sonarqube.ws.client.setting.ValuesRequest; -import util.ItUtils; - -import static org.apache.commons.lang3.StringUtils.containsIgnoreCase; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newWsClient; - -@Ignore("temporarily ignored") -public class ClusterTest { - - private static final String CONF_FILE_PATH = "conf/sonar.properties"; - - /** - * SONAR-7899 - */ - @Test - public void secondary_nodes_do_not_write_to_datastores_at_startup() throws Exception { - // start "startup leader", which creates and populates datastores - Orchestrator orchestrator = Orchestrator.builderEnv() - .setServerProperty("sonar.cluster.enabled", "true") - .setServerProperty("sonar.cluster.name", "secondary_nodes_do_not_write_to_datastores_at_startup") - .setServerProperty("sonar.cluster.web.startupLeader", "true") - .setServerProperty("sonar.log.level", "TRACE") - .addPlugin(ItUtils.xooPlugin()) - .build(); - orchestrator.start(); - - expectLog(orchestrator, "Cluster enabled (startup leader)"); - expectWriteOperations(orchestrator, true); - // verify that datastores are populated by requesting rules - assertThat(newWsClient(orchestrator).rules().search(new SearchWsRequest()).getTotal()).isGreaterThan(0); - - FileUtils.write(orchestrator.getServer().getWebLogs(), "", false); - updateSonarPropertiesFile(orchestrator, ImmutableMap.of("sonar.cluster.web.startupLeader", "false")); - orchestrator.restartServer(); - - expectLog(orchestrator, "Cluster enabled (startup follower)"); - expectWriteOperations(orchestrator, false); - - orchestrator.stop(); - } - - @Test - public void start_cluster_of_elasticsearch_and_web_nodes() throws IOException { - Orchestrator elasticsearch = null; - Orchestrator web = null; - - try { - ElasticsearchStartupWatcher esWatcher = new ElasticsearchStartupWatcher(); - elasticsearch = Orchestrator.builderEnv() - .setServerProperty("sonar.cluster.enabled", "true") - .setServerProperty("sonar.cluster.name", "start_cluster_of_elasticsearch_and_web_nodes") - .setServerProperty("sonar.cluster.web.disabled", "true") - .setServerProperty("sonar.cluster.ce.disabled", "true") - .setStartupLogWatcher(esWatcher) - .build(); - elasticsearch.start(); - assertThat(esWatcher.port).isGreaterThan(0); - assertThat(FileUtils.readFileToString(elasticsearch.getServer().getAppLogs())).doesNotContain("Process[web]"); - - web = Orchestrator.builderEnv() - .setServerProperty("sonar.cluster.enabled", "true") - .setServerProperty("sonar.cluster.name", "start_cluster_of_elasticsearch_and_web_nodes") - .setServerProperty("sonar.cluster.web.startupLeader", "true") - .setServerProperty("sonar.cluster.search.disabled", "true") - .setServerProperty("sonar.cluster.search.hosts", "localhost:" + esWatcher.port) - // no need for compute engine in this test. Disable it for faster test. - .setServerProperty("sonar.cluster.ce.disabled", "true") - // override the default watcher provided by Orchestrator - // which waits for Compute Engine to be up - .setStartupLogWatcher(log -> log.contains("SonarQube is up")) - .build(); - web.start(); - - String coreId = getPropertyValue(web, "sonar.core.id"); - String startTime = getPropertyValue(web, "sonar.core.startTime"); - - assertThat(FileUtils.readFileToString(web.getServer().getAppLogs())).doesNotContain("Process[es]"); - // call a web service that requires Elasticsearch - Issues.SearchWsResponse wsResponse = ItUtils.newWsClient(web).issues().search(new org.sonarqube.ws.client.issue.SearchWsRequest()); - assertThat(wsResponse.getIssuesCount()).isEqualTo(0); - - web.restartServer(); - - // sonar core id must not change after restart - assertThat(getPropertyValue(web, "sonar.core.id")).isEqualTo(coreId); - // startTime must change at each startup - assertThat(getPropertyValue(web, "sonar.core.startTime")).isNotEqualTo(startTime); - } finally { - if (web != null) { - web.stop(); - } - if (elasticsearch != null) { - elasticsearch.stop(); - } - } - } - - private static String getPropertyValue(Orchestrator web, String property) { - Settings.ValuesWsResponse response = ItUtils.newAdminWsClient(web).settings().values(ValuesRequest.builder().setKeys(property).build()); - List<Settings.Setting> settingsList = response.getSettingsList(); - if (settingsList.isEmpty()) { - return null; - } - assertThat(settingsList).hasSize(1); - return settingsList.iterator().next().getValue(); - } - - private static class ElasticsearchStartupWatcher implements StartupLogWatcher { - private final Pattern pattern = Pattern.compile("Elasticsearch listening on .*:(\\d+)"); - private int port = -1; - - @Override - public boolean isStarted(String log) { - Matcher matcher = pattern.matcher(log); - if (matcher.find()) { - port = Integer.parseInt(matcher.group(1)); - } - return log.contains("Process[es] is up"); - } - } - - private static void expectLog(Orchestrator orchestrator, String expectedLog) throws IOException { - File logFile = orchestrator.getServer().getWebLogs(); - try (Stream<String> lines = Files.lines(logFile.toPath())) { - assertThat(lines.anyMatch(s -> StringUtils.containsIgnoreCase(s, expectedLog))).isTrue(); - } - } - - private static void expectWriteOperations(Orchestrator orchestrator, boolean expected) throws IOException { - try (Stream<String> lines = Files.lines(orchestrator.getServer().getWebLogs().toPath())) { - List<String> writeOperations = lines.filter(ClusterTest::isWriteOperation).collect(Collectors.toList()); - if (expected) { - assertThat(writeOperations).isNotEmpty(); - } else { - assertThat(writeOperations).as("Unexpected write operations: " + Joiner.on('\n').join(writeOperations)).isEmpty(); - - } - } - } - - private static boolean isWriteOperation(String log) { - return isDbWriteOperation(log) || isEsWriteOperation(log); - } - - private static boolean isDbWriteOperation(String log) { - return log.contains("web[][sql]") && (containsIgnoreCase(log, "sql=insert") || - containsIgnoreCase(log, "sql=update") || - containsIgnoreCase(log, "sql=delete") || - containsIgnoreCase(log, "sql=create")); - } - - private static boolean isEsWriteOperation(String log) { - return log.contains("web[][es]") && (containsIgnoreCase(log, "Create index") || - containsIgnoreCase(log, "Create type") || - containsIgnoreCase(log, "put mapping request") || - containsIgnoreCase(log, "refresh request") || - containsIgnoreCase(log, "index request")); - } - - private static void updateSonarPropertiesFile(Orchestrator orchestrator, Map<String, String> props) throws IOException { - Properties propsFile = new Properties(); - try (FileInputStream conf = FileUtils.openInputStream(new File(orchestrator.getServer().getHome(), CONF_FILE_PATH))) { - propsFile.load(conf); - propsFile.putAll(props); - } - try (FileOutputStream conf = FileUtils.openOutputStream(new File(orchestrator.getServer().getHome(), CONF_FILE_PATH))) { - propsFile.store(conf, ""); - } - } -} diff --git a/it/it-tests/src/test/java/it/serverSystem/HttpHeadersTest.java b/it/it-tests/src/test/java/it/serverSystem/HttpHeadersTest.java deleted file mode 100644 index 12fccdb9ed7..00000000000 --- a/it/it-tests/src/test/java/it/serverSystem/HttpHeadersTest.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.serverSystem; - -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import okhttp3.CacheControl; -import okhttp3.Response; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; - -import static com.google.common.io.Files.getFileExtension; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.call; - -public class HttpHeadersTest { - - @ClassRule - public static final Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - private static String JS_HASH; - - @BeforeClass - public static void setUp() throws Exception { - JS_HASH = getJsHash(); - } - - @Test - public void verify_headers_of_base_url() throws Exception { - Response response = call(orchestrator.getServer().getUrl() + "/"); - - verifySecurityHeaders(response); - verifyContentType(response, "text/html;charset=utf-8"); - - // SONAR-6964 - assertNoCacheInBrowser(response); - } - - @Test - public void verify_headers_of_ws() throws Exception { - Response response = call(orchestrator.getServer().getUrl() + "/api/issues/search"); - - verifySecurityHeaders(response); - verifyContentType(response, "application/json"); - assertNoCacheInBrowser(response); - } - - @Test - public void verify_headers_of_images() throws Exception { - Response response = call(orchestrator.getServer().getUrl() + "/images/logo.svg"); - - verifySecurityHeaders(response); - verifyContentType(response, "image/svg+xml"); - assertCacheInBrowser(response); - } - - @Test - public void verify_headers_of_css() throws Exception { - Response response = call(orchestrator.getServer().getUrl() + "/css/sonar." + JS_HASH + ".css"); - - verifySecurityHeaders(response); - verifyContentType(response, "text/css"); - assertCacheInBrowser(response); - } - - @Test - public void verify_headers_of_js() throws Exception { - Response response = call(orchestrator.getServer().getUrl() + "/js/app." + JS_HASH + ".js"); - - verifySecurityHeaders(response); - verifyContentType(response, "application/javascript"); - } - - @Test - public void verify_headers_of_images_provided_by_plugins() throws Exception { - Response response = call(orchestrator.getServer().getUrl() + "/static/uiextensionsplugin/cute.jpg"); - - verifySecurityHeaders(response); - verifyContentType(response, "image/jpeg"); - } - - @Test - public void verify_headers_of_js_provided_by_plugins() throws Exception { - Response response = call(orchestrator.getServer().getUrl() + "/static/uiextensionsplugin/extension.js"); - - verifySecurityHeaders(response); - verifyContentType(response, "application/javascript"); - } - - @Test - public void verify_headers_of_html_provided_by_plugins() throws Exception { - Response response = call(orchestrator.getServer().getUrl() + "/static/uiextensionsplugin/file.html"); - - verifySecurityHeaders(response); - verifyContentType(response, "text/html"); - } - - private static void assertCacheInBrowser(Response httpResponse) { - CacheControl cacheControl = httpResponse.cacheControl(); - assertThat(cacheControl.mustRevalidate()).isFalse(); - assertThat(cacheControl.noCache()).isFalse(); - assertThat(cacheControl.noStore()).isFalse(); - } - - private static void assertNoCacheInBrowser(Response httpResponse) { - CacheControl cacheControl = httpResponse.cacheControl(); - assertThat(cacheControl.mustRevalidate()).isTrue(); - assertThat(cacheControl.noCache()).isTrue(); - assertThat(cacheControl.noStore()).isTrue(); - } - - /** - * SONAR-8247 - */ - private static void verifySecurityHeaders(Response httpResponse) { - assertThat(httpResponse.isSuccessful()).as("Code is %s", httpResponse.code()).isTrue(); - assertThat(httpResponse.headers().get("X-Frame-Options")).isEqualTo("SAMEORIGIN"); - assertThat(httpResponse.headers().get("X-XSS-Protection")).isEqualTo("1; mode=block"); - assertThat(httpResponse.headers().get("X-Content-Type-Options")).isEqualTo("nosniff"); - } - - private static void verifyContentType(Response httpResponse, String expectedContentType) { - assertThat(httpResponse.headers().get("Content-Type")).isEqualTo(expectedContentType); - } - - /** - * Every JS and CSS files contains a hash between the file name and the extension. - */ - private static String getJsHash() throws IOException { - File cssFolder = new File(orchestrator.getServer().getHome(), "web/css"); - String fileName = Files.list(cssFolder.toPath()) - .map(path -> path.toFile().getName()) - .filter(name -> getFileExtension(name).equals("css")) - .findFirst() - .orElseThrow(() -> new IllegalStateException("sonar.css hasn't been found")); - return fileName.replace("sonar.", "").replace(".css", ""); - } -} diff --git a/it/it-tests/src/test/java/it/serverSystem/LogsTest.java b/it/it-tests/src/test/java/it/serverSystem/LogsTest.java deleted file mode 100644 index 7b29b6229db..00000000000 --- a/it/it-tests/src/test/java/it/serverSystem/LogsTest.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.serverSystem; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import java.io.File; -import java.io.IOException; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.input.ReversedLinesFileReader; -import org.assertj.core.util.Files; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.issue.SearchWsRequest; -import util.ItUtils; - -import static java.lang.String.format; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.projectDir; - -public class LogsTest { - - public static final String ACCESS_LOGS_PATTERN = "\"%reqAttribute{ID}\" \"%reqAttribute{LOGIN}\" \"%r\" %s"; - private static final String PATH = "/called/from/LogsTest"; - - @ClassRule - public static final Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Before - public void cleanDatabase() { - orchestrator.resetData(); - } - - /** - * SONAR-7581 - */ - @Test - public void verify_login_in_access_logs() throws Exception { - // log "-" for anonymous - sendHttpRequest(ItUtils.newWsClient(orchestrator), PATH); - assertThat(accessLogsFile()).isFile().exists(); - verifyLastAccessLogLine("-", PATH, 200); - - sendHttpRequest(ItUtils.newAdminWsClient(orchestrator), PATH); - verifyLastAccessLogLine("admin", PATH, 200); - } - - @Test - public void verify_request_id_in_access_logs() throws IOException { - sendHttpRequest(ItUtils.newWsClient(orchestrator), PATH); - String lastAccessLog = readLastAccessLog(); - assertThat(lastAccessLog).doesNotStartWith("\"\"").startsWith("\""); - int firstQuote = lastAccessLog.indexOf('"'); - String requestId = lastAccessLog.substring(firstQuote + 1, lastAccessLog.indexOf('"', firstQuote + 1)); - assertThat(requestId.length()).isGreaterThanOrEqualTo(20); - } - - @Test - public void info_log_in_sonar_log_file_when_SQ_is_done_starting() throws IOException { - List<String> logs = FileUtils.readLines(orchestrator.getServer().getAppLogs()); - String sqIsUpMessage = "SonarQube is up"; - assertThat(logs.stream().filter(str -> str.contains(sqIsUpMessage)).findFirst()).describedAs("message is there").isNotEmpty(); - assertThat(logs.get(logs.size() - 1)).describedAs("message is the last line of logs").contains(sqIsUpMessage); - } - - @Test - public void test_ws_change_log_level() throws IOException { - generateSqlAndEsLogsInWebAndCe(); - - assertThat(logLevelsOf(orchestrator.getServer().getWebLogs())).doesNotContain("DEBUG", "TRACE"); - assertThat(logLevelsOf(orchestrator.getServer().getCeLogs())).doesNotContain("DEBUG", "TRACE"); - - orchestrator.getServer().adminWsClient().post("api/system/change_log_level", "level", "TRACE"); - - generateSqlAndEsLogsInWebAndCe(); - - // there is hardly DEBUG logs, but we are sure there must be TRACE logs for SQL and ES requests - assertThat(logLevelsOf(orchestrator.getServer().getWebLogs())).contains("TRACE"); - assertThat(logLevelsOf(orchestrator.getServer().getCeLogs())).contains("TRACE"); - - // reset log files to empty and level to INFO - orchestrator.getServer().adminWsClient().post("api/system/change_log_level", "level", "INFO"); - FileUtils.write(orchestrator.getServer().getWebLogs(), ""); - FileUtils.write(orchestrator.getServer().getCeLogs(), ""); - - generateSqlAndEsLogsInWebAndCe(); - - assertThat(logLevelsOf(orchestrator.getServer().getWebLogs())).doesNotContain("DEBUG", "TRACE"); - assertThat(logLevelsOf(orchestrator.getServer().getCeLogs())).doesNotContain("DEBUG", "TRACE"); - } - - private void generateSqlAndEsLogsInWebAndCe() { - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - ItUtils.newAdminWsClient(orchestrator).issues().search(new SearchWsRequest() - .setProjectKeys(Collections.singletonList("sample"))); - } - - private Collection<String> logLevelsOf(File webLogs) { - return Files.linesOf(webLogs, "UTF-8").stream() - .filter(str -> str.length() >= 25) - .map(str -> str.substring(20, 25)) - .map(String::trim) - .collect(Collectors.toSet()); - } - - private void verifyLastAccessLogLine(String login, String path, int status) throws IOException { - assertThat(readLastAccessLog()).endsWith(format("\"%s\" \"GET %s HTTP/1.1\" %d", login, path, status)); - } - - private String readLastAccessLog() throws IOException { - try (ReversedLinesFileReader tailer = new ReversedLinesFileReader(accessLogsFile())) { - return tailer.readLine(); - } - } - - private void sendHttpRequest(WsClient client, String path) { - client.wsConnector().call(new GetRequest(path)); - } - - private File accessLogsFile() { - return new File(orchestrator.getServer().getHome(), "logs/access.log"); - } -} diff --git a/it/it-tests/src/test/java/it/serverSystem/PingTest.java b/it/it-tests/src/test/java/it/serverSystem/PingTest.java deleted file mode 100644 index 3be2e6c7132..00000000000 --- a/it/it-tests/src/test/java/it/serverSystem/PingTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.serverSystem; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.http.HttpResponse; -import it.Category4Suite; -import org.junit.ClassRule; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class PingTest { - - @ClassRule - public static final Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Test - public void ping_answers_pong() throws Exception { - HttpResponse response = orchestrator.getServer().newHttpCall("/api/system/ping").execute(); - - assertThat(response.getBodyAsString()).isEqualTo("pong"); - assertThat(response.getHeader("Content-Type")).isEqualTo("text/plain"); - } -} diff --git a/it/it-tests/src/test/java/it/serverSystem/RestartTest.java b/it/it-tests/src/test/java/it/serverSystem/RestartTest.java deleted file mode 100644 index cd58134a2c2..00000000000 --- a/it/it-tests/src/test/java/it/serverSystem/RestartTest.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.serverSystem; - -import com.sonar.orchestrator.Orchestrator; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.SystemUtils; -import org.junit.After; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.DisableOnDebug; -import org.junit.rules.ExpectedException; -import org.junit.rules.TestRule; -import org.junit.rules.Timeout; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.WsResponse; -import org.sonarqube.ws.client.permission.AddUserWsRequest; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.newWsClient; - -/** - * This class starts a new orchestrator on each test case - */ -public class RestartTest { - - private Orchestrator orchestrator; - - @Rule - public ExpectedException thrown = ExpectedException.none(); - @Rule - public TestRule safeguardTimeout = new DisableOnDebug(Timeout.seconds(900)); - - @After - public void stop() { - if (orchestrator != null) { - orchestrator.stop(); - } - } - - @Test - public void restart_in_prod_mode_requires_sysadmin_permission_and_restarts() throws Exception { - // server classloader locks Jar files on Windows - if (!SystemUtils.IS_OS_WINDOWS) { - orchestrator = Orchestrator.builderEnv() - .setOrchestratorProperty("orchestrator.keepWorkspace", "true") - .build(); - orchestrator.start(); - - verifyFailWith403(() -> newWsClient(orchestrator).system().restart()); - - createNonSystemAdministrator("john", "doe"); - verifyFailWith403(() -> ItUtils.newUserWsClient(orchestrator, "john", "doe").system().restart()); - - createSystemAdministrator("big", "boss"); - ItUtils.newUserWsClient(orchestrator, "big", "boss").system().restart(); - WsResponse wsResponse = newAdminWsClient(orchestrator).wsConnector().call(new GetRequest("/api/system/status")).failIfNotSuccessful(); - assertThat(wsResponse.content()).contains("RESTARTING"); - - // we just wait five seconds, for a lack of a better approach to waiting for the restart process to start in SQ - Thread.sleep(5000); - - assertThat(FileUtils.readFileToString(orchestrator.getServer().getWebLogs())) - .contains("SonarQube restart requested by big"); - } - } - - /** - * SONAR-4843 - */ - @Test - public void restart_on_dev_mode() throws Exception { - // server classloader locks Jar files on Windows - if (!SystemUtils.IS_OS_WINDOWS) { - orchestrator = Orchestrator.builderEnv() - .setServerProperty("sonar.web.dev", "true") - .build(); - orchestrator.start(); - - newAdminWsClient(orchestrator).system().restart(); - assertThat(FileUtils.readFileToString(orchestrator.getServer().getWebLogs())) - .contains("Fast restarting WebServer...") - .contains("WebServer restarted"); - } - } - - private static void verifyFailWith403(Runnable runnable) { - try { - runnable.run(); - fail(); - } catch (Exception e) { - assertThat(e.getMessage()).contains("403"); - } - } - - private void createSystemAdministrator(String login, String password) { - WsClient wsClient = newAdminWsClient(orchestrator); - createNonSystemAdministrator(wsClient, login, password); - wsClient.permissions().addUser(new AddUserWsRequest().setLogin(login).setPermission("admin")); - } - - private void createNonSystemAdministrator(String login, String password) { - createNonSystemAdministrator(newAdminWsClient(orchestrator), login, password); - } - - private static void createNonSystemAdministrator(WsClient wsClient, String login, String password) { - wsClient.wsConnector().call( - new PostRequest("api/users/create") - .setParam("login", login) - .setParam("name", login) - .setParam("password", password)); - } -} diff --git a/it/it-tests/src/test/java/it/serverSystem/ServerSystemRestartingOrchestrator.java b/it/it-tests/src/test/java/it/serverSystem/ServerSystemRestartingOrchestrator.java deleted file mode 100644 index 03142b3e7cc..00000000000 --- a/it/it-tests/src/test/java/it/serverSystem/ServerSystemRestartingOrchestrator.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.serverSystem; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.locator.FileLocation; -import java.io.File; -import java.util.Map; -import org.apache.commons.io.FileUtils; -import org.junit.After; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsResponse; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; -import static util.ItUtils.newWsClient; - -/** - * This class start a new orchestrator on each test case - */ -public class ServerSystemRestartingOrchestrator { - - Orchestrator orchestrator; - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @After - public void stop() { - if (orchestrator != null) { - orchestrator.stop(); - } - } - - /** - * SONAR-3516 - */ - @Test - public void check_minimal_sonar_version_at_startup() throws Exception { - try { - orchestrator = Orchestrator.builderEnv() - .addPlugin(FileLocation.of(new File(ServerSystemRestartingOrchestrator.class.getResource("/serverSystem/ServerSystemTest/incompatible-plugin-1.0.jar").toURI()))) - .build(); - orchestrator.start(); - fail(); - } catch (Exception e) { - assertThat(FileUtils.readFileToString(orchestrator.getServer().getWebLogs())).contains( - "Plugin incompatible-plugin [incompatibleplugin] requires at least SonarQube 100"); - } - } - - @Test - public void support_install_dir_with_whitespaces() throws Exception { - String dirName = "target/has space"; - FileUtils.deleteDirectory(new File(dirName)); - orchestrator = Orchestrator.builderEnv() - .setOrchestratorProperty("orchestrator.workspaceDir", dirName) - .build(); - orchestrator.start(); - - WsResponse statusResponse = newWsClient(orchestrator).wsConnector().call(new GetRequest("api/system/status")); - Map<String, Object> json = ItUtils.jsonToMap(statusResponse.content()); - assertThat(json.get("status")).isEqualTo("UP"); - } - - // SONAR-4748 - @Test - public void should_create_in_temp_folder() throws Exception { - orchestrator = Orchestrator.builderEnv() - .addPlugin(ItUtils.pluginArtifact("server-plugin")) - .setServerProperty("sonar.createTempFiles", "true") - .build(); - orchestrator.start(); - - File tempDir = new File(orchestrator.getServer().getHome(), "temp/tmp"); - - String logs = FileUtils.readFileToString(orchestrator.getServer().getWebLogs()); - assertThat(logs).contains("Creating temp directory: " + tempDir.getAbsolutePath() + File.separator + "sonar-it"); - assertThat(logs).contains("Creating temp file: " + tempDir.getAbsolutePath() + File.separator + "sonar-it"); - - // Verify temp folder is created - assertThat(new File(tempDir, "sonar-it")).isDirectory().exists(); - - orchestrator.stop(); - - // Verify temp folder is deleted after shutdown - assertThat(new File(tempDir, "sonar-it")).doesNotExist(); - } - -} diff --git a/it/it-tests/src/test/java/it/serverSystem/ServerSystemTest.java b/it/it-tests/src/test/java/it/serverSystem/ServerSystemTest.java deleted file mode 100644 index 6edb93ad309..00000000000 --- a/it/it-tests/src/test/java/it/serverSystem/ServerSystemTest.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.serverSystem; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import java.io.File; -import java.io.IOException; -import java.util.Map; -import okhttp3.Response; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.json.simple.JSONValue; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.ws.MediaTypes; -import org.sonarqube.ws.ServerId.ShowWsResponse; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.WsResponse; -import pageobjects.Navigation; -import pageobjects.ServerIdPage; -import util.ItUtils; -import util.user.UserRule; - -import static org.apache.commons.lang.StringUtils.startsWithAny; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; -import static util.ItUtils.call; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.newWsClient; -import static util.selenium.Selenese.runSelenese; - -public class ServerSystemTest { - - private static final String ADMIN_USER_LOGIN = "admin-user"; - - @ClassRule - public static final Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - @Before - public void initAdminUser() { - userRule.createAdminUser(ADMIN_USER_LOGIN, ADMIN_USER_LOGIN); - } - - @After - public void deleteAdminUser() { - userRule.resetUsers(); - } - - @Test - public void get_sonarqube_version() { - Map<String, Object> json = callStatus(); - - String version = (String) json.get("version"); - if (!startsWithAny(version, new String[] {"6."})) { - fail("Bad version: " + version); - } - } - - @Test - public void get_server_status() { - Map<String, Object> json = callStatus(); - assertThat(json.get("status")).isEqualTo("UP"); - } - - @Test - public void generate_server_id() throws IOException { - Navigation nav = Navigation.create(orchestrator).openHome().logIn().submitCredentials(ADMIN_USER_LOGIN); - String validIpAddress = getValidIpAddress(); - - nav.openServerId() - .setOrganization("Name with invalid chars like $") - .setIpAddress(validIpAddress) - .submitForm() - .assertError(); - - nav.openServerId() - .setOrganization("DEMO") - .setIpAddress("invalid_address") - .submitForm() - .assertError(); - - ServerIdPage page = nav.openServerId() - .setOrganization("DEMO") - .setIpAddress(validIpAddress) - .submitForm(); - - String serverId = page.serverIdInput().val(); - assertThat(serverId).isNotEmpty(); - } - - private Map<String, Object> callStatus() { - WsResponse statusResponse = newWsClient(orchestrator).wsConnector().call(new GetRequest("api/system/status")); - return ItUtils.jsonToMap(statusResponse.content()); - } - - @Test - public void display_system_info() { - runSelenese(orchestrator, "/serverSystem/ServerSystemTest/system_info.html"); - } - - @Test - public void download_system_info() throws Exception { - waitForComputeEngineToBeUp(orchestrator); - - WsResponse response = newAdminWsClient(orchestrator).wsConnector().call( - new GetRequest("api/system/info")); - - assertThat(response.code()).isEqualTo(200); - - assertThat(response.content()).contains( - // SONAR-7436 monitor ES and CE - "\"Compute Engine Database Connection\":", "\"Compute Engine State\":", "\"Compute Engine Tasks\":", - "\"Elasticsearch\":", "\"State\":\"GREEN\"", - - // SONAR-7271 get settings - "\"Settings\":", "\"sonar.jdbc.url\":", "\"sonar.path.data\":"); - } - - private static void waitForComputeEngineToBeUp(Orchestrator orchestrator) throws IOException { - for (int i = 0; i < 10_000; i++) { - File logs = orchestrator.getServer().getCeLogs(); - if (FileUtils.readFileToString(logs).contains("Compute Engine is operational")) { - return; - } - try { - Thread.sleep(100); - } catch (InterruptedException e) { - // ignored - } - } - throw new IllegalStateException("Compute Engine is not operational"); - } - - /** - * See http://jira.codehaus.org/browse/SONAR-2727 - */ - @Test - public void display_warnings_when_using_h2() { - if (orchestrator.getConfiguration().getString("sonar.jdbc.dialect").equals("h2")) { - runSelenese(orchestrator, "/serverSystem/ServerSystemTest/derby-warning.html"); - } - } - - /** - * See http://jira.codehaus.org/browse/SONAR-2840 - */ - @Test - public void hide_jdbc_settings_to_non_admin() { - runSelenese(orchestrator, "/serverSystem/ServerSystemTest/hide-jdbc-settings.html"); - } - - @Test - public void http_response_should_be_gzipped() throws IOException { - String url = orchestrator.getServer().getUrl() + "/api/rules/search"; - Response metricsResponse = call(url); - assertThat(metricsResponse.isSuccessful()).as("Response code is %s", metricsResponse.code()).isTrue(); - assertThat(metricsResponse.header("Content-Encoding")).isNull(); - - Response homeResponse = call(url, "Accept-Encoding", "gzip, deflate"); - assertThat(homeResponse.isSuccessful()).as("Response code is %s", metricsResponse.code()).isTrue(); - assertThat(homeResponse.header("Content-Encoding")).isEqualToIgnoringCase("gzip"); - } - - /** - * SONAR-3962 - */ - // TODO should be moved elsewhere - @Test - public void not_fail_with_url_ending_by_jsp() { - orchestrator.executeBuild(SonarScanner.create(ItUtils.projectDir("shared/xoo-sample")) - .setProperty("sonar.projectKey", "myproject.jsp")); - // Access dashboard - runSelenese(orchestrator, "/serverSystem/ServerSystemTest/url_ending_by_jsp.html"); - } - - /** - * SONAR-5197 - */ - // TODO should be moved elsewhere - @Test - public void api_ws_shortcut() throws Exception { - Response response = call(orchestrator.getServer().getUrl() + "/api"); - assertThat(response.isSuccessful()).as("Response code is %s", response.code()).isTrue(); - String json = IOUtils.toString(response.body().byteStream()); - Map jsonAsMap = (Map) JSONValue.parse(json); - assertThat(jsonAsMap.get("webServices")).isNotNull(); - } - - private String getValidIpAddress() throws IOException { - WsClient adminWsClient = newAdminWsClient(orchestrator); - ShowWsResponse response = ShowWsResponse.parseFrom(adminWsClient.wsConnector().call( - new GetRequest("api/server_id/show").setMediaType(MediaTypes.PROTOBUF)).contentStream()); - assertThat(response.getValidIpAddressesCount()).isGreaterThan(0); - return response.getValidIpAddresses(0); - } - -} diff --git a/it/it-tests/src/test/java/it/settings/DeprecatedPropertiesWsTest.java b/it/it-tests/src/test/java/it/settings/DeprecatedPropertiesWsTest.java deleted file mode 100644 index f98eef7565c..00000000000 --- a/it/it-tests/src/test/java/it/settings/DeprecatedPropertiesWsTest.java +++ /dev/null @@ -1,417 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.settings; - -import com.google.common.base.Throwables; -import com.google.gson.Gson; -import com.sonar.orchestrator.Orchestrator; -import it.Category1Suite; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.TimeUnit; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import okhttp3.Credentials; -import okhttp3.FormBody; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.WsResponse; -import org.sonarqube.ws.client.setting.SetRequest; -import org.sonarqube.ws.client.setting.SettingsService; -import util.user.UserRule; - -import static java.net.URLEncoder.encode; -import static java.util.Arrays.asList; -import static org.assertj.core.api.Java6Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.newUserWsClient; -import static util.ItUtils.newWsClient; -import static util.ItUtils.resetSettings; -import static util.ItUtils.runProjectAnalysis; - -public class DeprecatedPropertiesWsTest { - - private final static String PROJECT_KEY = "com.sonarsource.it.samples:multi-modules-sample"; - private static final String MODULE_KEY = "com.sonarsource.it.samples:multi-modules-sample:module_a"; - private static final String SUB_MODULE_KEY = "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1"; - - private static final String PROJECT_SETTING_KEY = "sonar.dbcleaner.hoursBeforeKeepingOnlyOneSnapshotByDay"; - - private static String USER_LOGIN = "john"; - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @ClassRule - public static UserRule userRule = UserRule.from(orchestrator); - - static WsClient adminWsClient; - static WsClient userWsClient; - static WsClient anonymousWsClient; - - static SettingsService adminSettingsService; - - @BeforeClass - public static void init() throws Exception { - orchestrator.resetData(); - userRule.createUser(USER_LOGIN, "password"); - adminWsClient = newAdminWsClient(orchestrator); - userWsClient = newUserWsClient(orchestrator, USER_LOGIN, "password"); - anonymousWsClient = newWsClient(orchestrator); - adminSettingsService = newAdminWsClient(orchestrator).settings(); - runProjectAnalysis(orchestrator, "shared/xoo-multi-modules-sample"); - } - - @AfterClass - public static void resetAfterClass() throws Exception { - doResetSettings(); - userRule.deactivateUsers(USER_LOGIN); - } - - @Before - public void resetBefore() throws Exception { - doResetSettings(); - } - - private static void doResetSettings() { - resetSettings(orchestrator, null, "some-property", "custom-property", "int", "multi", "boolean", "hidden", "not_defined", "setting.secured", "setting.license.secured", "list", - "undefined"); - resetSettings(orchestrator, PROJECT_KEY, PROJECT_SETTING_KEY, "sonar.coverage.exclusions", "project.setting"); - } - - @Test - public void get_default_global_value() throws Exception { - assertThat(getProperty("some-property", null).getValue()).isEqualTo("aDefaultValue"); - } - - @Test - public void get_global_value() throws Exception { - setProperty("some-property", "value", null); - - assertThat(getProperty("some-property", null).getValue()).isEqualTo("value"); - } - - @Test - public void get_multi_values() throws Exception { - setProperty("multi", asList("value1", "value2", "value,3"), null); - - Properties.Property setting = getProperty("multi", null); - assertThat(setting.getValue()).isEqualTo("value1,value2,value%2C3"); - assertThat(setting.getValues()).containsOnly("value1", "value2", "value,3"); - } - - @Test - public void get_hidden_setting() throws Exception { - setProperty("hidden", "value", null); - - assertThat(getProperty("hidden", null).getValue()).isEqualTo("value"); - } - - @Test - public void get_secured_setting() throws Exception { - setProperty("setting.secured", "value", null); - - assertThat(getProperty("setting.secured", null).getValue()).isEqualTo("value"); - } - - @Test - public void get_license_setting() throws Exception { - setProperty("setting.license.secured", "value", null); - - assertThat(getProperty("setting.license.secured", null).getValue()).isEqualTo("value"); - } - - @Test - public void get_not_defined_setting() throws Exception { - setProperty("not_defined", "value", null); - - assertThat(getProperty("not_defined", null).getValue()).isEqualTo("value"); - } - - @Test - public void secured_setting_not_returned_to_not_admin() throws Exception { - setProperty("setting.secured", "value", null); - - // Admin can see the secured setting - assertThat(getProperties(null)).extracting(Properties.Property::getKey).contains("setting.secured"); - - // Not admin cannot see the secured setting - assertThat(getProperties(userWsClient, null)).extracting(Properties.Property::getKey).doesNotContain("setting.secured"); - assertThat(getProperties(anonymousWsClient, null)).extracting(Properties.Property::getKey).doesNotContain("setting.secured"); - } - - @Test - public void license_setting_not_returned_to_not_logged() throws Exception { - setProperty("setting.license.secured", "value", null); - - // Admin and user can see the license setting - assertThat(getProperties(null)).extracting(Properties.Property::getKey).contains("setting.license.secured"); - assertThat(getProperties(userWsClient, null)).extracting(Properties.Property::getKey).contains("setting.license.secured"); - - // Anonymous cannot see the license setting - assertThat(getProperties(anonymousWsClient, null)).extracting(Properties.Property::getKey).doesNotContain("setting.license.secured"); - } - - @Test - public void get_all_global_settings() throws Exception { - List<Properties.Property> properties = getProperties(null); - assertThat(properties).isNotEmpty(); - assertThat(properties).extracting("key") - .contains("sonar.core.id", "some-property", "boolean") - .doesNotContain("hidden"); - } - - @Test - public void get_default_component_value() throws Exception { - // Check default value is returned - assertThat(getProperty(PROJECT_SETTING_KEY, PROJECT_KEY).getValue()).isEqualTo("24"); - assertThat(getProperty(PROJECT_SETTING_KEY, MODULE_KEY).getValue()).isEqualTo("24"); - assertThat(getProperty(PROJECT_SETTING_KEY, SUB_MODULE_KEY).getValue()).isEqualTo("24"); - } - - @Test - public void get_global_component_value() throws Exception { - // Check global value is returned - setProperty(PROJECT_SETTING_KEY, "30", null); - assertThat(getProperty(PROJECT_SETTING_KEY, PROJECT_KEY).getValue()).isEqualTo("30"); - assertThat(getProperty(PROJECT_SETTING_KEY, MODULE_KEY).getValue()).isEqualTo("30"); - assertThat(getProperty(PROJECT_SETTING_KEY, SUB_MODULE_KEY).getValue()).isEqualTo("30"); - } - - @Test - public void get_component_value() throws Exception { - setProperty("sonar.coverage.exclusions", asList("file"), PROJECT_KEY); - - assertThat(getProperty("sonar.coverage.exclusions", PROJECT_KEY).getValue()).isEqualTo("file"); - } - - @Test - public void get_global_value_when_component_is_unknown() throws Exception { - setProperty("some-property", "value", null); - - assertThat(getProperty("some-property", PROJECT_KEY).getValue()).isEqualTo("value"); - } - - @Test - public void get_all_component_settings() throws Exception { - List<Properties.Property> properties = getProperties(PROJECT_KEY); - assertThat(properties).isNotEmpty(); - assertThat(properties).extracting("key") - .contains("sonar.dbcleaner.cleanDirectory", "sonar.dbcleaner.weeksBeforeDeletingAllSnapshots") - .doesNotContain("hidden"); - } - - @Test - public void get_global_value_using_id_parameter() throws Exception { - setProperty("some-property", "value", null); - - assertThat(getProperty(adminWsClient, "some-property", null, true).getValue()).isEqualTo("value"); - } - - @Test - public void put_property() throws Exception { - putProperty("some-property", "some-value", null, false); - - assertThat(getProperty("some-property", null).getValue()).isEqualTo("some-value"); - } - - @Test - public void put_property_using_id_parameter() throws Exception { - putProperty("some-property", "some-value", null, true); - - assertThat(getProperty("some-property", null).getValue()).isEqualTo("some-value"); - } - - @Test - public void put_property_on_project() throws Exception { - putProperty("project.setting", "some-value", PROJECT_KEY, false); - - assertThat(getProperty("project.setting", PROJECT_KEY).getValue()).isEqualTo("some-value"); - } - - @Test - public void put_property_for_undefined_setting() throws Exception { - putProperty("undefined", "some-value", null, false); - - assertThat(getProperty("undefined", null).getValue()).isEqualTo("some-value"); - } - - @Test - public void put_property_multi_values() throws Exception { - putProperty("multi", "value1,value2,value3", null, false); - - Properties.Property setting = getProperty("multi", null); - assertThat(setting.getValue()).isEqualTo("value1,value2,value3"); - assertThat(setting.getValues()).containsOnly("value1", "value2", "value3"); - } - - @Test - public void fail_with_error_400_when_put_property_without_id() throws Exception { - Response response = putProperty("", "some-value", null, false); - assertThat(response.code()).isEqualTo(400); - } - - @Test - public void delete_property() throws Exception { - setProperty("custom-property", "value", null); - - deleteProperty("custom-property", null, false); - - assertThat(getProperty("custom-property", null)).isNull(); - } - - @Test - public void delete_property_using_id_parameter() throws Exception { - setProperty("custom-property", "value", null); - - deleteProperty("custom-property", null, true); - - assertThat(getProperty("custom-property", null)).isNull(); - } - - @Test - public void delete_property_on_project() throws Exception { - setProperty("project.setting", "value", PROJECT_KEY); - - deleteProperty("project.setting", PROJECT_KEY, false); - - assertThat(getProperty("project.setting", PROJECT_KEY)).isNull(); - } - - private static void setProperty(String key, String value, @Nullable String componentKey) { - adminSettingsService.set(SetRequest.builder().setKey(key).setValue(value).setComponent(componentKey).build()); - } - - private static void setProperty(String key, List<String> values, @Nullable String componentKey) { - adminSettingsService.set(SetRequest.builder().setKey(key).setValues(values).setComponent(componentKey).build()); - } - - private static List<Properties.Property> getProperties(@Nullable String componentKey) { - return getProperties(adminWsClient, componentKey); - } - - private static List<Properties.Property> getProperties(WsClient wsClient, @Nullable String componentKey) { - WsResponse response = wsClient.wsConnector() - .call(new GetRequest("api/properties") - .setParam("resource", componentKey)) - .failIfNotSuccessful(); - return asList(Properties.parse(response.content())); - } - - private static Properties.Property getProperty(String key, @Nullable String componentKey) throws UnsupportedEncodingException { - return getProperty(adminWsClient, key, componentKey, false); - } - - @CheckForNull - private static Properties.Property getProperty(WsClient wsClient, String key, @Nullable String componentKey, boolean useIdParameter) throws UnsupportedEncodingException { - GetRequest getRequest = useIdParameter ? new GetRequest("api/properties").setParam("id", encode(key, "UTF-8")).setParam("resource", componentKey) - : new GetRequest("api/properties/" + encode(key, "UTF-8")).setParam("resource", componentKey); - WsResponse response = wsClient.wsConnector() - .call(getRequest) - .failIfNotSuccessful(); - Properties.Property[] properties = Properties.parse(response.content()); - return Arrays.stream(properties).findFirst().orElseGet(() -> null); - } - - private static Response putProperty(String key, String value, @Nullable String componentKey, boolean useIdParameter) throws UnsupportedEncodingException { - String url = useIdParameter ? orchestrator.getServer().getUrl() + "/api/properties?id=" + encode(key, "UTF-8") + "&value=" + value - : orchestrator.getServer().getUrl() + "/api/properties/" + encode(key, "UTF-8") + "?value=" + value; - url += componentKey != null ? "&resource=" + componentKey : ""; - return call(new Request.Builder() - .put(new FormBody.Builder().build()) - .url(url)); - } - - private static Response deleteProperty(String key, @Nullable String componentKey, boolean useIdParameter) throws UnsupportedEncodingException { - String url = useIdParameter ? orchestrator.getServer().getUrl() + "/api/properties?id=" + encode(key, "UTF-8") - : orchestrator.getServer().getUrl() + "/api/properties/" + encode(key, "UTF-8"); - url += componentKey != null ? "?resource=" + componentKey : ""; - return call(new Request.Builder() - .delete(new FormBody.Builder().build()) - .url(url)); - } - - private static Response call(Request.Builder requestBuilder) { - try { - requestBuilder.header("Authorization", Credentials.basic("admin", "admin")); - return new OkHttpClient.Builder() - .connectTimeout(30, TimeUnit.SECONDS) - .readTimeout(30, TimeUnit.SECONDS) - .build() - .newCall(requestBuilder.build()) - .execute(); - } catch (IOException e) { - throw Throwables.propagate(e); - } - } - - public static class Properties { - - private List<Property> properties; - - private Properties(List<Property> properties) { - this.properties = properties; - } - - public List<Property> getProperties() { - return properties; - } - - public static Property[] parse(String json) { - Gson gson = new Gson(); - return gson.fromJson(json, Property[].class); - } - - public static class Property { - private final String key; - private final String value; - private final String[] values; - - private Property(String key, String value, String[] values) { - this.key = key; - this.value = value; - this.values = values; - } - - public String getKey() { - return key; - } - - public String getValue() { - return value; - } - - public String[] getValues() { - return values; - } - } - } - -} diff --git a/it/it-tests/src/test/java/it/settings/EmailsTest.java b/it/it-tests/src/test/java/it/settings/EmailsTest.java deleted file mode 100644 index 9d2924ed133..00000000000 --- a/it/it-tests/src/test/java/it/settings/EmailsTest.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.settings; - -import com.sonar.orchestrator.Orchestrator; -import it.Category1Suite; -import java.util.Iterator; -import javax.annotation.Nullable; -import javax.mail.internet.MimeMessage; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.Settings; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.setting.SettingsService; -import org.sonarqube.ws.client.setting.ValuesRequest; -import org.subethamail.wiser.Wiser; -import org.subethamail.wiser.WiserMessage; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.groups.Tuple.tuple; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.resetEmailSettings; -import static util.ItUtils.setServerProperty; - -public class EmailsTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - static Wiser SMTP_SERVER; - static WsClient ADMIN_WS_CLIENT; - static SettingsService SETTINGS; - - @BeforeClass - public static void before() throws Exception { - ADMIN_WS_CLIENT = newAdminWsClient(orchestrator); - SETTINGS = ADMIN_WS_CLIENT.settings(); - - SMTP_SERVER = new Wiser(0); - SMTP_SERVER.start(); - System.out.println("SMTP Server port: " + SMTP_SERVER.getServer().getPort()); - } - - @AfterClass - public static void stop() { - if (SMTP_SERVER != null) { - SMTP_SERVER.stop(); - } - resetEmailSettings(orchestrator); - } - - @Before - public void prepare() { - orchestrator.resetData(); - SMTP_SERVER.getMessages().clear(); - resetEmailSettings(orchestrator); - } - - @Test - public void update_email_settings() throws Exception { - updateEmailSettings("localhost", "42", "noreply@email.com", "[EMAIL]", "ssl", "john", "123456"); - - Settings.ValuesWsResponse response = SETTINGS.values(ValuesRequest.builder() - .setKeys("email.smtp_host.secured", "email.smtp_port.secured", "email.smtp_secure_connection.secured", "email.smtp_username.secured", "email.smtp_password.secured", - "email.from", "email.prefix") - .build()); - - assertThat(response.getSettingsList()).extracting(Settings.Setting::getKey, Settings.Setting::getValue) - .containsOnly( - tuple("email.smtp_host.secured", "localhost"), - tuple("email.smtp_port.secured", "42"), - tuple("email.smtp_secure_connection.secured", "ssl"), - tuple("email.smtp_username.secured", "john"), - tuple("email.smtp_password.secured", "123456"), - tuple("email.from", "noreply@email.com"), - tuple("email.prefix", "[EMAIL]")); - } - - @Test - public void send_test_email() throws Exception { - updateEmailSettings("localhost", Integer.toString(SMTP_SERVER.getServer().getPort()), null, null, null, null, null); - - sendEmail("test@example.org", "Test Message from SonarQube", "This is a test message from SonarQube"); - - // We need to wait until all notifications will be delivered - waitUntilAllNotificationsAreDelivered(); - Iterator<WiserMessage> emails = SMTP_SERVER.getMessages().iterator(); - MimeMessage message = emails.next().getMimeMessage(); - assertThat(message.getHeader("To", null)).isEqualTo("<test@example.org>"); - assertThat(message.getSubject()).contains("Test Message from SonarQube"); - assertThat((String) message.getContent()).contains("This is a test message from SonarQube"); - assertThat(emails.hasNext()).isFalse(); - } - - private static void waitUntilAllNotificationsAreDelivered() throws InterruptedException { - Thread.sleep(10000); - } - - private static void updateEmailSettings(@Nullable String host, @Nullable String port, @Nullable String from, @Nullable String prefix, @Nullable String secure, - @Nullable String username, @Nullable String password) { - setServerProperty(orchestrator, "email.smtp_host.secured", host); - setServerProperty(orchestrator, "email.smtp_port.secured", port); - setServerProperty(orchestrator, "email.smtp_secure_connection.secured", secure); - setServerProperty(orchestrator, "email.smtp_username.secured", username); - setServerProperty(orchestrator, "email.smtp_password.secured", password); - setServerProperty(orchestrator, "email.from", from); - setServerProperty(orchestrator, "email.prefix", prefix); - } - - private static void sendEmail(String to, String subject, String message) { - ADMIN_WS_CLIENT.wsConnector().call( - new PostRequest("/api/emails/send") - .setParam("to", to) - .setParam("subject", subject) - .setParam("message", message)) - .failIfNotSuccessful(); - } - -} diff --git a/it/it-tests/src/test/java/it/settings/LicensesPageTest.java b/it/it-tests/src/test/java/it/settings/LicensesPageTest.java deleted file mode 100644 index 36c51a9c8bc..00000000000 --- a/it/it-tests/src/test/java/it/settings/LicensesPageTest.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.settings; - -import com.sonar.orchestrator.Orchestrator; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.ws.Settings.ValuesWsResponse; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.setting.ValuesRequest; -import pageobjects.Navigation; -import pageobjects.licenses.LicenseItem; -import pageobjects.licenses.LicensesPage; -import util.user.UserRule; - -import static com.codeborne.selenide.Condition.text; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.pluginArtifact; - -public class LicensesPageTest { - private static Orchestrator orchestrator; - private static WsClient wsClient; - - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - private String adminUser; - - @BeforeClass - public static void start() { - orchestrator = Orchestrator.builderEnv() - .addPlugin(pluginArtifact("license-plugin")) - .build(); - orchestrator.start(); - - wsClient = newAdminWsClient(orchestrator); - } - - @AfterClass - public static void stop() { - if (orchestrator != null) { - orchestrator.stop(); - } - } - - @Before - public void before() { - adminUser = userRule.createAdminUser(); - } - - @Test - public void display_licenses() { - LicensesPage page = Navigation.create(orchestrator).logIn().submitCredentials(adminUser).openLicenses(); - - page.getLicenses().shouldHaveSize(2); - page.getLicensesAsItems().get(0).getName().shouldHave(text("Typed property")); - page.getLicensesAsItems().get(1).getName().shouldHave(text("Property without license type")); - } - - @Test - public void change_licenses() { - String EXAMPLE_LICENSE = "TmFtZTogRGV2ZWxvcHBlcnMKUGx1Z2luOiBhdXRvY29udHJvbApFeHBpcmVzOiAyMDEyLTA0LTAxCktleTogNjI5N2MxMzEwYzg2NDZiZTE5MDU1MWE4ZmZmYzk1OTBmYzEyYTIyMgo="; - - LicensesPage page = Navigation.create(orchestrator).logIn().submitCredentials(adminUser).openLicenses(); - LicenseItem licenseItem = page.getLicenseByKey("typed.license.secured"); - licenseItem.setLicense(EXAMPLE_LICENSE); - - ValuesWsResponse response = wsClient.settings() - .values(ValuesRequest.builder().setKeys("typed.license.secured").build()); - assertThat(response.getSettings(0).getValue()).isEqualTo(EXAMPLE_LICENSE); - } -} diff --git a/it/it-tests/src/test/java/it/settings/PropertySetsTest.java b/it/it-tests/src/test/java/it/settings/PropertySetsTest.java deleted file mode 100644 index d2be7424966..00000000000 --- a/it/it-tests/src/test/java/it/settings/PropertySetsTest.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.settings; - -import com.sonar.orchestrator.Orchestrator; -import it.Category1Suite; -import java.io.UnsupportedEncodingException; -import java.util.List; -import java.util.Map; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.ws.Settings; -import org.sonarqube.ws.client.setting.SetRequest; -import org.sonarqube.ws.client.setting.SettingsService; -import org.sonarqube.ws.client.setting.ValuesRequest; -import pageobjects.Navigation; -import pageobjects.settings.SettingsPage; -import util.user.UserRule; - -import static com.google.common.collect.Lists.newArrayList; -import static java.util.Arrays.asList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.entry; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.resetSettings; - -public class PropertySetsTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - private Navigation nav = Navigation.create(orchestrator); - - static SettingsService SETTINGS; - private String adminUser; - - @BeforeClass - public static void initSettingsService() throws Exception { - SETTINGS = newAdminWsClient(orchestrator).settings(); - } - - @Before - public void before() { - adminUser = userRule.createAdminUser(); - } - - @After - public void reset_settings() throws Exception { - resetSettings(orchestrator, null, "sonar.demo", "sonar.autogenerated", "sonar.test.jira.servers"); - } - - @Test - public void support_property_sets() throws UnsupportedEncodingException { - SettingsPage page = nav.logIn().submitCredentials(adminUser).openSettings(null).openCategory("DEV") - .assertSettingDisplayed("sonar.test.jira.servers"); - - page.getPropertySetInput("sonar.test.jira.servers") - .setFieldValue("key", "jira1") - .setFieldValue("url", "http://jira") - .setFieldValue("port", "12345") - .save(); - - assertPropertySet("sonar.test.jira.servers", asList( - entry("key", "jira1"), - entry("url", "http://jira"), - entry("port", "12345"))); - } - - @Test - public void support_property_sets_with_auto_generated_keys() throws UnsupportedEncodingException { - SettingsPage page = nav.logIn().submitCredentials(adminUser).openSettings(null).openCategory("DEV") - .assertSettingDisplayed("sonar.autogenerated"); - - page.getPropertySetInput("sonar.autogenerated") - .setFieldValue(0, "value", "FIRST") - .setFieldValue(1, "value", "SECOND") - .setFieldValue(2, "value", "THIRD") - .save(); - - assertPropertySet("sonar.autogenerated", - asList(entry("value", "FIRST")), - asList(entry("value", "SECOND")), - asList(entry("value", "THIRD"))); - } - - @Test - public void edit_property_set() { - SETTINGS.set(SetRequest.builder() - .setKey("sonar.test.jira.servers") - .setFieldValues(newArrayList( - "{\"key\":\"jira1\", \"url\":\"http://jira1\", \"port\":\"12345\"}", - "{\"key\":\"jira2\", \"url\":\"http://jira2\", \"port\":\"54321\"}")) - .build()); - - assertPropertySet("sonar.test.jira.servers", - asList(entry("key", "jira1"), entry("url", "http://jira1"), entry("port", "12345")), - asList(entry("key", "jira2"), entry("url", "http://jira2"), entry("port", "54321"))); - } - - @Test - public void delete_property_set() throws Exception { - SETTINGS.set(SetRequest.builder() - .setKey("sonar.test.jira.servers") - .setFieldValues(newArrayList("{\"url\":\"http://jira1\"}", "{\"port\":\"12345\"}")) - .build()); - - resetSettings(orchestrator, null, "sonar.test.jira.servers"); - - assertThat(SETTINGS.values(ValuesRequest.builder().setKeys("sonar.test.jira.servers").build()).getSettingsList()).isEmpty(); - } - - private void assertPropertySet(String baseSettingKey, List<Map.Entry<String, String>>... fieldsValues) { - Settings.Setting setting = getSetting(baseSettingKey); - assertThat(setting.getFieldValues().getFieldValuesList()).hasSize(fieldsValues.length); - int index = 0; - for (Settings.FieldValues.Value fieldValue : setting.getFieldValues().getFieldValuesList()) { - assertThat(fieldValue.getValue()).containsOnly(fieldsValues[index].toArray(new Map.Entry[] {})); - index++; - } - } - - private Settings.Setting getSetting(String key) { - Settings.ValuesWsResponse response = SETTINGS.values(ValuesRequest.builder().setKeys(key).build()); - List<Settings.Setting> settings = response.getSettingsList(); - assertThat(settings).hasSize(1); - return settings.get(0); - } - -} diff --git a/it/it-tests/src/test/java/it/settings/SettingsTest.java b/it/it-tests/src/test/java/it/settings/SettingsTest.java deleted file mode 100644 index 06c948ef824..00000000000 --- a/it/it-tests/src/test/java/it/settings/SettingsTest.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.settings; - -import com.google.common.collect.ImmutableMap; -import com.sonar.orchestrator.Orchestrator; -import it.Category1Suite; -import java.io.IOException; -import java.util.List; -import javax.annotation.CheckForNull; -import org.apache.commons.io.FileUtils; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.Settings; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.permission.AddGroupWsRequest; -import org.sonarqube.ws.client.permission.AddUserWsRequest; -import org.sonarqube.ws.client.permission.RemoveGroupWsRequest; -import org.sonarqube.ws.client.setting.ResetRequest; -import org.sonarqube.ws.client.setting.SetRequest; -import org.sonarqube.ws.client.setting.SettingsService; -import org.sonarqube.ws.client.setting.ValuesRequest; -import util.user.UserRule; - -import static java.util.Arrays.asList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.tuple; -import static org.sonarqube.ws.Settings.Setting; -import static org.sonarqube.ws.Settings.ValuesWsResponse; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.newUserWsClient; -import static util.ItUtils.newWsClient; -import static util.ItUtils.resetSettings; - -public class SettingsTest { - - /** - * This setting is defined by server-plugin - */ - private final static String PLUGIN_SETTING_KEY = "some-property"; - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @ClassRule - public static UserRule userRule = UserRule.from(orchestrator); - - private static WsClient adminWsClient; - private static SettingsService anonymousSettingsService; - private static SettingsService userSettingsService; - private static SettingsService scanSettingsService; - private static SettingsService adminSettingsService; - - @BeforeClass - public static void initSettingsService() throws Exception { - userRule.createUser("setting-user", "setting-user"); - userRule.createUser("scanner-user", "scanner-user"); - adminWsClient = newAdminWsClient(orchestrator); - // Remove 'Execute Analysis' permission from anyone - adminWsClient.permissions().removeGroup(new RemoveGroupWsRequest().setGroupName("anyone").setPermission("scan")); - - // Anonymous user, without 'Execute Analysis' permission - anonymousSettingsService = newWsClient(orchestrator).settings(); - - // Authenticated user, without 'Execute Analysis' permission - userSettingsService = newUserWsClient(orchestrator, "setting-user", "setting-user").settings(); - - // User with 'Execute Analysis' permission - adminWsClient.permissions().addUser(new AddUserWsRequest().setLogin("scanner-user").setPermission("scan")); - scanSettingsService = newUserWsClient(orchestrator, "scanner-user", "scanner-user").settings(); - - // User with 'Administer System' permission but without 'Execute Analysis' permission - adminSettingsService = adminWsClient.settings(); - } - - @AfterClass - public static void tearDown() throws Exception { - userRule.deactivateUsers("setting-user", "scanner-user"); - // Restore 'Execute Analysis' permission to anyone - adminWsClient.permissions().addGroup(new AddGroupWsRequest().setGroupName("anyone").setPermission("scan")); - } - - @After - public void reset_settings() throws Exception { - resetSettings(orchestrator, null, PLUGIN_SETTING_KEY, "globalPropertyChange.received", "hidden", "setting.secured", "setting.license.secured"); - } - - /** - * SONAR-3320 - */ - @Test - public void global_property_change_extension_point() throws IOException { - adminSettingsService.set(SetRequest.builder().setKey("globalPropertyChange.received").setValue("NEWVALUE").build()); - assertThat(FileUtils.readFileToString(orchestrator.getServer().getWebLogs())) - .contains("Received change: [key=globalPropertyChange.received, newValue=NEWVALUE]"); - } - - @Test - public void get_default_value() { - Setting setting = getSetting(PLUGIN_SETTING_KEY, anonymousSettingsService); - assertThat(setting.getValue()).isEqualTo("aDefaultValue"); - assertThat(setting.getInherited()).isTrue(); - } - - @Test - public void set_setting() { - adminSettingsService.set(SetRequest.builder().setKey(PLUGIN_SETTING_KEY).setValue("some value").build()); - - String value = getSetting(PLUGIN_SETTING_KEY, anonymousSettingsService).getValue(); - assertThat(value).isEqualTo("some value"); - } - - @Test - public void remove_setting() { - adminSettingsService.set(SetRequest.builder().setKey(PLUGIN_SETTING_KEY).setValue("some value").build()); - adminSettingsService.set(SetRequest.builder().setKey("sonar.links.ci").setValue("http://localhost").build()); - - adminSettingsService.reset(ResetRequest.builder().setKeys(PLUGIN_SETTING_KEY, "sonar.links.ci").build()); - assertThat(getSetting(PLUGIN_SETTING_KEY, anonymousSettingsService).getValue()).isEqualTo("aDefaultValue"); - assertThat(getSetting("sonar.links.ci", anonymousSettingsService)).isNull(); - } - - @Test - public void hidden_setting() { - adminSettingsService.set(SetRequest.builder().setKey("hidden").setValue("test").build()); - assertThat(getSetting("hidden", anonymousSettingsService).getValue()).isEqualTo("test"); - } - - @Test - public void secured_setting() { - adminSettingsService.set(SetRequest.builder().setKey("setting.secured").setValue("test").build()); - assertThat(getSetting("setting.secured", anonymousSettingsService)).isNull(); -// assertThat(getSetting("setting.secured", userSettingsService)).isNull(); - assertThat(getSetting("setting.secured", scanSettingsService).getValue()).isEqualTo("test"); - assertThat(getSetting("setting.secured", adminSettingsService).getValue()).isEqualTo("test"); - } - - @Test - public void license_setting() { - adminSettingsService.set(SetRequest.builder().setKey("setting.license.secured").setValue("test").build()); - assertThat(getSetting("setting.license.secured", anonymousSettingsService)).isNull(); - assertThat(getSetting("setting.license.secured", userSettingsService).getValue()).isEqualTo("test"); - assertThat(getSetting("setting.license.secured", scanSettingsService).getValue()).isEqualTo("test"); - assertThat(getSetting("setting.license.secured", adminSettingsService).getValue()).isEqualTo("test"); - } - - @Test - public void multi_values_setting() throws Exception { - adminSettingsService.set(SetRequest.builder().setKey("multi").setValues(asList("value1", "value2", "value3")).build()); - assertThat(getSetting("multi", anonymousSettingsService).getValues().getValuesList()).containsOnly("value1", "value2", "value3"); - } - - @Test - public void property_set_setting() throws Exception { - adminSettingsService.set(SetRequest.builder().setKey("sonar.jira").setFieldValues(asList( - "{\"key\":\"jira1\", \"url\":\"http://jira1\", \"port\":\"12345\", \"type\":\"A\"}", - "{\"key\":\"jira2\", \"url\":\"http://jira2\", \"port\":\"54321\"}")) - .build()); - - assertThat(getSetting("sonar.jira", anonymousSettingsService).getFieldValues().getFieldValuesList()).extracting(Settings.FieldValues.Value::getValue).containsOnly( - ImmutableMap.of("key", "jira1", "url", "http://jira1", "port", "12345", "type", "A"), - ImmutableMap.of("key", "jira2", "url", "http://jira2", "port", "54321")); - } - - @Test - public void return_defined_settings_when_no_key_provided() throws Exception { - adminSettingsService.set(SetRequest.builder().setKey(PLUGIN_SETTING_KEY).setValue("some value").build()); - adminSettingsService.set(SetRequest.builder().setKey("hidden").setValue("test").build()); - - assertThat(adminSettingsService.values(ValuesRequest.builder().build()).getSettingsList()) - .extracting(Setting::getKey) - .contains(PLUGIN_SETTING_KEY, "hidden", "sonar.forceAuthentication", - // Settings for scanner - "sonar.core.startTime"); - - assertThat(adminSettingsService.values(ValuesRequest.builder().build()).getSettingsList()) - .extracting(Setting::getKey, Setting::getValue) - .contains(tuple(PLUGIN_SETTING_KEY, "some value"), tuple("hidden", "test")); - } - - @CheckForNull - private static Setting getSetting(String key, SettingsService settingsService) { - ValuesWsResponse response = settingsService.values(ValuesRequest.builder().setKeys(key).build()); - List<Settings.Setting> settings = response.getSettingsList(); - return settings.isEmpty() ? null : settings.get(0); - } - -} diff --git a/it/it-tests/src/test/java/it/settings/SettingsTestRestartingOrchestrator.java b/it/it-tests/src/test/java/it/settings/SettingsTestRestartingOrchestrator.java deleted file mode 100644 index aafdf91bac9..00000000000 --- a/it/it-tests/src/test/java/it/settings/SettingsTestRestartingOrchestrator.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.settings; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import java.io.UnsupportedEncodingException; -import java.net.URL; -import org.junit.After; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import pageobjects.EncryptionPage; -import pageobjects.Navigation; -import util.user.UserRule; - -import static com.codeborne.selenide.Condition.visible; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.pluginArtifact; -import static util.ItUtils.projectDir; -import static util.ItUtils.xooPlugin; - -/** - * This class start a new orchestrator on each test case - */ -public class SettingsTestRestartingOrchestrator { - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - private Orchestrator orchestrator; - - private UserRule userRule; - - @After - public void stop() { - if (orchestrator != null) { - userRule.resetUsers(); - orchestrator.stop(); - } - } - - @Test - public void test_settings() throws UnsupportedEncodingException { - URL secretKeyUrl = getClass().getResource("/settings/SettingsTest/sonar-secret.txt"); - orchestrator = Orchestrator.builderEnv() - .addPlugin(pluginArtifact("settings-plugin")) - .addPlugin(pluginArtifact("license-plugin")) - .setServerProperty("sonar.secretKeyPath", secretKeyUrl.getFile()) - .build(); - startOrchestrator(); - - String adminUser = userRule.createAdminUser(); - Navigation nav = Navigation.create(orchestrator).openHome().logIn().submitCredentials(adminUser); - - nav.openSettings(null) - .assertMenuContains("General") - .assertSettingDisplayed("sonar.dbcleaner.cleanDirectory") - .assertSettingNotDisplayed("settings.extension.hidden") - .assertSettingNotDisplayed("settings.extension.global"); - - EncryptionPage encryptionPage = nav.openEncryption(); - assertThat(encryptionPage.encryptValue("clear")).isEqualTo("{aes}4aQbfYe1lrEjiRzv/ETbyg=="); - encryptionPage.generateNewKey(); - encryptionPage.generationForm().shouldBe(visible).submit(); - encryptionPage.generationForm().shouldNotBe(visible); - encryptionPage.newSecretKey().shouldBe(visible); - } - - @Test - public void property_relocation() throws UnsupportedEncodingException { - orchestrator = Orchestrator.builderEnv() - .addPlugin(pluginArtifact("property-relocation-plugin")) - .addPlugin(xooPlugin()) - .setServerProperty("sonar.deprecatedKey", "true") - .build(); - startOrchestrator(); - - SonarScanner withDeprecatedKey = SonarScanner.create(projectDir("shared/xoo-sample")) - .setProperty("sonar.deprecatedKey", "true"); - SonarScanner withNewKey = SonarScanner.create(projectDir("shared/xoo-sample")) - .setProperty("sonar.newKey", "true"); - // should not fail - orchestrator.executeBuilds(withDeprecatedKey, withNewKey); - - String adminUser = userRule.createAdminUser(); - Navigation.create(orchestrator).openHome().logIn().submitCredentials(adminUser).openSettings(null) - .assertMenuContains("General") - .assertSettingDisplayed("sonar.newKey") - .assertSettingNotDisplayed("sonar.deprecatedKey"); - } - - private void startOrchestrator() { - orchestrator.start(); - userRule = UserRule.from(orchestrator); - } - -} diff --git a/it/it-tests/src/test/java/it/sourceCode/EncodingTest.java b/it/it-tests/src/test/java/it/sourceCode/EncodingTest.java deleted file mode 100644 index 90fa0c45cf7..00000000000 --- a/it/it-tests/src/test/java/it/sourceCode/EncodingTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.sourceCode; - -import com.sonar.orchestrator.Orchestrator; -import it.Category1Suite; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; - -import static util.ItUtils.runProjectAnalysis; -import static util.selenium.Selenese.runSelenese; - -public class EncodingTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Before - public void deleteData() { - orchestrator.resetData(); - } - - @Test - public void support_japanese_charset() { - runProjectAnalysis(orchestrator, "sourceCode/japanese-charset", "sonar.sourceEncoding", "Shift_JIS"); - - runSelenese(orchestrator, "/sourceCode/EncodingTest/japanese_sources.html"); - } -} diff --git a/it/it-tests/src/test/java/it/sourceCode/HighlightingTest.java b/it/it-tests/src/test/java/it/sourceCode/HighlightingTest.java deleted file mode 100644 index 842782de649..00000000000 --- a/it/it-tests/src/test/java/it/sourceCode/HighlightingTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.sourceCode; - -import com.sonar.orchestrator.Orchestrator; -import it.Category1Suite; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; - -import static util.ItUtils.runProjectAnalysis; -import static util.selenium.Selenese.runSelenese; - -public class HighlightingTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Before - public void deleteData() { - orchestrator.resetData(); - } - - @Test - public void highlight_source_code_and_symbols_usage() throws Exception { - runProjectAnalysis(orchestrator, "highlighting/xoo-sample-with-highlighting-v2"); - - runSelenese(orchestrator, - // SONAR-3893 & SONAR-4247 - "/sourceCode/HighlightingTest/syntax-highlighting.html", - // SONAR-4249 & SONAR-4250 - "/sourceCode/HighlightingTest/symbol-usages-highlighting.html"); - } - - // Check that E/S index is updated when file content is unchanged but plugin generates different syntax/symbol highlighting - @Test - public void update_highlighting_even_when_code_unchanged() throws Exception { - runProjectAnalysis(orchestrator, "highlighting/xoo-sample-with-highlighting-v1"); - - runSelenese(orchestrator, "/sourceCode/HighlightingTest/syntax-highlighting-v1.html"); - - runProjectAnalysis(orchestrator, "highlighting/xoo-sample-with-highlighting-v2"); - - runSelenese(orchestrator, - "/sourceCode/HighlightingTest/syntax-highlighting-v2.html", - "/sourceCode/HighlightingTest/symbol-usages-highlighting.html"); - } -} diff --git a/it/it-tests/src/test/java/it/sourceCode/ProjectCodeTest.java b/it/it-tests/src/test/java/it/sourceCode/ProjectCodeTest.java deleted file mode 100644 index 3306824c417..00000000000 --- a/it/it-tests/src/test/java/it/sourceCode/ProjectCodeTest.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.sourceCode; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category1Suite; -import org.junit.ClassRule; -import org.junit.Test; - -import static util.ItUtils.projectDir; -import static util.selenium.Selenese.runSelenese; - -public class ProjectCodeTest { - - @ClassRule - public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - - @Test - public void test_project_code_page() throws Exception { - executeBuild("shared/xoo-sample", "project-for-code", "Project For Code"); - - runSelenese(orchestrator, - "/sourceCode/ProjectCodeTest/test_project_code_page.html", - "/sourceCode/ProjectCodeTest/search.html", - "/sourceCode/ProjectCodeTest/permalink.html"); - } - - @Test - public void code_page_should_expand_root_dir() throws Exception { - executeBuild("shared/xoo-sample-with-root-dir", "project-for-code-root-dir", "Project For Code"); - - runSelenese(orchestrator, "/sourceCode/ProjectCodeTest/code_page_should_expand_root_dir.html"); - } - - private void executeBuild(String projectLocation, String projectKey, String projectName) { - orchestrator.executeBuild( - SonarScanner.create(projectDir(projectLocation)) - .setProjectKey(projectKey) - .setProjectName(projectName) - ); - } - -} diff --git a/it/it-tests/src/test/java/it/test/CoverageTest.java b/it/it-tests/src/test/java/it/test/CoverageTest.java deleted file mode 100644 index 1dac8a4661a..00000000000 --- a/it/it-tests/src/test/java/it/test/CoverageTest.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.test; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category2Suite; -import java.io.File; -import java.util.Map; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.io.filefilter.TrueFileFilter; -import org.apache.commons.lang.StringUtils; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.skyscreamer.jsonassert.JSONAssert; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; -import static util.ItUtils.projectDir; - -public class CoverageTest { - - @ClassRule - public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR; - - private static final String[] ALL_COVERAGE_METRICS = new String[] { - "line_coverage", "lines_to_cover", "uncovered_lines", "branch_coverage", "conditions_to_cover", "uncovered_conditions", "coverage", - "it_line_coverage", "it_lines_to_cover", "it_uncovered_lines", "it_branch_coverage", "it_conditions_to_cover", "it_uncovered_conditions", "it_coverage", - "overall_line_coverage", "overall_lines_to_cover", "overall_uncovered_lines", "overall_branch_coverage", "overall_conditions_to_cover", "overall_uncovered_conditions", - "overall_coverage" - }; - - @Before - public void delete_data() { - orchestrator.resetData(); - } - - @Test - public void coverage() throws Exception { - orchestrator.executeBuilds(SonarScanner.create(projectDir("testing/xoo-sample-ut-coverage"))); - - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(orchestrator, "sample-ut-coverage", ALL_COVERAGE_METRICS); - assertThat(measures.get("line_coverage")).isEqualTo(50.0); - assertThat(measures.get("lines_to_cover")).isEqualTo(4d); - assertThat(measures.get("uncovered_lines")).isEqualTo(2d); - assertThat(measures.get("branch_coverage")).isEqualTo(50.0); - assertThat(measures.get("conditions_to_cover")).isEqualTo(2d); - assertThat(measures.get("uncovered_conditions")).isEqualTo(1d); - assertThat(measures.get("coverage")).isEqualTo(50.0); - - assertThat(measures.get("it_coverage")).isNull(); - - assertThat(measures.get("overall_coverage")).isNull(); - - String coverage = cleanupScmAndDuplication(orchestrator.getServer().adminWsClient().get("api/sources/lines", "key", "sample-ut-coverage:src/main/xoo/sample/Sample.xoo")); - // Use strict checking to be sure IT coverage is not present - JSONAssert.assertEquals(IOUtils.toString(this.getClass().getResourceAsStream("/test/CoverageTest/unit_test_coverage-expected.json"), "UTF-8"), coverage, true); - - verifyComputeEngineTempDirIsEmpty(); - } - - private String cleanupScmAndDuplication(String coverage) { - coverage = StringUtils.remove(coverage, ",\"scmAuthor\":\"\""); - coverage = StringUtils.remove(coverage, ",\"scmRevision\":\"\""); - coverage = StringUtils.remove(coverage, ",\"duplicated\":false"); - return coverage; - } - - @Test - public void coverage_no_condition() throws Exception { - orchestrator.executeBuilds(SonarScanner.create(projectDir("testing/xoo-sample-ut-coverage-no-condition"))); - - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(orchestrator, "sample-ut-coverage", ALL_COVERAGE_METRICS); - assertThat(measures.get("line_coverage")).isEqualTo(50.0); - assertThat(measures.get("lines_to_cover")).isEqualTo(4d); - assertThat(measures.get("uncovered_lines")).isEqualTo(2d); - assertThat(measures.get("branch_coverage")).isNull(); - assertThat(measures.get("conditions_to_cover")).isNull(); - assertThat(measures.get("uncovered_conditions")).isNull(); - assertThat(measures.get("coverage")).isEqualTo(50.0); - - assertThat(measures.get("it_coverage")).isNull(); - - assertThat(measures.get("overall_coverage")).isNull(); - - String coverage = cleanupScmAndDuplication(orchestrator.getServer().adminWsClient().get("api/sources/lines", "key", "sample-ut-coverage:src/main/xoo/sample/Sample.xoo")); - // Use strict checking to be sure IT coverage is not present - JSONAssert.assertEquals(IOUtils.toString(this.getClass().getResourceAsStream("/test/CoverageTest/unit_test_coverage_no_condition-expected.json"), "UTF-8"), coverage, - true); - - verifyComputeEngineTempDirIsEmpty(); - } - - @Test - public void it_coverage_imported_as_coverage() throws Exception { - orchestrator.executeBuilds(SonarScanner.create(projectDir("testing/xoo-sample-it-coverage"))); - - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(orchestrator, "sample-it-coverage", ALL_COVERAGE_METRICS); - - // Since SQ 6.2 all coverage reports are merged as coverage - - assertThat(measures.get("line_coverage")).isEqualTo(50.0); - assertThat(measures.get("lines_to_cover")).isEqualTo(4d); - assertThat(measures.get("uncovered_lines")).isEqualTo(2d); - assertThat(measures.get("branch_coverage")).isEqualTo(50.0); - assertThat(measures.get("conditions_to_cover")).isEqualTo(2d); - assertThat(measures.get("uncovered_conditions")).isEqualTo(1d); - assertThat(measures.get("coverage")).isEqualTo(50.0); - - assertThat(measures.get("it_coverage")).isNull(); - - assertThat(measures.get("overall_coverage")).isNull(); - - String coverage = cleanupScmAndDuplication(orchestrator.getServer().adminWsClient().get("api/sources/lines", "key", "sample-it-coverage:src/main/xoo/sample/Sample.xoo")); - // Use strict checking to be sure UT coverage is not present - JSONAssert.assertEquals(IOUtils.toString(this.getClass().getResourceAsStream("/test/CoverageTest/it_coverage-expected.json"), "UTF-8"), coverage, true); - - verifyComputeEngineTempDirIsEmpty(); - } - - @Test - public void ut_and_it_coverage_merged_in_coverage() throws Exception { - orchestrator.executeBuilds(SonarScanner.create(projectDir("testing/xoo-sample-overall-coverage"))); - - // Since SQ 6.2 all coverage reports are merged as coverage - - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(orchestrator, "sample-overall-coverage", ALL_COVERAGE_METRICS); - assertThat(measures.get("line_coverage")).isEqualTo(75.0); - assertThat(measures.get("lines_to_cover")).isEqualTo(4); - assertThat(measures.get("uncovered_lines")).isEqualTo(1); - assertThat(measures.get("branch_coverage")).isEqualTo(50.0); - assertThat(measures.get("conditions_to_cover")).isEqualTo(4); - assertThat(measures.get("uncovered_conditions")).isEqualTo(2); - assertThat(measures.get("coverage")).isEqualTo(62.5); - - assertThat(measures.get("it_coverage")).isNull(); - - assertThat(measures.get("overall_coverage")).isNull(); - - String coverage = cleanupScmAndDuplication(orchestrator.getServer().adminWsClient().get("api/sources/lines", "key", "sample-overall-coverage:src/main/xoo/sample/Sample.xoo")); - // Use strict checking to be sure no extra coverage is present - JSONAssert.assertEquals(IOUtils.toString(this.getClass().getResourceAsStream("/test/CoverageTest/ut_and_it_coverage-expected.json"), "UTF-8"), coverage, true); - - verifyComputeEngineTempDirIsEmpty(); - } - - /** - * SONAR-766 - */ - @Test - public void should_compute_coverage_on_project() { - orchestrator.executeBuilds(SonarScanner.create(projectDir("testing/xoo-half-covered"))); - - assertThat(getMeasuresAsDoubleByMetricKey(orchestrator, "xoo-half-covered", ALL_COVERAGE_METRICS).get("coverage")).isEqualTo(50.0); - - verifyComputeEngineTempDirIsEmpty(); - } - - /** - * SONAR-766 - */ - @Test - public void should_ignore_coverage_on_full_path() { - orchestrator.executeBuilds(SonarScanner.create(projectDir("testing/xoo-half-covered")) - .setProperty("sonar.coverage.exclusions", "src/main/xoo/org/sonar/tests/halfcovered/UnCovered.xoo")); - - assertThat(getMeasuresAsDoubleByMetricKey(orchestrator, "xoo-half-covered", ALL_COVERAGE_METRICS).get("coverage")).isEqualTo(100.0); - - verifyComputeEngineTempDirIsEmpty(); - } - - /** - * SONAR-766 - */ - @Test - public void should_ignore_coverage_on_pattern() { - orchestrator.executeBuilds(SonarScanner.create(projectDir("testing/xoo-half-covered")) - .setProperty("sonar.coverage.exclusions", "**/UnCovered*")); - - assertThat(getMeasuresAsDoubleByMetricKey(orchestrator, "xoo-half-covered", ALL_COVERAGE_METRICS).get("coverage")).isEqualTo(100.0); - - verifyComputeEngineTempDirIsEmpty(); - } - - /** - * SONAR-766 - */ - @Test - public void should_not_have_coverage_at_all() { - orchestrator.executeBuilds(SonarScanner.create(projectDir("testing/xoo-half-covered")) - .setProperty("sonar.coverage.exclusions", "**/*")); - - assertThat(getMeasuresAsDoubleByMetricKey(orchestrator, "xoo-half-covered", ALL_COVERAGE_METRICS).get("coverage")).isNull(); - - verifyComputeEngineTempDirIsEmpty(); - } - - private void verifyComputeEngineTempDirIsEmpty() { - File ceTempDirectory = new File(new File(orchestrator.getServer().getHome(), "temp"), "ce"); - assertThat(FileUtils.listFiles(ceTempDirectory, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE)).isEmpty(); - } - -} diff --git a/it/it-tests/src/test/java/it/test/CoverageTrackingTest.java b/it/it-tests/src/test/java/it/test/CoverageTrackingTest.java deleted file mode 100644 index f21cb852582..00000000000 --- a/it/it-tests/src/test/java/it/test/CoverageTrackingTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.test; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category2Suite; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.apache.commons.io.IOUtils; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.skyscreamer.jsonassert.JSONAssert; - -import static util.ItUtils.projectDir; - -public class CoverageTrackingTest { - - @ClassRule - public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR; - - @Before - public void delete_data() { - orchestrator.resetData(); - } - - @Test - public void test_coverage_per_test() throws Exception { - orchestrator.executeBuilds(SonarScanner.create(projectDir("testing/xoo-sample-with-coverage-per-test"))); - - String tests = orchestrator.getServer().adminWsClient().get("api/tests/list", "testFileKey", "sample-with-tests:src/test/xoo/sample/SampleTest.xoo"); - JSONAssert.assertEquals(IOUtils.toString(this.getClass().getResourceAsStream("/test/CoverageTrackingTest/tests-expected.json"), "UTF-8"), tests, false); - - String covered_files = orchestrator.getServer().adminWsClient() - .get("api/tests/covered_files", "testId", extractSuccessfulTestId(tests)); - JSONAssert - .assertEquals(IOUtils.toString(this.getClass().getResourceAsStream("/test/CoverageTrackingTest/covered_files-expected.json"), "UTF-8"), covered_files, false); - } - - private String extractSuccessfulTestId(String json) { - Matcher jsonObjectMatcher = Pattern.compile(".*\\{((.*?)success(.*?))\\}.*", Pattern.MULTILINE).matcher(json); - jsonObjectMatcher.find(); - - Matcher idMatcher = Pattern.compile(".*\"id\"\\s*?:\\s*?\"(\\S*?)\".*", Pattern.MULTILINE).matcher(jsonObjectMatcher.group(1)); - return idMatcher.find() ? idMatcher.group(1) : ""; - } -} diff --git a/it/it-tests/src/test/java/it/test/NewCoverageTest.java b/it/it-tests/src/test/java/it/test/NewCoverageTest.java deleted file mode 100644 index 827e2b3927f..00000000000 --- a/it/it-tests/src/test/java/it/test/NewCoverageTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.test; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category2Suite; -import java.util.Map; -import org.assertj.core.data.Offset; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.WsMeasures; - -import static java.lang.Double.parseDouble; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasuresWithVariationsByMetricKey; -import static util.ItUtils.projectDir; - -public class NewCoverageTest { - - @ClassRule - public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR; - - private static final String PROJECT_KEY = "sample-new-coverage"; - - private static final Offset<Double> DEFAULT_OFFSET = Offset.offset(0.1d); - - private static final String[] ALL_NEW_COVERAGE_METRICS = new String[] { - "new_coverage", "new_line_coverage", "new_branch_coverage" - }; - - @BeforeClass - public static void analyze_project() { - orchestrator.resetData(); - - orchestrator.executeBuilds(SonarScanner.create(projectDir("testing/xoo-sample-new-coverage-v1")) - .setProperty("sonar.projectDate", "2015-02-01") - .setProperty("sonar.scm.disabled", "false")); - orchestrator.executeBuilds(SonarScanner.create(projectDir("testing/xoo-sample-new-coverage-v2")) - .setProperty("sonar.scm.disabled", "false")); - } - - @Test - public void new_coverage() throws Exception { - Map<String, WsMeasures.Measure> measures = getMeasuresWithVariationsByMetricKey(orchestrator, PROJECT_KEY, ALL_NEW_COVERAGE_METRICS); - assertThat(parseDouble(measures.get("new_coverage").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(66.6d, DEFAULT_OFFSET); - assertThat(parseDouble(measures.get("new_line_coverage").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(100d, DEFAULT_OFFSET); - assertThat(parseDouble(measures.get("new_branch_coverage").getPeriods().getPeriodsValue(0).getValue())).isEqualTo(42.8, DEFAULT_OFFSET); - } - -} diff --git a/it/it-tests/src/test/java/it/test/TestExecutionTest.java b/it/it-tests/src/test/java/it/test/TestExecutionTest.java deleted file mode 100644 index ec2e3a387d6..00000000000 --- a/it/it-tests/src/test/java/it/test/TestExecutionTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.test; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category2Suite; -import java.util.Map; -import org.apache.commons.io.IOUtils; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.skyscreamer.jsonassert.JSONAssert; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.getMeasuresAsDoubleByMetricKey; -import static util.ItUtils.projectDir; - -public class TestExecutionTest { - - @ClassRule - public static Orchestrator orchestrator = Category2Suite.ORCHESTRATOR; - - @Before - public void delete_data() { - orchestrator.resetData(); - } - - @Test - public void test_execution_details() throws Exception { - orchestrator.executeBuilds(SonarScanner.create(projectDir("testing/xoo-sample-with-tests-execution-details"))); - - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(orchestrator, "sample-with-tests", - "test_success_density", "test_failures", "test_errors", "tests", "skipped_tests", "test_execution_time"); - assertThat(measures.get("test_success_density")).isEqualTo(33.3); - assertThat(measures.get("test_failures")).isEqualTo(1); - assertThat(measures.get("test_errors")).isEqualTo(1); - assertThat(measures.get("tests")).isEqualTo(3); - assertThat(measures.get("skipped_tests")).isEqualTo(1); - assertThat(measures.get("test_execution_time")).isEqualTo(8); - - String json = orchestrator.getServer().adminWsClient().get("api/tests/list", "testFileKey", "sample-with-tests:src/test/xoo/sample/SampleTest.xoo"); - JSONAssert.assertEquals(IOUtils.toString(this.getClass().getResourceAsStream("/test/TestExecutionTest/expected.json"), "UTF-8"), json, false); - } - - @Test - public void test_execution_measures() throws Exception { - orchestrator.executeBuilds(SonarScanner.create(projectDir("testing/xoo-sample-with-tests-execution-measures"))); - - Map<String, Double> measures = getMeasuresAsDoubleByMetricKey(orchestrator, "sample-with-tests", - "test_success_density", "test_failures", "test_errors", "tests", "skipped_tests", "test_execution_time"); - assertThat(measures.get("test_success_density")).isEqualTo(33.3); - assertThat(measures.get("test_failures")).isEqualTo(1); - assertThat(measures.get("test_errors")).isEqualTo(1); - assertThat(measures.get("tests")).isEqualTo(3); - assertThat(measures.get("skipped_tests")).isEqualTo(1); - assertThat(measures.get("test_execution_time")).isEqualTo(8); - } -} diff --git a/it/it-tests/src/test/java/it/ui/SourceViewerTest.java b/it/it-tests/src/test/java/it/ui/SourceViewerTest.java deleted file mode 100644 index 70f02288fff..00000000000 --- a/it/it-tests/src/test/java/it/ui/SourceViewerTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.ui; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import pageobjects.Navigation; - -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Selenide.$; -import static util.ItUtils.projectDir; - -public class SourceViewerTest { - - @ClassRule - public static final Orchestrator ORCHESTRATOR = Category4Suite.ORCHESTRATOR; - - private Navigation nav = Navigation.create(ORCHESTRATOR); - - @BeforeClass - public static void beforeClass() { - ORCHESTRATOR.resetData(); - analyzeSampleProject(); - } - - @Test - public void line_permalink() { - nav.open("/component?id=sample%3Asrc%2Fmain%2Fxoo%2Fsample%2FSample.xoo&line=6"); - $(".source-line").should(exist); - $(".source-line-highlighted[data-line-number=\"6\"]").should(exist); - } - - private static void analyzeSampleProject() { - ORCHESTRATOR.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - } -} diff --git a/it/it-tests/src/test/java/it/ui/UiTest.java b/it/it-tests/src/test/java/it/ui/UiTest.java deleted file mode 100644 index c345140c517..00000000000 --- a/it/it-tests/src/test/java/it/ui/UiTest.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.ui; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import java.util.Map; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsResponse; -import pageobjects.Navigation; -import util.ItUtils; - -import static com.codeborne.selenide.Condition.hasText; -import static com.codeborne.selenide.Condition.text; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.WebDriverRunner.url; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.projectDir; -import static util.ItUtils.resetSettings; -import static util.ItUtils.setServerProperty; - -public class UiTest { - - @ClassRule - public static final Orchestrator ORCHESTRATOR = Category4Suite.ORCHESTRATOR; - - private Navigation nav = Navigation.create(ORCHESTRATOR); - - @Before - @After - public void resetData() throws Exception { - resetSettings(ORCHESTRATOR, null, "sonar.forceAuthentication"); - } - - @Test - public void footer_contains_information() { - nav.getFooter() - .should(hasText("Documentation")) - .should(hasText("SonarSource SA")); - } - - @Test - public void footer_contains_version() { - WsResponse status = ItUtils.newAdminWsClient(ORCHESTRATOR).wsConnector().call(new GetRequest("api/navigation/global")); - Map<String, Object> statusMap = ItUtils.jsonToMap(status.content()); - - nav.getFooter().should(hasText((String) statusMap.get("version"))); - } - - @Test - public void footer_doesnt_contains_version_on_login_page() { - WsResponse status = ItUtils.newAdminWsClient(ORCHESTRATOR).wsConnector().call(new GetRequest("api/navigation/global")); - Map<String, Object> statusMap = ItUtils.jsonToMap(status.content()); - - nav.openLogin(); - nav.getFooter().shouldNot(hasText((String) statusMap.get("version"))); - } - - @Test - public void footer_doesnt_contains_about_when_not_logged_in() { - setServerProperty(ORCHESTRATOR, "sonar.forceAuthentication", "true"); - nav.openLogin(); - nav.getFooter() - .shouldNot(hasText("About")) - .shouldNot(hasText("Web API")); - } - - @Test - public void many_page_transitions() { - analyzeSampleProject(); - - nav.open("/about"); - - // on about page - $(".about-page-projects-link") - .shouldBe(visible) - .shouldHave(text("1")) - .click(); - - // on projects page - assertThat(url()).contains("/projects"); - $(".project-card-name") - .shouldBe(visible) - .shouldHave(text("Sample")) - .find("a") - .click(); - - // on project dashboard - assertThat(url()).contains("/dashboard?id=sample"); - $(".overview-quality-gate") - .shouldBe(visible) - .shouldHave(text("Passed")); - $("a[href=\"/project/issues?id=sample&resolved=false&types=CODE_SMELL\"]") - .shouldBe(visible) - .shouldHave(text("0")) - .click(); - - // on project issues page - assertThat(url()).contains("/project/issues?id=sample&resolved=false&types=CODE_SMELL"); - $("[data-property=\"resolutions\"] .facet.active").shouldBe(visible); - - $("#global-navigation").find("a[href=\"/profiles\"]").click(); - - // on quality profiles page - assertThat(url()).contains("/profiles"); - $("table[data-language=xoo]").find("tr[data-name=Basic]").find(".quality-profiles-table-name") - .shouldBe(visible) - .shouldHave(text("Basic")) - .find("a") - .click(); - - // on profile page - assertThat(url()).contains("/profiles/show"); - $(".quality-profile-inheritance") - .shouldBe(visible) - .shouldHave(text("active rules")); - } - - @Test - public void markdown_help() { - String tags[] = {"strong", "a", "ul", "ol", "h1", "code", "pre", "blockquote"}; - - nav.open("/markdown/help"); - for (String tag : tags) { - $(tag).shouldBe(visible); - } - } - - private static void analyzeSampleProject() { - ORCHESTRATOR.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - } -} diff --git a/it/it-tests/src/test/java/it/uiExtension/OrganizationUiExtensionsTest.java b/it/it-tests/src/test/java/it/uiExtension/OrganizationUiExtensionsTest.java deleted file mode 100644 index 0dad2a29535..00000000000 --- a/it/it-tests/src/test/java/it/uiExtension/OrganizationUiExtensionsTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.uiExtension; - -import com.codeborne.selenide.Condition; -import com.sonar.orchestrator.Orchestrator; -import it.Category6Suite; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.openqa.selenium.By; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.Organizations.Organization; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; - -import static com.codeborne.selenide.Condition.text; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.WebDriverRunner.url; -import static org.assertj.core.api.Assertions.assertThat; - -public class OrganizationUiExtensionsTest { - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator); - - @Test - public void organization_page() { - Organization organization = tester.organizations().generate(); - tester.openBrowser().open("/organizations/" + organization.getKey() + "/projects"); - - $("#organization-navigation-more").click(); - $(By.linkText("Organization Page")).shouldBe(Condition.visible).click(); - - assertThat(url()).contains("uiextensionsplugin/organization_page"); - $("body").shouldHave(text("uiextensionsplugin/organization_page")); - } - - @Test - public void organization_admin_page() { - Organization organization = tester.organizations().generate(); - User administrator = tester.users().generateAdministrator(organization); - tester.openBrowser() - .logIn().submitCredentials(administrator.getLogin()) - .open("/organizations/" + organization.getKey() + "/projects"); - - $("#context-navigation a.navbar-admin-link").click(); - $(By.linkText("Organization Admin Page")).shouldBe(Condition.visible).click(); - - assertThat(url()).contains("uiextensionsplugin/organization_admin_page"); - $("body").shouldHave(text("uiextensionsplugin/organization_admin_page")); - } -} diff --git a/it/it-tests/src/test/java/it/uiExtension/UiExtensionsTest.java b/it/it-tests/src/test/java/it/uiExtension/UiExtensionsTest.java deleted file mode 100644 index bd85a932725..00000000000 --- a/it/it-tests/src/test/java/it/uiExtension/UiExtensionsTest.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.uiExtension; - -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.openqa.selenium.By; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.WsProjects; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import org.sonarqube.ws.client.project.CreateRequest; -import util.ItUtils; - -import static com.codeborne.selenide.Condition.text; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.WebDriverRunner.url; -import static org.assertj.core.api.Assertions.assertThat; - -public class UiExtensionsTest { - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator).disableOrganizations(); - - @Test - public void test_static_files() { - tester.runHtmlTests("/uiExtension/UiExtensionsTest/static-files.html"); - } - - @Test - public void test_global_page() { - tester.openBrowser().open("/about"); - - // on about page - $("#global-navigation-more").click(); - $(By.linkText("Global Page")).click(); - - assertThat(url()).contains("/uiextensionsplugin/global_page"); - $("body").shouldHave(text("uiextensionsplugin/global_page")); - } - - @Test - public void test_global_administration_page() { - User administrator = tester.users().generateAdministrator(); - tester.openBrowser() - .logIn().submitCredentials(administrator.getLogin()) - .open("/about"); - - $(".navbar-admin-link").click(); - $("#settings-navigation-configuration").click(); - $(By.linkText("Global Admin Page")).click(); - - assertThat(url()).contains("uiextensionsplugin/global_admin_page"); - $("body").shouldHave(text("uiextensionsplugin/global_admin_page")); - } - - @Test - public void test_project_page() { - WsProjects.CreateWsResponse.Project project = createSampleProject(); - - tester.openBrowser().open("/dashboard?id=" + project.getKey()); - - $("#component-navigation-more").click(); - $(By.linkText("Project Page")).click(); - - assertThat(url()).contains("uiextensionsplugin/project_page"); - $("body").shouldHave(text("uiextensionsplugin/project_page")); - } - - @Test - public void test_project_administration_page() { - WsProjects.CreateWsResponse.Project project = createSampleProject(); - User administrator = tester.users().generateAdministrator(); - - tester.openBrowser() - .logIn().submitCredentials(administrator.getLogin()) - .open("/dashboard?id=" + project.getKey()); - - $("#component-navigation-admin").click(); - $(By.linkText("Project Admin Page")).click(); - - assertThat(url()).contains("uiextensionsplugin/project_admin_page"); - $("body").shouldHave(text("uiextensionsplugin/project_admin_page")); - } - - private WsProjects.CreateWsResponse.Project createSampleProject() { - String projectKey = ItUtils.newProjectKey(); - return tester.wsClient().projects().create(CreateRequest.builder() - .setKey(projectKey) - .setName("Name of " + projectKey) - .build()).getProject(); - } -} diff --git a/it/it-tests/src/test/java/it/updateCenter/UpdateCenterTest.java b/it/it-tests/src/test/java/it/updateCenter/UpdateCenterTest.java deleted file mode 100644 index f815034495f..00000000000 --- a/it/it-tests/src/test/java/it/updateCenter/UpdateCenterTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.updateCenter; - -import com.sonar.orchestrator.Orchestrator; -import org.junit.After; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import util.user.UserRule; - -import static util.ItUtils.pluginArtifact; -import static util.selenium.Selenese.runSelenese; - -/** - * This class start its own orchestrator - */ -public class UpdateCenterTest { - - @ClassRule - public static final Orchestrator orchestrator = Orchestrator.builderEnv() - .setServerProperty("sonar.updatecenter.url", UpdateCenterTest.class.getResource("/updateCenter/UpdateCenterTest/update-center.properties").toString()) - .addPlugin(pluginArtifact("sonar-fake-plugin")) - .build(); - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - @After - public void tearDown() throws Exception { - userRule.resetUsers(); - } - - @Test - public void test_console() { - runSelenese(orchestrator, "/updateCenter/installed-plugins.html"); - } - -} diff --git a/it/it-tests/src/test/java/it/user/BaseIdentityProviderTest.java b/it/it-tests/src/test/java/it/user/BaseIdentityProviderTest.java deleted file mode 100644 index 391b2d892e5..00000000000 --- a/it/it-tests/src/test/java/it/user/BaseIdentityProviderTest.java +++ /dev/null @@ -1,324 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.user; - -import com.google.common.base.Joiner; -import com.google.common.base.Optional; -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import java.io.File; -import org.apache.commons.io.FileUtils; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.user.CreateRequest; -import pageobjects.Navigation; -import util.user.UserRule; -import util.user.Users; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.guava.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.resetSettings; -import static util.ItUtils.setServerProperty; -import static util.selenium.Selenese.runSelenese; - -/** - * TODO : Add missing ITs - * - display multiple identity provider plugins (probably in another class) - */ -public class BaseIdentityProviderTest { - - @ClassRule - public static Orchestrator ORCHESTRATOR = Category4Suite.ORCHESTRATOR; - - @ClassRule - public static UserRule userRule = UserRule.from(ORCHESTRATOR); - - static String FAKE_PROVIDER_KEY = "fake-base-id-provider"; - - static String USER_LOGIN = "john"; - static String USER_PROVIDER_ID = "fake-john"; - static String USER_NAME = "John"; - static String USER_EMAIL = "john@email.com"; - - static String USER_NAME_UPDATED = "John Doe"; - static String USER_EMAIL_UPDATED = "john.doe@email.com"; - - static String GROUP1 = "group1"; - static String GROUP2 = "group2"; - static String GROUP3 = "group3"; - - static WsClient adminWsClient; - - @BeforeClass - public static void setUp() { - ORCHESTRATOR.resetData(); - adminWsClient = newAdminWsClient(ORCHESTRATOR); - } - - @Before - @After - public void resetData() throws Exception { - userRule.resetUsers(); - userRule.removeGroups(GROUP1, GROUP2, GROUP3); - resetSettings(ORCHESTRATOR, null, - "sonar.auth.fake-base-id-provider.enabled", - "sonar.auth.fake-base-id-provider.user", - "sonar.auth.fake-base-id-provider.throwUnauthorizedMessage", - "sonar.auth.fake-base-id-provider.enabledGroupsSync", - "sonar.auth.fake-base-id-provider.groups", - "sonar.auth.fake-base-id-provider.allowsUsersToSignUp"); - } - - @Test - public void create_new_user_when_authenticate() throws Exception { - enablePlugin(); - setUserCreatedByAuthPlugin(USER_LOGIN, USER_PROVIDER_ID, USER_NAME, USER_EMAIL); - - userRule.verifyUserDoesNotExist(USER_LOGIN); - - // First connection, user is created - authenticateWithFakeAuthProvider(); - - userRule.verifyUserExists(USER_LOGIN, USER_NAME, USER_EMAIL, false); - } - - @Test - public void authenticate_user_through_ui() throws Exception { - enablePlugin(); - setUserCreatedByAuthPlugin(USER_LOGIN, USER_PROVIDER_ID, USER_NAME, USER_EMAIL); - - Navigation.create(ORCHESTRATOR).openLogin().useOAuth2().shouldBeLoggedIn(); - - userRule.verifyUserExists(USER_LOGIN, USER_NAME, USER_EMAIL); - } - - @Test - public void display_unauthorized_page_when_authentication_failed() throws Exception { - enablePlugin(); - // As this property is null, the plugin will throw an exception - setServerProperty(ORCHESTRATOR, "sonar.auth.fake-base-id-provider.user", null); - - runSelenese(ORCHESTRATOR, "/user/BaseIdentityProviderTest/display_unauthorized_page_when_authentication_failed.html"); - - userRule.verifyUserDoesNotExist(USER_LOGIN); - } - - @Test - public void fail_when_email_already_exists() throws Exception { - enablePlugin(); - setUserCreatedByAuthPlugin(USER_LOGIN, USER_PROVIDER_ID, USER_NAME, USER_EMAIL); - userRule.createUser("another", "Another", USER_EMAIL, "another"); - - runSelenese(ORCHESTRATOR, "/user/BaseIdentityProviderTest/fail_when_email_already_exists.html"); - - File logFile = ORCHESTRATOR.getServer().getWebLogs(); - assertThat(FileUtils.readFileToString(logFile)) - .doesNotContain("You can't sign up because email 'john@email.com' is already used by an existing user. This means that you probably already registered with another account"); - } - - @Test - public void fail_to_authenticate_when_not_allowed_to_sign_up() throws Exception { - enablePlugin(); - setUserCreatedByAuthPlugin(USER_LOGIN, USER_PROVIDER_ID, USER_NAME, USER_EMAIL); - setServerProperty(ORCHESTRATOR, "sonar.auth.fake-base-id-provider.allowsUsersToSignUp", "false"); - - runSelenese(ORCHESTRATOR, "/user/BaseIdentityProviderTest/fail_to_authenticate_when_not_allowed_to_sign_up.html"); - - userRule.verifyUserDoesNotExist(USER_LOGIN); - } - - @Test - public void update_existing_user_when_authenticate() throws Exception { - enablePlugin(); - setUserCreatedByAuthPlugin(USER_LOGIN, USER_PROVIDER_ID, USER_NAME, USER_EMAIL); - - // First connection, user is created - authenticateWithFakeAuthProvider(); - - setUserCreatedByAuthPlugin(USER_LOGIN, USER_PROVIDER_ID, USER_NAME_UPDATED, USER_EMAIL_UPDATED); - - // Second connection, user should be updated - authenticateWithFakeAuthProvider(); - - userRule.verifyUserExists(USER_LOGIN, USER_NAME_UPDATED, USER_EMAIL_UPDATED); - } - - @Test - public void reactivate_disabled_user() throws Exception { - enablePlugin(); - setUserCreatedByAuthPlugin(USER_LOGIN, USER_PROVIDER_ID, USER_NAME, USER_EMAIL); - - userRule.verifyUserDoesNotExist(USER_LOGIN); - - // First connection, user is created - authenticateWithFakeAuthProvider(); - - Optional<Users.User> user = userRule.getUserByLogin(USER_LOGIN); - assertThat(user).isPresent(); - - // Disable user - userRule.deactivateUsers(USER_LOGIN); - - // Second connection, user is reactivated - authenticateWithFakeAuthProvider(); - userRule.verifyUserExists(USER_LOGIN, USER_NAME, USER_EMAIL); - } - - @Test - public void not_authenticate_when_plugin_is_disabled() throws Exception { - setServerProperty(ORCHESTRATOR, "sonar.auth.fake-base-id-provider.enabled", "false"); - setUserCreatedByAuthPlugin(USER_LOGIN, USER_PROVIDER_ID, USER_NAME, USER_EMAIL); - - authenticateWithFakeAuthProvider(); - - // User is not created as nothing plugin is disabled - userRule.verifyUserDoesNotExist(USER_LOGIN); - - // TODO Add Selenium test to check login form - } - - @Test - public void display_message_in_ui_but_not_in_log_when_unauthorized_exception() throws Exception { - enablePlugin(); - setUserCreatedByAuthPlugin(USER_LOGIN, USER_PROVIDER_ID, USER_NAME, USER_EMAIL); - setServerProperty(ORCHESTRATOR, "sonar.auth.fake-base-id-provider.throwUnauthorizedMessage", "true"); - - runSelenese(ORCHESTRATOR, - "/user/BaseIdentityProviderTest/display_message_in_ui_but_not_in_log_when_unauthorized_exception.html"); - - File logFile = ORCHESTRATOR.getServer().getWebLogs(); - assertThat(FileUtils.readFileToString(logFile)).doesNotContain("A functional error has happened"); - assertThat(FileUtils.readFileToString(logFile)).doesNotContain("UnauthorizedException"); - - userRule.verifyUserDoesNotExist(USER_LOGIN); - } - - @Test - public void synchronize_groups_for_new_user() throws Exception { - enablePlugin(); - userRule.createGroup(GROUP1); - userRule.createGroup(GROUP2); - setUserCreatedByAuthPlugin(USER_LOGIN, USER_PROVIDER_ID, USER_NAME, USER_EMAIL); - // Group3 doesn't exist in DB, user won't belong to this group - setGroupsReturnedByAuthPlugin(GROUP1, GROUP2, GROUP3); - - authenticateWithFakeAuthProvider(); - - userRule.verifyUserGroupMembership(USER_LOGIN, GROUP1, GROUP2, "sonar-users"); - } - - @Test - public void synchronize_groups_for_existing_user() throws Exception { - enablePlugin(); - userRule.createGroup(GROUP1); - userRule.createGroup(GROUP2); - userRule.createGroup(GROUP3); - userRule.createUser(USER_LOGIN, "password"); - userRule.associateGroupsToUser(USER_LOGIN, GROUP1, GROUP2); - setUserCreatedByAuthPlugin(USER_LOGIN, USER_PROVIDER_ID, USER_NAME, USER_EMAIL); - // Group1 is not returned by the plugin, user won't belong anymore to this group - setGroupsReturnedByAuthPlugin(GROUP2, GROUP3); - - authenticateWithFakeAuthProvider(); - - userRule.verifyUserGroupMembership(USER_LOGIN, GROUP2, GROUP3, "sonar-users"); - } - - @Test - public void remove_user_groups_when_groups_provided_by_plugin_are_empty() throws Exception { - enablePlugin(); - userRule.createGroup(GROUP1); - userRule.createUser(USER_LOGIN, "password"); - userRule.associateGroupsToUser(USER_LOGIN, GROUP1); - setUserCreatedByAuthPlugin(USER_LOGIN, USER_PROVIDER_ID, USER_NAME, USER_EMAIL); - // No group is returned by the plugin - setGroupsReturnedByAuthPlugin(); - - authenticateWithFakeAuthProvider(); - - // User is not member to any group - userRule.verifyUserGroupMembership(USER_LOGIN, "sonar-users"); - } - - @Test - public void allow_user_login_with_2_characters() throws Exception { - enablePlugin(); - String login = "jo"; - setUserCreatedByAuthPlugin(login, USER_PROVIDER_ID, USER_NAME, USER_EMAIL); - userRule.verifyUserDoesNotExist(login); - - // First connection, user is created - authenticateWithFakeAuthProvider(); - - userRule.verifyUserExists(login, USER_NAME, USER_EMAIL, false); - } - - @Test - public void provision_user_before_authentication() { - enablePlugin(); - setUserCreatedByAuthPlugin(USER_LOGIN, USER_PROVIDER_ID, USER_NAME, USER_EMAIL); - - // Provision none local user in database - newAdminWsClient(ORCHESTRATOR).users().create(CreateRequest.builder() - .setLogin(USER_LOGIN) - .setName(USER_NAME) - .setEmail(USER_EMAIL) - .setLocal(false) - .build()); - assertThat(userRule.getUserByLogin(USER_LOGIN).get()) - .extracting(Users.User::isLocal, Users.User::getExternalIdentity, Users.User::getExternalProvider) - .containsOnly(false, USER_LOGIN, "sonarqube"); - - // Authenticate with external system -> It will update external provider info - authenticateWithFakeAuthProvider(); - - assertThat(userRule.getUserByLogin(USER_LOGIN).get()) - .extracting(Users.User::isLocal, Users.User::getExternalIdentity, Users.User::getExternalProvider) - .containsOnly(false, USER_PROVIDER_ID, FAKE_PROVIDER_KEY); - } - - private static void enablePlugin() { - setServerProperty(ORCHESTRATOR, "sonar.auth.fake-base-id-provider.enabled", "true"); - } - - private static void setUserCreatedByAuthPlugin(String login, String providerId, String name, String email) { - setServerProperty(ORCHESTRATOR, "sonar.auth.fake-base-id-provider.user", login + "," + providerId + "," + name + "," + email); - } - - private static void setGroupsReturnedByAuthPlugin(String... groups) { - setServerProperty(ORCHESTRATOR, "sonar.auth.fake-base-id-provider.enabledGroupsSync", "true"); - if (groups.length > 0) { - setServerProperty(ORCHESTRATOR, "sonar.auth.fake-base-id-provider.groups", Joiner.on(",").join(groups)); - } - } - - private static void authenticateWithFakeAuthProvider() { - adminWsClient.wsConnector().call( - new GetRequest("/sessions/init/" + FAKE_PROVIDER_KEY)) - .failIfNotSuccessful(); - } - -} diff --git a/it/it-tests/src/test/java/it/user/FavoritesWsTest.java b/it/it-tests/src/test/java/it/user/FavoritesWsTest.java deleted file mode 100644 index f161e53372d..00000000000 --- a/it/it-tests/src/test/java/it/user/FavoritesWsTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.user; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import java.util.List; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.Favorites.Favorite; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.favorite.SearchRequest; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.projectDir; - -/** - * TODO This test should not require an analysis, only provisioning the project should be enough - */ -public class FavoritesWsTest { - - @ClassRule - public static final Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - private static WsClient adminClient; - - @Before - public void inspectProject() { - orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); - adminClient = newAdminWsClient(orchestrator); - } - - @Test - public void favorites_web_service() { - // GET (nothing) - List<Favorite> favorites = adminClient.favorites().search(new SearchRequest()).getFavoritesList(); - assertThat(favorites).isEmpty(); - - // POST (create favorites) - adminClient.favorites().add("sample"); - adminClient.favorites().add("sample:src/main/xoo/sample/Sample.xoo"); - - // GET (created favorites) - favorites = adminClient.favorites().search(new SearchRequest()).getFavoritesList(); - assertThat(favorites.stream().map(Favorite::getKey)).containsOnly("sample", "sample:src/main/xoo/sample/Sample.xoo"); - - // DELETE (a favorite) - adminClient.favorites().remove("sample"); - favorites = adminClient.favorites().search(new SearchRequest()).getFavoritesList(); - assertThat(favorites.stream().map(Favorite::getKey)).containsOnly("sample:src/main/xoo/sample/Sample.xoo"); - } - -} diff --git a/it/it-tests/src/test/java/it/user/ForceAuthenticationTest.java b/it/it-tests/src/test/java/it/user/ForceAuthenticationTest.java deleted file mode 100644 index a67756b43f1..00000000000 --- a/it/it-tests/src/test/java/it/user/ForceAuthenticationTest.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.user; - -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.WsConnector; -import org.sonarqube.ws.client.WsRequest; -import org.sonarqube.ws.client.WsResponse; -import pageobjects.Navigation; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.sonarqube.ws.client.WsRequest.Method.GET; -import static org.sonarqube.ws.client.WsRequest.Method.POST; -import static util.ItUtils.resetSettings; -import static util.ItUtils.setServerProperty; - -public class ForceAuthenticationTest { - - @ClassRule - public static final Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator).disableOrganizations(); - private User user; - - @Before - public void setUp() { - setServerProperty(orchestrator, "sonar.forceAuthentication", "true"); - user = tester.users().generate(); - } - - @After - public void tearDown() { - resetSettings(orchestrator, null, "sonar.forceAuthentication"); - } - - @Test - public void batch_ws_does_not_require_authentication() { - WsConnector anonymousConnector = tester.asAnonymous().wsClient().wsConnector(); - WsResponse batchIndex = anonymousConnector.call(new GetRequest("/batch/index")).failIfNotSuccessful(); - String batchIndexContent = batchIndex.content(); - - assertThat(batchIndexContent).isNotEmpty(); - String jar = batchIndexContent.split("\\|")[0]; - - assertThat(anonymousConnector.call( - new GetRequest("/batch/file").setParam("name", jar)).failIfNotSuccessful().contentStream()).isNotNull(); - - // As sonar-runner is still using deprecated /batch/key, we have to also verify it - assertThat(anonymousConnector.call(new GetRequest("/batch/" + jar)).failIfNotSuccessful().contentStream()).isNotNull(); - } - - @Test - public void authentication_ws_does_not_require_authentication() { - WsConnector anonymousConnector = tester.asAnonymous().wsClient().wsConnector(); - assertThat(anonymousConnector.call(new PostRequest("/api/authentication/login") - .setParam("login", user.getLogin()) - .setParam("password", user.getLogin())).isSuccessful()).isTrue(); - verifyPathDoesNotRequiresAuthentication("/api/authentication/logout", POST); - } - - @Test - public void check_ws_not_requiring_authentication() { - verifyPathDoesNotRequiresAuthentication("/api/system/db_migration_status", GET); - verifyPathDoesNotRequiresAuthentication("/api/system/status", GET); - verifyPathDoesNotRequiresAuthentication("/api/system/migrate_db", POST); - verifyPathDoesNotRequiresAuthentication("/api/users/identity_providers", GET); - verifyPathDoesNotRequiresAuthentication("/api/l10n/index", GET); - } - - @Test - public void check_ws_requiring_authentication() { - verifyPathRequiresAuthentication("/api/issues/search", GET); - verifyPathRequiresAuthentication("/api/rules/search", GET); - } - - @Test - public void redirect_to_login_page() { - User administrator = tester.users().generateAdministrator(); - Navigation page = tester.openBrowser().openHome(); - page.shouldBeRedirectedToLogin(); - page.openLogin().submitCredentials(administrator.getLogin()).shouldBeLoggedIn(); - page.logOut().shouldBeRedirectedToLogin(); - } - - private void verifyPathRequiresAuthentication(String path, WsRequest.Method method) { - assertThat(call(tester.asAnonymous().wsClient(), path, method).code()).isEqualTo(401); - WsResponse wsResponse = call(tester.wsClient(), path, method); - assertThat(wsResponse.isSuccessful()).as("code is %s on path %s", wsResponse.code(), path).isTrue(); - } - - private void verifyPathDoesNotRequiresAuthentication(String path, WsRequest.Method method) { - WsResponse wsResponse = call(tester.asAnonymous().wsClient(), path, method); - assertThat(wsResponse.isSuccessful()).as("code is %s on path %s", wsResponse.code(), path).isTrue(); - wsResponse = call(tester.wsClient(), path, method); - assertThat(wsResponse.isSuccessful()).as("code is %s on path %s", wsResponse.code(), path).isTrue(); - } - - private WsResponse call(WsClient client, String path, WsRequest.Method method) { - WsRequest request = method.equals(GET) ? new GetRequest(path) : new PostRequest(path); - return client.wsConnector().call(request); - } - -} diff --git a/it/it-tests/src/test/java/it/user/LocalAuthenticationTest.java b/it/it-tests/src/test/java/it/user/LocalAuthenticationTest.java deleted file mode 100644 index dc6d2b0298e..00000000000 --- a/it/it-tests/src/test/java/it/user/LocalAuthenticationTest.java +++ /dev/null @@ -1,234 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.user; - -import com.codeborne.selenide.Condition; -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import java.util.UUID; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.WsUserTokens; -import org.sonarqube.ws.client.GetRequest; -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.WsResponse; -import org.sonarqube.ws.client.permission.AddUserWsRequest; -import org.sonarqube.ws.client.usertoken.GenerateWsRequest; -import org.sonarqube.ws.client.usertoken.RevokeWsRequest; -import org.sonarqube.ws.client.usertoken.SearchWsRequest; -import org.sonarqube.ws.client.usertoken.UserTokensService; -import pageobjects.LoginPage; -import pageobjects.Navigation; - -import static java.lang.String.format; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.resetSettings; -import static util.ItUtils.setServerProperty; -import static util.selenium.Selenese.runSelenese; - -public class LocalAuthenticationTest { - - private static final String ADMIN_USER_LOGIN = "admin-user"; - - private static final String LOGIN = "george.orwell"; - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator).disableOrganizations(); - - @Before - public void setUp() { - tester.users().generate(u -> u.setLogin(LOGIN).setPassword("123456")); - addUserPermission(LOGIN, "admin"); - - tester.users().generate(u -> u.setLogin("simple-user").setPassword("password")); - tester.users().generateAdministrator(u -> u.setLogin(ADMIN_USER_LOGIN).setPassword(ADMIN_USER_LOGIN)); - } - - @After - public void resetProperties() throws Exception { - resetSettings(orchestrator, null, "sonar.forceAuthentication"); - } - - @Test - public void log_in_with_correct_credentials_then_log_out() { - Navigation nav = tester.openBrowser(); - nav.shouldNotBeLoggedIn(); - nav.logIn().submitCredentials(LOGIN, "123456").shouldBeLoggedIn(); - nav.logOut().shouldNotBeLoggedIn(); - } - - @Test - public void log_in_with_wrong_credentials() { - Navigation nav = tester.openBrowser(); - LoginPage page = nav - .logIn() - .submitWrongCredentials(LOGIN, "wrong"); - page.getErrorMessage().shouldHave(Condition.text("Authentication failed")); - - nav.openHome(); - nav.shouldNotBeLoggedIn(); - } - - @Test - public void basic_authentication_based_on_login_and_password() { - String userId = UUID.randomUUID().toString(); - String login = format("login-%s", userId); - String name = format("name-%s", userId); - String password = "!ascii-only:-)@"; - tester.users().generate(u -> u.setLogin(login).setName(name).setPassword(password)); - - // authenticate - WsClient wsClient = tester.as(login, password).wsClient(); - WsResponse response = wsClient.wsConnector().call(new GetRequest("api/authentication/validate")); - assertThat(response.content()).isEqualTo("{\"valid\":true}"); - } - - @Test - public void basic_authentication_based_on_token() { - String tokenName = "Validate token based authentication"; - UserTokensService tokensService = tester.wsClient().userTokens(); - WsUserTokens.GenerateWsResponse generateWsResponse = tokensService.generate(new GenerateWsRequest() - .setLogin(LOGIN) - .setName(tokenName)); - WsClient wsClient = WsClientFactories.getDefault().newClient(HttpConnector.newBuilder() - .url(orchestrator.getServer().getUrl()) - .token(generateWsResponse.getToken()).build()); - - WsResponse response = wsClient.wsConnector().call(new GetRequest("api/authentication/validate")); - - assertThat(response.content()).isEqualTo("{\"valid\":true}"); - - WsUserTokens.SearchWsResponse searchResponse = tokensService.search(new SearchWsRequest().setLogin(LOGIN)); - assertThat(searchResponse.getUserTokensCount()).isEqualTo(1); - tokensService.revoke(new RevokeWsRequest().setLogin(LOGIN).setName(tokenName)); - searchResponse = tokensService.search(new SearchWsRequest().setLogin(LOGIN)); - assertThat(searchResponse.getUserTokensCount()).isEqualTo(0); - } - - @Test - @Ignore - public void web_login_form_should_support_utf8_passwords() { - // TODO selenium - } - - @Test - public void basic_authentication_does_not_support_utf8_passwords() { - String login = "user_with_utf8_password"; - // see http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt - String password = "κόσμε"; - - // create user with a UTF-8 password - tester.users().generate(u -> u.setLogin(login).setPassword(password)); - - // authenticate - assertThat(checkAuthenticationWithAuthenticateWebService(login, password)).isFalse(); - } - - @Test - public void allow_user_login_with_2_characters() throws Exception { - tester.users().generate(u -> u.setLogin("jo").setPassword("password")); - - assertThat(checkAuthenticationWithAuthenticateWebService("jo", "password")).isTrue(); - } - - @Test - public void authentication_through_ui() { - runSelenese(orchestrator, - "/user/LocalAuthenticationTest/login_successful.html", - "/user/LocalAuthenticationTest/login_wrong_password.html", - "/user/LocalAuthenticationTest/should_not_be_unlogged_when_going_to_login_page.html", - "/user/LocalAuthenticationTest/redirect_to_login_when_not_enough_privilege.html", - // SONAR-2132 - "/user/LocalAuthenticationTest/redirect_to_original_url_after_direct_login.html", - "/user/LocalAuthenticationTest/redirect_to_original_url_with_parameters_after_direct_login.html", - // SONAR-2009 - "/user/LocalAuthenticationTest/redirect_to_original_url_after_indirect_login.html"); - - setServerProperty(orchestrator, "sonar.forceAuthentication", "true"); - - runSelenese(orchestrator, - // SONAR-3473 - "/user/LocalAuthenticationTest/force-authentication.html"); - } - - @Test - public void authentication_with_authentication_ws() { - assertThat(checkAuthenticationWithAuthenticateWebService("admin", "admin")).isTrue(); - assertThat(checkAuthenticationWithAuthenticateWebService("wrong", "admin")).isFalse(); - assertThat(checkAuthenticationWithAuthenticateWebService("admin", "wrong")).isFalse(); - assertThat(checkAuthenticationWithAuthenticateWebService(null, null)).isTrue(); - - setServerProperty(orchestrator, "sonar.forceAuthentication", "true"); - - assertThat(checkAuthenticationWithAuthenticateWebService("admin", "admin")).isTrue(); - assertThat(checkAuthenticationWithAuthenticateWebService("wrong", "admin")).isFalse(); - assertThat(checkAuthenticationWithAuthenticateWebService("admin", "wrong")).isFalse(); - assertThat(checkAuthenticationWithAuthenticateWebService(null, null)).isFalse(); - } - - /** - * SONAR-7640 - */ - @Test - public void authentication_with_any_ws() throws Exception { - assertThat(checkAuthenticationWithAnyWS("admin", "admin").code()).isEqualTo(200); - assertThat(checkAuthenticationWithAnyWS("wrong", "admin").code()).isEqualTo(401); - assertThat(checkAuthenticationWithAnyWS("admin", "wrong").code()).isEqualTo(401); - assertThat(checkAuthenticationWithAnyWS("admin", null).code()).isEqualTo(401); - assertThat(checkAuthenticationWithAnyWS(null, null).code()).isEqualTo(200); - - setServerProperty(orchestrator, "sonar.forceAuthentication", "true"); - - assertThat(checkAuthenticationWithAnyWS("admin", "admin").code()).isEqualTo(200); - assertThat(checkAuthenticationWithAnyWS("wrong", "admin").code()).isEqualTo(401); - assertThat(checkAuthenticationWithAnyWS("admin", "wrong").code()).isEqualTo(401); - assertThat(checkAuthenticationWithAnyWS("admin", null).code()).isEqualTo(401); - assertThat(checkAuthenticationWithAnyWS(null, null).code()).isEqualTo(401); - } - - private boolean checkAuthenticationWithAuthenticateWebService(String login, String password) { - String result = tester.as(login, password).wsClient().wsConnector().call(new PostRequest("/api/authentication/validate")).content(); - return result.contains("{\"valid\":true}"); - } - - private WsResponse checkAuthenticationWithAnyWS(String login, String password) { - WsClient wsClient = WsClientFactories.getDefault().newClient(HttpConnector.newBuilder().url(orchestrator.getServer().getUrl()).credentials(login, password).build()); - // Call any WS - return wsClient.wsConnector().call(new GetRequest("api/rules/search")); - } - - private void addUserPermission(String login, String permission) { - tester.wsClient().permissions().addUser(new AddUserWsRequest() - .setLogin(login) - .setPermission(permission)); - } - -} diff --git a/it/it-tests/src/test/java/it/user/MyAccountPageTest.java b/it/it-tests/src/test/java/it/user/MyAccountPageTest.java deleted file mode 100644 index 6d8b8105686..00000000000 --- a/it/it-tests/src/test/java/it/user/MyAccountPageTest.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.user; - -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarScanner; -import it.Category4Suite; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import org.sonarqube.ws.client.PostRequest; -import pageobjects.Navigation; - -import static com.codeborne.selenide.Condition.text; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; -import static util.ItUtils.projectDir; -import static util.selenium.Selenese.runSelenese; - -public class MyAccountPageTest { - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator).disableOrganizations(); - - private User administrator; - - @Before - public void initUser() { - administrator = tester.users().generateAdministrator(); - createUser("account-user", "User With Account", "user@example.com"); - } - - @Test - public void should_display_user_details() throws Exception { - Navigation nav = tester.openBrowser(); - nav.openLogin().submitCredentials("account-user", "password").shouldBeLoggedIn(); - nav.open("/account"); - $("#name").shouldHave(text("User With Account")); - $("#login").shouldHave(text("account-user")); - $("#email").shouldHave(text("user@example.com")); - $("#groups").shouldHave(text("sonar-users")); - $("#scm-accounts").shouldHave(text("user@example.com")); - $("#avatar").shouldBe(visible); - } - - @Test - public void should_change_password() throws Exception { - Navigation nav = tester.openBrowser(); - nav.openLogin().submitCredentials("account-user", "password").shouldBeLoggedIn(); - nav.open("/account/security"); - $("#old_password").val("password"); - $("#password").val("new_password"); - $("#password_confirmation").val("new_password"); - $("#change-password").click(); - $(".alert-success").shouldBe(visible); - nav.logOut().logIn().submitCredentials("account-user", "new_password").shouldBeLoggedIn(); - } - - @Test - public void should_display_projects() throws Exception { - // first, try on empty instance - runSelenese(orchestrator, "/user/MyAccountPageTest/should_display_no_projects.html"); - - // then, analyze a project - analyzeProject("sample"); - grantAdminPermission("account-user", "sample"); - - runSelenese(orchestrator, "/user/MyAccountPageTest/should_display_projects.html"); - } - - @Test - public void notifications() { - Navigation nav = tester.openBrowser(); - nav.logIn().submitCredentials(administrator.getLogin()).openNotifications() - .addGlobalNotification("ChangesOnMyIssue") - .addGlobalNotification("NewIssues") - .removeGlobalNotification("ChangesOnMyIssue"); - - nav.openNotifications() - .shouldHaveGlobalNotification("NewIssues") - .shouldNotHaveGlobalNotification("ChangesOnMyIssue"); - } - - private void createUser(String login, String name, String email) { - tester.wsClient().wsConnector().call( - new PostRequest("api/users/create") - .setParam("login", login) - .setParam("name", name) - .setParam("email", email) - .setParam("password", "password")); - } - - private static void analyzeProject(String projectKey) { - SonarScanner build = SonarScanner.create(projectDir("qualitygate/xoo-sample")) - .setProjectKey(projectKey) - .setProperty("sonar.projectDescription", "Description of a project") - .setProperty("sonar.links.homepage", "http://example.com"); - orchestrator.executeBuild(build); - } - - private void grantAdminPermission(String login, String projectKey) { - tester.wsClient().wsConnector().call( - new PostRequest("api/permissions/add_user") - .setParam("login", login) - .setParam("projectKey", projectKey) - .setParam("permission", "admin")); - } -} diff --git a/it/it-tests/src/test/java/it/user/OAuth2IdentityProviderTest.java b/it/it-tests/src/test/java/it/user/OAuth2IdentityProviderTest.java deleted file mode 100644 index 91a58eefe5b..00000000000 --- a/it/it-tests/src/test/java/it/user/OAuth2IdentityProviderTest.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.user; - -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import java.io.File; -import java.net.HttpURLConnection; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import org.apache.commons.io.FileUtils; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.WsUsers.SearchWsResponse.User; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsResponse; -import org.sonarqube.ws.client.user.CreateRequest; -import pageobjects.Navigation; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.resetSettings; -import static util.ItUtils.setServerProperty; -import static util.selenium.Selenese.runSelenese; - -/** - * There's only tests specific to OAuth2 in this class - */ -public class OAuth2IdentityProviderTest { - - @ClassRule - public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - private static String FAKE_PROVIDER_KEY = "fake-oauth2-id-provider"; - - private static String USER_LOGIN = "john"; - private static String USER_PROVIDER_ID = "fake-john"; - private static String USER_NAME = "John"; - private static String USER_EMAIL = "john@email.com"; - - @Rule - public Tester tester = new Tester(orchestrator).disableOrganizations(); - - private MockWebServer fakeServerAuthProvider; - private String fakeServerAuthProviderUrl; - - @Before - public void setUp() throws Exception { - fakeServerAuthProvider = new MockWebServer(); - fakeServerAuthProvider.start(); - fakeServerAuthProviderUrl = fakeServerAuthProvider.url("").url().toString(); - resetData(); - } - - @After - public void tearDown() throws Exception { - resetData(); - fakeServerAuthProvider.shutdown(); - } - - private void resetData() { - resetSettings(orchestrator, null, - "sonar.auth.fake-oauth2-id-provider.enabled", - "sonar.auth.fake-oauth2-id-provider.url", - "sonar.auth.fake-oauth2-id-provider.user", - "sonar.auth.fake-oauth2-id-provider.throwUnauthorizedMessage", - "sonar.auth.fake-oauth2-id-provider.allowsUsersToSignUp"); - } - - @Test - public void create_user_when_authenticating_for_the_first_time() { - simulateRedirectionToCallback(); - enablePlugin(); - - authenticateWithFakeAuthProvider(); - - verifyUser(USER_LOGIN, USER_NAME, USER_EMAIL); - } - - private void verifyUser(String login, String name, String email) { - User user = tester.users().getByLogin(login).orElseThrow(IllegalStateException::new); - assertThat(user.getLogin()).isEqualTo(login); - assertThat(user.getName()).isEqualTo(name); - assertThat(user.getEmail()).isEqualTo(email); - assertThat(user.getActive()).isTrue(); - } - - @Test - public void authenticate_user_through_ui() throws Exception { - simulateRedirectionToCallback(); - enablePlugin(); - - Navigation nav = tester.openBrowser(); - nav.openLogin().useOAuth2().shouldBeLoggedIn(); - - verifyUser(USER_LOGIN, USER_NAME, USER_EMAIL); - } - - @Test - public void display_unauthorized_page_when_authentication_failed_in_callback() throws Exception { - simulateRedirectionToCallback(); - enablePlugin(); - - // As this property is null, the plugin will throw an exception - setServerProperty(orchestrator, "sonar.auth.fake-oauth2-id-provider.user", null); - - runSelenese(orchestrator, "/user/OAuth2IdentityProviderTest/display_unauthorized_page_when_authentication_failed.html"); - - assertThatUserDoesNotExist(USER_LOGIN); - } - - @Test - public void fail_to_authenticate_when_not_allowed_to_sign_up() throws Exception { - simulateRedirectionToCallback(); - enablePlugin(); - setServerProperty(orchestrator, "sonar.auth.fake-oauth2-id-provider.allowsUsersToSignUp", "false"); - - runSelenese(orchestrator, "/user/OAuth2IdentityProviderTest/fail_to_authenticate_when_not_allowed_to_sign_up.html"); - - assertThatUserDoesNotExist(USER_LOGIN); - } - - @Test - public void display_message_in_ui_but_not_in_log_when_unauthorized_exception_in_callback() throws Exception { - simulateRedirectionToCallback(); - enablePlugin(); - setServerProperty(orchestrator, "sonar.auth.fake-oauth2-id-provider.throwUnauthorizedMessage", "true"); - - tester.runHtmlTests("/user/OAuth2IdentityProviderTest/display_message_in_ui_but_not_in_log_when_unauthorized_exception.html"); - - File logFile = orchestrator.getServer().getWebLogs(); - assertThat(FileUtils.readFileToString(logFile)).doesNotContain("A functional error has happened"); - assertThat(FileUtils.readFileToString(logFile)).doesNotContain("UnauthorizedException"); - - assertThatUserDoesNotExist(USER_LOGIN); - } - - @Test - public void fail_when_email_already_exists() throws Exception { - simulateRedirectionToCallback(); - enablePlugin(); - tester.users().generate(u -> u.setLogin("another").setName("Another").setEmail(USER_EMAIL).setPassword("another")); - - tester.runHtmlTests("/user/OAuth2IdentityProviderTest/fail_when_email_already_exists.html"); - - File logFile = orchestrator.getServer().getWebLogs(); - assertThat(FileUtils.readFileToString(logFile)) - .doesNotContain("You can't sign up because email 'john@email.com' is already used by an existing user. This means that you probably already registered with another account"); - } - - @Test - public void provision_user_before_authentication() { - simulateRedirectionToCallback(); - enablePlugin(); - - // Provision none local user in database - tester.wsClient().users().create(CreateRequest.builder() - .setLogin(USER_LOGIN) - .setName(USER_NAME) - .setEmail(USER_EMAIL) - .setLocal(false) - .build()); - User user = tester.users().getByLogin(USER_LOGIN).get(); - assertThat(user.getLocal()).isFalse(); - assertThat(user.getExternalIdentity()).isEqualTo(USER_LOGIN); - assertThat(user.getExternalProvider()).isEqualTo("sonarqube"); - - // Authenticate with external system -> It will update external provider info - authenticateWithFakeAuthProvider(); - - user = tester.users().getByLogin(USER_LOGIN).get(); - assertThat(user.getLocal()).isFalse(); - assertThat(user.getExternalIdentity()).isEqualTo(USER_PROVIDER_ID); - assertThat(user.getExternalProvider()).isEqualTo(FAKE_PROVIDER_KEY); - } - - private void authenticateWithFakeAuthProvider() { - WsResponse response = tester.wsClient().wsConnector().call( - new GetRequest(("/sessions/init/" + FAKE_PROVIDER_KEY))); - assertThat(response.code()).isEqualTo(200); - } - - private void simulateRedirectionToCallback() { - fakeServerAuthProvider.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: " + orchestrator.getServer().getUrl() + "/oauth2/callback/" + FAKE_PROVIDER_KEY) - .setBody("Redirect to SonarQube")); - } - - private void enablePlugin() { - setServerProperty(orchestrator, "sonar.auth.fake-oauth2-id-provider.enabled", "true"); - setServerProperty(orchestrator, "sonar.auth.fake-oauth2-id-provider.url", fakeServerAuthProviderUrl); - setServerProperty(orchestrator, "sonar.auth.fake-oauth2-id-provider.user", USER_LOGIN + "," + USER_PROVIDER_ID + "," + USER_NAME + "," + USER_EMAIL); - } - - private void assertThatUserDoesNotExist(String login) { - assertThat(tester.users().getByLogin(login)).isEmpty(); - } - -} diff --git a/it/it-tests/src/test/java/it/user/OnboardingTest.java b/it/it-tests/src/test/java/it/user/OnboardingTest.java deleted file mode 100644 index e0a277a812a..00000000000 --- a/it/it-tests/src/test/java/it/user/OnboardingTest.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.user; - -import com.sonar.orchestrator.Orchestrator; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import org.sonarqube.ws.client.WsClient; -import util.ItUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.resetSettings; -import static util.ItUtils.setServerProperty; - -public class OnboardingTest { - - private static final String ONBOARDING_TUTORIAL_SHOW_TO_NEW_USERS = "sonar.onboardingTutorial.showToNewUsers"; - - @ClassRule - public static final Orchestrator orchestrator = Orchestrator.builderEnv().build(); - - @Rule - public Tester tester = new Tester(orchestrator).disableOrganizations(); - - @Before - public void setUp() { - resetSettings(orchestrator, null, ONBOARDING_TUTORIAL_SHOW_TO_NEW_USERS); - } - - @After - public void reset() { - resetSettings(orchestrator, null, ONBOARDING_TUTORIAL_SHOW_TO_NEW_USERS); - } - - @Test - public void by_default_new_user_does_not_see_onboarding_tutorial() { - User user = tester.users().generate(); - - verifyTutorial(user, false); - } - - @Test - public void new_user_see_onboarding_tutorial_when_show_onboarding_setting_is_enabled() { - setShownOnboardingSetting(true); - User user = tester.users().generate(); - - verifyTutorial(user, true); - } - - @Test - public void new_user_does_not_see_onboarding_tutorial_when_show_onboarding_setting_is_disabled() { - setShownOnboardingSetting(false); - User user = tester.users().generate(); - - verifyTutorial(user, false); - } - - @Test - public void new_user_does_not_see_onboarding_tutorial_when_show_onboarding_setting_is_enabled_after_user_creation() { - setShownOnboardingSetting(false); - // User is created when show onboading is disabled - User user = tester.users().generate(); - setShownOnboardingSetting(true); - - // The user doesn't see the tutorial as he was created when the show onboading setting was disabled - verifyTutorial(user, false); - } - - @Test - public void skip_onboarding_tutorial() { - setShownOnboardingSetting(true); - User user = tester.users().generate(); - - tester.as(user.getLogin()).wsClient().users().skipOnboardingTutorial(); - - verifyTutorial(user, false); - } - - @Test - public void skip_onboarding_tutorial_when_show_onboarding_setting_is_disabled() { - setShownOnboardingSetting(true); - User user = tester.users().generate(); - - tester.as(user.getLogin()).wsClient().users().skipOnboardingTutorial(); - - verifyTutorial(user, false); - } - - @Test - public void anonymous_user_does_not_see_onboarding_tutorial() { - setShownOnboardingSetting(true); - - // anonymous should not see the onboarding tutorial - verifyTutorialForAnonymous(false); - - // anonymous should not be able to skip the tutorial - ItUtils.expectHttpError(401, () -> tester.asAnonymous().wsClient().users().skipOnboardingTutorial()); - } - - @Test - public void admin_user_see_onboarding_tutorial() { - - assertThat(tester.wsClient().users().current().getShowOnboardingTutorial()).isEqualTo(true); - - // Onboarding setting has no effect as admin is created at startup - setShownOnboardingSetting(false); - assertThat(tester.wsClient().users().current().getShowOnboardingTutorial()).isEqualTo(true); - - setShownOnboardingSetting(true); - assertThat(tester.wsClient().users().current().getShowOnboardingTutorial()).isEqualTo(true); - } - - @Test - public void reactivated_user_should_see_the_onboarding_tutorial() { - setShownOnboardingSetting(true); - User user = tester.users().generate(); - tester.as(user.getLogin()).wsClient().users().skipOnboardingTutorial(); - verifyTutorial(user, false); - - tester.wsClient().users().deactivate(user.getLogin()); - User reactivatedUser = tester.users().generate(u -> u.setLogin(user.getLogin()).setName(user.getName()).setPassword(user.getLogin())); - - verifyTutorial(reactivatedUser, true); - } - - private static void setShownOnboardingSetting(boolean showTutorial) { - setServerProperty(orchestrator, ONBOARDING_TUTORIAL_SHOW_TO_NEW_USERS, String.valueOf(showTutorial)); - } - - private void verifyTutorial(User user, boolean expectedTutorial) { - WsClient wsClient = tester.as(user.getLogin()).wsClient(); - assertThat(wsClient.users().current().getShowOnboardingTutorial()).isEqualTo(expectedTutorial); - } - - private void verifyTutorialForAnonymous(boolean expectedTutorial) { - WsClient wsClient = tester.asAnonymous().wsClient(); - assertThat(wsClient.users().current().getShowOnboardingTutorial()).isEqualTo(expectedTutorial); - } -} diff --git a/it/it-tests/src/test/java/it/user/OrganizationIdentityProviderTest.java b/it/it-tests/src/test/java/it/user/OrganizationIdentityProviderTest.java deleted file mode 100644 index d59f5651477..00000000000 --- a/it/it-tests/src/test/java/it/user/OrganizationIdentityProviderTest.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.user; - -import com.google.common.base.Joiner; -import com.sonar.orchestrator.Orchestrator; -import it.Category6Suite; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.WsUserGroups.Group; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import org.sonarqube.ws.client.GetRequest; - -import static util.ItUtils.resetSettings; -import static util.ItUtils.setServerProperty; - -public class OrganizationIdentityProviderTest { - - @ClassRule - public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; - - @Rule - public Tester tester = new Tester(orchestrator); - - - @Before - public void setUp() { - // enable the fake authentication plugin - setServerProperty(orchestrator, "sonar.auth.fake-base-id-provider.enabled", "true"); - } - - @After - public void tearDown() { - resetSettings(orchestrator, null, "sonar.auth.fake-base-id-provider.enabled", "sonar.auth.fake-base-id-provider.user", - "sonar.auth.fake-base-id-provider.throwUnauthorizedMessage", "sonar.auth.fake-base-id-provider.enabledGroupsSync", "sonar.auth.fake-base-id-provider.groups", - "sonar.auth.fake-base-id-provider.allowsUsersToSignUp"); - } - - @Test - public void default_group_is_not_added_for_new_user_when_organizations_are_enabled() { - Group group = tester.groups().generate(null); - enableUserCreationByAuthPlugin("aLogin"); - setGroupsReturnedByAuthPlugin(group.getName()); - - authenticateWithFakeAuthProvider(); - - // No default group membership - tester.groups().assertThatUserIsOnlyMemberOf(null, "aLogin", group.getName()); - } - - @Test - public void default_group_is_not_sync_for_existing_user_when_organizations_are_enabled() { - Group group = tester.groups().generate(null); - User user = tester.users().generate(); - enableUserCreationByAuthPlugin(user.getLogin()); - setGroupsReturnedByAuthPlugin(group.getName()); - - authenticateWithFakeAuthProvider(); - - // No default group membership - tester.groups().assertThatUserIsOnlyMemberOf(null, user.getLogin(), group.getName()); - } - - @Test - public void remove_default_group_when_organizations_are_enabled() { - Group group = tester.groups().generate(null); - User user = tester.users().generate(); - // Add user as member of default organization - tester.wsClient().organizations().addMember("default-organization", user.getLogin()); - tester.groups().assertThatUserIsMemberOf(null, user.getLogin(), "Members"); - enableUserCreationByAuthPlugin(user.getLogin()); - // No group is returned by the plugin - setGroupsReturnedByAuthPlugin(); - - authenticateWithFakeAuthProvider(); - - // No default group membership - tester.groups().assertThatUserIsOnlyMemberOf(null, user.getLogin()); - } - - private static void enableUserCreationByAuthPlugin(String login) { - setServerProperty(orchestrator, "sonar.auth.fake-base-id-provider.user", login + ",fake-john,John,john@email.com"); - } - - private static void setGroupsReturnedByAuthPlugin(String... groups) { - setServerProperty(orchestrator, "sonar.auth.fake-base-id-provider.enabledGroupsSync", "true"); - if (groups.length > 0) { - setServerProperty(orchestrator, "sonar.auth.fake-base-id-provider.groups", Joiner.on(",").join(groups)); - } - } - - private void authenticateWithFakeAuthProvider() { - tester.wsClient().wsConnector().call( - new GetRequest("/sessions/init/fake-base-id-provider")) - .failIfNotSuccessful(); - } - -} diff --git a/it/it-tests/src/test/java/it/user/RealmAuthenticationTest.java b/it/it-tests/src/test/java/it/user/RealmAuthenticationTest.java deleted file mode 100644 index bb8fb26b857..00000000000 --- a/it/it-tests/src/test/java/it/user/RealmAuthenticationTest.java +++ /dev/null @@ -1,389 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.user; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; -import com.sonar.orchestrator.Orchestrator; -import java.util.Map; -import javax.annotation.CheckForNull; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonar.wsclient.Host; -import org.sonar.wsclient.Sonar; -import org.sonar.wsclient.base.HttpException; -import org.sonar.wsclient.connectors.HttpClient4Connector; -import org.sonar.wsclient.services.AuthenticationQuery; -import org.sonar.wsclient.user.UserParameters; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsResponse; -import org.sonarqube.ws.client.user.CreateRequest; -import util.user.UserRule; -import util.user.Users; - -import static java.net.HttpURLConnection.HTTP_OK; -import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; -import static util.ItUtils.newAdminWsClient; -import static util.ItUtils.newUserWsClient; -import static util.ItUtils.pluginArtifact; -import static util.ItUtils.resetSettings; -import static util.ItUtils.setServerProperty; -import static util.selenium.Selenese.runSelenese; - -/** - * Test REALM authentication. - * - * It starts its own server as it's using a different authentication system - */ -public class RealmAuthenticationTest { - - private static final String TECH_USER = "techUser"; - private static final String USER_LOGIN = "tester"; - private static final String ADMIN_USER_LOGIN = "admin-user"; - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - /** - * Property from security-plugin for user management. - */ - private static final String USERS_PROPERTY = "sonar.fakeauthenticator.users"; - - @ClassRule - public static final Orchestrator orchestrator = Orchestrator.builderEnv() - .addPlugin(pluginArtifact("security-plugin")) - .setServerProperty("sonar.security.realm", "FakeRealm") - .build(); - - @Rule - public UserRule userRule = UserRule.from(orchestrator); - - @Before - @After - public void resetData() throws Exception { - resetSettings(orchestrator, null, USERS_PROPERTY, "sonar.security.updateUserAttributes"); - } - - @Before - public void initAdminUser() throws Exception { - userRule.createAdminUser(ADMIN_USER_LOGIN, ADMIN_USER_LOGIN); - } - - @After - public void deleteAdminUser() { - userRule.resetUsers(); - } - - /** - * SONAR-3137, SONAR-2292 - * Restriction on password length (minimum 4 characters) should be disabled, when external system enabled. - */ - @Test - public void shouldSynchronizeDetailsAndGroups() { - // Given clean Sonar installation and no users in external system - String username = USER_LOGIN; - String password = "123"; - Map<String, String> users = Maps.newHashMap(); - - // When user created in external system - users.put(username + ".password", password); - users.put(username + ".name", "Tester Testerovich"); - users.put(username + ".email", "tester@example.org"); - users.put(username + ".groups", "sonar-user"); - updateUsersInExtAuth(users); - // Then - verifyAuthenticationIsOk(username, password); - - // with external details and groups - runSelenese(orchestrator, "/user/ExternalAuthenticationTest/external-user-details.html"); - - // SONAR-4462 - runSelenese(orchestrator, "/user/ExternalAuthenticationTest/system-info.html"); - } - - /** - * SONAR-4034 - */ - @Test - public void shouldUpdateDetailsByDefault() { - // Given clean Sonar installation and no users in external system - String username = USER_LOGIN; - String password = "123"; - Map<String, String> users = Maps.newHashMap(); - - // When user created in external system - users.put(username + ".password", password); - users.put(username + ".name", "Tester Testerovich"); - users.put(username + ".email", "tester@example.org"); - users.put(username + ".groups", "sonar-user"); - updateUsersInExtAuth(users); - // Then - verifyAuthenticationIsOk(username, password); - - // with external details and groups - // TODO replace by WS ? Or with new Selenese utils - runSelenese(orchestrator, "/user/ExternalAuthenticationTest/external-user-details.html"); - - // Now update user details - users.put(username + ".name", "Tester2 Testerovich"); - users.put(username + ".email", "tester2@example.org"); - updateUsersInExtAuth(users); - // Then - verifyAuthenticationIsOk(username, password); - - // with external details and groups updated - runSelenese(orchestrator, "/user/ExternalAuthenticationTest/external-user-details2.html"); - } - - /** - * SONAR-3138 - */ - @Test - public void shouldNotFallback() { - // Given clean Sonar installation and no users in external system - String login = USER_LOGIN; - String password = "1234567"; - Map<String, String> users = Maps.newHashMap(); - - // When user created in external system - users.put(login + ".password", password); - updateUsersInExtAuth(users); - // Then - verifyAuthenticationIsOk(login, password); - - // When external system does not work - users.remove(login + ".password"); - updateUsersInExtAuth(users); - // Then - verifyAuthenticationIsNotOk(login, password); - } - - /** - * SONAR-4543 - */ - @Test - public void adminIsLocalAccountByDefault() { - // Given clean Sonar installation and no users in external system - String login = "admin"; - String localPassword = "admin"; - String remotePassword = "nimda"; - Map<String, String> users = Maps.newHashMap(); - - // When admin created in external system with a different password - users.put(login + ".password", remotePassword); - updateUsersInExtAuth(users); - - // Then this is local DB that should be used - verifyAuthenticationIsNotOk(login, remotePassword); - verifyAuthenticationIsOk(login, localPassword); - } - - /** - * SONAR-1334, SONAR-3185 (createUsers=true is default) - */ - @Test - public void shouldCreateNewUsers() { - // Given clean Sonar installation and no users in external system - String username = USER_LOGIN; - String password = "1234567"; - Map<String, String> users = Maps.newHashMap(); - - // When user not exists in external system - // Then - verifyAuthenticationIsNotOk(username, password); - - // When user created in external system - users.put(username + ".password", password); - updateUsersInExtAuth(users); - // Then - verifyAuthenticationIsOk(username, password); - verifyAuthenticationIsNotOk(username, "wrong"); - } - - // SONAR-3258 - @Test - public void shouldAutomaticallyReactivateDeletedUser() throws Exception { - // Given clean Sonar installation and no users in external system - - // Let's create and delete the user "tester" in Sonar DB - runSelenese(orchestrator, "/user/ExternalAuthenticationTest/create-and-delete-user.html"); - - // And now update the security with the user that was deleted - String login = USER_LOGIN; - String password = "1234567"; - Map<String, String> users = Maps.newHashMap(); - users.put(login + ".password", password); - updateUsersInExtAuth(users); - // check that the deleted/deactivated user "tester" has been reactivated and can now log in - verifyAuthenticationIsOk(login, password); - } - - /** - * SONAR-7036 - */ - @Test - public void update_password_of_technical_user() throws Exception { - // Create user in external authentication - updateUsersInExtAuth(ImmutableMap.of(USER_LOGIN + ".password", USER_LOGIN)); - verifyAuthenticationIsOk(USER_LOGIN, USER_LOGIN); - - // Create technical user in db - createUserInDb(TECH_USER, "old_password"); - assertThat(checkAuthenticationThroughWebService(TECH_USER, "old_password")).isTrue(); - - // Updating password of technical user is allowed - updateUserPasswordInDb(TECH_USER, "new_password"); - assertThat(checkAuthenticationThroughWebService(TECH_USER, "new_password")).isTrue(); - - // But updating password of none local user is not allowed - try { - updateUserPasswordInDb(USER_LOGIN, "new_password"); - fail(); - } catch (HttpException e) { - verifyHttpException(e, 400); - } - } - - /** - * SONAR-7640 - */ - @Test - public void authentication_with_ws() throws Exception { - // Given clean Sonar installation and no users in external system - String login = USER_LOGIN; - String password = "1234567"; - Map<String, String> users = Maps.newHashMap(); - - // When user created in external system - users.put(login + ".password", password); - updateUsersInExtAuth(users); - - verifyAuthenticationIsOk(login, password); - verifyAuthenticationIsNotOk("wrong", password); - verifyAuthenticationIsNotOk(login, "wrong"); - verifyAuthenticationIsNotOk(login, null); - verifyAuthenticationIsOk(null, null); - - setServerProperty(orchestrator, "sonar.forceAuthentication", "true"); - - verifyAuthenticationIsOk(login, password); - verifyAuthenticationIsNotOk("wrong", password); - verifyAuthenticationIsNotOk(login, "wrong"); - verifyAuthenticationIsNotOk(login, null); - verifyAuthenticationIsNotOk(null, null); - } - - @Test - public void allow_user_login_with_2_characters() { - String username = "jo"; - String password = "1234567"; - updateUsersInExtAuth(ImmutableMap.of(username + ".password", password)); - - verifyAuthenticationIsOk(username, password); - } - - @Test - public void provision_user_before_authentication() { - newAdminWsClient(orchestrator).users().create(CreateRequest.builder() - .setLogin(USER_LOGIN) - .setName("Tester Testerovich") - .setEmail("tester@example.org") - .setLocal(false) - .build()); - // The user is created in SonarQube but doesn't exist yet in external authentication system - verifyAuthenticationIsNotOk(USER_LOGIN, "123"); - - updateUsersInExtAuth(ImmutableMap.of( - USER_LOGIN + ".password", "123", - USER_LOGIN + ".name", "Tester Testerovich", - USER_LOGIN + ".email", "tester@example.org")); - - verifyAuthenticationIsOk(USER_LOGIN, "123"); - assertThat(userRule.getUserByLogin(USER_LOGIN).get()) - .extracting(Users.User::isLocal, Users.User::getExternalIdentity, Users.User::getExternalProvider) - .containsOnly(false, USER_LOGIN, "sonarqube"); - } - - private void verifyHttpException(Exception e, int expectedCode) { - assertThat(e).isInstanceOf(HttpException.class); - HttpException exception = (HttpException) e; - assertThat(exception.status()).isEqualTo(expectedCode); - } - - private boolean checkAuthenticationThroughWebService(String login, String password) { - return createWsClient(login, password).find(new AuthenticationQuery()).isValid(); - } - - /** - * Updates information about users in security-plugin. - */ - private static void updateUsersInExtAuth(Map<String, String> users) { - setServerProperty(orchestrator, USERS_PROPERTY, format(users)); - } - - private void createUserInDb(String login, String password) { - orchestrator.getServer().adminWsClient().userClient().create(UserParameters.create().login(login).name(login) - .password(password).passwordConfirmation(password)); - } - - private void updateUserPasswordInDb(String login, String newPassword) { - orchestrator.getServer().adminWsClient().post("/api/users/change_password", "login", login, "password", newPassword); - } - - /** - * Utility method to create {@link Sonar} with specified {@code username} and {@code password}. - * Orchestrator does not provide such method. - */ - private Sonar createWsClient(String username, String password) { - return new Sonar(new HttpClient4Connector(new Host(orchestrator.getServer().getUrl(), username, password))); - } - - @CheckForNull - private static String format(Map<String, String> map) { - if (map.isEmpty()) { - return null; - } - StringBuilder sb = new StringBuilder(); - for (Map.Entry<String, String> entry : map.entrySet()) { - sb.append(entry.getKey()).append('=').append(entry.getValue()).append('\n'); - } - return sb.toString(); - } - - private void verifyAuthenticationIsOk(String login, String password) { - assertThat(checkAuthenticationWithWebService(login, password).code()).isEqualTo(HTTP_OK); - } - - private void verifyAuthenticationIsNotOk(String login, String password) { - assertThat(checkAuthenticationWithWebService(login, password).code()).isEqualTo(HTTP_UNAUTHORIZED); - } - - private WsResponse checkAuthenticationWithWebService(String login, String password) { - // Call any WS - return newUserWsClient(orchestrator, login, password).wsConnector().call(new GetRequest("api/rules/search")); - } - -} diff --git a/it/it-tests/src/test/java/it/user/SsoAuthenticationTest.java b/it/it-tests/src/test/java/it/user/SsoAuthenticationTest.java deleted file mode 100644 index fdd127d56df..00000000000 --- a/it/it-tests/src/test/java/it/user/SsoAuthenticationTest.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.user; - -import com.sonar.orchestrator.Orchestrator; -import java.net.URLEncoder; -import java.util.List; -import javax.annotation.Nullable; -import okhttp3.Response; -import org.apache.commons.io.FileUtils; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import util.user.UserRule; - -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.call; - -/** - * Test SSO authentication (using HTTP headers). - * <p> - * It starts its own server as it's using a different authentication system - */ -public class SsoAuthenticationTest { - - private static final String LOGIN_HEADER = "H-Login"; - private static final String NAME_HEADER = "H-Name"; - private static final String EMAIL_HEADER = "H-Email"; - private static final String GROUPS_HEADER = "H-Groups"; - - static final String USER_LOGIN = "tester"; - static final String USER_NAME = "Tester"; - static final String USER_EMAIL = "tester@email.com"; - - static final String GROUP_1 = "group-1"; - static final String GROUP_2 = "group-2"; - static final String GROUP_3 = "group-3"; - - @ClassRule - public static final Orchestrator orchestrator = Orchestrator.builderEnv() - .setServerProperty("sonar.web.sso.enable", "true") - .setServerProperty("sonar.web.sso.loginHeader", LOGIN_HEADER) - .setServerProperty("sonar.web.sso.nameHeader", NAME_HEADER) - .setServerProperty("sonar.web.sso.emailHeader", EMAIL_HEADER) - .setServerProperty("sonar.web.sso.groupsHeader", GROUPS_HEADER) - .build(); - - @ClassRule - public static UserRule USER_RULE = UserRule.from(orchestrator); - - @Before - public void resetData() throws Exception { - USER_RULE.resetUsers(); - } - - @Test - public void authenticate() { - doCall(USER_LOGIN, USER_NAME, USER_EMAIL, null); - - USER_RULE.verifyUserExists(USER_LOGIN, USER_NAME, USER_EMAIL); - } - - @Test - public void authenticate_with_only_login() throws Exception { - doCall(USER_LOGIN, null, null, null); - - USER_RULE.verifyUserExists(USER_LOGIN, USER_LOGIN, null); - } - - @Test - public void update_user_when_headers_are_updated() { - doCall(USER_LOGIN, USER_NAME, USER_EMAIL, null); - USER_RULE.verifyUserExists(USER_LOGIN, USER_NAME, USER_EMAIL); - - // As we don't keep the JWT token is the test, the user is updated - doCall(USER_LOGIN, "new name", "new email", null); - USER_RULE.verifyUserExists(USER_LOGIN, "new name", "new email"); - } - - @Test - public void authenticate_with_groups() { - doCall(USER_LOGIN, null, null, GROUP_1); - - USER_RULE.verifyUserGroupMembership(USER_LOGIN, GROUP_1, "sonar-users"); - } - - @Test - public void synchronize_groups_when_authenticating_existing_user() throws Exception { - USER_RULE.createGroup(GROUP_1); - USER_RULE.createGroup(GROUP_2); - USER_RULE.createGroup(GROUP_3); - USER_RULE.createUser(USER_LOGIN, "password"); - USER_RULE.associateGroupsToUser(USER_LOGIN, GROUP_1, GROUP_2); - - doCall(USER_LOGIN, null, null, GROUP_2 + "," + GROUP_3); - - USER_RULE.verifyUserGroupMembership(USER_LOGIN, GROUP_2, GROUP_3, "sonar-users"); - } - - @Test - public void authentication_with_local_user_is_possible_when_no_header() throws Exception { - USER_RULE.createUser(USER_LOGIN, "password"); - - checkLocalAuthentication(USER_LOGIN, "password"); - } - - @Test - public void display_message_in_ui_but_not_in_log_when_unauthorized_exception() throws Exception { - Response response = doCall("invalid login $", null, null, null); - - assertThat(response.code()).isEqualTo(200); - assertThat(response.request().url().toString()).contains("sessions/unauthorized"); - - List<String> logsLines = FileUtils.readLines(orchestrator.getServer().getWebLogs(), UTF_8); - assertThat(logsLines).doesNotContain("org.sonar.server.exceptions.BadRequestException: Use only letters, numbers, and .-_@ please."); - USER_RULE.verifyUserDoesNotExist(USER_LOGIN); - } - - @Test - public void fail_when_email_already_exists() throws Exception { - USER_RULE.createUser("another", "Another", USER_EMAIL, "another"); - - Response response = doCall(USER_LOGIN, USER_NAME, USER_EMAIL, null); - - String expectedError = "You can't sign up because email 'tester@email.com' is already used by an existing user. This means that you probably already registered with another account"; - assertThat(response.code()).isEqualTo(200); - assertThat(response.request().url().toString()).contains(URLEncoder.encode(expectedError, UTF_8.name())); - assertThat(FileUtils.readLines(orchestrator.getServer().getWebLogs(), UTF_8)).doesNotContain(expectedError); - } - - private static Response doCall(String login, @Nullable String name, @Nullable String email, @Nullable String groups) { - return call(orchestrator.getServer().getUrl(), - LOGIN_HEADER, login, - NAME_HEADER, name, - EMAIL_HEADER, email, - GROUPS_HEADER, groups); - } - - private boolean checkLocalAuthentication(String login, String password) { - String result = orchestrator.getServer().wsClient(login, password).get("/api/authentication/validate"); - return result.contains("{\"valid\":true}"); - } - -} diff --git a/it/it-tests/src/test/java/it/webhook/ExternalServer.java b/it/it-tests/src/test/java/it/webhook/ExternalServer.java deleted file mode 100644 index 60485e25e25..00000000000 --- a/it/it-tests/src/test/java/it/webhook/ExternalServer.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.webhook; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.handler.AbstractHandler; -import org.junit.rules.ExternalResource; - -/** - * This web server listens to requests sent by webhooks - */ -class ExternalServer extends ExternalResource { - private final Server jetty; - private final List<PayloadRequest> payloads = new ArrayList<>(); - - ExternalServer() { - jetty = new Server(0); - jetty.setHandler(new AbstractHandler() { - @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - - if ("POST".equalsIgnoreCase(request.getMethod())) { - String json = request.getReader().lines().collect(Collectors.joining(System.lineSeparator())); - Map<String, String> httpHeaders = new HashMap<>(); - Enumeration<String> headerNames = request.getHeaderNames(); - while (headerNames.hasMoreElements()) { - String key = headerNames.nextElement(); - httpHeaders.put(key, request.getHeader(key)); - } - payloads.add(new PayloadRequest(target, httpHeaders, json)); - } - - response.setStatus(target.equals("/fail") ? 500 : 200); - baseRequest.setHandled(true); - } - }); - } - - @Override - protected void before() throws Throwable { - jetty.start(); - } - - @Override - protected void after() { - try { - jetty.stop(); - } catch (Exception e) { - throw new IllegalStateException("Cannot stop Jetty"); - } - } - - List<PayloadRequest> getPayloadRequests() { - return payloads; - } - - List<PayloadRequest> getPayloadRequestsOnPath(String path) { - return payloads.stream().filter(p -> p.getPath().equals(path)).collect(Collectors.toList()); - } - - String urlFor(String path) { - return jetty.getURI().resolve(path).toString(); - } - - void clear() { - payloads.clear(); - } -} diff --git a/it/it-tests/src/test/java/it/webhook/PayloadRequest.java b/it/it-tests/src/test/java/it/webhook/PayloadRequest.java deleted file mode 100644 index 857a76fa4fe..00000000000 --- a/it/it-tests/src/test/java/it/webhook/PayloadRequest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.webhook; - -import java.util.Map; - -import static java.util.Objects.requireNonNull; - -/** - * Request received by {@link ExternalServer} - */ -class PayloadRequest { - private final String path; - private final Map<String, String> httpHeaders; - private final String json; - - PayloadRequest(String path, Map<String, String> httpHeaders, String json) { - this.path = requireNonNull(path); - this.httpHeaders = requireNonNull(httpHeaders); - this.json = requireNonNull(json); - } - - Map<String, String> getHttpHeaders() { - return httpHeaders; - } - - String getJson() { - return json; - } - - String getPath() { - return path; - } -} diff --git a/it/it-tests/src/test/java/it/webhook/WebhooksTest.java b/it/it-tests/src/test/java/it/webhook/WebhooksTest.java deleted file mode 100644 index d1b5390bcf2..00000000000 --- a/it/it-tests/src/test/java/it/webhook/WebhooksTest.java +++ /dev/null @@ -1,290 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.webhook; - -import com.sonar.orchestrator.Orchestrator; -import it.Category3Suite; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import javax.annotation.Nullable; -import org.apache.commons.lang3.StringUtils; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.Webhooks; -import org.sonarqube.ws.client.HttpException; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.project.DeleteRequest; -import org.sonarqube.ws.client.setting.ResetRequest; -import org.sonarqube.ws.client.setting.SetRequest; -import org.sonarqube.ws.client.webhook.DeliveriesRequest; -import util.ItUtils; - -import static java.util.Objects.requireNonNull; -import static java.util.stream.IntStream.range; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.jsonToMap; -import static util.ItUtils.runProjectAnalysis; - -public class WebhooksTest { - - private static final String PROJECT_KEY = "my-project"; - private static final String PROJECT_NAME = "My Project"; - private static final String GLOBAL_WEBHOOK_PROPERTY = "sonar.webhooks.global"; - private static final String PROJECT_WEBHOOK_PROPERTY = "sonar.webhooks.project"; - - @ClassRule - public static Orchestrator orchestrator = Category3Suite.ORCHESTRATOR; - - @ClassRule - public static ExternalServer externalServer = new ExternalServer(); - - private WsClient adminWs = ItUtils.newAdminWsClient(orchestrator); - - @Before - public void setUp() throws Exception { - externalServer.clear(); - } - - @Before - @After - public void reset() throws Exception { - disableGlobalWebhooks(); - try { - // delete project and related properties/webhook deliveries - adminWs.projects().delete(DeleteRequest.builder().setKey(PROJECT_KEY).build()); - } catch (HttpException e) { - // ignore because project may not exist - } - } - - @Test - public void call_multiple_global_and_project_webhooks_when_analysis_is_done() { - orchestrator.getServer().provisionProject(PROJECT_KEY, PROJECT_NAME); - enableGlobalWebhooks( - new Webhook("Jenkins", externalServer.urlFor("/jenkins")), - new Webhook("HipChat", externalServer.urlFor("/hipchat"))); - enableProjectWebhooks(PROJECT_KEY, - new Webhook("Burgr", externalServer.urlFor("/burgr"))); - - analyseProject(); - - // the same payload has been sent to three servers - assertThat(externalServer.getPayloadRequests()).hasSize(3); - PayloadRequest request = externalServer.getPayloadRequests().get(0); - for (int i = 1; i < 3; i++) { - PayloadRequest r = externalServer.getPayloadRequests().get(i); - assertThat(request.getJson()).isEqualTo(r.getJson()); - } - - // verify HTTP headers - assertThat(request.getHttpHeaders().get("X-SonarQube-Project")).isEqualTo(PROJECT_KEY); - - // verify content of payload - Map<String, Object> payload = jsonToMap(request.getJson()); - assertThat(payload.get("status")).isEqualTo("SUCCESS"); - assertThat(payload.get("analysedAt")).isNotNull(); - Map<String, String> project = (Map<String, String>) payload.get("project"); - assertThat(project.get("key")).isEqualTo(PROJECT_KEY); - assertThat(project.get("name")).isEqualTo(PROJECT_NAME); - Map<String, Object> gate = (Map<String, Object>) payload.get("qualityGate"); - assertThat(gate.get("name")).isEqualTo("SonarQube way"); - assertThat(gate.get("status")).isEqualTo("OK"); - assertThat(gate.get("conditions")).isNotNull(); - - // verify list of persisted deliveries (api/webhooks/deliveries) - List<Webhooks.Delivery> deliveries = getPersistedDeliveries(); - assertThat(deliveries).hasSize(3); - for (Webhooks.Delivery delivery : deliveries) { - assertThatPersistedDeliveryIsValid(delivery); - assertThat(delivery.getSuccess()).isTrue(); - assertThat(delivery.getHttpStatus()).isEqualTo(200); - assertThat(delivery.getName()).isIn("Jenkins", "HipChat", "Burgr"); - assertThat(delivery.hasErrorStacktrace()).isFalse(); - // payload is available only in api/webhooks/delivery to avoid loading multiple DB CLOBs - assertThat(delivery.hasPayload()).isFalse(); - } - - // verify detail of persisted delivery (api/webhooks/delivery) - Webhooks.Delivery detail = getDetailOfPersistedDelivery(deliveries.get(0)); - assertThatPersistedDeliveryIsValid(detail); - assertThat(detail.getPayload()).isEqualTo(request.getJson()); - } - - @Test - public void persist_delivery_as_failed_if_external_server_returns_an_error_code() { - enableGlobalWebhooks( - new Webhook("Fail", externalServer.urlFor("/fail")), - new Webhook("HipChat", externalServer.urlFor("/hipchat"))); - - analyseProject(); - - // all webhooks are called, even if one returns an error code - assertThat(externalServer.getPayloadRequests()).hasSize(2); - - // verify persisted deliveries - Webhooks.Delivery failedDelivery = getPersistedDeliveryByName("Fail"); - assertThatPersistedDeliveryIsValid(failedDelivery); - assertThat(failedDelivery.getSuccess()).isFalse(); - assertThat(failedDelivery.getHttpStatus()).isEqualTo(500); - - Webhooks.Delivery successfulDelivery = getPersistedDeliveryByName("HipChat"); - assertThatPersistedDeliveryIsValid(successfulDelivery); - assertThat(successfulDelivery.getSuccess()).isTrue(); - assertThat(successfulDelivery.getHttpStatus()).isEqualTo(200); - } - - /** - * Restrict calls to ten webhooks per type (global or project) - */ - @Test - public void do_not_become_a_denial_of_service_attacker() { - orchestrator.getServer().provisionProject(PROJECT_KEY, PROJECT_NAME); - - List<Webhook> globalWebhooks = range(0, 15).mapToObj(i -> new Webhook("G" + i, externalServer.urlFor("/global"))).collect(Collectors.toList()); - enableGlobalWebhooks(globalWebhooks.toArray(new Webhook[globalWebhooks.size()])); - List<Webhook> projectWebhooks = range(0, 15).mapToObj(i -> new Webhook("P" + i, externalServer.urlFor("/project"))).collect(Collectors.toList()); - enableProjectWebhooks(PROJECT_KEY, projectWebhooks.toArray(new Webhook[projectWebhooks.size()])); - - analyseProject(); - - // only the first ten global webhooks and ten project webhooks are called - assertThat(externalServer.getPayloadRequests()).hasSize(10 + 10); - assertThat(externalServer.getPayloadRequestsOnPath("/global")).hasSize(10); - assertThat(externalServer.getPayloadRequestsOnPath("/project")).hasSize(10); - - // verify persisted deliveries - assertThat(getPersistedDeliveries()).hasSize(10 + 10); - } - - @Test - public void persist_delivery_as_failed_if_webhook_url_is_malformed() { - enableGlobalWebhooks(new Webhook("Jenkins", "this_is_not_an_url")); - - analyseProject(); - - assertThat(externalServer.getPayloadRequests()).isEmpty(); - - // verify persisted deliveries - Webhooks.Delivery delivery = getPersistedDeliveryByName("Jenkins"); - Webhooks.Delivery detail = getDetailOfPersistedDelivery(delivery); - - assertThat(detail.getSuccess()).isFalse(); - assertThat(detail.hasHttpStatus()).isFalse(); - assertThat(detail.hasDurationMs()).isFalse(); - assertThat(detail.getPayload()).isNotEmpty(); - assertThat(detail.getErrorStacktrace()) - .contains("java.lang.IllegalArgumentException") - .contains("unexpected url") - .contains("this_is_not_an_url"); - } - - @Test - public void ignore_webhook_if_url_is_missing() { - // property sets, as used to define webhooks, do - // not allow to validate values yet - enableGlobalWebhooks(new Webhook("Jenkins", null)); - - analyseProject(); - - assertThat(externalServer.getPayloadRequests()).isEmpty(); - assertThat(getPersistedDeliveries()).isEmpty(); - } - - private void analyseProject() { - runProjectAnalysis(orchestrator, "shared/xoo-sample", - "sonar.projectKey", PROJECT_KEY, - "sonar.projectName", PROJECT_NAME); - } - - private List<Webhooks.Delivery> getPersistedDeliveries() { - DeliveriesRequest deliveriesReq = DeliveriesRequest.builder().setComponentKey(PROJECT_KEY).build(); - return adminWs.webhooks().deliveries(deliveriesReq).getDeliveriesList(); - } - - private Webhooks.Delivery getPersistedDeliveryByName(String webhookName) { - List<Webhooks.Delivery> deliveries = getPersistedDeliveries(); - return deliveries.stream().filter(d -> d.getName().equals(webhookName)).findFirst().get(); - } - - private Webhooks.Delivery getDetailOfPersistedDelivery(Webhooks.Delivery delivery) { - Webhooks.Delivery detail = adminWs.webhooks().delivery(delivery.getId()).getDelivery(); - return requireNonNull(detail); - } - - private void assertThatPersistedDeliveryIsValid(Webhooks.Delivery delivery) { - assertThat(delivery.getId()).isNotEmpty(); - assertThat(delivery.getName()).isNotEmpty(); - assertThat(delivery.hasSuccess()).isTrue(); - assertThat(delivery.getHttpStatus()).isGreaterThanOrEqualTo(200); - assertThat(delivery.getDurationMs()).isGreaterThanOrEqualTo(0); - assertThat(delivery.getAt()).isNotEmpty(); - assertThat(delivery.getComponentKey()).isEqualTo(PROJECT_KEY); - assertThat(delivery.getUrl()).startsWith(externalServer.urlFor("/")); - } - - private void enableGlobalWebhooks(Webhook... webhooks) { - enableWebhooks(null, GLOBAL_WEBHOOK_PROPERTY, webhooks); - } - - private void enableProjectWebhooks(String projectKey, Webhook... webhooks) { - enableWebhooks(projectKey, PROJECT_WEBHOOK_PROPERTY, webhooks); - } - - private void enableWebhooks(@Nullable String projectKey, String property, Webhook... webhooks) { - List<String> webhookIds = new ArrayList<>(); - for (int i = 0; i < webhooks.length; i++) { - Webhook webhook = webhooks[i]; - String id = String.valueOf(i + 1); - webhookIds.add(id); - setProperty(projectKey, property + "." + id + ".name", webhook.name); - setProperty(projectKey, property + "." + id + ".url", webhook.url); - } - setProperty(projectKey, property, StringUtils.join(webhookIds, ",")); - } - - private void disableGlobalWebhooks() { - setProperty(null, GLOBAL_WEBHOOK_PROPERTY, null); - } - - private void setProperty(@Nullable String componentKey, String key, @Nullable String value) { - if (value == null) { - ResetRequest req = ResetRequest.builder().setKeys(key).setComponent(componentKey).build(); - adminWs.settings().reset(req); - } else { - SetRequest req = SetRequest.builder().setKey(key).setValue(value).setComponent(componentKey).build(); - adminWs.settings().set(req); - } - } - - private static class Webhook { - private final String name; - private final String url; - - Webhook(@Nullable String name, @Nullable String url) { - this.name = name; - this.url = url; - } - } - -} diff --git a/it/it-tests/src/test/java/it/ws/RoutesTest.java b/it/it-tests/src/test/java/it/ws/RoutesTest.java deleted file mode 100644 index 36c393f3b9c..00000000000 --- a/it/it-tests/src/test/java/it/ws/RoutesTest.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.ws; - -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsResponse; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newWsClient; - -public class RoutesTest { - - @ClassRule - public static final Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Test - public void redirect_profiles_export_to_api_qualityprofiles_export() { - WsResponse response = newWsClient(orchestrator).wsConnector().call(new GetRequest("profiles/export?language=xoo&format=XooFakeExporter")); - assertThat(response.isSuccessful()).isTrue(); - assertThat(response.requestUrl()).endsWith("/api/qualityprofiles/export?language=xoo&format=XooFakeExporter"); - assertThat(response.content()).isEqualTo("xoo -> Basic -> 1"); - - // Check 'name' parameter is taken into account - assertThat(newWsClient(orchestrator).wsConnector().call(new GetRequest("profiles/export?language=xoo&name=empty&format=XooFakeExporter")).content()).isEqualTo("xoo -> empty -> 0"); - } - -} diff --git a/it/it-tests/src/test/java/it/ws/WsLocalCallTest.java b/it/it-tests/src/test/java/it/ws/WsLocalCallTest.java deleted file mode 100644 index 8f4a54af78b..00000000000 --- a/it/it-tests/src/test/java/it/ws/WsLocalCallTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.ws; - -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.HttpConnector; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.WsClientFactories; -import org.sonarqube.ws.client.WsResponse; - -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newWsClient; - -/** - * Tests the ability for a web service to call another web services. - */ -public class WsLocalCallTest { - - @ClassRule - public static final Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Test - public void gets_protobuf() { - WsResponse response = newWsClient(orchestrator).wsConnector().call(new GetRequest("local_ws_call/protobuf_data")); - assertThat(response.isSuccessful()).isTrue(); - } - - @Test - public void gets_json() { - WsResponse response = newWsClient(orchestrator).wsConnector().call(new GetRequest("local_ws_call/json_data")); - assertThat(response.isSuccessful()).isTrue(); - } - - @Test - public void propagates_authorization_rights() { - WsClient wsClient = WsClientFactories.getDefault().newClient(HttpConnector.newBuilder() - .url(orchestrator.getServer().getUrl()) - .credentials("admin", "admin") - .build()); - WsResponse response = wsClient.wsConnector().call(new GetRequest("local_ws_call/require_permission")); - assertThat(response.isSuccessful()).isTrue(); - } - - @Test - public void fails_if_requires_permissions() { - WsResponse response = newWsClient(orchestrator).wsConnector().call(new GetRequest("local_ws_call/require_permission")); - - // this is not the unauthorized code as plugin forces it to 500 - assertThat(response.code()).isEqualTo(500); - } - -} diff --git a/it/it-tests/src/test/java/it/ws/WsTest.java b/it/it-tests/src/test/java/it/ws/WsTest.java deleted file mode 100644 index cdfc7ac84cb..00000000000 --- a/it/it-tests/src/test/java/it/ws/WsTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 it.ws; - -import com.sonar.orchestrator.Orchestrator; -import it.Category4Suite; -import org.junit.ClassRule; -import org.junit.Test; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.WsResponse; - -import static java.net.HttpURLConnection.HTTP_BAD_REQUEST; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newWsClient; - -public class WsTest { - - @ClassRule - public static final Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; - - @Test - public void gets_protobuf() { - WsResponse response = newWsClient(orchestrator).wsConnector().call(new GetRequest("api/issues/search.protobuf")); - assertThat(response.isSuccessful()).isTrue(); - assertThat(response.contentType()).contains("application/x-protobuf"); - } - - @Test - public void gets_json() { - WsResponse response = newWsClient(orchestrator).wsConnector().call(new GetRequest("api/issues/search.json")); - assertThat(response.isSuccessful()).isTrue(); - assertThat(response.contentType()).contains("application/json"); - } - - /** - * SONAR-7484 - */ - @Test - public void fail_on_unknown_extension() { - WsResponse response = newWsClient(orchestrator).wsConnector().call(new GetRequest("api/issues/search.unknown")); - assertThat(response.isSuccessful()).isFalse(); - assertThat(response.code()).isEqualTo(HTTP_BAD_REQUEST); - } - -} diff --git a/it/it-tests/src/test/java/org/sonarqube/test/GroupTester.java b/it/it-tests/src/test/java/org/sonarqube/test/GroupTester.java deleted file mode 100644 index 5b2242ee9c4..00000000000 --- a/it/it-tests/src/test/java/org/sonarqube/test/GroupTester.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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.sonarqube.test; - -import java.util.List; -import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import javax.annotation.Nullable; -import org.sonarqube.ws.Organizations; -import org.sonarqube.ws.WsUserGroups; -import org.sonarqube.ws.WsUsers; -import org.sonarqube.ws.WsUsers.GroupsWsResponse.Group; -import org.sonarqube.ws.client.user.GroupsRequest; -import org.sonarqube.ws.client.usergroup.AddUserWsRequest; -import org.sonarqube.ws.client.usergroup.CreateWsRequest; - -import static java.util.Arrays.stream; -import static org.assertj.core.api.Assertions.assertThat; - -public class GroupTester { - - private static final AtomicInteger ID_GENERATOR = new AtomicInteger(); - - private final Session session; - - GroupTester(Session session) { - this.session = session; - } - - @SafeVarargs - public final WsUserGroups.Group generate(@Nullable Organizations.Organization organization, Consumer<CreateWsRequest.Builder>... populators) { - int id = ID_GENERATOR.getAndIncrement(); - CreateWsRequest.Builder request = CreateWsRequest.builder() - .setName("Group" + id) - .setDescription("Description " + id) - .setOrganization(organization != null ? organization.getKey() : null); - stream(populators).forEach(p -> p.accept(request)); - return session.wsClient().userGroups().create(request.build()).getGroup(); - } - - public List<Group> getGroupsOfUser(@Nullable Organizations.Organization organization, String userLogin) { - GroupsRequest request = GroupsRequest.builder() - .setOrganization(organization != null ? organization.getKey() : null) - .setLogin(userLogin) - .build(); - WsUsers.GroupsWsResponse response = session.users().service().groups(request); - return response.getGroupsList(); - } - - public GroupTester addMemberToGroups(Organizations.Organization organization, String userLogin, String... groups) { - for (String group : groups) { - AddUserWsRequest request = AddUserWsRequest.builder() - .setLogin(userLogin) - .setOrganization(organization.getKey()) - .setName(group) - .build(); - session.wsClient().userGroups().addUser(request); - } - return this; - } - - public GroupTester assertThatUserIsMemberOf(@Nullable Organizations.Organization organization, String userLogin, String expectedGroup, String... otherExpectedGroups) { - List<String> groups = getGroupsOfUser(organization, userLogin) - .stream() - .map(Group::getName) - .collect(Collectors.toList()); - - assertThat(groups).contains(expectedGroup); - if (otherExpectedGroups.length > 0) { - assertThat(groups).contains(otherExpectedGroups); - } - return this; - } - - public GroupTester assertThatUserIsOnlyMemberOf(@Nullable Organizations.Organization organization, String userLogin, String... expectedGroups) { - Set<String> groups = getGroupsOfUser(organization, userLogin) - .stream() - .map(Group::getName) - .collect(Collectors.toSet()); - assertThat(groups).containsExactlyInAnyOrder(expectedGroups); - return this; - } -} diff --git a/it/it-tests/src/test/java/org/sonarqube/test/OrganizationTester.java b/it/it-tests/src/test/java/org/sonarqube/test/OrganizationTester.java deleted file mode 100644 index 8925813d8fa..00000000000 --- a/it/it-tests/src/test/java/org/sonarqube/test/OrganizationTester.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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.sonarqube.test; - -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; -import javax.annotation.Nullable; -import org.sonarqube.ws.Organizations; -import org.sonarqube.ws.WsUsers; -import org.sonarqube.ws.client.HttpException; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.organization.CreateWsRequest; -import org.sonarqube.ws.client.organization.OrganizationService; -import org.sonarqube.ws.client.organization.SearchMembersWsRequest; -import org.sonarqube.ws.client.organization.SearchWsRequest; -import org.sonarqube.ws.client.user.GroupsRequest; - -import static java.util.Arrays.stream; -import static org.assertj.core.api.Assertions.assertThat; - -public class OrganizationTester { - - private static final AtomicInteger ID_GENERATOR = new AtomicInteger(); - - private final Session session; - - OrganizationTester(Session session) { - this.session = session; - } - - void enableSupport() { - session.wsClient().wsConnector().call(new PostRequest("api/organizations/enable_support")); - } - - void deleteNonGuardedOrganizations() { - service().search(SearchWsRequest.builder().build()).getOrganizationsList() - .stream() - .filter(o -> !o.getKey().equals("default-organization")) - .forEach(organization -> service().delete(organization.getKey())); - } - - @SafeVarargs - public final Organizations.Organization generate(Consumer<CreateWsRequest.Builder>... populators) { - int id = ID_GENERATOR.getAndIncrement(); - CreateWsRequest.Builder request = new CreateWsRequest.Builder() - .setKey("org" + id) - .setName("Org " + id) - .setDescription("Description " + id) - .setUrl("http://test" + id); - stream(populators).forEach(p -> p.accept(request)); - return service().create(request.build()).getOrganization(); - } - - public OrganizationTester addMember(Organizations.Organization organization, WsUsers.CreateWsResponse.User user) { - service().addMember(organization.getKey(), user.getLogin()); - return this; - } - - public OrganizationTester assertThatOrganizationDoesNotExist(String organizationKey) { - SearchWsRequest request = new SearchWsRequest.Builder().setOrganizations(organizationKey).build(); - Organizations.SearchWsResponse searchWsResponse = service().search(request); - assertThat(searchWsResponse.getOrganizationsList()).isEmpty(); - return this; - } - - public OrganizationTester assertThatMemberOf(Organizations.Organization organization, WsUsers.CreateWsResponse.User user) { - return assertThatMemberOf(organization, user.getLogin()); - } - - public OrganizationTester assertThatMemberOf(Organizations.Organization organization, String userLogin) { - verifyOrganizationMembership(organization, userLogin, true); - verifyMembersGroupMembership(userLogin, organization, true); - return this; - } - - public OrganizationTester assertThatNotMemberOf(Organizations.Organization organization, WsUsers.CreateWsResponse.User user) { - return assertThatNotMemberOf(organization, user.getLogin()); - } - - public OrganizationTester assertThatNotMemberOf(Organizations.Organization organization, String userLogin) { - verifyOrganizationMembership(organization, userLogin, false); - try { - verifyMembersGroupMembership(userLogin, organization, false); - } catch (HttpException e) { - // do not fail if user does not exist - if (e.code() != 404) { - throw e; - } - } - return this; - } - - private void verifyOrganizationMembership(@Nullable Organizations.Organization organization, String userLogin, boolean isMember) { - List<Organizations.User> users = service().searchMembers(new SearchMembersWsRequest() - .setQuery(userLogin) - .setSelected("selected") - .setOrganization(organization != null ? organization.getKey() : null)) - .getUsersList(); - assertThat(users).hasSize(isMember ? 1 : 0); - } - - private void verifyMembersGroupMembership(String userLogin, @Nullable Organizations.Organization organization, boolean isMember) { - List<WsUsers.GroupsWsResponse.Group> groups = session.wsClient().users().groups(GroupsRequest.builder() - .setLogin(userLogin) - .setOrganization(organization != null ? organization.getKey() : null) - .setQuery("Members") - .setSelected("selected") - .build()) - .getGroupsList(); - assertThat(groups).hasSize(isMember ? 1 : 0); - } - - public OrganizationService service() { - return session.wsClient().organizations(); - } -} diff --git a/it/it-tests/src/test/java/org/sonarqube/test/QProfileTester.java b/it/it-tests/src/test/java/org/sonarqube/test/QProfileTester.java deleted file mode 100644 index fc14a92b4a0..00000000000 --- a/it/it-tests/src/test/java/org/sonarqube/test/QProfileTester.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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.sonarqube.test; - -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; -import org.sonarqube.ws.Common; -import org.sonarqube.ws.Organizations.Organization; -import org.sonarqube.ws.QualityProfiles.CreateWsResponse.QualityProfile; -import org.sonarqube.ws.Rules; -import org.sonarqube.ws.client.HttpException; -import org.sonarqube.ws.client.qualityprofile.ActivateRuleWsRequest; -import org.sonarqube.ws.client.qualityprofile.CreateRequest; -import org.sonarqube.ws.client.qualityprofile.QualityProfilesService; -import org.sonarqube.ws.client.rule.SearchWsRequest; - -import static java.util.Arrays.asList; -import static java.util.Arrays.stream; -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; - -public class QProfileTester { - private static final AtomicInteger ID_GENERATOR = new AtomicInteger(); - - private final Session session; - - QProfileTester(Session session) { - this.session = session; - } - - public QualityProfilesService service() { - return session.wsClient().qualityProfiles(); - } - - @SafeVarargs - public final QualityProfile createXooProfile(Organization organization, Consumer<CreateRequest.Builder>... populators) { - int id = ID_GENERATOR.getAndIncrement(); - CreateRequest.Builder request = CreateRequest.builder() - .setOrganizationKey(organization.getKey()) - .setLanguage("xoo") - .setProfileName("Profile" + id); - stream(populators).forEach(p -> p.accept(request)); - return service().create(request.build()).getProfile(); - } - - public QProfileTester activateRule(QualityProfile profile, String ruleKey) { - return activateRule(profile.getKey(), ruleKey); - } - - public QProfileTester activateRule(String profileKey, String ruleKey) { - ActivateRuleWsRequest request = ActivateRuleWsRequest.builder() - .setProfileKey(profileKey) - .setRuleKey(ruleKey) - .build(); - service().activateRule(request); - return this; - } - - public QProfileTester deactivateRule(QualityProfile profile, String ruleKey) { - service().deactivateRule(profile.getKey(), ruleKey); - return this; - } - - public QProfileTester assertThatNumberOfActiveRulesEqualsTo(QualityProfile profile, int expectedActiveRules) { - return assertThatNumberOfActiveRulesEqualsTo(profile.getKey(), expectedActiveRules); - } - - public QProfileTester assertThatNumberOfActiveRulesEqualsTo(String profileKey, int expectedActiveRules) { - try { - List<String> facetIds = asList("active_severities", "repositories", "languages", "severities", "statuses", "types"); - SearchWsRequest request = new SearchWsRequest() - .setQProfile(profileKey) - .setActivation(true) - .setFacets(facetIds) - .setFields(singletonList("actives")); - Rules.SearchResponse response = session.wsClient().rules().search(request); - - // assume that expectedActiveRules fits in first page of results - assertThat(response.getRulesCount()).isEqualTo(expectedActiveRules); - assertThat(response.getTotal()).isEqualTo(expectedActiveRules); - assertThat(response.getActives().getActives()).as(response.toString()).hasSize(expectedActiveRules); - - // verify facets - assertThat(response.getFacets().getFacetsCount()).isEqualTo(facetIds.size()); - response.getFacets().getFacetsList().forEach(facet -> { - long total = facet.getValuesList().stream() - .mapToLong(Common.FacetValue::getCount) - .sum(); - assertThat(total).as("Facet " + facet.getProperty()).isEqualTo((long) expectedActiveRules); - }); - } catch (HttpException e) { - if (expectedActiveRules == 0 && e.code() == 404) { - // profile does not exist, do nothing - return this; - } - throw e; - } - return this; - } -} diff --git a/it/it-tests/src/test/java/org/sonarqube/test/Session.java b/it/it-tests/src/test/java/org/sonarqube/test/Session.java deleted file mode 100644 index f99764468fc..00000000000 --- a/it/it-tests/src/test/java/org/sonarqube/test/Session.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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.sonarqube.test; - -import org.sonarqube.ws.client.WsClient; - -public interface Session { - - WsClient wsClient(); - - GroupTester groups(); - - OrganizationTester organizations(); - - QProfileTester qProfiles(); - - UserTester users(); - -} diff --git a/it/it-tests/src/test/java/org/sonarqube/test/Tester.java b/it/it-tests/src/test/java/org/sonarqube/test/Tester.java deleted file mode 100644 index 9373e82abd9..00000000000 --- a/it/it-tests/src/test/java/org/sonarqube/test/Tester.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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.sonarqube.test; - -import com.sonar.orchestrator.Orchestrator; -import javax.annotation.Nullable; -import org.junit.rules.ExternalResource; -import org.sonarqube.ws.client.WsClient; -import pageobjects.Navigation; -import util.selenium.Selenese; - -import static util.ItUtils.newUserWsClient; - -/** - * This JUnit rule wraps an {@link Orchestrator} instance and provides : - * <ul> - * <li>enabling the organization feature by default</li> - * <li>clean-up of organizations between tests</li> - * <li>clean-up of users between tests</li> - * <li>clean-up of session when opening a browser (cookies, local storage)</li> - * <li>quick access to {@link WsClient} instances</li> - * <li>helpers to generate organizations and users</li> - * </ul> - * - * Recommendation is to define a {@code @Rule} instance. If not possible, then - * {@code @ClassRule} must be used through a {@link org.junit.rules.RuleChain} - * around {@link Orchestrator}. - */ -public class Tester extends ExternalResource implements Session { - - private final Orchestrator orchestrator; - - // configuration before startup - private boolean disableOrganizations = false; - - // initialized in #before() - private boolean beforeCalled = false; - private Session rootSession; - - public Tester(Orchestrator orchestrator) { - this.orchestrator = orchestrator; - } - - public Tester disableOrganizations() { - verifyNotStarted(); - disableOrganizations = true; - return this; - } - - @Override - protected void before() { - verifyNotStarted(); - rootSession = new SessionImpl(orchestrator, "admin", "admin"); - - if (!disableOrganizations) { - organizations().enableSupport(); - } - - beforeCalled = true; - } - - @Override - protected void after() { - if (!disableOrganizations) { - organizations().deleteNonGuardedOrganizations(); - } - users().deleteAll(); - } - - public Session asAnonymous() { - return as(null, null); - } - - public Session as(String login) { - return as(login, login); - } - - public Session as(String login, String password) { - verifyStarted(); - return new SessionImpl(orchestrator, login, password); - } - - /** - * Open a new browser session. Cookies are deleted. - */ - public Navigation openBrowser() { - verifyStarted(); - return Navigation.create(orchestrator); - } - - /** - * @deprecated use Selenide tests with {@link #openBrowser()} - */ - @Deprecated - public Tester runHtmlTests(String... htmlTests) { - Selenese.runSelenese(orchestrator, htmlTests); - return this; - } - - private void verifyNotStarted() { - if (beforeCalled) { - throw new IllegalStateException("Orchestrator should not be already started"); - } - } - - private void verifyStarted() { - if (!beforeCalled) { - throw new IllegalStateException("Orchestrator is not started yet"); - } - } - - /** - * Web service client configured with root access - */ - @Override - public WsClient wsClient() { - verifyStarted(); - return rootSession.wsClient(); - } - - @Override - public GroupTester groups() { - return rootSession.groups(); - } - - @Override - public OrganizationTester organizations() { - return rootSession.organizations(); - } - - @Override - public QProfileTester qProfiles() { - return rootSession.qProfiles(); - } - - @Override - public UserTester users() { - return rootSession.users(); - } - - private static class SessionImpl implements Session { - private final WsClient client; - - private SessionImpl(Orchestrator orchestrator, @Nullable String login, @Nullable String password) { - this.client = newUserWsClient(orchestrator, login, password); - } - - @Override - public WsClient wsClient() { - return client; - } - - @Override - public GroupTester groups() { - return new GroupTester(this); - } - - @Override - public OrganizationTester organizations() { - return new OrganizationTester(this); - } - - @Override - public QProfileTester qProfiles() { - return new QProfileTester(this); - } - - @Override - public UserTester users() { - return new UserTester(this); - } - } -} diff --git a/it/it-tests/src/test/java/org/sonarqube/test/UserTester.java b/it/it-tests/src/test/java/org/sonarqube/test/UserTester.java deleted file mode 100644 index baa2ed31b0b..00000000000 --- a/it/it-tests/src/test/java/org/sonarqube/test/UserTester.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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.sonarqube.test; - -import java.util.List; -import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; -import org.sonarqube.ws.Organizations; -import org.sonarqube.ws.WsUsers; -import org.sonarqube.ws.WsUsers.CreateWsResponse.User; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.user.CreateRequest; -import org.sonarqube.ws.client.user.SearchRequest; -import org.sonarqube.ws.client.user.UsersService; -import org.sonarqube.ws.client.usergroup.AddUserWsRequest; - -import static java.util.Arrays.stream; - -public class UserTester { - - private static final AtomicInteger ID_GENERATOR = new AtomicInteger(); - - private final Session session; - - UserTester(Session session) { - this.session = session; - } - - void deleteAll() { - session.wsClient().users().search(SearchRequest.builder().build()).getUsersList() - .stream() - .filter(u -> !"admin".equals(u.getLogin())) - .forEach(u -> { - PostRequest request = new PostRequest("api/users/deactivate").setParam("login", u.getLogin()); - session.wsClient().wsConnector().call(request); - }); - } - - @SafeVarargs - public final User generate(Consumer<CreateRequest.Builder>... populators) { - int id = ID_GENERATOR.getAndIncrement(); - String login = "login" + id; - CreateRequest.Builder request = CreateRequest.builder() - .setLogin(login) - .setPassword(login) - .setName("name" + id) - .setEmail(id + "@test.com"); - stream(populators).forEach(p -> p.accept(request)); - return service().create(request.build()).getUser(); - } - - @SafeVarargs - public final User generateAdministrator(Consumer<CreateRequest.Builder>... populators) { - User user = generate(populators); - session.wsClient().permissions().addUser(new org.sonarqube.ws.client.permission.AddUserWsRequest().setLogin(user.getLogin()).setPermission("admin")); - session.wsClient().userGroups().addUser(org.sonarqube.ws.client.usergroup.AddUserWsRequest.builder().setLogin(user.getLogin()).setName("sonar-administrators").build()); - return user; - } - - @SafeVarargs - public final User generateAdministrator(Organizations.Organization organization, Consumer<CreateRequest.Builder>... populators) { - User user = generate(populators); - session.wsClient().organizations().addMember(organization.getKey(), user.getLogin()); - session.wsClient().userGroups().addUser(AddUserWsRequest.builder() - .setOrganization(organization.getKey()) - .setLogin(user.getLogin()) - .setName("Owners") - .build()); - return user; - } - - public UsersService service() { - return session.wsClient().users(); - } - - public Optional<WsUsers.SearchWsResponse.User> getByLogin(String login) { - List<WsUsers.SearchWsResponse.User> users = session.wsClient().users().search(SearchRequest.builder().setQuery(login).build()).getUsersList(); - if (users.size() == 1) { - return Optional.of(users.get(0)); - } - return Optional.empty(); - } -} diff --git a/it/it-tests/src/test/java/pageobjects/BackgroundTaskItem.java b/it/it-tests/src/test/java/pageobjects/BackgroundTaskItem.java deleted file mode 100644 index 3cdd14c16b7..00000000000 --- a/it/it-tests/src/test/java/pageobjects/BackgroundTaskItem.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.SelenideElement; - -import static com.codeborne.selenide.Condition.hasText; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; - -public class BackgroundTaskItem { - - private final SelenideElement elt; - - public BackgroundTaskItem(SelenideElement elt) { - this.elt = elt; - } - - public SelenideElement getComponent() { - return elt.$("td:nth-child(2)"); - } - - public BackgroundTaskItem openActions() { - elt.$(".js-task-action > .dropdown-toggle").click(); - elt.$(".js-task-action > .dropdown-menu").shouldBe(visible); - return this; - } - - public BackgroundTaskItem openScannerContext () { - elt.$(".js-task-show-scanner-context").click(); - $(".js-task-scanner-context").shouldBe(visible); - return this; - } - - public BackgroundTaskItem assertScannerContextContains(String text) { - $(".js-task-scanner-context").should(hasText(text)); - return this; - } - - public BackgroundTaskItem openErrorStacktrace () { - elt.$(".js-task-show-stacktrace").click(); - $(".js-task-stacktrace").shouldBe(visible); - return this; - } - - public BackgroundTaskItem assertErrorStacktraceContains(String text) { - $(".js-task-stacktrace").should(hasText(text)); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/BackgroundTasksPage.java b/it/it-tests/src/test/java/pageobjects/BackgroundTasksPage.java deleted file mode 100644 index 8093bcc8a5c..00000000000 --- a/it/it-tests/src/test/java/pageobjects/BackgroundTasksPage.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.ElementsCollection; -import java.util.List; -import java.util.stream.Collectors; -import org.openqa.selenium.By; - -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; - -public class BackgroundTasksPage { - - public BackgroundTasksPage() { - $(By.cssSelector(".background-tasks")).should(exist); - } - - public ElementsCollection getTasks() { - return $$(".background-tasks > tbody > tr"); - } - - public List<BackgroundTaskItem> getTasksAsItems() { - return getTasks() - .stream() - .map(BackgroundTaskItem::new) - .collect(Collectors.toList()); - } -} diff --git a/it/it-tests/src/test/java/pageobjects/EncryptionPage.java b/it/it-tests/src/test/java/pageobjects/EncryptionPage.java deleted file mode 100644 index d601dbac1e0..00000000000 --- a/it/it-tests/src/test/java/pageobjects/EncryptionPage.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.SelenideElement; - -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; - -public class EncryptionPage extends Navigation { - - public EncryptionPage() { - $("#encryption-page").should(exist); - } - - public SelenideElement generationForm() { - return $("#generate-secret-key-form"); - } - - public SelenideElement newSecretKey() { - return $("#secret-key"); - } - - public String encryptValue(String value) { - $("#encryption-form-value").val(value); - $("#encryption-form").submit(); - return $("#encrypted-value").shouldBe(visible).val(); - } - - public EncryptionPage generateNewKey() { - $("#encryption-new-key-form").submit(); - $("#generate-secret-key-form").shouldBe(visible); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/LoginPage.java b/it/it-tests/src/test/java/pageobjects/LoginPage.java deleted file mode 100644 index 88585279333..00000000000 --- a/it/it-tests/src/test/java/pageobjects/LoginPage.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import org.openqa.selenium.By; - -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.page; - -public class LoginPage { - - public LoginPage() { - $("#login_form").should(Condition.exist); - } - - public Navigation submitCredentials(String login) { - return submitCredentials(login, login, Navigation.class); - } - - public Navigation submitCredentials(String login, String password) { - return submitCredentials(login, password, Navigation.class); - } - - public Navigation useOAuth2() { - $(".oauth-providers a").click(); - return page(Navigation.class); - } - - public LoginPage submitWrongCredentials(String login, String password) { - $("#login").val(login); - $("#password").val(password); - $(By.name("commit")).click(); - return page(LoginPage.class); - } - - public SelenideElement getErrorMessage() { - return $(".process-spinner-failed"); - } - - private <T> T submitCredentials(String login, String password, Class<T> expectedResultPage) { - $("#login").val(login); - $("#password").val(password); - $(By.name("commit")).click(); - $("#login").should(Condition.disappear); - return page(expectedResultPage); - } -} diff --git a/it/it-tests/src/test/java/pageobjects/Navigation.java b/it/it-tests/src/test/java/pageobjects/Navigation.java deleted file mode 100644 index c772b79a1c2..00000000000 --- a/it/it-tests/src/test/java/pageobjects/Navigation.java +++ /dev/null @@ -1,234 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.Selenide; -import com.codeborne.selenide.SelenideElement; -import com.codeborne.selenide.WebDriverRunner; -import com.sonar.orchestrator.Orchestrator; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.function.Consumer; -import javax.annotation.Nullable; -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.html5.WebStorage; -import org.sonarqube.test.Tester; -import pageobjects.issues.IssuesPage; -import pageobjects.licenses.LicensesPage; -import pageobjects.organization.MembersPage; -import pageobjects.projects.ProjectsPage; -import pageobjects.settings.SettingsPage; - -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.clearBrowserLocalStorage; -import static com.codeborne.selenide.Selenide.page; - -public class Navigation { - - public Navigation() { - $("#content").shouldBe(Condition.exist); - } - - /** - * @deprecated use {@link Tester#openBrowser()} - */ - @Deprecated - public static Navigation create(Orchestrator orchestrator) { - WebDriver driver = SelenideConfig.configure(orchestrator); - driver.manage().deleteAllCookies(); - clearStorage(d -> d.getLocalStorage().clear()); - clearStorage(d -> d.getSessionStorage().clear()); - clearStorage(d -> clearBrowserLocalStorage()); - return Selenide.open("/", Navigation.class); - } - - private static void clearStorage(Consumer<WebStorage> cleaner) { - try { - cleaner.accept((WebStorage) WebDriverRunner.getWebDriver()); - } catch (Exception e) { - // ignore, it may occur when the first test opens browser. No pages are loaded - // and local/session storages are not available yet. - // Example with Chrome: "Failed to read the 'localStorage' property from 'Window': Storage is disabled inside 'data:' URLs." - } - } - - public Navigation openHome() { - return open("/", Navigation.class); - } - - public ProjectsPage openProjects() { - return open("/projects", ProjectsPage.class); - } - - public ProjectsPage openProjects(String organization) { - return open("/organizations/" + organization + "/projects", ProjectsPage.class); - } - - public IssuesPage openIssues() { - return open("/issues", IssuesPage.class); - } - - public IssuesPage openComponentIssues(String component) { - return open("/component_issues?id=" + component, IssuesPage.class); - } - - public ProjectDashboardPage openProjectDashboard(String projectKey) { - // TODO encode projectKey - String url = "/dashboard?id=" + projectKey; - return open(url, ProjectDashboardPage.class); - } - - public ProjectLinksPage openProjectLinks(String projectKey) { - // TODO encode projectKey - String url = "/project/links?id=" + projectKey; - return open(url, ProjectLinksPage.class); - } - - public ProjectQualityGatePage openProjectQualityGate(String projectKey) { - // TODO encode projectKey - String url = "/project/quality_gate?id=" + projectKey; - return open(url, ProjectQualityGatePage.class); - } - - public ProjectKeyPage openProjectKey(String projectKey) { - // TODO encode projectKey - String url = "/project/key?id=" + projectKey; - return open(url, ProjectKeyPage.class); - } - - public ProjectActivityPage openProjectActivity(String projectKey) { - // TODO encode projectKey - String url = "/project/activity?id=" + projectKey; - return open(url, ProjectActivityPage.class); - } - - public MembersPage openOrganizationMembers(String orgKey) { - String url = "/organizations/" + orgKey + "/members"; - return open(url, MembersPage.class); - } - - public BackgroundTasksPage openBackgroundTasksPage() { - return open("/background_tasks", BackgroundTasksPage.class); - } - - public SettingsPage openSettings(@Nullable String projectKey) throws UnsupportedEncodingException { - String url = projectKey != null ? "/project/settings?id=" + URLEncoder.encode(projectKey, "UTF-8") : "/settings"; - return open(url, SettingsPage.class); - } - - public LicensesPage openLicenses() { - return open("/settings/licenses", LicensesPage.class); - } - - public EncryptionPage openEncryption() { - return open("/settings/encryption", EncryptionPage.class); - } - - public ServerIdPage openServerId() { - return open("/settings/server_id", ServerIdPage.class); - } - - public NotificationsPage openNotifications() { - return open("/account/notifications", NotificationsPage.class); - } - - public ProjectPermissionsPage openProjectPermissions(String projectKey) { - String url = "/project_roles?id=" + projectKey; - return open(url, ProjectPermissionsPage.class); - } - - public ProjectsManagementPage openProjectsManagement() { - return open("/projects_admin", ProjectsManagementPage.class); - } - - public LoginPage openLogin() { - return open("/sessions/login", LoginPage.class); - } - - public void open(String relativeUrl) { - Selenide.open(relativeUrl); - } - - public <P> P open(String relativeUrl, Class<P> pageObjectClassClass) { - return Selenide.open(relativeUrl, pageObjectClassClass); - } - - public Navigation shouldBeLoggedIn() { - loggedInDropdown().should(Condition.visible); - return this; - } - - public Navigation shouldNotBeLoggedIn() { - logInLink().should(Condition.visible); - return this; - } - - public LoginPage logIn() { - logInLink().click(); - return Selenide.page(LoginPage.class); - } - - public Navigation logOut() { - SelenideElement dropdown = loggedInDropdown(); - // click must be on the <a> but not on the dropdown <li> - // for compatibility with phantomjs - dropdown.find(".dropdown-toggle").click(); - dropdown.find(By.linkText("Log out")).click(); - return this; - } - - public RulesPage clickOnRules() { - $(By.linkText("Rules")).click(); - return page(RulesPage.class); - } - - public SelenideElement clickOnQualityProfiles() { - return $(By.linkText("Quality Profiles")); - } - - public SelenideElement getRightBar() { - return $("#global-navigation .navbar-right"); - } - - public SelenideElement getFooter() { - return $("#footer"); - } - - public SelenideElement getErrorMessage() { - return $("#error"); - } - - private SelenideElement logInLink() { - return $(By.linkText("Log in")); - } - - private SelenideElement loggedInDropdown() { - return $(".js-user-authenticated"); - } - - public Navigation shouldBeRedirectedToLogin() { - $("#login_form").should(visible); - return this; - } - -} diff --git a/it/it-tests/src/test/java/pageobjects/NotificationsPage.java b/it/it-tests/src/test/java/pageobjects/NotificationsPage.java deleted file mode 100644 index 61704e7a88f..00000000000 --- a/it/it-tests/src/test/java/pageobjects/NotificationsPage.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import static com.codeborne.selenide.Condition.cssClass; -import static com.codeborne.selenide.Condition.text; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; - -public class NotificationsPage extends Navigation { - - private final String EMAIL = "EmailNotificationChannel"; - - public NotificationsPage() { - $("#account-page").shouldHave(text("Overall notifications")); - } - - public NotificationsPage shouldHaveGlobalNotification(String type) { - return shouldHaveGlobalNotification(type, EMAIL); - } - - public NotificationsPage shouldHaveGlobalNotification(String type, String channel) { - return shouldBeChecked(globalCheckboxSelector(type, channel)); - } - - public NotificationsPage shouldNotHaveGlobalNotification(String type) { - return shouldNotHaveGlobalNotification(type, EMAIL); - } - - public NotificationsPage shouldNotHaveGlobalNotification(String type, String channel) { - return shouldNotBeChecked(globalCheckboxSelector(type, channel)); - } - - public NotificationsPage shouldHaveProjectNotification(String project, String type, String channel) { - return shouldBeChecked(projectCheckboxSelector(project, type, channel)); - } - - public NotificationsPage shouldNotHaveProjectNotification(String project, String type, String channel) { - return shouldNotBeChecked(projectCheckboxSelector(project, type, channel)); - } - - public NotificationsPage addGlobalNotification(String type) { - return addGlobalNotification(type, EMAIL); - } - - public NotificationsPage addGlobalNotification(String type, String channel) { - shouldNotHaveGlobalNotification(type, channel); - toggleCheckbox(globalCheckboxSelector(type, channel)); - shouldHaveGlobalNotification(type, channel); - return this; - } - - public NotificationsPage removeGlobalNotification(String type) { - return removeGlobalNotification(type, EMAIL); - } - - public NotificationsPage removeGlobalNotification(String type, String channel) { - shouldHaveGlobalNotification(type, channel); - toggleCheckbox(globalCheckboxSelector(type, channel)); - shouldNotHaveGlobalNotification(type, channel); - return this; - } - - public NotificationsPage addProjectNotification(String project, String type, String channel) { - shouldNotHaveProjectNotification(project, type, channel); - toggleCheckbox(projectCheckboxSelector(project, type, channel)); - shouldHaveProjectNotification(project, type, channel); - return this; - } - - public NotificationsPage removeProjectNotification(String project, String type, String channel) { - shouldHaveProjectNotification(project, type, channel); - toggleCheckbox(projectCheckboxSelector(project, type, channel)); - shouldNotHaveProjectNotification(project, type, channel); - return this; - } - - private String globalCheckboxSelector(String type, String channel) { - return "#global-notification-" + type + "-" + channel; - } - - private String projectCheckboxSelector(String project, String type, String channel) { - return "#project-notification-" + project + "-" + type + "-" + channel; - } - - private NotificationsPage shouldBeChecked(String selector) { - $(selector) - .shouldBe(visible) - .shouldHave(cssClass("icon-checkbox-checked")); - return this; - } - - private NotificationsPage shouldNotBeChecked(String selector) { - $(selector) - .shouldBe(visible) - .shouldNotHave(cssClass("icon-checkbox-checked")); - return this; - } - - private void toggleCheckbox(String selector) { - $(selector).click(); - } -} diff --git a/it/it-tests/src/test/java/pageobjects/ProjectActivityPage.java b/it/it-tests/src/test/java/pageobjects/ProjectActivityPage.java deleted file mode 100644 index edf6692ff8a..00000000000 --- a/it/it-tests/src/test/java/pageobjects/ProjectActivityPage.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.ElementsCollection; -import java.util.List; -import java.util.stream.Collectors; - -import static com.codeborne.selenide.Condition.hasText; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; - -public class ProjectActivityPage { - - public ProjectActivityPage() { - $("#project-activity").should(Condition.exist); - } - - public ElementsCollection getAnalyses() { - return $$(".project-activity-analysis"); - } - - public List<ProjectAnalysisItem> getAnalysesAsItems() { - return getAnalyses() - .stream() - .map(ProjectAnalysisItem::new) - .collect(Collectors.toList()); - } - - public ProjectAnalysisItem getLastAnalysis() { - return new ProjectAnalysisItem($(".project-activity-analysis")); - } - - public ProjectAnalysisItem getFirstAnalysis() { - return new ProjectAnalysisItem($$(".project-activity-analysis").last()); - } - - public ProjectActivityPage assertFirstAnalysisOfTheDayHasText(String day, String text) { - $("#project-activity") - .find(".project-activity-day[data-day=\"" + day + "\"]") - .find(".project-activity-analysis") - .should(hasText(text)); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/ProjectAnalysisItem.java b/it/it-tests/src/test/java/pageobjects/ProjectAnalysisItem.java deleted file mode 100644 index e4e4de006ec..00000000000 --- a/it/it-tests/src/test/java/pageobjects/ProjectAnalysisItem.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; - -import static com.codeborne.selenide.Condition.text; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; - -public class ProjectAnalysisItem { - - private final SelenideElement elt; - - public ProjectAnalysisItem(SelenideElement elt) { - this.elt = elt; - } - - public ProjectAnalysisItem shouldHaveEventWithText(String text) { - elt.find(".project-activity-events").shouldHave(Condition.text(text)); - return this; - } - - public ProjectAnalysisItem shouldHaveDeleteButton() { - elt.find(".js-delete-analysis").shouldBe(visible); - return this; - } - - public ProjectAnalysisItem shouldNotHaveDeleteButton() { - elt.find(".js-delete-analysis").shouldNotBe(visible); - return this; - } - - public void delete() { - elt.find(".js-delete-analysis").click(); - - SelenideElement modal = $(".modal"); - modal.shouldBe(visible); - modal.find("button[type=\"submit\"]").click(); - - elt.shouldNotBe(visible); - } - - public ProjectAnalysisItem addCustomEvent(String name) { - elt.find(".js-create").click(); - elt.find(".js-add-event").click(); - - SelenideElement modal = $(".modal"); - modal.shouldBe(visible); - modal.find("input").setValue(name); - modal.find("button[type=\"submit\"]").click(); - - elt.find(".project-activity-event:last-child").shouldHave(text(name)); - - return this; - } - - public ProjectAnalysisItem changeLastEvent(String newName) { - SelenideElement lastEvent = elt.find(".project-activity-event:last-child"); - lastEvent.find(".js-change-event").click(); - - SelenideElement modal = $(".modal"); - modal.shouldBe(visible); - modal.find("input").setValue(newName); - modal.find("button[type=\"submit\"]").click(); - - lastEvent.shouldHave(text(newName)); - - return this; - } - - public ProjectAnalysisItem deleteLastEvent() { - int eventsCount = elt.findAll(".project-activity-event").size(); - - SelenideElement lastEvent = elt.find(".project-activity-event:last-child"); - lastEvent.find(".js-delete-event").click(); - - SelenideElement modal = $(".modal"); - modal.shouldBe(visible); - modal.find("button[type=\"submit\"]").click(); - - elt.findAll(".project-activity-event").shouldHaveSize(eventsCount - 1); - - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/ProjectDashboardPage.java b/it/it-tests/src/test/java/pageobjects/ProjectDashboardPage.java deleted file mode 100644 index 0bb44703f64..00000000000 --- a/it/it-tests/src/test/java/pageobjects/ProjectDashboardPage.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.SelenideElement; -import java.util.Arrays; -import java.util.List; - -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.hasText; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; - -public class ProjectDashboardPage { - - public ProjectDashboardPage() { - $(".overview").shouldBe(visible); - } - - public SelenideElement getLinesOfCode() { - SelenideElement element = $("#overview-ncloc"); - element.shouldBe(visible); - return element; - } - - public SelenideElement getLanguageDistribution() { - SelenideElement element = $("#overview-language-distribution"); - element.shouldBe(visible); - return element; - } - - private SelenideElement getTagsMeta() { - SelenideElement element = $(".overview-meta-tags"); - element.shouldBe(visible); - return element; - } - - public ProjectDashboardPage shouldHaveTags(String... tags) { - String tagsList = String.join(", ", Arrays.asList(tags)); - this.getTagsMeta().$(".tags-list > span").should(hasText(tagsList)); - return this; - } - - public ProjectDashboardPage shouldNotBeEditable() { - SelenideElement tagsElem = this.getTagsMeta(); - tagsElem.$("button").shouldNot(exist); - tagsElem.$("div.multi-select").shouldNot(exist); - return this; - } - - public ProjectDashboardPage shouldBeEditable() { - SelenideElement tagsElem = this.getTagsMeta(); - tagsElem.$("button").shouldBe(visible); - return this; - } - - public ProjectDashboardPage openTagEditor() { - SelenideElement tagsElem = this.getTagsMeta(); - tagsElem.$("button").shouldBe(visible).click(); - tagsElem.$("div.multi-select").shouldBe(visible); - return this; - } - - public SelenideElement getTagAtIdx(Integer idx) { - SelenideElement tagsElem = this.getTagsMeta(); - tagsElem.$("div.multi-select").shouldBe(visible); - return tagsElem.$$("ul.menu a").get(idx); - } - - public ProjectDashboardPage sendKeysToTagsInput(CharSequence... charSequences) { - SelenideElement tagsInput = this.getTagsMeta().find("input"); - tagsInput.sendKeys(charSequences); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/ProjectKeyPage.java b/it/it-tests/src/test/java/pageobjects/ProjectKeyPage.java deleted file mode 100644 index fa5c9b03097..00000000000 --- a/it/it-tests/src/test/java/pageobjects/ProjectKeyPage.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.SelenideElement; - -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.hasText; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; - -public class ProjectKeyPage { - - public ProjectKeyPage() { - $("#project-key").should(exist); - } - - public ProjectKeyPage assertSimpleUpdate() { - $("#update-key-new-key").shouldBe(visible); - $("#update-key-submit").shouldBe(visible); - return this; - } - - public ProjectKeyPage trySimpleUpdate(String newKey) { - $("#update-key-new-key").val(newKey); - $("#update-key-submit").click(); - $("#update-key-confirm").click(); - return this; - } - - public ProjectKeyPage openFineGrainedUpdate() { - $("#update-key-tab-fine").click(); - $("#project-key-fine-grained-update").shouldBe(visible); - return this; - } - - public ProjectKeyPage tryFineGrainedUpdate(String key, String newKey) { - SelenideElement form = $(".js-fine-grained-update[data-key=\"" + key + "\"]"); - form.shouldBe(visible); - - form.$("input").val(newKey); - form.$("button").click(); - - $("#update-key-confirm").click(); - return this; - } - - public ProjectKeyPage assertBulkChange() { - $("#bulk-update-replace").shouldBe(visible); - $("#bulk-update-by").shouldBe(visible); - $("#bulk-update-see-results").shouldBe(visible); - return this; - } - - public ProjectKeyPage simulateBulkChange(String replace, String by) { - $("#bulk-update-replace").val(replace); - $("#bulk-update-by").val(by); - $("#bulk-update-see-results").click(); - - $("#bulk-update-simulation").shouldBe(visible); - return this; - } - - public ProjectKeyPage assertBulkChangeSimulationResult(String oldKey, String newKey) { - SelenideElement row = $("#bulk-update-results").$("[data-key=\"" + oldKey + "\"]"); - row.$(".js-old-key").should(hasText(oldKey)); - row.$(".js-new-key").should(hasText(newKey)); - return this; - } - - public ProjectKeyPage assertDuplicated(String oldKey) { - SelenideElement row = $("#bulk-update-results").$("[data-key=\"" + oldKey + "\"]"); - row.$(".js-new-key").$(".badge-danger").shouldBe(visible); - return this; - } - - public ProjectKeyPage confirmBulkUpdate() { - $("#bulk-update-confirm").click(); - return this; - } - - public ProjectKeyPage assertSuccessfulBulkUpdate() { - $("#project-key-bulk-update").$(".alert.alert-success").shouldBe(visible); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/ProjectLinkItem.java b/it/it-tests/src/test/java/pageobjects/ProjectLinkItem.java deleted file mode 100644 index 119b2c1872b..00000000000 --- a/it/it-tests/src/test/java/pageobjects/ProjectLinkItem.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.SelenideElement; -import org.openqa.selenium.NoSuchElementException; - -public class ProjectLinkItem { - - private final SelenideElement elt; - - public ProjectLinkItem(SelenideElement elt) { - this.elt = elt; - } - - public SelenideElement getName() { - return elt.$(".js-name"); - } - - public SelenideElement getType() { - try { - return elt.$(".js-type"); - } catch (NoSuchElementException e) { - return null; - } - } - - public SelenideElement getUrl() { - return elt.$(".js-url"); - } - - public SelenideElement getDeleteButton() { - return elt.$(".js-delete-button"); - } -} diff --git a/it/it-tests/src/test/java/pageobjects/ProjectLinksPage.java b/it/it-tests/src/test/java/pageobjects/ProjectLinksPage.java deleted file mode 100644 index 2b0642cc121..00000000000 --- a/it/it-tests/src/test/java/pageobjects/ProjectLinksPage.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.ElementsCollection; - -import java.util.List; -import java.util.stream.Collectors; - -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; - -public class ProjectLinksPage { - - public ProjectLinksPage() { - $("#project-links").should(Condition.exist); - } - - public ElementsCollection getLinks() { - return $$("#project-links tr[data-name]"); - } - - public List<ProjectLinkItem> getLinksAsItems() { - return getLinks() - .stream() - .map(ProjectLinkItem::new) - .collect(Collectors.toList()); - } -} diff --git a/it/it-tests/src/test/java/pageobjects/ProjectPermissionsPage.java b/it/it-tests/src/test/java/pageobjects/ProjectPermissionsPage.java deleted file mode 100644 index 2bb8a07ba89..00000000000 --- a/it/it-tests/src/test/java/pageobjects/ProjectPermissionsPage.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import static com.codeborne.selenide.Condition.cssClass; -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; - -public class ProjectPermissionsPage { - - public ProjectPermissionsPage() { - $("#project-permissions-page").should(exist); - } - - public ProjectPermissionsPage shouldBePublic() { - $("#visibility-public .icon-radio.is-checked").shouldBe(visible); - return this; - } - - public ProjectPermissionsPage shouldBePrivate() { - $("#visibility-private .icon-radio.is-checked").shouldBe(visible); - return this; - } - - public ProjectPermissionsPage turnToPublic() { - $("#visibility-public").click(); - $("#confirm-turn-to-public").click(); - shouldBePublic(); - return this; - } - - public ProjectPermissionsPage turnToPrivate() { - $("#visibility-private").click(); - shouldBePrivate(); - return this; - } - - public ProjectPermissionsPage shouldNotAllowPrivate() { - $("#visibility-private").shouldHave(cssClass("text-muted")); - $(".upgrade-organization-box").shouldBe(visible); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/ProjectQualityGatePage.java b/it/it-tests/src/test/java/pageobjects/ProjectQualityGatePage.java deleted file mode 100644 index e582a70b4d3..00000000000 --- a/it/it-tests/src/test/java/pageobjects/ProjectQualityGatePage.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.SelenideElement; - -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Selenide.$; - -public class ProjectQualityGatePage { - - public ProjectQualityGatePage() { - $("#project-quality-gate").should(exist); - } - - public SelenideElement getSelectedQualityGate() { - return $(".Select-value-label"); - } - - public void assertNotSelected() { - $(".Select-placeholder").should(exist); - $(".Select-value-label").shouldNot(exist); - } - - public void setQualityGate(String name) { - $(".Select-input input").val(name).pressEnter(); - } -} diff --git a/it/it-tests/src/test/java/pageobjects/ProjectsManagementPage.java b/it/it-tests/src/test/java/pageobjects/ProjectsManagementPage.java deleted file mode 100644 index 2a937338dfa..00000000000 --- a/it/it-tests/src/test/java/pageobjects/ProjectsManagementPage.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.text; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; - -public class ProjectsManagementPage { - - public ProjectsManagementPage() { - $("#projects-management-page").should(exist); - } - - public ProjectsManagementPage shouldHaveProjectsCount(int count) { - $$("#projects-management-page-projects tr").shouldHaveSize(count); - return this; - } - - public ProjectsManagementPage shouldHaveProject(String key) { - $("#projects-management-page-projects").shouldHave(text(key)); - return this; - } - - public ProjectsManagementPage createProject(String key, String name, String visibility) { - $("#create-project").click(); - $("#create-project-name").val(key); - $("#create-project-key").val(name); - $("#visibility-" + visibility).click(); - $("#create-project-submit").submit(); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/RuleItem.java b/it/it-tests/src/test/java/pageobjects/RuleItem.java deleted file mode 100644 index 9fe179d829e..00000000000 --- a/it/it-tests/src/test/java/pageobjects/RuleItem.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.SelenideElement; - -public class RuleItem { - - private final SelenideElement elt; - - public RuleItem(SelenideElement elt) { - this.elt = elt; - } - - public SelenideElement getTitle() { - return elt.$(".coding-rule-title"); - } - - public SelenideElement getMetadata() { - return elt.$(".coding-rule-meta"); - } - - -} diff --git a/it/it-tests/src/test/java/pageobjects/RulesPage.java b/it/it-tests/src/test/java/pageobjects/RulesPage.java deleted file mode 100644 index ee90dd59849..00000000000 --- a/it/it-tests/src/test/java/pageobjects/RulesPage.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.ElementsCollection; -import java.util.List; -import java.util.stream.Collectors; -import org.openqa.selenium.By; - -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; - -public class RulesPage extends Navigation { - - public RulesPage() { - $(By.cssSelector(".coding-rules")).should(Condition.exist); - } - - public ElementsCollection getRules() { - return $$(".coding-rules .coding-rule"); - } - - public List<RuleItem> getRulesAsItems() { - return getRules() - .stream() - .map(elt -> new RuleItem(elt)) - .collect(Collectors.toList()); - } - - public int getTotal() { - // warning - number is localized - return Integer.parseInt($("#coding-rules-total").text()); - } -} diff --git a/it/it-tests/src/test/java/pageobjects/SelenideConfig.java b/it/it-tests/src/test/java/pageobjects/SelenideConfig.java deleted file mode 100644 index e03561fc867..00000000000 --- a/it/it-tests/src/test/java/pageobjects/SelenideConfig.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.Configuration; -import com.codeborne.selenide.WebDriverRunner; -import com.sonar.orchestrator.Orchestrator; -import java.util.stream.Collectors; -import org.openqa.selenium.WebDriver; - -import static java.util.Arrays.stream; - -public class SelenideConfig { - - private enum Browser { - firefox("(v46 and lower)"), - marionette("(recent Firefox, require Geckodriver)"), - chrome("(require Chromedriver)"); - - private final String label; - - Browser(String label) { - this.label = label; - } - - static Browser of(String s) { - try { - return Browser.valueOf(s); - } catch (Exception e) { - throw new IllegalArgumentException("Invalid browser: " + s + ". Supported values are " + - stream(values()).map(b -> b.name() + " " + b.label).collect(Collectors.joining(", "))); - } - } - } - - public static WebDriver configure(Orchestrator orchestrator) { - String browserKey = orchestrator.getConfiguration().getString("orchestrator.browser", Browser.firefox.name()); - Browser browser = Browser.of(browserKey); - Configuration.browser = browser.name(); - Configuration.baseUrl = orchestrator.getServer().getUrl(); - Configuration.timeout = 8_000; - Configuration.reportsFolder = "target/screenshots"; - Configuration.screenshots = true; - Configuration.captureJavascriptErrors = true; - Configuration.savePageSource = true; - Configuration.browserSize = "1280x1024"; - return getWebDriver(); - } - - static WebDriver getWebDriver() { - return WebDriverRunner.getWebDriver(); - } -} diff --git a/it/it-tests/src/test/java/pageobjects/ServerIdPage.java b/it/it-tests/src/test/java/pageobjects/ServerIdPage.java deleted file mode 100644 index d556181b67b..00000000000 --- a/it/it-tests/src/test/java/pageobjects/ServerIdPage.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects; - -import com.codeborne.selenide.SelenideElement; - -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; - -public class ServerIdPage { - - public ServerIdPage() { - $("#server-id-page").shouldBe(visible); - } - - public SelenideElement serverIdInput() { - return $("#server-id-result").shouldBe(visible); - } - - private SelenideElement organizationInput() { - return $("#server-id-organization").shouldBe(visible); - } - - private SelenideElement ipAddressInput() { - return $("#server-id-ip").shouldBe(visible); - } - - public ServerIdPage assertError() { - $(".process-spinner-failed").shouldBe(visible); - return this; - } - - public ServerIdPage setOrganization(String organization) { - organizationInput().val(organization); - return this; - } - - public ServerIdPage setIpAddress(String ipAddress) { - ipAddressInput().val(ipAddress); - return this; - } - - public ServerIdPage submitForm() { - $("#server-id-form").submit(); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/issues/Issue.java b/it/it-tests/src/test/java/pageobjects/issues/Issue.java deleted file mode 100644 index 0781ae0c021..00000000000 --- a/it/it-tests/src/test/java/pageobjects/issues/Issue.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects.issues; - -import com.codeborne.selenide.SelenideElement; - -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; - -public class Issue { - - private final SelenideElement elt; - - public Issue(SelenideElement elt) { - this.elt = elt; - } - - public Issue shouldAllowAssign() { - elt.find(".js-issue-assign").shouldBe(visible); - return this; - } - - public Issue shouldAllowChangeType() { - elt.find(".js-issue-set-type").shouldBe(visible); - return this; - } - - public Issue shouldNotAllowAssign() { - elt.find(".js-issue-assign").shouldNotBe(visible); - return this; - } - - public Issue shouldNotAllowChangeType() { - elt.find(".js-issue-set-type").shouldNotBe(visible); - return this; - } - - public Issue assigneeSearchResultCount(String query, Integer count) { - SelenideElement assignLink = elt.find(".js-issue-assign"); - assignLink.click(); - SelenideElement popupMenu = $(".bubble-popup ul.menu").shouldBe(visible); - $(".bubble-popup input.search-box-input").shouldBe(visible).val("").sendKeys(query); - popupMenu.$("li a[data-text='Not assigned']").shouldNot(exist); - popupMenu.$$("li").shouldHaveSize(count); - assignLink.click(); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/issues/IssuesPage.java b/it/it-tests/src/test/java/pageobjects/issues/IssuesPage.java deleted file mode 100644 index 33972cc2823..00000000000 --- a/it/it-tests/src/test/java/pageobjects/issues/IssuesPage.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects.issues; - -import com.codeborne.selenide.ElementsCollection; -import java.util.List; -import java.util.stream.Collectors; - -import static com.codeborne.selenide.CollectionCondition.sizeGreaterThan; -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; - -public class IssuesPage { - - public IssuesPage() { - $(".issues").should(exist); - } - - private ElementsCollection getIssuesElements() { - return $$(".issues .issue"); - } - - public List<Issue> getIssues() { - return getIssuesElements() - .stream() - .map(Issue::new) - .collect(Collectors.toList()); - } - - public Issue getFirstIssue() { - getIssuesElements().shouldHave(sizeGreaterThan(0)); - return new Issue(getIssuesElements().first()); - } - - public IssuesPage bulkChangeOpen() { - $("#issues-bulk-change").shouldBe(visible).click(); - $("#bulk-change-form").shouldBe(visible); - return this; - } - - public IssuesPage bulkChangeAssigneeSearchCount(String query, Integer count) { - $("#issues-bulk-change-assignee .Select-input input").val(query); - $$("#issues-bulk-change-assignee .Select-option").shouldHaveSize(count); - $("#issues-bulk-change-assignee .Select-input input").pressEscape(); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/licenses/LicenseItem.java b/it/it-tests/src/test/java/pageobjects/licenses/LicenseItem.java deleted file mode 100644 index aaa390ac238..00000000000 --- a/it/it-tests/src/test/java/pageobjects/licenses/LicenseItem.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects.licenses; - -import com.codeborne.selenide.SelenideElement; - -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; - -public class LicenseItem { - - private final SelenideElement elt; - - public LicenseItem(SelenideElement elt) { - this.elt = elt; - } - - public SelenideElement getName() { - return elt.find(".js-product"); - } - - public LicenseItem setLicense(String value) { - elt.find(".js-change").click(); - $("#license-input").shouldBe(visible).val(value); - $(".js-modal-submit").click(); - $("#license-input").shouldNotBe(visible); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/licenses/LicensesPage.java b/it/it-tests/src/test/java/pageobjects/licenses/LicensesPage.java deleted file mode 100644 index 393347b4d65..00000000000 --- a/it/it-tests/src/test/java/pageobjects/licenses/LicensesPage.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects.licenses; - -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.SelenideElement; -import java.util.List; -import java.util.stream.Collectors; - -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; - -public class LicensesPage { - - public LicensesPage() { - $("#licenses-page").shouldBe(visible); - } - - public ElementsCollection getLicenses() { - return $$(".js-license"); - } - - public List<LicenseItem> getLicensesAsItems() { - return getLicenses() - .stream() - .map(LicenseItem::new) - .collect(Collectors.toList()); - } - - public LicenseItem getLicenseByKey(String key) { - SelenideElement element = $(".js-license[data-license-key=\"" + key + "\"]"); - return new LicenseItem(element); - } -} diff --git a/it/it-tests/src/test/java/pageobjects/organization/MemberItem.java b/it/it-tests/src/test/java/pageobjects/organization/MemberItem.java deleted file mode 100644 index 436637d489f..00000000000 --- a/it/it-tests/src/test/java/pageobjects/organization/MemberItem.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects.organization; - -import com.codeborne.selenide.CollectionCondition; -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.SelenideElement; - -import static com.codeborne.selenide.Selenide.$; - -public class MemberItem { - private final SelenideElement elt; - - public MemberItem(SelenideElement elt) { - this.elt = elt; - } - - public MemberItem shouldBeNamed(String login, String name) { - ElementsCollection tds = this.elt.$$("td"); - tds.get(1).$("strong").shouldHave(Condition.text(name)); - tds.get(1).$("span").shouldHave(Condition.text(login)); - return this; - } - - public MemberItem shouldHaveGroups(Integer groups) { - ElementsCollection tds = this.elt.$$("td"); - tds.get(2).should(Condition.exist); - tds.get(2).shouldHave(Condition.text(groups.toString())); - return this; - } - - public MemberItem shouldNotHaveActions() { - this.elt.$$("td").shouldHave(CollectionCondition.sizeLessThan(3)); - return this; - } - - public MemberItem removeMembership() { - ElementsCollection tds = this.elt.$$("td"); - tds.shouldHave(CollectionCondition.sizeGreaterThan(3)); - SelenideElement actionTd = tds.get(3); - actionTd.$("button").should(Condition.exist).click(); - actionTd.$$(".dropdown-menu > li").get(2).shouldBe(Condition.visible).click(); - SelenideElement modal = getModal("Remove user"); - modal.$("button.button-red").shouldBe(Condition.visible).click(); - return this; - } - - public MemberItem manageGroupsOpen() { - ElementsCollection tds = this.elt.$$("td"); - tds.shouldHave(CollectionCondition.sizeGreaterThan(3)); - SelenideElement actionTd = tds.get(3); - actionTd.$("button").should(Condition.exist).click(); - actionTd.$$(".dropdown-menu > li").get(0).shouldBe(Condition.visible).click(); - getModal("Manage groups"); - return this; - } - - public MemberItem manageGroupsSelect(String group) { - SelenideElement modal = getModal("Manage groups"); - modal.$$("li").find(Condition.text(group)).shouldBe(Condition.visible).click(); - return this; - } - - public MemberItem manageGroupsSave() { - SelenideElement modal = getModal("Manage groups"); - modal.$("button[type='submit']").shouldBe(Condition.visible).click(); - return this; - } - - private SelenideElement getModal(String title) { - $(".modal-head").should(Condition.exist).shouldHave(Condition.text(title)); - SelenideElement form = $(".ReactModalPortal form"); - form.should(Condition.exist); - return form; - } -}
\ No newline at end of file diff --git a/it/it-tests/src/test/java/pageobjects/organization/MembersPage.java b/it/it-tests/src/test/java/pageobjects/organization/MembersPage.java deleted file mode 100644 index 56030c62133..00000000000 --- a/it/it-tests/src/test/java/pageobjects/organization/MembersPage.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects.organization; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.SelenideElement; - -import static com.codeborne.selenide.Condition.text; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; - -public class MembersPage { - - public MembersPage() { - $(".nav-tabs a.active").shouldBe(visible).shouldHave(Condition.text("Members")); - } - - public ElementsCollection getMembers() { - return $$("table.data tr"); - } - - public MemberItem getMembersByIdx(Integer idx) { - return new MemberItem(getMembers().get(idx)); - } - - public MembersPage shouldHaveTotal(int total) { - $(".panel-vertical > span > strong").shouldHave(text(String.valueOf(total))); - return this; - } - - public MembersPage searchForMember(String query) { - $("input.search-box-input").shouldBe(Condition.visible).val("").sendKeys(query); - return this; - } - - public MembersPage canAddMember() { - $(".page-actions").shouldBe(Condition.visible); - return this; - } - - public MembersPage canNotAddMember() { - $(".page-actions").shouldNot(Condition.exist); - return this; - } - - public MembersPage addMember(String login) { - this.canAddMember(); - $(".page-actions button").click(); - - SelenideElement modal = this.getModal("Add user"); - SelenideElement input = modal.$(".Select-input input"); - input.val(login); - modal.$("div.Select-option.is-focused").should(Condition.exist); - input.pressEnter(); - modal.$("button[type='submit']").click(); - return this; - } - - private SelenideElement getModal(String title) { - $(".modal-head").should(Condition.exist).shouldHave(Condition.text(title)); - SelenideElement form = $(".ReactModalPortal form"); - form.should(Condition.exist); - return form; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/projects/FacetItem.java b/it/it-tests/src/test/java/pageobjects/projects/FacetItem.java deleted file mode 100644 index 52f0f5bb70f..00000000000 --- a/it/it-tests/src/test/java/pageobjects/projects/FacetItem.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects.projects; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.SelenideElement; -import org.openqa.selenium.WebElement; - -public class FacetItem { - - private final SelenideElement elt; - - public FacetItem(SelenideElement elt) { - this.elt = elt; - } - - public FacetItem shouldHaveValue(String key, String value) { - this.elt.$(".facet[data-key=\"" + key + "\"] .facet-stat").shouldHave(Condition.text(value)); - return this; - } - - public void selectValue(String key) { - this.elt.$(".facet[data-key=\"" + key + "\"]").click(); - } - - public FacetItem selectOptionItem(String value) { - SelenideElement selectInput = this.elt.$(".Select-input input"); - selectInput.val(value); - this.elt.$("div.Select-option.is-focused").should(Condition.exist); - selectInput.pressEnter(); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/projects/ProjectItem.java b/it/it-tests/src/test/java/pageobjects/projects/ProjectItem.java deleted file mode 100644 index fc6cb1fb0dd..00000000000 --- a/it/it-tests/src/test/java/pageobjects/projects/ProjectItem.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects.projects; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; - -public class ProjectItem { - - private final SelenideElement elt; - - public ProjectItem(SelenideElement elt) { - this.elt = elt; - } - - public ProjectItem shouldHaveMeasure(String metricKey, String value) { - this.elt.$(".project-card-measure[data-key=\"" + metricKey + "\"]").shouldHave(Condition.text(value)); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/projects/ProjectsPage.java b/it/it-tests/src/test/java/pageobjects/projects/ProjectsPage.java deleted file mode 100644 index 66bc7e5fda4..00000000000 --- a/it/it-tests/src/test/java/pageobjects/projects/ProjectsPage.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects.projects; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.SelenideElement; - -import static com.codeborne.selenide.Condition.text; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; -import static com.codeborne.selenide.WebDriverRunner.url; -import static org.assertj.core.api.Assertions.assertThat; - -public class ProjectsPage { - - public ProjectsPage() { - $("#projects-page").shouldBe(visible); - } - - public ElementsCollection getProjects() { - return $$(".projects-list > .boxed-group"); - } - - public ElementsCollection getFacets() { - return $$(".search-navigator-facet-box"); - } - - public ProjectItem getProjectByKey(String projectKey) { - SelenideElement element = getProjects().find(Condition.attribute("data-key", projectKey)); - return new ProjectItem(element); - } - - public ProjectItem getProjectByIdx(Integer idx) { - return new ProjectItem(getProjects().get(idx)); - } - - public FacetItem getFacetByProperty(String facetProperty) { - SelenideElement element = getFacets().find(Condition.attribute("data-key", facetProperty)); - return new FacetItem(element); - } - - public ProjectsPage shouldHaveTotal(int total) { - // warning - number is localized - $("#projects-total").shouldHave(text(String.valueOf(total))); - return this; - } - - public ProjectsPage shouldDisplayAllProjects() { - assertThat(url()).endsWith("/projects"); - return this; - } - - public ProjectsPage shouldDisplayAllProjectsWidthSort(String sort) { - assertThat(url()).endsWith("/projects?sort=" + sort); - return this; - } - - public ProjectsPage shouldDisplayFavoriteProjects() { - assertThat(url()).endsWith("/projects/favorite"); - return this; - } - - public ProjectsPage selectAllProjects() { - $("#all-projects").click(); - return shouldDisplayAllProjects(); - } - - public ProjectsPage selectFavoriteProjects() { - $("#favorite-projects").click(); - return shouldDisplayFavoriteProjects(); - } - - public ProjectsPage searchProject(String search) { - SelenideElement searchInput = $(".projects-topbar-item-search input"); - searchInput.setValue("").sendKeys(search); - return this; - } - - public ProjectsPage changePerspective(String perspective) { - SelenideElement sortSelect = getOpenTopBar().$(".js-projects-perspective-select"); - sortSelect.$(".Select-value").should(Condition.exist).click(); - sortSelect.$(".Select-option[title='" + perspective + "']").should(Condition.exist).click(); - return this; - } - - public ProjectsPage sortProjects(String sort) { - SelenideElement sortSelect = getOpenTopBar().$(".js-projects-sorting-select"); - sortSelect.$(".Select-value").should(Condition.exist).click(); - sortSelect.$(".Select-option[title='" + sort + "']").should(Condition.exist).click(); - return this; - } - - public ProjectsPage invertSorting() { - getOpenTopBar().$(".js-projects-sorting-select a.button-icon").should(Condition.exist).click(); - return this; - } - - private SelenideElement getOpenTopBar() { - return $(".projects-topbar-items").should(Condition.exist); - } -} diff --git a/it/it-tests/src/test/java/pageobjects/settings/PropertySetInput.java b/it/it-tests/src/test/java/pageobjects/settings/PropertySetInput.java deleted file mode 100644 index fde30b15c38..00000000000 --- a/it/it-tests/src/test/java/pageobjects/settings/PropertySetInput.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects.settings; - -import com.codeborne.selenide.SelenideElement; - -import static com.codeborne.selenide.Condition.exist; - -public class PropertySetInput { - - private final SelenideElement elt; - - public PropertySetInput(SelenideElement elt) { - this.elt = elt; - } - - public PropertySetInput setFieldValue(int index, String fieldKey, String value) { - elt.findAll("input[name$=\"[" + fieldKey + "]\"]").get(index).val(value); - return this; - } - - public PropertySetInput setFieldValue(String fieldKey, String value) { - return setFieldValue(0, fieldKey, value); - } - - public PropertySetInput save() { - elt.find(".js-save-changes").click(); - elt.find(".js-save-changes").shouldNot(exist); - return this; - } -} diff --git a/it/it-tests/src/test/java/pageobjects/settings/SettingsPage.java b/it/it-tests/src/test/java/pageobjects/settings/SettingsPage.java deleted file mode 100644 index 704ba3054ae..00000000000 --- a/it/it-tests/src/test/java/pageobjects/settings/SettingsPage.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 pageobjects.settings; - -import com.codeborne.selenide.SelenideElement; -import org.openqa.selenium.By; - -import static com.codeborne.selenide.Condition.cssClass; -import static com.codeborne.selenide.Condition.exactValue; -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; - -public class SettingsPage { - - public SettingsPage() { - $("#settings-page").shouldBe(visible); - } - - public SettingsPage assertMenuContains(String categoryName) { - $(".side-tabs-menu").$(By.linkText(categoryName)).shouldBe(visible); - return this; - } - - public SettingsPage assertSettingDisplayed(String settingKey) { - $(".settings-definition[data-key='" + settingKey + "']").shouldBe(visible); - return this; - } - - public SettingsPage assertSettingNotDisplayed(String settingKey) { - $(".settings-definition[data-key='" + settingKey + "']").shouldNotBe(visible); - return this; - } - - public SettingsPage openCategory(String categoryName) { - $(".side-tabs-menu").$(By.linkText(categoryName)).click(); - return this; - } - - public SettingsPage assertStringSettingValue(String settingKey, String value) { - $("input[name=\"settings[" + settingKey + "]\"]").shouldHave(exactValue(value)); - return this; - } - - public SettingsPage assertBooleanSettingValue(String settingKey, boolean value) { - SelenideElement toggle = $("button[name=\"settings[" + settingKey + "]\"]"); - if (value) { - toggle.shouldHave(cssClass("boolean-toggle-on")); - } else { - toggle.shouldNotHave(cssClass("boolean-toggle-on")); - } - return this; - } - - public SettingsPage setStringValue(String settingKey, String value) { - SelenideElement setting = $(".settings-definition[data-key=\"" + settingKey + "\"]"); - setting.find("input").val(value); - setting.find(".js-save-changes").click(); - setting.find(".js-save-changes").shouldNot(exist); - return this; - } - - public PropertySetInput getPropertySetInput(String settingKey) { - SelenideElement setting = $(".settings-definition[data-key=\"" + settingKey + "\"]"); - return new PropertySetInput(setting); - } -} diff --git a/it/it-tests/src/test/java/util/ItUtils.java b/it/it-tests/src/test/java/util/ItUtils.java deleted file mode 100644 index a8e5ee495e0..00000000000 --- a/it/it-tests/src/test/java/util/ItUtils.java +++ /dev/null @@ -1,534 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util; - -import com.google.common.base.Splitter; -import com.google.common.base.Throwables; -import com.google.common.collect.ImmutableMap; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.BuildResult; -import com.sonar.orchestrator.build.SonarRunner; -import com.sonar.orchestrator.container.Server; -import com.sonar.orchestrator.locator.FileLocation; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Type; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.function.Function; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import org.apache.commons.io.FileUtils; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; -import org.junit.Assert; -import org.sonar.wsclient.issue.Issue; -import org.sonar.wsclient.issue.IssueClient; -import org.sonar.wsclient.issue.IssueQuery; -import org.sonarqube.test.Tester; -import org.sonarqube.ws.WsComponents.Component; -import org.sonarqube.ws.WsMeasures; -import org.sonarqube.ws.WsMeasures.Measure; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.HttpConnector; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.WsClientFactories; -import org.sonarqube.ws.client.component.ShowWsRequest; -import org.sonarqube.ws.client.measure.ComponentWsRequest; -import org.sonarqube.ws.client.qualityprofile.RestoreWsRequest; -import org.sonarqube.ws.client.setting.ResetRequest; -import org.sonarqube.ws.client.setting.SetRequest; - -import static com.google.common.base.Preconditions.checkState; -import static com.sonar.orchestrator.container.Server.ADMIN_LOGIN; -import static com.sonar.orchestrator.container.Server.ADMIN_PASSWORD; -import static java.lang.Double.parseDouble; -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static java.util.Locale.ENGLISH; -import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; - -public class ItUtils { - public static final Splitter LINE_SPLITTER = Splitter.on(System.getProperty("line.separator")); - - private ItUtils() { - } - - public static FileLocation xooPlugin() { - return FileLocation.byWildcardMavenFilename(new File("../../plugins/sonar-xoo-plugin/target"), "sonar-xoo-plugin-*.jar"); - } - - public static List<Issue> getAllServerIssues(Orchestrator orchestrator) { - IssueClient issueClient = orchestrator.getServer().wsClient().issueClient(); - return issueClient.find(IssueQuery.create()).list(); - } - - /** - * @deprecated replaced by {@link Tester#wsClient()} - */ - @Deprecated - public static WsClient newAdminWsClient(Orchestrator orchestrator) { - return newUserWsClient(orchestrator, ADMIN_LOGIN, ADMIN_PASSWORD); - } - - /** - * @deprecated replaced by {@link Tester#wsClient()} - */ - @Deprecated - public static WsClient newWsClient(Orchestrator orchestrator) { - return newUserWsClient(orchestrator, null, null); - } - - /** - * @deprecated replaced by {@link Tester#wsClient()} - */ - @Deprecated - public static WsClient newUserWsClient(Orchestrator orchestrator, @Nullable String login, @Nullable String password) { - Server server = orchestrator.getServer(); - return WsClientFactories.getDefault().newClient(HttpConnector.newBuilder() - .url(server.getUrl()) - .credentials(login, password) - .build()); - } - - /** - * Locate the directory of sample project - * - * @param relativePath path related to the directory it/it-projects, for example "qualitygate/xoo-sample" - */ - public static File projectDir(String relativePath) { - File dir = new File("../it-projects/" + relativePath); - if (!dir.exists() || !dir.isDirectory()) { - throw new IllegalStateException("Directory does not exist: " + dir.getAbsolutePath()); - } - return dir; - } - - /** - * Locate the artifact of a fake plugin stored in it/it-plugins. - * - * @param dirName the directory of it/it-plugins, for example "sonar-fake-plugin". - * It assumes that version is 1.0-SNAPSHOT - */ - public static FileLocation pluginArtifact(String dirName) { - return FileLocation.byWildcardMavenFilename(new File("../it-plugins/" + dirName + "/target"), dirName + "-*.jar"); - } - - /** - * Locate the pom file of a sample project - * - * @param projectName project path related to the directory it/it-projects, for example "qualitygate/xoo-sample" - */ - public static File projectPom(String projectName) { - File pom = new File(projectDir(projectName), "pom.xml"); - if (!pom.exists() || !pom.isFile()) { - throw new IllegalStateException("pom file does not exist: " + pom.getAbsolutePath()); - } - return pom; - } - - public static String sanitizeTimezones(String s) { - return s.replaceAll("[\\+\\-]\\d\\d\\d\\d", "+0000"); - } - - public static JSONObject getJSONReport(BuildResult result) { - Pattern pattern = Pattern.compile("Export issues to (.*?).json"); - Matcher m = pattern.matcher(result.getLogs()); - if (m.find()) { - String s = m.group(1); - File path = new File(s + ".json"); - assertThat(path).exists(); - try { - return (JSONObject) JSONValue.parse(FileUtils.readFileToString(path)); - } catch (IOException e) { - throw new RuntimeException("Unable to read JSON report", e); - } - } - fail("Unable to locate json report"); - return null; - } - - public static int countIssuesInJsonReport(BuildResult result, boolean onlyNews) { - JSONObject obj = getJSONReport(result); - JSONArray issues = (JSONArray) obj.get("issues"); - int count = 0; - for (Object issue : issues) { - JSONObject jsonIssue = (JSONObject) issue; - if (!onlyNews || (Boolean) jsonIssue.get("isNew")) { - count++; - } - } - return count; - } - - public static void assertIssuesInJsonReport(BuildResult result, int newIssues, int resolvedIssues, int existingIssues) { - JSONObject obj = getJSONReport(result); - JSONArray issues = (JSONArray) obj.get("issues"); - int countNew = 0; - int countResolved = 0; - int countExisting = 0; - - for (Object issue : issues) { - JSONObject jsonIssue = (JSONObject) issue; - - if ((Boolean) jsonIssue.get("isNew")) { - countNew++; - } else if (jsonIssue.get("resolution") != null) { - countResolved++; - } else { - countExisting++; - } - } - assertThat(countNew).isEqualTo(newIssues); - assertThat(countResolved).isEqualTo(resolvedIssues); - assertThat(countExisting).isEqualTo(existingIssues); - } - - public static SonarRunner runVerboseProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, String... properties) { - return runProjectAnalysis(orchestrator, projectRelativePath, true, properties); - } - - public static SonarRunner runProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, String... properties) { - return runProjectAnalysis(orchestrator, projectRelativePath, false, properties); - } - - private static SonarRunner runProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, boolean enableDebugLogs, String... properties) { - SonarRunner sonarRunner = SonarRunner.create(projectDir(projectRelativePath)); - ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); - for (int i = 0; i < properties.length; i += 2) { - builder.put(properties[i], properties[i + 1]); - } - SonarRunner scan = sonarRunner.setDebugLogs(enableDebugLogs).setProperties(builder.build()); - orchestrator.executeBuild(scan); - return scan; - } - - public static void setServerProperty(Orchestrator orchestrator, String key, @Nullable String value) { - setServerProperty(orchestrator, null, key, value); - } - - public static void setServerProperty(Orchestrator orchestrator, @Nullable String componentKey, String key, @Nullable String value) { - if (value == null) { - newAdminWsClient(orchestrator).settings().reset(ResetRequest.builder().setKeys(key).setComponent(componentKey).build()); - } else { - newAdminWsClient(orchestrator).settings().set(SetRequest.builder().setKey(key).setValue(value).setComponent(componentKey).build()); - } - } - - public static void setServerProperties(Orchestrator orchestrator, @Nullable String componentKey, String... properties) { - for (int i = 0; i < properties.length; i += 2) { - setServerProperty(orchestrator, componentKey, properties[i], properties[i + 1]); - } - } - - public static void resetSettings(Orchestrator orchestrator, @Nullable String componentKey, String... keys) { - if (keys.length > 0) { - newAdminWsClient(orchestrator).settings().reset(ResetRequest.builder().setKeys(keys).setComponent(componentKey).build()); - } - } - - public static void resetEmailSettings(Orchestrator orchestrator) { - resetSettings(orchestrator, null, "email.smtp_host.secured", "email.smtp_port.secured", "email.smtp_secure_connection.secured", "email.smtp_username.secured", - "email.smtp_password.secured", "email.from", "email.prefix"); - } - - public static void resetPeriod(Orchestrator orchestrator) { - resetSettings(orchestrator, null, "sonar.leak.period"); - } - - @CheckForNull - public static Measure getMeasure(Orchestrator orchestrator, String componentKey, String metricKey) { - return getMeasuresByMetricKey(orchestrator, componentKey, metricKey).get(metricKey); - } - - @CheckForNull - public static Double getMeasureAsDouble(Orchestrator orchestrator, String componentKey, String metricKey) { - Measure measure = getMeasure(orchestrator, componentKey, metricKey); - return (measure == null) ? null : Double.parseDouble(measure.getValue()); - } - - public static Map<String, Measure> getMeasuresByMetricKey(Orchestrator orchestrator, String componentKey, String... metricKeys) { - return getStreamMeasures(orchestrator, componentKey, metricKeys) - .filter(Measure::hasValue) - .collect(Collectors.toMap(Measure::getMetric, Function.identity())); - } - - public static Map<String, Double> getMeasuresAsDoubleByMetricKey(Orchestrator orchestrator, String componentKey, String... metricKeys) { - return getStreamMeasures(orchestrator, componentKey, metricKeys) - .filter(Measure::hasValue) - .collect(Collectors.toMap(Measure::getMetric, measure -> parseDouble(measure.getValue()))); - } - - private static Stream<Measure> getStreamMeasures(Orchestrator orchestrator, String componentKey, String... metricKeys) { - return newWsClient(orchestrator).measures().component(new ComponentWsRequest() - .setComponentKey(componentKey) - .setMetricKeys(asList(metricKeys))) - .getComponent().getMeasuresList() - .stream(); - } - - @CheckForNull - public static Measure getMeasureWithVariation(Orchestrator orchestrator, String componentKey, String metricKey) { - WsMeasures.ComponentWsResponse response = newWsClient(orchestrator).measures().component(new ComponentWsRequest() - .setComponentKey(componentKey) - .setMetricKeys(singletonList(metricKey)) - .setAdditionalFields(singletonList("periods"))); - List<Measure> measures = response.getComponent().getMeasuresList(); - return measures.size() == 1 ? measures.get(0) : null; - } - - @CheckForNull - public static Map<String, Measure> getMeasuresWithVariationsByMetricKey(Orchestrator orchestrator, String componentKey, String... metricKeys) { - return newWsClient(orchestrator).measures().component(new ComponentWsRequest() - .setComponentKey(componentKey) - .setMetricKeys(asList(metricKeys)) - .setAdditionalFields(singletonList("periods"))).getComponent().getMeasuresList() - .stream() - .collect(Collectors.toMap(Measure::getMetric, Function.identity())); - } - - /** - * Return leak period value - */ - @CheckForNull - public static Double getLeakPeriodValue(Orchestrator orchestrator, String componentKey, String metricKey) { - List<WsMeasures.PeriodValue> periodsValueList = getMeasureWithVariation(orchestrator, componentKey, metricKey).getPeriods().getPeriodsValueList(); - return periodsValueList.size() > 0 ? Double.parseDouble(periodsValueList.get(0).getValue()) : null; - } - - @CheckForNull - public static Component getComponent(Orchestrator orchestrator, String componentKey) { - try { - return newWsClient(orchestrator).components().show(new ShowWsRequest().setKey((componentKey))).getComponent(); - } catch (org.sonarqube.ws.client.HttpException e) { - if (e.code() == 404) { - return null; - } - throw new IllegalStateException(e); - } - } - - @CheckForNull - public static ComponentNavigation getComponentNavigation(Orchestrator orchestrator, String componentKey) { - // Waiting for SONAR-7745 to have version in api/components/show, we use internal api/navigation/component WS to get the component - // version - String content = newWsClient(orchestrator).wsConnector().call(new GetRequest("api/navigation/component").setParam("componentKey", componentKey)).failIfNotSuccessful() - .content(); - return ComponentNavigation.parse(content); - } - - public static void restoreProfile(Orchestrator orchestrator, URL resource) { - restoreProfile(orchestrator, resource, null); - } - - public static void restoreProfile(Orchestrator orchestrator, URL resource, String organization) { - URI uri; - try { - uri = resource.toURI(); - } catch (URISyntaxException e) { - throw new IllegalArgumentException("Cannot find quality profile xml file '" + resource + "' in classpath"); - } - newAdminWsClient(orchestrator) - .qualityProfiles() - .restoreProfile( - RestoreWsRequest.builder() - .setBackup(new File(uri)) - .setOrganization(organization) - .build()); - } - - public static String newOrganizationKey() { - return randomAlphabetic(32).toLowerCase(ENGLISH); - } - - public static String newProjectKey() { - return "key-" + randomAlphabetic(100); - } - - public static class ComponentNavigation { - private String version; - private String analysisDate; - - public String getVersion() { - return version; - } - - public Date getDate() { - return toDatetime(analysisDate); - } - - public static ComponentNavigation parse(String json) { - Gson gson = new Gson(); - return gson.fromJson(json, ComponentNavigation.class); - } - } - - /** - * Concatenates a vararg to a String array. - * - * Useful when using {@link #runVerboseProjectAnalysis(Orchestrator, String, String...)}, eg.: - * <pre> - * ItUtils.runProjectAnalysis(orchestrator, "project_name", - * ItUtils.concat(properties, "sonar.scm.disabled", "false") - * ); - * </pre> - */ - public static String[] concat(String[] properties, String... str) { - if (properties == null || properties.length == 0) { - return str; - } - return Stream.concat(Arrays.stream(properties), Arrays.stream(str)) - .toArray(String[]::new); - } - - public static Date toDate(String sDate) { - try { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - return sdf.parse(sDate); - } catch (ParseException e) { - throw new RuntimeException(e); - } - } - - public static Date toDatetime(String sDate) { - try { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); - return sdf.parse(sDate); - } catch (ParseException e) { - throw new RuntimeException(e); - } - } - - public static String formatDate(Date d) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - return sdf.format(d); - } - - public static String extractCeTaskId(BuildResult buildResult) { - List<String> taskIds = extractCeTaskIds(buildResult); - checkState(taskIds.size() == 1, "More than one task id retrieved from logs"); - return taskIds.iterator().next(); - } - - private static List<String> extractCeTaskIds(BuildResult buildResult) { - String logs = buildResult.getLogs(); - return StreamSupport.stream(LINE_SPLITTER.split(logs).spliterator(), false) - .filter(s -> s.contains("More about the report processing at")) - .map(s -> s.substring(s.length() - 20, s.length())) - .collect(Collectors.toList()); - } - - public static Map<String, Object> jsonToMap(String json) { - Gson gson = new Gson(); - Type type = new TypeToken<Map<String, Object>>() { - }.getType(); - return gson.fromJson(json, type); - } - - /** - * @deprecated replaced by {@code orchestrator.getServer().newHttpCall()} - */ - @Deprecated - public static Response call(String url, String... headers) { - Request.Builder requestBuilder = new Request.Builder().get().url(url); - for (int i = 0; i < headers.length; i += 2) { - String headerName = headers[i]; - String headerValue = headers[i + 1]; - if (headerValue != null) { - requestBuilder.addHeader(headerName, headerValue); - } - } - try { - return new OkHttpClient.Builder() - .connectTimeout(30, TimeUnit.SECONDS) - .readTimeout(30, TimeUnit.SECONDS) - .build() - .newCall(requestBuilder.build()) - .execute(); - } catch (IOException e) { - throw Throwables.propagate(e); - } - } - - public static void expectBadRequestError(Runnable runnable) { - expectHttpError(400, runnable); - } - - public static void expectMissingError(Runnable runnable) { - expectHttpError(404, runnable); - } - /** - * Missing permissions - */ - public static void expectForbiddenError(Runnable runnable) { - expectHttpError(403, runnable); - } - - /** - * Not authenticated - */ - public static void expectUnauthorizedError(Runnable runnable) { - expectHttpError(401, runnable); - } - - public static void expectNotFoundError(Runnable runnable) { - expectHttpError(404, runnable); - } - - public static void expectHttpError(int expectedCode, Runnable runnable) { - try { - runnable.run(); - Assert.fail("Ws call should have failed"); - } catch (org.sonarqube.ws.client.HttpException e) { - assertThat(e.code()).isEqualTo(expectedCode); - } - } - - public static void expectHttpError(int expectedCode, String expectedMessage, Runnable runnable) { - try { - runnable.run(); - Assert.fail("Ws call should have failed"); - } catch (org.sonarqube.ws.client.HttpException e) { - assertThat(e.code()).isEqualTo(expectedCode); - assertThat(e.getMessage()).contains(expectedMessage); - } - } -} diff --git a/it/it-tests/src/test/java/util/LoadedProfiles.java b/it/it-tests/src/test/java/util/LoadedProfiles.java deleted file mode 100644 index 71c76803901..00000000000 --- a/it/it-tests/src/test/java/util/LoadedProfiles.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.HashMap; -import java.util.Map; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -import static com.google.common.base.Preconditions.checkArgument; - -final class LoadedProfiles { - private final Map<String, Profile> profileStatesPerProfileKey = new HashMap<>(); - - public LoadedProfiles() { - init(); - } - - public String loadProfile(String relativePathToProfile) { - try { - URL resource = getClass().getResource(relativePathToProfile); - Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(resource.openStream()); - - String profileKey = null; - String languageKey = null; - - Element documentElement = document.getDocumentElement(); - checkArgument("profile".equals(documentElement.getNodeName()), "%s is not a quality profile file. Root node is not %s", resource.toURI().toString()); - NodeList childNodes = documentElement.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if ("name".equals(childNode.getNodeName())) { - profileKey = childNode.getChildNodes().item(0).getNodeValue(); - } else if ("language".equals(childNode.getNodeName())) { - languageKey = childNode.getChildNodes().item(0).getNodeValue(); - } - } - checkArgument(profileKey != null, "Quality profile file %s is missing profile key", resource.toURI().toString()); - checkArgument(languageKey != null, "Quality profile file %s is missing language key", resource.toURI().toString()); - this.profileStatesPerProfileKey.put(profileKey, new Profile(profileKey, languageKey, relativePathToProfile)); - - return profileKey; - } catch (URISyntaxException | SAXException | IOException | ParserConfigurationException e) { - throw new RuntimeException("Can not load quality profile " + relativePathToProfile, e); - } - } - - public Profile getState(String qualityProfileKey) { - Profile profile = this.profileStatesPerProfileKey.get(qualityProfileKey); - checkArgument(profile != null, "Quality Profile with key %s is unknown to %s", qualityProfileKey, ProjectAnalysisRule.class.getSimpleName()); - return profile; - } - - public void reset() { - this.profileStatesPerProfileKey.clear(); - init(); - } - - private void init() { - this.profileStatesPerProfileKey.put(Profile.XOO_EMPTY_PROFILE.getProfileKey(), Profile.XOO_EMPTY_PROFILE); - } -} diff --git a/it/it-tests/src/test/java/util/LoadedProjects.java b/it/it-tests/src/test/java/util/LoadedProjects.java deleted file mode 100644 index eb3565f5f84..00000000000 --- a/it/it-tests/src/test/java/util/LoadedProjects.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util; - -import com.google.common.base.Throwables; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkState; - -final class LoadedProjects { - - static final String SONAR_PROJECT_PROPERTIES_FILE_NAME = "sonar-project.properties"; - - private final Map<String, ProjectState> projectStatePerProjectKey = new HashMap<>(); - private final Set<String> knownProjects = new HashSet<>(); - - public void reset() { - this.projectStatePerProjectKey.clear(); - this.knownProjects.clear(); - } - - public String load(String projectRelativePath) { - checkState(!knownProjects.contains(projectRelativePath), "Project at location %s already loaded", projectRelativePath); - - File projectDir = ItUtils.projectDir(projectRelativePath); - Properties sonarProjectProperties = loadProjectProperties(projectDir); - ProjectState projectState = new ProjectState(projectDir, sonarProjectProperties); - - register(projectRelativePath, projectState); - - return projectState.getProjectKey(); - } - - public ProjectState getProjectState(String projectKey) { - ProjectState projectState = this.projectStatePerProjectKey.get(projectKey); - checkArgument(projectState != null, "Project with key %s is unknown to %s", projectKey, ProjectAnalysisRule.class.getSimpleName()); - return projectState; - } - - private void register(String projectRelativePath, ProjectState projectState) { - this.projectStatePerProjectKey.put(projectState.getProjectKey(), projectState); - this.knownProjects.add(projectRelativePath); - } - - private static Properties loadProjectProperties(File projectDir) { - File sonarPropertiesFile = new File(projectDir, SONAR_PROJECT_PROPERTIES_FILE_NAME); - checkArgument(sonarPropertiesFile.exists(), "Can not locate %s in project %s", SONAR_PROJECT_PROPERTIES_FILE_NAME, projectDir.getAbsolutePath()); - - Properties properties = new Properties(); - try { - properties.load(new FileReader(sonarPropertiesFile)); - } catch (IOException e) { - Throwables.propagate(e); - } - return properties; - } -} diff --git a/it/it-tests/src/test/java/util/Profile.java b/it/it-tests/src/test/java/util/Profile.java deleted file mode 100644 index f9f6a78c52a..00000000000 --- a/it/it-tests/src/test/java/util/Profile.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util; - -import javax.annotation.concurrent.Immutable; - -@Immutable -final class Profile { - static final Profile XOO_EMPTY_PROFILE = new Profile("empty", "xoo", "n/a"); - - private final String profileKey; - private final String languageKey; - private final String relativePath; - - Profile(String profileKey, String languageKey, String relativePath) { - this.profileKey = profileKey; - this.languageKey = languageKey; - this.relativePath = relativePath; - } - - public String getProfileKey() { - return profileKey; - } - - public String getLanguageKey() { - return languageKey; - } - - public String getRelativePath() { - return relativePath; - } -} diff --git a/it/it-tests/src/test/java/util/ProjectAnalysis.java b/it/it-tests/src/test/java/util/ProjectAnalysis.java deleted file mode 100644 index e60f4c37704..00000000000 --- a/it/it-tests/src/test/java/util/ProjectAnalysis.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util; - -public interface ProjectAnalysis { - /** - * Creates a new ProjectAnalysis which will use the specified quality profile. - * - * @throws IllegalArgumentException if the quality profile with the specified key has not been loaded into the Rule - * @see {@link ProjectAnalysisRule#registerProfile(String)} - */ - ProjectAnalysis withQualityProfile(String qualityProfileKey); - - /** - * Creates a new ProjectAnalysis which will use the built-in Xoo empty profile. - */ - ProjectAnalysis withXooEmptyProfile(); - - /** - * Creates a new ProjectAnalysis which will have debug logs enabled (or not). - */ - ProjectAnalysis withDebugLogs(boolean enabled); - - /** - * Creates a new ProjectAnalysis which will have the specified properties. - */ - ProjectAnalysis withProperties(String... properties); - - /** - * Execute the current ProjectAnalysis. - * This method can be called any number of time and will run the same analysis again and again. - */ - void run(); -} diff --git a/it/it-tests/src/test/java/util/ProjectAnalysisRule.java b/it/it-tests/src/test/java/util/ProjectAnalysisRule.java deleted file mode 100644 index 9483bb79ed8..00000000000 --- a/it/it-tests/src/test/java/util/ProjectAnalysisRule.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util; - -import com.google.common.base.MoreObjects; -import com.google.common.collect.ImmutableMap; -import com.sonar.orchestrator.Orchestrator; -import com.sonar.orchestrator.build.SonarRunner; -import java.util.HashSet; -import java.util.Set; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import javax.annotation.concurrent.Immutable; -import org.junit.rules.ExternalResource; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static java.util.Objects.requireNonNull; -import static util.ItUtils.resetSettings; - -/** - * Rule wrapping around an {@link Orchestrator} instance which handle: - * <ul> - * <li>automatic reset of Orchestrator data after each method when used as a {@link org.junit.Rule}, - * after each class when used as a {@link org.junit.ClassRule}</li> - * <li>automatic reset of server properties after each method when used as a {@link org.junit.Rule}, - * after each class when used as a {@link org.junit.ClassRule}</li> - * <li>associating project with a specific Quality Profile before running an analysis</li> - * <li>provisioning a project before its first analysis so that a Quality Profile can be associated to it</li> - * <li>"restoring" a Quality Profile before an analysis with a specific Quality Profile</li> - * </ul> - * - * This Rule has preparatory methods ({@link #registerProfile(String)} and {@link #registerProject(String)}) which - * will allow consequent calls to the rule methods to be based solely on Quality Profile and Project keys. In addition, - * these methods returns the Quality Profile and Project key to avoid information duplication (the only magic string - * the IT developer has to know is the relative path of the Project or the Quality Profile). - * - * To run an analysis, use method {@link #newProjectAnalysis(String)} to create a {@link ProjectAnalysis} - * object. This object has a {@link ProjectAnalysis#run()} method which will start the analysis. - * {@link ProjectAnalysis} can safely be reused to run the same analysis multiple times. In addition, these objects are - * immutable. Any call to one of their method which would modify their state will create a new instance which can also - * be reused at will. - */ -public class ProjectAnalysisRule extends ExternalResource { - - private final Orchestrator orchestrator; - private final LoadedProfiles loadedProfiles = new LoadedProfiles(); - private final LoadedProjects loadedProjects = new LoadedProjects(); - private final Set<String> serverProperties = new HashSet<>(); - - private ProjectAnalysisRule(Orchestrator orchestrator) { - this.orchestrator = orchestrator; - } - - public static ProjectAnalysisRule from(Orchestrator orchestrator) { - return new ProjectAnalysisRule(requireNonNull(orchestrator, "Orchestrator instance can not be null")); - } - - /** - * @param relativePathToProfile eg.: "/issue/suite/IssueFilterExtensionTest/xoo-with-many-rules.xml" - * - * @return the quality profile key - */ - public String registerProfile(String relativePathToProfile) { - return this.loadedProfiles.loadProfile(relativePathToProfile); - } - - /** - * @param projectRelativePath path relative to it/it-projects, eg. "shared/xoo-multi-modules-sample" - * - * @return the project key - */ - public String registerProject(String projectRelativePath) { - return this.loadedProjects.load(projectRelativePath); - } - - public ProjectAnalysis newProjectAnalysis(String projectKey) { - ProjectState projectState = this.loadedProjects.getProjectState(projectKey); - - return new ProjectAnalysisImpl(projectState, null, false); - } - - @Override - protected void before() throws Throwable { - orchestrator.resetData(); - } - - @Override - protected void after() { - resetServerProperties(); - resetRuleState(); - } - - private void resetServerProperties() { - resetSettings(orchestrator, null, serverProperties.toArray(new String[] {})); - } - - public void setServerPropertyImpl(String key, @Nullable String value) { - ItUtils.setServerProperty(orchestrator, key, value); - } - - public ProjectAnalysisRule setServerProperty(String key, String value) { - setServerPropertyImpl(key, value); - this.serverProperties.add(key); - return this; - } - - @Immutable - private final class ProjectAnalysisImpl implements ProjectAnalysis { - private final ProjectState projectState; - @CheckForNull - private final Profile qualityProfile; - private final boolean debugLogs; - @CheckForNull - private final String[] properties; - - private ProjectAnalysisImpl(ProjectState projectState, @Nullable Profile qualityProfile, boolean debugLogs, String... properties) { - this.projectState = projectState; - this.qualityProfile = qualityProfile; - this.debugLogs = debugLogs; - this.properties = properties; - } - - @Override - public ProjectAnalysis withQualityProfile(String qualityProfileKey) { - checkNotNull(qualityProfileKey, "Specified Quality Profile Key can not be null"); - if (this.qualityProfile != null && this.qualityProfile.getProfileKey().equals(qualityProfileKey)) { - return this; - } - - return new ProjectAnalysisImpl(this.projectState, loadedProfiles.getState(qualityProfileKey), this.debugLogs, this.properties); - } - - @Override - public ProjectAnalysis withXooEmptyProfile() { - if (this.qualityProfile == Profile.XOO_EMPTY_PROFILE) { - return this; - } - return new ProjectAnalysisImpl(this.projectState, Profile.XOO_EMPTY_PROFILE, this.debugLogs, this.properties); - } - - @Override - public ProjectAnalysis withDebugLogs(boolean enabled) { - if (this.debugLogs == enabled) { - return this; - } - return new ProjectAnalysisImpl(this.projectState, this.qualityProfile, enabled, this.properties); - } - - @Override - public ProjectAnalysis withProperties(String... properties) { - checkArgument( - properties == null || properties.length % 2 == 0, - "there must be an even number of String parameters (got %s): key/value pairs must be complete", properties == null ? 0 : properties.length); - return new ProjectAnalysisImpl(this.projectState, this.qualityProfile, this.debugLogs, properties); - } - - @Override - public void run() { - provisionIfNecessary(); - setQualityProfileIfNecessary(); - runAnalysis(); - } - - private void setQualityProfileIfNecessary() { - if (this.qualityProfile != null) { - if (this.qualityProfile != Profile.XOO_EMPTY_PROFILE) { - ItUtils.restoreProfile(orchestrator, getClass().getResource(this.qualityProfile.getRelativePath())); - } - orchestrator.getServer().associateProjectToQualityProfile( - this.projectState.getProjectKey(), - this.qualityProfile.getLanguageKey(), - this.qualityProfile.getProfileKey()); - } - } - - private void provisionIfNecessary() { - if (this.qualityProfile != null && !projectState.isProvisioned()) { - String projectKey = projectState.getProjectKey(); - orchestrator.getServer().provisionProject(projectKey, MoreObjects.firstNonNull(projectState.getProjectName(), projectKey)); - projectState.setProvisioned(true); - } - } - - private SonarRunner runAnalysis() { - SonarRunner sonarRunner = SonarRunner.create(projectState.getProjectDir()); - ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); - for (int i = 0; i < this.properties.length; i += 2) { - builder.put(this.properties[i], this.properties[i + 1]); - } - SonarRunner scan = sonarRunner.setDebugLogs(this.debugLogs).setProperties(builder.build()); - orchestrator.executeBuild(scan); - return scan; - } - } - - private void resetRuleState() { - this.loadedProjects.reset(); - this.loadedProfiles.reset(); - this.serverProperties.clear(); - } - -} diff --git a/it/it-tests/src/test/java/util/ProjectState.java b/it/it-tests/src/test/java/util/ProjectState.java deleted file mode 100644 index cfa310326b4..00000000000 --- a/it/it-tests/src/test/java/util/ProjectState.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util; - -import java.io.File; -import java.util.Properties; - -import static com.google.common.base.Preconditions.checkState; -import static util.LoadedProjects.SONAR_PROJECT_PROPERTIES_FILE_NAME; - -final class ProjectState { - private static final String SONAR_PROJECT_KEY_PROPERTY_NAME = "sonar.projectKey"; - private static final String SONAR_PROJECT_NAME_PROPERTY_NAME = "sonar.projectName"; - - private final File projectDir; - private final Properties properties; - private boolean provisioned = false; - - ProjectState(File projectDir, Properties properties) { - this.projectDir = projectDir; - this.properties = properties; - } - - public File getProjectDir() { - return projectDir; - } - - public Properties getProperties() { - return properties; - } - - public String getProjectKey() { - return getProperty(SONAR_PROJECT_KEY_PROPERTY_NAME); - } - - public String getProjectName() { - return getProperty(SONAR_PROJECT_NAME_PROPERTY_NAME); - } - - private String getProperty(String propertyName) { - String value = this.properties.getProperty(propertyName); - checkState(value != null, "Property %s is missing in %s file in project directory %s", - propertyName, SONAR_PROJECT_PROPERTIES_FILE_NAME, projectDir.getAbsolutePath()); - return value; - } - - public boolean isProvisioned() { - return provisioned; - } - - public void setProvisioned(boolean provisioned) { - this.provisioned = provisioned; - } -} diff --git a/it/it-tests/src/test/java/util/issue/IssueRule.java b/it/it-tests/src/test/java/util/issue/IssueRule.java deleted file mode 100644 index 7857d3cabdc..00000000000 --- a/it/it-tests/src/test/java/util/issue/IssueRule.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.issue; - -import com.sonar.orchestrator.Orchestrator; -import java.util.List; -import org.junit.rules.ExternalResource; -import org.sonarqube.ws.Issues.Issue; -import org.sonarqube.ws.Issues.SearchWsResponse; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.issue.SearchWsRequest; - -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static java.util.Objects.requireNonNull; -import static org.assertj.core.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; - -public class IssueRule extends ExternalResource { - - private final Orchestrator orchestrator; - - private WsClient adminWsClient; - - private IssueRule(Orchestrator orchestrator) { - this.orchestrator = orchestrator; - } - - public static IssueRule from(Orchestrator orchestrator) { - return new IssueRule(requireNonNull(orchestrator, "Orchestrator instance can not be null")); - } - - public SearchWsResponse search(SearchWsRequest request) { - return adminWsClient().issues().search(request); - } - - public Issue getRandomIssue() { - List<Issue> issues = search(new SearchWsRequest()).getIssuesList(); - assertThat(issues).isNotEmpty(); - return issues.get(0); - } - - public Issue getByKey(String issueKey) { - List<Issue> issues = search(new SearchWsRequest().setIssues(singletonList(issueKey)).setAdditionalFields(singletonList("_all"))).getIssuesList(); - assertThat(issues).hasSize(1); - return issues.iterator().next(); - } - - public List<Issue> getByKeys(String... issueKeys) { - List<Issue> issues = search(new SearchWsRequest().setIssues(asList(issueKeys)).setAdditionalFields(singletonList("_all"))).getIssuesList(); - assertThat(issues).hasSize(issueKeys.length); - return issues; - } - - private WsClient adminWsClient() { - if (adminWsClient == null) { - adminWsClient = newAdminWsClient(orchestrator); - } - return adminWsClient; - } - -} diff --git a/it/it-tests/src/test/java/util/selenium/ByCssSelectorOrByNameOrById.java b/it/it-tests/src/test/java/util/selenium/ByCssSelectorOrByNameOrById.java deleted file mode 100644 index 364ba779d6e..00000000000 --- a/it/it-tests/src/test/java/util/selenium/ByCssSelectorOrByNameOrById.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.selenium; - -import java.io.Serializable; -import java.util.Collections; -import java.util.List; -import org.openqa.selenium.By; -import org.openqa.selenium.SearchContext; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.internal.FindsByCssSelector; -import org.openqa.selenium.internal.FindsById; -import org.openqa.selenium.internal.FindsByName; - -public class ByCssSelectorOrByNameOrById extends By implements Serializable { - private static final long serialVersionUID = -3910258723099459239L; - - private final String selector; - - public ByCssSelectorOrByNameOrById(String selector) { - this.selector = selector; - } - - @Override - public WebElement findElement(SearchContext context) { - WebElement element; - - if (validCssSelector(selector)) { - element = ((FindsByCssSelector) context).findElementByCssSelector(quoteCss(selector)); - if (element != null) { - return element; - } - } - - element = ((FindsByName) context).findElementByName(selector); - if (element != null) { - return element; - } - - element = ((FindsById) context).findElementById(selector); - if (element != null) { - return element; - } - - return null; - } - - @Override - public List<WebElement> findElements(SearchContext context) { - List<WebElement> elements; - - if (validCssSelector(selector)) { - elements = ((FindsByCssSelector) context).findElementsByCssSelector(quoteCss(selector)); - if ((elements != null) && (!elements.isEmpty())) { - return elements; - } - } - - elements = ((FindsByName) context).findElementsByName(selector); - if ((elements != null) && (!elements.isEmpty())) { - return elements; - } - - elements = ((FindsById) context).findElementsById(selector); - if ((elements != null) && (!elements.isEmpty())) { - return elements; - } - - return Collections.emptyList(); - } - - protected boolean validCssSelector(String selector) { - return !selector.endsWith("[]"); - } - - protected String quoteCss(String selector) { - if (selector.startsWith(".")) { - return selector; - } - if (selector.startsWith("#")) { - return selector.replaceAll("(\\w)[.]", "$1\\\\."); - } - return selector; - } - - @Override - public String toString() { - return selector; - } -} diff --git a/it/it-tests/src/test/java/util/selenium/Consumer.java b/it/it-tests/src/test/java/util/selenium/Consumer.java deleted file mode 100644 index 69009893a97..00000000000 --- a/it/it-tests/src/test/java/util/selenium/Consumer.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.selenium; - -public interface Consumer<T> { - void accept(T t); -} diff --git a/it/it-tests/src/test/java/util/selenium/ElementFilter.java b/it/it-tests/src/test/java/util/selenium/ElementFilter.java deleted file mode 100644 index 86b42cfa826..00000000000 --- a/it/it-tests/src/test/java/util/selenium/ElementFilter.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.selenium; - -import com.google.common.base.Function; -import java.util.Collection; -import org.openqa.selenium.WebElement; - -class ElementFilter { - private static final ElementFilter ANY = new ElementFilter("", new Function<Collection<WebElement>, Collection<WebElement>>() { - @Override - public Collection<WebElement> apply(Collection<WebElement> input) { - return input; - } - }); - - private final String description; - private final Function<Collection<WebElement>, Collection<WebElement>> filter; - - ElementFilter(String description, Function<Collection<WebElement>, Collection<WebElement>> filter) { - this.description = description; - this.filter = filter; - } - - public String getDescription() { - return description; - } - - public Function<Collection<WebElement>, Collection<WebElement>> getFilter() { - return filter; - } - - public static ElementFilter any() { - return ANY; - } - - public ElementFilter and(final ElementFilter second) { - if (ANY == this) { - return second; - } - if (ANY == second) { - return this; - } - return new ElementFilter(description + ',' + second.description, new Function<Collection<WebElement>, Collection<WebElement>>() { - @Override - public Collection<WebElement> apply(Collection<WebElement> stream) { - return second.filter.apply(filter.apply(stream)); - } - }); - } -} diff --git a/it/it-tests/src/test/java/util/selenium/Failure.java b/it/it-tests/src/test/java/util/selenium/Failure.java deleted file mode 100644 index 8ba36543820..00000000000 --- a/it/it-tests/src/test/java/util/selenium/Failure.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.selenium; - -import java.util.ArrayList; -import java.util.List; - -class Failure { - private static final String PREFIX = Failure.class.getPackage().getName() + "."; - - private Failure() { - // Static class - } - - public static AssertionError create(String message) { - AssertionError error = new AssertionError(message); - removeSimpleleniumFromStackTrace(error); - return error; - } - - private static void removeSimpleleniumFromStackTrace(Throwable throwable) { - List<StackTraceElement> filtered = new ArrayList<>(); - - for (StackTraceElement element : throwable.getStackTrace()) { - if (!element.getClassName().contains(PREFIX)) { - filtered.add(element); - } - } - - throwable.setStackTrace(filtered.toArray(new StackTraceElement[filtered.size()])); - } -} diff --git a/it/it-tests/src/test/java/util/selenium/LazyDomElement.java b/it/it-tests/src/test/java/util/selenium/LazyDomElement.java deleted file mode 100644 index 27c5199f820..00000000000 --- a/it/it-tests/src/test/java/util/selenium/LazyDomElement.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.selenium; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.common.collect.FluentIterable; -import java.util.Collection; -import java.util.List; -import java.util.NoSuchElementException; -import javax.annotation.Nullable; -import org.openqa.selenium.By; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.support.ui.Select; - -class LazyDomElement { - private final WebDriver driver; - private final By selector; - private final ElementFilter filter; - private final Retry retry; - - LazyDomElement(WebDriver driver, By selector) { - this(driver, selector, Retry._30_SECONDS); - } - - LazyDomElement(WebDriver driver, By selector, Retry retry) { - this(driver, selector, ElementFilter.any(), retry); - } - - private LazyDomElement(WebDriver driver, By selector, ElementFilter filter, Retry retry) { - this.driver = driver; - this.selector = selector; - this.filter = filter; - this.retry = retry; - } - - public LazyDomElement withText(final String text) { - String fullDescription = " with text [" + text + "]"; - - return with(new ElementFilter(fullDescription, new Function<Collection<WebElement>, Collection<WebElement>>() { - @Override - public Collection<WebElement> apply(Collection<WebElement> stream) { - return FluentIterable.from(stream).filter(new Predicate<WebElement>() { - @Override - public boolean apply(@Nullable WebElement element) { -// return Objects.equals(element.getText(), text); - return element.getText().contains(text); - } - }).toList(); - } - })); - } - - public LazyShould should() { - return new LazyShould(this, Retry._30_SECONDS, true); - } - - public void fill(final CharSequence text) { - execute("fill(" + text + ")", new Consumer<WebElement>() { - @Override - public void accept(WebElement element) { - element.clear(); - element.sendKeys(text); - } - }); - } - - public void pressEnter() { - execute("pressEnter", new Consumer<WebElement>() { - @Override - public void accept(WebElement element) { - element.sendKeys(Keys.ENTER); - } - }); - } - - public void select(final String text) { - executeSelect("select(" + text + ")", new Consumer<Select>() { - @Override - public void accept(Select select) { - select.selectByVisibleText(text); - } - }); - } - - public void executeSelect(String description, final Consumer<Select> selectOnElement) { - execute(description, new Consumer<WebElement>() { - @Override - public void accept(WebElement element) { - selectOnElement.accept(new Select(element)); - } - }); - } - - public void click() { - execute("click", new Consumer<WebElement>() { - @Override - public void accept(WebElement element) { - new Actions(driver).moveToElement(element); - element.click(); - } - }); - } - - public void check() { - execute("check", new Consumer<WebElement>() { - @Override - public void accept(WebElement element) { - if (!element.isSelected()) { - element.click(); - } - } - }); - } - - public void execute(Consumer<WebElement> action) { - execute("execute(" + action + ")", action); - } - - private LazyDomElement with(ElementFilter filter) { - return new LazyDomElement(driver, selector, this.filter.and(filter), retry); - } - - private void execute(String message, Consumer<WebElement> action) { - System.out.println(" - " + Text.toString(selector) + filter.getDescription() + "." + message); - - Supplier<Optional<WebElement>> findOne = new Supplier<Optional<WebElement>>() { - @Override - public Optional<WebElement> get() { - List<WebElement> elements = stream(); - if (elements.isEmpty()) { - return Optional.empty(); - } - return Optional.of(elements.get(0)); - } - }; - - try { - retry.execute(findOne, action); - } catch (NoSuchElementException e) { - throw new AssertionError("Element not found: " + Text.toString(selector)); - } - } - - List<WebElement> stream() { - return FluentIterable.from(filter.getFilter().apply(driver.findElements(selector))).toList(); - } - - @Override - public String toString() { - return Text.toString(selector) + filter.getDescription(); - } -} diff --git a/it/it-tests/src/test/java/util/selenium/LazyShould.java b/it/it-tests/src/test/java/util/selenium/LazyShould.java deleted file mode 100644 index c880a7d944b..00000000000 --- a/it/it-tests/src/test/java/util/selenium/LazyShould.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.selenium; - -import com.google.common.base.Function; -import com.google.common.base.Joiner; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; -import com.google.common.base.Supplier; -import com.google.common.collect.FluentIterable; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.regex.Pattern; -import javax.annotation.Nullable; -import org.openqa.selenium.WebElement; - -class LazyShould { - private final LazyDomElement element; - private final Retry retry; - private final boolean ok; - - LazyShould(LazyDomElement element, Retry retry, boolean ok) { - this.element = element; - this.retry = retry; - this.ok = ok; - } - - public LazyShould beDisplayed() { - return verify( - isOrNot("displayed"), - new Predicate<List<WebElement>>() { - @Override - public boolean apply(List<WebElement> elements) { - return !elements.isEmpty() && FluentIterable.from(elements).allMatch(new Predicate<WebElement>() { - @Override - public boolean apply(WebElement element) { - return element.isDisplayed(); - } - }); - } - }, - new Function<List<WebElement>, String>() { - @Override - public String apply(List<WebElement> elements) { - return "It is " + statuses(elements, new Function<WebElement, String>() { - @Override - public String apply(WebElement element) { - return displayedStatus(element); - } - }); - } - }); - } - - public LazyShould match(final Pattern regexp) { - return verify( - doesOrNot("match") + " (" + regexp.pattern() + ")", - new Predicate<List<WebElement>>() { - @Override - public boolean apply(List<WebElement> elements) { - return !elements.isEmpty() && FluentIterable.from(elements).anyMatch(new Predicate<WebElement>() { - @Override - public boolean apply(WebElement element) { - return regexp.matcher(WebElementHelper.text(element)).matches(); - } - }); - } - }, - new Function<List<WebElement>, String>() { - @Override - public String apply(List<WebElement> elements) { - return "It contains " + statuses(elements, new Function<WebElement, String>() { - @Nullable - @Override - public String apply(@Nullable WebElement element) { - return WebElementHelper.text(element); - } - }); - } - }); - } - - public LazyShould contain(final String text) { - return verify( - doesOrNot("contain") + "(" + text + ")", - new Predicate<List<WebElement>>() { - @Override - public boolean apply(List<WebElement> elements) { - return FluentIterable.from(elements).anyMatch(new Predicate<WebElement>() { - @Override - public boolean apply(@Nullable WebElement element) { - if (text.startsWith("exact:")) { - return WebElementHelper.text(element).equals(text.substring(6)); - } - return WebElementHelper.text(element).contains(text); - } - }); - } - }, - new Function<List<WebElement>, String>() { - @Override - public String apply(List<WebElement> elements) { - return "It contains " + statuses(elements, new Function<WebElement, String>() { - @Override - public String apply(WebElement element) { - return WebElementHelper.text(element); - } - }); - } - }); - } - - public LazyShould exist() { - return verify( - doesOrNot("exist"), - new Predicate<List<WebElement>>() { - @Override - public boolean apply(List<WebElement> elements) { - return !elements.isEmpty(); - } - }, - new Function<List<WebElement>, String>() { - @Override - public String apply(List<WebElement> elements) { - return "It contains " + Text.plural(elements.size(), "element"); - } - }); - } - - private static String displayedStatus(WebElement element) { - return element.isDisplayed() ? "displayed" : "not displayed"; - } - - private LazyShould verify(String message, Predicate<List<WebElement>> predicate, Function<List<WebElement>, String> toErrorMessage) { - String verification = "verify that " + element + " " + message; - System.out.println(" -> " + verification); - - try { - if (!retry.verify(new Supplier<List<WebElement>>() { - @Override - public List<WebElement> get() { - return LazyShould.this.findElements(); - } - }, ok ? predicate : Predicates.not(predicate))) { - throw Failure.create("Failed to " + verification + ". " + toErrorMessage.apply(findElements())); - } - } catch (NoSuchElementException e) { - throw Failure.create("Element not found. Failed to " + verification); - } - - return ok ? this : not(); - } - - private List<WebElement> findElements() { - return element.stream(); - } - - private static String statuses(List<WebElement> elements, Function<WebElement, String> toStatus) { - return "(" + FluentIterable.from(elements).transform(toStatus).join(Joiner.on(";")) + ")"; - } - - public LazyShould not() { - return new LazyShould(element, retry, !ok); - } - - private String doesOrNot(String verb) { - return Text.doesOrNot(!ok, verb); - } - - private String isOrNot(String state) { - return Text.isOrNot(!ok, state); - } -} diff --git a/it/it-tests/src/test/java/util/selenium/Optional.java b/it/it-tests/src/test/java/util/selenium/Optional.java deleted file mode 100644 index 918d488a85f..00000000000 --- a/it/it-tests/src/test/java/util/selenium/Optional.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.selenium; - -import java.util.NoSuchElementException; - -public final class Optional<T> { - private static final Optional<?> EMPTY = new Optional<>(); - - private final T value; - - private Optional() { - this.value = null; - } - - public static <T> Optional<T> empty() { - @SuppressWarnings("unchecked") - Optional<T> t = (Optional<T>) EMPTY; - return t; - } - - private Optional(T value) { - this.value = value; - } - - public static <T> Optional<T> of(T value) { - return new Optional<>(value); - } - - public T get() { - if (value == null) { - throw new NoSuchElementException("No value present"); - } - return value; - } - - public boolean isPresent() { - return value != null; - } -} diff --git a/it/it-tests/src/test/java/util/selenium/Retry.java b/it/it-tests/src/test/java/util/selenium/Retry.java deleted file mode 100644 index 7cc8a20897c..00000000000 --- a/it/it-tests/src/test/java/util/selenium/Retry.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.selenium; - -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import java.util.NoSuchElementException; -import java.util.concurrent.TimeUnit; -import org.openqa.selenium.InvalidElementStateException; -import org.openqa.selenium.NotFoundException; -import org.openqa.selenium.StaleElementReferenceException; -import org.openqa.selenium.WebDriverException; - -import static java.util.concurrent.TimeUnit.SECONDS; - -class Retry { - public static final Retry _30_SECONDS = new Retry(30, SECONDS); - - private final long timeoutInMs; - - Retry(long duration, TimeUnit timeUnit) { - this.timeoutInMs = timeUnit.toMillis(duration); - } - - <T> void execute(Supplier<Optional<T>> target, Consumer<T> action) { - WebDriverException lastError = null; - - boolean retried = false; - - long start = System.currentTimeMillis(); - while ((System.currentTimeMillis() - start) < timeoutInMs) { - try { - Optional<T> targetElement = target.get(); - if (targetElement.isPresent()) { - action.accept(targetElement.get()); - if (retried) { - System.out.println(); - } - return; - } - } catch (StaleElementReferenceException e) { - // ignore - } catch (WebDriverException e) { - lastError = e; - } - - retried = true; - System.out.print("."); - } - - if (retried) { - System.out.println(); - } - - if (lastError != null) { - throw lastError; - } - throw new NoSuchElementException("Not found"); - } - - <T> void execute(Runnable action) { - WebDriverException lastError = null; - - boolean retried = false; - - long start = System.currentTimeMillis(); - while ((System.currentTimeMillis() - start) < timeoutInMs) { - try { - action.run(); - if (retried) { - System.out.println(); - } - return; - } catch (StaleElementReferenceException e) { - // ignore - } catch (WebDriverException e) { - lastError = e; - } - - retried = true; - System.out.print("."); - } - - if (retried) { - System.out.println(); - } - - if (lastError != null) { - throw lastError; - } - throw new NoSuchElementException("Not found"); - } - - <T> boolean verify(Supplier<T> targetSupplier, Predicate<T> predicate) throws NoSuchElementException { - Error error = Error.KO; - - boolean retried = false; - - long start = System.currentTimeMillis(); - while ((System.currentTimeMillis() - start) < timeoutInMs) { - try { - if (predicate.apply(targetSupplier.get())) { - if (retried) { - System.out.println(); - } - return true; - } - - error = Error.KO; - } catch (InvalidElementStateException e) { - error = Error.KO; - } catch (NotFoundException e) { - error = Error.NOT_FOUND; - } catch (StaleElementReferenceException e) { - // ignore - } - - retried = true; - System.out.print("."); - } - - if (retried) { - System.out.println(); - } - - if (error == Error.NOT_FOUND) { - throw new NoSuchElementException("Not found"); - } - return false; - } - - enum Error { - NOT_FOUND, KO - } -} diff --git a/it/it-tests/src/test/java/util/selenium/Selenese.java b/it/it-tests/src/test/java/util/selenium/Selenese.java deleted file mode 100644 index 4e01674e59b..00000000000 --- a/it/it-tests/src/test/java/util/selenium/Selenese.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.selenium; - -import com.sonar.orchestrator.Orchestrator; -import java.io.File; -import javax.annotation.Nullable; -import org.apache.commons.io.FileUtils; -import org.sonarqube.test.Tester; - -/** - * Selenium HTML tests, generally written with Selenium IDE - * @deprecated replaced by {@link Tester} - */ -@Deprecated -public final class Selenese { - - private File[] htmlTests; - - public Selenese(Builder builder) { - this.htmlTests = builder.htmlTests; - } - - public File[] getHtmlTests() { - return htmlTests; - } - - /** - * @deprecated replaced by {@link Tester#runHtmlTests(String...)} - */ - @Deprecated - public static void runSelenese(Orchestrator orchestrator, String... htmlFiles) { - Selenese selenese = new Builder() - .setHtmlTests(htmlFiles) - .build(); - new SeleneseRunner().runOn(selenese, orchestrator); - } - - private static final class Builder { - private File[] htmlTests; - - private Builder() { - } - - public Builder setHtmlTests(File... htmlTests) { - this.htmlTests = htmlTests; - return this; - } - - public Builder setHtmlTests(String... htmlTestPaths) { - this.htmlTests = new File[htmlTestPaths.length]; - for (int index = 0; index < htmlTestPaths.length; index++) { - htmlTests[index] = FileUtils.toFile(getClass().getResource(htmlTestPaths[index])); - } - return this; - } - - public Selenese build() { - if (htmlTests == null || htmlTests.length == 0) { - throw new IllegalArgumentException("HTML suite or tests are missing"); - } - for (File htmlTest : htmlTests) { - checkPresence(htmlTest); - } - return new Selenese(this); - } - - private static void checkPresence(@Nullable File file) { - if (file == null || !file.isFile() || !file.exists()) { - throw new IllegalArgumentException("HTML file does not exist: " + file); - } - } - } -} diff --git a/it/it-tests/src/test/java/util/selenium/SeleneseRunner.java b/it/it-tests/src/test/java/util/selenium/SeleneseRunner.java deleted file mode 100644 index cefc5c6ef09..00000000000 --- a/it/it-tests/src/test/java/util/selenium/SeleneseRunner.java +++ /dev/null @@ -1,440 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.selenium; - -import com.sonar.orchestrator.Orchestrator; -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.regex.Pattern; -import org.assertj.core.util.Strings; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.NotFoundException; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.logging.LogEntries; -import org.openqa.selenium.logging.LogEntry; -import org.openqa.selenium.logging.LogType; -import pageobjects.SelenideConfig; - -import static java.nio.charset.StandardCharsets.UTF_8; -import static java.util.Objects.requireNonNull; -import static java.util.regex.Pattern.DOTALL; -import static org.assertj.core.api.Assertions.assertThat; -import static util.selenium.Retry._30_SECONDS; - -class SeleneseRunner { - - private Map<String, String> variables; - private String baseUrl; - private WebDriver driver; - - void runOn(Selenese selenese, Orchestrator orchestrator) { - this.variables = new HashMap<>(); - this.baseUrl = orchestrator.getServer().getUrl(); - this.driver = SelenideConfig.configure(orchestrator); - - driver.manage().deleteAllCookies(); - - for (File file : selenese.getHtmlTests()) { - System.out.println(); - System.out.println("============ " + file.getName() + " ============"); - Document doc = parse(file); - for (Element table : doc.getElementsByTag("table")) { - for (Element tbody : table.getElementsByTag("tbody")) { - for (Element tr : tbody.getElementsByTag("tr")) { - String action = tr.child(0).text(); - String param1 = tr.child(1).text(); - String param2 = tr.child(2).text(); - - try { - action(action, param1, param2); - } catch (AssertionError e) { - analyzeLog(driver); - throw e; - } - } - } - } - } - } - - private static void analyzeLog(WebDriver driver) { - LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER); - for (LogEntry entry : logEntries) { - System.out.println(new Date(entry.getTimestamp()) + " " + entry.getLevel() + " " + entry.getMessage()); - } - } - - private static Document parse(File file) { - try { - return Jsoup.parse(file, UTF_8.name()); - } catch (IOException e) { - throw new RuntimeException("Unable to parse file: " + file, e); - } - } - - public SeleneseRunner action(String action, String param1, String param2) { - switch (action) { - case "open": - open(param1); - return this; - case "type": - type(param1, param2); - return this; - case "keyPressAndWait": - keyPressAndWait(param1, param2); - return this; - case "select": - select(param1, param2); - return this; - case "clickAndWait": - case "click": - click(param1); - return this; - case "check": - check(param1); - return this; - case "selectFrame": - selectFrame(param1); - return this; - case "assertElementPresent": - assertElementPresent(param1); - return this; - case "assertElementNotPresent": - assertElementNotPresent(param1); - return this; - case "storeText": - storeText(param1, param2); - return this; - case "storeEval": - storeEval(param1, param2); - return this; - case "store": - store(param1, param2); - return this; - case "assertText": - case "waitForText": - assertText(param1, param2); - return this; - case "assertNotText": - case "waitForNotText": - assertNotText(param1, param2); - return this; - case "assertTextPresent": - assertTextPresent(param1); - return this; - case "assertTextNotPresent": - assertTextNotPresent(param1); - return this; - case "assertLocation": - assertLocation(param1); - return this; - case "verifyHtmlSource": - verifyHtmlSource(param1); - return this; - case "waitForElementPresent": - waitForElementPresent(param1, param2); - return this; - case "waitForElementNotPresent": - waitForElementNotPresent(param1, param2); - return this; - case "waitForVisible": - waitForVisible(param1); - return this; - case "waitForXpathCount": - waitForXpathCount(param1, Integer.parseInt(param2)); - return this; - case "assertValue": - case "waitForValue": - case "verifyValue": - assertInputValue(param1, param2); - return this; - case "assertConfirmation": - confirm(param1); - return this; - case "setTimeout": - case "pause": - // Ignore - return this; - } - - throw new IllegalArgumentException("Unsupported action: " + action); - } - - private void open(String url) { - if (url.startsWith("/sonar/")) { - goTo(url.substring(6)); - } else { - goTo(url); - } - } - - private void goTo(String url) { - requireNonNull(url, "The url cannot be null"); - - url = replacePlaceholders(url); - - URI uri = URI.create(url.replace(" ", "%20").replace("|", "%7C")); - if (!uri.isAbsolute()) { - url = baseUrl + url; - } - - System.out.println("goTo " + url); - driver.get(url); - System.out.println(" - current url " + driver.getCurrentUrl()); - } - - private LazyDomElement find(String selector) { - selector = replacePlaceholders(selector); - - if (selector.startsWith("link=") || selector.startsWith("Link=")) { - return find("a").withText(selector.substring(5)); - } - - By by; - if (selector.startsWith("//")) { - by = new By.ByXPath(selector); - } else if (selector.startsWith("xpath=")) { - by = new By.ByXPath(selector.substring(6)); - } else if (selector.startsWith("id=")) { - by = new By.ById(selector.substring(3)); - } else if (selector.startsWith("name=")) { - by = new By.ByName(selector.substring(5)); - } else if (selector.startsWith("css=")) { - by = new By.ByCssSelector(selector.substring(4)); - } else if (selector.startsWith("class=")) { - by = new By.ByCssSelector("." + selector.substring(6)); - } else { - by = new ByCssSelectorOrByNameOrById(selector); - } - - return new LazyDomElement(driver, by); - } - - private void click(String selector) { - find(selector).click(); - } - - private void check(String selector) { - find(selector).check(); - } - - private void selectFrame(final String id) { - if ("relative=parent".equals(id)) { - return; - } - - System.out.println(" - selectFrame(" + id + ")"); - _30_SECONDS.execute(new Runnable() { - @Override - public void run() { - driver.switchTo().frame(id); - } - }); - } - - private void type(String selector, String text) { - find(selector).fill(replacePlaceholders(text)); - } - - private void keyPressAndWait(String selector, String key) { - if (!key.equals("\\13")) { - throw new IllegalArgumentException("Invalid key: " + key); - } - find(selector).pressEnter(); - } - - private void select(String selector, String text) { - if (text.startsWith("label=")) { - find(selector).select(text.substring(6)); - } else { - find(selector).select(text); - } - } - - private void assertElementPresent(String selector) { - find(selector).should().beDisplayed(); - } - - private void assertElementNotPresent(String selector) { - find(selector).should().not().beDisplayed(); - } - - private void storeText(String selector, String name) { - find(selector).execute(new ExtractVariable(name)); - } - - private void storeEval(final String expression, final String name) { - // Retry until it's not null and doesn't fail - _30_SECONDS.execute(new Runnable() { - @Override - public void run() { - Object result = ((JavascriptExecutor) driver).executeScript("return " + expression); - if (result == null) { - throw new NotFoundException(expression); - } - String value = result.toString(); - variables.put(name, value); - } - }); - } - - private void store(String expression, String name) { - if (expression.startsWith("javascript{") && expression.endsWith("}")) { - storeEval(expression.substring(11, expression.length() - 1), name); - } else { - throw new IllegalArgumentException("Invalid store expression: " + expression); - } - } - - private class ExtractVariable implements Consumer<WebElement> { - private final String name; - - ExtractVariable(String name) { - this.name = name; - } - - @Override - public void accept(WebElement webElement) { - variables.put(name, webElement.getText()); - } - - public String toString() { - return "read value into " + name; - } - } - - private void assertText(String selector, String pattern) { - pattern = replacePlaceholders(pattern); - - if (pattern.startsWith("exact:")) { - String expectedText = pattern.substring(6); - find(selector).withText(expectedText).should().exist(); - return; - } - - if (pattern.startsWith("regexp:")) { - find(selector).should().match(regex(pattern)); - return; - } - - find(selector).should().match(glob(pattern)); - } - - private void assertNotText(String selector, String pattern) { - pattern = replacePlaceholders(pattern); - - if (pattern.startsWith("exact:")) { - String expectedText = pattern.substring(6); - find(selector).withText(expectedText).should().not().exist(); - return; - } - - if (pattern.startsWith("regexp:")) { - find(selector).should().not().match(regex(pattern)); - return; - } - - find(selector).should().not().match(glob(pattern)); - } - - private static Pattern glob(String pattern) { - String regexp = pattern.replaceFirst("glob:", ""); - regexp = regexp.replaceAll("([\\]\\[\\\\{\\}$\\(\\)\\|\\^\\+.])", "\\\\$1"); - regexp = regexp.replaceAll("\\*", ".*"); - regexp = regexp.replaceAll("\\?", "."); - return Pattern.compile(regexp, DOTALL | Pattern.CASE_INSENSITIVE); - } - - private static Pattern regex(String pattern) { - String regexp = pattern.replaceFirst("regexp:", ".*") + ".*"; - return Pattern.compile(regexp, DOTALL | Pattern.CASE_INSENSITIVE); - } - - private void assertTextPresent(String text) { - find("body").should().contain(text); - } - - private void assertTextNotPresent(String text) { - find("body").should().not().contain(text); - } - - private void waitForElementPresent(String selector, String text) { - if (Strings.isNullOrEmpty(text)) { - find(selector).should().exist(); - } else { - find(selector).withText(text).should().exist(); - } - } - - private void waitForElementNotPresent(String selector, String text) { - if (Strings.isNullOrEmpty(text)) { - find(selector).should().not().exist(); - } else { - find(selector).withText(text).should().not().exist(); - } - } - - private void waitForVisible(String selector) { - find(selector).should().beDisplayed(); - } - - private void assertInputValue(String selector, String text) { - find(selector).should().contain(text); - } - - private void waitForXpathCount(String selector, int expectedCount) { - assertThat(find(selector).stream().size()).isEqualTo(expectedCount); - } - - private void confirm(final String message) { - System.out.println(" - confirm(" + message + ")"); - - _30_SECONDS.execute(new Runnable() { - @Override - public void run() { - driver.switchTo().alert().accept(); - } - }); - } - - private void assertLocation(String urlPattern) { - assertThat(driver.getCurrentUrl()).matches(glob(urlPattern)); - } - - private void verifyHtmlSource(String expect) { - assertThat(driver.getPageSource()).matches(glob(expect)); - } - - private String replacePlaceholders(String text) { - for (Map.Entry<String, String> entry : variables.entrySet()) { - text = text.replace("${" + entry.getKey() + "}", entry.getValue()); - } - return text; - } -} diff --git a/it/it-tests/src/test/java/util/selenium/Text.java b/it/it-tests/src/test/java/util/selenium/Text.java deleted file mode 100644 index 5f3b8d259ce..00000000000 --- a/it/it-tests/src/test/java/util/selenium/Text.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.selenium; - -import com.google.common.base.Joiner; -import org.openqa.selenium.By; - -public abstract class Text { - private Text() { - // Static utility class - } - - public static String doesOrNot(boolean not, String verb) { - if (!verb.contains(" ")) { - if (not) { - return "doesn't " + verb; - } else if (verb.endsWith("h")) { - return verb + "es"; - } else { - return verb + "s"; - } - } - - String[] verbs = verb.split(" "); - verbs[0] = doesOrNot(not, verbs[0]); - - return Joiner.on(" ").join(verbs); - } - - public static String isOrNot(boolean not, String state) { - return (not ? "is not " : "is ") + state; - } - - public static String plural(int n, String word) { - return (n + " " + word) + (n <= 1 ? "" : "s"); - } - - public static String toString(By selector) { - return selector.toString().replace("By.selector: ", "").replace("By.cssSelector: ", ""); - } -} diff --git a/it/it-tests/src/test/java/util/selenium/WebElementHelper.java b/it/it-tests/src/test/java/util/selenium/WebElementHelper.java deleted file mode 100644 index edb9d9dccb5..00000000000 --- a/it/it-tests/src/test/java/util/selenium/WebElementHelper.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.selenium; - -import org.openqa.selenium.WebElement; - -class WebElementHelper { - WebElementHelper() { - // Static class - } - - public static String text(WebElement element) { - String text = element.getText(); - if (!"".equals(text)) { - return nullToEmpty(text); - } - - return nullToEmpty(element.getAttribute("value")); - } - - private static String nullToEmpty(String text) { - return (text == null) ? "" : text; - } -} diff --git a/it/it-tests/src/test/java/util/user/GroupManagement.java b/it/it-tests/src/test/java/util/user/GroupManagement.java deleted file mode 100644 index 17d526456f2..00000000000 --- a/it/it-tests/src/test/java/util/user/GroupManagement.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.user; - -import java.util.List; -import java.util.Optional; -import javax.annotation.Nullable; - -/** - * @deprecated replaced by {@link org.sonarqube.test.Tester} - */ -@Deprecated -public interface GroupManagement { - void createGroup(String name); - - void createGroup(String name, @Nullable String description); - - void removeGroups(List<String> groupNames); - - void removeGroups(String... groupNames); - - Optional<Groups.Group> getGroupByName(String name); - - Groups getGroups(); - - void verifyUserGroupMembership(String userLogin, String... groups); - - Groups getUserGroups(String userLogin); - - void associateGroupsToUser(String userLogin, String... groups); -} diff --git a/it/it-tests/src/test/java/util/user/Groups.java b/it/it-tests/src/test/java/util/user/Groups.java deleted file mode 100644 index 5856352a447..00000000000 --- a/it/it-tests/src/test/java/util/user/Groups.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.user; - -import com.google.gson.Gson; -import java.util.List; - -/** - * @deprecated replaced by {@link org.sonarqube.test.Tester} - */ -@Deprecated - -public class Groups { - - private List<Group> groups; - - private Groups(List<Group> groups) { - this.groups = groups; - } - - public List<Group> getGroups() { - return groups; - } - - public static Groups parse(String json) { - Gson gson = new Gson(); - return gson.fromJson(json, Groups.class); - } - - public static class Group { - private final String name; - - private Group(String name) { - this.name = name; - } - - public String getName() { - return name; - } - } -} diff --git a/it/it-tests/src/test/java/util/user/UserRule.java b/it/it-tests/src/test/java/util/user/UserRule.java deleted file mode 100644 index 96f67c4a879..00000000000 --- a/it/it-tests/src/test/java/util/user/UserRule.java +++ /dev/null @@ -1,395 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.user; - -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.collect.FluentIterable; -import com.sonar.orchestrator.Orchestrator; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; -import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import org.junit.rules.ExternalResource; -import org.sonarqube.ws.Organizations; -import org.sonarqube.ws.WsUsers; -import org.sonarqube.ws.client.GetRequest; -import org.sonarqube.ws.client.PostRequest; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.WsResponse; -import org.sonarqube.ws.client.permission.AddUserWsRequest; -import org.sonarqube.ws.client.user.CreateRequest; -import org.sonarqube.ws.client.user.SearchRequest; -import org.sonarqube.ws.client.user.UsersService; -import util.selenium.Consumer; - -import static java.util.Arrays.asList; -import static java.util.Arrays.stream; -import static java.util.Objects.requireNonNull; -import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.guava.api.Assertions.assertThat; -import static util.ItUtils.newAdminWsClient; - -/** - * @deprecated replaced by {@link org.sonarqube.test.Tester} - */ -@Deprecated -public class UserRule extends ExternalResource implements GroupManagement { - - public static final String ADMIN_LOGIN = "admin"; - private static final AtomicInteger ID_GENERATOR = new AtomicInteger(); - private final Orchestrator orchestrator; - - private WsClient adminWsClient; - private final GroupManagement defaultOrganizationGroupManagement; - - public UserRule(Orchestrator orchestrator) { - this.orchestrator = orchestrator; - this.defaultOrganizationGroupManagement = new GroupManagementImpl(null); - } - - public static UserRule from(Orchestrator orchestrator) { - return new UserRule(requireNonNull(orchestrator, "Orchestrator instance cannot be null")); - } - - @Override - protected void after() { - deactivateAllUsers(); - // TODO delete groups - } - - // ***************** - // Users - // ***************** - - public void resetUsers() { - for (Users.User user : getUsers().getUsers()) { - String userLogin = user.getLogin(); - if (!userLogin.equals(ADMIN_LOGIN)) { - deactivateUsers(userLogin); - } - } - } - - public Users.User verifyUserExists(String login, String name, @Nullable String email) { - Optional<Users.User> user = getUserByLogin(login); - assertThat(user).as("User with login '%s' hasn't been found", login).isPresent(); - assertThat(user.get().getLogin()).isEqualTo(login); - assertThat(user.get().getName()).isEqualTo(name); - assertThat(user.get().getEmail()).isEqualTo(email); - return user.get(); - } - - public void verifyUserExists(String login, String name, @Nullable String email, boolean local) { - Users.User user = verifyUserExists(login, name, email); - assertThat(user.isLocal()).isEqualTo(local); - } - - public void verifyUserDoesNotExist(String login) { - assertThat(getUserByLogin(login)).as("Unexpected user with login '%s' has been found", login).isAbsent(); - } - - public WsUsers.CreateWsResponse.User createUser(String login, String name, @Nullable String email, String password) { - CreateRequest.Builder request = CreateRequest.builder() - .setLogin(login) - .setName(name) - .setEmail(email) - .setPassword(password); - return adminWsClient().users().create(request.build()).getUser(); - } - - /** - * Create user with randomly generated values. By default password is the login. - */ - @SafeVarargs - public final WsUsers.CreateWsResponse.User generate(Consumer<CreateRequest.Builder>... populators) { - int id = ID_GENERATOR.getAndIncrement(); - String login = "login" + id; - CreateRequest.Builder request = CreateRequest.builder() - .setLogin(login) - .setName("name" + id) - .setEmail(id + "@test.com") - .setPassword(login); - stream(populators).forEach(p -> p.accept(request)); - return adminWsClient().users().create(request.build()).getUser(); - } - - public void createUser(String login, String password) { - createUser(login, login, null, password); - } - - public WsUsers.CreateWsResponse.User createAdministrator(Organizations.Organization organization, String password) { - WsUsers.CreateWsResponse.User user = generate(p -> p.setPassword(password)); - adminWsClient.organizations().addMember(organization.getKey(), user.getLogin()); - forOrganization(organization.getKey()).associateGroupsToUser(user.getLogin(), "Owners"); - return user; - } - - /** - * Create a new admin user with random login, having password same as login - */ - public String createAdminUser() { - String login = randomAlphabetic(10).toLowerCase(); - return createAdminUser(login, login); - } - - public String createAdminUser(String login, String password) { - createUser(login, password); - adminWsClient.permissions().addUser(new AddUserWsRequest().setLogin(login).setPermission("admin")); - adminWsClient.userGroups().addUser(org.sonarqube.ws.client.usergroup.AddUserWsRequest.builder().setLogin(login).setName("sonar-administrators").build()); - return login; - } - - /** - * Create a new root user with random login, having password same as login - */ - public String createRootUser() { - String login = randomAlphabetic(10).toLowerCase(); - return createRootUser(login, login); - } - - public String createRootUser(String login, String password) { - createUser(login, password); - setRoot(login); - return login; - } - - public void setRoot(String login) { - adminWsClient().roots().setRoot(login); - } - - public void unsetRoot(String login) { - adminWsClient().roots().unsetRoot(login); - } - - public Optional<Users.User> getUserByLogin(String login) { - return FluentIterable.from(getUsers().getUsers()).firstMatch(new MatchUserLogin(login)); - } - - public Users getUsers() { - WsResponse response = adminWsClient().wsConnector().call( - new GetRequest("api/users/search")) - .failIfNotSuccessful(); - return Users.parse(response.content()); - } - - public void deactivateUsers(List<String> userLogins) { - for (String userLogin : userLogins) { - if (getUserByLogin(userLogin).isPresent()) { - adminWsClient().wsConnector().call(new PostRequest("api/users/deactivate").setParam("login", userLogin)).failIfNotSuccessful(); - } - } - } - - public void deactivateUsers(String... userLogins) { - deactivateUsers(asList(userLogins)); - } - - public void deactivateAllUsers() { - UsersService service = newAdminWsClient(orchestrator).users(); - List<String> logins = service.search(SearchRequest.builder().build()).getUsersList() - .stream() - .filter(u -> !u.getLogin().equals("admin")) - .map(u -> u.getLogin()) - .collect(Collectors.toList()); - deactivateUsers(logins); - } - - // ***************** - // User groups - // ***************** - - public GroupManagement forOrganization(String organizationKey) { - return new GroupManagementImpl(organizationKey); - } - - private final class GroupManagementImpl implements GroupManagement { - @CheckForNull - private final String organizationKey; - - private GroupManagementImpl(@Nullable String organizationKey) { - this.organizationKey = organizationKey; - } - - @Override - public void createGroup(String name) { - createGroup(name, null); - } - - @Override - public void createGroup(String name, @Nullable String description) { - PostRequest request = new PostRequest("api/user_groups/create") - .setParam("name", name) - .setParam("description", description); - addOrganizationParam(request); - adminWsClient().wsConnector().call(request).failIfNotSuccessful(); - } - - private void addOrganizationParam(PostRequest request) { - request.setParam("organization", organizationKey); - } - - private void addOrganizationParam(GetRequest request) { - request.setParam("organization", organizationKey); - } - - @Override - public void removeGroups(List<String> groupNames) { - for (String groupName : groupNames) { - if (getGroupByName(groupName).isPresent()) { - PostRequest request = new PostRequest("api/user_groups/delete") - .setParam("name", groupName); - addOrganizationParam(request); - adminWsClient().wsConnector().call(request).failIfNotSuccessful(); - } - } - } - - @Override - public void removeGroups(String... groupNames) { - removeGroups(asList(groupNames)); - } - - @Override - public java.util.Optional<Groups.Group> getGroupByName(String name) { - return getGroups().getGroups().stream().filter(new MatchGroupName(name)::apply).findFirst(); - } - - @Override - public Groups getGroups() { - GetRequest request = new GetRequest("api/user_groups/search"); - addOrganizationParam(request); - WsResponse response = adminWsClient().wsConnector().call(request).failIfNotSuccessful(); - return Groups.parse(response.content()); - } - - @Override - public void verifyUserGroupMembership(String userLogin, String... expectedGroups) { - Groups userGroup = getUserGroups(userLogin); - List<String> userGroupName = userGroup.getGroups().stream().map(Groups.Group::getName).collect(Collectors.toList()); - assertThat(userGroupName).containsOnly(expectedGroups); - } - - @Override - public Groups getUserGroups(String userLogin) { - GetRequest request = new GetRequest("api/users/groups") - .setParam("login", userLogin) - .setParam("selected", "selected"); - addOrganizationParam(request); - WsResponse response = adminWsClient().wsConnector().call(request).failIfNotSuccessful(); - return Groups.parse(response.content()); - } - - @Override - public void associateGroupsToUser(String userLogin, String... groups) { - for (String group : groups) { - PostRequest request = new PostRequest("api/user_groups/add_user") - .setParam("login", userLogin) - .setParam("name", group); - addOrganizationParam(request); - adminWsClient().wsConnector().call(request).failIfNotSuccessful(); - } - } - } - - @Override - public void createGroup(String name) { - defaultOrganizationGroupManagement.createGroup(name); - } - - @Override - public void createGroup(String name, @Nullable String description) { - defaultOrganizationGroupManagement.createGroup(name, description); - } - - @Override - public void removeGroups(List<String> groupNames) { - defaultOrganizationGroupManagement.removeGroups(groupNames); - } - - @Override - public void removeGroups(String... groupNames) { - defaultOrganizationGroupManagement.removeGroups(groupNames); - } - - @Override - public java.util.Optional<Groups.Group> getGroupByName(String name) { - return defaultOrganizationGroupManagement.getGroupByName(name); - } - - @Override - public Groups getGroups() { - return defaultOrganizationGroupManagement.getGroups(); - } - - @Override - public void verifyUserGroupMembership(String userLogin, String... groups) { - defaultOrganizationGroupManagement.verifyUserGroupMembership(userLogin, groups); - } - - @Override - public Groups getUserGroups(String userLogin) { - return defaultOrganizationGroupManagement.getUserGroups(userLogin); - } - - @Override - public void associateGroupsToUser(String userLogin, String... groups) { - defaultOrganizationGroupManagement.associateGroupsToUser(userLogin, groups); - } - - private WsClient adminWsClient() { - if (adminWsClient == null) { - adminWsClient = newAdminWsClient(orchestrator); - } - return adminWsClient; - } - - private class MatchUserLogin implements Predicate<Users.User> { - private final String login; - - private MatchUserLogin(String login) { - this.login = login; - } - - @Override - public boolean apply(@Nonnull Users.User user) { - String login = user.getLogin(); - return login != null && login.equals(this.login) && user.isActive(); - } - } - - private class MatchGroupName implements Predicate<Groups.Group> { - private final String groupName; - - private MatchGroupName(String groupName) { - this.groupName = groupName; - } - - @Override - public boolean apply(@Nonnull Groups.Group group) { - String groupName = group.getName(); - return groupName != null && groupName.equals(this.groupName); - } - } - -} diff --git a/it/it-tests/src/test/java/util/user/Users.java b/it/it-tests/src/test/java/util/user/Users.java deleted file mode 100644 index 2f0a252e6c7..00000000000 --- a/it/it-tests/src/test/java/util/user/Users.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT 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 util.user; - -import com.google.gson.Gson; -import java.util.List; - -public class Users { - - private List<User> users; - - private Users(List<User> users) { - this.users = users; - } - - public List<User> getUsers() { - return users; - } - - public static Users parse(String json) { - Gson gson = new Gson(); - return gson.fromJson(json, Users.class); - } - - public static class User { - private final String login; - private final String name; - private final String email; - private final String externalIdentity; - private final String externalProvider; - private final List<String> groups; - private final List<String> scmAccounts; - private final boolean active; - private final boolean local; - private int tokensCount; - - private User(String login, String name, String email, String externalIdentity, String externalProvider, List<String> groups, List<String> scmAccounts, - boolean active, boolean local, int tokensCount) { - this.login = login; - this.name = name; - this.externalIdentity = externalIdentity; - this.externalProvider = externalProvider; - this.email = email; - this.groups = groups; - this.scmAccounts = scmAccounts; - this.active = active; - this.tokensCount = tokensCount; - this.local = local; - } - - public String getLogin() { - return login; - } - - public String getName() { - return name; - } - - public String getEmail() { - return email; - } - - public List<String> getGroups() { - return groups; - } - - public List<String> getScmAccounts() { - return scmAccounts; - } - - public boolean isActive() { - return active; - } - - public boolean isLocal() { - return local; - } - - public int getTokensCount() { - return tokensCount; - } - - public String getExternalIdentity() { - return externalIdentity; - } - - public String getExternalProvider() { - return externalProvider; - } - } -} diff --git a/it/it-tests/src/test/resources/ItUtils.txt b/it/it-tests/src/test/resources/ItUtils.txt deleted file mode 100644 index e95e310afe6..00000000000 --- a/it/it-tests/src/test/resources/ItUtils.txt +++ /dev/null @@ -1 +0,0 @@ -Used by ItUtils to locate root directory of sources diff --git a/it/it-tests/src/test/resources/actionPlan/one-issue-per-line-profile.xml b/it/it-tests/src/test/resources/actionPlan/one-issue-per-line-profile.xml deleted file mode 100644 index 28cebcc2380..00000000000 --- a/it/it-tests/src/test/resources/actionPlan/one-issue-per-line-profile.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0"?><!-- Generated by Sonar --> -<profile> - <name>one-issue-per-line-profile</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>CRITICAL</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/administration/UsersPageTest/admin_should_change_its_own_password.html b/it/it-tests/src/test/resources/administration/UsersPageTest/admin_should_change_its_own_password.html deleted file mode 100644 index 06e806cf259..00000000000 --- a/it/it-tests/src/test/resources/administration/UsersPageTest/admin_should_change_its_own_password.html +++ /dev/null @@ -1,95 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>admin_should_change_its_own_password</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">admin_should_change_its_own_password</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/users</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=[data-login=admin-user]</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=[data-login=admin-user] .js-user-change-password</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.modal</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>id=change-user-password-old-password</td> - <td>admin-user</td> -</tr> -<tr> - <td>type</td> - <td>id=change-user-password-password</td> - <td>new-admin-user</td> -</tr> -<tr> - <td>type</td> - <td>id=change-user-password-password-confirmation</td> - <td>new-admin-user</td> -</tr> -<tr> - <td>click</td> - <td>id=change-user-password-submit</td> - <td></td> -</tr> -<tr> - <td>assertElementNotPresent</td> - <td>css=.modal</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/administration/UsersPageTest/generate_and_revoke_user_token.html b/it/it-tests/src/test/resources/administration/UsersPageTest/generate_and_revoke_user_token.html deleted file mode 100644 index c81949c4d10..00000000000 --- a/it/it-tests/src/test/resources/administration/UsersPageTest/generate_and_revoke_user_token.html +++ /dev/null @@ -1,115 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>generate_and_revoke_user_token</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">generate_and_revoke_user_token</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/users</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-tokens</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.js-user-tokens</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.modal</td> - <td>*No tokens*</td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-generate-token-form input</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>css=.js-generate-token-form input</td> - <td>test-token</td> -</tr> -<tr> - <td>click</td> - <td>css=.js-generate-token-form button</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.modal code</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.modal</td> - <td>*test-token*</td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-revoke-token-form</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.js-revoke-token-form button</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.js-revoke-token-form button</td> - <td></td> -</tr> -<tr> - <td>assertElementNotPresent</td> - <td>css=.js-revoke-token-form</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/analysis/BatchTest/one-issue-per-line.xml b/it/it-tests/src/test/resources/analysis/BatchTest/one-issue-per-line.xml deleted file mode 100644 index 7bb4ed5593a..00000000000 --- a/it/it-tests/src/test/resources/analysis/BatchTest/one-issue-per-line.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><!-- Generated by Sonar --> -<profile> - <name>one-issue-per-line</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MAJOR</priority> - </rule> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/multiline.xml b/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/multiline.xml deleted file mode 100644 index 778866e91c2..00000000000 --- a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/multiline.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><!-- Generated by Sonar --> -<profile> - <name>multiline</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>MultilineIssue</key> - <priority>MAJOR</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/no-server-analysis.json b/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/no-server-analysis.json deleted file mode 100644 index 4e1b18df6ee..00000000000 --- a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/no-server-analysis.json +++ /dev/null @@ -1,212 +0,0 @@ -{ - "components": [ - { - "key": "sample" - }, - { - "key": "sample:src/main/xoo/sample/Sample.xoo", - "moduleKey": "sample", - "path": "src/main/xoo/sample/Sample.xoo", - "status": "ADDED" - }, - { - "key": "sample:src/main/xoo/sample", - "moduleKey": "sample", - "path": "src/main/xoo/sample" - } - ], - "issues": [ - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 2, - "endOffset": 0, - "isNew": true, - "key": "<ISSUE_KEY>", - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 2, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 6, - "endOffset": 14, - "isNew": true, - "key": "<ISSUE_KEY>", - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 6, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 1, - "endOffset": 15, - "isNew": true, - "key": "<ISSUE_KEY>", - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 1, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 5, - "endOffset": 23, - "isNew": true, - "key": "<ISSUE_KEY>", - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 5, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 8, - "endOffset": 1, - "isNew": true, - "key": "<ISSUE_KEY>", - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 8, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 9, - "endOffset": 28, - "isNew": true, - "key": "<ISSUE_KEY>", - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 9, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 7, - "endOffset": 2, - "isNew": true, - "key": "<ISSUE_KEY>", - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 7, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 4, - "endOffset": 1, - "isNew": true, - "key": "<ISSUE_KEY>", - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 4, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 11, - "endOffset": 2, - "isNew": true, - "key": "<ISSUE_KEY>", - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 11, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 3, - "endOffset": 21, - "isNew": true, - "key": "<ISSUE_KEY>", - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 3, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 13, - "endOffset": 0, - "isNew": true, - "key": "<ISSUE_KEY>", - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 13, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 12, - "endOffset": 1, - "isNew": true, - "key": "<ISSUE_KEY>", - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 12, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 10, - "endOffset": 17, - "isNew": true, - "key": "<ISSUE_KEY>", - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 10, - "startOffset": 0, - "status": "OPEN" - } - ], - "rules": [ - { - "key": "xoo:OneIssuePerLine", - "name": "One Issue Per Line", - "repository": "xoo", - "rule": "OneIssuePerLine" - } - ], - "users": [], - "version": "<SONAR_VERSION>" -} diff --git a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/one-issue-per-line.xml b/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/one-issue-per-line.xml deleted file mode 100644 index 7bb4ed5593a..00000000000 --- a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/one-issue-per-line.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><!-- Generated by Sonar --> -<profile> - <name>one-issue-per-line</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MAJOR</priority> - </rule> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/report-on-root-module.json b/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/report-on-root-module.json deleted file mode 100644 index ad3c0218cdb..00000000000 --- a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/report-on-root-module.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "components": [ - { - "key": "com.sonarsource.it.samples:multi-modules-sample" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_a", - "path": "module_a" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1", - "path": "module_a1" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2", - "path": "module_a2" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_b", - "path": "module_b" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1", - "path": "module_b1" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2", - "path": "module_b2" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "moduleKey": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1", - "path": "src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "status": "SAME" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "moduleKey": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2", - "path": "src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "status": "SAME" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "moduleKey": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1", - "path": "src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "status": "SAME" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "moduleKey": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2", - "path": "src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "status": "SAME" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1", - "moduleKey": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1", - "path": "src/main/xoo/com/sonar/it/samples/modules/a1" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2", - "moduleKey": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2", - "path": "src/main/xoo/com/sonar/it/samples/modules/a2" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1", - "moduleKey": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1", - "path": "src/main/xoo/com/sonar/it/samples/modules/b1" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2", - "moduleKey": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2", - "path": "src/main/xoo/com/sonar/it/samples/modules/b2" - } - ], - "issues": [ - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 9, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 9, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 9, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 10, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 10, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 10, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 11, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 11, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 11, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 12, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 12, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 12, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 13, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 13, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 13, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 14, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 14, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 14, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 15, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 15, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 15, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 16, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 16, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 16, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 1, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 1, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 1, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 2, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 2, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 2, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 3, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 3, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 3, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 4, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 4, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 4, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 5, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 5, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 5, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 7, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 7, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 7, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 6, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 6, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 6, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 8, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 8, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 8, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 1, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 1, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 1, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 2, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 2, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 2, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 3, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 3, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 3, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 4, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 4, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 4, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 5, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 5, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 5, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 6, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 6, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 6, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 7, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 7, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 7, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 8, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 8, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 8, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 9, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 9, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 9, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 10, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 10, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 10, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 11, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 11, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 11, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 12, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 12, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 12, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 13, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 13, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 13, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 14, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 14, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 14, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 15, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 15, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 15, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 16, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 16, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 16, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 17, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 17, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 17, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 18, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 18, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 18, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 19, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 19, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 19, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 20, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 20, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 20, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a2:src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 21, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 21, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 21, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 1, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 1, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 1, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 2, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 2, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 2, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 3, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 3, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 3, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 4, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 4, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 4, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 5, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 5, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 5, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 6, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 6, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 6, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 7, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 7, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 7, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 8, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 8, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 8, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 9, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 9, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 9, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 10, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 10, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 10, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 11, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 11, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 11, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b1:src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 12, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 12, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 12, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 1, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 1, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 1, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 2, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 2, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 2, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 3, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 3, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 3, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 4, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 4, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 4, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 5, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 5, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 5, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 6, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 6, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 6, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 7, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 7, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 7, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 8, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 8, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 8, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 9, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 9, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 9, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 10, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 10, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 10, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 12, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 12, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 12, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_b:module_b2:src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 11, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 11, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 11, - "status": "OPEN" - } - ], - "rules": [ - { - "key": "xoo:OneIssuePerLine", - "name": "One Issue Per Line", - "repository": "xoo", - "rule": "OneIssuePerLine" - } - ], - "users": [], - "version": "<SONAR_VERSION>" -} diff --git a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/report-on-single-module-branch.json b/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/report-on-single-module-branch.json deleted file mode 100644 index aa066bbbf2f..00000000000 --- a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/report-on-single-module-branch.json +++ /dev/null @@ -1,255 +0,0 @@ -{ - "components": [ - { - "key": "sample:mybranch" - }, - { - "key": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "moduleKey": "sample:mybranch", - "path": "src/main/xoo/sample/Sample.xoo", - "status": "CHANGED" - }, - { - "key": "sample:mybranch:src/main/xoo/sample", - "moduleKey": "sample:mybranch", - "path": "src/main/xoo/sample" - } - ], - "issues": [ - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 1, - "endOffset": 15, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 1, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 1, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 2, - "endOffset": 0, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 2, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 2, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 3, - "endOffset": 21, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 3, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 3, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 4, - "endOffset": 1, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 4, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 4, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 5, - "endOffset": 23, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 5, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 5, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 6, - "endOffset": 14, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 6, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 6, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 8, - "endOffset": 2, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 8, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 8, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 9, - "endOffset": 1, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 9, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 9, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 10, - "endOffset": 28, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 10, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 10, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 12, - "endOffset": 17, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 12, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 12, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 13, - "endOffset": 2, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 13, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 13, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 14, - "endOffset": 1, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 14, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 14, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 15, - "endOffset": 0, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 15, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 15, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 11, - "endOffset": 28, - "isNew": true, - "key": "<ISSUE_KEY>", - "line": 11, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 11, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:mybranch:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 7, - "endOffset": 28, - "isNew": true, - "key": "<ISSUE_KEY>", - "line": 7, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 7, - "startOffset": 0, - "status": "OPEN" - } - ], - "rules": [ - { - "key": "xoo:OneIssuePerLine", - "name": "One Issue Per Line", - "repository": "xoo", - "rule": "OneIssuePerLine" - } - ], - "users": [], - "version": "<SONAR_VERSION>" -} diff --git a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/report-on-single-module.json b/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/report-on-single-module.json deleted file mode 100644 index 6c3aab91f02..00000000000 --- a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/report-on-single-module.json +++ /dev/null @@ -1,255 +0,0 @@ -{ - "components": [ - { - "key": "sample" - }, - { - "key": "sample:src/main/xoo/sample/Sample.xoo", - "moduleKey": "sample", - "path": "src/main/xoo/sample/Sample.xoo", - "status": "CHANGED" - }, - { - "key": "sample:src/main/xoo/sample", - "moduleKey": "sample", - "path": "src/main/xoo/sample" - } - ], - "issues": [ - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 11, - "endOffset": 28, - "isNew": true, - "key": "<ISSUE_KEY>", - "line": 11, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 11, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-02T00:00:00+0200", - "endLine": 7, - "endOffset": 28, - "isNew": true, - "key": "<ISSUE_KEY>", - "line": 7, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 7, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 1, - "endOffset": 15, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 1, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 1, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 2, - "endOffset": 0, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 2, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 2, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 3, - "endOffset": 21, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 3, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 3, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 4, - "endOffset": 1, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 4, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 4, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 5, - "endOffset": 23, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 5, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 5, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 6, - "endOffset": 14, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 6, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 6, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 8, - "endOffset": 2, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 8, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 8, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 9, - "endOffset": 1, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 9, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 9, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 10, - "endOffset": 28, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 10, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 10, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 12, - "endOffset": 17, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 12, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 12, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 13, - "endOffset": 2, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 13, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 13, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 14, - "endOffset": 1, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 14, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 14, - "startOffset": 0, - "status": "OPEN" - }, - { - "component": "sample:src/main/xoo/sample/Sample.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 15, - "endOffset": 0, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 15, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 15, - "startOffset": 0, - "status": "OPEN" - } - ], - "rules": [ - { - "key": "xoo:OneIssuePerLine", - "name": "One Issue Per Line", - "repository": "xoo", - "rule": "OneIssuePerLine" - } - ], - "users": [], - "version": "<SONAR_VERSION>" -} diff --git a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/report-on-sub-module.json b/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/report-on-sub-module.json deleted file mode 100644 index 84a68c4d5a4..00000000000 --- a/it/it-tests/src/test/resources/analysis/IssueJsonReportTest/report-on-sub-module.json +++ /dev/null @@ -1,238 +0,0 @@ -{ - "components": [ - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "moduleKey": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1", - "path": "src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "status": "SAME" - }, - { - "key": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1", - "moduleKey": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1", - "path": "src/main/xoo/com/sonar/it/samples/modules/a1" - } - ], - "issues": [ - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 1, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 1, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 1, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 2, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 2, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 2, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 3, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 3, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 3, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 4, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 4, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 4, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 5, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 5, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 5, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 6, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 6, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 6, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 7, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 7, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 7, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 8, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 8, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 8, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 9, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 9, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 9, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 10, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 10, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 10, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 11, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 11, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 11, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 12, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 12, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 12, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 13, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 13, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 13, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 14, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 14, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 14, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 15, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 15, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 15, - "status": "OPEN" - }, - { - "component": "com.sonarsource.it.samples:multi-modules-sample:module_a:module_a1:src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo", - "creationDate": "2013-05-01T00:00:00+0200", - "endLine": 16, - "isNew": false, - "key": "<ISSUE_KEY>", - "line": 16, - "message": "This issue is generated on each line", - "rule": "xoo:OneIssuePerLine", - "severity": "MAJOR", - "startLine": 16, - "status": "OPEN" - } - ], - "rules": [ - { - "key": "xoo:OneIssuePerLine", - "name": "One Issue Per Line", - "repository": "xoo", - "rule": "OneIssuePerLine" - } - ], - "users": [], - "version": "<SONAR_VERSION>" -} diff --git a/it/it-tests/src/test/resources/analysis/IssuesModeTest/empty.xml b/it/it-tests/src/test/resources/analysis/IssuesModeTest/empty.xml deleted file mode 100644 index 8bab61d6c85..00000000000 --- a/it/it-tests/src/test/resources/analysis/IssuesModeTest/empty.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><!-- Generated by Sonar --> -<profile> - <name>empty</name> - <language>xoo</language> - <rules> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/analysis/IssuesModeTest/one-issue-per-line-empty.xml b/it/it-tests/src/test/resources/analysis/IssuesModeTest/one-issue-per-line-empty.xml deleted file mode 100644 index 0ba34f10dbd..00000000000 --- a/it/it-tests/src/test/resources/analysis/IssuesModeTest/one-issue-per-line-empty.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><!-- Generated by Sonar --> -<profile> - <name>one-issue-per-line</name> - <language>xoo</language> - <rules> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/analysis/IssuesModeTest/one-issue-per-line.xml b/it/it-tests/src/test/resources/analysis/IssuesModeTest/one-issue-per-line.xml deleted file mode 100644 index 7bb4ed5593a..00000000000 --- a/it/it-tests/src/test/resources/analysis/IssuesModeTest/one-issue-per-line.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><!-- Generated by Sonar --> -<profile> - <name>one-issue-per-line</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MAJOR</priority> - </rule> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/analysis/IssuesModeTest/with-many-rules.xml b/it/it-tests/src/test/resources/analysis/IssuesModeTest/with-many-rules.xml deleted file mode 100644 index f3d0baf0616..00000000000 --- a/it/it-tests/src/test/resources/analysis/IssuesModeTest/with-many-rules.xml +++ /dev/null @@ -1,32 +0,0 @@ -<profile> - <name>with-many-rules</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>HasTag</key> - <priority>INFO</priority> - <parameters> - <parameter> - <key>tag</key> - <value>xoo</value> - </parameter> - </parameters> - </rule> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/analysis/MultiLanguageTest/one-issue-per-line-xoo2.xml b/it/it-tests/src/test/resources/analysis/MultiLanguageTest/one-issue-per-line-xoo2.xml deleted file mode 100644 index 67215f91a52..00000000000 --- a/it/it-tests/src/test/resources/analysis/MultiLanguageTest/one-issue-per-line-xoo2.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><!-- Generated by Sonar --> -<profile> - <name>one-issue-per-line-xoo2</name> - <language>xoo2</language> - <rules> - <rule> - <repositoryKey>xoo2</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MAJOR</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/analysis/MultiLanguageTest/one-issue-per-line.xml b/it/it-tests/src/test/resources/analysis/MultiLanguageTest/one-issue-per-line.xml deleted file mode 100644 index 7bb4ed5593a..00000000000 --- a/it/it-tests/src/test/resources/analysis/MultiLanguageTest/one-issue-per-line.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><!-- Generated by Sonar --> -<profile> - <name>one-issue-per-line</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MAJOR</priority> - </rule> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/analysis/SSLTest/README b/it/it-tests/src/test/resources/analysis/SSLTest/README deleted file mode 100644 index fb535a907c6..00000000000 --- a/it/it-tests/src/test/resources/analysis/SSLTest/README +++ /dev/null @@ -1,184 +0,0 @@ -$ openssl req -config ./openssl.cnf -newkey rsa:2048 -nodes -keyform PEM -keyout ca.key -x509 -days 3650 -extensions certauth -outform PEM -out ca.cer -Generating a 2048 bit RSA private key -..............................................+++ -........................................................................................................+++ -writing new private key to 'ca.key' ------ -You are about to be asked to enter information that will be incorporated -into your certificate request. -What you are about to enter is what is called a Distinguished Name or a DN. -There are quite a few fields but you can leave some blank -For some fields there will be a default value, -If you enter '.', the field will be left blank. ------ -Country [FR]: -Locality [Poitiers]: -Organization [SonarSource]: -Common Name []:CA for SonarQube ITs - -$ openssl genrsa -out server.key 2048 -Generating RSA private key, 2048 bit long modulus -........................+++ -............................+++ -e is 65537 (0x10001) - -$ openssl req -config ./openssl.cnf -new -key server.key -out server.req -You are about to be asked to enter information that will be incorporated -into your certificate request. -What you are about to enter is what is called a Distinguished Name or a DN. -There are quite a few fields but you can leave some blank -For some fields there will be a default value, -If you enter '.', the field will be left blank. ------ -Country [FR]: -Locality [Poitiers]: -Organization [SonarSource]: -Common Name []:localhost - -$ openssl x509 -req -in server.req -CA ca.cer -CAkey ca.key -set_serial 100 -extfile openssl.cnf -extensions server -days 3650 -outform PEM -out server.cer -Signature ok -subject=/C=FR/L=Poitiers/O=SonarSource/CN=localhost -Getting CA Private Key - -$ openssl genrsa -out client.key 2048 -Generating RSA private key, 2048 bit long modulus -...................................+++ -.....................................................+++ -e is 65537 (0x10001) - -$ openssl req -config ./openssl.cnf -new -key client.key -out client.req -You are about to be asked to enter information that will be incorporated -into your certificate request. -What you are about to enter is what is called a Distinguished Name or a DN. -There are quite a few fields but you can leave some blank -For some fields there will be a default value, -If you enter '.', the field will be left blank. ------ -Country [FR]: -Locality [Poitiers]: -Organization [SonarSource]: -Common Name []:Julien Henry - -$ openssl x509 -req -in client.req -CA ca.cer -CAkey ca.key -set_serial 101 -extfile openssl.cnf -extensions client -days 3650 -outform PEM -out client.cer -Signature ok -subject=/C=FR/L=Poitiers/O=SonarSource/CN=Julien Henry -Getting CA Private Key - -$ openssl pkcs12 -export -inkey client.key -in client.cer -out client.p12 -Enter Export Password: clientp12pwd -Verifying - Enter Export Password: clientp12pwd - -$ openssl pkcs12 -inkey server.key -in server.cer -export -out server.p12 -Enter Export Password: serverp12pwd -Verifying - Enter Export Password: serverp12pwd - -$ keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -destkeystore serverkeystore.jks -Entrez le mot de passe du fichier de clés de destination : serverkeystorepwd -Ressaisissez le nouveau mot de passe : serverkeystorepwd -Entrez le mot de passe du fichier de clés source : serverp12pwd -L'entrée de l'alias 1 a été importée. -Commande d'import exécutée : 1 entrées importées, échec ou annulation de 0 entrées - -$ keytool -import -file ca.cer -keystore servertruststore.jks -Entrez le mot de passe du fichier de clés : servertruststorepwd -Ressaisissez le nouveau mot de passe : servertruststorepwd -Propriétaire : CN=Test CA, O=SonarSource, L=Poitiers, C=FR -Emetteur : CN=Test CA, O=SonarSource, L=Poitiers, C=FR -Numéro de série : dabbebc7bce2fc6a -Valide du : Wed Aug 31 14:42:15 CEST 2016 au : Sat Aug 29 14:42:15 CEST 2026 -Empreintes du certificat : - MD5: 69:36:AE:65:51:CD:F4:C3:83:77:DE:45:AE:49:01:1A - SHA1 : 77:92:45:84:18:FC:34:7A:2A:B0:EC:3D:22:48:15:1A:19:71:1D:B3 - SHA256 : 99:03:89:84:6E:E3:D3:B7:12:2D:70:7E:49:88:49:41:52:1C:89:3A:9B:C0:83:D1:C5:44:D4:93:FB:42:C8:07 - Nom de l'algorithme de signature : SHA1withRSA - Version : 3 - -Extensions : - -#1: ObjectId: 2.5.29.35 Criticality=false -AuthorityKeyIdentifier [ -KeyIdentifier [ -0000: 3A 61 C1 86 AD BE FC 15 82 B3 59 FF 00 28 5E F9 :a........Y..(^. -0010: B5 5A 87 04 .Z.. -] -[CN=Test CA, O=SonarSource, L=Poitiers, C=FR] -SerialNumber: [ dabbebc7 bce2fc6a] -] - -#2: ObjectId: 2.5.29.19 Criticality=false -BasicConstraints:[ - CA:true - PathLen:2147483647 -] - -#3: ObjectId: 2.5.29.31 Criticality=false -CRLDistributionPoints [ - [DistributionPoint: - [URIName: http://testca.local/ca.crl] -]] - -#4: ObjectId: 2.5.29.14 Criticality=false -SubjectKeyIdentifier [ -KeyIdentifier [ -0000: 3A 61 C1 86 AD BE FC 15 82 B3 59 FF 00 28 5E F9 :a........Y..(^. -0010: B5 5A 87 04 .Z.. -] -] - -Faire confiance à ce certificat ? [non] : oui -Certificat ajouté au fichier de clés - -$ keytool -import -file server.cer -keystore clienttruststore.jks -Entrez le mot de passe du fichier de clés : clienttruststorepwd -Ressaisissez le nouveau mot de passe : clienttruststorepwd -Propriétaire : CN=localhost, O=SonarSource, L=Poitiers, C=FR -Emetteur : CN=Test CA, O=SonarSource, L=Poitiers, C=FR -Numéro de série : 64 -Valide du : Wed Aug 31 14:45:30 CEST 2016 au : Thu Aug 31 14:45:30 CEST 2017 -Empreintes du certificat : - MD5: 40:52:F4:5E:67:C3:68:B6:00:7D:70:C0:1E:8E:75:2E - SHA1 : 83:3F:4F:AC:4E:E6:F4:06:14:01:E6:5B:F2:63:34:94:68:12:8C:3A - SHA256 : 7C:03:9A:CA:0D:B5:57:A5:66:56:75:09:23:45:9E:D5:CC:6C:72:14:0B:4B:9B:E8:29:3F:78:4C:9F:D6:77:E2 - Nom de l'algorithme de signature : SHA256withRSA - Version : 3 - -Extensions : - -#1: ObjectId: 2.5.29.19 Criticality=false -BasicConstraints:[ - CA:false - PathLen: undefined -] - -#2: ObjectId: 2.5.29.31 Criticality=false -CRLDistributionPoints [ - [DistributionPoint: - [URIName: http://testca.local/ca.crl] -]] - -#3: ObjectId: 2.5.29.37 Criticality=false -ExtendedKeyUsages [ - serverAuth -] - -#4: ObjectId: 2.5.29.15 Criticality=false -KeyUsage [ - DigitalSignature - Key_Encipherment - Data_Encipherment -] - -#5: ObjectId: 2.16.840.1.113730.1.1 Criticality=false -NetscapeCertType [ - SSL server -] - -Faire confiance à ce certificat ? [non] : oui -Certificat ajouté au fichier de clés - -$ keytool -importkeystore -srckeystore client.p12 -srcstoretype PKCS12 -destkeystore clientkeystore.jks -Entrez le mot de passe du fichier de clés de destination : clientp12pwd -Ressaisissez le nouveau mot de passe : clientp12pwd -Entrez le mot de passe du fichier de clés source : clientp12pwd -L'entrée de l'alias 1 a été importée. -Commande d'import exécutée : 1 entrées importées, échec ou annulation de 0 entrées diff --git a/it/it-tests/src/test/resources/analysis/SSLTest/clientkeystore.jks b/it/it-tests/src/test/resources/analysis/SSLTest/clientkeystore.jks Binary files differdeleted file mode 100644 index 653f3c7f093..00000000000 --- a/it/it-tests/src/test/resources/analysis/SSLTest/clientkeystore.jks +++ /dev/null diff --git a/it/it-tests/src/test/resources/analysis/SSLTest/clienttruststore.jks b/it/it-tests/src/test/resources/analysis/SSLTest/clienttruststore.jks Binary files differdeleted file mode 100644 index 2529245e1c6..00000000000 --- a/it/it-tests/src/test/resources/analysis/SSLTest/clienttruststore.jks +++ /dev/null diff --git a/it/it-tests/src/test/resources/analysis/SSLTest/openssl.cnf b/it/it-tests/src/test/resources/analysis/SSLTest/openssl.cnf deleted file mode 100644 index 4a5148fd4d7..00000000000 --- a/it/it-tests/src/test/resources/analysis/SSLTest/openssl.cnf +++ /dev/null @@ -1,38 +0,0 @@ -[ req ] -default_md = sha1 -distinguished_name = req_distinguished_name - -[ req_distinguished_name ] -countryName = Country -countryName_default = FR -countryName_min = 2 -countryName_max = 2 -localityName = Locality -localityName_default = Poitiers -organizationName = Organization -organizationName_default = SonarSource -commonName = Common Name -commonName_max = 64 - -[ certauth ] -subjectKeyIdentifier = hash -authorityKeyIdentifier = keyid:always,issuer:always -basicConstraints = CA:true -crlDistributionPoints = @crl - -[ server ] -basicConstraints = CA:FALSE -keyUsage = digitalSignature, keyEncipherment, dataEncipherment -extendedKeyUsage = serverAuth -nsCertType = server -crlDistributionPoints = @crl - -[ client ] -basicConstraints = CA:FALSE -keyUsage = digitalSignature, keyEncipherment, dataEncipherment -extendedKeyUsage = clientAuth -nsCertType = client -crlDistributionPoints = @crl - -[ crl ] -URI=http://testca.local/ca.crl
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/analysis/SSLTest/serverkeystore.jks b/it/it-tests/src/test/resources/analysis/SSLTest/serverkeystore.jks Binary files differdeleted file mode 100644 index 319c899278a..00000000000 --- a/it/it-tests/src/test/resources/analysis/SSLTest/serverkeystore.jks +++ /dev/null diff --git a/it/it-tests/src/test/resources/analysis/SSLTest/servertruststore.jks b/it/it-tests/src/test/resources/analysis/SSLTest/servertruststore.jks Binary files differdeleted file mode 100644 index a3aee3b8a9d..00000000000 --- a/it/it-tests/src/test/resources/analysis/SSLTest/servertruststore.jks +++ /dev/null diff --git a/it/it-tests/src/test/resources/analysis/SettingsEncryptionTest/sonar-secret.txt b/it/it-tests/src/test/resources/analysis/SettingsEncryptionTest/sonar-secret.txt deleted file mode 100644 index 65b98c522da..00000000000 --- a/it/it-tests/src/test/resources/analysis/SettingsEncryptionTest/sonar-secret.txt +++ /dev/null @@ -1 +0,0 @@ -0PZz+G+f8mjr3sPn4+AhHg==
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/analysis/TempFolderTest/one-issue-per-line.xml b/it/it-tests/src/test/resources/analysis/TempFolderTest/one-issue-per-line.xml deleted file mode 100644 index 7bb4ed5593a..00000000000 --- a/it/it-tests/src/test/resources/analysis/TempFolderTest/one-issue-per-line.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><!-- Generated by Sonar --> -<profile> - <name>one-issue-per-line</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MAJOR</priority> - </rule> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/authorisation/PermissionTemplatesPageTest/should_create.html b/it/it-tests/src/test/resources/authorisation/PermissionTemplatesPageTest/should_create.html deleted file mode 100644 index 0e67e0f4fab..00000000000 --- a/it/it-tests/src/test/resources/authorisation/PermissionTemplatesPageTest/should_create.html +++ /dev/null @@ -1,99 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should_create</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>root-user</td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>root-user</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>name=commit</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/permission_templates</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.page-actions button</td> - <td></td> - </tr> - <tr> - <td>click</td> - <td>css=.page-actions button</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=#permission-template-name</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>css=#permission-template-name</td> - <td>Custom</td> - </tr> - <tr> - <td>type</td> - <td>css=#permission-template-description</td> - <td>Description</td> - </tr> - <tr> - <td>type</td> - <td>css=#permission-template-project-key-pattern</td> - <td>.*</td> - </tr> - <tr> - <td>click</td> - <td>css=#permission-template-submit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=tr[data-name="Custom"]</td> - <td></td> - </tr> - <tr> - <td>assertText</td> - <td>css=tr[data-name="Custom"] .js-name</td> - <td>*Custom*</td> - </tr> - <tr> - <td>assertText</td> - <td>css=tr[data-name="Custom"] .js-description</td> - <td>*Description*</td> - </tr> - <tr> - <td>assertText</td> - <td>css=tr[data-name="Custom"] .js-project-key-pattern</td> - <td>*.*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/authorisation/PermissionTemplatesPageTest/should_display_page.html b/it/it-tests/src/test/resources/authorisation/PermissionTemplatesPageTest/should_display_page.html deleted file mode 100644 index 8d9640f25b6..00000000000 --- a/it/it-tests/src/test/resources/authorisation/PermissionTemplatesPageTest/should_display_page.html +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should_display_page</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/permission_templates</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=tr[data-id="default_template"]</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=tr[data-id="default_template"] .js-name</td> - <td>*Default template*</td> -</tr> -<tr> - <td>assertText</td> - <td>css=tr[data-id="default_template"] .js-defaults</td> - <td>*Projects*</td> -</tr> -<tr> - <td>assertText</td> - <td>css=tr[data-id="default_template"] .js-description</td> - <td>*This permission template will be used*</td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=td[data-permission="user"]</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=td[data-permission="codeviewer"]</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=td[data-permission="issueadmin"]</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=td[data-permission="admin"]</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=td[data-permission="scan"]</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/authorisation/PermissionTemplatesPageTest/should_manage_project_creators.html b/it/it-tests/src/test/resources/authorisation/PermissionTemplatesPageTest/should_manage_project_creators.html deleted file mode 100644 index 3d1c172a783..00000000000 --- a/it/it-tests/src/test/resources/authorisation/PermissionTemplatesPageTest/should_manage_project_creators.html +++ /dev/null @@ -1,109 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should_manage_project_creators</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>name=commit</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/permission_templates</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=td[data-permission="user"]</td> - <td></td> - </tr> - <tr> - <td>click</td> - <td>css=td[data-permission="user"] .js-update-users</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=#grant-to-project-creators</td> - <td></td> - </tr> - <tr> - <td>assertElementPresent</td> - <td>css=#grant-to-project-creators:not(:checked)</td> - <td></td> - </tr> - <tr> - <td>click</td> - <td>css=#grant-to-project-creators</td> - <td></td> - </tr> - <tr> - <td>click</td> - <td>css=.js-modal-close</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=td[data-permission="user"] .js-project-creators</td> - <td></td> - </tr> - <tr> - <td>click</td> - <td>css=td[data-permission="user"] .js-update-users</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=#grant-to-project-creators</td> - <td></td> - </tr> - <tr> - <td>assertElementPresent</td> - <td>css=#grant-to-project-creators:checked</td> - <td></td> - </tr> - <tr> - <td>click</td> - <td>css=#grant-to-project-creators</td> - <td></td> - </tr> - <tr> - <td>click</td> - <td>css=.js-modal-close</td> - <td></td> - </tr> - <tr> - <td>waitForElementNotPresent</td> - <td>css=td[data-permission="user"] .js-project-creators</td> - <td></td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/authorisation/ProvisioningPermissionTest/should-be-able-to-provision-project.html b/it/it-tests/src/test/resources/authorisation/ProvisioningPermissionTest/should-be-able-to-provision-project.html deleted file mode 100644 index c5db3b4898a..00000000000 --- a/it/it-tests/src/test/resources/authorisation/ProvisioningPermissionTest/should-be-able-to-provision-project.html +++ /dev/null @@ -1,59 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>user-cannot-administrate-profile</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin-with-provisioning</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>password</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/projects_admin</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=#projects-type__ALL</td> - <td></td> - </tr> - <tr> - <td>assertText</td> - <td>css=.page-actions button</td> - <td>*Create Project*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/authorisation/ProvisioningPermissionTest/should-not-be-able-to-provision-project.html b/it/it-tests/src/test/resources/authorisation/ProvisioningPermissionTest/should-not-be-able-to-provision-project.html deleted file mode 100644 index 270daf67cd9..00000000000 --- a/it/it-tests/src/test/resources/authorisation/ProvisioningPermissionTest/should-not-be-able-to-provision-project.html +++ /dev/null @@ -1,59 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>user-cannot-administrate-profile</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin-without-provisioning</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>password</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/projects_admin</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=#projects-type__ALL</td> - <td></td> - </tr> - <tr> - <td>assertNotText</td> - <td>css=.page-actions button</td> - <td>*Create Project*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/authorisation/QualityProfileAdminPermissionTest/normal-user.html b/it/it-tests/src/test/resources/authorisation/QualityProfileAdminPermissionTest/normal-user.html deleted file mode 100644 index b9190a27027..00000000000 --- a/it/it-tests/src/test/resources/authorisation/QualityProfileAdminPermissionTest/normal-user.html +++ /dev/null @@ -1,69 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>user-cannot-administrate-profile</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>not_profileadm</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>userpwd</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/profiles</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table-row[data-name="foo"]</td> - <td></td> - </tr> - <tr> - <td>click</td> - <td>css=.quality-profiles-table-row[data-name="foo"] .quality-profiles-table-name a</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>css=.quality-profile-header</td> - <td>*foo*</td> - </tr> - <tr> - <td>assertElementNotPresent</td> - <td>css=.js-change-parent</td> - <td></td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/authorisation/QualityProfileAdminPermissionTest/profile-admin.html b/it/it-tests/src/test/resources/authorisation/QualityProfileAdminPermissionTest/profile-admin.html deleted file mode 100644 index 86d6b26ece8..00000000000 --- a/it/it-tests/src/test/resources/authorisation/QualityProfileAdminPermissionTest/profile-admin.html +++ /dev/null @@ -1,84 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>user-can-administrate-profile</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>profileadm</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>papwd</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table-row[data-name="foo"]</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-profiles-table-row[data-name="foo"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-header</td> - <td>*foo*</td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=.js-change-parent</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/project/quality_profiles?id=sample</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>id=content</td> - <td>*Quality Profiles*</td> -</tr> -<tr> - <td>waitForText</td> - <td>id=content</td> - <td>*Xoo*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/authorisation/one-issue-per-line-profile.xml b/it/it-tests/src/test/resources/authorisation/one-issue-per-line-profile.xml deleted file mode 100644 index 521adc7e06f..00000000000 --- a/it/it-tests/src/test/resources/authorisation/one-issue-per-line-profile.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<profile> - <name>one-issue-per-line</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/dbCleaner/one-issue-per-line-profile.xml b/it/it-tests/src/test/resources/dbCleaner/one-issue-per-line-profile.xml deleted file mode 100644 index 2006b6fb365..00000000000 --- a/it/it-tests/src/test/resources/dbCleaner/one-issue-per-line-profile.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0"?><!-- Generated by Sonar --> -<profile> - <name>one-issue-per-line-profile</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MAJOR</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsOnRemoveFileTest/duplications-with-deleted-project.html b/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsOnRemoveFileTest/duplications-with-deleted-project.html deleted file mode 100644 index 37a48368f83..00000000000 --- a/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsOnRemoveFileTest/duplications-with-deleted-project.html +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>duplications-with-deleted-project</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">duplications-with-deleted-project</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/component/index?id=duplicate-project%3Asrc%2Fmain%2Fxoo%2Fsample%2FFile1.xoo</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>css=.source-viewer</td> - <td>*src/main/xoo/sample/File1.xoo*</td> - </tr> - <tr> - <td>waitForText</td> - <td>css=.source-table</td> - <td>*File1*</td> - </tr> - <tr> - <td>click</td> - <td>css=.source-line-duplicated</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.bubble-popup</td> - <td></td> - </tr> - <tr> - <td>assertElementPresent</td> - <td>css=.bubble-popup .alert</td> - <td></td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsOnRemoveFileTest/duplications_on_removed_file-expected.json b/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsOnRemoveFileTest/duplications_on_removed_file-expected.json deleted file mode 100644 index 37f0e402120..00000000000 --- a/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsOnRemoveFileTest/duplications_on_removed_file-expected.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "duplications": [ - { - "blocks": [ - { - "from": 9, - "size": 27 - }, - { - "from": 9, - "size": 27, - "_ref": "1" - } - ] - } - ], - "files": { - "1": { - "key": "duplicate-project:src/main/xoo/sample/File1.xoo", - "name": "src/main/xoo/sample/File1.xoo", - "project": "duplicate-project", - "projectName": "duplicate-project" - } - } -} diff --git a/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsTest/cross-project-duplications-viewer.html b/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsTest/cross-project-duplications-viewer.html deleted file mode 100644 index 689594fdbb1..00000000000 --- a/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsTest/cross-project-duplications-viewer.html +++ /dev/null @@ -1,59 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>cross-project-duplications-viewer</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">cross-project-duplications-viewer</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/component/index?id=duplicate-project%3Asrc%2Fmain%2Fxoo%2Fsample%2FFile1.xoo</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.source-line</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>css=.source-viewer-header</td> - <td>*75.0%*</td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.source-line-duplicated</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>css=[data-line-number='3']</td> - <td>*File1*</td> - </tr> - <tr> - <td>click</td> - <td>css=.source-line-duplicated</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.bubble-popup</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>css=.bubble-popup</td> - <td>glob:*origin-project*File1.xoo*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsTest/duplications_show-expected.json b/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsTest/duplications_show-expected.json deleted file mode 100644 index a9b0c623f53..00000000000 --- a/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsTest/duplications_show-expected.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "duplications": [ - { - "blocks": [ - { - "from": 9, - "size": 27, - "_ref": "1" - }, - { - "from": 9, - "size": 27, - "_ref": "2" - } - ] - } - ], - "files": { - "2": { - "key": "origin-project:src/main/xoo/sample/File1.xoo", - "name": "src/main/xoo/sample/File1.xoo", - "project": "origin-project", - "projectName": "origin-project" - }, - "1": { - "key": "duplicate-project:src/main/xoo/sample/File1.xoo", - "name": "src/main/xoo/sample/File1.xoo", - "project": "duplicate-project", - "projectName": "duplicate-project" - } - } -} diff --git a/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsTest/sources_lines_duplication-expected.json b/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsTest/sources_lines_duplication-expected.json deleted file mode 100644 index 0ce4c68a243..00000000000 --- a/it/it-tests/src/test/resources/duplication/CrossProjectDuplicationsTest/sources_lines_duplication-expected.json +++ /dev/null @@ -1,184 +0,0 @@ -{ - "sources": [ - { - "line": 1, - "code": "package sample;", - "duplicated": false - }, - { - "line": 2, - "code": "", - "duplicated": false - }, - { - "line": 3, - "code": "public class File1 {", - "duplicated": false - }, - { - "line": 4, - "code": "", - "duplicated": false - }, - { - "line": 5, - "code": " public File1() {", - "duplicated": false - }, - { - "line": 6, - "code": " }", - "duplicated": false - }, - { - "line": 7, - "code": "", - "duplicated": false - }, - { - "line": 8, - "code": " public void test() {", - "duplicated": false - }, - { - "line": 9, - "code": " char[] charList = new char[30];", - "duplicated": true - }, - { - "line": 10, - "code": " for (int i = 0; i < 10; i++) {", - "duplicated": true - }, - { - "line": 11, - "code": " charList[i] = 'a';", - "duplicated": true - }, - { - "line": 12, - "code": " }", - "duplicated": true - }, - { - "line": 13, - "code": " for (int i = 0; i < 10; i++) {", - "duplicated": true - }, - { - "line": 14, - "code": " charList[i] = 'a';", - "duplicated": true - }, - { - "line": 15, - "code": " }", - "duplicated": true - }, - { - "line": 16, - "code": " int intergerToBeIncremented = 0;", - "duplicated": true - }, - { - "line": 17, - "code": " while (intergerToBeIncremented < 100) {", - "duplicated": true - }, - { - "line": 18, - "code": " intergerToBeIncremented++;", - "duplicated": true - }, - { - "line": 19, - "code": " }", - "duplicated": true - }, - { - "line": 20, - "code": " int intergerToBeIncremented2 = 0;", - "duplicated": true - }, - { - "line": 21, - "code": " while (intergerToBeIncremented2 < 100) {", - "duplicated": true - }, - { - "line": 22, - "code": " intergerToBeIncremented2++;", - "duplicated": true - }, - { - "line": 23, - "code": " }", - "duplicated": true - }, - { - "line": 24, - "code": " String temp = \"\";", - "duplicated": true - }, - { - "line": 25, - "code": " for (int i=0; i<10; i++){", - "duplicated": true - }, - { - "line": 26, - "code": " temp += \"say something\"+i;", - "duplicated": true - }, - { - "line": 27, - "code": " }", - "duplicated": true - }, - { - "line": 28, - "code": " for (int i=0; i<20; i++){", - "duplicated": true - }, - { - "line": 29, - "code": " temp += \"say nothing\"+i;", - "duplicated": true - }, - { - "line": 30, - "code": " }", - "duplicated": true - }, - { - "line": 31, - "code": " for (int i=0; i<30; i++){", - "duplicated": true - }, - { - "line": 32, - "code": " temp += \"always say nothing\"+i;", - "duplicated": true - }, - { - "line": 33, - "code": " }", - "duplicated": true - }, - { - "line": 34, - "code": " }", - "duplicated": true - }, - { - "line": 35, - "code": "}", - "duplicated": true - }, - { - "line": 36, - "code": "", - "duplicated": false - } - ] -} diff --git a/it/it-tests/src/test/resources/duplication/DuplicationsTest/duplications_show-expected.json b/it/it-tests/src/test/resources/duplication/DuplicationsTest/duplications_show-expected.json deleted file mode 100644 index 83b69f2be1d..00000000000 --- a/it/it-tests/src/test/resources/duplication/DuplicationsTest/duplications_show-expected.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "duplications": [ - { - "blocks": [ - { - "from": 9, - "size": 29, - "_ref": "1" - }, - { - "from": 40, - "size": 31, - "_ref": "1" - } - ] - } - ], - "files": { - "1": { - "key": "file-duplications:src/main/xoo/duplicated_lines_within_same_file/DuplicatedLinesInSameFile.xoo", - "name": "src/main/xoo/duplicated_lines_within_same_file/DuplicatedLinesInSameFile.xoo", - "project": "file-duplications", - "projectName": "file-duplications" - } - } -} diff --git a/it/it-tests/src/test/resources/duplication/DuplicationsTest/sources_lines_duplication-expected.json b/it/it-tests/src/test/resources/duplication/DuplicationsTest/sources_lines_duplication-expected.json deleted file mode 100644 index f6ccc926f29..00000000000 --- a/it/it-tests/src/test/resources/duplication/DuplicationsTest/sources_lines_duplication-expected.json +++ /dev/null @@ -1,359 +0,0 @@ -{ - "sources": [ - { - "line": 1, - "code": "package duplicated_lines_within_same_file;", - "duplicated": false - }, - { - "line": 2, - "code": "", - "duplicated": false - }, - { - "line": 3, - "code": "public class DuplicatedLinesInSameFile {", - "duplicated": false - }, - { - "line": 4, - "code": "", - "duplicated": false - }, - { - "line": 5, - "code": " public DuplicatedLinesInSameFile() {", - "duplicated": false - }, - { - "line": 6, - "code": " }", - "duplicated": false - }, - { - "line": 7, - "code": "", - "duplicated": false - }, - { - "line": 8, - "code": " public void duplicatedMethodInSameFile1() {", - "duplicated": false - }, - { - "line": 9, - "code": " String temp = \"\";", - "duplicated": true - }, - { - "line": 10, - "code": " for (int i=0; i<10; i++){", - "duplicated": true - }, - { - "line": 11, - "code": " temp += \"say something\"+i;", - "duplicated": true - }, - { - "line": 12, - "code": " }", - "duplicated": true - }, - { - "line": 13, - "code": " for (int i=0; i<20; i++){", - "duplicated": true - }, - { - "line": 14, - "code": " temp += \"say nothing\"+i;", - "duplicated": true - }, - { - "line": 15, - "code": " }", - "duplicated": true - }, - { - "line": 16, - "code": " for (int i=0; i<30; i++){", - "duplicated": true - }, - { - "line": 17, - "code": " temp += \"always say nothing\"+i;", - "duplicated": true - }, - { - "line": 18, - "code": " }", - "duplicated": true - }, - { - "line": 19, - "code": " for (int i=0; i<40; i++){", - "duplicated": true - }, - { - "line": 20, - "code": " temp += \"really nothing to say \"+i;", - "duplicated": true - }, - { - "line": 21, - "code": " }", - "duplicated": true - }, - { - "line": 22, - "code": " for (int i=0; i<50; i++){", - "duplicated": true - }, - { - "line": 23, - "code": " temp += \"really really nothing to say \"+i;", - "duplicated": true - }, - { - "line": 24, - "code": " }", - "duplicated": true - }, - { - "line": 25, - "code": " for (int i=0; i<60; i++){", - "duplicated": true - }, - { - "line": 26, - "code": " temp += \".. \"+i;", - "duplicated": true - }, - { - "line": 27, - "code": " }", - "duplicated": true - }, - { - "line": 28, - "code": " for (int i=0; i<70; i++){", - "duplicated": true - }, - { - "line": 29, - "code": " temp += \"you say something? \"+i;", - "duplicated": true - }, - { - "line": 30, - "code": " }", - "duplicated": true - }, - { - "line": 31, - "code": " for (int i=0; i<80; i++){", - "duplicated": true - }, - { - "line": 32, - "code": " temp += \"ah no...\"+i;", - "duplicated": true - }, - { - "line": 33, - "code": " }", - "duplicated": true - }, - { - "line": 34, - "code": " for (int i=0; i<90; i++){", - "duplicated": true - }, - { - "line": 35, - "code": " temp += \"bye\"+i;", - "duplicated": true - }, - { - "line": 36, - "code": " }", - "duplicated": true - }, - { - "line": 37, - "code": " }", - "duplicated": true - }, - { - "line": 38, - "code": "", - "duplicated": false - }, - { - "line": 39, - "code": " public void duplicatedMethodInSameFile2() {", - "duplicated": false - }, - { - "line": 40, - "code": " String temp = \"\";", - "duplicated": true - }, - { - "line": 41, - "code": " for (int i=0; i<10; i++){", - "duplicated": true - }, - { - "line": 42, - "code": " temp += \"say something\"+i;", - "duplicated": true - }, - { - "line": 43, - "code": " }", - "duplicated": true - }, - { - "line": 44, - "code": " for (int i=0; i<20; i++){", - "duplicated": true - }, - { - "line": 45, - "code": " temp += \"say nothing\"+i;", - "duplicated": true - }, - { - "line": 46, - "code": " }", - "duplicated": true - }, - { - "line": 47, - "code": " for (int i=0; i<30; i++){", - "duplicated": true - }, - { - "line": 48, - "code": " temp += \"always say nothing\"+i;", - "duplicated": true - }, - { - "line": 49, - "code": " }", - "duplicated": true - }, - { - "line": 50, - "code": " for (int i=0; i<40; i++){", - "duplicated": true - }, - { - "line": 51, - "code": " temp += \"really nothing to say \"+i;", - "duplicated": true - }, - { - "line": 52, - "code": " }", - "duplicated": true - }, - { - "line": 53, - "code": " for (int i=0; i<50; i++){", - "duplicated": true - }, - { - "line": 54, - "code": " temp += \"really really nothing to say \"+i;", - "duplicated": true - }, - { - "line": 55, - "code": " }", - "duplicated": true - }, - { - "line": 56, - "code": " for (int i=0; i<60; i++){", - "duplicated": true - }, - { - "line": 57, - "code": " temp += \".. \"+i;", - "duplicated": true - }, - { - "line": 58, - "code": " }", - "duplicated": true - }, - { - "line": 59, - "code": " for (int i=0; i<70; i++){", - "duplicated": true - }, - { - "line": 60, - "code": " temp += \"you say something? \"+i;", - "duplicated": true - }, - { - "line": 61, - "code": " }", - "duplicated": true - }, - { - "line": 62, - "code": " for (int i=0; i<80; i++){", - "duplicated": true - }, - { - "line": 63, - "code": " temp += \"ah no...\"+i;", - "duplicated": true - }, - { - "line": 64, - "code": " }", - "duplicated": true - }, - { - "line": 65, - "code": " for (int i=0; i<90; i++){", - "duplicated": true - }, - { - "line": 66, - "code": " temp += \"bye\"+i;", - "duplicated": true - }, - { - "line": 67, - "code": " }", - "duplicated": true - }, - { - "line": 68, - "code": " }", - "duplicated": true - }, - { - "line": 69, - "code": "", - "duplicated": true - }, - { - "line": 70, - "code": "}", - "duplicated": true - }, - { - "line": 71, - "code": "", - "duplicated": false - } - ] -} diff --git a/it/it-tests/src/test/resources/duplication/xoo-duplication-profile.xml b/it/it-tests/src/test/resources/duplication/xoo-duplication-profile.xml deleted file mode 100644 index 999b64a8251..00000000000 --- a/it/it-tests/src/test/resources/duplication/xoo-duplication-profile.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0"?><!-- Generated by Sonar --> -<profile> - <name>xoo-duplication-profile</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>DuplicatedBlocks</key> - <priority>CRITICAL</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/exclusions/IssueExclusionsTest/with-many-rules.xml b/it/it-tests/src/test/resources/exclusions/IssueExclusionsTest/with-many-rules.xml deleted file mode 100644 index f3d0baf0616..00000000000 --- a/it/it-tests/src/test/resources/exclusions/IssueExclusionsTest/with-many-rules.xml +++ /dev/null @@ -1,32 +0,0 @@ -<profile> - <name>with-many-rules</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>HasTag</key> - <priority>INFO</priority> - <parameters> - <parameter> - <key>tag</key> - <value>xoo</value> - </parameter> - </parameters> - </rule> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/i18n/default-locale-is-english.html b/it/it-tests/src/test/resources/i18n/default-locale-is-english.html deleted file mode 100644 index 978ceaa382e..00000000000 --- a/it/it-tests/src/test/resources/i18n/default-locale-is-english.html +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>default_locale_is_english</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">default_locale_is_english</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/dashboard/index?id=sample&name=Dashboard&locale=foo</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>css=#content</td> - <td>regexp:.*Jan.*|.*Feb.*|.*Mar.*|.*Apr.*|.*May.*|.*Jun.*|.*Jul.*|.*Aug.*|.*Sep.*|.*Oct.*|.*Nov.*|.*Dec.*</td> - </tr> - <tr> - <td>waitForText</td> - <td>css=#content</td> - <td>*0.0%*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/i18n/french-locale.html b/it/it-tests/src/test/resources/i18n/french-locale.html deleted file mode 100644 index 389f9e04ec4..00000000000 --- a/it/it-tests/src/test/resources/i18n/french-locale.html +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>french</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">french</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/dashboard/index?id=sample&name=Dashboard&locale=fr</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>css=#content</td> - <td>regexp:.*jan.*|.*fév.*|.*mar.*|.*avr.*|.*mai.*|.*juin.*|.*juil.*|.*août.*|.*sept.*|.*oct.*|.*nov.*|.*déc.*</td> - </tr> - <tr> - <td>waitForText</td> - <td>css=#content</td> - <td>*0,0%*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/i18n/french-pack.html b/it/it-tests/src/test/resources/i18n/french-pack.html deleted file mode 100644 index 3f801c9a6ec..00000000000 --- a/it/it-tests/src/test/resources/i18n/french-pack.html +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>french-pack</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">french-pack</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/?locale=fr</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>css=.navbar</td> - <td>glob:*Se connecter*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/i18n/locale-with-france-country.html b/it/it-tests/src/test/resources/i18n/locale-with-france-country.html deleted file mode 100644 index e84051475eb..00000000000 --- a/it/it-tests/src/test/resources/i18n/locale-with-france-country.html +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>french-france</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">french-france</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/dashboard/index?id=sample&name=Dashboard&locale=fr-FR</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>css=#content</td> - <td>regexp:.*jan.*|.*fév.*|.*mar.*|.*avr.*|.*mai.*|.*juin.*|.*juil.*|.*août.*|.*sept.*|.*oct.*|.*nov.*|.*déc.*</td> - </tr> - <tr> - <td>waitForText</td> - <td>css=#content</td> - <td>*0,0%*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/i18n/locale-with-swiss-country.html b/it/it-tests/src/test/resources/i18n/locale-with-swiss-country.html deleted file mode 100644 index be1453e002f..00000000000 --- a/it/it-tests/src/test/resources/i18n/locale-with-swiss-country.html +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>french-switzerland</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">french-switzerland</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/dashboard/index?id=sample&name=Dashboard&locale=fr-CH</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>css=#content</td> - <td>regexp:.*jan.*|.*fév.*|.*mar.*|.*avr.*|.*mai.*|.*juin.*|.*juil.*|.*août.*|.*sept.*|.*oct.*|.*nov.*|.*déc.*</td> - </tr> - <tr> - <td>waitForText</td> - <td>css=#content</td> - <td>*0.0%*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/issue/CommonRulesTest/xoo-common-rules-profile.xml b/it/it-tests/src/test/resources/issue/CommonRulesTest/xoo-common-rules-profile.xml deleted file mode 100644 index 9803527b94f..00000000000 --- a/it/it-tests/src/test/resources/issue/CommonRulesTest/xoo-common-rules-profile.xml +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0"?><!-- Generated by Sonar --> -<profile> - <name>xoo-common-rules</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>DuplicatedBlocks</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>InsufficientBranchCoverage</key> - <priority>CRITICAL</priority> - <parameters> - <parameter> - <key>minimumBranchCoverageRatio</key> - <value>90</value> - </parameter> - </parameters> - </rule> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>InsufficientCommentDensity</key> - <priority>CRITICAL</priority> - <parameters> - <parameter> - <key>minimumCommentDensity</key> - <value>90.0</value> - </parameter> - </parameters> - </rule> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>InsufficientLineCoverage</key> - <priority>CRITICAL</priority> - <parameters> - <parameter> - <key>minimumLineCoverageRatio</key> - <value>90</value> - </parameter> - </parameters> - </rule> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>FailedUnitTests</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>SkippedUnitTests</key> - <priority>CRITICAL</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/CustomRulesTest/custom.xml b/it/it-tests/src/test/resources/issue/CustomRulesTest/custom.xml deleted file mode 100644 index b04d126115d..00000000000 --- a/it/it-tests/src/test/resources/issue/CustomRulesTest/custom.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><!-- Generated by Sonar --> -<profile> - <name>Custom</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>MyCustomRule</key> - <priority>CRITICAL</priority> - </rule> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/issue/IssueActionTest/xoo-one-issue-per-line-profile.xml b/it/it-tests/src/test/resources/issue/IssueActionTest/xoo-one-issue-per-line-profile.xml deleted file mode 100644 index 608f80cae96..00000000000 --- a/it/it-tests/src/test/resources/issue/IssueActionTest/xoo-one-issue-per-line-profile.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0"?><!-- Generated by Sonar --> -<profile> - <name>xoo-one-issue-per-line-profile</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>CRITICAL</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/IssueBulkChangeTest/one-issue-per-line-profile.xml b/it/it-tests/src/test/resources/issue/IssueBulkChangeTest/one-issue-per-line-profile.xml deleted file mode 100644 index 365aa896a73..00000000000 --- a/it/it-tests/src/test/resources/issue/IssueBulkChangeTest/one-issue-per-line-profile.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<profile> - <name>one-issue-per-line</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/IssueChangelogTest/one-issue-per-line-profile.xml b/it/it-tests/src/test/resources/issue/IssueChangelogTest/one-issue-per-line-profile.xml deleted file mode 100644 index 365aa896a73..00000000000 --- a/it/it-tests/src/test/resources/issue/IssueChangelogTest/one-issue-per-line-profile.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<profile> - <name>one-issue-per-line</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/IssueCreationDateTest/no-rules.xml b/it/it-tests/src/test/resources/issue/IssueCreationDateTest/no-rules.xml deleted file mode 100644 index 62ec52d9d10..00000000000 --- a/it/it-tests/src/test/resources/issue/IssueCreationDateTest/no-rules.xml +++ /dev/null @@ -1,6 +0,0 @@ -<profile> - <name>creation-date-quality-profile</name> - <language>xoo</language> - <rules> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/IssueCreationDateTest/one-rule.xml b/it/it-tests/src/test/resources/issue/IssueCreationDateTest/one-rule.xml deleted file mode 100644 index c1d7d44f02c..00000000000 --- a/it/it-tests/src/test/resources/issue/IssueCreationDateTest/one-rule.xml +++ /dev/null @@ -1,11 +0,0 @@ -<profile> - <name>creation-date-quality-profile</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/IssueCreationTest/override-profile-severity.xml b/it/it-tests/src/test/resources/issue/IssueCreationTest/override-profile-severity.xml deleted file mode 100644 index d048760be60..00000000000 --- a/it/it-tests/src/test/resources/issue/IssueCreationTest/override-profile-severity.xml +++ /dev/null @@ -1,11 +0,0 @@ -<profile> - <name>override-profile-severity</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneBlockerIssuePerFile</key> - <priority>INFO</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/IssueCreationTest/with-custom-message.xml b/it/it-tests/src/test/resources/issue/IssueCreationTest/with-custom-message.xml deleted file mode 100644 index 323e50985cd..00000000000 --- a/it/it-tests/src/test/resources/issue/IssueCreationTest/with-custom-message.xml +++ /dev/null @@ -1,11 +0,0 @@ -<profile> - <name>with-custom-message</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>CustomMessage</key> - <priority>MAJOR</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/IssueFilterExtensionTest/xoo-with-many-rules.xml b/it/it-tests/src/test/resources/issue/IssueFilterExtensionTest/xoo-with-many-rules.xml deleted file mode 100644 index a08c9cdd246..00000000000 --- a/it/it-tests/src/test/resources/issue/IssueFilterExtensionTest/xoo-with-many-rules.xml +++ /dev/null @@ -1,32 +0,0 @@ -<profile> - <name>with-many-rules</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>HasTag</key> - <priority>INFO</priority> - <parameters> - <parameter> - <key>tag</key> - <value>xoo</value> - </parameter> - </parameters> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/IssueFilterOnCommonRulesTest/xoo-common-rules-profile.xml b/it/it-tests/src/test/resources/issue/IssueFilterOnCommonRulesTest/xoo-common-rules-profile.xml deleted file mode 100644 index 9803527b94f..00000000000 --- a/it/it-tests/src/test/resources/issue/IssueFilterOnCommonRulesTest/xoo-common-rules-profile.xml +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0"?><!-- Generated by Sonar --> -<profile> - <name>xoo-common-rules</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>DuplicatedBlocks</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>InsufficientBranchCoverage</key> - <priority>CRITICAL</priority> - <parameters> - <parameter> - <key>minimumBranchCoverageRatio</key> - <value>90</value> - </parameter> - </parameters> - </rule> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>InsufficientCommentDensity</key> - <priority>CRITICAL</priority> - <parameters> - <parameter> - <key>minimumCommentDensity</key> - <value>90.0</value> - </parameter> - </parameters> - </rule> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>InsufficientLineCoverage</key> - <priority>CRITICAL</priority> - <parameters> - <parameter> - <key>minimumLineCoverageRatio</key> - <value>90</value> - </parameter> - </parameters> - </rule> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>FailedUnitTests</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>SkippedUnitTests</key> - <priority>CRITICAL</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/IssueFilterTest/with-many-rules.xml b/it/it-tests/src/test/resources/issue/IssueFilterTest/with-many-rules.xml deleted file mode 100644 index 366a3ab7576..00000000000 --- a/it/it-tests/src/test/resources/issue/IssueFilterTest/with-many-rules.xml +++ /dev/null @@ -1,43 +0,0 @@ -<profile> - <name>with-many-rules</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>HasTag</key> - <priority>INFO</priority> - <parameters> - <parameter> - <key>tag</key> - <value>xoo</value> - </parameter> - </parameters> - </rule> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>InsufficientLineCoverage</key> - <priority>BLOCKER</priority> - <parameters> - <parameter> - <key>minimumLineCoverageRatio</key> - <value>90</value> - </parameter> - </parameters> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/IssuePurgeTest/with-many-rules.xml b/it/it-tests/src/test/resources/issue/IssuePurgeTest/with-many-rules.xml deleted file mode 100644 index f3d0baf0616..00000000000 --- a/it/it-tests/src/test/resources/issue/IssuePurgeTest/with-many-rules.xml +++ /dev/null @@ -1,32 +0,0 @@ -<profile> - <name>with-many-rules</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>HasTag</key> - <priority>INFO</priority> - <parameters> - <parameter> - <key>tag</key> - <value>xoo</value> - </parameter> - </parameters> - </rule> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/issue/IssueTrackingTest/one-issue-per-module-profile.xml b/it/it-tests/src/test/resources/issue/IssueTrackingTest/one-issue-per-module-profile.xml deleted file mode 100644 index 8b863ce9a46..00000000000 --- a/it/it-tests/src/test/resources/issue/IssueTrackingTest/one-issue-per-module-profile.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<profile> - <name>one-issue-per-module</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/issue/IssueWorkflowTest/xoo-one-issue-per-line-profile.xml b/it/it-tests/src/test/resources/issue/IssueWorkflowTest/xoo-one-issue-per-line-profile.xml deleted file mode 100644 index 608f80cae96..00000000000 --- a/it/it-tests/src/test/resources/issue/IssueWorkflowTest/xoo-one-issue-per-line-profile.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0"?><!-- Generated by Sonar --> -<profile> - <name>xoo-one-issue-per-line-profile</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>CRITICAL</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/NewIssuesMeasureTest/profile1.xml b/it/it-tests/src/test/resources/issue/NewIssuesMeasureTest/profile1.xml deleted file mode 100644 index 3acc7f6a4ed..00000000000 --- a/it/it-tests/src/test/resources/issue/NewIssuesMeasureTest/profile1.xml +++ /dev/null @@ -1,27 +0,0 @@ -<profile> - <name>profile1</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>HasTag</key> - <priority>INFO</priority> - <parameters> - <parameter> - <key>tag</key> - <value>xoo</value> - </parameter> - </parameters> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/NewIssuesMeasureTest/profile2.xml b/it/it-tests/src/test/resources/issue/NewIssuesMeasureTest/profile2.xml deleted file mode 100644 index 70e0f8cd25a..00000000000 --- a/it/it-tests/src/test/resources/issue/NewIssuesMeasureTest/profile2.xml +++ /dev/null @@ -1,32 +0,0 @@ -<profile> - <name>profile2</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>HasTag</key> - <priority>INFO</priority> - <parameters> - <parameter> - <key>tag</key> - <value>xoo</value> - </parameter> - </parameters> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/issue-on-tag-foobar.xml b/it/it-tests/src/test/resources/issue/issue-on-tag-foobar.xml deleted file mode 100644 index d49b8f7c6c5..00000000000 --- a/it/it-tests/src/test/resources/issue/issue-on-tag-foobar.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<profile> - <name>issue-on-tag-foobar</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>HasTag</key> - <priority>MAJOR</priority> - <parameters> - <parameter> - <key>tag</key> - <value>foobar</value> - </parameter> - </parameters> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/one-issue-per-file-profile.xml b/it/it-tests/src/test/resources/issue/one-issue-per-file-profile.xml deleted file mode 100644 index 141921f02e7..00000000000 --- a/it/it-tests/src/test/resources/issue/one-issue-per-file-profile.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0"?><!-- Generated by Sonar --> -<profile> - <name>one-issue-per-file-profile</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>CRITICAL</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/one-issue-per-line-profile.xml b/it/it-tests/src/test/resources/issue/one-issue-per-line-profile.xml deleted file mode 100644 index 28cebcc2380..00000000000 --- a/it/it-tests/src/test/resources/issue/one-issue-per-line-profile.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0"?><!-- Generated by Sonar --> -<profile> - <name>one-issue-per-line-profile</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>CRITICAL</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/issue/with-many-rules.xml b/it/it-tests/src/test/resources/issue/with-many-rules.xml deleted file mode 100644 index f97ef70cefd..00000000000 --- a/it/it-tests/src/test/resources/issue/with-many-rules.xml +++ /dev/null @@ -1,42 +0,0 @@ -<profile> - <name>with-many-rules</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>HasTag</key> - <priority>INFO</priority> - <parameters> - <parameter> - <key>tag</key> - <value>xoo</value> - </parameter> - </parameters> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneBugIssuePerLine</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneVulnerabilityIssuePerModule</key> - <priority>BLOCKER</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/logback-test.xml b/it/it-tests/src/test/resources/logback-test.xml deleted file mode 100644 index 599faa969f0..00000000000 --- a/it/it-tests/src/test/resources/logback-test.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<configuration debug="false"> - <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/> - - <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> - <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> - <pattern> - %d{yyyy.MM.dd HH:mm:ss} %-5level %msg%n - </pattern> - </encoder> - </appender> - - <root> - <!-- Don't set to DEBUG or it will show the dev licenses into the console!!!! --> - <level value="INFO"/> - <appender-ref ref="CONSOLE"/> - </root> - -</configuration> diff --git a/it/it-tests/src/test/resources/measure/ProjectDashboardTest/test_project_overview_after_first_analysis.html b/it/it-tests/src/test/resources/measure/ProjectDashboardTest/test_project_overview_after_first_analysis.html deleted file mode 100644 index ac440b184aa..00000000000 --- a/it/it-tests/src/test/resources/measure/ProjectDashboardTest/test_project_overview_after_first_analysis.html +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>test_project_overview_after_first_analysis</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">test_project_overview_after_first_analysis</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/dashboard?id=project-for-overview</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>id=content</td> - <td>*Quality Gate*Passed*</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=overview-code-smells</td> - <td>*0*A*Debt*0*Code Smells*</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=content</td> - <td>*0.0%*Duplications*0*Duplicated Blocks*</td> - </tr> - <tr> - <td>assertNotText</td> - <td>id=content</td> - <td>*Coverage*</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=content</td> - <td>*Quality Gate*SonarQube way*</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=content</td> - <td>*Quality Profiles*Xoo*Basic*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/measure/ProjectMeasuresPageTest/should_display_measures_page.html b/it/it-tests/src/test/resources/measure/ProjectMeasuresPageTest/should_display_measures_page.html deleted file mode 100644 index 4c5a77a9545..00000000000 --- a/it/it-tests/src/test/resources/measure/ProjectMeasuresPageTest/should_display_measures_page.html +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should_display_measure_drilldown</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/component_measures?id=project-measures-page-test-project</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>id=measure-code_smells</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>id=measure-code_smells-value</td> - <td>*0*</td> -</tr> -<tr> - <td>assertText</td> - <td>id=measure-new_code_smells-leak</td> - <td>*0*</td> -</tr> -<tr> - <td>click</td> - <td>css=#measure-code_smells > a</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>content</td> - <td>*Code Smells*0*</td> -</tr> -<tr> - <td>waitForText</td> - <td>content</td> - <td>*src/main/xoo/sample*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/measure/ProjectMeasuresPageTest/should_drilldown_on_list_view.html b/it/it-tests/src/test/resources/measure/ProjectMeasuresPageTest/should_drilldown_on_list_view.html deleted file mode 100644 index e68d8b87dfb..00000000000 --- a/it/it-tests/src/test/resources/measure/ProjectMeasuresPageTest/should_drilldown_on_list_view.html +++ /dev/null @@ -1,69 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should_drilldown_on_list_view</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/component_measures/metric/ncloc/list?id=project-measures-page-test-project</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>id=component-measures-component-link-project-measures-page-test-project:src/main/xoo/sample/Sample.xoo</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>id=component-measures-component-link-project-measures-page-test-project:src/main/xoo/sample/Sample.xoo</td> - <td>*src/main/xoo/sample/Sample.xoo*</td> -</tr> -<tr> - <td>assertText</td> - <td>id=component-measures-component-measure-project-measures-page-test-project:src/main/xoo/sample/Sample.xoo-ncloc</td> - <td>*13*</td> -</tr> -<tr> - <td>click</td> - <td>id=component-measures-component-link-project-measures-page-test-project:src/main/xoo/sample/Sample.xoo</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.source-line-code</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.component-measures-breadcrumbs</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>id=component-measures-breadcrumb-project-measures-page-test-project</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.component-measures-breadcrumbs</td> - <td>*Sample.xoo*13*</td> -</tr> -<tr> - <td>click</td> - <td>id=component-measures-breadcrumb-project-measures-page-test-project</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>id=component-measures-component-link-project-measures-page-test-project:src/main/xoo/sample/Sample.xoo</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/measure/ProjectMeasuresPageTest/should_drilldown_on_tree_view.html b/it/it-tests/src/test/resources/measure/ProjectMeasuresPageTest/should_drilldown_on_tree_view.html deleted file mode 100644 index 489c9d93afc..00000000000 --- a/it/it-tests/src/test/resources/measure/ProjectMeasuresPageTest/should_drilldown_on_tree_view.html +++ /dev/null @@ -1,84 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should_drilldown_on_tree_view</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/component_measures/metric/ncloc/tree?id=project-measures-page-test-project</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>id=component-measures-component-link-project-measures-page-test-project:src/main/xoo/sample</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>id=component-measures-component-link-project-measures-page-test-project:src/main/xoo/sample</td> - <td>*src/main/xoo/sample*</td> -</tr> -<tr> - <td>assertText</td> - <td>id=component-measures-component-measure-project-measures-page-test-project:src/main/xoo/sample-ncloc</td> - <td>*13*</td> -</tr> -<tr> - <td>click</td> - <td>id=component-measures-component-link-project-measures-page-test-project:src/main/xoo/sample</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>id=component-measures-component-link-project-measures-page-test-project:src/main/xoo/sample/Sample.xoo</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>id=component-measures-component-link-project-measures-page-test-project:src/main/xoo/sample/Sample.xoo</td> - <td>*src/main/xoo/sample/Sample.xoo*</td> -</tr> -<tr> - <td>assertText</td> - <td>id=component-measures-component-measure-project-measures-page-test-project:src/main/xoo/sample/Sample.xoo-ncloc</td> - <td>*13*</td> -</tr> -<tr> - <td>assertText</td> - <td>css=.component-measures-breadcrumbs</td> - <td>*ProjectMeasuresPageTest Project*src/main/xoo/sample*13*</td> -</tr> -<tr> - <td>click</td> - <td>id=component-measures-component-link-project-measures-page-test-project:src/main/xoo/sample/Sample.xoo</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.source-line-code</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.component-measures-breadcrumbs</td> - <td>*ProjectMeasuresPageTest Project*src/main/xoo/sample*13*Sample.xoo*13*</td> -</tr> -<tr> - <td>click</td> - <td>id=component-measures-breadcrumb-project-measures-page-test-project</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>id=component-measures-component-link-project-measures-page-test-project:src/main/xoo/sample</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/measure/one-issue-per-file.xml b/it/it-tests/src/test/resources/measure/one-issue-per-file.xml deleted file mode 100644 index 7193ebfd779..00000000000 --- a/it/it-tests/src/test/resources/measure/one-issue-per-file.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<profile> - <name>one-issue-per-file</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MINOR</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/measure/one-issue-per-line.xml b/it/it-tests/src/test/resources/measure/one-issue-per-line.xml deleted file mode 100644 index 365aa896a73..00000000000 --- a/it/it-tests/src/test/resources/measure/one-issue-per-line.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<profile> - <name>one-issue-per-line</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/measureHistory/one-issue-per-line-profile.xml b/it/it-tests/src/test/resources/measureHistory/one-issue-per-line-profile.xml deleted file mode 100644 index 521adc7e06f..00000000000 --- a/it/it-tests/src/test/resources/measureHistory/one-issue-per-line-profile.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<profile> - <name>one-issue-per-line</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/organization/IssueAssignTest/one-issue-per-file-profile.xml b/it/it-tests/src/test/resources/organization/IssueAssignTest/one-issue-per-file-profile.xml deleted file mode 100644 index 141921f02e7..00000000000 --- a/it/it-tests/src/test/resources/organization/IssueAssignTest/one-issue-per-file-profile.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0"?><!-- Generated by Sonar --> -<profile> - <name>one-issue-per-file-profile</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>CRITICAL</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_compare.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_compare.html deleted file mode 100644 index b8ea98d1690..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_compare.html +++ /dev/null @@ -1,60 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_changelog</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_changelog</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table-name a[href^="/organizations/test-org/quality_profiles/show?key=xoo-sample"]</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-profiles-table-name a[href^="/organizations/test-org/quality_profiles/show?key=xoo-sample"]</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profile-compare</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-profile-comparison .Select</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.js-profile-comparison .Select-control</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_copy.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_copy.html deleted file mode 100644 index 1ed2b8a9018..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_copy.html +++ /dev/null @@ -1,105 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_create</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_create</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin2</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin2</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profile-copy</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>css=#copy-profile-name</td> - <td>copied</td> -</tr> -<tr> - <td>click</td> - <td>css=#copy-profile-submit</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-header</td> - <td>*copied*</td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-rules</td> - <td>*1*Bugs*0*Vulnerabilities*0*Code Smells*1*</td> -</tr> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="copied"]</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_create.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_create.html deleted file mode 100644 index a6716b8c06a..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_create.html +++ /dev/null @@ -1,105 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_create</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_create</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin2</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin2</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#quality-profiles-create</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profiles-create</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#create-profile-name</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=#create-profile-form-backup-XooProfileImporter</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>css=#create-profile-name</td> - <td>test</td> -</tr> -<tr> - <td>click</td> - <td>css=#create-profile-submit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-header</td> - <td>*test*</td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-rules</td> - <td>*Bugs*0*Vulnerabilities*0*Code Smells*0*</td> -</tr> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table-row[data-name="test"]</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_delete.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_delete.html deleted file mode 100644 index 9610b0db66c..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_delete.html +++ /dev/null @@ -1,110 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_create</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_create</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin2</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin2</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profile-delete</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#delete-profile-submit</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#delete-profile-submit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"]</td> - <td></td> -</tr> -<tr> - <td>waitForElementNotPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"]</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"]</td> - <td></td> -</tr> -<tr> - <td>assertElementNotPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"]</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_changelog.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_changelog.html deleted file mode 100644 index 12536be7cbf..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_changelog.html +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_changelog</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_changelog</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=a[href^="/organizations/test-org/quality_profiles/changelog"]</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=a[href^="/organizations/test-org/quality_profiles/changelog"]</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-profile-changelog-event</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-profile-changelog-event</td> - <td>*System*Activated*Has Tag*Major*tag*xoo*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_list.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_list.html deleted file mode 100644 index 4d9242c77de..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_list.html +++ /dev/null @@ -1,69 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should_display_list</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_list</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=.quality-profiles-table .data[data-language="xoo"]</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=.quality-profiles-table .data[data-language="xoo2"]</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"]</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-name</td> - <td>*Basic*</td> -</tr> -<tr> - <td>assertText</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-projects</td> - <td>*Default*</td> -</tr> -<tr> - <td>assertText</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-rules</td> - <td>*1*</td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-rules a[href^="/organizations/test-org/rules#qprofile"]</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=table[data-language="xoo2"] tr[data-name="Basic"] .quality-profiles-table-name</td> - <td>*Basic*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_profile_exporters.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_profile_exporters.html deleted file mode 100644 index b26d162f2e7..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_profile_exporters.html +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_profile_projects.html</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_profile_projects.html</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-exporters</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-exporters [data-key="XooFakeExporter"]</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-exporters a[href^="/api/qualityprofiles/export"]</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_profile_inheritance.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_profile_inheritance.html deleted file mode 100644 index c403fbf5196..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_profile_inheritance.html +++ /dev/null @@ -1,60 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_profile_inheritance.html</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_profile_inheritance.html</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-inheritance</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-inheritance-ancestor</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-inheritance-ancestor</td> - <td>*Basic*1*</td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=.js-inheritance-current</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-inheritance-current</td> - <td>*sample*1*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_profile_projects.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_profile_projects.html deleted file mode 100644 index 062014eb239..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_profile_projects.html +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_profile_projects.html</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_profile_projects.html</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-projects</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-profile-project</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-profile-project</td> - <td>*Sample*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_profile_rules.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_profile_rules.html deleted file mode 100644 index 6b497fc7b58..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_display_profile_rules.html +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_profile_rules.html</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_profile_rules.html</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-rules</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-rules</td> - <td>*Active*1*Bugs*0*Vulnerabilities*0*Code Smells*1*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_filter_by_language.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_filter_by_language.html deleted file mode 100644 index a913a70a34f..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_filter_by_language.html +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should_filter_by_language</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_filter_by_language</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table .data[data-language="xoo"]</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=.quality-profiles-table .data[data-language="xoo2"]</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-language-filter</td> - <td>*All*</td> -</tr> -<tr> - <td>click</td> - <td>css=.js-language-filter</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-language-filter-option[data-language="xoo2"]</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.js-language-filter-option[data-language="xoo2"]</td> - <td></td> -</tr> -<tr> - <td>waitForElementNotPresent</td> - <td>css=.quality-profiles-table[data-language="xoo"]</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=.quality-profiles-table .data[data-language="xoo2"]</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-language-filter</td> - <td>*Xoo2*</td> -</tr> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles?language=xoo2</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table .data[data-language="xoo2"]</td> - <td></td> -</tr> -<tr> - <td>assertElementNotPresent</td> - <td>css=.quality-profiles-table[data-language="xoo"]</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-language-filter</td> - <td>*Xoo2*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_open_from_list.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_open_from_list.html deleted file mode 100644 index 2e753ba1cd7..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_open_from_list.html +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should_open_from_list</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_open_from_list</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"]</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-rules</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-inheritance</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-projects</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_rename.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_rename.html deleted file mode 100644 index 5da4d40ca0c..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_rename.html +++ /dev/null @@ -1,105 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_create</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_create</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin2</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin2</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profile-rename</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#rename-profile-name</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>css=#rename-profile-name</td> - <td>new name</td> -</tr> -<tr> - <td>click</td> - <td>css=#rename-profile-submit</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-header</td> - <td>*new name*</td> -</tr> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="new name"] .quality-profiles-table-name a</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_restore.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_restore.html deleted file mode 100644 index dd2d21ba31f..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_restore.html +++ /dev/null @@ -1,75 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_create</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_create</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin2</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin2</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-more-admin-actions</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.js-more-admin-actions</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profiles-restore</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#restore-profile-backup</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#restore-profile-submit</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_set_default.html b/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_set_default.html deleted file mode 100644 index c267bf702e3..00000000000 --- a/it/it-tests/src/test/resources/organization/OrganizationQualityProfilesUiTest/should_set_default.html +++ /dev/null @@ -1,95 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_create</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_create</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin2</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin2</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profile-set-as-default</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-projects</td> - <td>*Default*</td> -</tr> -<tr> - <td>open</td> - <td>/organizations/test-org/quality_profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table-row[data-name="sample"]</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.quality-profiles-table-row[data-name="sample"] .quality-profiles-table-projects</td> - <td>*Default*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/projectAdministration/BackgroundTasksTest/should_not_display_failing_and_search_and_filter_elements_on_project_level_page.html b/it/it-tests/src/test/resources/projectAdministration/BackgroundTasksTest/should_not_display_failing_and_search_and_filter_elements_on_project_level_page.html deleted file mode 100644 index e28cdbba827..00000000000 --- a/it/it-tests/src/test/resources/projectAdministration/BackgroundTasksTest/should_not_display_failing_and_search_and_filter_elements_on_project_level_page.html +++ /dev/null @@ -1,80 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_not_display_failing_and_search_and_filter_elements_on_project_level_page</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">should_not_display_failing_and_search_and_filter_elements_on_project_level_page</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> -</tr> -<tr> - <td>click</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/project/background_tasks?id=test-project</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.background-tasks .badge</td> - <td></td> -</tr> -<tr> - <td>assertNotText</td> - <td>css=.background-tasks</td> - <td>*Another Test Project*</td> -</tr> -<tr> - <td>assertElementNotPresent</td> - <td>css=.js-search</td> - <td></td> -</tr> -<tr> - <td>assertNotText</td> - <td>css=#content</td> - <td>*still failing*</td> -</tr> -<tr> - <td>assertElementNotPresent</td> - <td>css=.icon-filter</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/projectAdministration/BulkDeletionTest/bulk-delete-filter-projects.html b/it/it-tests/src/test/resources/projectAdministration/BulkDeletionTest/bulk-delete-filter-projects.html deleted file mode 100644 index b6256e49b35..00000000000 --- a/it/it-tests/src/test/resources/projectAdministration/BulkDeletionTest/bulk-delete-filter-projects.html +++ /dev/null @@ -1,79 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>bulk-delete-filter-projects</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/projects_admin</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>content</td> - <td>*Bar-Sonar-Plugin*Foo-Application*Sample-Project*</td> -</tr> -<tr> - <td>type</td> - <td>css=.search-box-input</td> - <td>s</td> -</tr> -<tr> - <td>click</td> - <td>css=.search-box-submit</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>content</td> - <td>*Bar-Sonar-Plugin*Sample-Project*</td> -</tr> -<tr> - <td>waitForText</td> - <td>content</td> - <td>*cameleon-3*cameleon-1*</td> -</tr> -<tr> - <td>assertTextNotPresent</td> - <td>content</td> - <td>*Foo-Application*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/projectAdministration/ProjectAdministrationTest/project-administration/multimodule-project-delete-version.html b/it/it-tests/src/test/resources/projectAdministration/ProjectAdministrationTest/project-administration/multimodule-project-delete-version.html deleted file mode 100644 index 496917b9e4c..00000000000 --- a/it/it-tests/src/test/resources/projectAdministration/ProjectAdministrationTest/project-administration/multimodule-project-delete-version.html +++ /dev/null @@ -1,75 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>multimodule-project-delete-version</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">project-modify-versions</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/project/history/com.sonarsource.it.samples:multi-modules-sample</td> - <td></td> - </tr> - <tr> - <td>clickAndWait</td> - <td>link=Remove</td> - <td></td> - </tr> - <tr> - <td>assertConfirmation</td> - <td>Are you sure you want to remove 'RELEASE' from this snapshot?</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>infomsg</td> - <td>glob:*Version 'RELEASE' was removed from current project*</td> - </tr> - <tr> - <td>assertNotText</td> - <td>version_1</td> - <td>glob:*RELEASE*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/projectAdministration/ProjectAdministrationTest/project-administration/multimodule-project-modify-version.html b/it/it-tests/src/test/resources/projectAdministration/ProjectAdministrationTest/project-administration/multimodule-project-modify-version.html deleted file mode 100644 index f336f7e93b9..00000000000 --- a/it/it-tests/src/test/resources/projectAdministration/ProjectAdministrationTest/project-administration/multimodule-project-modify-version.html +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>multimodule-project-modify-version</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">project-modify-versions</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> - </tr> - <tr> - <td>click</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/project/history/com.sonarsource.it.samples:multi-modules-sample</td> - <td></td> - </tr> - <tr> - <td>assertElementNotPresent</td> - <td>link=Remove</td> - <td></td> - </tr> - <tr> - <td>click</td> - <td>version_1_change</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>version_name_1</td> - <td>RELEASE</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>save_version_1</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>infomsg</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>infomsg</td> - <td>Version 'RELEASE' was created for current project.</td> - </tr> - <tr> - <td>waitForText</td> - <td>version_1</td> - <td>glob:*RELEASE*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/projectAdministration/ProjectAdministrationTest/project-deletion/project-deletion.html b/it/it-tests/src/test/resources/projectAdministration/ProjectAdministrationTest/project-deletion/project-deletion.html deleted file mode 100644 index 9345f6e3f75..00000000000 --- a/it/it-tests/src/test/resources/projectAdministration/ProjectAdministrationTest/project-deletion/project-deletion.html +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>project-deletion</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">project-deletion</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>project-deletion-with-admin-permission-on-project</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>password</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/project/deletion?id=sample</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#delete-project</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#delete-project</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#delete-project-confirm</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#delete-project-confirm</td> - <td></td> -</tr> -<tr> - <td>waitForElementNotPresent</td> - <td>css=#delete-project-confirm</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/dashboard?id=sample</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.process-spinner-failed</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/projectAdministration/ProjectPermissionsTest/test_project_permissions_page_shows_only_single_project.html b/it/it-tests/src/test/resources/projectAdministration/ProjectPermissionsTest/test_project_permissions_page_shows_only_single_project.html deleted file mode 100644 index cbb6595ff20..00000000000 --- a/it/it-tests/src/test/resources/projectAdministration/ProjectPermissionsTest/test_project_permissions_page_shows_only_single_project.html +++ /dev/null @@ -1,75 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>test_project_overview_after_first_analysis</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">test_project_overview_after_first_analysis</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/project_roles?id=project-permissions-project</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=#projects</td> - <td></td> - </tr> - <tr> - <td>assertNotText</td> - <td>css=#projects</td> - <td>*Another Test Project*</td> - </tr> - <tr> - <td>assertElementNotPresent</td> - <td>css=footer</td> - <td></td> - </tr> - <tr> - <td>assertElementNotPresent</td> - <td>css=.search-box</td> - <td></td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-add-metrics.html b/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-add-metrics.html deleted file mode 100644 index ab7758bd71a..00000000000 --- a/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-add-metrics.html +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should-add-metrics</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/comparison/index</td> - <td></td> - </tr> - <tr> - <td>assertNotText</td> - <td>comparison-page</td> - <td>*Major issues*</td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>new_metric</td> - <td></td> - </tr> - <tr> - <td>typeAndWait</td> - <td>new_metric</td> - <td>major_violations</td> - </tr> - <tr> - <td>waitForText</td> - <td>comparison-page</td> - <td>*Lines of Code*Complexity*Comments (%)*Duplicated Lines (%)*Issues*Coverage*Major Issues*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-add-projects.html b/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-add-projects.html deleted file mode 100644 index 18c882331ad..00000000000 --- a/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-add-projects.html +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should-add-projects</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/comparison/index</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>new_resource</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>new_resource</td> - <td>project-comparison-test-project</td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>//option[text()='1.0-SNAPSHOT']</td> - <td></td> -</tr> -<tr> - <td>selectAndWait</td> - <td>new_version</td> - <td>1.0-SNAPSHOT</td> -</tr> -<tr> - <td>waitForText</td> - <td>id=content</td> - <td>*ProjectComparisonTest Project*1.0-SNAPSHOT*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-display-basic-set-of-metrics.html b/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-display-basic-set-of-metrics.html deleted file mode 100644 index 3a8e1256198..00000000000 --- a/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-display-basic-set-of-metrics.html +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should-display-basic-set-of-metrics</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/comparison/index</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>id=content</td> - <td>*Lines of Code*Complexity*Comments (%)*Duplicated Lines (%)*Issues*Coverage*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-move-and-remove-metrics.html b/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-move-and-remove-metrics.html deleted file mode 100644 index 3b89b4af128..00000000000 --- a/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-move-and-remove-metrics.html +++ /dev/null @@ -1,69 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should-move-and-remove-metrics</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/comparison/index</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>comparison-page</td> - <td>*Lines of Code*Complexity*Comments (%)*Duplicated Lines (%)*Issues*Coverage*</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>down-0</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>comparison-page</td> - <td>*Complexity*Lines of Code*Comments (%)*Duplicated Lines (%)*Issues*Coverage*</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>up-5</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>comparison-page</td> - <td>*Complexity*Lines of Code*Comments (%)*Duplicated Lines (%)*Coverage*Issues*</td> -</tr> -<tr> - <td>waitForText</td> - <td>comparison-page</td> - <td>*%*</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>del-m-2</td> - <td></td> -</tr> -<tr> - <td>clickAndWait</td> - <td>del-m-2</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>comparison-page</td> - <td>*Complexity*Lines of Code*Coverage*Issues*</td> -</tr> -<tr> - <td>assertNotText</td> - <td>comparison-page</td> - <td>*%*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-move-and-remove-projects.html b/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-move-and-remove-projects.html deleted file mode 100644 index f7d71dbfd2f..00000000000 --- a/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-move-and-remove-projects.html +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should-move-and-remove-projects</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/comparison/index</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>new_resource</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>new_resource</td> - <td>project-comparison-test-project</td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>//option[text()='1.0-SNAPSHOT']</td> - <td></td> -</tr> -<tr> - <td>selectAndWait</td> - <td>new_version</td> - <td>1.0-SNAPSHOT</td> -</tr> -<tr> - <td>waitForText</td> - <td>id=content</td> - <td>*ProjectComparisonTest Project*1.0-SNAPSHOT*</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>del-r-0</td> - <td></td> -</tr> -<tr> - <td>assertNotText</td> - <td>id=content</td> - <td>*Sample*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-not-add-differential-metrics.html b/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-not-add-differential-metrics.html deleted file mode 100644 index ff433b66005..00000000000 --- a/it/it-tests/src/test/resources/projectComparison/ProjectComparisonTest/should-not-add-differential-metrics.html +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should-not-add-differential-metrics</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/comparison/index</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>comparison-page</td> - <td>*Lines of Code*Complexity*Comments (%)*Duplicated Lines (%)*Issues*Coverage*</td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>new_metric</td> - <td></td> - </tr> - <tr> - <td>typeAndWait</td> - <td>new_metric</td> - <td>new_violations</td> - </tr> - <tr> - <td>waitForText</td> - <td>comparison-page</td> - <td>*Lines of Code*Complexity*Comments (%)*Duplicated Lines (%)*Issues*Coverage*</td> - </tr> - <tr> - <td>assertNotText</td> - <td>comparison-page</td> - <td>*New Issues*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/projectSearch/SearchProjectsTest/with-many-rules.xml b/it/it-tests/src/test/resources/projectSearch/SearchProjectsTest/with-many-rules.xml deleted file mode 100644 index 366a3ab7576..00000000000 --- a/it/it-tests/src/test/resources/projectSearch/SearchProjectsTest/with-many-rules.xml +++ /dev/null @@ -1,43 +0,0 @@ -<profile> - <name>with-many-rules</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>HasTag</key> - <priority>INFO</priority> - <parameters> - <parameter> - <key>tag</key> - <value>xoo</value> - </parameter> - </parameters> - </rule> - <rule> - <repositoryKey>common-xoo</repositoryKey> - <key>InsufficientLineCoverage</key> - <priority>BLOCKER</priority> - <parameters> - <parameter> - <key>minimumLineCoverageRatio</key> - <value>90</value> - </parameter> - </parameters> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/qualityGate/QualityGateOnRatingMeasuresTest/with-many-rules.xml b/it/it-tests/src/test/resources/qualityGate/QualityGateOnRatingMeasuresTest/with-many-rules.xml deleted file mode 100644 index 6668eff9096..00000000000 --- a/it/it-tests/src/test/resources/qualityGate/QualityGateOnRatingMeasuresTest/with-many-rules.xml +++ /dev/null @@ -1,42 +0,0 @@ -<profile> - <name>with-many-rules</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>HasTag</key> - <priority>INFO</priority> - <parameters> - <parameter> - <key>tag</key> - <value>xoo</value> - </parameter> - </parameters> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneBugIssuePerLine</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneVulnerabilityIssuePerModule</key> - <priority>BLOCKER</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/qualityGate/QualityGateUiTest/should-display-alerts-correctly-history-page.html b/it/it-tests/src/test/resources/qualityGate/QualityGateUiTest/should-display-alerts-correctly-history-page.html deleted file mode 100644 index 951ae58d38a..00000000000 --- a/it/it-tests/src/test/resources/qualityGate/QualityGateUiTest/should-display-alerts-correctly-history-page.html +++ /dev/null @@ -1,94 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - ~ SonarQube, open source software quality management tool. - ~ Copyright (C) 2008-2016 SonarSource - ~ mailto:contact AT sonarsource DOT com - ~ - ~ SonarQube 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. - ~ - ~ SonarQube 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. - --> - -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should-display-alerts-correctly-history-page</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">should-display-alerts-correctly-history-page</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/dashboard/index/sample</td> - <td></td> - </tr> - <tr> - <td>click</td> - <td>css=#context-navigation .navbar-admin-link</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>link=History</td> - <td></td> - </tr> - <tr> - <td>clickAndWait</td> - <td>link=History</td> - <td></td> - </tr> - <tr> - <td>assertElementPresent</td> - <td>//img[@title='Quality Gate Status: Green (was Orange). ']</td> - <td></td> - </tr> - <tr> - <td>assertElementPresent</td> - <td>//img[@title='Quality Gate Status: Orange. Lines > 5']</td> - <td></td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityGate/QualityGateUiTest/should_display_quality_gates_page.html b/it/it-tests/src/test/resources/qualityGate/QualityGateUiTest/should_display_quality_gates_page.html deleted file mode 100644 index b0975df675d..00000000000 --- a/it/it-tests/src/test/resources/qualityGate/QualityGateUiTest/should_display_quality_gates_page.html +++ /dev/null @@ -1,59 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - ~ SonarQube, open source software quality management tool. - ~ Copyright (C) 2008-2016 SonarSource - ~ mailto:contact AT sonarsource DOT com - ~ - ~ SonarQube 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. - ~ - ~ SonarQube 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. - --> - -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should_display_quality_gates_page</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">should_display_quality_gates_page</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/quality_gates</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-gates-results a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-gates-results a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>id=quality-gate-conditions</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityGate/notifications/activate_notification_channels.html b/it/it-tests/src/test/resources/qualityGate/notifications/activate_notification_channels.html deleted file mode 100644 index 40de82c178a..00000000000 --- a/it/it-tests/src/test/resources/qualityGate/notifications/activate_notification_channels.html +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>reate_user_with_email</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">create_user_with_email</td> - </tr> - </thead> - <tbody> -<tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>tester</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>tester</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/sonar/account/notifications</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>id=global_notifs_NewAlerts_EmailNotificationChannel</td> - <td></td> -</tr> -<tr> - <td>check</td> - <td>id=global_notifs_NewAlerts_EmailNotificationChannel</td> - <td></td> -</tr> -<tr> - <td>clickAndWait</td> - <td>id=submit-notifications</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityGate/notifications/email_configuration.html b/it/it-tests/src/test/resources/qualityGate/notifications/email_configuration.html deleted file mode 100644 index 7b43cf8ee03..00000000000 --- a/it/it-tests/src/test/resources/qualityGate/notifications/email_configuration.html +++ /dev/null @@ -1,69 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>email_configuration</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>setTimeout</td> - <td>300000</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/email_configuration</td> - <td></td> - </tr> - <tr> - <td>assertValue</td> - <td>smtp_host</td> - <td>localhost</td> - </tr> - <tr> - <td>type</td> - <td>to_address</td> - <td>test@example.org</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>submit_test</td> - <td></td> - </tr> - <tr> - <td>waitForVisible</td> - <td>info</td> - <td></td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityModel/has-hello-tag.xml b/it/it-tests/src/test/resources/qualityModel/has-hello-tag.xml deleted file mode 100644 index 88cf4f9273e..00000000000 --- a/it/it-tests/src/test/resources/qualityModel/has-hello-tag.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<profile> - <name>has-tag</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>HasTag</key> - <priority>INFO</priority> - <parameters> - <parameter> - <key>tag</key> - <value>hello</value> - </parameter> - </parameters> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/qualityModel/one-day-debt-per-file.xml b/it/it-tests/src/test/resources/qualityModel/one-day-debt-per-file.xml deleted file mode 100644 index cdebd7554c9..00000000000 --- a/it/it-tests/src/test/resources/qualityModel/one-day-debt-per-file.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<profile> - <name>one-day-debt-per-file</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneDayDebtPerFile</key> - <priority>MINOR</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/qualityModel/one-issue-per-file.xml b/it/it-tests/src/test/resources/qualityModel/one-issue-per-file.xml deleted file mode 100644 index 7193ebfd779..00000000000 --- a/it/it-tests/src/test/resources/qualityModel/one-issue-per-file.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<profile> - <name>one-issue-per-file</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MINOR</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/qualityModel/one-issue-per-line.xml b/it/it-tests/src/test/resources/qualityModel/one-issue-per-line.xml deleted file mode 100644 index 521adc7e06f..00000000000 --- a/it/it-tests/src/test/resources/qualityModel/one-issue-per-line.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<profile> - <name>one-issue-per-line</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - </rules> -</profile>
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/qualityModel/with-many-rules.xml b/it/it-tests/src/test/resources/qualityModel/with-many-rules.xml deleted file mode 100644 index 6668eff9096..00000000000 --- a/it/it-tests/src/test/resources/qualityModel/with-many-rules.xml +++ /dev/null @@ -1,42 +0,0 @@ -<profile> - <name>with-many-rules</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>HasTag</key> - <priority>INFO</priority> - <parameters> - <parameter> - <key>tag</key> - <value>xoo</value> - </parameter> - </parameters> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneBugIssuePerLine</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneVulnerabilityIssuePerModule</key> - <priority>BLOCKER</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/qualityModel/without-type-bug.xml b/it/it-tests/src/test/resources/qualityModel/without-type-bug.xml deleted file mode 100644 index 89c92cf10fa..00000000000 --- a/it/it-tests/src/test/resources/qualityModel/without-type-bug.xml +++ /dev/null @@ -1,26 +0,0 @@ -<profile> - <name>without-type-bug</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneVulnerabilityIssuePerModule</key> - <priority>BLOCKER</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/qualityModel/without-type-code-smells.xml b/it/it-tests/src/test/resources/qualityModel/without-type-code-smells.xml deleted file mode 100644 index 4bbb6f88ed7..00000000000 --- a/it/it-tests/src/test/resources/qualityModel/without-type-code-smells.xml +++ /dev/null @@ -1,16 +0,0 @@ -<profile> - <name>without-type-code-smells</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneBugIssuePerLine</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneVulnerabilityIssuePerModule</key> - <priority>BLOCKER</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/qualityModel/without-type-vulnerability.xml b/it/it-tests/src/test/resources/qualityModel/without-type-vulnerability.xml deleted file mode 100644 index c5fb823bd7c..00000000000 --- a/it/it-tests/src/test/resources/qualityModel/without-type-vulnerability.xml +++ /dev/null @@ -1,26 +0,0 @@ -<profile> - <name>without-type-vulnerability</name> - <language>xoo</language> - <rules> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerLine</key> - <priority>MINOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerFile</key> - <priority>MAJOR</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneIssuePerModule</key> - <priority>CRITICAL</priority> - </rule> - <rule> - <repositoryKey>xoo</repositoryKey> - <key>OneBugIssuePerLine</key> - <priority>CRITICAL</priority> - </rule> - </rules> -</profile> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_compare.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_compare.html deleted file mode 100644 index c2339d690f6..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_compare.html +++ /dev/null @@ -1,60 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_changelog</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_changelog</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table-name a[href^="/profiles/show?key=xoo-sample"]</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-profiles-table-name a[href^="/profiles/show?key=xoo-sample"]</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profile-compare</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-profile-comparison .Select</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.js-profile-comparison .Select-control</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_copy.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_copy.html deleted file mode 100644 index d2f0a12a8b3..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_copy.html +++ /dev/null @@ -1,105 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_create</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_create</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profile-copy</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>css=#copy-profile-name</td> - <td>copied</td> -</tr> -<tr> - <td>click</td> - <td>css=#copy-profile-submit</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-header</td> - <td>*copied*</td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-rules</td> - <td>*1*Bugs*0*Vulnerabilities*0*Code Smells*1*</td> -</tr> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="copied"]</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_create.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_create.html deleted file mode 100644 index 7fefabfbd4a..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_create.html +++ /dev/null @@ -1,100 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_create</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<tbody> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#quality-profiles-create</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profiles-create</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#create-profile-name</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=#create-profile-form-backup-XooProfileImporter</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>css=#create-profile-name</td> - <td>test</td> -</tr> -<tr> - <td>click</td> - <td>css=#create-profile-submit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-header</td> - <td>*test*</td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-rules</td> - <td>*Bugs*0*Vulnerabilities*0*Code Smells*0*</td> -</tr> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table-row[data-name="test"]</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_delete.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_delete.html deleted file mode 100644 index 85e85c0391c..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_delete.html +++ /dev/null @@ -1,105 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_create</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<tbody> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profile-delete</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#delete-profile-submit</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#delete-profile-submit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"]</td> - <td></td> -</tr> -<tr> - <td>waitForElementNotPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"]</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"]</td> - <td></td> -</tr> -<tr> - <td>assertElementNotPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"]</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_changelog.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_changelog.html deleted file mode 100644 index 8614c2fdab9..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_changelog.html +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_changelog</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_changelog</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=a[href^="/profiles/changelog"]</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=a[href^="/profiles/changelog"]</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-profile-changelog-event</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-profile-changelog-event</td> - <td>*System*Activated*Has Tag*Major*tag*xoo*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_list.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_list.html deleted file mode 100644 index 66f83c9af47..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_list.html +++ /dev/null @@ -1,69 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should_display_list</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_list</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=.quality-profiles-table .data[data-language="xoo"]</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=.quality-profiles-table .data[data-language="xoo2"]</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"]</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-name</td> - <td>*Basic*</td> -</tr> -<tr> - <td>assertText</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-projects</td> - <td>*Default*</td> -</tr> -<tr> - <td>assertText</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-rules</td> - <td>*1*</td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-rules a[href^="/coding_rules#qprofile"]</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=table[data-language="xoo2"] tr[data-name="Basic"] .quality-profiles-table-name</td> - <td>*Basic*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_profile_exporters.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_profile_exporters.html deleted file mode 100644 index ea8b1d321f1..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_profile_exporters.html +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_profile_projects.html</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_profile_projects.html</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-exporters</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-exporters [data-key="XooFakeExporter"]</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-exporters a[href^="/api/qualityprofiles/export"]</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_profile_inheritance.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_profile_inheritance.html deleted file mode 100644 index 501ae5b5df8..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_profile_inheritance.html +++ /dev/null @@ -1,60 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_profile_inheritance.html</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_profile_inheritance.html</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-inheritance</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-inheritance-ancestor</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-inheritance-ancestor</td> - <td>*Basic*1*</td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=.js-inheritance-current</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-inheritance-current</td> - <td>*sample*1*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_profile_projects.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_profile_projects.html deleted file mode 100644 index ff38495e318..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_profile_projects.html +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_profile_projects.html</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_profile_projects.html</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-projects</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-profile-project</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-profile-project</td> - <td>*Sample*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_profile_rules.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_profile_rules.html deleted file mode 100644 index eb5ccf3194b..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_display_profile_rules.html +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_profile_rules.html</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_display_profile_rules.html</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-rules</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-rules</td> - <td>*Active*1*Bugs*0*Vulnerabilities*0*Code Smells*1*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_filter_by_language.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_filter_by_language.html deleted file mode 100644 index cfe5321b816..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_filter_by_language.html +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should_filter_by_language</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_filter_by_language</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table .data[data-language="xoo"]</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=.quality-profiles-table .data[data-language="xoo2"]</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-language-filter</td> - <td>*All*</td> -</tr> -<tr> - <td>click</td> - <td>css=.js-language-filter</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-language-filter-option[data-language="xoo2"]</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.js-language-filter-option[data-language="xoo2"]</td> - <td></td> -</tr> -<tr> - <td>waitForElementNotPresent</td> - <td>css=.quality-profiles-table[data-language="xoo"]</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=.quality-profiles-table .data[data-language="xoo2"]</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-language-filter</td> - <td>*Xoo2*</td> -</tr> -<tr> - <td>open</td> - <td>/profiles?language=xoo2</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table .data[data-language="xoo2"]</td> - <td></td> -</tr> -<tr> - <td>assertElementNotPresent</td> - <td>css=.quality-profiles-table[data-language="xoo"]</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.js-language-filter</td> - <td>*Xoo2*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_open_from_list.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_open_from_list.html deleted file mode 100644 index de19c00a017..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_open_from_list.html +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>should_open_from_list</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_open_from_list</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"]</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="Basic"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-rules</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-inheritance</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-projects</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_rename.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_rename.html deleted file mode 100644 index dfa3138f8b1..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_rename.html +++ /dev/null @@ -1,105 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_create</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<thead> -<tr> -<td rowspan="1" colspan="3">should_create</td> -</tr> -</thead> -<tbody> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profile-rename</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#rename-profile-name</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>css=#rename-profile-name</td> - <td>new name</td> -</tr> -<tr> - <td>click</td> - <td>css=#rename-profile-submit</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-header</td> - <td>*new name*</td> -</tr> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="new name"] .quality-profiles-table-name a</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_restore.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_restore.html deleted file mode 100644 index 8def7727001..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_restore.html +++ /dev/null @@ -1,70 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_create</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<tbody> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-more-admin-actions</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.js-more-admin-actions</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profiles-restore</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#restore-profile-backup</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#restore-profile-submit</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_set_default.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_set_default.html deleted file mode 100644 index 6306820ba6a..00000000000 --- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesUiTest/should_set_default.html +++ /dev/null @@ -1,90 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_create</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> -<tbody> -<tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=table[data-language="xoo"] tr[data-name="sample"] .quality-profiles-table-name a</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=.quality-profile-header .dropdown-toggle</td> - <td></td> -</tr> -<tr> - <td>click</td> - <td>css=#quality-profile-set-as-default</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.quality-profile-projects</td> - <td>*Default*</td> -</tr> -<tr> - <td>open</td> - <td>/profiles</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.quality-profiles-table-row[data-name="sample"]</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.quality-profiles-table-row[data-name="sample"] .quality-profiles-table-projects</td> - <td>*Default*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/serverSystem/HttpsTest/keystore.jks b/it/it-tests/src/test/resources/serverSystem/HttpsTest/keystore.jks Binary files differdeleted file mode 100644 index 13234b49dc2..00000000000 --- a/it/it-tests/src/test/resources/serverSystem/HttpsTest/keystore.jks +++ /dev/null diff --git a/it/it-tests/src/test/resources/serverSystem/HttpsTest/keystore.jks.txt b/it/it-tests/src/test/resources/serverSystem/HttpsTest/keystore.jks.txt deleted file mode 100644 index ce4a4adfc39..00000000000 --- a/it/it-tests/src/test/resources/serverSystem/HttpsTest/keystore.jks.txt +++ /dev/null @@ -1,3 +0,0 @@ -keytool -genkey -alias tests -keyalg RSA -keystore keystore.jks -keystore password: thepassword -key password for <tests>: thetests
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/derby-warning.html b/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/derby-warning.html deleted file mode 100644 index c2e13c56aad..00000000000 --- a/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/derby-warning.html +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>derby-warning</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">derby-warning</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/</td> - <td></td> - </tr> - <tr> - <td>assertElementPresent</td> - <td>evaluation_warning</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>footer</td> - <td>glob:*evaluation*</td> - </tr> - - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/hide-jdbc-settings.html b/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/hide-jdbc-settings.html deleted file mode 100644 index 311d000f9cd..00000000000 --- a/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/hide-jdbc-settings.html +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - ~ SonarQube, open source software quality management tool. - ~ Copyright (C) 2008-2016 SonarSource - ~ mailto:contact AT sonarsource DOT com - ~ - ~ SonarQube 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. - ~ - ~ SonarQube 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. - --> - -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>hide-jdbc-settings</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">hide-jdbc-settings</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/setup/index</td> - <td></td> - </tr> - <tr> - <td>assertTextNotPresent</td> - <td>jdbc:</td> - <td></td> - </tr> - - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/incompatible-plugin-1.0.jar b/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/incompatible-plugin-1.0.jar Binary files differdeleted file mode 100644 index 541131c5093..00000000000 --- a/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/incompatible-plugin-1.0.jar +++ /dev/null diff --git a/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/system_info.html b/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/system_info.html deleted file mode 100644 index e304586c59c..00000000000 --- a/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/system_info.html +++ /dev/null @@ -1,84 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>system_info</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">system_info</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/system/index</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>id=content</td> - <td>*Official Distribution*</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=content</td> - <td>*Database Version*</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=content</td> - <td>*Pool Active Connections*</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=content</td> - <td>*Start Time*</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=content</td> - <td>*Processors*</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=content</td> - <td>*java.class.path*java.specification.version*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/url_ending_by_jsp.html b/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/url_ending_by_jsp.html deleted file mode 100644 index 12056550fc2..00000000000 --- a/it/it-tests/src/test/resources/serverSystem/ServerSystemTest/url_ending_by_jsp.html +++ /dev/null @@ -1,42 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - ~ SonarQube, open source software quality management tool. - ~ Copyright (C) 2008-2016 SonarSource - ~ mailto:contact AT sonarsource DOT com - ~ - ~ SonarQube 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. - ~ - ~ SonarQube 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. - --> - -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/dashboard/index/myproject.jsp</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=#content</td> - <td></td> - </tr> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/settings/SettingsTest/sonar-secret.txt b/it/it-tests/src/test/resources/settings/SettingsTest/sonar-secret.txt deleted file mode 100644 index 65b98c522da..00000000000 --- a/it/it-tests/src/test/resources/settings/SettingsTest/sonar-secret.txt +++ /dev/null @@ -1 +0,0 @@ -0PZz+G+f8mjr3sPn4+AhHg==
\ No newline at end of file diff --git a/it/it-tests/src/test/resources/sourceCode/EncodingTest/japanese_sources.html b/it/it-tests/src/test/resources/sourceCode/EncodingTest/japanese_sources.html deleted file mode 100644 index d873fba3939..00000000000 --- a/it/it-tests/src/test/resources/sourceCode/EncodingTest/japanese_sources.html +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>japanese_sources</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">japanese_sources</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/component/index?id=japanese-charset%3Asrc%2Fmain%2Fxoo%2Fcom%2Ftest%2FAppDuplication.xoo</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.source-viewer</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.source-table</td> - <td>glob:*public class AppDuplication*</td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.source-table</td> - <td>glob:*証明書パス構築に失敗しました。*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/sourceCode/HighlightingTest/symbol-usages-highlighting.html b/it/it-tests/src/test/resources/sourceCode/HighlightingTest/symbol-usages-highlighting.html deleted file mode 100644 index 42e1fc154f2..00000000000 --- a/it/it-tests/src/test/resources/sourceCode/HighlightingTest/symbol-usages-highlighting.html +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>highlight-symbol-usages</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">highlight-symbol-usages</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/component/index?id=sample-with-highlighting%3Asrc%2Fmain%2Fxoo%2Fsample%2FSample.xoo</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.source-line</td> - <td></td> -</tr> -<tr> - <td>waitForXpathCount</td> - <td>//span[contains(@class, 'sym')]</td> - <td>3</td> -</tr> -<tr> - <td>waitForXpathCount</td> - <td>//span[contains(@class, 'sym highlighted')]</td> - <td>0</td> -</tr> -<tr> - <td>click</td> - <td>//span[contains(@class, 'sym')][2]</td> - <td></td> -</tr> -<tr> - <td>waitForXpathCount</td> - <td>//span[contains(@class, 'sym highlighted')]</td> - <td>2</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/sourceCode/HighlightingTest/syntax-highlighting-v1.html b/it/it-tests/src/test/resources/sourceCode/HighlightingTest/syntax-highlighting-v1.html deleted file mode 100644 index 7a1e36cf816..00000000000 --- a/it/it-tests/src/test/resources/sourceCode/HighlightingTest/syntax-highlighting-v1.html +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>java-syntax-highlighting</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">highlight-syntax-v1</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/component/index?id=sample-with-highlighting%3Asrc%2Fmain%2Fxoo%2Fsample%2FSample.xoo</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.source-line</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="k">package</span>*</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="k">public</span>*</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="k">class</span>*</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <!-- Here class is wrong and will be fixed during next analysis --> - <td>glob:*<span class="s">return</span>*</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="s">"hello"</span>*</td> - <td></td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/sourceCode/HighlightingTest/syntax-highlighting-v2.html b/it/it-tests/src/test/resources/sourceCode/HighlightingTest/syntax-highlighting-v2.html deleted file mode 100644 index 7f473dd9e43..00000000000 --- a/it/it-tests/src/test/resources/sourceCode/HighlightingTest/syntax-highlighting-v2.html +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>java-syntax-highlighting</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">highlight-syntax-v2</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/component/index?id=sample-with-highlighting%3Asrc%2Fmain%2Fxoo%2Fsample%2FSample.xoo</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.source-line</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="k">package</span>*</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="k">public</span>*</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="k">class</span>*</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="k">return</span>*</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="s">"hello"</span>*</td> - <td></td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/sourceCode/HighlightingTest/syntax-highlighting.html b/it/it-tests/src/test/resources/sourceCode/HighlightingTest/syntax-highlighting.html deleted file mode 100644 index 53e4602a978..00000000000 --- a/it/it-tests/src/test/resources/sourceCode/HighlightingTest/syntax-highlighting.html +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>java-syntax-highlighting</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">highlight-syntax</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/component/index?id=sample-with-highlighting%3Asrc%2Fmain%2Fxoo%2Fsample%2FSample.xoo</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.source-line</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="k">package</span>*</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="k">public</span>*</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="k">class</span>*</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="k">return</span>*</td> - <td></td> - </tr> - <tr> - <td>verifyHtmlSource</td> - <td>glob:*<span class="s">"hello"</span>*</td> - <td></td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/sourceCode/ProjectCodeTest/code_page_should_expand_root_dir.html b/it/it-tests/src/test/resources/sourceCode/ProjectCodeTest/code_page_should_expand_root_dir.html deleted file mode 100644 index c9737d5fe25..00000000000 --- a/it/it-tests/src/test/resources/sourceCode/ProjectCodeTest/code_page_should_expand_root_dir.html +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>code_page_should_expand_root_dir</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">code_page_should_expand_root_dir</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/code?id=project-for-code-root-dir</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=#content</td> - <td>*Hello.xoo*src/main/xoo/sample*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/sourceCode/ProjectCodeTest/permalink.html b/it/it-tests/src/test/resources/sourceCode/ProjectCodeTest/permalink.html deleted file mode 100644 index 69364a69079..00000000000 --- a/it/it-tests/src/test/resources/sourceCode/ProjectCodeTest/permalink.html +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>test_project_code_page</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">test_project_code_page</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/code?id=project-for-code&selected=project-for-code%3Asrc%2Fmain%2Fxoo%2Fsample%2FSample.xoo</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=#content</td> - <td>*public class Sample*</td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.code-breadcrumbs</td> - <td>*Project For Code*src/main/xoo/sample*Sample.xoo*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/sourceCode/ProjectCodeTest/search.html b/it/it-tests/src/test/resources/sourceCode/ProjectCodeTest/search.html deleted file mode 100644 index 1594ee28cd5..00000000000 --- a/it/it-tests/src/test/resources/sourceCode/ProjectCodeTest/search.html +++ /dev/null @@ -1,60 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>test_project_code_page</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">test_project_code_page</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/code?id=project-for-code</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=#content</td> - <td>*Project For Code*13*0*0*0.0%*</td> -</tr> -<tr> - <td>type</td> - <td>css=.search-box-input</td> - <td>xoo</td> -</tr> -<tr> - <td>click</td> - <td>css=.search-box-submit</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=#content</td> - <td>*Sample.xoo*</td> -</tr> -<tr> - <td>click</td> - <td>css=.code-name-cell a</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=#content</td> - <td>*public class Sample*</td> -</tr> -<tr> - <td>waitForText</td> - <td>css=.code-breadcrumbs</td> - <td>*Project For Code*src/main/xoo/sample*Sample.xoo*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/sourceCode/ProjectCodeTest/test_project_code_page.html b/it/it-tests/src/test/resources/sourceCode/ProjectCodeTest/test_project_code_page.html deleted file mode 100644 index 9c6b163fa44..00000000000 --- a/it/it-tests/src/test/resources/sourceCode/ProjectCodeTest/test_project_code_page.html +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>test_project_code_page</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">test_project_code_page</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/code?id=project-for-code</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=#content</td> - <td>*Project For Code*13*0*0*0.0%*</td> -</tr> -<tr> - <td>waitForText</td> - <td>css=#content</td> - <td>*src/main/xoo/sample*</td> -</tr> -<tr> - <td>click</td> - <td>css=.code-name-cell a</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>css=#content</td> - <td>*Sample.xoo*</td> -</tr> -<tr> - <td>click</td> - <td>css=.code-breadcrumbs a</td> - <td></td> -</tr> -<tr> - <td>waitForNotText</td> - <td>css=#content</td> - <td>*Sample.xoo*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/test/CoverageTest/it_coverage-expected.json b/it/it-tests/src/test/resources/test/CoverageTest/it_coverage-expected.json deleted file mode 100644 index 521b372b6ea..00000000000 --- a/it/it-tests/src/test/resources/test/CoverageTest/it_coverage-expected.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "sources": [ - { - "line": 1, - "code": "package sample;" - }, - { - "line": 2, - "code": "" - }, - { - "line": 3, - "code": "public class Sample {" - }, - { - "line": 4, - "code": "\t" - }, - { - "line": 5, - "code": "\tpublic Sample(int i) {" - }, - { - "line": 6, - "code": "\t\tint j = i++;", - "lineHits": 1, - "utLineHits": 1 - }, - { - "line": 7, - "code": "\t}" - }, - { - "line": 8, - "code": "\t" - }, - { - "line": 9, - "code": "\tprivate String myMethod() {" - }, - { - "line": 10, - "code": "\t\tif (foo == bar) {", - "lineHits": 0, - "utLineHits": 0, - "conditions": 2, - "utConditions": 2, - "coveredConditions": 1, - "utCoveredConditions": 1 - }, - { - "line": 11, - "code": "\t\t\treturn \"hello\";", - "lineHits": 1, - "utLineHits": 1 - }, - { - "line": 12, - "code": "\t\t} else {" - }, - { - "line": 13, - "code": "\t\t\tthrow new IllegalStateException();", - "lineHits": 0, - "utLineHits": 0 - }, - { - "line": 14, - "code": "\t\t}" - }, - { - "line": 15, - "code": "\t}" - }, - { - "line": 16, - "code": "}" - }, - { - "line": 17, - "code": "" - } - ] -} diff --git a/it/it-tests/src/test/resources/test/CoverageTest/unit_test_coverage-expected.json b/it/it-tests/src/test/resources/test/CoverageTest/unit_test_coverage-expected.json deleted file mode 100644 index c2f25a610a9..00000000000 --- a/it/it-tests/src/test/resources/test/CoverageTest/unit_test_coverage-expected.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "sources":[ - { - "line": 1, - "code": "package sample;", - }, - { - "line": 2, - "code": "", - }, - { - "line": 3, - "code": "public class Sample {", - }, - { - "line": 4, - "code": "\t", - }, - { - "line": 5, - "code": "\tpublic Sample(int i) {", - }, - { - "line": 6, - "code": "\t\tint j = i++;", - "lineHits": 1, - "utLineHits": 1 - }, - { - "line": 7, - "code": "\t}", - }, - { - "line": 8, - "code": "\t", - }, - { - "line": 9, - "code": "\tprivate String myMethod() {", - }, - { - "line": 10, - "code": "\t\tif (foo == bar) {", - "lineHits": 0, - "utLineHits": 0, - "conditions": 2, - "utConditions": 2, - "coveredConditions": 1, - "utCoveredConditions": 1 - }, - { - "line": 11, - "code": "\t\t\treturn \"hello\";", - "lineHits": 1, - "utLineHits": 1 - }, - { - "line": 12, - "code": "\t\t} else {", - }, - { - "line": 13, - "code": "\t\t\tthrow new IllegalStateException();", - "lineHits": 0, - "utLineHits": 0 - }, - { - "line": 14, - "code": "\t\t}", - }, - { - "line": 15, - "code": "\t}", - }, - { - "line": 16, - "code": "}", - }, - { - "line": 17, - "code": "", - } - ] -} diff --git a/it/it-tests/src/test/resources/test/CoverageTest/unit_test_coverage_no_condition-expected.json b/it/it-tests/src/test/resources/test/CoverageTest/unit_test_coverage_no_condition-expected.json deleted file mode 100644 index aabf73102ff..00000000000 --- a/it/it-tests/src/test/resources/test/CoverageTest/unit_test_coverage_no_condition-expected.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "sources": [ - { - "line": 1, - "code": "package sample;", - }, - { - "line": 2, - "code": "", - }, - { - "line": 3, - "code": "public class Sample {", - }, - { - "line": 4, - "code": "\t", - }, - { - "line": 5, - "code": "\tpublic Sample(int i) {", - }, - { - "line": 6, - "code": "\t\tint j = i++;", - "lineHits": 1, - "utLineHits": 1 - }, - { - "line": 7, - "code": "\t}", - }, - { - "line": 8, - "code": "\t", - }, - { - "line": 9, - "code": "\tprivate String myMethod() {", - }, - { - "line": 10, - "code": "\t\tif (foo == bar) {", - "lineHits": 0, - "utLineHits": 0 - }, - { - "line": 11, - "code": "\t\t\treturn \"hello\";", - "lineHits": 1, - "utLineHits": 1 - }, - { - "line": 12, - "code": "\t\t} else {", - }, - { - "line": 13, - "code": "\t\t\tthrow new IllegalStateException();", - "lineHits": 0, - "utLineHits": 0 - }, - { - "line": 14, - "code": "\t\t}", - }, - { - "line": 15, - "code": "\t}", - }, - { - "line": 16, - "code": "}", - }, - { - "line": 17, - "code": "", - } - ] -} diff --git a/it/it-tests/src/test/resources/test/CoverageTest/ut_and_it_coverage-expected.json b/it/it-tests/src/test/resources/test/CoverageTest/ut_and_it_coverage-expected.json deleted file mode 100644 index d2b26d19c61..00000000000 --- a/it/it-tests/src/test/resources/test/CoverageTest/ut_and_it_coverage-expected.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "sources": [ - { - "line": 1, - "code": "package sample;" - }, - { - "line": 2, - "code": "" - }, - { - "line": 3, - "code": "public class Sample {" - }, - { - "line": 4, - "code": "\t" - }, - { - "line": 5, - "code": "\tpublic Sample(int i) {" - }, - { - "line": 6, - "code": "\t\tint j = i++;", - "lineHits": 1, - "utLineHits": 1 - }, - { - "line": 7, - "code": "\t}" - }, - { - "line": 8, - "code": "\t" - }, - { - "line": 9, - "code": "\tprivate String myMethod() {" - }, - { - "line": 10, - "code": "\t\tif (foo == bar && biz > 1) {", - "lineHits": 0, - "utLineHits": 0, - "conditions": 4, - "utConditions": 4, - "coveredConditions": 2, - "utCoveredConditions": 2 - }, - { - "line": 11, - "code": "\t\t\treturn \"hello\";", - "lineHits": 1, - "utLineHits": 1 - }, - { - "line": 12, - "code": "\t\t} else {" - }, - { - "line": 13, - "code": "\t\t\tthrow new IllegalStateException();", - "lineHits": 1, - "utLineHits": 1 - }, - { - "line": 14, - "code": "\t\t}" - }, - { - "line": 15, - "code": "\t}" - }, - { - "line": 16, - "code": "}" - }, - { - "line": 17, - "code": "" - } - ] - -} diff --git a/it/it-tests/src/test/resources/test/CoverageTrackingTest/covered_files-expected.json b/it/it-tests/src/test/resources/test/CoverageTrackingTest/covered_files-expected.json deleted file mode 100644 index 5dda4f3dd11..00000000000 --- a/it/it-tests/src/test/resources/test/CoverageTrackingTest/covered_files-expected.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "files": [ - { - "key": "sample-with-tests:src/main/xoo/sample/Sample.xoo", - "longName": "src/main/xoo/sample/Sample.xoo", - "coveredLines": 2 - }, - { - "key": "sample-with-tests:src/main/xoo/sample/Sample2.xoo", - "longName": "src/main/xoo/sample/Sample2.xoo", - "coveredLines": 1 - } - ] -} diff --git a/it/it-tests/src/test/resources/test/CoverageTrackingTest/tests-expected.json b/it/it-tests/src/test/resources/test/CoverageTrackingTest/tests-expected.json deleted file mode 100644 index 121e6753074..00000000000 --- a/it/it-tests/src/test/resources/test/CoverageTrackingTest/tests-expected.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "tests": [ - { - "name": "success", - "status": "OK", - "durationInMs": 4, - "coveredLines": 3 - }, - { - "name": "error", - "status": "ERROR", - "durationInMs": 2, - "coveredLines": 0, - "message": "Error", - "stacktrace": "The stack" - }, - { - "name": "failure", - "status": "FAILURE", - "durationInMs": 2, - "coveredLines": 1, - "message": "Failure" - }, - { - "name": "skipped", - "status": "SKIPPED", - "coveredLines": 0 - } - ] -} diff --git a/it/it-tests/src/test/resources/test/TestExecutionTest/expected.json b/it/it-tests/src/test/resources/test/TestExecutionTest/expected.json deleted file mode 100644 index 843d28f5284..00000000000 --- a/it/it-tests/src/test/resources/test/TestExecutionTest/expected.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "tests": [ - { - "name": "success", - "status": "OK", - "durationInMs": 4, - "coveredLines": 0 - }, - { - "name": "error", - "status": "ERROR", - "durationInMs": 2, - "coveredLines": 0, - "message": "Error", - "stacktrace": "The stack" - }, - { - "name": "failure", - "status": "FAILURE", - "durationInMs": 2, - "coveredLines": 0, - "message": "Failure" - }, - { - "name": "skipped", - "status": "SKIPPED", - "coveredLines": 0, - "durationInMs": 0 - } - ] -} diff --git a/it/it-tests/src/test/resources/uiExtension/UiExtensionsTest/static-files.html b/it/it-tests/src/test/resources/uiExtension/UiExtensionsTest/static-files.html deleted file mode 100644 index 0acd31cc1fa..00000000000 --- a/it/it-tests/src/test/resources/uiExtension/UiExtensionsTest/static-files.html +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>static-files</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/static/uiextensionsplugin/file.html</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>//body</td> - <td>Text from static resource</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/updateCenter/UpdateCenterTest/update-center.properties b/it/it-tests/src/test/resources/updateCenter/UpdateCenterTest/update-center.properties deleted file mode 100644 index 5882d43188f..00000000000 --- a/it/it-tests/src/test/resources/updateCenter/UpdateCenterTest/update-center.properties +++ /dev/null @@ -1,62 +0,0 @@ -# THIS FILE IS USED BY THE UPDATE CENTER -# DO NOT REMOVE OR RENAME -# -# Note : prefix all : by \ -# - -publicVersions=3.0,100.0 - -3.0.description=Encryption of database password, TimeMachine available as widgets, New algorithm for tracking violations, 40 bugs and 40 improvements -3.0.downloadUrl=http\://dist.sonar.codehaus.org/sonar-3.0.zip -3.0.changelogUrl=http\://www.sonarsource.org/downloads/#3.0 -3.0.date=2012-04-17 - -100.0.description=Hundred dot zero! -100.0.downloadUrl=http\://dist.sonar.codehaus.org/sonar-100.0.zip -100.0.changelogUrl=http\://www.sonarsource.org/downloads/#100.0 -100.0.date=2112-06-13 - - -plugins=fake,abap - -#-------------------------------------------------------------------------------------------------------------------------- -abap.homepageUrl=http\://www.sonarsource.com/products/plugins/languages/abap/ -abap.name=ABAP -abap.category=Additional Languages -abap.publicVersions=1.0,1.0.1,1.1,2.0.1 - -abap.1.0.description=Initial version of the product -abap.1.0.sqVersions=2.7,2.8,2.9,2.10,2.11,2.12,2.13,2.13.1,2.14,3.0,3.0.1,3.1,3.1.1 -abap.1.0.downloadUrl= -abap.1.0.date=2011-07-29 - -abap.1.0.1.description=Adjust computation of certain metrics -abap.1.0.1.sqVersions=2.7,2.8,2.9,2.10,2.11,2.12,2.13,2.13.1,2.14,3.0,3.0.1,3.1,3.1.1 -abap.1.0.1.downloadUrl= -abap.1.0.1.date=2011-08-28 - -abap.1.1.description=Adjust computation of certain metrics -abap.1.1.sqVersions=2.7,2.8,2.9,2.10,2.11,2.12,2.13,2.13.1,2.14,3.0,3.0.1,3.1,3.1.1 -abap.1.1.downloadUrl= -abap.1.1.date=2012-01-05 - -abap.2.0.1.description=This new version provides an ABAP source code extractor, adds 5 new rules and improves others -abap.2.0.1.sqVersions=3.2,3.3,3.4,3.5,3.6,3.7,3.7.1,3.7.2,3.7.3,3.7.4,3.7.5,3.7.6,3.7.7,4.0,4.0.1,4.1,4.2,4.3,4.4,4.5,4.6,4.7,5.0,5.1,5.2,5.3,5.4,5.5,5.6,5.7,6.0,6.1,6.2,6.3,6.4,6.5,6.6 -abap.2.0.1.downloadUrl= -abap.2.0.1.date=2012-06-25 - -#-------------------------------------------------------------------------------------------------------------------------- -fake.category=Additional Metrics -fake.publicVersions=1.0,1.1 -fake.name=Fake -fake.description=Fake plugin for integration tests - -fake.1.0.description=Initial release -fake.1.0.sqVersions=3.2,3.3,3.4,3.5,3.6,3.7 -fake.1.0.downloadUrl= -fake.1.0.date=2011-05-06 - -fake.1.1.description=Support sonarqube v100.0 -fake.1.1.sqVersions=3.2,3.3,3.4,3.5,3.6,3.7,3.7.1,3.7.2,3.7.3,3.7.4,3.7.5,3.7.6,3.7.7,4.0,4.0.1,4.1,4.2,4.3,4.4,4.5,4.6,4.7,5.0,5.1,5.2,5.3,5.4,5.5,5.6,5.7,6.0,6.1,6.2,6.3,6.4,6.5,6.6,100.0 -fake.1.1.downloadUrl= -fake.1.1.date=2012-04-27 diff --git a/it/it-tests/src/test/resources/updateCenter/installed-plugins.html b/it/it-tests/src/test/resources/updateCenter/installed-plugins.html deleted file mode 100644 index d1986f6f897..00000000000 --- a/it/it-tests/src/test/resources/updateCenter/installed-plugins.html +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>installed-plugins</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/updatecenter</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Fake*</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=update-center-plugins</td> - <td>*Fake*1.0-SNAPSHOT*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/display_message_in_ui_but_not_in_log_when_unauthorized_exception.html b/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/display_message_in_ui_but_not_in_log_when_unauthorized_exception.html deleted file mode 100644 index b62763fb7c9..00000000000 --- a/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/display_message_in_ui_but_not_in_log_when_unauthorized_exception.html +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>fail_to_authenticate_when_not_allowed_to_sign_up</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">french</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log in with Fake base identity provider*</td> - </tr> - <tr> - <td>click</td> - <td>css=.oauth-providers a</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>bd</td> - <td>*You're not authorized to access this page. Please contact the administrator.*</td> - </tr> - <tr> - <td>assertText</td> - <td>bd</td> - <td>*Reason : A functional error has happened*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/display_unauthorized_page_when_authentication_failed.html b/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/display_unauthorized_page_when_authentication_failed.html deleted file mode 100644 index 47a19a2df41..00000000000 --- a/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/display_unauthorized_page_when_authentication_failed.html +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>display_unauthorized_page_when_authentication_failed</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">french</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log in with Fake base identity provider*</td> - </tr> - <tr> - <td>click</td> - <td>css=.oauth-providers a</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>bd</td> - <td>*You're not authorized to access this page. Please contact the administrator.*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/fail_to_authenticate_when_not_allowed_to_sign_up.html b/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/fail_to_authenticate_when_not_allowed_to_sign_up.html deleted file mode 100644 index 40c300bd701..00000000000 --- a/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/fail_to_authenticate_when_not_allowed_to_sign_up.html +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>fail_to_authenticate_when_not_allowed_to_sign_up</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">french</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log in with Fake base identity provider*</td> - </tr> - <tr> - <td>click</td> - <td>css=.oauth-providers a</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>bd</td> - <td>*You're not authorized to access this page. Please contact the administrator.*Reason : 'fake-base-id-provider' users are not allowed to sign up*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/fail_when_email_already_exists.html b/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/fail_when_email_already_exists.html deleted file mode 100644 index b6f7e600ac3..00000000000 --- a/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/fail_when_email_already_exists.html +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>fail_when_email_already_exists</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">french</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log in with Fake base identity provider*</td> - </tr> - <tr> - <td>click</td> - <td>css=.oauth-providers a</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>bd</td> - <td>*You're not authorized to access this page. Please contact the administrator.*</td> - </tr> - <tr> - <td>assertText</td> - <td>bd</td> - <td>*You can't sign up because email 'john@email.com' is already used by an existing user. This means that you probably already registered with another account*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/create-and-delete-user.html b/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/create-and-delete-user.html deleted file mode 100644 index f7d0dd6ffb6..00000000000 --- a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/create-and-delete-user.html +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-/W3C/DTD XHTML 1.0 Strict/EN" "http:/www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http:/www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http:/selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>create-and-delete-users</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">create-and-delete-users</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/users</td> - <td></td> -</tr> -<tr> - <td>store</td> - <td>javascript{new Date().getTime()}</td> - <td>userId</td> -</tr> -<tr> - <td>waitForText</td> - <td>content</td> - <td>*Create User*</td> -</tr> -<tr> - <td>click</td> - <td>id=users-create</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>id=create-user-form</td> - <td>*Create User*</td> -</tr> -<tr> - <td>type</td> - <td>id=create-user-login</td> - <td>${userId}</td> -</tr> -<tr> - <td>type</td> - <td>id=create-user-name</td> - <td>Name of ${userId}</td> -</tr> -<tr> - <td>type</td> - <td>id=create-user-password</td> - <td>password</td> -</tr> -<tr> - <td>click</td> - <td>id=create-user-submit</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>id=users-list</td> - <td>*${userId}*</td> -</tr> -<tr> - <td>click</td> - <td>css=[data-login="${userId}"] .js-user-deactivate</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>id=deactivate-user-form</td> - <td>*${userId}*</td> -</tr> -<tr> - <td>click</td> - <td>id=deactivate-user-submit</td> - <td></td> -</tr> -<tr> - <td>waitForNotText</td> - <td>id=users-list</td> - <td>*${userId}*</td> -</tr> -<tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>tester</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>password</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td>deactivate-user-form</td> -</tr> -<tr> - <td>waitForText</td> - <td>login_form</td> - <td>*Authentication failed*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details.html b/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details.html deleted file mode 100644 index b2d712f516c..00000000000 --- a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details.html +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-/W3C/DTD XHTML 1.0 Strict/EN" "http:/www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http:/www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http:/selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>external_user_details</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">external_user_details</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>tester</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>123</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/account/</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>login</td> - <td>tester</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=name</td> - <td>Tester Testerovich</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=email</td> - <td>tester@example.org</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details2.html b/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details2.html deleted file mode 100644 index d18ae08afb9..00000000000 --- a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details2.html +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-/W3C/DTD XHTML 1.0 Strict/EN" "http:/www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http:/www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http:/selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>external_user_details</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">external_user_details</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>tester</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>123</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/account</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>login</td> - <td>tester</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=name</td> - <td>Tester2 Testerovich</td> - </tr> - <tr> - <td>waitForText</td> - <td>id=email</td> - <td>tester2@example.org</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/system-info.html b/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/system-info.html deleted file mode 100644 index 1daf46d205d..00000000000 --- a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/system-info.html +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-/W3C/DTD XHTML 1.0 Strict/EN" "http:/www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http:/www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http:/selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>external_user_details</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">external_user_details</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/system</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>id=content</td> - <td>*External User Authentication*FakeRealm*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/allow_users_to_sign_up.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/allow_users_to_sign_up.html deleted file mode 100644 index dab0c303ea5..00000000000 --- a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/allow_users_to_sign_up.html +++ /dev/null @@ -1,109 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>allow_users_to_sign_up</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log In to SonarQube*</td> - </tr> - <tr> - <td>waitForText</td> - <td>bd</td> - <td>*Not a member*</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>link=Sign up</td> - <td></td> - </tr> - <tr> - <td>type</td> - <td>id=user_login</td> - <td>signuplogin</td> - </tr> - <tr> - <td>type</td> - <td>id=user_name</td> - <td>SignUpName</td> - </tr> - <tr> - <td>type</td> - <td>id=user_password</td> - <td>password</td> - </tr> - <tr> - <td>type</td> - <td>id=user_password_confirmation</td> - <td>password</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>global-navigation</td> - <td>*Log in*</td> - </tr> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log In to SonarQube*</td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>signuplogin</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>password</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>css=.navbar</td> - <td>*SignUpName*</td> - </tr> - <tr> - <td>click</td> - <td>Link=SignUpName</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>css=.navbar</td> - <td>*Log out*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/force-authentication.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/force-authentication.html deleted file mode 100644 index 4c5a751665d..00000000000 --- a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/force-authentication.html +++ /dev/null @@ -1,59 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>force-authentication</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">force-authentication</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log In to SonarQube*</td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_successful.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_successful.html deleted file mode 100644 index 18da805f66b..00000000000 --- a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_successful.html +++ /dev/null @@ -1,69 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>login_successful</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">login_successful</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log In to SonarQube*</td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>click</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>assertTextPresent</td> - <td>Log out</td> - <td></td> - </tr> - <tr> - <td>clickAndWait</td> - <td>link=Log out</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>link=Log in</td> - <td>Log in</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_wrong_password.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_wrong_password.html deleted file mode 100644 index dc66db8ee9b..00000000000 --- a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_wrong_password.html +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>login_wrong_password</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log In to SonarQube*</td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>wrong</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>assertTextPresent</td> - <td>Authentication failed</td> - <td></td> - </tr> - - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_login_when_not_enough_privilege.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_login_when_not_enough_privilege.html deleted file mode 100644 index 9b5a1645ace..00000000000 --- a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_login_when_not_enough_privilege.html +++ /dev/null @@ -1,59 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>redirect-to-original-url-after-direct-login</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>content</td> - <td>*Log In to SonarQube*</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>simple-user</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>password</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/settings</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>content</td> - <td>*Log In to SonarQube*</td> -</tr> -<tr> - <td>assertText</td> - <td>content</td> - <td>*You are not authorized to access this page. Please log in with more privileges and try again.*</td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_direct_login.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_direct_login.html deleted file mode 100644 index c6519726f27..00000000000 --- a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_direct_login.html +++ /dev/null @@ -1,59 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>redirect-to-original-url-after-direct-login</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>global-navigation</td> - <td>*Log in*</td> - </tr> - <tr> - <td>open</td> - <td>/settings?category=general</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log In to SonarQube*</td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>assertLocation</td> - <td>glob:*/settings?category=general*</td> - <td></td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_indirect_login.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_indirect_login.html deleted file mode 100644 index aecfd8af765..00000000000 --- a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_indirect_login.html +++ /dev/null @@ -1,58 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>global-navigation</td> - <td>*Log in*</td> - </tr> - <tr> - <td>open</td> - <td>/settings</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log In to SonarQube*</td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>assertLocation</td> - <td>*/settings</td> - <td></td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_with_parameters_after_direct_login.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_with_parameters_after_direct_login.html deleted file mode 100644 index 5359e3308e0..00000000000 --- a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_with_parameters_after_direct_login.html +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/logout</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>global-navigation</td> - <td>*Log in*</td> - </tr> - <tr> - <td>open</td> - <td>/projects?gate=OK&reliability=1&security=1</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>global-navigation</td> - <td>*Log in*</td> - </tr> - <tr> - <td>click</td> - <td>link=Log in</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log In to SonarQube*</td> - </tr> - <tr> - <td>type</td> - <td>login</td> - <td>admin-user</td> - </tr> - <tr> - <td>type</td> - <td>password</td> - <td>admin-user</td> - </tr> - <tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> - </tr> - <tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> - </tr> - <tr> - <td>assertLocation</td> - <td>*/projects?gate=OK&reliability=1&security=1</td> - <td></td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/should_not_be_unlogged_when_going_to_login_page.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/should_not_be_unlogged_when_going_to_login_page.html deleted file mode 100644 index af5b4362f0e..00000000000 --- a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/should_not_be_unlogged_when_going_to_login_page.html +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>redirect-to-original-url-after-direct-login</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>content</td> - <td>*Log In to SonarQube*</td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>simple-user</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>password</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> -</tr> -<tr> - <td>waitForText</td> - <td>content</td> - <td>*Log In to SonarQube*</td> -</tr> -<tr> - <td>open</td> - <td>/</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_no_projects.html b/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_no_projects.html deleted file mode 100644 index 2c2f0f026db..00000000000 --- a/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_no_projects.html +++ /dev/null @@ -1,60 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_no_projects</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">should_display_no_projects</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>account-user</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>password</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/account/projects/</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=#account-projects</td> - <td></td> -</tr> -<tr> - <td>assertElementNotPresent</td> - <td>css=.account-projects-list</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_projects.html b/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_projects.html deleted file mode 100644 index b199152803f..00000000000 --- a/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_projects.html +++ /dev/null @@ -1,85 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <link rel="selenium.base" href="http://localhost:49506"/> - <title>should_display_projects</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">should_display_projects</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/login</td> - <td></td> -</tr> -<tr> - <td>type</td> - <td>login</td> - <td>account-user</td> -</tr> -<tr> - <td>type</td> - <td>password</td> - <td>password</td> -</tr> -<tr> - <td>clickAndWait</td> - <td>commit</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.js-user-authenticated</td> - <td></td> -</tr> -<tr> - <td>open</td> - <td>/account/projects/</td> - <td></td> -</tr> -<tr> - <td>waitForElementPresent</td> - <td>css=.account-project-card</td> - <td></td> -</tr> -<tr> - <td>assertText</td> - <td>css=.account-project-name</td> - <td>*Sample*</td> -</tr> -<tr> - <td>assertText</td> - <td>css=.account-project-quality-gate</td> - <td>*Passed*</td> -</tr> -<tr> - <td>assertText</td> - <td>css=.account-project-key</td> - <td>*sample*</td> -</tr> -<tr> - <td>assertText</td> - <td>css=.account-project-description</td> - <td>*Description of a project*</td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=.account-project-analysis</td> - <td></td> -</tr> -<tr> - <td>assertElementPresent</td> - <td>css=.account-project-links a[href="http://example.com"]</td> - <td></td> -</tr> -</tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/OAuth2IdentityProviderTest/display_message_in_ui_but_not_in_log_when_unauthorized_exception.html b/it/it-tests/src/test/resources/user/OAuth2IdentityProviderTest/display_message_in_ui_but_not_in_log_when_unauthorized_exception.html deleted file mode 100644 index 6a38ed69063..00000000000 --- a/it/it-tests/src/test/resources/user/OAuth2IdentityProviderTest/display_message_in_ui_but_not_in_log_when_unauthorized_exception.html +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>fail_to_authenticate_when_not_allowed_to_sign_up</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">french</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log in with Fake oauth2 identity provider*</td> - </tr> - <tr> - <td>click</td> - <td>css=.oauth-providers a</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>bd</td> - <td>*You're not authorized to access this page. Please contact the administrator.*</td> - </tr> - <tr> - <td>assertText</td> - <td>bd</td> - <td>*Reason : A functional error has happened*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/OAuth2IdentityProviderTest/display_unauthorized_page_when_authentication_failed.html b/it/it-tests/src/test/resources/user/OAuth2IdentityProviderTest/display_unauthorized_page_when_authentication_failed.html deleted file mode 100644 index b01d24aad4c..00000000000 --- a/it/it-tests/src/test/resources/user/OAuth2IdentityProviderTest/display_unauthorized_page_when_authentication_failed.html +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>display_unauthorized_page_when_authentication_failed</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">french</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log in with Fake oauth2 identity provider*</td> - </tr> - <tr> - <td>click</td> - <td>css=.oauth-providers a</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>bd</td> - <td>*You're not authorized to access this page. Please contact the administrator.*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/OAuth2IdentityProviderTest/fail_to_authenticate_when_not_allowed_to_sign_up.html b/it/it-tests/src/test/resources/user/OAuth2IdentityProviderTest/fail_to_authenticate_when_not_allowed_to_sign_up.html deleted file mode 100644 index a3da2de8ed0..00000000000 --- a/it/it-tests/src/test/resources/user/OAuth2IdentityProviderTest/fail_to_authenticate_when_not_allowed_to_sign_up.html +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>fail_to_authenticate_when_not_allowed_to_sign_up</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">french</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log in with Fake oauth2 identity provider*</td> - </tr> - <tr> - <td>click</td> - <td>css=.oauth-providers a</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>bd</td> - <td>*You're not authorized to access this page. Please contact the administrator.*Reason : 'fake-oauth2-id-provider' users are not allowed to sign up*</td> - </tr> - </tbody> -</table> -</body> -</html> diff --git a/it/it-tests/src/test/resources/user/OAuth2IdentityProviderTest/fail_when_email_already_exists.html b/it/it-tests/src/test/resources/user/OAuth2IdentityProviderTest/fail_when_email_already_exists.html deleted file mode 100644 index 7d038ac592d..00000000000 --- a/it/it-tests/src/test/resources/user/OAuth2IdentityProviderTest/fail_when_email_already_exists.html +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head profile="http://selenium-ide.openqa.org/profiles/test-case"> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>fail_when_email_already_exists</title> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1"> - <thead> - <tr> - <td rowspan="1" colspan="3">french</td> - </tr> - </thead> - <tbody> - <tr> - <td>open</td> - <td>/sessions/new</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>content</td> - <td>*Log in with Fake oauth2 identity provider*</td> - </tr> - <tr> - <td>click</td> - <td>css=.oauth-providers a</td> - <td></td> - </tr> - <tr> - <td>waitForText</td> - <td>bd</td> - <td>*You're not authorized to access this page. Please contact the administrator.*</td> - </tr> - <tr> - <td>assertText</td> - <td>bd</td> - <td>*You can't sign up because email 'john@email.com' is already used by an existing user. This means that you probably already registered with another account*</td> - </tr> - </tbody> -</table> -</body> -</html> |