From: Dejan Milisavljevic <130993898+dejan-milisavljevic-sonarsource@users.noreply.github.com> Date: Mon, 26 Feb 2024 09:27:42 +0000 (+0100) Subject: SONAR-21643 Make rule compatible with JUnit5 (#10700) X-Git-Tag: 10.5.0.89998~167 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=990606438b5fb472915f244a5ea68386abb63c1d;p=sonarqube.git SONAR-21643 Make rule compatible with JUnit5 (#10700) --- diff --git a/server/sonar-auth-ldap/build.gradle b/server/sonar-auth-ldap/build.gradle index ff21ffe4a90..77692decb3e 100644 --- a/server/sonar-auth-ldap/build.gradle +++ b/server/sonar-auth-ldap/build.gradle @@ -17,7 +17,15 @@ dependencies { testImplementation 'com.tngtech.java:junit-dataprovider' testImplementation 'junit:junit' testImplementation 'org.assertj:assertj-core' + testImplementation 'org.junit.jupiter:junit-jupiter-api' testImplementation 'org.mockito:mockito-core' testImplementation project(":sonar-testing-ldap") + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' + testRuntimeOnly 'org.junit.vintage:junit-vintage-engine' +} + +test { + // Enabling the JUnit Platform (see https://github.com/junit-team/junit5-samples/tree/master/junit5-migration-gradle) + useJUnitPlatform() } diff --git a/server/sonar-auth-ldap/src/it/java/org/sonar/auth/ldap/DefaultLdapAuthenticatorIT.java b/server/sonar-auth-ldap/src/it/java/org/sonar/auth/ldap/DefaultLdapAuthenticatorIT.java index 1bcd99e9377..a0c2f5a5d6f 100644 --- a/server/sonar-auth-ldap/src/it/java/org/sonar/auth/ldap/DefaultLdapAuthenticatorIT.java +++ b/server/sonar-auth-ldap/src/it/java/org/sonar/auth/ldap/DefaultLdapAuthenticatorIT.java @@ -19,8 +19,8 @@ */ package org.sonar.auth.ldap; -import org.junit.ClassRule; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.sonar.api.config.internal.MapSettings; import org.sonar.api.server.http.HttpRequest; import org.sonar.auth.ldap.server.LdapServer; @@ -28,23 +28,24 @@ import org.sonar.auth.ldap.server.LdapServer; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; -public class DefaultLdapAuthenticatorIT { +class DefaultLdapAuthenticatorIT { /** * A reference to the original ldif file */ - public static final String USERS_EXAMPLE_ORG_LDIF = "/users.example.org.ldif"; + private static final String USERS_EXAMPLE_ORG_LDIF = "/users.example.org.ldif"; /** * A reference to an additional ldif file. */ - public static final String USERS_INFOSUPPORT_COM_LDIF = "/users.infosupport.com.ldif"; - @ClassRule - public static LdapServer exampleServer = new LdapServer(USERS_EXAMPLE_ORG_LDIF); - @ClassRule - public static LdapServer infosupportServer = new LdapServer(USERS_INFOSUPPORT_COM_LDIF, "infosupport.com", "dc=infosupport,dc=com"); + private static final String USERS_INFOSUPPORT_COM_LDIF = "/users.infosupport.com.ldif"; + @RegisterExtension + private static final LdapServer exampleServer = new LdapServer(USERS_EXAMPLE_ORG_LDIF); + @RegisterExtension + private static final LdapServer infosupportServer = new LdapServer(USERS_INFOSUPPORT_COM_LDIF, "infosupport.com", "dc=infosupport," + + "dc=com"); @Test - public void testNoConnection() { + void testNoConnection() { exampleServer.disableAnonymousAccess(); try { LdapSettingsManager settingsManager = new LdapSettingsManager( @@ -58,7 +59,7 @@ public class DefaultLdapAuthenticatorIT { } @Test - public void testSimple() { + void testSimple() { LdapSettingsManager settingsManager = new LdapSettingsManager( LdapSettingsFactory.generateAuthenticationSettings(exampleServer, null, LdapContextFactory.AUTH_METHOD_SIMPLE).asConfig()); DefaultLdapAuthenticator authenticator = new DefaultLdapAuthenticator(settingsManager.getContextFactories(), settingsManager.getUserMappings()); @@ -82,7 +83,7 @@ public class DefaultLdapAuthenticatorIT { } @Test - public void testSimpleMultiLdap() { + void testSimpleMultiLdap() { LdapSettingsManager settingsManager = new LdapSettingsManager( LdapSettingsFactory.generateAuthenticationSettings(exampleServer, infosupportServer, LdapContextFactory.AUTH_METHOD_SIMPLE).asConfig()); DefaultLdapAuthenticator authenticator = new DefaultLdapAuthenticator(settingsManager.getContextFactories(), settingsManager.getUserMappings()); @@ -115,7 +116,7 @@ public class DefaultLdapAuthenticatorIT { } @Test - public void testSasl() { + void testSasl() { MapSettings mapSettings = LdapSettingsFactory.generateAuthenticationSettings(exampleServer, null, LdapContextFactory.AUTH_METHOD_DIGEST_MD5); //set sasl QoP properties as per https://docs.oracle.com/javase/jndi/tutorial/ldap/security/digest.html mapSettings.setProperty("ldap.saslQop", "auth") @@ -140,7 +141,7 @@ public class DefaultLdapAuthenticatorIT { } @Test - public void testSaslMultipleLdap() { + void testSaslMultipleLdap() { LdapSettingsManager settingsManager = new LdapSettingsManager( LdapSettingsFactory.generateAuthenticationSettings(exampleServer, infosupportServer, LdapContextFactory.AUTH_METHOD_CRAM_MD5).asConfig()); DefaultLdapAuthenticator authenticator = new DefaultLdapAuthenticator(settingsManager.getContextFactories(), settingsManager.getUserMappings()); diff --git a/server/sonar-auth-ldap/src/it/java/org/sonar/auth/ldap/server/LdapServer.java b/server/sonar-auth-ldap/src/it/java/org/sonar/auth/ldap/server/LdapServer.java index a259c24ba96..9b19e956899 100644 --- a/server/sonar-auth-ldap/src/it/java/org/sonar/auth/ldap/server/LdapServer.java +++ b/server/sonar-auth-ldap/src/it/java/org/sonar/auth/ldap/server/LdapServer.java @@ -19,10 +19,13 @@ */ package org.sonar.auth.ldap.server; +import org.junit.jupiter.api.extension.AfterAllCallback; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.ldap.ApacheDS; -public class LdapServer extends ExternalResource { +public class LdapServer extends ExternalResource implements BeforeAllCallback, AfterAllCallback { private ApacheDS server; private String ldif; @@ -40,11 +43,21 @@ public class LdapServer extends ExternalResource { } @Override - protected void before() throws Throwable { + public void beforeAll(ExtensionContext extensionContext) throws Exception { + before(); + } + + @Override + protected void before() throws Exception { server = ApacheDS.start(realm, baseDn); server.importLdif(LdapServer.class.getResourceAsStream(ldif)); } + @Override + public void afterAll(ExtensionContext extensionContext) throws Exception { + after(); + } + @Override protected void after() { try { diff --git a/server/sonar-ce-task-projectanalysis/build.gradle b/server/sonar-ce-task-projectanalysis/build.gradle index 8235e548dfb..9fd9a027841 100644 --- a/server/sonar-ce-task-projectanalysis/build.gradle +++ b/server/sonar-ce-task-projectanalysis/build.gradle @@ -52,6 +52,7 @@ dependencies { testImplementation 'org.assertj:assertj-core' testImplementation 'org.assertj:assertj-guava' testImplementation 'org.junit.jupiter:junit-jupiter-api' + testImplementation 'org.junit.jupiter:junit-jupiter-params' testImplementation 'org.reflections:reflections' testImplementation 'org.sonarsource.api.plugin:sonar-plugin-api-test-fixtures' testImplementation project(':sonar-testing-harness') @@ -59,6 +60,7 @@ dependencies { testFixturesApi 'junit:junit' testFixturesApi 'org.assertj:assertj-core' + testFixturesApi 'org.junit.jupiter:junit-jupiter-api' testFixturesApi 'org.mockito:mockito-core' testFixturesApi testFixtures(project(':server:sonar-ce-task')) diff --git a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistDuplicationDataStepIT.java b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistDuplicationDataStepIT.java index f145e54bc16..f2d17c41ab2 100644 --- a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistDuplicationDataStepIT.java +++ b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistDuplicationDataStepIT.java @@ -20,9 +20,9 @@ package org.sonar.ce.task.projectanalysis.step; import java.util.Optional; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.sonar.api.measures.Metric; import org.sonar.api.utils.System2; import org.sonar.ce.task.projectanalysis.analysis.MutableAnalysisMetadataHolderRule; @@ -44,7 +44,7 @@ import static org.sonar.ce.task.projectanalysis.component.Component.Type.FILE; import static org.sonar.ce.task.projectanalysis.component.Component.Type.PROJECT; import static org.sonar.ce.task.projectanalysis.component.ReportComponent.builder; -public class PersistDuplicationDataStepIT extends BaseStepTest { +class PersistDuplicationDataStepIT extends BaseStepJUnit5Test { private static final int ROOT_REF = 1; private static final String PROJECT_KEY = "PROJECT_KEY"; @@ -58,10 +58,10 @@ public class PersistDuplicationDataStepIT extends BaseStepTest { private static final String FILE_2_KEY = "FILE_2_KEY"; private static final String FILE_2_UUID = "u3"; - @Rule - public DbTester db = DbTester.create(System2.INSTANCE); - @Rule - public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule() + @RegisterExtension + private final DbTester db = DbTester.create(System2.INSTANCE); + @RegisterExtension + private final TreeRootHolderRule treeRootHolder = new TreeRootHolderRule() .setRoot( builder(PROJECT, ROOT_REF).setKey(PROJECT_KEY).setUuid(PROJECT_UUID) .addChildren( @@ -71,15 +71,15 @@ public class PersistDuplicationDataStepIT extends BaseStepTest { .build()) .build()); - @Rule - public MutableAnalysisMetadataHolderRule analysisMetadataHolder = new MutableAnalysisMetadataHolderRule(); - @Rule - public DuplicationRepositoryRule duplicationRepository = DuplicationRepositoryRule.create(treeRootHolder); - @Rule - public MetricRepositoryRule metricRepository = new MetricRepositoryRule(); + @RegisterExtension + private final MutableAnalysisMetadataHolderRule analysisMetadataHolder = new MutableAnalysisMetadataHolderRule(); + @RegisterExtension + private final DuplicationRepositoryRule duplicationRepository = DuplicationRepositoryRule.create(treeRootHolder); + @RegisterExtension + private final MetricRepositoryRule metricRepository = new MetricRepositoryRule(); - @Before - public void setUp() { + @BeforeEach + void setUp() { MetricDto metric = db.measures().insertMetric(m -> m.setKey(DUPLICATIONS_DATA_KEY).setValueType(Metric.ValueType.STRING.name())); insertComponent(PROJECT_KEY, PROJECT_UUID); insertComponent(FILE_1_KEY, FILE_1_UUID); @@ -94,7 +94,7 @@ public class PersistDuplicationDataStepIT extends BaseStepTest { } @Test - public void nothing_to_persist_when_no_duplication() { + void nothing_to_persist_when_no_duplication() { TestComputationStepContext context = new TestComputationStepContext(); underTest().execute(context); @@ -104,7 +104,7 @@ public class PersistDuplicationDataStepIT extends BaseStepTest { } @Test - public void compute_duplications_on_same_file() { + void compute_duplications_on_same_file() { duplicationRepository.addDuplication(FILE_1_REF, new TextBlock(1, 5), new TextBlock(6, 10)); TestComputationStepContext context = new TestComputationStepContext(); @@ -117,7 +117,7 @@ public class PersistDuplicationDataStepIT extends BaseStepTest { } @Test - public void compute_duplications_on_different_files() { + void compute_duplications_on_different_files() { duplicationRepository.addDuplication(FILE_1_REF, new TextBlock(1, 5), FILE_2_REF, new TextBlock(6, 10)); TestComputationStepContext context = new TestComputationStepContext(); @@ -131,7 +131,7 @@ public class PersistDuplicationDataStepIT extends BaseStepTest { } @Test - public void compute_duplications_on_unchanged_file() { + void compute_duplications_on_unchanged_file() { duplicationRepository.addExtendedProjectDuplication(FILE_1_REF, new TextBlock(1, 5), FILE_2_REF, new TextBlock(6, 10)); TestComputationStepContext context = new TestComputationStepContext(); @@ -145,7 +145,7 @@ public class PersistDuplicationDataStepIT extends BaseStepTest { } @Test - public void compute_duplications_on_different_projects() { + void compute_duplications_on_different_projects() { String fileKeyFromOtherProject = "PROJECT2_KEY:file2"; duplicationRepository.addCrossProjectDuplication(FILE_1_REF, new TextBlock(1, 5), fileKeyFromOtherProject, new TextBlock(6, 10)); TestComputationStepContext context = new TestComputationStepContext(); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/batch/BatchReportReaderRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/batch/BatchReportReaderRule.java index 96c67b61b5e..c6075de139a 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/batch/BatchReportReaderRule.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/batch/BatchReportReaderRule.java @@ -32,6 +32,8 @@ import java.util.Objects; import java.util.Optional; import javax.annotation.CheckForNull; import javax.annotation.Nullable; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; @@ -39,7 +41,7 @@ import org.sonar.core.util.CloseableIterator; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReport.LineSgnificantCode; -public class BatchReportReaderRule implements TestRule, BatchReportReader { +public class BatchReportReaderRule implements TestRule, BatchReportReader, AfterEachCallback { private ScannerReport.Metadata metadata; private List scannerLogs; private List activeRules = new ArrayList<>(); @@ -320,4 +322,8 @@ public class BatchReportReaderRule implements TestRule, BatchReportReader { return this; } + @Override + public void afterEach(ExtensionContext context) { + clear(); + } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ComponentTreeBuilderTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ComponentTreeBuilderTest.java index 5421ff9e918..813832cd13d 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ComponentTreeBuilderTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ComponentTreeBuilderTest.java @@ -29,9 +29,10 @@ import java.util.Optional; import java.util.Random; import java.util.function.Function; import java.util.function.UnaryOperator; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExternalResource; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.RegisterExtension; import org.sonar.ce.task.projectanalysis.analysis.Branch; import org.sonar.core.component.ComponentKeys; import org.sonar.scanner.protocol.output.ScannerReport; @@ -51,7 +52,7 @@ import static org.sonar.scanner.protocol.output.ScannerReport.Component.Componen import static org.sonar.scanner.protocol.output.ScannerReport.Component.ComponentType.UNRECOGNIZED; import static org.sonar.scanner.protocol.output.ScannerReport.Component.newBuilder; -public class ComponentTreeBuilderTest { +class ComponentTreeBuilderTest { private static final ComponentKeyGenerator KEY_GENERATOR = (projectKey, path) -> "generated_" + ComponentKeys.createEffectiveKey(projectKey, path); private static final UnaryOperator UUID_SUPPLIER = (componentKey) -> componentKey + "_uuid"; @@ -61,13 +62,13 @@ public class ComponentTreeBuilderTest { private static final ProjectAttributes SOME_PROJECT_ATTRIBUTES = new ProjectAttributes( randomAlphabetic(20), new Random().nextBoolean() ? null : randomAlphabetic(12), "1def5123"); - @Rule - public ScannerComponentProvider scannerComponentProvider = new ScannerComponentProvider(); + @RegisterExtension + private final ScannerComponentProvider scannerComponentProvider = new ScannerComponentProvider(); - private Project projectInDb = Project.from(newPrivateProjectDto(UUID_SUPPLIER.apply("K1")).setKey("K1").setDescription(null)); + private final Project projectInDb = Project.from(newPrivateProjectDto(UUID_SUPPLIER.apply("K1")).setKey("K1").setDescription(null)); @Test - public void build_throws_IAE_for_all_types_except_PROJECT_and_FILE() { + void build_throws_IAE_for_all_types_except_PROJECT_and_FILE() { Arrays.stream(ScannerReport.Component.ComponentType.values()) .filter((type) -> type != UNRECOGNIZED) .filter((type) -> !REPORT_TYPES.contains(type)) @@ -96,7 +97,7 @@ public class ComponentTreeBuilderTest { } @Test - public void build_throws_IAE_if_root_is_not_PROJECT() { + void build_throws_IAE_if_root_is_not_PROJECT() { Arrays.stream(ScannerReport.Component.ComponentType.values()) .filter((type) -> type != UNRECOGNIZED) .filter((type) -> !REPORT_TYPES.contains(type)) @@ -113,7 +114,7 @@ public class ComponentTreeBuilderTest { } @Test - public void by_default_project_fields_are_loaded_from_report() { + void by_default_project_fields_are_loaded_from_report() { String nameInReport = "the name"; String descriptionInReport = "the desc"; String buildString = randomAlphabetic(21); @@ -138,7 +139,7 @@ public class ComponentTreeBuilderTest { } @Test - public void project_name_is_loaded_from_db_if_absent_from_report() { + void project_name_is_loaded_from_db_if_absent_from_report() { Component root = call(newBuilder() .setType(PROJECT) .build(), NO_SCM_BASE_PATH, SOME_PROJECT_ATTRIBUTES); @@ -147,7 +148,7 @@ public class ComponentTreeBuilderTest { } @Test - public void project_name_is_loaded_from_report_if_present_and_on_main_branch() { + void project_name_is_loaded_from_report_if_present_and_on_main_branch() { String reportName = randomAlphabetic(5); ScannerReport.Component reportProject = newBuilder() .setType(PROJECT) @@ -160,7 +161,7 @@ public class ComponentTreeBuilderTest { } @Test - public void project_name_is_loaded_from_db_if_not_on_main_branch() { + void project_name_is_loaded_from_db_if_not_on_main_branch() { String reportName = randomAlphabetic(5); ScannerReport.Component reportProject = newBuilder() .setType(PROJECT) @@ -174,7 +175,7 @@ public class ComponentTreeBuilderTest { } @Test - public void project_description_is_loaded_from_db_if_absent_from_report() { + void project_description_is_loaded_from_db_if_absent_from_report() { Component root = call(newBuilder() .setType(PROJECT) .build(), NO_SCM_BASE_PATH, SOME_PROJECT_ATTRIBUTES); @@ -183,7 +184,7 @@ public class ComponentTreeBuilderTest { } @Test - public void project_description_is_loaded_from_report_if_present_and_on_main_branch() { + void project_description_is_loaded_from_report_if_present_and_on_main_branch() { String reportDescription = randomAlphabetic(5); ScannerReport.Component reportProject = newBuilder() .setType(PROJECT) @@ -196,7 +197,7 @@ public class ComponentTreeBuilderTest { } @Test - public void project_description_is_loaded_from_db_if_not_on_main_branch() { + void project_description_is_loaded_from_db_if_not_on_main_branch() { String reportDescription = randomAlphabetic(5); ScannerReport.Component reportProject = newBuilder() .setType(PROJECT) @@ -209,7 +210,7 @@ public class ComponentTreeBuilderTest { } @Test - public void project_scmPath_is_empty_if_scmBasePath_is_empty() { + void project_scmPath_is_empty_if_scmBasePath_is_empty() { Component root = call(newBuilder() .setType(PROJECT) .build(), NO_SCM_BASE_PATH, SOME_PROJECT_ATTRIBUTES); @@ -218,7 +219,7 @@ public class ComponentTreeBuilderTest { } @Test - public void projectAttributes_is_constructor_argument() { + void projectAttributes_is_constructor_argument() { Component root = call(newBuilder() .setType(PROJECT) .build(), NO_SCM_BASE_PATH, SOME_PROJECT_ATTRIBUTES); @@ -227,7 +228,7 @@ public class ComponentTreeBuilderTest { } @Test - public void any_component_with_projectRelativePath_has_this_value_as_scmPath_if_scmBasePath_is_empty() { + void any_component_with_projectRelativePath_has_this_value_as_scmPath_if_scmBasePath_is_empty() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setKey(projectInDb.getKey()) @@ -254,7 +255,7 @@ public class ComponentTreeBuilderTest { } @Test - public void any_component_with_projectRelativePath_has_this_value_appended_to_scmBasePath_and_a_slash_as_scmPath_if_scmBasePath_is_not_empty() { + void any_component_with_projectRelativePath_has_this_value_appended_to_scmBasePath_and_a_slash_as_scmPath_if_scmBasePath_is_not_empty() { ScannerReport.Component project = createProject(); String scmBasePath = randomAlphabetic(10); @@ -285,7 +286,7 @@ public class ComponentTreeBuilderTest { } @Test - public void keys_of_directory_and_file_are_generated() { + void keys_of_directory_and_file_are_generated() { ScannerReport.Component project = createProject(); Component root = call(project); @@ -302,7 +303,7 @@ public class ComponentTreeBuilderTest { } @Test - public void modules_are_not_created() { + void modules_are_not_created() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setKey(projectInDb.getKey()) @@ -322,7 +323,7 @@ public class ComponentTreeBuilderTest { } @Test - public void folder_hierarchy_is_created() { + void folder_hierarchy_is_created() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setKey(projectInDb.getKey()) @@ -371,7 +372,7 @@ public class ComponentTreeBuilderTest { } @Test - public void collapse_directories_from_root() { + void collapse_directories_from_root() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setKey(projectInDb.getKey()) @@ -399,7 +400,7 @@ public class ComponentTreeBuilderTest { } @Test - public void directories_are_collapsed() { + void directories_are_collapsed() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setKey(projectInDb.getKey()) @@ -426,7 +427,7 @@ public class ComponentTreeBuilderTest { } @Test - public void names_of_directory_and_file_are_based_on_the_path() { + void names_of_directory_and_file_are_based_on_the_path() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setKey(projectInDb.getKey()) @@ -452,7 +453,7 @@ public class ComponentTreeBuilderTest { } @Test - public void create_full_hierarchy_of_directories() { + void create_full_hierarchy_of_directories() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setKey(projectInDb.getKey()) @@ -506,7 +507,7 @@ public class ComponentTreeBuilderTest { } @Test - public void keys_of_directory_and_files_includes_always_root_project() { + void keys_of_directory_and_files_includes_always_root_project() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setKey("project 1") @@ -520,7 +521,7 @@ public class ComponentTreeBuilderTest { } @Test - public void uuids_are_provided_by_supplier() { + void uuids_are_provided_by_supplier() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setKey("c1") @@ -544,7 +545,7 @@ public class ComponentTreeBuilderTest { } @Test - public void files_have_markedAsUnchanged_flag() { + void files_have_markedAsUnchanged_flag() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setKey("c1") @@ -569,7 +570,7 @@ public class ComponentTreeBuilderTest { } @Test - public void issues_are_relocated_from_directories_and_modules_to_root() { + void issues_are_relocated_from_directories_and_modules_to_root() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setKey("c1") @@ -587,7 +588,7 @@ public class ComponentTreeBuilderTest { } @Test - public void descriptions_of_module_directory_and_file_are_null_if_absent_from_report() { + void descriptions_of_module_directory_and_file_are_null_if_absent_from_report() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setRef(1) @@ -609,7 +610,7 @@ public class ComponentTreeBuilderTest { } @Test - public void descriptions_of_module_directory_and_file_are_null_if_empty_in_report() { + void descriptions_of_module_directory_and_file_are_null_if_empty_in_report() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setRef(1) @@ -633,7 +634,7 @@ public class ComponentTreeBuilderTest { } @Test - public void descriptions_of_module_directory_and_file_are_set_from_report_if_present() { + void descriptions_of_module_directory_and_file_are_set_from_report_if_present() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setRef(1) @@ -655,7 +656,7 @@ public class ComponentTreeBuilderTest { } @Test - public void only_nb_of_lines_is_mandatory_on_file_attributes() { + void only_nb_of_lines_is_mandatory_on_file_attributes() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setRef(1) @@ -676,7 +677,7 @@ public class ComponentTreeBuilderTest { } @Test - public void language_file_attributes_is_null_if_empty_in_report() { + void language_file_attributes_is_null_if_empty_in_report() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setRef(1) @@ -697,7 +698,7 @@ public class ComponentTreeBuilderTest { } @Test - public void file_attributes_are_fully_loaded_from_report() { + void file_attributes_are_fully_loaded_from_report() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setRef(1) @@ -720,7 +721,7 @@ public class ComponentTreeBuilderTest { } @Test - public void throw_IAE_if_lines_is_absent_from_report() { + void throw_IAE_if_lines_is_absent_from_report() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setRef(1) @@ -737,7 +738,7 @@ public class ComponentTreeBuilderTest { } @Test - public void throw_IAE_if_lines_is_zero_in_report() { + void throw_IAE_if_lines_is_zero_in_report() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setRef(1) @@ -755,7 +756,7 @@ public class ComponentTreeBuilderTest { } @Test - public void throw_IAE_if_lines_is_negative_in_report() { + void throw_IAE_if_lines_is_negative_in_report() { ScannerReport.Component project = newBuilder() .setType(PROJECT) .setRef(1) @@ -772,14 +773,9 @@ public class ComponentTreeBuilderTest { .hasMessage("File 'src/js/Foo.js' has no line"); } - private static class ScannerComponentProvider extends ExternalResource implements Function { + private static class ScannerComponentProvider implements Function, BeforeEachCallback { private final Map components = new HashMap<>(); - @Override - protected void before() { - clear(); - } - public void clear() { components.clear(); } @@ -795,6 +791,11 @@ public class ComponentTreeBuilderTest { checkArgument(existing == null, "Component %s already set for ref %s", existing, component.getRef()); return component; } + + @Override + public void beforeEach(ExtensionContext extensionContext) { + clear(); + } } private Component call(ScannerReport.Component project) { diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/duplication/DuplicationRepositoryRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/duplication/DuplicationRepositoryRule.java index fbed650c224..7abcd370672 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/duplication/DuplicationRepositoryRule.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/duplication/DuplicationRepositoryRule.java @@ -25,6 +25,9 @@ import java.util.Arrays; import java.util.Collections; import java.util.stream.Collectors; import javax.annotation.CheckForNull; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.component.ComponentProvider; @@ -35,7 +38,7 @@ import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule; import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; -public class DuplicationRepositoryRule extends ExternalResource implements DuplicationRepository { +public class DuplicationRepositoryRule extends ExternalResource implements DuplicationRepository, BeforeEachCallback, AfterEachCallback { @CheckForNull private final ComponentProvider componentProvider; private DuplicationRepositoryImpl delegate; @@ -59,11 +62,21 @@ public class DuplicationRepositoryRule extends ExternalResource implements Dupli return new DuplicationRepositoryRule(); } + @Override + public void beforeEach(ExtensionContext extensionContext) { + before(); + } + @Override protected void before() { this.delegate = new DuplicationRepositoryImpl(); } + @Override + public void afterEach(ExtensionContext extensionContext) { + after(); + } + @Override protected void after() { if (this.componentProvider != null) { diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/filemove/MutableMovedFilesRepositoryRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/filemove/MutableMovedFilesRepositoryRule.java index ff54e656c31..f6a745f623e 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/filemove/MutableMovedFilesRepositoryRule.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/filemove/MutableMovedFilesRepositoryRule.java @@ -23,14 +23,27 @@ import java.util.HashSet; import java.util.Optional; import java.util.Set; import javax.annotation.CheckForNull; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.ce.task.projectanalysis.component.Component; -public class MutableMovedFilesRepositoryRule extends ExternalResource implements MutableMovedFilesRepository { +public class MutableMovedFilesRepositoryRule extends ExternalResource + implements MutableMovedFilesRepository, BeforeEachCallback, AfterEachCallback { @CheckForNull private MutableMovedFilesRepository delegate; private final Set componentsWithOriginal = new HashSet<>(); + @Override + public void afterEach(ExtensionContext extensionContext) { + after(); + } + + @Override + public void beforeEach(ExtensionContext extensionContext) { + before(); + } @Override protected void before() { this.delegate = new MutableMovedFilesRepositoryImpl(); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/formula/coverage/CoverageUtilsTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/formula/coverage/CoverageUtilsTest.java index 7102575159c..22c73ecac79 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/formula/coverage/CoverageUtilsTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/formula/coverage/CoverageUtilsTest.java @@ -22,9 +22,10 @@ package org.sonar.ce.task.projectanalysis.formula.coverage; import java.util.HashMap; import java.util.Map; import java.util.Optional; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExternalResource; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.RegisterExtension; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.formula.CounterInitializationContext; import org.sonar.ce.task.projectanalysis.measure.Measure; @@ -36,47 +37,46 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.sonar.ce.task.projectanalysis.formula.coverage.CoverageUtils.getLongMeasureValue; import static org.sonar.ce.task.projectanalysis.measure.Measure.newMeasureBuilder; -public class CoverageUtilsTest { +class CoverageUtilsTest { private static final String SOME_METRIC_KEY = "some key"; - public static final double DEFAULT_VARIATION = 0d; - @Rule - public CounterInitializationContextRule fileAggregateContext = new CounterInitializationContextRule(); + @RegisterExtension + private final CounterInitializationContextRule fileAggregateContext = new CounterInitializationContextRule(); @Test - public void verify_calculate_coverage() { + void verify_calculate_coverage() { assertThat(CoverageUtils.calculateCoverage(5, 10)).isEqualTo(50d); } @Test - public void getLongMeasureValue_returns_0_if_measure_does_not_exist() { + void getLongMeasureValue_returns_0_if_measure_does_not_exist() { assertThat(getLongMeasureValue(fileAggregateContext, SOME_METRIC_KEY)).isZero(); } @Test - public void getLongMeasureValue_returns_0_if_measure_is_NO_VALUE() { + void getLongMeasureValue_returns_0_if_measure_is_NO_VALUE() { fileAggregateContext.put(SOME_METRIC_KEY, newMeasureBuilder().createNoValue()); assertThat(getLongMeasureValue(fileAggregateContext, SOME_METRIC_KEY)).isZero(); } @Test - public void getLongMeasureValue_returns_value_if_measure_is_INT() { + void getLongMeasureValue_returns_value_if_measure_is_INT() { fileAggregateContext.put(SOME_METRIC_KEY, newMeasureBuilder().create(152)); assertThat(getLongMeasureValue(fileAggregateContext, SOME_METRIC_KEY)).isEqualTo(152L); } @Test - public void getLongMeasureValue_returns_value_if_measure_is_LONG() { + void getLongMeasureValue_returns_value_if_measure_is_LONG() { fileAggregateContext.put(SOME_METRIC_KEY, newMeasureBuilder().create(152L)); assertThat(getLongMeasureValue(fileAggregateContext, SOME_METRIC_KEY)).isEqualTo(152L); } @Test - public void getLongMeasureValue_throws_ISE_if_measure_is_DOUBLE() { + void getLongMeasureValue_throws_ISE_if_measure_is_DOUBLE() { assertThatThrownBy(() -> { fileAggregateContext.put(SOME_METRIC_KEY, newMeasureBuilder().create(152d, 1)); getLongMeasureValue(fileAggregateContext, SOME_METRIC_KEY); @@ -85,7 +85,7 @@ public class CoverageUtilsTest { .hasMessage("value can not be converted to long because current value type is a DOUBLE"); } - private static class CounterInitializationContextRule extends ExternalResource implements CounterInitializationContext { + private static class CounterInitializationContextRule implements CounterInitializationContext, AfterEachCallback { private final Map measures = new HashMap<>(); public CounterInitializationContextRule put(String metricKey, Measure measure) { @@ -96,11 +96,6 @@ public class CoverageUtilsTest { return this; } - @Override - protected void after() { - measures.clear(); - } - @Override public Component getLeaf() { throw new UnsupportedOperationException("getFile is not supported"); @@ -111,5 +106,9 @@ public class CoverageUtilsTest { return Optional.ofNullable(measures.get(metricKey)); } + @Override + public void afterEach(ExtensionContext extensionContext) throws Exception { + measures.clear(); + } } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/FillComponentIssuesVisitorRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/FillComponentIssuesVisitorRule.java index caadea348de..c5855e845ad 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/FillComponentIssuesVisitorRule.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/FillComponentIssuesVisitorRule.java @@ -21,6 +21,8 @@ package org.sonar.ce.task.projectanalysis.issue; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; @@ -37,7 +39,7 @@ import static org.sonar.ce.task.projectanalysis.component.ComponentVisitor.Order /** * This rule can be used when testing a visitor that depends on {@link ComponentIssuesRepository}. */ -public class FillComponentIssuesVisitorRule extends TypeAwareVisitorAdapter implements TestRule { +public class FillComponentIssuesVisitorRule extends TypeAwareVisitorAdapter implements TestRule, AfterEachCallback { private MutableComponentIssuesRepository issuesRepository = new ComponentIssuesRepositoryImpl(); private final TreeRootHolder treeRootHolder; @@ -76,4 +78,8 @@ public class FillComponentIssuesVisitorRule extends TypeAwareVisitorAdapter impl issuesRepository.setIssues(component, issues.get(component)); } + @Override + public void afterEach(ExtensionContext extensionContext) throws Exception { + issues = ArrayListMultimap.create(); + } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueAssignerTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueAssignerTest.java index ba4c77f2831..7cb7fc6bd13 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueAssignerTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueAssignerTest.java @@ -21,11 +21,11 @@ package org.sonar.ce.task.projectanalysis.issue; import java.util.Arrays; import javax.annotation.Nullable; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.slf4j.event.Level; -import org.sonar.api.testfixtures.log.LogTester; +import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderRule; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.scm.Changeset; @@ -43,31 +43,31 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.sonar.ce.task.projectanalysis.component.ReportComponent.builder; -public class IssueAssignerTest { +class IssueAssignerTest { private static final int FILE_REF = 1; private static final Component FILE = builder(Component.Type.FILE, FILE_REF).setKey("FILE_KEY").setUuid("FILE_UUID").build(); - @Rule - public LogTester logTester = new LogTester(); + @RegisterExtension + private final LogTesterJUnit5 logTester = new LogTesterJUnit5(); - @Rule - public ScmInfoRepositoryRule scmInfoRepository = new ScmInfoRepositoryRule(); + @RegisterExtension + private final ScmInfoRepositoryRule scmInfoRepository = new ScmInfoRepositoryRule(); - @Rule - public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule().setAnalysisDate(123456789L); + @RegisterExtension + private final AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule().setAnalysisDate(123456789L); private final ScmAccountToUser scmAccountToUser = mock(ScmAccountToUser.class); private final DefaultAssignee defaultAssignee = mock(DefaultAssignee.class); private final IssueAssigner underTest = new IssueAssigner(analysisMetadataHolder, scmInfoRepository, scmAccountToUser, defaultAssignee, new IssueFieldsSetter()); - @Before - public void before() { + @BeforeEach + void before() { logTester.setLevel(Level.DEBUG); } @Test - public void do_not_set_author_if_no_changeset() { + void do_not_set_author_if_no_changeset() { DefaultIssue issue = newIssueOnLines(1); underTest.onIssue(FILE, issue); @@ -76,7 +76,7 @@ public class IssueAssignerTest { } @Test - public void set_author_of_new_issue_if_changeset() { + void set_author_of_new_issue_if_changeset() { setSingleChangeset("john", 123456789L, "rev-1"); DefaultIssue issue = newIssueOnLines(1); @@ -86,7 +86,7 @@ public class IssueAssignerTest { } @Test - public void do_not_reset_author_if_already_set() { + void do_not_reset_author_if_already_set() { setSingleChangeset("john", 123456789L, "rev-1"); DefaultIssue issue = newIssueOnLines(1) .setAuthorLogin("jane"); @@ -97,7 +97,7 @@ public class IssueAssignerTest { } @Test - public void assign_but_do_not_set_author_if_too_long() { + void assign_but_do_not_set_author_if_too_long() { String scmAuthor = range(0, 256).mapToObj(i -> "s").collect(joining()); addScmUser(scmAuthor, buildUserId("u123", "John C")); setSingleChangeset(scmAuthor, 123456789L, "rev-1"); @@ -113,7 +113,7 @@ public class IssueAssignerTest { } @Test - public void assign_new_issue_to_author_of_change() { + void assign_new_issue_to_author_of_change() { addScmUser("john", buildUserId("u123", "john")); setSingleChangeset("john", 123456789L, "rev-1"); DefaultIssue issue = newIssueOnLines(1); @@ -125,7 +125,7 @@ public class IssueAssignerTest { } @Test - public void assign_new_issue_to_default_assignee_if_author_not_found() { + void assign_new_issue_to_default_assignee_if_author_not_found() { setSingleChangeset("john", 123456789L, "rev-1"); when(defaultAssignee.loadDefaultAssigneeUserId()).thenReturn(new UserIdDto("u1234", "john")); DefaultIssue issue = newIssueOnLines(1); @@ -137,7 +137,7 @@ public class IssueAssignerTest { } @Test - public void do_not_assign_new_issue_if_no_author_in_changeset() { + void do_not_assign_new_issue_if_no_author_in_changeset() { setSingleChangeset(null, 123456789L, "rev-1"); DefaultIssue issue = newIssueOnLines(1); @@ -148,7 +148,7 @@ public class IssueAssignerTest { } @Test - public void do_not_assign_issue_if_unassigned_but_already_authored() { + void do_not_assign_issue_if_unassigned_but_already_authored() { addScmUser("john", buildUserId("u1234", "john")); setSingleChangeset("john", 123456789L, "rev-1"); DefaultIssue issue = newIssueOnLines(1) @@ -162,7 +162,7 @@ public class IssueAssignerTest { } @Test - public void assign_to_last_committer_of_file_if_issue_is_global_to_file() { + void assign_to_last_committer_of_file_if_issue_is_global_to_file() { addScmUser("henry", buildUserId("u123", "Henry V")); Changeset changeset1 = Changeset.newChangesetBuilder() .setAuthor("john") @@ -186,7 +186,7 @@ public class IssueAssignerTest { } @Test - public void assign_to_default_assignee_if_no_author() { + void assign_to_default_assignee_if_no_author() { DefaultIssue issue = newIssueOnLines(); when(defaultAssignee.loadDefaultAssigneeUserId()).thenReturn(new UserIdDto("u123", "john")); @@ -197,7 +197,7 @@ public class IssueAssignerTest { } @Test - public void assign_to_default_assignee_if_no_scm_on_issue_locations() { + void assign_to_default_assignee_if_no_scm_on_issue_locations() { addScmUser("john", buildUserId("u123", "John C")); Changeset changeset = Changeset.newChangesetBuilder() .setAuthor("john") @@ -214,7 +214,7 @@ public class IssueAssignerTest { } @Test - public void assign_to_author_of_the_most_recent_change_in_all_issue_locations() { + void assign_to_author_of_the_most_recent_change_in_all_issue_locations() { addScmUser("john", buildUserId("u1", "John")); addScmUser("jane", buildUserId("u2", "Jane")); Changeset commit1 = Changeset.newChangesetBuilder() diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssuesRepositoryVisitorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssuesRepositoryVisitorTest.java index 49d5b8850d2..028598c08b9 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssuesRepositoryVisitorTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssuesRepositoryVisitorTest.java @@ -19,9 +19,9 @@ */ package org.sonar.ce.task.projectanalysis.issue; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule; import org.sonar.core.issue.DefaultIssue; @@ -30,39 +30,38 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.sonar.ce.task.projectanalysis.component.ReportComponent.builder; -public class IssuesRepositoryVisitorTest { - static final String FILE_UUID = "FILE_UUID"; - static final String FILE_KEY = "FILE_KEY"; - static final int FILE_REF = 2; - static final Component FILE = builder(Component.Type.FILE, FILE_REF) +class IssuesRepositoryVisitorTest { + private static final String FILE_UUID = "FILE_UUID"; + private static final String FILE_KEY = "FILE_KEY"; + private static final int FILE_REF = 2; + private static final Component FILE = builder(Component.Type.FILE, FILE_REF) .setKey(FILE_KEY) .setUuid(FILE_UUID) .build(); - static final String PROJECT_KEY = "PROJECT_KEY"; - static final String PROJECT_UUID = "PROJECT_UUID"; - static final int PROJECT_REF = 1; - static final Component PROJECT = builder(Component.Type.PROJECT, PROJECT_REF) + private static final String PROJECT_KEY = "PROJECT_KEY"; + private static final String PROJECT_UUID = "PROJECT_UUID"; + private static final int PROJECT_REF = 1; + private static final Component PROJECT = builder(Component.Type.PROJECT, PROJECT_REF) .setKey(PROJECT_KEY) .setUuid(PROJECT_UUID) .addChildren(FILE) .build(); - @Rule - public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); + @RegisterExtension + private final TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); - @Rule - public ComponentIssuesRepositoryRule componentIssuesRepository = new ComponentIssuesRepositoryRule(treeRootHolder); + private final ComponentIssuesRepositoryRule componentIssuesRepository = new ComponentIssuesRepositoryRule(treeRootHolder); - IssuesRepositoryVisitor underTest = new IssuesRepositoryVisitor(componentIssuesRepository); + private final IssuesRepositoryVisitor underTest = new IssuesRepositoryVisitor(componentIssuesRepository); - @Before - public void setUp() { + @BeforeEach + void setUp() { treeRootHolder.setRoot(PROJECT); } @Test - public void feed_component_issues_repo() { + void feed_component_issues_repo() { DefaultIssue i1 = mock(DefaultIssue.class); DefaultIssue i2 = mock(DefaultIssue.class); @@ -75,7 +74,7 @@ public class IssuesRepositoryVisitorTest { } @Test - public void empty_component_issues_repo_when_no_issue() { + void empty_component_issues_repo_when_no_issue() { DefaultIssue i1 = mock(DefaultIssue.class); DefaultIssue i2 = mock(DefaultIssue.class); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryRule.java index 8ae677f7be3..ee595251d49 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryRule.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryRule.java @@ -23,6 +23,8 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.function.Supplier; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.api.rule.RuleKey; import org.sonar.db.DbSession; @@ -30,7 +32,7 @@ import org.sonar.db.DbSession; import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; -public class RuleRepositoryRule extends ExternalResource implements RuleRepository { +public class RuleRepositoryRule extends ExternalResource implements RuleRepository, AfterEachCallback { private final Map rulesByKey = new HashMap<>(); private final Map rulesByUuid = new HashMap<>(); @@ -90,4 +92,8 @@ public class RuleRepositoryRule extends ExternalResource implements RuleReposito newExternalRulesById.computeIfAbsent(ruleKey, k -> ruleSupplier.get()); } + @Override + public void afterEach(ExtensionContext context) { + after(); + } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactoryTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactoryTest.java index 8f91b8578f0..dbd6a1cf073 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactoryTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactoryTest.java @@ -20,20 +20,20 @@ package org.sonar.ce.task.projectanalysis.issue; import com.google.common.collect.Iterators; -import com.tngtech.java.junit.dataprovider.DataProvider; -import com.tngtech.java.junit.dataprovider.DataProviderRunner; -import com.tngtech.java.junit.dataprovider.UseDataProvider; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.Optional; import java.util.function.Consumer; +import java.util.stream.Stream; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.Severity; import org.sonar.api.rules.RuleType; @@ -70,8 +70,7 @@ import static org.sonar.api.issue.impact.SoftwareQuality.MAINTAINABILITY; import static org.sonar.api.issue.impact.SoftwareQuality.SECURITY; import static org.sonar.scanner.protocol.output.ScannerReport.MessageFormattingType.CODE; -@RunWith(DataProviderRunner.class) -public class TrackerRawInputFactoryTest { +class TrackerRawInputFactoryTest { private static final String FILE_UUID = "fake_uuid"; private static final String ANOTHER_FILE_UUID = "another_fake_uuid"; @@ -82,14 +81,14 @@ public class TrackerRawInputFactoryTest { private static final int ANOTHER_FILE_REF = 4; private static final String TEST_CONTEXT_KEY = "test_context_key"; - @Rule - public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule().setRoot(PROJECT); - @Rule - public BatchReportReaderRule reportReader = new BatchReportReaderRule(); - @Rule - public ActiveRulesHolderRule activeRulesHolder = new ActiveRulesHolderRule(); - @Rule - public RuleRepositoryRule ruleRepository = new RuleRepositoryRule(); + @RegisterExtension + private final TreeRootHolderRule treeRootHolder = new TreeRootHolderRule().setRoot(PROJECT); + @RegisterExtension + private final BatchReportReaderRule reportReader = new BatchReportReaderRule(); + @RegisterExtension + private final ActiveRulesHolderRule activeRulesHolder = new ActiveRulesHolderRule(); + @RegisterExtension + private final RuleRepositoryRule ruleRepository = new RuleRepositoryRule(); private static final ReportComponent FILE = ReportComponent.builder(Component.Type.FILE, FILE_REF).setUuid(FILE_UUID).build(); private static final ReportComponent ANOTHER_FILE = ReportComponent.builder(Component.Type.FILE, ANOTHER_FILE_REF).setUuid(ANOTHER_FILE_UUID).build(); @@ -100,14 +99,14 @@ public class TrackerRawInputFactoryTest { private final TrackerRawInputFactory underTest = new TrackerRawInputFactory(treeRootHolder, reportReader, sourceLinesHash, issueFilter, ruleRepository, activeRulesHolder); - @Before - public void before() { + @BeforeEach + void before() { when(sourceLinesHash.getLineHashesMatchingDBVersion(FILE)).thenReturn(Collections.singletonList("line")); when(issueFilter.accept(any(), eq(FILE))).thenReturn(true); } @Test - public void load_source_hash_sequences() { + void load_source_hash_sequences() { Input input = underTest.create(FILE); assertThat(input.getLineHashSequence()).isNotNull(); @@ -119,7 +118,7 @@ public class TrackerRawInputFactoryTest { } @Test - public void load_source_hash_sequences_only_on_files() { + void load_source_hash_sequences_only_on_files() { Input input = underTest.create(PROJECT); assertThat(input.getLineHashSequence()).isNotNull(); @@ -127,7 +126,7 @@ public class TrackerRawInputFactoryTest { } @Test - public void load_issues_from_report() { + void load_issues_from_report() { RuleKey ruleKey = RuleKey.of("java", "S001"); markRuleAsActive(ruleKey); registerRule(ruleKey, "name", r -> r.addDefaultImpact(MAINTAINABILITY, LOW)); @@ -177,7 +176,7 @@ public class TrackerRawInputFactoryTest { } @Test - public void load_issues_from_report_with_locations() { + void load_issues_from_report_with_locations() { RuleKey ruleKey = RuleKey.of("java", "S001"); markRuleAsActive(ruleKey); registerRule(ruleKey, "name"); @@ -223,7 +222,7 @@ public class TrackerRawInputFactoryTest { } @Test - public void load_issues_from_report_with_rule_description_context_key() { + void load_issues_from_report_with_rule_description_context_key() { RuleKey ruleKey = RuleKey.of("java", "S001"); markRuleAsActive(ruleKey); registerRule(ruleKey, "name"); @@ -246,7 +245,7 @@ public class TrackerRawInputFactoryTest { } @Test - public void create_whenImpactIsNotDefinedAtRuleLevel_shouldDiscardImpacts() { + void create_whenImpactIsNotDefinedAtRuleLevel_shouldDiscardImpacts() { RuleKey ruleKey = RuleKey.of("java", "S001"); markRuleAsActive(ruleKey); registerRule(ruleKey, "name", r -> r.addDefaultImpact(MAINTAINABILITY, LOW)); @@ -269,7 +268,7 @@ public class TrackerRawInputFactoryTest { } @Test - public void set_rule_name_as_message_when_issue_message_from_report_is_empty() { + void set_rule_name_as_message_when_issue_message_from_report_is_empty() { RuleKey ruleKey = RuleKey.of("java", "S001"); markRuleAsActive(ruleKey); registerRule(ruleKey, "Rule 1"); @@ -295,7 +294,7 @@ public class TrackerRawInputFactoryTest { // SONAR-10781 @Test - public void load_issues_from_report_missing_secondary_location_component() { + void load_issues_from_report_missing_secondary_location_component() { RuleKey ruleKey = RuleKey.of("java", "S001"); markRuleAsActive(ruleKey); registerRule(ruleKey, "name"); @@ -338,9 +337,9 @@ public class TrackerRawInputFactoryTest { assertThat(locations.getFlow(0).getLocation(1).getComponentId()).isEqualTo(ANOTHER_FILE_UUID); } - @Test - @UseDataProvider("ruleTypeAndStatusByIssueType") - public void load_external_issues_from_report(IssueType issueType, RuleType expectedRuleType, String expectedStatus) { + @ParameterizedTest + @MethodSource("ruleTypeAndStatusByIssueType") + void load_external_issues_from_report(IssueType issueType, RuleType expectedRuleType, String expectedStatus) { registerRule(RuleKey.of("external_eslint", "S001"), "rule", r -> r.addDefaultImpact(MAINTAINABILITY, LOW)); ScannerReport.ExternalIssue reportIssue = ScannerReport.ExternalIssue.newBuilder() .setTextRange(newTextRange(2)) @@ -391,19 +390,18 @@ public class TrackerRawInputFactoryTest { assertThat(issue.impacts()).containsExactlyEntriesOf(Map.of(MAINTAINABILITY, org.sonar.api.issue.impact.Severity.MEDIUM)); } - @DataProvider - public static Object[][] ruleTypeAndStatusByIssueType() { - return new Object[][]{ - {IssueType.CODE_SMELL, RuleType.CODE_SMELL, STATUS_OPEN}, - {IssueType.BUG, RuleType.BUG, STATUS_OPEN}, - {IssueType.VULNERABILITY, RuleType.VULNERABILITY, STATUS_OPEN}, - {IssueType.SECURITY_HOTSPOT, RuleType.SECURITY_HOTSPOT, STATUS_TO_REVIEW} - }; + private static Stream ruleTypeAndStatusByIssueType() { + return Stream.of( + Arguments.of(IssueType.CODE_SMELL, RuleType.CODE_SMELL, STATUS_OPEN), + Arguments.of(IssueType.BUG, RuleType.BUG, STATUS_OPEN), + Arguments.of(IssueType.VULNERABILITY, RuleType.VULNERABILITY, STATUS_OPEN), + Arguments.of(IssueType.SECURITY_HOTSPOT, RuleType.SECURITY_HOTSPOT, STATUS_TO_REVIEW) + ); } - @Test - @UseDataProvider("ruleTypeAndStatusByIssueType") - public void load_external_issues_from_report_with_default_effort(IssueType issueType, RuleType expectedRuleType, String expectedStatus) { + @ParameterizedTest + @MethodSource("ruleTypeAndStatusByIssueType") + void load_external_issues_from_report_with_default_effort(IssueType issueType, RuleType expectedRuleType, String expectedStatus) { registerRule(RuleKey.of("external_eslint", "S001"), "rule"); ScannerReport.ExternalIssue reportIssue = ScannerReport.ExternalIssue.newBuilder() .setTextRange(newTextRange(2)) @@ -435,7 +433,7 @@ public class TrackerRawInputFactoryTest { } @Test - public void create_whenSeverityAndTypeNotProvided_shouldTakeFromTheRule() { + void create_whenSeverityAndTypeNotProvided_shouldTakeFromTheRule() { registerRule(RuleKey.of("external_eslint", "S001"), "rule", r -> { r.setType(RuleType.BUG); r.setSeverity(Severity.MAJOR); @@ -453,7 +451,7 @@ public class TrackerRawInputFactoryTest { } @Test - public void create_whenSeverityAndTypeNotProvidedByIssueAndRule_shouldTakeFromTheRuleImpact() { + void create_whenSeverityAndTypeNotProvidedByIssueAndRule_shouldTakeFromTheRuleImpact() { registerRule(RuleKey.of("external_eslint", "S001"), "rule", r -> r.addDefaultImpact(MAINTAINABILITY, org.sonar.api.issue.impact.Severity.MEDIUM)); ScannerReport.ExternalIssue reportIssue = createIssue(null, null); @@ -487,7 +485,7 @@ public class TrackerRawInputFactoryTest { } @Test - public void excludes_issues_on_inactive_rules() { + void excludes_issues_on_inactive_rules() { RuleKey ruleKey = RuleKey.of("java", "S001"); ScannerReport.Issue reportIssue = ScannerReport.Issue.newBuilder() .setTextRange(newTextRange(2)) @@ -505,7 +503,7 @@ public class TrackerRawInputFactoryTest { } @Test - public void filter_excludes_issues_from_report() { + void filter_excludes_issues_from_report() { RuleKey ruleKey = RuleKey.of("java", "S001"); markRuleAsActive(ruleKey); registerRule(ruleKey, "name"); @@ -526,7 +524,7 @@ public class TrackerRawInputFactoryTest { } @Test - public void exclude_issues_on_common_rules() { + void exclude_issues_on_common_rules() { RuleKey ruleKey = RuleKey.of(CommonRuleKeys.commonRepositoryForLang("java"), "S001"); markRuleAsActive(ruleKey); ScannerReport.Issue reportIssue = ScannerReport.Issue.newBuilder() diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/MeasureComputersHolderRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/MeasureComputersHolderRule.java index c242ad5ea11..378d507675e 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/MeasureComputersHolderRule.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/MeasureComputersHolderRule.java @@ -21,28 +21,23 @@ package org.sonar.ce.task.projectanalysis.measure; import java.util.ArrayList; import java.util.List; -import org.junit.After; -import org.junit.rules.ExternalResource; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.sonar.api.ce.measure.MeasureComputer; import org.sonar.ce.task.projectanalysis.api.measurecomputer.MeasureComputerWrapper; import static java.util.Objects.requireNonNull; -public class MeasureComputersHolderRule extends ExternalResource implements MeasureComputersHolder { +public class MeasureComputersHolderRule implements MeasureComputersHolder, AfterEachCallback { private final MeasureComputer.MeasureComputerDefinitionContext context; - private List measureComputers = new ArrayList<>(); + private final List measureComputers = new ArrayList<>(); public MeasureComputersHolderRule(MeasureComputer.MeasureComputerDefinitionContext context) { this.context = context; } - @After - public void tearDown() { - measureComputers.clear(); - } - @Override public Iterable getMeasureComputers() { return measureComputers; @@ -53,4 +48,9 @@ public class MeasureComputersHolderRule extends ExternalResource implements Meas MeasureComputer.MeasureComputerDefinition definition = measureComputer.define(context); this.measureComputers.add(new MeasureComputerWrapper(measureComputer, definition)); } + + @Override + public void afterEach(ExtensionContext extensionContext) throws Exception { + measureComputers.clear(); + } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/ViewsMeasureComputersVisitorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/ViewsMeasureComputersVisitorTest.java index 0b05b956233..df59ab0a7ea 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/ViewsMeasureComputersVisitorTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/ViewsMeasureComputersVisitorTest.java @@ -20,8 +20,8 @@ package org.sonar.ce.task.projectanalysis.measure; import java.util.Arrays; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.sonar.api.ce.measure.MeasureComputer; import org.sonar.api.testfixtures.measure.TestMeasureComputerDefinitionContext; import org.sonar.ce.task.projectanalysis.api.measurecomputer.MeasureComputerDefinitionImpl; @@ -45,7 +45,7 @@ import static org.sonar.ce.task.projectanalysis.measure.Measure.newMeasureBuilde import static org.sonar.ce.task.projectanalysis.measure.MeasureRepoEntry.entryOf; import static org.sonar.ce.task.projectanalysis.measure.MeasureRepoEntry.toEntries; -public class ViewsMeasureComputersVisitorTest { +class ViewsMeasureComputersVisitorTest { private static final String NEW_METRIC_KEY = "new_metric_key"; private static final String NEW_METRIC_NAME = "new metric name"; @@ -97,25 +97,25 @@ public class ViewsMeasureComputersVisitorTest { } }; - @Rule - public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); + @RegisterExtension + private final TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); - @Rule - public MetricRepositoryRule metricRepository = new MetricRepositoryRule() + @RegisterExtension + private final MetricRepositoryRule metricRepository = new MetricRepositoryRule() .add(NCLOC) .add(COMMENT_LINES) .add(NEW_METRIC); - @Rule - public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(TREE_WITH_SUB_VIEWS, metricRepository); + @RegisterExtension + private final MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(TREE_WITH_SUB_VIEWS, metricRepository); - @Rule - public MeasureComputersHolderRule measureComputersHolder = new MeasureComputersHolderRule(new TestMeasureComputerDefinitionContext()); + @RegisterExtension + private final MeasureComputersHolderRule measureComputersHolder = new MeasureComputersHolderRule(new TestMeasureComputerDefinitionContext()); - ComponentIssuesRepository componentIssuesRepository = mock(ComponentIssuesRepository.class); + private final ComponentIssuesRepository componentIssuesRepository = mock(ComponentIssuesRepository.class); @Test - public void compute_plugin_measure() { + void compute_plugin_measure() { treeRootHolder.setRoot(TREE_WITH_SUB_VIEWS); addRawMeasure(PROJECT_VIEW_1_REF, NCLOC_KEY, 10); @@ -142,7 +142,7 @@ public class ViewsMeasureComputersVisitorTest { } @Test - public void compute_plugin_measure_on_views_tree_having_only_one_view_with_a_project_view() { + void compute_plugin_measure_on_views_tree_having_only_one_view_with_a_project_view() { treeRootHolder.setRoot(TREE_WITH_DIRECT_PROJECT_VIEW); addRawMeasure(PROJECT_VIEW_1_REF, NCLOC_KEY, 10); @@ -163,7 +163,7 @@ public class ViewsMeasureComputersVisitorTest { } @Test - public void nothing_to_compute_when_no_project_view() { + void nothing_to_compute_when_no_project_view() { treeRootHolder.setRoot(builder(VIEW, ROOT_REF) .addChildren( builder(SUBVIEW, VIEW_REF) @@ -186,7 +186,7 @@ public class ViewsMeasureComputersVisitorTest { } @Test - public void nothing_to_compute_when_no_measure_computers() { + void nothing_to_compute_when_no_measure_computers() { treeRootHolder.setRoot(TREE_WITH_SUB_VIEWS); addRawMeasure(PROJECT_VIEW_1_REF, NCLOC_KEY, 10); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/period/PeriodHolderRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/period/PeriodHolderRule.java index c24106ee829..d3d12f29096 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/period/PeriodHolderRule.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/period/PeriodHolderRule.java @@ -20,13 +20,20 @@ package org.sonar.ce.task.projectanalysis.period; import javax.annotation.Nullable; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; -public class PeriodHolderRule implements TestRule, PeriodHolder { +public class PeriodHolderRule implements TestRule, PeriodHolder, AfterEachCallback { private PeriodHolderImpl delegate = new PeriodHolderImpl(); + @Override + public void afterEach(ExtensionContext extensionContext) { + clear(); + } + @Override public Statement apply(final Statement statement, Description description) { return new Statement() { @@ -65,4 +72,5 @@ public class PeriodHolderRule implements TestRule, PeriodHolder { public Period getPeriod() { return delegate.getPeriod(); } + } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitygate/MutableQualityGateHolderRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitygate/MutableQualityGateHolderRule.java index 4146951672c..05c770f1b33 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitygate/MutableQualityGateHolderRule.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitygate/MutableQualityGateHolderRule.java @@ -20,10 +20,12 @@ package org.sonar.ce.task.projectanalysis.qualitygate; import java.util.Optional; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.server.qualitygate.EvaluatedQualityGate; -public class MutableQualityGateHolderRule extends ExternalResource implements MutableQualityGateHolder { +public class MutableQualityGateHolderRule extends ExternalResource implements MutableQualityGateHolder, AfterEachCallback { private MutableQualityGateHolder delegate = new QualityGateHolderImpl(); @Override @@ -54,4 +56,9 @@ public class MutableQualityGateHolderRule extends ExternalResource implements Mu public void reset() { this.delegate = new QualityGateHolderImpl(); } + + @Override + public void afterEach(ExtensionContext extensionContext) throws Exception { + reset(); + } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitygate/MutableQualityGateStatusHolderRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitygate/MutableQualityGateStatusHolderRule.java index 1f47fdfce3b..ecbb55c38eb 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitygate/MutableQualityGateStatusHolderRule.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitygate/MutableQualityGateStatusHolderRule.java @@ -20,9 +20,11 @@ package org.sonar.ce.task.projectanalysis.qualitygate; import java.util.Map; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; -public class MutableQualityGateStatusHolderRule extends ExternalResource implements MutableQualityGateStatusHolder { +public class MutableQualityGateStatusHolderRule extends ExternalResource implements MutableQualityGateStatusHolder, AfterEachCallback { private MutableQualityGateStatusHolder delegate = new QualityGateStatusHolderImpl(); @Override @@ -48,4 +50,9 @@ public class MutableQualityGateStatusHolderRule extends ExternalResource impleme public void reset() { this.delegate = new QualityGateStatusHolderImpl(); } + + @Override + public void afterEach(ExtensionContext extensionContext) throws Exception { + reset(); + } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitygate/QualityGateHolderRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitygate/QualityGateHolderRule.java index e40c4164fb3..32c944bc35e 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitygate/QualityGateHolderRule.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitygate/QualityGateHolderRule.java @@ -21,12 +21,14 @@ package org.sonar.ce.task.projectanalysis.qualitygate; import java.util.Optional; import javax.annotation.Nullable; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.server.qualitygate.EvaluatedQualityGate; import static com.google.common.base.Preconditions.checkState; -public class QualityGateHolderRule extends ExternalResource implements QualityGateHolder { +public class QualityGateHolderRule implements QualityGateHolder, AfterEachCallback { @Nullable private Optional qualityGate; @Nullable @@ -52,13 +54,13 @@ public class QualityGateHolderRule extends ExternalResource implements QualityGa return evaluation; } - @Override - protected void after() { - reset(); - } - public void reset() { this.qualityGate = null; this.evaluation = null; } + + @Override + public void afterEach(ExtensionContext extensionContext) throws Exception { + reset(); + } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitorTest.java index 1c67608f3de..4074bf6b7b6 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitorTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitorTest.java @@ -21,9 +21,9 @@ package org.sonar.ce.task.projectanalysis.qualitymodel; import java.util.Arrays; import java.util.Date; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.sonar.api.rules.RuleType; import org.sonar.api.utils.Duration; import org.sonar.ce.task.projectanalysis.component.Component; @@ -69,21 +69,21 @@ import static org.sonar.server.measure.Rating.C; import static org.sonar.server.measure.Rating.D; import static org.sonar.server.measure.Rating.E; -public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { +class NewReliabilityAndSecurityRatingMeasuresVisitorTest { private static final long LEAK_PERIOD_SNAPSHOT_IN_MILLISEC = 12323L; private static final Date DEFAULT_ISSUE_CREATION_DATE = new Date(1000L); private static final Date AFTER_LEAK_PERIOD_DATE = new Date(LEAK_PERIOD_SNAPSHOT_IN_MILLISEC + 5000L); - static final String LANGUAGE_KEY_1 = "lKey1"; + private static final String LANGUAGE_KEY_1 = "lKey1"; - static final int PROJECT_REF = 1; - static final int ROOT_DIR_REF = 12; - static final int DIRECTORY_REF = 123; - static final int FILE_1_REF = 1231; - static final int FILE_2_REF = 1232; + private static final int PROJECT_REF = 1; + private static final int ROOT_DIR_REF = 12; + private static final int DIRECTORY_REF = 123; + private static final int FILE_1_REF = 1231; + private static final int FILE_2_REF = 1232; - static final Component ROOT_PROJECT = builder(Component.Type.PROJECT, PROJECT_REF).setKey("project") + private static final Component ROOT_PROJECT = builder(Component.Type.PROJECT, PROJECT_REF).setKey("project") .addChildren( builder(DIRECTORY, ROOT_DIR_REF).setKey("dir") .addChildren( @@ -95,33 +95,34 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { .build()) .build(); - @Rule - public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); + @RegisterExtension + private final TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); - @Rule - public MetricRepositoryRule metricRepository = new MetricRepositoryRule() + @RegisterExtension + private final MetricRepositoryRule metricRepository = new MetricRepositoryRule() .add(NEW_SECURITY_RATING) .add(NEW_RELIABILITY_RATING); - @Rule - public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(treeRootHolder, metricRepository); + @RegisterExtension + private final MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(treeRootHolder, metricRepository); - @Rule - public ComponentIssuesRepositoryRule componentIssuesRepositoryRule = new ComponentIssuesRepositoryRule(treeRootHolder); - @Rule - public FillComponentIssuesVisitorRule fillComponentIssuesVisitorRule = new FillComponentIssuesVisitorRule(componentIssuesRepositoryRule, treeRootHolder); + private final ComponentIssuesRepositoryRule componentIssuesRepositoryRule = new ComponentIssuesRepositoryRule(treeRootHolder); + + @RegisterExtension + private final FillComponentIssuesVisitorRule fillComponentIssuesVisitorRule = + new FillComponentIssuesVisitorRule(componentIssuesRepositoryRule, treeRootHolder); private final NewIssueClassifier newIssueClassifier = mock(NewIssueClassifier.class); private final VisitorsCrawler underTest = new VisitorsCrawler(Arrays.asList(fillComponentIssuesVisitorRule, new NewReliabilityAndSecurityRatingMeasuresVisitor(metricRepository, measureRepository, componentIssuesRepositoryRule, newIssueClassifier))); - @Before - public void before() { + @BeforeEach + void before() { when(newIssueClassifier.isEnabled()).thenReturn(true); } @Test - public void measures_created_for_project_are_all_A_when_they_have_no_FILE_child() { + void measures_created_for_project_are_all_A_when_they_have_no_FILE_child() { ReportComponent root = builder(PROJECT, 1).build(); treeRootHolder.setRoot(root); @@ -132,7 +133,7 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { } @Test - public void no_measure_if_there_is_no_period() { + void no_measure_if_there_is_no_period() { when(newIssueClassifier.isEnabled()).thenReturn(false); treeRootHolder.setRoot(builder(PROJECT, 1).build()); @@ -142,7 +143,7 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { } @Test - public void compute_new_security_rating() { + void compute_new_security_rating() { treeRootHolder.setRoot(ROOT_PROJECT); fillComponentIssuesVisitorRule.setIssues(FILE_1_REF, newVulnerabilityIssue(10L, MAJOR), @@ -166,7 +167,7 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { } @Test - public void compute_new_security_rating_to_A_when_no_issue() { + void compute_new_security_rating_to_A_when_no_issue() { treeRootHolder.setRoot(ROOT_PROJECT); fillComponentIssuesVisitorRule.setIssues(FILE_1_REF); @@ -180,7 +181,7 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { } @Test - public void compute_new_security_rating_to_A_when_no_new_issue() { + void compute_new_security_rating_to_A_when_no_new_issue() { treeRootHolder.setRoot(ROOT_PROJECT); fillComponentIssuesVisitorRule.setIssues(FILE_1_REF, oldVulnerabilityIssue(1L, MAJOR)); @@ -194,7 +195,7 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { } @Test - public void compute_new_reliability_rating() { + void compute_new_reliability_rating() { treeRootHolder.setRoot(ROOT_PROJECT); fillComponentIssuesVisitorRule.setIssues(FILE_1_REF, newBugIssue(10L, MAJOR), @@ -219,7 +220,7 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { } @Test - public void compute_new_reliability_rating_to_A_when_no_issue() { + void compute_new_reliability_rating_to_A_when_no_issue() { treeRootHolder.setRoot(ROOT_PROJECT); fillComponentIssuesVisitorRule.setIssues(FILE_1_REF); @@ -233,7 +234,7 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { } @Test - public void compute_new_reliability_rating_to_A_when_no_new_issue() { + void compute_new_reliability_rating_to_A_when_no_new_issue() { treeRootHolder.setRoot(ROOT_PROJECT); fillComponentIssuesVisitorRule.setIssues(FILE_1_REF, oldBugIssue(1L, MAJOR)); @@ -247,7 +248,7 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { } @Test - public void compute_E_reliability_and_security_rating_on_blocker_issue() { + void compute_E_reliability_and_security_rating_on_blocker_issue() { treeRootHolder.setRoot(ROOT_PROJECT); fillComponentIssuesVisitorRule.setIssues(FILE_1_REF, newBugIssue(10L, BLOCKER), @@ -262,7 +263,7 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { } @Test - public void compute_D_reliability_and_security_rating_on_critical_issue() { + void compute_D_reliability_and_security_rating_on_critical_issue() { treeRootHolder.setRoot(ROOT_PROJECT); fillComponentIssuesVisitorRule.setIssues(FILE_1_REF, newBugIssue(10L, CRITICAL), @@ -277,7 +278,7 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { } @Test - public void compute_C_reliability_and_security_rating_on_major_issue() { + void compute_C_reliability_and_security_rating_on_major_issue() { treeRootHolder.setRoot(ROOT_PROJECT); fillComponentIssuesVisitorRule.setIssues(FILE_1_REF, newBugIssue(10L, MAJOR), @@ -292,7 +293,7 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { } @Test - public void compute_B_reliability_and_security_rating_on_minor_issue() { + void compute_B_reliability_and_security_rating_on_minor_issue() { treeRootHolder.setRoot(ROOT_PROJECT); fillComponentIssuesVisitorRule.setIssues(FILE_1_REF, newBugIssue(10L, MINOR), @@ -307,7 +308,7 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitorTest { } @Test - public void compute_A_reliability_and_security_rating_on_info_issue() { + void compute_A_reliability_and_security_rating_on_info_issue() { treeRootHolder.setRoot(ROOT_PROJECT); fillComponentIssuesVisitorRule.setIssues(FILE_1_REF, newBugIssue(10L, INFO).setCreationDate(AFTER_LEAK_PERIOD_DATE), diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualityprofile/ActiveRulesHolderRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualityprofile/ActiveRulesHolderRule.java index 69798c64172..41f71b7bcfd 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualityprofile/ActiveRulesHolderRule.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualityprofile/ActiveRulesHolderRule.java @@ -22,10 +22,12 @@ package org.sonar.ce.task.projectanalysis.qualityprofile; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.api.rule.RuleKey; -public class ActiveRulesHolderRule extends ExternalResource implements ActiveRulesHolder { +public class ActiveRulesHolderRule extends ExternalResource implements ActiveRulesHolder, AfterEachCallback { private final Map activeRulesByKey = new HashMap<>(); @@ -43,4 +45,9 @@ public class ActiveRulesHolderRule extends ExternalResource implements ActiveRul protected void after() { activeRulesByKey.clear(); } + + @Override + public void afterEach(ExtensionContext extensionContext) throws Exception { + after(); + } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoRepositoryRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoRepositoryRule.java index 7c196a7ee8c..a8992fff0c3 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoRepositoryRule.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoRepositoryRule.java @@ -22,12 +22,14 @@ package org.sonar.ce.task.projectanalysis.scm; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.ce.task.projectanalysis.component.Component; import static com.google.common.base.Preconditions.checkNotNull; -public class ScmInfoRepositoryRule extends ExternalResource implements ScmInfoRepository { +public class ScmInfoRepositoryRule extends ExternalResource implements ScmInfoRepository, AfterEachCallback { private Map scmInfoByFileRef = new HashMap<>(); @@ -52,4 +54,9 @@ public class ScmInfoRepositoryRule extends ExternalResource implements ScmInfoRe scmInfoByFileRef.put(fileRef, new ScmInfoImpl(changesets.values().toArray(new Changeset[0]))); return this; } + + @Override + public void afterEach(ExtensionContext extensionContext) throws Exception { + after(); + } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/source/SourceHashRepositoryImplTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/source/SourceHashRepositoryImplTest.java index f6975324d80..54530e59f15 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/source/SourceHashRepositoryImplTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/source/SourceHashRepositoryImplTest.java @@ -22,14 +22,12 @@ package org.sonar.ce.task.projectanalysis.source; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.FluentIterable; -import com.tngtech.java.junit.dataprovider.DataProvider; -import com.tngtech.java.junit.dataprovider.DataProviderRunner; -import com.tngtech.java.junit.dataprovider.UseDataProvider; import java.util.Arrays; import javax.annotation.Nullable; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.component.ReportComponent; import org.sonar.ce.task.projectanalysis.component.ViewsComponent; @@ -43,38 +41,36 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -@RunWith(DataProviderRunner.class) -public class SourceHashRepositoryImplTest { +class SourceHashRepositoryImplTest { private static final int FILE_REF = 112; private static final String FILE_KEY = "file key"; private static final Component FILE_COMPONENT = ReportComponent.builder(Component.Type.FILE, FILE_REF).setKey(FILE_KEY).build(); private static final String[] SOME_LINES = {"line 1", "line after line 1", "line 4 minus 1", "line 100 by 10"}; - @Rule - public SourceLinesRepositoryRule sourceLinesRepository = new SourceLinesRepositoryRule(); + @RegisterExtension + private final SourceLinesRepositoryRule sourceLinesRepository = new SourceLinesRepositoryRule(); - private SourceLinesRepository mockedSourceLinesRepository = mock(SourceLinesRepository.class); + private final SourceLinesRepository mockedSourceLinesRepository = mock(SourceLinesRepository.class); - private SourceHashRepositoryImpl underTest = new SourceHashRepositoryImpl(sourceLinesRepository); - private SourceHashRepositoryImpl mockedUnderTest = new SourceHashRepositoryImpl(mockedSourceLinesRepository); + private final SourceHashRepositoryImpl underTest = new SourceHashRepositoryImpl(sourceLinesRepository); + private final SourceHashRepositoryImpl mockedUnderTest = new SourceHashRepositoryImpl(mockedSourceLinesRepository); @Test - public void getRawSourceHash_throws_NPE_if_Component_argument_is_null() { + void getRawSourceHash_throws_NPE_if_Component_argument_is_null() { assertThatThrownBy(() -> underTest.getRawSourceHash(null)) .isInstanceOf(NullPointerException.class) .hasMessage("Specified component can not be null"); } - @Test - @UseDataProvider("componentsOfAllTypesButFile") - public void getRawSourceHash_throws_IAE_if_Component_argument_is_not_FILE(Component component) { + @ParameterizedTest + @MethodSource("componentsOfAllTypesButFile") + void getRawSourceHash_throws_IAE_if_Component_argument_is_not_FILE(Component component) { assertThatThrownBy(() -> underTest.getRawSourceHash(component)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("File source information can only be retrieved from FILE components (got " + component.getType() + ")"); } - @DataProvider - public static Object[][] componentsOfAllTypesButFile() { + private static Object[][] componentsOfAllTypesButFile() { return FluentIterable.from(Arrays.asList(Component.Type.values())) .filter(new Predicate() { @Override @@ -108,7 +104,7 @@ public class SourceHashRepositoryImplTest { } @Test - public void getRawSourceHash_returns_hash_of_lines_from_SourceLinesRepository() { + void getRawSourceHash_returns_hash_of_lines_from_SourceLinesRepository() { sourceLinesRepository.addLines(FILE_REF, SOME_LINES); String rawSourceHash = underTest.getRawSourceHash(FILE_COMPONENT); @@ -122,7 +118,7 @@ public class SourceHashRepositoryImplTest { } @Test - public void getRawSourceHash_reads_lines_from_SourceLinesRepository_only_the_first_time() { + void getRawSourceHash_reads_lines_from_SourceLinesRepository_only_the_first_time() { when(mockedSourceLinesRepository.readLines(FILE_COMPONENT)).thenReturn(CloseableIterator.from(Arrays.asList(SOME_LINES).iterator())); String rawSourceHash = mockedUnderTest.getRawSourceHash(FILE_COMPONENT); @@ -133,7 +129,7 @@ public class SourceHashRepositoryImplTest { } @Test - public void getRawSourceHash_let_exception_go_through() { + void getRawSourceHash_let_exception_go_through() { IllegalArgumentException thrown = new IllegalArgumentException("this IAE will cause the hash computation to fail"); when(mockedSourceLinesRepository.readLines(FILE_COMPONENT)).thenThrow(thrown); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/source/SourceLinesDiffImplTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/source/SourceLinesDiffImplTest.java index a5962d25161..087e578a494 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/source/SourceLinesDiffImplTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/source/SourceLinesDiffImplTest.java @@ -20,9 +20,9 @@ package org.sonar.ce.task.projectanalysis.source; import java.util.Arrays; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.period.NewCodeReferenceBranchComponentUuids; @@ -40,7 +40,7 @@ import static org.mockito.Mockito.when; import static org.sonar.ce.task.projectanalysis.component.Component.Type.FILE; import static org.sonar.ce.task.projectanalysis.component.ReportComponent.builder; -public class SourceLinesDiffImplTest { +class SourceLinesDiffImplTest { private final DbClient dbClient = mock(DbClient.class); private final DbSession dbSession = mock(DbSession.class); @@ -50,11 +50,12 @@ public class SourceLinesDiffImplTest { private final AnalysisMetadataHolder analysisMetadataHolder = mock(AnalysisMetadataHolder.class); private final ReferenceBranchComponentUuids referenceBranchComponentUuids = mock(ReferenceBranchComponentUuids.class); private final NewCodeReferenceBranchComponentUuids newCodeReferenceBranchComponentUuids = mock(NewCodeReferenceBranchComponentUuids.class); - @Rule - public PeriodHolderRule periodHolder = new PeriodHolderRule(); - @Rule - public MutableMovedFilesRepositoryRule movedFiles = new MutableMovedFilesRepositoryRule(); + @RegisterExtension + private final PeriodHolderRule periodHolder = new PeriodHolderRule(); + + @RegisterExtension + private final MutableMovedFilesRepositoryRule movedFiles = new MutableMovedFilesRepositoryRule(); private final SourceLinesDiffImpl underTest = new SourceLinesDiffImpl(dbClient, fileSourceDao, sourceLinesHash, referenceBranchComponentUuids, movedFiles, analysisMetadataHolder, periodHolder, newCodeReferenceBranchComponentUuids); @@ -71,15 +72,15 @@ public class SourceLinesDiffImplTest { "}" }; - @Before - public void setUp() { + @BeforeEach + void setUp() { when(dbClient.openSession(false)).thenReturn(dbSession); when(dbClient.componentDao()).thenReturn(componentDao); when(dbClient.fileSourceDao()).thenReturn(fileSourceDao); } @Test - public void should_find_diff_with_reference_branch_for_prs() { + void should_find_diff_with_reference_branch_for_prs() { periodHolder.setPeriod(null); Component component = fileComponent(FILE_REF); @@ -93,7 +94,7 @@ public class SourceLinesDiffImplTest { } @Test - public void all_file_is_modified_if_no_source_in_db() { + void all_file_is_modified_if_no_source_in_db() { periodHolder.setPeriod(null); Component component = fileComponent(FILE_REF); @@ -103,7 +104,7 @@ public class SourceLinesDiffImplTest { } @Test - public void should_find_no_diff_when_report_and_db_content_are_identical() { + void should_find_no_diff_when_report_and_db_content_are_identical() { periodHolder.setPeriod(null); Component component = fileComponent(FILE_REF); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/source/SourceLinesRepositoryRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/source/SourceLinesRepositoryRule.java index ecdb52de008..a9e0bf9e257 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/source/SourceLinesRepositoryRule.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/source/SourceLinesRepositoryRule.java @@ -23,6 +23,8 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import java.util.Arrays; import java.util.Collection; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.core.util.CloseableIterator; @@ -30,10 +32,15 @@ import org.sonar.core.util.CloseableIterator; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; -public class SourceLinesRepositoryRule extends ExternalResource implements SourceLinesRepository { +public class SourceLinesRepositoryRule extends ExternalResource implements SourceLinesRepository, AfterEachCallback { private Multimap lines = ArrayListMultimap.create(); + @Override + public void afterEach(ExtensionContext context) { + after(); + } + @Override protected void after() { lines.clear(); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadQualityGateStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadQualityGateStepTest.java index f5e6da1a1c8..4ae0bd2860b 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadQualityGateStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadQualityGateStepTest.java @@ -20,9 +20,9 @@ package org.sonar.ce.task.projectanalysis.step; import java.util.Arrays; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; import org.sonar.ce.task.projectanalysis.metric.Metric; import org.sonar.ce.task.projectanalysis.metric.MetricImpl; @@ -37,9 +37,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class LoadQualityGateStepTest { - @Rule - public MutableQualityGateHolderRule mutableQualityGateHolder = new MutableQualityGateHolderRule(); +class LoadQualityGateStepTest { + @RegisterExtension + private final MutableQualityGateHolderRule mutableQualityGateHolder = new MutableQualityGateHolderRule(); private final AnalysisMetadataHolder analysisMetadataHolder = mock(AnalysisMetadataHolder.class); private final QualityGateServiceImpl qualityGateService = mock(QualityGateServiceImpl.class); @@ -47,13 +47,13 @@ public class LoadQualityGateStepTest { private final LoadQualityGateStep underTest = new LoadQualityGateStep(qualityGateService, mutableQualityGateHolder, analysisMetadataHolder); private final Project project = mock(Project.class); - @Before - public void before() { + @BeforeEach + void before() { when(analysisMetadataHolder.getProject()).thenReturn(project); } @Test - public void filter_conditions_on_pull_request() { + void filter_conditions_on_pull_request() { Metric newMetric = new MetricImpl("1", "new_key", "name", Metric.MetricType.INT); Metric metric = new MetricImpl("2", "key", "name", Metric.MetricType.INT); Condition variation = new Condition(newMetric, Condition.Operator.GREATER_THAN.getDbValue(), "1.0"); @@ -69,7 +69,7 @@ public class LoadQualityGateStepTest { } @Test - public void execute_sets_effective_quality_gate() { + void execute_sets_effective_quality_gate() { QualityGate qg = mock(QualityGate.class); when(qualityGateService.findEffectiveQualityGate(project)).thenReturn(qg); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadQualityProfilesStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadQualityProfilesStepTest.java index d9d896674da..80bb922ebab 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadQualityProfilesStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadQualityProfilesStepTest.java @@ -20,8 +20,8 @@ package org.sonar.ce.task.projectanalysis.step; import org.assertj.core.data.MapEntry; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.sonar.api.rule.RuleStatus; import org.sonar.api.rule.Severity; import org.sonar.ce.task.projectanalysis.batch.BatchReportReaderRule; @@ -40,17 +40,17 @@ import static org.sonar.db.rule.RuleTesting.XOO_X2; public class LoadQualityProfilesStepTest { - @Rule - public BatchReportReaderRule batchReportReader = new BatchReportReaderRule(); + @RegisterExtension + private final BatchReportReaderRule batchReportReader = new BatchReportReaderRule(); - @Rule - public RuleRepositoryRule ruleRepository = new RuleRepositoryRule(); + @RegisterExtension + private final RuleRepositoryRule ruleRepository = new RuleRepositoryRule(); - private ActiveRulesHolderImpl activeRulesHolder = new ActiveRulesHolderImpl(); - private LoadQualityProfilesStep underTest = new LoadQualityProfilesStep(batchReportReader, activeRulesHolder, ruleRepository); + private final ActiveRulesHolderImpl activeRulesHolder = new ActiveRulesHolderImpl(); + private final LoadQualityProfilesStep underTest = new LoadQualityProfilesStep(batchReportReader, activeRulesHolder, ruleRepository); @Test - public void feed_active_rules() { + void feed_active_rules() { ruleRepository.add(XOO_X1) .setPluginKey("xoo"); ruleRepository.add(XOO_X2) @@ -86,7 +86,7 @@ public class LoadQualityProfilesStepTest { } @Test - public void ignore_rules_with_status_REMOVED() { + void ignore_rules_with_status_REMOVED() { ruleRepository.add(new DumbRule(XOO_X1).setStatus(RuleStatus.REMOVED)); ScannerReport.ActiveRule.Builder batch1 = ScannerReport.ActiveRule.newBuilder() @@ -100,7 +100,7 @@ public class LoadQualityProfilesStepTest { } @Test - public void ignore_not_found_rules() { + void ignore_not_found_rules() { ScannerReport.ActiveRule.Builder batch1 = ScannerReport.ActiveRule.newBuilder() .setRuleRepository(XOO_X1.repository()).setRuleKey(XOO_X1.rule()) .setSeverity(Constants.Severity.BLOCKER); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/QualityGateMeasuresStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/QualityGateMeasuresStepTest.java index c3e3aa6d90e..27e05834df3 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/QualityGateMeasuresStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/QualityGateMeasuresStepTest.java @@ -25,9 +25,9 @@ import java.util.Objects; import java.util.Optional; import javax.annotation.Nullable; import org.assertj.core.api.AbstractAssert; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.sonar.api.config.internal.ConfigurationBridge; @@ -57,6 +57,7 @@ import org.sonar.ce.task.step.TestComputationStepContext; import static com.google.common.collect.ImmutableList.of; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -66,7 +67,7 @@ import static org.sonar.ce.task.projectanalysis.measure.Measure.Level.ERROR; import static org.sonar.ce.task.projectanalysis.measure.Measure.Level.OK; import static org.sonar.ce.task.projectanalysis.measure.MeasureAssert.assertThat; -public class QualityGateMeasuresStepTest { +class QualityGateMeasuresStepTest { private static final MetricImpl INT_METRIC_1 = createIntMetric(1); private static final String INT_METRIC_1_KEY = INT_METRIC_1.getKey(); private static final MetricImpl INT_METRIC_2 = createIntMetric(2); @@ -77,24 +78,25 @@ public class QualityGateMeasuresStepTest { private static final String SOME_QG_UUID = "7521551"; private static final String SOME_QG_NAME = "name"; - @Rule - public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); - @Rule - public QualityGateHolderRule qualityGateHolder = new QualityGateHolderRule(); - @Rule - public MutableQualityGateStatusHolderRule qualityGateStatusHolder = new MutableQualityGateStatusHolderRule(); - @Rule - public MetricRepositoryRule metricRepository = new MetricRepositoryRule(); - @Rule - public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(treeRootHolder, metricRepository); - private EvaluationResultTextConverter resultTextConverter = mock(EvaluationResultTextConverter.class); - private MapSettings mapSettings = new MapSettings(); - private TestSettingsRepository settings = new TestSettingsRepository(new ConfigurationBridge(mapSettings)); - private QualityGateMeasuresStep underTest = new QualityGateMeasuresStep(treeRootHolder, qualityGateHolder, qualityGateStatusHolder, measureRepository, metricRepository, + @RegisterExtension + private final TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); + @RegisterExtension + private final QualityGateHolderRule qualityGateHolder = new QualityGateHolderRule(); + @RegisterExtension + private final MutableQualityGateStatusHolderRule qualityGateStatusHolder = new MutableQualityGateStatusHolderRule(); + @RegisterExtension + private final MetricRepositoryRule metricRepository = new MetricRepositoryRule(); + @RegisterExtension + private final MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(treeRootHolder, metricRepository); + + private final EvaluationResultTextConverter resultTextConverter = mock(EvaluationResultTextConverter.class); + private final MapSettings mapSettings = new MapSettings(); + private final TestSettingsRepository settings = new TestSettingsRepository(new ConfigurationBridge(mapSettings)); + private final QualityGateMeasuresStep underTest = new QualityGateMeasuresStep(treeRootHolder, qualityGateHolder, qualityGateStatusHolder, measureRepository, metricRepository, resultTextConverter, new SmallChangesetQualityGateSpecialCase(measureRepository, metricRepository, settings)); - @Before - public void setUp() { + @BeforeEach + void setUp() { metricRepository .add(CoreMetrics.ALERT_STATUS) .add(CoreMetrics.QUALITY_GATE_DETAILS) @@ -118,27 +120,27 @@ public class QualityGateMeasuresStepTest { } @Test - public void no_measure_if_tree_has_no_project() { + void no_measure_if_tree_has_no_project() { ReportComponent notAProjectComponent = ReportComponent.builder(Component.Type.DIRECTORY, 1).build(); treeRootHolder.setRoot(notAProjectComponent); underTest.execute(new TestComputationStepContext()); - measureRepository.getAddedRawMeasures(1).isEmpty(); + assertTrue(measureRepository.getAddedRawMeasures(1).isEmpty()); } @Test - public void no_measure_if_there_is_no_qualitygate() { + void no_measure_if_there_is_no_qualitygate() { qualityGateHolder.setQualityGate(null); underTest.execute(new TestComputationStepContext()); - measureRepository.getAddedRawMeasures(PROJECT_COMPONENT).isEmpty(); + assertTrue(measureRepository.getAddedRawMeasures(PROJECT_COMPONENT).isEmpty()); } @Test - public void mutableQualityGateStatusHolder_is_not_populated_if_there_is_no_qualitygate() { + void mutableQualityGateStatusHolder_is_not_populated_if_there_is_no_qualitygate() { qualityGateHolder.setQualityGate(null); underTest.execute(new TestComputationStepContext()); @@ -149,7 +151,7 @@ public class QualityGateMeasuresStepTest { } @Test - public void new_measures_are_created_even_if_there_is_no_rawMeasure_for_metric_of_condition() { + void new_measures_are_created_even_if_there_is_no_rawMeasure_for_metric_of_condition() { Condition equals2Condition = createLessThanCondition(INT_METRIC_1, "2"); qualityGateHolder.setQualityGate(new QualityGate(SOME_QG_UUID, SOME_QG_NAME, of(equals2Condition))); @@ -171,7 +173,7 @@ public class QualityGateMeasuresStepTest { } @Test - public void rawMeasure_is_updated_if_present_and_new_measures_are_created_if_project_has_measure_for_metric_of_condition() { + void rawMeasure_is_updated_if_present_and_new_measures_are_created_if_project_has_measure_for_metric_of_condition() { int rawValue = 3; Condition equals2Condition = createLessThanCondition(INT_METRIC_1, "2"); Measure rawMeasure = newMeasureBuilder().create(rawValue, null); @@ -199,7 +201,7 @@ public class QualityGateMeasuresStepTest { } @Test - public void new_measures_have_ERROR_level_if_at_least_one_updated_measure_has_ERROR_level() { + void new_measures_have_ERROR_level_if_at_least_one_updated_measure_has_ERROR_level() { int rawValue = 3; Condition equalsOneErrorCondition = createLessThanCondition(INT_METRIC_1, "4"); Condition equalsOneOkCondition = createLessThanCondition(INT_METRIC_2, "2"); @@ -237,7 +239,7 @@ public class QualityGateMeasuresStepTest { } @Test - public void new_measure_has_ERROR_level_of_all_conditions_for_a_specific_metric_if_its_the_worst() { + void new_measure_has_ERROR_level_of_all_conditions_for_a_specific_metric_if_its_the_worst() { int rawValue = 3; Condition fixedCondition = createLessThanCondition(INT_METRIC_1, "4"); Condition periodCondition = createLessThanCondition(INT_METRIC_1, "2"); @@ -255,7 +257,7 @@ public class QualityGateMeasuresStepTest { } @Test - public void new_measure_has_condition_on_leak_period_when_all_conditions_on_specific_metric_has_same_QG_level() { + void new_measure_has_condition_on_leak_period_when_all_conditions_on_specific_metric_has_same_QG_level() { int rawValue = 0; Condition fixedCondition = createLessThanCondition(INT_METRIC_1, "1"); Condition periodCondition = createLessThanCondition(INT_METRIC_1, "1"); diff --git a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/analysis/AnalysisMetadataHolderRule.java b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/analysis/AnalysisMetadataHolderRule.java index 3f76c6b704e..647322c36a1 100644 --- a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/analysis/AnalysisMetadataHolderRule.java +++ b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/analysis/AnalysisMetadataHolderRule.java @@ -24,6 +24,8 @@ import java.util.Map; import java.util.Optional; import javax.annotation.CheckForNull; import javax.annotation.Nullable; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.ce.task.util.InitializedProperty; import org.sonar.db.component.BranchType; @@ -34,7 +36,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static org.apache.commons.lang.StringUtils.defaultIfBlank; -public class AnalysisMetadataHolderRule extends ExternalResource implements MutableAnalysisMetadataHolder { +public class AnalysisMetadataHolderRule extends ExternalResource implements MutableAnalysisMetadataHolder, AfterEachCallback { private final InitializedProperty uuid = new InitializedProperty<>(); private final InitializedProperty analysisDate = new InitializedProperty<>(); @@ -228,4 +230,9 @@ public class AnalysisMetadataHolderRule extends ExternalResource implements Muta Branch property = this.branch.getProperty(); return property != null && property.getType() == BranchType.PULL_REQUEST; } + + @Override + public void afterEach(ExtensionContext context) { + after(); + } } diff --git a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/analysis/MutableAnalysisMetadataHolderRule.java b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/analysis/MutableAnalysisMetadataHolderRule.java index 76ec2739da9..dfba0c83d5d 100644 --- a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/analysis/MutableAnalysisMetadataHolderRule.java +++ b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/analysis/MutableAnalysisMetadataHolderRule.java @@ -23,6 +23,8 @@ import java.util.Map; import java.util.Optional; import javax.annotation.CheckForNull; import javax.annotation.Nullable; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.core.platform.PlatformEditionProvider; import org.sonar.server.project.Project; @@ -30,7 +32,7 @@ import org.sonar.server.qualityprofile.QualityProfile; import static org.mockito.Mockito.mock; -public class MutableAnalysisMetadataHolderRule extends ExternalResource implements MutableAnalysisMetadataHolder { +public class MutableAnalysisMetadataHolderRule extends ExternalResource implements MutableAnalysisMetadataHolder, AfterEachCallback { private final PlatformEditionProvider editionProvider = mock(PlatformEditionProvider.class); private AnalysisMetadataHolderImpl delegate = new AnalysisMetadataHolderImpl(editionProvider); @@ -188,4 +190,10 @@ public class MutableAnalysisMetadataHolderRule extends ExternalResource implemen public boolean isPullRequest() { return delegate.isPullRequest(); } + + @Override + public void afterEach(ExtensionContext extensionContext) { + after(); + } + } diff --git a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/component/TreeRootHolderRule.java b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/component/TreeRootHolderRule.java index d77c0d465f1..3f7ebb29513 100644 --- a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/component/TreeRootHolderRule.java +++ b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/component/TreeRootHolderRule.java @@ -23,13 +23,15 @@ import com.google.common.collect.ImmutableMap; import java.util.Map; import java.util.Optional; import javax.annotation.CheckForNull; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; import static org.sonar.ce.task.projectanalysis.component.ComponentVisitor.Order.POST_ORDER; -public class TreeRootHolderRule extends ExternalResource implements TreeRootHolder { +public class TreeRootHolderRule extends ExternalResource implements TreeRootHolder, AfterEachCallback { protected TreeRootHolderImpl delegate = new TreeRootHolderImpl(); @CheckForNull @@ -40,6 +42,11 @@ public class TreeRootHolderRule extends ExternalResource implements TreeRootHold this.delegate = null; } + @Override + public void afterEach(ExtensionContext context) throws Exception { + after(); + } + public TreeRootHolderRule setRoot(Component root) { return setRoots(root, root); } diff --git a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryRule.java b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryRule.java index e8359de38d7..7fa9265afc5 100644 --- a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryRule.java +++ b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryRule.java @@ -28,6 +28,8 @@ import java.util.stream.Collectors; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.component.ComponentProvider; @@ -49,7 +51,7 @@ import static java.util.Objects.requireNonNull; * methods that takes component ref and metric keys thanks to the integration with various Component and Metric * providers. */ -public class MeasureRepositoryRule extends ExternalResource implements MeasureRepository { +public class MeasureRepositoryRule extends ExternalResource implements MeasureRepository, AfterEachCallback { private final ComponentProvider componentProvider; @CheckForNull private final MetricRepositoryRule metricRepositoryRule; @@ -208,6 +210,11 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe return rawMeasures.isEmpty(); } + @Override + public void afterEach(ExtensionContext extensionContext) throws Exception { + after(); + } + private static final class InternalKey { private final String componentRef; private final String metricKey; diff --git a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/metric/MetricRepositoryRule.java b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/metric/MetricRepositoryRule.java index 927aacfa878..7a3762e4c1f 100644 --- a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/metric/MetricRepositoryRule.java +++ b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/metric/MetricRepositoryRule.java @@ -23,13 +23,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import static com.google.common.base.Preconditions.checkState; import static java.lang.String.format; import static java.util.Objects.requireNonNull; -public class MetricRepositoryRule extends ExternalResource implements MetricRepository { +public class MetricRepositoryRule extends ExternalResource implements MetricRepository, AfterEachCallback { private final Map metricsByKey = new HashMap<>(); private final Map metricsByUuid = new HashMap<>(); @@ -118,4 +120,9 @@ public class MetricRepositoryRule extends ExternalResource implements MetricRepo public List getMetricsByType(Metric.MetricType type) { return metricsByKey.values().stream().filter(m -> m.getType() == type).toList(); } + + @Override + public void afterEach(ExtensionContext context) throws Exception { + after(); + } } diff --git a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/step/BaseStepJUnit5Test.java b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/step/BaseStepJUnit5Test.java new file mode 100644 index 00000000000..166cda6e27e --- /dev/null +++ b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/step/BaseStepJUnit5Test.java @@ -0,0 +1,40 @@ +/* + * SonarQube + * Copyright (C) 2009-2024 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.sonar.ce.task.projectanalysis.step; + +import org.junit.jupiter.api.Test; +import org.sonar.ce.task.step.ComputationStep; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Temporary solution to test metadata. Should be replaced by a medium test of + * all computation stack + */ +public abstract class BaseStepJUnit5Test { + + protected abstract ComputationStep step(); + + @Test + public void test_metadata() { + assertThat(step().toString()).isNotEmpty(); + assertThat(step().getDescription()).isNotEmpty(); + } +} diff --git a/server/sonar-ce/src/it/java/org/sonar/ce/taskprocessor/CeWorkerImplIT.java b/server/sonar-ce/src/it/java/org/sonar/ce/taskprocessor/CeWorkerImplIT.java index 1e36d922e7e..4a64711c05a 100644 --- a/server/sonar-ce/src/it/java/org/sonar/ce/taskprocessor/CeWorkerImplIT.java +++ b/server/sonar-ce/src/it/java/org/sonar/ce/taskprocessor/CeWorkerImplIT.java @@ -30,16 +30,16 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import javax.annotation.CheckForNull; import javax.annotation.Nullable; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.ArgumentCaptor; import org.mockito.InOrder; import org.mockito.stubbing.Answer; import org.slf4j.event.Level; import org.sonar.api.impl.utils.TestSystem2; import org.sonar.api.testfixtures.log.LogAndArguments; -import org.sonar.api.testfixtures.log.LogTester; +import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.api.utils.MessageException; import org.sonar.api.utils.System2; import org.sonar.api.utils.log.LoggerLevel; @@ -76,54 +76,55 @@ import static org.sonar.ce.taskprocessor.CeWorker.Result.DISABLED; import static org.sonar.ce.taskprocessor.CeWorker.Result.NO_TASK; import static org.sonar.ce.taskprocessor.CeWorker.Result.TASK_PROCESSED; -public class CeWorkerImplIT { +class CeWorkerImplIT { private System2 system2 = new TestSystem2().setNow(1_450_000_000_000L); - @Rule - public CeTaskProcessorRepositoryRule taskProcessorRepository = new CeTaskProcessorRepositoryRule(); - @Rule - public LogTester logTester = new LogTester(); - @Rule - public DbTester db = DbTester.create(system2); - - private DbSession session = db.getSession(); - - private InternalCeQueue queue = mock(InternalCeQueue.class); - private ReportTaskProcessor taskProcessor = mock(ReportTaskProcessor.class); - private CeWorker.ExecutionListener executionListener1 = mock(CeWorker.ExecutionListener.class); - private CeWorker.ExecutionListener executionListener2 = mock(CeWorker.ExecutionListener.class); - private CeWorkerController ceWorkerController = mock(CeWorkerController.class); - private ArgumentCaptor workerUuidCaptor = ArgumentCaptor.forClass(String.class); - private int randomOrdinal = new Random().nextInt(50); - private String workerUuid = UUID.randomUUID().toString(); - private CeWorker underTest = new CeWorkerImpl(randomOrdinal, workerUuid, queue, taskProcessorRepository, ceWorkerController, - executionListener1, executionListener2); - private CeWorker underTestNoListener = new CeWorkerImpl(randomOrdinal, workerUuid, queue, taskProcessorRepository, ceWorkerController); - private InOrder inOrder = inOrder(taskProcessor, queue, executionListener1, executionListener2); + @RegisterExtension + private final CeTaskProcessorRepositoryRule taskProcessorRepository = new CeTaskProcessorRepositoryRule(); + @RegisterExtension + private final LogTesterJUnit5 logTester = new LogTesterJUnit5(); + @RegisterExtension + private final DbTester db = DbTester.create(system2); + + private final DbSession session = db.getSession(); + + private final InternalCeQueue queue = mock(InternalCeQueue.class); + private final ReportTaskProcessor taskProcessor = mock(ReportTaskProcessor.class); + private final CeWorker.ExecutionListener executionListener1 = mock(CeWorker.ExecutionListener.class); + private final CeWorker.ExecutionListener executionListener2 = mock(CeWorker.ExecutionListener.class); + private final CeWorkerController ceWorkerController = mock(CeWorkerController.class); + private final ArgumentCaptor workerUuidCaptor = ArgumentCaptor.forClass(String.class); + private final int ordinal = 37; + private final String workerUuid = "8e5cc1dd-4617-4974-9234-0a9539212615"; + private final CeWorker underTest = new CeWorkerImpl(ordinal, workerUuid, queue, taskProcessorRepository, + ceWorkerController, executionListener1, executionListener2); + private final CeWorker underTestNoListener = new CeWorkerImpl(ordinal, workerUuid, queue, taskProcessorRepository, + ceWorkerController); + private final InOrder inOrder = inOrder(taskProcessor, queue, executionListener1, executionListener2); private final CeTask.User submitter = new CeTask.User("UUID_USER_1", "LOGIN_1"); - @Before - public void setUp() { + @BeforeEach + void setUp() { when(ceWorkerController.isEnabled(any(CeWorker.class))).thenReturn(true); } @Test - public void constructor_throws_IAE_if_ordinal_is_less_than_zero() { + void constructor_throws_IAE_if_ordinal_is_less_than_zero() { assertThatThrownBy(() -> new CeWorkerImpl(-1 - new Random().nextInt(20), workerUuid, queue, taskProcessorRepository, ceWorkerController)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Ordinal must be >= 0"); } @Test - public void getUUID_must_return_the_uuid_of_constructor() { + void getUUID_must_return_the_uuid_of_constructor() { String uuid = UUID.randomUUID().toString(); - CeWorker underTest = new CeWorkerImpl(randomOrdinal, uuid, queue, taskProcessorRepository, ceWorkerController); + CeWorker underTest = new CeWorkerImpl(ordinal, uuid, queue, taskProcessorRepository, ceWorkerController); assertThat(underTest.getUUID()).isEqualTo(uuid); } @Test - public void worker_disabled() throws Exception { + void worker_disabled() throws Exception { reset(ceWorkerController); when(ceWorkerController.isEnabled(underTest)).thenReturn(false); @@ -133,7 +134,7 @@ public class CeWorkerImplIT { } @Test - public void worker_disabled_no_listener() throws Exception { + void worker_disabled_no_listener() throws Exception { reset(ceWorkerController); when(ceWorkerController.isEnabled(underTest)).thenReturn(false); @@ -143,7 +144,7 @@ public class CeWorkerImplIT { } @Test - public void no_pending_tasks_in_queue() throws Exception { + void no_pending_tasks_in_queue() throws Exception { when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.empty()); assertThat(underTest.call()).isEqualTo(NO_TASK); @@ -152,7 +153,7 @@ public class CeWorkerImplIT { } @Test - public void no_pending_tasks_in_queue_without_listener() throws Exception { + void no_pending_tasks_in_queue_without_listener() throws Exception { when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.empty()); assertThat(underTestNoListener.call()).isEqualTo(NO_TASK); @@ -161,7 +162,7 @@ public class CeWorkerImplIT { } @Test - public void fail_when_no_CeTaskProcessor_is_found_in_repository() throws Exception { + void fail_when_no_CeTaskProcessor_is_found_in_repository() throws Exception { CeTask task = createCeTask(null); taskProcessorRepository.setNoProcessorForTask(CeTaskTypes.REPORT); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(task)); @@ -177,7 +178,7 @@ public class CeWorkerImplIT { } @Test - public void fail_when_no_CeTaskProcessor_is_found_in_repository_without_listener() throws Exception { + void fail_when_no_CeTaskProcessor_is_found_in_repository_without_listener() throws Exception { CeTask task = createCeTask(null); taskProcessorRepository.setNoProcessorForTask(CeTaskTypes.REPORT); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(task)); @@ -190,7 +191,7 @@ public class CeWorkerImplIT { } @Test - public void peek_and_process_task() throws Exception { + void peek_and_process_task() throws Exception { CeTask task = createCeTask(null); taskProcessorRepository.setProcessorForTask(task.getType(), taskProcessor); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(task)); @@ -207,7 +208,7 @@ public class CeWorkerImplIT { } @Test - public void peek_and_process_task_without_listeners() throws Exception { + void peek_and_process_task_without_listeners() throws Exception { CeTask task = createCeTask(null); taskProcessorRepository.setProcessorForTask(task.getType(), taskProcessor); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(task)); @@ -221,7 +222,7 @@ public class CeWorkerImplIT { } @Test - public void fail_to_process_task() throws Exception { + void fail_to_process_task() throws Exception { CeTask task = createCeTask(null); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(task)); taskProcessorRepository.setProcessorForTask(task.getType(), taskProcessor); @@ -239,7 +240,7 @@ public class CeWorkerImplIT { } @Test - public void fail_to_process_task_without_listeners() throws Exception { + void fail_to_process_task_without_listeners() throws Exception { CeTask task = createCeTask(null); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(task)); taskProcessorRepository.setProcessorForTask(task.getType(), taskProcessor); @@ -254,7 +255,7 @@ public class CeWorkerImplIT { } @Test - public void log_task_characteristics() throws Exception { + void log_task_characteristics() throws Exception { when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(createCeTask(null, "pullRequest", "123", "branch", "foo"))); taskProcessorRepository.setProcessorForTask(CeTaskTypes.REPORT, taskProcessor); @@ -269,7 +270,7 @@ public class CeWorkerImplIT { } @Test - public void do_not_log_submitter_param_if_anonymous_and_success() throws Exception { + void do_not_log_submitter_param_if_anonymous_and_success() throws Exception { when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(createCeTask(null))); taskProcessorRepository.setProcessorForTask(CeTaskTypes.REPORT, taskProcessor); @@ -284,7 +285,7 @@ public class CeWorkerImplIT { } @Test - public void do_not_log_submitter_param_if_anonymous_and_error() throws Exception { + void do_not_log_submitter_param_if_anonymous_and_error() throws Exception { CeTask ceTask = createCeTask(null); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(ceTask)); taskProcessorRepository.setProcessorForTask(ceTask.getType(), taskProcessor); @@ -304,7 +305,7 @@ public class CeWorkerImplIT { } @Test - public void log_submitter_login_if_authenticated_and_success() throws Exception { + void log_submitter_login_if_authenticated_and_success() throws Exception { UserDto userDto = insertRandomUser(); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(createCeTask(toTaskSubmitter(userDto)))); taskProcessorRepository.setProcessorForTask(CeTaskTypes.REPORT, taskProcessor); @@ -321,7 +322,7 @@ public class CeWorkerImplIT { } @Test - public void log_submitterUuid_if_user_matching_submitterUuid_can_not_be_found() throws Exception { + void log_submitterUuid_if_user_matching_submitterUuid_can_not_be_found() throws Exception { when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(createCeTask(new CeTask.User("UUID_USER", null)))); taskProcessorRepository.setProcessorForTask(CeTaskTypes.REPORT, taskProcessor); @@ -337,7 +338,7 @@ public class CeWorkerImplIT { } @Test - public void display_submitterLogin_in_logs_when_set_in_case_of_error() throws Exception { + void display_submitterLogin_in_logs_when_set_in_case_of_error() throws Exception { UserDto userDto = insertRandomUser(); CeTask ceTask = createCeTask(toTaskSubmitter(userDto)); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(ceTask)); @@ -357,7 +358,7 @@ public class CeWorkerImplIT { } @Test - public void display_start_stop_at_debug_level_for_console_if_DEBUG_is_enabled_and_task_successful() throws Exception { + void display_start_stop_at_debug_level_for_console_if_DEBUG_is_enabled_and_task_successful() throws Exception { logTester.setLevel(LoggerLevel.DEBUG); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(createCeTask(submitter))); @@ -375,7 +376,7 @@ public class CeWorkerImplIT { } @Test - public void display_start_at_debug_level_stop_at_error_level_for_console_if_DEBUG_is_enabled_and_task_failed() throws Exception { + void display_start_at_debug_level_stop_at_error_level_for_console_if_DEBUG_is_enabled_and_task_failed() throws Exception { logTester.setLevel(LoggerLevel.DEBUG); CeTask ceTask = createCeTask(submitter); @@ -397,11 +398,11 @@ public class CeWorkerImplIT { } @Test - public void call_sets_and_restores_thread_name_with_information_of_worker_when_there_is_no_task_to_process() throws Exception { + void call_sets_and_restores_thread_name_with_information_of_worker_when_there_is_no_task_to_process() throws Exception { String threadName = randomAlphabetic(3); when(queue.peek(anyString(), anyBoolean())).thenAnswer(invocation -> { assertThat(Thread.currentThread().getName()) - .isEqualTo("Worker " + randomOrdinal + " (UUID=" + workerUuid + ") on " + threadName); + .isEqualTo("Worker " + ordinal + " (UUID=" + workerUuid + ") on " + threadName); return Optional.empty(); }); Thread newThread = createThreadNameVerifyingThread(threadName); @@ -411,11 +412,11 @@ public class CeWorkerImplIT { } @Test - public void call_sets_and_restores_thread_name_with_information_of_worker_when_a_task_is_processed() throws Exception { + void call_sets_and_restores_thread_name_with_information_of_worker_when_a_task_is_processed() throws Exception { String threadName = randomAlphabetic(3); when(queue.peek(anyString(), anyBoolean())).thenAnswer(invocation -> { assertThat(Thread.currentThread().getName()) - .isEqualTo("Worker " + randomOrdinal + " (UUID=" + workerUuid + ") on " + threadName); + .isEqualTo("Worker " + ordinal + " (UUID=" + workerUuid + ") on " + threadName); return Optional.of(createCeTask(submitter)); }); taskProcessorRepository.setProcessorForTask(CeTaskTypes.REPORT, taskProcessor); @@ -426,12 +427,12 @@ public class CeWorkerImplIT { } @Test - public void call_sets_and_restores_thread_name_with_information_of_worker_when_an_error_occurs() throws Exception { + void call_sets_and_restores_thread_name_with_information_of_worker_when_an_error_occurs() throws Exception { String threadName = randomAlphabetic(3); CeTask ceTask = createCeTask(submitter); when(queue.peek(anyString(), anyBoolean())).thenAnswer(invocation -> { assertThat(Thread.currentThread().getName()) - .isEqualTo("Worker " + randomOrdinal + " (UUID=" + workerUuid + ") on " + threadName); + .isEqualTo("Worker " + ordinal + " (UUID=" + workerUuid + ") on " + threadName); return Optional.of(ceTask); }); taskProcessorRepository.setProcessorForTask(CeTaskTypes.REPORT, taskProcessor); @@ -443,7 +444,7 @@ public class CeWorkerImplIT { } @Test - public void call_sets_and_restores_thread_name_with_information_of_worker_when_worker_is_disabled() throws Exception { + void call_sets_and_restores_thread_name_with_information_of_worker_when_worker_is_disabled() throws Exception { reset(ceWorkerController); when(ceWorkerController.isEnabled(underTest)).thenReturn(false); @@ -455,7 +456,7 @@ public class CeWorkerImplIT { } @Test - public void log_error_when_task_fails_with_not_MessageException() throws Exception { + void log_error_when_task_fails_with_not_MessageException() throws Exception { CeTask ceTask = createCeTask(submitter); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(ceTask)); taskProcessorRepository.setProcessorForTask(CeTaskTypes.REPORT, taskProcessor); @@ -473,7 +474,7 @@ public class CeWorkerImplIT { } @Test - public void do_no_log_error_when_task_fails_with_MessageException() throws Exception { + void do_no_log_error_when_task_fails_with_MessageException() throws Exception { CeTask ceTask = createCeTask(submitter); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(ceTask)); taskProcessorRepository.setProcessorForTask(CeTaskTypes.REPORT, taskProcessor); @@ -489,7 +490,7 @@ public class CeWorkerImplIT { } @Test - public void log_error_when_task_was_successful_but_ending_state_can_not_be_persisted_to_db() throws Exception { + void log_error_when_task_was_successful_but_ending_state_can_not_be_persisted_to_db() throws Exception { CeTask ceTask = createCeTask(submitter); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(ceTask)); taskProcessorRepository.setProcessorForTask(CeTaskTypes.REPORT, taskProcessor); @@ -501,7 +502,7 @@ public class CeWorkerImplIT { } @Test - public void log_error_when_task_failed_and_ending_state_can_not_be_persisted_to_db() throws Exception { + void log_error_when_task_failed_and_ending_state_can_not_be_persisted_to_db() throws Exception { CeTask ceTask = createCeTask(submitter); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(ceTask)); taskProcessorRepository.setProcessorForTask(CeTaskTypes.REPORT, taskProcessor); @@ -526,7 +527,7 @@ public class CeWorkerImplIT { } @Test - public void log_error_as_suppressed_when_task_failed_with_MessageException_and_ending_state_can_not_be_persisted_to_db() throws Exception { + void log_error_as_suppressed_when_task_failed_with_MessageException_and_ending_state_can_not_be_persisted_to_db() throws Exception { CeTask ceTask = createCeTask(submitter); when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.of(ceTask)); taskProcessorRepository.setProcessorForTask(CeTaskTypes.REPORT, taskProcessor); @@ -546,13 +547,13 @@ public class CeWorkerImplIT { } @Test - public void isExecutedBy_returns_false_when_no_interaction_with_instance() { + void isExecutedBy_returns_false_when_no_interaction_with_instance() { assertThat(underTest.isExecutedBy(Thread.currentThread())).isFalse(); assertThat(underTest.isExecutedBy(new Thread())).isFalse(); } @Test - public void isExecutedBy_returns_false_unless_a_thread_is_currently_calling_call() throws InterruptedException { + void isExecutedBy_returns_false_unless_a_thread_is_currently_calling_call() throws InterruptedException { CountDownLatch inCallLatch = new CountDownLatch(1); CountDownLatch assertionsDoneLatch = new CountDownLatch(1); // mock long running peek(String) call => Thread is executing call() but not running a task @@ -585,7 +586,7 @@ public class CeWorkerImplIT { } @Test - public void isExecutedBy_returns_false_unless_a_thread_is_currently_executing_a_task() throws InterruptedException { + void isExecutedBy_returns_false_unless_a_thread_is_currently_executing_a_task() throws InterruptedException { CountDownLatch inCallLatch = new CountDownLatch(1); CountDownLatch assertionsDoneLatch = new CountDownLatch(1); String taskType = randomAlphabetic(12); @@ -625,12 +626,12 @@ public class CeWorkerImplIT { } @Test - public void getCurrentTask_returns_empty_when_no_interaction_with_instance() { + void getCurrentTask_returns_empty_when_no_interaction_with_instance() { assertThat(underTest.getCurrentTask()).isEmpty(); } @Test - public void do_not_exclude_portfolio_when_indexation_task_lookup_is_disabled() throws Exception { + void do_not_exclude_portfolio_when_indexation_task_lookup_is_disabled() throws Exception { // first call with empty queue to disable indexationTaskLookupEnabled when(queue.peek(anyString(), anyBoolean())).thenReturn(Optional.empty()); assertThat(underTest.call()).isEqualTo(NO_TASK); @@ -642,7 +643,7 @@ public class CeWorkerImplIT { } @Test - public void getCurrentTask_returns_empty_when_a_thread_is_currently_calling_call_but_not_executing_a_task() throws InterruptedException { + void getCurrentTask_returns_empty_when_a_thread_is_currently_calling_call_but_not_executing_a_task() throws InterruptedException { CountDownLatch inCallLatch = new CountDownLatch(1); CountDownLatch assertionsDoneLatch = new CountDownLatch(1); // mock long running peek(String) call => Thread is executing call() but not running a task @@ -671,7 +672,7 @@ public class CeWorkerImplIT { } @Test - public void getCurrentTask_returns_empty_unless_a_thread_is_currently_executing_a_task() throws InterruptedException { + void getCurrentTask_returns_empty_unless_a_thread_is_currently_executing_a_task() throws InterruptedException { CountDownLatch inCallLatch = new CountDownLatch(1); CountDownLatch assertionsDoneLatch = new CountDownLatch(1); String taskType = randomAlphabetic(12); diff --git a/server/sonar-ce/src/test/java/org/sonar/ce/configuration/CeConfigurationRule.java b/server/sonar-ce/src/test/java/org/sonar/ce/configuration/CeConfigurationRule.java index 4ee527cd263..05927a64adf 100644 --- a/server/sonar-ce/src/test/java/org/sonar/ce/configuration/CeConfigurationRule.java +++ b/server/sonar-ce/src/test/java/org/sonar/ce/configuration/CeConfigurationRule.java @@ -26,7 +26,7 @@ import static com.google.common.base.Preconditions.checkArgument; /** * Mutable implementation of {@link CeConfiguration} as {@link org.junit.Rule}. */ -public class CeConfigurationRule extends ExternalResource implements CeConfiguration { +public class CeConfigurationRule implements CeConfiguration { private int workerThreadCount = 1; private int workerCount = 1; private long queuePollingDelay = 2 * 1000L; diff --git a/server/sonar-ce/src/test/java/org/sonar/ce/taskprocessor/CeProcessingSchedulerImplTest.java b/server/sonar-ce/src/test/java/org/sonar/ce/taskprocessor/CeProcessingSchedulerImplTest.java index 721daa8ae2d..3623646d7c2 100644 --- a/server/sonar-ce/src/test/java/org/sonar/ce/taskprocessor/CeProcessingSchedulerImplTest.java +++ b/server/sonar-ce/src/test/java/org/sonar/ce/taskprocessor/CeProcessingSchedulerImplTest.java @@ -70,7 +70,7 @@ public class CeProcessingSchedulerImplTest { // due to risks of infinite chaining of tasks/futures, a timeout is required for safety @Rule public TestRule safeguardTimeout = new DisableOnDebug(Timeout.seconds(60)); - @Rule + public CeConfigurationRule ceConfiguration = new CeConfigurationRule(); private CeWorker ceWorker = mock(CeWorker.class); private CeWorkerFactory ceWorkerFactory = new TestCeWorkerFactory(ceWorker); diff --git a/server/sonar-ce/src/test/java/org/sonar/ce/taskprocessor/CeTaskProcessorRepositoryRule.java b/server/sonar-ce/src/test/java/org/sonar/ce/taskprocessor/CeTaskProcessorRepositoryRule.java index a1d49fd925c..415b0f835d4 100644 --- a/server/sonar-ce/src/test/java/org/sonar/ce/taskprocessor/CeTaskProcessorRepositoryRule.java +++ b/server/sonar-ce/src/test/java/org/sonar/ce/taskprocessor/CeTaskProcessorRepositoryRule.java @@ -23,6 +23,8 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.Set; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.ce.task.CeTask; import org.sonar.ce.task.CeTaskResult; @@ -35,10 +37,16 @@ import static java.util.Objects.requireNonNull; * A {@link org.junit.Rule} that implements the {@link CeTaskProcessorRepository} interface and * requires consumer to explicitly define if a specific Task type has an associated {@link CeTaskProcessor} or not. */ -public class CeTaskProcessorRepositoryRule extends ExternalResource implements CeTaskProcessorRepository { +public class CeTaskProcessorRepositoryRule extends ExternalResource + implements CeTaskProcessorRepository, AfterEachCallback { private final Map index = new HashMap<>(); + @Override + public void afterEach(ExtensionContext extensionContext) throws Exception { + after(); + } + @Override protected void after() { index.clear(); diff --git a/server/sonar-ce/src/test/java/org/sonar/ce/taskprocessor/CeWorkerControllerImplTest.java b/server/sonar-ce/src/test/java/org/sonar/ce/taskprocessor/CeWorkerControllerImplTest.java index 7fc41fc103e..93b8337ae2f 100644 --- a/server/sonar-ce/src/test/java/org/sonar/ce/taskprocessor/CeWorkerControllerImplTest.java +++ b/server/sonar-ce/src/test/java/org/sonar/ce/taskprocessor/CeWorkerControllerImplTest.java @@ -37,7 +37,6 @@ public class CeWorkerControllerImplTest { /** 1 <= workerCount <= 5 */ private int randomWorkerCount = 1 + random.nextInt(5); - @Rule public CeConfigurationRule ceConfigurationRule = new CeConfigurationRule() .setWorkerCount(randomWorkerCount); @Rule diff --git a/server/sonar-process/build.gradle b/server/sonar-process/build.gradle index 86cbfc591f7..63a03012d98 100644 --- a/server/sonar-process/build.gradle +++ b/server/sonar-process/build.gradle @@ -29,7 +29,16 @@ dependencies { testImplementation 'junit:junit' testImplementation 'org.assertj:assertj-core' testImplementation 'org.hamcrest:hamcrest-core' + testImplementation 'org.junit.jupiter:junit-jupiter-api' testImplementation 'org.mockito:mockito-core' testImplementation 'org.awaitility:awaitility' testImplementation project(':sonar-testing-harness') + + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' + testRuntimeOnly 'org.junit.vintage:junit-vintage-engine' +} + +test { + // Enabling the JUnit Platform (see https://github.com/junit-team/junit5-samples/tree/master/junit5-migration-gradle) + useJUnitPlatform() } diff --git a/server/sonar-process/src/test/java/org/sonar/process/LoggingRule.java b/server/sonar-process/src/test/java/org/sonar/process/LoggingRule.java index 3a3896d74b1..194120edaee 100644 --- a/server/sonar-process/src/test/java/org/sonar/process/LoggingRule.java +++ b/server/sonar-process/src/test/java/org/sonar/process/LoggingRule.java @@ -23,12 +23,15 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.joran.spi.JoranException; import java.util.List; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.slf4j.LoggerFactory; import org.slf4j.event.Level; import org.sonar.process.logging.LogbackHelper; -public class LoggingRule extends ExternalResource { +public class LoggingRule extends ExternalResource implements BeforeEachCallback, AfterEachCallback { private final Class loggerClass; @@ -37,12 +40,22 @@ public class LoggingRule extends ExternalResource { } @Override - protected void before() throws Throwable { + public void beforeEach(ExtensionContext extensionContext) throws Exception { + before(); + } + + @Override + protected void before() throws Exception { new LogbackHelper().resetFromXml("/org/sonar/process/logback-test.xml"); TestLogbackAppender.events.clear(); setLevel(Level.INFO); } + @Override + public void afterEach(ExtensionContext extensionContext) throws Exception { + after(); + } + @Override protected void after() { TestLogbackAppender.events.clear(); @@ -88,4 +101,5 @@ public class LoggingRule extends ExternalResource { .filter(e -> e.getLoggerName().equals(loggerClass.getName())) .anyMatch(e -> e.getFormattedMessage().equals(message)); } + } diff --git a/server/sonar-process/src/test/java/org/sonar/process/cluster/health/HealthStateRefresherTest.java b/server/sonar-process/src/test/java/org/sonar/process/cluster/health/HealthStateRefresherTest.java index d0d3e5577b4..8fb7d6ceba6 100644 --- a/server/sonar-process/src/test/java/org/sonar/process/cluster/health/HealthStateRefresherTest.java +++ b/server/sonar-process/src/test/java/org/sonar/process/cluster/health/HealthStateRefresherTest.java @@ -22,8 +22,8 @@ package org.sonar.process.cluster.health; import com.hazelcast.core.HazelcastInstanceNotActiveException; import java.util.Random; import java.util.concurrent.TimeUnit; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.ArgumentCaptor; import org.sonar.process.LoggingRule; @@ -39,9 +39,10 @@ import static org.mockito.Mockito.when; import static org.slf4j.event.Level.DEBUG; import static org.slf4j.event.Level.ERROR; -public class HealthStateRefresherTest { - @Rule - public final LoggingRule logging = new LoggingRule(HealthStateRefresher.class); +class HealthStateRefresherTest { + + @RegisterExtension + private final LoggingRule logging = new LoggingRule(HealthStateRefresher.class); private final Random random = new Random(); private final NodeDetailsTestSupport testSupport = new NodeDetailsTestSupport(random); @@ -52,7 +53,7 @@ public class HealthStateRefresherTest { private final HealthStateRefresher underTest = new HealthStateRefresher(executorService, nodeHealthProvider, sharedHealthState); @Test - public void start_adds_runnable_with_10_second_delay_and_initial_delay_putting_NodeHealth_from_provider_into_SharedHealthState() { + void start_adds_runnable_with_10_second_delay_and_initial_delay_putting_NodeHealth_from_provider_into_SharedHealthState() { ArgumentCaptor runnableCaptor = ArgumentCaptor.forClass(Runnable.class); NodeHealth[] nodeHealths = { testSupport.randomNodeHealth(), @@ -84,7 +85,7 @@ public class HealthStateRefresherTest { } @Test - public void stop_whenCalled_hasNoEffect() { + void stop_whenCalled_hasNoEffect() { underTest.stop(); verify(sharedHealthState).clearMine(); @@ -92,7 +93,7 @@ public class HealthStateRefresherTest { } @Test - public void stop_whenThrowHazelcastInactiveException_shouldSilenceError() { + void stop_whenThrowHazelcastInactiveException_shouldSilenceError() { logging.setLevel(DEBUG); SharedHealthState sharedHealthStateMock = mock(SharedHealthState.class); doThrow(HazelcastInstanceNotActiveException.class).when(sharedHealthStateMock).clearMine(); @@ -104,7 +105,7 @@ public class HealthStateRefresherTest { } @Test - public void start_whenHazelcastIsNotActive_shouldNotLogErrors() { + void start_whenHazelcastIsNotActive_shouldNotLogErrors() { logging.setLevel(DEBUG); doThrow(new HazelcastInstanceNotActiveException()).when(sharedHealthState).writeMine(any()); diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/builtin/BuiltInQProfileRepositoryRule.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/builtin/BuiltInQProfileRepositoryRule.java index 439f1425b23..31e97f472d9 100644 --- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/builtin/BuiltInQProfileRepositoryRule.java +++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/builtin/BuiltInQProfileRepositoryRule.java @@ -27,6 +27,8 @@ import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import org.sonar.api.resources.Language; import org.sonar.api.rule.RuleKey; @@ -35,10 +37,16 @@ import org.sonar.db.rule.RuleDto; import static com.google.common.base.Preconditions.checkState; -public class BuiltInQProfileRepositoryRule extends ExternalResource implements BuiltInQProfileRepository { +public class BuiltInQProfileRepositoryRule extends ExternalResource + implements BuiltInQProfileRepository, BeforeEachCallback { private boolean initializeCalled = false; private List profiles = new ArrayList<>(); + @Override + public void beforeEach(ExtensionContext extensionContext) throws Exception { + before(); + } + @Override protected void before() { this.initializeCalled = false; diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/builtin/BuiltInQProfileLoaderTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/builtin/BuiltInQProfileLoaderTest.java index aded0daba3b..202aee84609 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/builtin/BuiltInQProfileLoaderTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/builtin/BuiltInQProfileLoaderTest.java @@ -19,19 +19,19 @@ */ package org.sonar.server.qualityprofile.builtin; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import static org.assertj.core.api.Assertions.assertThat; -public class BuiltInQProfileLoaderTest { - @Rule - public BuiltInQProfileRepositoryRule builtInQProfileRepositoryRule = new BuiltInQProfileRepositoryRule(); +class BuiltInQProfileLoaderTest { + @RegisterExtension + private final BuiltInQProfileRepositoryRule builtInQProfileRepositoryRule = new BuiltInQProfileRepositoryRule(); - private BuiltInQProfileLoader underTest = new BuiltInQProfileLoader(builtInQProfileRepositoryRule); + private final BuiltInQProfileLoader underTest = new BuiltInQProfileLoader(builtInQProfileRepositoryRule); @Test - public void start_initializes_DefinedQProfileRepository() { + void start_initializes_DefinedQProfileRepository() { underTest.start(); assertThat(builtInQProfileRepositoryRule.isInitialized()).isTrue(); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/BranchFeatureRule.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/BranchFeatureRule.java deleted file mode 100644 index 5e25d007790..00000000000 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/BranchFeatureRule.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2024 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.sonar.server.ui.ws; - -import org.junit.rules.ExternalResource; -import org.sonar.server.branch.BranchFeatureProxy; - -public class BranchFeatureRule extends ExternalResource implements BranchFeatureProxy { - - private boolean enabled; - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - @Override - protected void after() { - reset(); - } - - public void reset() { - this.enabled = false; - } - - @Override - public boolean isEnabled() { - return enabled; - } - -} diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/GlobalActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/GlobalActionTest.java index 26bbb699064..eebd0f7aab8 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/GlobalActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/GlobalActionTest.java @@ -65,7 +65,6 @@ public class GlobalActionTest { private final NodeInformation nodeInformation = mock(NodeInformation.class); private final DbClient dbClient = mock(DbClient.class, RETURNS_DEEP_STUBS); private final IssueIndexSyncProgressChecker indexSyncProgressChecker = mock(IssueIndexSyncProgressChecker.class); - private final BranchFeatureRule branchFeature = new BranchFeatureRule(); private final PlatformEditionProvider editionProvider = mock(PlatformEditionProvider.class); private final WebAnalyticsLoader webAnalyticsLoader = mock(WebAnalyticsLoader.class); private final DefaultAdminCredentialsVerifier defaultAdminCredentialsVerifier = mock(DefaultAdminCredentialsVerifier.class); diff --git a/sonar-ws/src/test/java/org/sonarqube/ws/client/ServiceTester.java b/sonar-ws/src/test/java/org/sonarqube/ws/client/ServiceTester.java deleted file mode 100644 index 2204e2ebaa1..00000000000 --- a/sonar-ws/src/test/java/org/sonarqube/ws/client/ServiceTester.java +++ /dev/null @@ -1,341 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2024 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.ws.client; - -import com.google.protobuf.Parser; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import javax.annotation.concurrent.Immutable; -import org.assertj.core.api.AbstractAssert; -import org.assertj.core.api.Assertions; -import org.assertj.core.data.MapEntry; -import org.junit.rules.ExternalResource; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.spy; - -/** - * Convenient rule to test a subclass of {@link BaseService}. - * - *

- * Declaration sample: - *

- * {@literal @}Rule
- * public ServiceTester serviceTester = new ServiceTester<>(new PermissionsService(mock(WsConnector.class)));
- *
- * private PermissionsService underTest = serviceTester.getInstanceUnderTest();
- * 
- *

- * - *

- * Method {@link #getInstanceUnderTest()} will return an instance of the class under test which will be instrumented - * and will allow recording internal calls to {@link BaseService#call(BaseRequest, Parser)} and - * {@link BaseService#call(WsRequest)}. - *

- *

- * Argument of calls to these method will be logged and can be accessed through {@link #getGetCalls()}, {@link #getPostCalls()} - * and {@link #getRawCalls()} depending on whether they are made respectively with {@link GetRequest}, {@link PostRequest} - * or other subclass of {@link BaseRequest}. - *

- *

- * For convenience, when one is testing a single Ws call, on case use {@link #getGetRequest()} (and its associated - * {@link #getGetParser()}) or {@link #getPostRequest()} (and its associated {@link #getPostParser()}). Those three - * method will make the appropriate assertions assuming that only a single GET (or POST) request has been made. - *

- *

- * Last but not least, to easily verify the content of a {@link GetRequest} (or a {@link PostRequest}), one can use - * methods {@link #assertThat(GetRequest)} (or {@link #assertThat(PostRequest)}) to write assertions on a - * {@link GetRequest} (or {@link PostRequest}) returned by methods of this Rule. - *

- * - *

- * Assertion usage sample: - *

- * PostRequest postRequest = serviceTester.getPostRequest();
- * serviceTester.assertThat(postRequest)
- * .hasPath("add_group")
- * .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
- * .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
- * .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
- * .hasParam(PARAM_GROUP_ID, GROUP_ID_VALUE)
- * .hasParam(PARAM_GROUP_NAME, GROUP_NAME_VALUE)
- * .andNoOtherParam();
- * 
- *

- * - */ -public class ServiceTester extends ExternalResource { - - private final T underTest; - private final List getCalls = new ArrayList<>(); - private final List postCalls = new ArrayList<>(); - private final List rawCalls = new ArrayList<>(); - - /** - * @param underTestInstance an instance of the type to test. Use {@link #getInstanceUnderTest()} to retrieve the - * instrumented instance to use in your test. - */ - public ServiceTester(T underTestInstance) { - this.underTest = spy(underTestInstance); - } - - @Override - protected void before() throws Throwable { - Answer answer = new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - Object[] arguments = invocation.getArguments(); - Object request = arguments[0]; - Parser parser = arguments.length == 2 ? (Parser) arguments[1] : null; - if (request instanceof PostRequest) { - postCalls.add(new PostCall((PostRequest) request, parser)); - } else if (request instanceof GetRequest) { - getCalls.add(new GetCall((GetRequest) request, parser)); - } else { - rawCalls.add(new RawCall((WsRequest) request)); - } - return null; - } - }; - doAnswer(answer).when(this.underTest).call(any(GetRequest.class), any(Parser.class)); - doAnswer(answer).when(this.underTest).call(any(WsRequest.class)); - } - - @Override - protected void after() { - this.getCalls.clear(); - } - - public T getInstanceUnderTest() { - return underTest; - } - - public List getGetCalls() { - return getCalls; - } - - @CheckForNull - public GetRequest getGetRequest() { - assertSingleGetCall(); - return (GetRequest) getCalls.iterator().next().getRequest(); - } - - public RequestAssert assertThat(GetRequest getRequest) { - return new RequestAssert<>(getRequest); - } - - public RequestAssert assertThat(PostRequest postRequest) { - return new RequestAssert<>(postRequest); - } - - @CheckForNull - public Parser getGetParser() { - assertSingleGetCall(); - return getCalls.iterator().next().getParser(); - } - - public List getPostCalls() { - return postCalls; - } - - public PostRequest getPostRequest() { - assertSinglePostCall(); - return (PostRequest) postCalls.iterator().next().getRequest(); - } - - @CheckForNull - public Parser getPostParser() { - assertSinglePostCall(); - return postCalls.iterator().next().getParser(); - } - - private void assertSingleGetCall() { - Assertions.assertThat(getCalls).hasSize(1); - Assertions.assertThat(postCalls).isEmpty(); - Assertions.assertThat(rawCalls).isEmpty(); - } - - private void assertSinglePostCall() { - Assertions.assertThat(postCalls).hasSize(1); - Assertions.assertThat(getRawCalls()).isEmpty(); - Assertions.assertThat(rawCalls).isEmpty(); - } - - public List getRawCalls() { - return rawCalls; - } - - @Immutable - public static final class GetCall extends CallWithParser> { - - public GetCall(GetRequest getRequest, @Nullable Parser parser) { - super(getRequest, parser); - } - - } - - @Immutable - public static final class PostCall extends CallWithParser> { - - public PostCall(PostRequest postRequest, @Nullable Parser parser) { - super(postRequest, parser); - } - } - - @Immutable - public static final class RawCall { - private final WsRequest wsRequest; - - public RawCall(WsRequest wsRequest) { - this.wsRequest = wsRequest; - } - - public WsRequest getWsRequest() { - return wsRequest; - } - - @Override - public boolean equals(@Nullable Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - RawCall rawCalls = (RawCall) o; - return Objects.equals(wsRequest, rawCalls.wsRequest); - } - - @Override - public int hashCode() { - return Objects.hash(wsRequest); - } - } - - public static abstract class CallWithParser> { - private final T request; - private final Parser parser; - - public CallWithParser(T request, @Nullable Parser parser) { - this.request = request; - this.parser = parser; - } - - public T getRequest() { - return request; - } - - public Parser getParser() { - return parser; - } - - @Override - public boolean equals(@Nullable Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - CallWithParser getCall = (CallWithParser) o; - return Objects.equals(request, getCall.request) && - Objects.equals(parser, getCall.request); - } - - @Override - public int hashCode() { - return Objects.hash(request, parser); - } - } - - public final class RequestAssert> extends AbstractAssert, BaseRequest> { - private final List> assertedParams = new ArrayList<>(); - - protected RequestAssert(T actual) { - super(actual, RequestAssert.class); - } - - public RequestAssert hasPath(String path) { - isNotNull(); - - String expectedPath = underTest.controller + "/" + path; - if (!Objects.equals(actual.getPath(), expectedPath)) { - failWithMessage("Expected path to be <%s> but was <%s>", expectedPath, actual.getPath()); - } - - return this; - } - - public RequestAssert hasParam(String key, String value) { - isNotNull(); - - MapEntry entry = MapEntry.entry(key, value); - Assertions.assertThat(actual.getParams()).contains(entry); - this.assertedParams.add(entry); - - return this; - } - - public RequestAssert hasParam(String key, int value) { - isNotNull(); - - MapEntry entry = MapEntry.entry(key, String.valueOf(value)); - Assertions.assertThat(actual.getParams()).contains(entry); - this.assertedParams.add(entry); - - return this; - } - - public RequestAssert hasParam(String key, boolean value) { - isNotNull(); - - MapEntry entry = MapEntry.entry(key, String.valueOf(value)); - Assertions.assertThat(actual.getParams()).contains(entry); - this.assertedParams.add(entry); - - return this; - } - - public RequestAssert hasParam(String key, List values) { - isNotNull(); - - MapEntry entry = MapEntry.entry(key, values.toString()); - Assertions.assertThat(actual.getParameters().getValues(key)).containsExactly(values.toArray(new String[0])); - this.assertedParams.add(entry); - - return this; - } - - public RequestAssert andNoOtherParam() { - isNotNull(); - - Assertions.assertThat(actual.getParams()).hasSize(assertedParams.size()); - - return this; - } - - } -}