From 29b0c61d603c7492b46fdbf4d8c2be39a952c672 Mon Sep 17 00:00:00 2001 From: ikoleva Date: Thu, 9 Sep 2021 19:11:25 +0300 Subject: [PATCH 1/3] pipelines-control-service: upgrade JUnit 4 to JUnit 5 A part of the unit tests were not triggered on test phase, due to tests runner discrepancies. As a result of that, some tests were not accurate due to code evolution, therefore failed after they got enabled. Added base module transitive junit dependencies explicitly, for visibility. Migrated in a consistent manner all unit and integration tests to JUnit 5. Tests fixed: * JobsServiceTest - repository usage changes * JobImageBuilderTest - container privileged false * JobExecutionServiceStartExecutionIT - map properties order fix, operationContext.getUser() duplication in jobExecutionRequest Testing Done: run unit tests, need to verify integration tests Signed-off-by: ikoleva --- .../pipelines_control_service/build.gradle | 7 +- .../taurus/datajobs/it/DataJobCrudIT.java | 37 ++- .../datajobs/it/DataJobDeploymentCrudIT.java | 44 ++- .../taurus/datajobs/it/DataJobGraphQLIT.java | 6 +- .../datajobs/it/DataJobPropertiesIT.java | 13 +- .../it/DataJobTerminationStatusIT.java | 23 +- .../taurus/datajobs/it/common/BaseIT.java | 10 +- .../vmware/taurus/service/JobsService.java | 3 + .../com/vmware/taurus/RepositoryUtil.java | 6 +- .../java/com/vmware/taurus/TestIOUtils.java | 2 +- .../taurus/datajobs/DataJobsControllerIT.java | 251 +++++++++--------- .../datajobs/DataJobsControllerTest.java | 2 +- .../datajobs/DataJobsSourcesControllerIT.java | 18 +- .../JobExecutionServiceStartExecutionIT.java | 33 ++- .../service/JobExecutionRepositoryIT.java | 37 ++- .../taurus/service/JobsRepositoryIT.java | 23 +- .../taurus/service/JobsServiceTest.java | 93 ++++--- .../KubernetesServiceIsRunningJobTest.java | 6 +- ...esServiceStartNewCronJobExecutionTest.java | 27 +- .../taurus/service/KubernetesServiceTest.java | 102 +++---- .../JobCredentialsServiceTest.java | 6 +- .../KerberosCredentialsServiceTestManual.java | 13 +- .../service/deploy/DeploymentServiceTest.java | 15 +- .../service/deploy/JobImageBuilderTest.java | 29 +- .../service/deploy/JobImageDeployerTest.java | 19 +- .../service/deploy/VdkOptionsReaderTest.java | 27 +- .../notification/DataJobNotificationTest.java | 2 +- .../notification/NotificationContentTest.java | 39 ++- .../versions-of-external-dependencies.gradle | 2 + 29 files changed, 441 insertions(+), 454 deletions(-) diff --git a/projects/control-service/projects/pipelines_control_service/build.gradle b/projects/control-service/projects/pipelines_control_service/build.gradle index 130c707f92..d740afec11 100644 --- a/projects/control-service/projects/pipelines_control_service/build.gradle +++ b/projects/control-service/projects/pipelines_control_service/build.gradle @@ -65,7 +65,6 @@ dependencies { // Implementation dependencies are found on compile classpath of implementation versions.'net.javacrumbs.shedlock:shedlock-provider-jdbc-template' - testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' testImplementation versions.'com.mmnaseri.utils:spring-data-mock' @@ -75,6 +74,8 @@ dependencies { // Implementation dependencies are found on compile classpath of testImplementation versions.'org.testcontainers:testcontainers' testImplementation versions.'org.springframework.security.kerberos:spring-security-kerberos-test' testImplementation versions.'org.awaitility:awaitility' + testImplementation 'org.junit.jupiter:junit-jupiter-api' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' // transitive dependencies version force @@ -113,10 +114,12 @@ test { testSets { integrationTest { dirName = 'integration-test' } + tasks.integrationTest { useJUnitPlatform() } } configurations { - runtime.exclude group: "javax.servlet", module: "servlet-api" //exclude Servlet 2 (comes as transitive dependency from remotefs module) + runtime.exclude group: "javax.servlet", module: "servlet-api" + //exclude Servlet 2 (comes as transitive dependency from remotefs module) runtime.exclude group: "org.slf4j", module: "slf4j-log4j12" //log4j and slf4j cannot co-exist } diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobCrudIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobCrudIT.java index 59f6885384..4e9cf8f651 100644 --- a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobCrudIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobCrudIT.java @@ -11,22 +11,17 @@ import com.vmware.taurus.service.credentials.JobCredentialsService; import com.vmware.taurus.service.model.DataJob; import org.apache.commons.lang3.ArrayUtils; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -// TODO: move to junit 5 -@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = ControlplaneApplication.class) public class DataJobCrudIT extends BaseIT { @@ -48,7 +43,7 @@ public void testDataJobCrud() throws Exception { lambdaMatcher(s -> s.endsWith(String.format("/data-jobs/for-team/%s/jobs/%s", TEST_TEAM_NAME, TEST_JOB_NAME))))); //Validate - the job is created - Assert.assertTrue(jobsRepository.existsById(TEST_JOB_NAME)); + Assertions.assertTrue(jobsRepository.existsById(TEST_JOB_NAME)); // Execute create job with no user mockMvc.perform(post(String.format("/data-jobs/for-team/%s/jobs", TEST_TEAM_NAME)) @@ -68,15 +63,15 @@ public void testDataJobCrud() throws Exception { // Validate keytab created var keytabSecretName = JobCredentialsService.getJobKeytabKubernetesSecretName(TEST_JOB_NAME); var keytabSecretData = dataJobsKubernetesService.getSecretData(keytabSecretName); - Assert.assertFalse(keytabSecretData.isEmpty()); - Assert.assertTrue(keytabSecretData.containsKey("keytab")); - Assert.assertTrue(ArrayUtils.isNotEmpty(keytabSecretData.get("keytab"))); + Assertions.assertFalse(keytabSecretData.isEmpty()); + Assertions.assertTrue(keytabSecretData.containsKey("keytab")); + Assertions.assertTrue(ArrayUtils.isNotEmpty(keytabSecretData.get("keytab"))); // Validate persisted job var jobFromDbOptional= jobsRepository.findById(TEST_JOB_NAME); - Assert.assertTrue(jobFromDbOptional.isPresent()); + Assertions.assertTrue(jobFromDbOptional.isPresent()); var jobFromDb = jobFromDbOptional.get(); - Assert.assertEquals(TEST_JOB_SCHEDULE, jobFromDb.getJobConfig().getSchedule()); + Assertions.assertEquals(TEST_JOB_SCHEDULE, jobFromDb.getJobConfig().getSchedule()); // Execute list jobs // deprecated jobsList in favour of jobsQuery @@ -183,10 +178,10 @@ public void testDataJobCrud() throws Exception { // Validate keytab deleted keytabSecretData = dataJobsKubernetesService.getSecretData(keytabSecretName); - Assert.assertTrue(keytabSecretData.isEmpty()); + Assertions.assertTrue(keytabSecretData.isEmpty()); // Validate job deleted from db - Assert.assertFalse(jobsRepository.existsById(TEST_JOB_NAME)); + Assertions.assertFalse(jobsRepository.existsById(TEST_JOB_NAME)); testDataJobPostDeleteWebHooks(); } @@ -201,7 +196,7 @@ private void testDataJobPostCreateWebHooks() throws Exception { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()); // Validate - the job is NOT created - Assert.assertFalse(jobsRepository.existsById(TEST_CLIENT_ERROR_JOB_NAME)); + Assertions.assertFalse(jobsRepository.existsById(TEST_CLIENT_ERROR_JOB_NAME)); // Post Create WebHook will prevent job creation and the result will be error 503 with no job created String internalServerErrorDataJobRequestBody = getDataJobRequestBody(TEST_INTERNAL_ERROR_TEAM, @@ -212,7 +207,7 @@ private void testDataJobPostCreateWebHooks() throws Exception { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isServiceUnavailable()); // Validate - the job is NOT created - Assert.assertFalse(jobsRepository.existsById(TEST_INTERNAL_ERROR_JOB_NAME)); + Assertions.assertFalse(jobsRepository.existsById(TEST_INTERNAL_ERROR_JOB_NAME)); // Post Create WebHook will retry 2 times and finally will allow job creation String retriedErrorDataJobRequestBody = getDataJobRequestBody(TEST_INTERNAL_ERROR_RETRIED_TEAM, @@ -223,7 +218,7 @@ private void testDataJobPostCreateWebHooks() throws Exception { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isCreated()); // Validate - the job is created - Assert.assertTrue(jobsRepository.existsById(TEST_INTERNAL_ERROR_RETRIED_JOB_NAME)); + Assertions.assertTrue(jobsRepository.existsById(TEST_INTERNAL_ERROR_RETRIED_JOB_NAME)); } private void testDataJobPostDeleteWebHooks() throws Exception { @@ -238,7 +233,7 @@ private void testDataJobPostDeleteWebHooks() throws Exception { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()); // Validate - the job is NOT deleted - Assert.assertTrue(jobsRepository.existsById(TEST_CLIENT_ERROR_JOB_NAME)); + Assertions.assertTrue(jobsRepository.existsById(TEST_CLIENT_ERROR_JOB_NAME)); //Clean Up jobsRepository.delete(clientErrorEntity); @@ -253,7 +248,7 @@ private void testDataJobPostDeleteWebHooks() throws Exception { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isServiceUnavailable()); // Validate - the job is NOT deleted - Assert.assertTrue(jobsRepository.existsById(TEST_INTERNAL_ERROR_JOB_NAME)); + Assertions.assertTrue(jobsRepository.existsById(TEST_INTERNAL_ERROR_JOB_NAME)); //Clean Up jobsRepository.delete(internalServerEntity); @@ -268,7 +263,7 @@ private void testDataJobPostDeleteWebHooks() throws Exception { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); // Validate - the job is deleted - Assert.assertFalse(jobsRepository.existsById(TEST_INTERNAL_ERROR_RETRIED_JOB_NAME)); + Assertions.assertFalse(jobsRepository.existsById(TEST_INTERNAL_ERROR_RETRIED_JOB_NAME)); //Clean Up jobsRepository.delete(internalServerEntity); } diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobDeploymentCrudIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobDeploymentCrudIT.java index 5db7e4b43b..d5f59ebbfa 100644 --- a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobDeploymentCrudIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobDeploymentCrudIT.java @@ -14,12 +14,11 @@ import com.vmware.taurus.service.model.JobDeploymentStatus; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.io.IOUtils; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.platform.commons.util.StringUtils; -import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; @@ -29,7 +28,6 @@ import org.springframework.core.task.TaskExecutor; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MvcResult; import java.util.Optional; @@ -40,8 +38,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -// TODO: move to junit 5 -@RunWith(SpringRunner.class) @Import({DataJobDeploymentCrudIT.TaskExecutorConfig.class}) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = ControlplaneApplication.class) public class DataJobDeploymentCrudIT extends BaseIT { @@ -63,7 +59,7 @@ public TaskExecutor taskExecutor() { } - @Before + @BeforeEach public void setup() throws Exception { String dataJobRequestBody = getDataJobRequestBody(TEST_TEAM_NAME, TEST_JOB_NAME); @@ -105,10 +101,10 @@ public void testDataJobDeploymentCrud() throws Exception { DataJobVersion testDataJobVersion = new ObjectMapper() .readValue(jobUploadResult.getResponse().getContentAsString(), DataJobVersion.class); - Assert.assertNotNull(testDataJobVersion); + Assertions.assertNotNull(testDataJobVersion); String testJobVersionSha = testDataJobVersion.getVersionSha(); - Assert.assertFalse(StringUtils.isBlank(testJobVersionSha)); + Assertions.assertFalse(StringUtils.isBlank(testJobVersionSha)); // Setup String dataJobDeploymentRequestBody = getDataJobDeploymentRequestBody(testJobVersionSha); @@ -145,13 +141,13 @@ public void testDataJobDeploymentCrud() throws Exception { String jobDeploymentName = JobImageDeployer.getCronJobName(TEST_JOB_NAME); // Verify job deployment created Optional cronJobOptional = dataJobsKubernetesService.readCronJob(jobDeploymentName); - Assert.assertTrue(cronJobOptional.isPresent()); + Assertions.assertTrue(cronJobOptional.isPresent()); JobDeploymentStatus cronJob = cronJobOptional.get(); - Assert.assertEquals(testJobVersionSha, cronJob.getGitCommitSha()); - Assert.assertEquals(DataJobMode.RELEASE.toString(), cronJob.getMode()); - Assert.assertEquals(true, cronJob.getEnabled()); - Assert.assertTrue(cronJob.getImageName().endsWith(testJobVersionSha)); - Assert.assertEquals("user", cronJob.getLastDeployedBy()); + Assertions.assertEquals(testJobVersionSha, cronJob.getGitCommitSha()); + Assertions.assertEquals(DataJobMode.RELEASE.toString(), cronJob.getMode()); + Assertions.assertEquals(true, cronJob.getEnabled()); + Assertions.assertTrue(cronJob.getImageName().endsWith(testJobVersionSha)); + Assertions.assertEquals("user", cronJob.getLastDeployedBy()); // Execute get job deployment with no user mockMvc.perform(get(String.format("/data-jobs/for-team/%s/jobs/%s/deployments/%s", @@ -183,9 +179,9 @@ public void testDataJobDeploymentCrud() throws Exception { // Verify response DataJobDeploymentStatus jobDeployment = mapper.readValue(result.getResponse().getContentAsString(), DataJobDeploymentStatus.class); - Assert.assertEquals(testJobVersionSha, jobDeployment.getJobVersion()); - Assert.assertEquals(DataJobMode.RELEASE, jobDeployment.getMode()); - Assert.assertEquals(true, jobDeployment.getEnabled()); + Assertions.assertEquals(testJobVersionSha, jobDeployment.getJobVersion()); + Assertions.assertEquals(DataJobMode.RELEASE, jobDeployment.getMode()); + Assertions.assertEquals(true, jobDeployment.getEnabled()); // Execute disable deployment no user mockMvc.perform(patch(String.format("/data-jobs/for-team/%s/jobs/%s/deployments/%s", @@ -218,9 +214,9 @@ public void testDataJobDeploymentCrud() throws Exception { // Verify deployment disabled cronJobOptional = dataJobsKubernetesService.readCronJob(jobDeploymentName); - Assert.assertTrue(cronJobOptional.isPresent()); + Assertions.assertTrue(cronJobOptional.isPresent()); cronJob = cronJobOptional.get(); - Assert.assertEquals(false, cronJob.getEnabled()); + Assertions.assertEquals(false, cronJob.getEnabled()); // Execute delete deployment with no user mockMvc.perform(delete(String.format("/data-jobs/for-team/%s/jobs/%s/deployments/%s", @@ -252,10 +248,10 @@ public void testDataJobDeploymentCrud() throws Exception { // Verify deployment deleted cronJobOptional = dataJobsKubernetesService.readCronJob(jobDeploymentName); - Assert.assertTrue(cronJobOptional.isEmpty()); + Assertions.assertTrue(cronJobOptional.isEmpty()); } - @After + @AfterEach public void cleanUp() throws Exception { mockMvc.perform(delete(String.format("/data-jobs/for-team/%s/jobs/%s/sources", TEST_TEAM_NAME, diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobGraphQLIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobGraphQLIT.java index b1e76d50e9..641dfd6f22 100644 --- a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobGraphQLIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobGraphQLIT.java @@ -7,13 +7,11 @@ import com.vmware.taurus.ControlplaneApplication; import com.vmware.taurus.datajobs.it.common.BaseIT; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.ResultActions; import static org.hamcrest.Matchers.greaterThan; @@ -22,8 +20,6 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -// TODO: move to junit 5 -@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = ControlplaneApplication.class) public class DataJobGraphQLIT extends BaseIT { diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobPropertiesIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobPropertiesIT.java index 94cc5e8a37..46eab6219f 100644 --- a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobPropertiesIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobPropertiesIT.java @@ -8,18 +8,11 @@ import com.vmware.taurus.ControlplaneApplication; import com.vmware.taurus.datajobs.it.common.BaseIT; import com.vmware.taurus.properties.service.PropertiesRepository; -import com.vmware.taurus.service.JobsRepository; -import com.vmware.taurus.service.credentials.JobCredentialsService; -import com.vmware.taurus.service.model.DataJob; -import org.apache.commons.lang3.ArrayUtils; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; import java.util.HashMap; @@ -27,9 +20,6 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -// TODO: move to junit 5 -@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = ControlplaneApplication.class) public class DataJobPropertiesIT extends BaseIT { @@ -71,5 +61,4 @@ public void testDataJobProperties() throws Exception { } - } diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobTerminationStatusIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobTerminationStatusIT.java index 47c6a46bae..b31d85dcf4 100644 --- a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobTerminationStatusIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobTerminationStatusIT.java @@ -15,9 +15,8 @@ import com.vmware.taurus.service.model.JobDeploymentStatus; import io.kubernetes.client.ApiException; import org.apache.commons.io.IOUtils; -import org.junit.After; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.autoconfigure.actuate.metrics.AutoConfigureMetrics; @@ -30,7 +29,6 @@ import org.springframework.core.task.TaskExecutor; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MvcResult; import java.util.List; @@ -43,16 +41,13 @@ import java.util.stream.Collectors; import static org.awaitility.Awaitility.await; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -// TODO: move to junit 5 @AutoConfigureMetrics -@RunWith(SpringRunner.class) @Import({DataJobTerminationStatusIT.TaskExecutorConfig.class}) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = ControlplaneApplication.class) public class DataJobTerminationStatusIT extends BaseIT { @@ -214,7 +209,9 @@ public void testDataJobTerminationStatus() throws Exception { // Validate that all metrics for the executed data job are correctly exposed // First, validate that there is a taurus_datajob_info metrics for the data job var match = findMetricsWithLabel(scrape, INFO_METRICS, "data_job", SIMPLE_JOB_NAME); - assertTrue(String.format("Could not find %s metrics for the data job %s", INFO_METRICS, SIMPLE_JOB_NAME), match.isPresent()); + assertTrue(match.isPresent(), + String.format("Could not find %s metrics for the data job %s", + INFO_METRICS, SIMPLE_JOB_NAME)); // Validate the labels of the taurus_datajob_info metrics String line = match.get(); @@ -225,7 +222,9 @@ public void testDataJobTerminationStatus() throws Exception { // Validate that there is a taurus_datajob_info metrics for the data job match = findMetricsWithLabel(scrape, TERMINATION_STATUS_METRICS, "data_job", SIMPLE_JOB_NAME); - assertTrue(String.format("Could not find %s metrics for the data job %s", TERMINATION_STATUS_METRICS, SIMPLE_JOB_NAME), match.isPresent()); + assertTrue(match.isPresent(), + String.format("Could not find %s metrics for the data job %s", + TERMINATION_STATUS_METRICS, SIMPLE_JOB_NAME)); // Validate that the metrics has a value of 0.0 (i.e. Success) System.out.println(match.get().trim()); @@ -236,7 +235,7 @@ public void testDataJobTerminationStatus() throws Exception { checkDataJobExecutionStatus(executionId, DataJobExecution.StatusEnum.FINISHED, opId); } - @After + @AfterEach public void cleanup() throws Exception { log.info("Cleaning up deployments"); @@ -299,7 +298,7 @@ private static Optional findMetricsWithLabel(CharSequence input, String private static void assertLabelEquals(String metrics, String expectedValue, String label, String line) { // Label value is captured in the first regex group Matcher matcher = Pattern.compile(String.format(".*%s=\"([^\"]*)\".*", label), Pattern.CASE_INSENSITIVE).matcher(line); - assertTrue(String.format("The metrics %s does not have a matching label %s", metrics, label), matcher.find()); + assertTrue(matcher.find(), String.format("The metrics %s does not have a matching label %s", metrics, label)); String actualValue = matcher.group(1); assertEquals(String.format("The metrics %s does not have correct value for label %s. Expected: %s, Actual: %s", metrics, label, expectedValue, actualValue), diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/BaseIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/BaseIT.java index 326d2fb661..e8cf0d5b82 100644 --- a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/BaseIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/BaseIT.java @@ -18,8 +18,9 @@ import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Matcher; -import org.junit.After; -import org.junit.Before; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockserver.client.server.MockServerClient; import org.mockserver.integration.ClientAndServer; import org.mockserver.model.Header; @@ -50,7 +51,6 @@ import static org.mockserver.model.HttpResponse.response; import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; -// TODO: move to junit 5 @AutoConfigureMockMvc @ActiveProfiles({"test", "MockDecoder"}) @Import({BaseIT.KerberosConfig.class}) @@ -121,7 +121,7 @@ public KerberosCredentialsRepository credentialsRepository(){ private ClientAndServer mockWebHookServer; private MockServerClient mockWebHookServerClient; - @Before + @BeforeEach public void before() throws Exception { this.getConf().getProperty("featureflag.security.enabled"); mockMvc = MockMvcBuilders @@ -333,7 +333,7 @@ private HttpResponse getInternalServerErrorResponse() { .withBody("{ \"message\": \"Internal Server Error\" }"); } - @After + @AfterEach public void after() { if (ownsDataJobsNamespace) { try { diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/JobsService.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/JobsService.java index 4a5de27955..5f064757bb 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/JobsService.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/JobsService.java @@ -24,6 +24,7 @@ import org.springframework.stereotype.Service; import java.util.List; +import java.util.Objects; import java.util.Optional; /** @@ -88,6 +89,8 @@ public JobOperationResult deleteJob(String name) { * In addition it will contain WebHookResult in case the WebHookRequest returns 4xx error. */ public JobOperationResult createJob(DataJob jobInfo) { + Objects.requireNonNull(jobInfo); + Objects.requireNonNull(jobInfo.getJobConfig()); if (jobsRepository.existsById(jobInfo.getName())) { return JobOperationResult.builder() .completed(false) diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/RepositoryUtil.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/RepositoryUtil.java index b109a0b5e0..23d261da28 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/RepositoryUtil.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/RepositoryUtil.java @@ -8,11 +8,11 @@ import com.vmware.taurus.service.JobExecutionRepository; import com.vmware.taurus.service.JobsRepository; import com.vmware.taurus.service.model.*; -import org.junit.Assert; +import org.junit.jupiter.api.Assertions; import java.time.OffsetDateTime; -public class RepositoryUtil { +public final class RepositoryUtil { public static DataJob createDataJob(JobsRepository jobsRepository) { JobConfig config = new JobConfig(); @@ -20,7 +20,7 @@ public static DataJob createDataJob(JobsRepository jobsRepository) { config.setTeam("test-team"); var expectedJob = new DataJob("test-job", config, DeploymentStatus.NONE); var actualJob = jobsRepository.save(expectedJob); - Assert.assertEquals(expectedJob, actualJob); + Assertions.assertEquals(expectedJob, actualJob); return actualJob; } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/TestIOUtils.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/TestIOUtils.java index 362a096ced..5a79087554 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/TestIOUtils.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/TestIOUtils.java @@ -13,7 +13,7 @@ import java.nio.file.Files; import java.nio.file.Path; -public class TestIOUtils { +public final class TestIOUtils { public static void compareDirectories(File expectedDirectory, File actualDirectory) throws IOException { Files.walk(expectedDirectory.toPath()) diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/datajobs/DataJobsControllerIT.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/datajobs/DataJobsControllerIT.java index 000c53535f..251548fc40 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/datajobs/DataJobsControllerIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/datajobs/DataJobsControllerIT.java @@ -11,8 +11,7 @@ import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Matcher; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; @@ -20,7 +19,6 @@ import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import java.net.URLDecoder; @@ -28,137 +26,136 @@ import java.util.UUID; import java.util.function.Predicate; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @ActiveProfiles({"MockKubernetes", "MockKerberos", "unittest", "MockGit", "MockTelemetry"}) -@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK, classes = ControlplaneApplication.class) @AutoConfigureMockMvc public class DataJobsControllerIT { - // team name can have spaces in it so we are purposefully using one with space - private static final String TEST_TEAM_NAME = "test team"; - private static final String TEST_JOB_NAME = "test-job"; - private static final String TEST_TEAM_WRONG_NAME = "test-example-team"; - - @Autowired - private MockMvc mockMvc; - - private final ObjectMapper mapper = new ObjectMapper(); - - - private Matcher lambdaMatcher(Predicate predicate) { - return new BaseMatcher() { - @Override - public boolean matches(Object actual) { - return predicate.test((String) actual); - } - - @Override - public void describeTo(Description description) { - description.appendText("failed to match predicate"); - } - }; - }; - - @Test - @WithMockUser - public void testDataJobCrud() throws Exception { - var job = TestUtils.getDataJob(TEST_TEAM_NAME, TEST_JOB_NAME); - - String body = mapper.writeValueAsString(job); - String expectedLocationPath = String.format("/data-jobs/for-team/%s/jobs/%s", TEST_TEAM_NAME, TEST_JOB_NAME); - mockMvc.perform(post(String.format("/data-jobs/for-team/%s/jobs", TEST_TEAM_NAME)) - .content(body).contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isCreated()) - .andExpect(header().string(HttpHeaders.LOCATION, - lambdaMatcher(s -> URLDecoder.decode(s, Charset.defaultCharset()).endsWith(expectedLocationPath)))); - // deprecated jobsList in favour of jobsQuery - mockMvc.perform(get(String.format("/data-jobs/for-team/%s", TEST_TEAM_NAME))) - .andExpect(status().isOk()).andExpect(content().string(lambdaMatcher(s -> s.contains(TEST_JOB_NAME)))); - mockMvc.perform(get(String.format("/data-jobs/for-team/%s/jobs/%s", TEST_TEAM_NAME, TEST_JOB_NAME))) - .andExpect(status().isOk()).andExpect(content().string(lambdaMatcher(s -> s.contains(TEST_JOB_NAME)))) - .andExpect(content().string(lambdaMatcher(s -> s.contains(job.getConfig().getSchedule().getScheduleCron())))); - mockMvc.perform(delete(String.format("/data-jobs/for-team/%s/jobs/%s", TEST_TEAM_NAME, TEST_JOB_NAME)) - .contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()); - } - - @Test - @WithMockUser - public void testDataJobDeployTelemetry() throws Exception { - MockTelemetry.payloads.clear(); - var job = TestUtils.getDataJob(TEST_TEAM_NAME, "deployment-job"); - - String body = mapper.writeValueAsString(job); - mockMvc.perform(post(String.format("/data-jobs/for-team/%s/jobs", TEST_TEAM_NAME)) - .content(body).contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isCreated()); - - var jobDeployment = TestUtils.getDataJobDeployment("prod", "1"); - - mockMvc.perform(post( String.format("/data-jobs/for-team/%s/jobs/%s/deployments", TEST_TEAM_NAME, "deployment-job")) - .content(mapper.writeValueAsString(jobDeployment)) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isAccepted()); - // checking if httptrace table is updated correctly with http trace info - var httpTraceTelemetry = MockTelemetry.payloads.stream() - .filter(p -> p.contains("taurus_httptrace") && p.contains("/data-jobs/for-team/{team_name}/jobs/{job_name}/deployments")).findFirst(); - // checking if taurus_api_call is updated with DeploymentProgress as specified by Measurable annotation - var deployProgressTelemetry = MockTelemetry.payloads.stream() - .filter(p -> p.contains("taurus_api_call") && p.contains("DeploymentProgress") && p.contains("completed")).findFirst(); - - assertTrue("Did not find expected http trace telemetry. See all payloads: " + MockTelemetry.payloads, - httpTraceTelemetry.isPresent()); - assertTrue("Did not find expected deploy progress telemetry. See all payloads: " + MockTelemetry.payloads, - deployProgressTelemetry.isPresent()); - } - - /** - * Tests if parameter validation in {@link DataJobsController} works correctly integrated with - * {@link com.vmware.taurus.exception.ExceptionControllerAdvice} - * - *

- * The test doesn't aim to cover all types of parameter validation - that's for the unit tests. This test - * confirms that that validation works end-to-end and the user gets a 400 response in case of validation issue. - */ - @Test - @WithMockUser - public void testParameterValidation() throws Exception { - // deprecated jobsList in favour of jobsQuery - mockMvc.perform(get(String.format("/data-jobs/for-team/%s?page_number=-1", TEST_TEAM_NAME))) - .andExpect(status().isBadRequest()) - .andExpect(content().string(lambdaMatcher(s -> s.contains("page_number")))); - } - - @Test - @WithMockUser - public void testDownloadKeytab() throws Exception { - DataJob job = TestUtils.getDataJob(TEST_TEAM_NAME, "job-" + UUID.randomUUID().toString().toLowerCase()); - String downloadKeytabPath = String.format("/data-jobs/for-team/%s/jobs/%s/keytab", - TEST_TEAM_NAME, - job.getJobName()); - mockMvc.perform(get(downloadKeytabPath)).andExpect(status().isNotFound()); - - String body = mapper.writeValueAsString(job); - mockMvc.perform(post(String.format("/data-jobs/for-team/%s/jobs", TEST_TEAM_NAME)) - .content(body) - .contentType(MediaType.APPLICATION_JSON)); - - mockMvc.perform(get(String.format("/data-jobs/for-team/%s/jobs/%s/keytab", - TEST_TEAM_WRONG_NAME, - job.getJobName()))).andExpect(status().isNotFound()); - - byte[] keytab = downloadPath(downloadKeytabPath); - byte[] keytabAgain = downloadPath(downloadKeytabPath); - - assertArrayEquals(keytab, keytabAgain); - } - - private byte[] downloadPath(String path) throws Exception { - return mockMvc.perform(get(path)).andExpect(status().isOk()).andReturn().getResponse().getContentAsByteArray(); - } + // team name can have spaces in it so we are purposefully using one with space + private static final String TEST_TEAM_NAME = "test team"; + private static final String TEST_JOB_NAME = "test-job"; + private static final String TEST_TEAM_WRONG_NAME = "test-example-team"; + + @Autowired + private MockMvc mockMvc; + + private final ObjectMapper mapper = new ObjectMapper(); + + + private Matcher lambdaMatcher(Predicate predicate) { + return new BaseMatcher<>() { + @Override + public boolean matches(Object actual) { + return predicate.test((String) actual); + } + + @Override + public void describeTo(Description description) { + description.appendText("failed to match predicate"); + } + }; + } + + @Test + @WithMockUser + public void testDataJobCrud() throws Exception { + var job = TestUtils.getDataJob(TEST_TEAM_NAME, TEST_JOB_NAME); + + String body = mapper.writeValueAsString(job); + String expectedLocationPath = String.format("/data-jobs/for-team/%s/jobs/%s", TEST_TEAM_NAME, TEST_JOB_NAME); + mockMvc.perform(post(String.format("/data-jobs/for-team/%s/jobs", TEST_TEAM_NAME)) + .content(body).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()) + .andExpect(header().string(HttpHeaders.LOCATION, + lambdaMatcher(s -> URLDecoder.decode(s, Charset.defaultCharset()).endsWith(expectedLocationPath)))); + // deprecated jobsList in favour of jobsQuery + mockMvc.perform(get(String.format("/data-jobs/for-team/%s", TEST_TEAM_NAME))) + .andExpect(status().isOk()).andExpect(content().string(lambdaMatcher(s -> s.contains(TEST_JOB_NAME)))); + mockMvc.perform(get(String.format("/data-jobs/for-team/%s/jobs/%s", TEST_TEAM_NAME, TEST_JOB_NAME))) + .andExpect(status().isOk()).andExpect(content().string(lambdaMatcher(s -> s.contains(TEST_JOB_NAME)))) + .andExpect(content().string(lambdaMatcher(s -> s.contains(job.getConfig().getSchedule().getScheduleCron())))); + mockMvc.perform(delete(String.format("/data-jobs/for-team/%s/jobs/%s", TEST_TEAM_NAME, TEST_JOB_NAME)) + .contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()); + } + + @Test + @WithMockUser + public void testDataJobDeployTelemetry() throws Exception { + MockTelemetry.payloads.clear(); + var job = TestUtils.getDataJob(TEST_TEAM_NAME, "deployment-job"); + + String body = mapper.writeValueAsString(job); + mockMvc.perform(post(String.format("/data-jobs/for-team/%s/jobs", TEST_TEAM_NAME)) + .content(body).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()); + + var jobDeployment = TestUtils.getDataJobDeployment("prod", "1"); + + mockMvc.perform(post(String.format("/data-jobs/for-team/%s/jobs/%s/deployments", TEST_TEAM_NAME, "deployment-job")) + .content(mapper.writeValueAsString(jobDeployment)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isAccepted()); + // checking if httptrace table is updated correctly with http trace info + var httpTraceTelemetry = MockTelemetry.payloads.stream() + .filter(p -> p.contains("taurus_httptrace") && p.contains("/data-jobs/for-team/{team_name}/jobs/{job_name}/deployments")).findFirst(); + // checking if taurus_api_call is updated with DeploymentProgress as specified by Measurable annotation + var deployProgressTelemetry = MockTelemetry.payloads.stream() + .filter(p -> p.contains("taurus_api_call") && p.contains("DeploymentProgress") && p.contains("completed")).findFirst(); + + assertTrue(httpTraceTelemetry.isPresent(), + "Did not find expected http trace telemetry. See all payloads: " + MockTelemetry.payloads); + assertTrue(deployProgressTelemetry.isPresent(), + "Did not find expected deploy progress telemetry. See all payloads: " + MockTelemetry.payloads); + } + + /** + * Tests if parameter validation in {@link DataJobsController} works correctly integrated with + * {@link com.vmware.taurus.exception.ExceptionControllerAdvice} + * + *

+ * The test doesn't aim to cover all types of parameter validation - that's for the unit tests. This test + * confirms that that validation works end-to-end and the user gets a 400 response in case of validation issue. + */ + @Test + @WithMockUser + public void testParameterValidation() throws Exception { + // deprecated jobsList in favour of jobsQuery + mockMvc.perform(get(String.format("/data-jobs/for-team/%s?page_number=-1", TEST_TEAM_NAME))) + .andExpect(status().isBadRequest()) + .andExpect(content().string(lambdaMatcher(s -> s.contains("page_number")))); + } + + @Test + @WithMockUser + public void testDownloadKeytab() throws Exception { + DataJob job = TestUtils.getDataJob(TEST_TEAM_NAME, "job-" + UUID.randomUUID().toString().toLowerCase()); + String downloadKeytabPath = String.format("/data-jobs/for-team/%s/jobs/%s/keytab", + TEST_TEAM_NAME, + job.getJobName()); + mockMvc.perform(get(downloadKeytabPath)).andExpect(status().isNotFound()); + + String body = mapper.writeValueAsString(job); + mockMvc.perform(post(String.format("/data-jobs/for-team/%s/jobs", TEST_TEAM_NAME)) + .content(body) + .contentType(MediaType.APPLICATION_JSON)); + + mockMvc.perform(get(String.format("/data-jobs/for-team/%s/jobs/%s/keytab", + TEST_TEAM_WRONG_NAME, + job.getJobName()))).andExpect(status().isNotFound()); + + byte[] keytab = downloadPath(downloadKeytabPath); + byte[] keytabAgain = downloadPath(downloadKeytabPath); + + assertArrayEquals(keytab, keytabAgain); + } + + private byte[] downloadPath(String path) throws Exception { + return mockMvc.perform(get(path)).andExpect(status().isOk()).andReturn().getResponse().getContentAsByteArray(); + } } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/datajobs/DataJobsControllerTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/datajobs/DataJobsControllerTest.java index 73589e46a5..b71bad1fdd 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/datajobs/DataJobsControllerTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/datajobs/DataJobsControllerTest.java @@ -27,7 +27,7 @@ import java.util.List; import java.util.Optional; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/datajobs/DataJobsSourcesControllerIT.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/datajobs/DataJobsSourcesControllerIT.java index a7e1c9fc26..ecdc684b70 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/datajobs/DataJobsSourcesControllerIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/datajobs/DataJobsSourcesControllerIT.java @@ -18,7 +18,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.io.TempDir; -import org.junit.rules.TemporaryFolder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; @@ -34,7 +33,6 @@ import org.springframework.test.web.servlet.MockMvc; import java.io.File; -import java.io.IOException; import java.nio.file.Path; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -49,7 +47,8 @@ mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS) public class DataJobsSourcesControllerIT { - private static TemporaryFolder temporaryFolder = new TemporaryFolder(); + @TempDir + static File temporaryFolder; // team name can have spaces in it so we are purposefully using one with space private static final String TEST_TEAM_NAME = "test team"; @@ -63,22 +62,15 @@ public class DataJobsSourcesControllerIT { static class SetGitUrlAsTempFolder implements TestExecutionListener { @Override - public void beforeTestExecution(TestContext testContext) throws IOException, GitAPIException { + public void beforeTestExecution(TestContext testContext) throws GitAPIException { if (testContext.hasApplicationContext()) { - temporaryFolder.create(); GitWrapper bean = testContext.getApplicationContext().getBean(GitWrapper.class); - var git = Git.init().setDirectory(temporaryFolder.getRoot()).call(); + var git = Git.init().setDirectory(temporaryFolder).call(); git.commit().setMessage("Initial commit").call(); - ReflectionTestUtils.setField(bean, "gitDataJobsUrl", "file://" + temporaryFolder.getRoot()); + ReflectionTestUtils.setField(bean, "gitDataJobsUrl", "file://" + temporaryFolder); } } - - @Override - public void afterTestMethod(TestContext testContext) { - temporaryFolder.delete(); - } - } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/execution/JobExecutionServiceStartExecutionIT.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/execution/JobExecutionServiceStartExecutionIT.java index c3b1f633c3..319aec10ad 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/execution/JobExecutionServiceStartExecutionIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/execution/JobExecutionServiceStartExecutionIT.java @@ -19,22 +19,19 @@ import com.vmware.taurus.service.kubernetes.DataJobsKubernetesService; import com.vmware.taurus.service.model.*; import io.kubernetes.client.ApiException; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; -import org.junit.runner.RunWith; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit4.SpringRunner; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Optional; import static com.vmware.taurus.execution.JobExecutionServiceUtil.buildStartedBy; -@RunWith(SpringRunner.class) @SpringBootTest(classes = ControlplaneApplication.class) public class JobExecutionServiceStartExecutionIT { @@ -105,28 +102,28 @@ public void testStartDataJobExecution_correctDataJobDeployment_shouldStartDataJo Mockito.when(operationContext.getOpId()).thenReturn(opId); Mockito.when(dataJobsKubernetesService.isRunningJob(Mockito.eq(actualDataJob.getName()))).thenReturn(false); - Map annotations = - Map.of( - JobAnnotation.OP_ID.getValue(), opId, - JobAnnotation.STARTED_BY.getValue(), buildStartedBy(startedBy), - JobAnnotation.EXECUTION_TYPE.getValue(), JobExecutionService.ExecutionType.MANUAL.getValue()); + final Map annotations = new LinkedHashMap<>(); + annotations.put(JobAnnotation.OP_ID.getValue(), opId); + annotations.put(JobAnnotation.STARTED_BY.getValue(), buildStartedBy(startedBy)); + annotations.put(JobAnnotation.EXECUTION_TYPE.getValue(), JobExecutionService.ExecutionType.MANUAL.getValue()); + Map envs = Map.of(JobEnvVar.VDK_OP_ID.getValue(), opId); String executionId = jobExecutionService.startDataJobExecution( actualDataJob.getJobConfig().getTeam(), actualDataJob.getName(), "", - new DataJobExecutionRequest().startedBy(startedBy)); + new DataJobExecutionRequest().startedBy("startedBy")); Mockito.verify(dataJobsKubernetesService).startNewCronJobExecution(Mockito.eq(cronJobName), Mockito.eq(executionId), Mockito.eq(annotations), Mockito.eq(envs)); Optional actualDataJobExecutionOptional = jobExecutionRepository.findById(executionId); - Assert.assertTrue(actualDataJobExecutionOptional.isPresent()); + Assertions.assertTrue(actualDataJobExecutionOptional.isPresent()); DataJobExecution actualDataJobExecution = actualDataJobExecutionOptional.get(); - Assert.assertEquals(executionId, actualDataJobExecution.getId()); - Assert.assertEquals(actualDataJob, actualDataJobExecution.getDataJob()); - Assert.assertEquals(ExecutionStatus.SUBMITTED, actualDataJobExecution.getStatus()); - Assert.assertEquals(ExecutionType.MANUAL, actualDataJobExecution.getType()); - Assert.assertEquals(opId, actualDataJobExecution.getOpId()); - Assert.assertEquals(buildStartedBy(startedBy), actualDataJobExecution.getStartedBy()); + Assertions.assertEquals(executionId, actualDataJobExecution.getId()); + Assertions.assertEquals(actualDataJob, actualDataJobExecution.getDataJob()); + Assertions.assertEquals(ExecutionStatus.SUBMITTED, actualDataJobExecution.getStatus()); + Assertions.assertEquals(ExecutionType.MANUAL, actualDataJobExecution.getType()); + Assertions.assertEquals(opId, actualDataJobExecution.getOpId()); + Assertions.assertEquals(buildStartedBy(startedBy), actualDataJobExecution.getStartedBy()); } } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobExecutionRepositoryIT.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobExecutionRepositoryIT.java index 1027ed88c8..d5a9bd8aa3 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobExecutionRepositoryIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobExecutionRepositoryIT.java @@ -10,20 +10,17 @@ import com.vmware.taurus.service.model.DataJob; import com.vmware.taurus.service.model.DataJobExecution; import com.vmware.taurus.service.model.ExecutionStatus; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; import java.util.List; /** * Integration tests of the setup of Spring Data repository for data job executions */ -@RunWith(SpringRunner.class) @SpringBootTest(classes = ControlplaneApplication.class) public class JobExecutionRepositoryIT { @@ -33,7 +30,7 @@ public class JobExecutionRepositoryIT { @Autowired private JobExecutionRepository jobExecutionRepository; - @Before + @BeforeEach public void setUp() throws Exception { jobsRepository.deleteAll(); } @@ -51,11 +48,11 @@ public void testCRUD_shouldSucceed() { RepositoryUtil.createDataJobExecution(jobExecutionRepository, executionId, actualDataJob, executionStatus); var actualJobExecution = jobExecutionRepository.findById(expectedJobExecution.getId()).get(); - Assert.assertEquals(expectedJobExecution, actualJobExecution); + Assertions.assertEquals(expectedJobExecution, actualJobExecution); jobsRepository.deleteAll(); var deletedJobExecution = jobExecutionRepository.findById(expectedJobExecution.getId()); - Assert.assertFalse(deletedJobExecution.isPresent()); + Assertions.assertFalse(deletedJobExecution.isPresent()); } @Test @@ -69,9 +66,9 @@ public void testFindDataJobExecutionsByDataJobName_existingDataJobExecution_shou var actualJobExecutions = jobExecutionRepository.findDataJobExecutionsByDataJobName(actualDataJob.getName()); - Assert.assertNotNull(actualJobExecutions); - Assert.assertEquals(1, actualJobExecutions.size()); - Assert.assertEquals(expectedJobExecution, actualJobExecutions.get(0)); + Assertions.assertNotNull(actualJobExecutions); + Assertions.assertEquals(1, actualJobExecutions.size()); + Assertions.assertEquals(expectedJobExecution, actualJobExecutions.get(0)); } @Test @@ -79,8 +76,8 @@ public void testFindDataJobExecutionsByDataJobName_nonExistingDataJobExecution_s DataJob actualDataJob = RepositoryUtil.createDataJob(jobsRepository); var actualJobExecutions = jobExecutionRepository.findDataJobExecutionsByDataJobName(actualDataJob.getName()); - Assert.assertNotNull(actualJobExecutions); - Assert.assertTrue(actualJobExecutions.isEmpty()); + Assertions.assertNotNull(actualJobExecutions); + Assertions.assertTrue(actualJobExecutions.isEmpty()); } @Test @@ -100,10 +97,10 @@ public void testFindDataJobExecutionsByDataJobNameAndStatusIn_existingDataJobExe actualDataJob.getName(), List.of(ExecutionStatus.RUNNING, ExecutionStatus.SUBMITTED)); - Assert.assertNotNull(actualJobExecutions); - Assert.assertEquals(2, actualJobExecutions.size()); - Assert.assertEquals(expectedJobExecution1, actualJobExecutions.get(0)); - Assert.assertEquals(expectedJobExecution2, actualJobExecutions.get(1)); + Assertions.assertNotNull(actualJobExecutions); + Assertions.assertEquals(2, actualJobExecutions.size()); + Assertions.assertEquals(expectedJobExecution1, actualJobExecutions.get(0)); + Assertions.assertEquals(expectedJobExecution2, actualJobExecutions.get(1)); } @Test @@ -113,7 +110,7 @@ public void testFindDataJobExecutionsByDataJobNameAndStatusIn_nonExistingDataJob var actualJobExecutions = jobExecutionRepository.findDataJobExecutionsByDataJobNameAndStatusIn(actualDataJob.getName(), List.of(ExecutionStatus.RUNNING)); - Assert.assertNotNull(actualJobExecutions); - Assert.assertTrue(actualJobExecutions.isEmpty()); + Assertions.assertNotNull(actualJobExecutions); + Assertions.assertTrue(actualJobExecutions.isEmpty()); } } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobsRepositoryIT.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobsRepositoryIT.java index a0b7b44a50..a1b1add4a6 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobsRepositoryIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobsRepositoryIT.java @@ -9,25 +9,22 @@ import com.vmware.taurus.service.model.DataJob; import com.vmware.taurus.service.model.DeploymentStatus; import com.vmware.taurus.service.model.JobConfig; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; /** * Integration tests of the setup of Spring Data repository for data jobs */ -@RunWith(SpringRunner.class) @SpringBootTest(classes = ControlplaneApplication.class) public class JobsRepositoryIT { @Autowired private JobsRepository repository; - @Before + @BeforeEach public void setUp() throws Exception { repository.deleteAll(); } @@ -41,22 +38,22 @@ public void testLoadEmbedded() { config.setSchedule("schedule"); var entity = new DataJob("hello", config, DeploymentStatus.NONE); var savedEntity = repository.save(entity); - Assert.assertEquals(entity, savedEntity); + Assertions.assertEquals(entity, savedEntity); Iterable jobs = repository.findAll(); - Assert.assertEquals(entity, jobs.iterator().next()); - Assert.assertEquals(entity.getJobConfig(), jobs.iterator().next().getJobConfig()); + Assertions.assertEquals(entity, jobs.iterator().next()); + Assertions.assertEquals(entity.getJobConfig(), jobs.iterator().next().getJobConfig()); } @Test public void testEmptyJobConfigIsReadAsNull() { var entity = new DataJob("hello", new JobConfig(), DeploymentStatus.NONE); entity = repository.save(entity); - Assert.assertNotNull(entity.getJobConfig()); + Assertions.assertNotNull(entity.getJobConfig()); entity = repository.findById("hello").get(); var expectedJobConfig = new JobConfig(null, null, null, null, null, null, null, null, null, null, false, null); - Assert.assertEquals(entity.getJobConfig(), expectedJobConfig); + Assertions.assertEquals(entity.getJobConfig(), expectedJobConfig); - Assert.assertEquals(entity.getLatestJobDeploymentStatus(), DeploymentStatus.NONE); + Assertions.assertEquals(entity.getLatestJobDeploymentStatus(), DeploymentStatus.NONE); } } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobsServiceTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobsServiceTest.java index 1251590b26..19ea6c1316 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobsServiceTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobsServiceTest.java @@ -5,53 +5,82 @@ package com.vmware.taurus.service; -import com.mmnaseri.utils.spring.data.dsl.factory.RepositoryFactoryBuilder; +import com.vmware.taurus.ControlplaneApplication; import com.vmware.taurus.datajobs.webhook.PostCreateWebHookProvider; import com.vmware.taurus.datajobs.webhook.PostDeleteWebHookProvider; import com.vmware.taurus.service.credentials.JobCredentialsService; import com.vmware.taurus.service.deploy.DeploymentService; import com.vmware.taurus.service.model.DataJob; +import com.vmware.taurus.service.model.DeploymentStatus; import com.vmware.taurus.service.model.JobConfig; import com.vmware.taurus.service.monitoring.DataJobInfoMonitor; import com.vmware.taurus.service.webhook.WebHookRequestBodyProvider; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; +import java.util.Optional; import java.util.function.Supplier; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) public class JobsServiceTest { - @Test - public void testUpdateMissing() { - var testInst = createTestInstance(); - assertFalse(testInst.updateJob(new DataJob("hello", null, null))); - } - - @Test - public void testCreateConflict() { - var testInst = createTestInstance(); - assertTrue(testInst.createJob(new DataJob("hello", new JobConfig(), null)).isCompleted()); - assertFalse(testInst.createJob(new DataJob("hello", null, null)).isCompleted()); - assertNotNull(testInst.getByName("hello").get().getJobConfig()); - } - - private JobsService createTestInstance() { - var dataJobInfoMonitorMock = mock(DataJobInfoMonitor.class); - doAnswer(method -> { - Supplier supplier = method.getArgument(0); - supplier.get(); - return null; - }).when(dataJobInfoMonitorMock).updateDataJobInfo(Mockito.any()); - return new JobsService(RepositoryFactoryBuilder.builder().mock(JobsRepository.class), - mock(DeploymentService.class), - mock(JobCredentialsService.class), - mock(WebHookRequestBodyProvider.class), - mock(PostCreateWebHookProvider.class), - mock(PostDeleteWebHookProvider.class), - dataJobInfoMonitorMock); - } + @Mock + private JobsRepository jobsRepository; + @Mock + private DataJobInfoMonitor dataJobInfoMonitor; + + @Test + public void testCreateUpdateMissing() { + var testInst = createTestInstance(); + assertThrows(NullPointerException.class, () -> testInst.createJob(null).isCompleted()); + assertThrows(NullPointerException.class, () -> testInst.createJob(new DataJob("hello", null, null)).isCompleted()); + + var job = new DataJob("hello", null, null); + doAnswer(method -> 1) + .when(jobsRepository).updateDataJobLatestJobDeploymentStatusByName( + eq(job.getName()), Mockito.any(DeploymentStatus.class)); + assertFalse(testInst.updateJob(job)); + } + + @Test + public void testCreateConflict() { + var testInst = createTestInstance(); + var job = new DataJob("hello", new JobConfig(), null); + + doAnswer(method -> job).when(jobsRepository) + .save(job); + doAnswer(method -> 1).when(jobsRepository) + .updateDataJobLatestJobDeploymentStatusByName(eq(job.getName()), Mockito.any(DeploymentStatus.class)); + doAnswer(m -> Optional.of(job)).when(jobsRepository) + .findById(eq(job.getName())); + + assertTrue(testInst.createJob(job).isCompleted()); + assertNotNull(testInst.getByName("hello").get().getJobConfig()); + } + + private JobsService createTestInstance() { + doAnswer(method -> { + Supplier supplier = method.getArgument(0); + supplier.get(); + return null; + }).when(dataJobInfoMonitor).updateDataJobInfo(Mockito.any()); + return new JobsService(jobsRepository, + mock(DeploymentService.class), + mock(JobCredentialsService.class), + mock(WebHookRequestBodyProvider.class), + mock(PostCreateWebHookProvider.class), + mock(PostDeleteWebHookProvider.class), + dataJobInfoMonitor); + } } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceIsRunningJobTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceIsRunningJobTest.java index d522f1d1fa..7ab2a00c36 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceIsRunningJobTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceIsRunningJobTest.java @@ -13,8 +13,8 @@ import io.kubernetes.client.models.V1JobCondition; import io.kubernetes.client.models.V1JobList; import io.kubernetes.client.models.V1JobStatus; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; public class KubernetesServiceIsRunningJobTest { @@ -83,6 +83,6 @@ private void assertResponseValid(V1JobList response, boolean expectedResult) thr Mockito.when(kubernetesService.initBatchV1Api()).thenReturn(batchV1Api); boolean actualResult = kubernetesService.isRunningJob("test-job"); - Assert.assertEquals(expectedResult, actualResult); + Assertions.assertEquals(expectedResult, actualResult); } } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceStartNewCronJobExecutionTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceStartNewCronJobExecutionTest.java index c569939441..607454d489 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceStartNewCronJobExecutionTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceStartNewCronJobExecutionTest.java @@ -10,8 +10,7 @@ import io.kubernetes.client.ApiException; import io.kubernetes.client.apis.BatchV1beta1Api; import io.kubernetes.client.models.*; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; @@ -31,7 +30,7 @@ public void testStartNewCronJobExecution_nullCronJobDefinition_shouldThrowExcept Exception exception = Assertions.assertThrows(ApiException.class, () -> kubernetesService.startNewCronJobExecution(jobName, "test-execution-id", Collections.emptyMap(), Collections.emptyMap())); - Assert.assertEquals(String.format("K8S Cron Job '%s' does not exist or is not properly defined.", jobName), exception.getMessage()); + Assertions.assertEquals(String.format("K8S Cron Job '%s' does not exist or is not properly defined.", jobName), exception.getMessage()); } @Test @@ -43,7 +42,7 @@ public void testStartNewCronJobExecution_incorrectCronJobDefinition_shouldThrowE Exception exception = Assertions.assertThrows(ApiException.class, () -> kubernetesService.startNewCronJobExecution(jobName, "dada", Collections.emptyMap(), Collections.emptyMap())); - Assert.assertEquals(String.format("K8S Cron Job '%s' is not properly defined.", jobName), exception.getMessage()); + Assertions.assertEquals(String.format("K8S Cron Job '%s' is not properly defined.", jobName), exception.getMessage()); } @Test @@ -73,7 +72,7 @@ public void testStartNewCronJobExecution_existingJobContainerEnvs_shouldSetJobCo Mockito.anyMap(), Mockito.anyMap()); - Assert.assertEquals(executionId, executionIdArgumentCaptor.getValue()); + Assertions.assertEquals(executionId, executionIdArgumentCaptor.getValue()); Optional> actualV1EnvVarsOptional = Optional.ofNullable(v1JobSpecArgumentCaptor.getValue()) .map(v1JobSpec -> v1JobSpec.getTemplate()) @@ -81,12 +80,12 @@ public void testStartNewCronJobExecution_existingJobContainerEnvs_shouldSetJobCo .map(v1PodSpec -> v1PodSpec.getContainers()) .map(v1Containers -> v1Containers.get(0)) .map(v1Container -> v1Container.getEnv()); - Assert.assertTrue(actualV1EnvVarsOptional.isPresent()); + Assertions.assertTrue(actualV1EnvVarsOptional.isPresent()); List actualV1EnvVars = actualV1EnvVarsOptional.get(); - Assert.assertEquals(2, actualV1EnvVars.size()); - Assert.assertTrue(actualV1EnvVars.contains(vdkOpIdEnv)); - Assert.assertTrue(actualV1EnvVars.contains(testEnv)); + Assertions.assertEquals(2, actualV1EnvVars.size()); + Assertions.assertTrue(actualV1EnvVars.contains(vdkOpIdEnv)); + Assertions.assertTrue(actualV1EnvVars.contains(testEnv)); } @Test @@ -124,12 +123,12 @@ public void testStartNewCronJobExecution_existingJobLabelsAndJobAnnotations_shou labelsArgumentCaptor.capture(), annotationsArgumentCaptor.capture()); - Assert.assertEquals(executionId, executionIdArgumentCaptor.getValue()); - Assert.assertNotNull(labelsArgumentCaptor.getValue()); - Assert.assertFalse(labelsArgumentCaptor.getValue().isEmpty()); - Assert.assertEquals(expectedResult.getSpec().getJobTemplate().getMetadata().getLabels(), labelsArgumentCaptor.getValue()); + Assertions.assertEquals(executionId, executionIdArgumentCaptor.getValue()); + Assertions.assertNotNull(labelsArgumentCaptor.getValue()); + Assertions.assertFalse(labelsArgumentCaptor.getValue().isEmpty()); + Assertions.assertEquals(expectedResult.getSpec().getJobTemplate().getMetadata().getLabels(), labelsArgumentCaptor.getValue()); - Assert.assertEquals(expectedAnnotations, annotationsArgumentCaptor.getValue()); + Assertions.assertEquals(expectedAnnotations, annotationsArgumentCaptor.getValue()); } private KubernetesService mockKubernetesService(String jobName, V1beta1CronJob result) throws ApiException { diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceTest.java index a8a124e3b5..90d435514c 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceTest.java @@ -11,8 +11,8 @@ import io.kubernetes.client.custom.Quantity; import io.kubernetes.client.models.*; import org.joda.time.DateTime; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.lang.reflect.Method; @@ -57,7 +57,7 @@ public void testCreateVDKContainer() { List.of(volumeMount), "Always", new KubernetesService.Resources("500m", "1G"), new KubernetesService.Resources("2000m", "1G"), null, vdkCommand); - Assert.assertEquals(expectedVDKContainer, actualVDKContainer); + Assertions.assertEquals(expectedVDKContainer, actualVDKContainer); } @Test @@ -68,22 +68,22 @@ public void testGetJobExecutionStatus_emptyJob_shouldReturnEmptyJobExecutionStat Mockito.when(mock.getJobExecutionStatus(v1Job, null)).thenCallRealMethod(); Optional actualJobExecutionStatusOptional = mock.getJobExecutionStatus(v1Job, null); - Assert.assertTrue(actualJobExecutionStatusOptional.isPresent()); + Assertions.assertTrue(actualJobExecutionStatusOptional.isPresent()); KubernetesService.JobExecution actualJobExecution = actualJobExecutionStatusOptional.get(); - Assert.assertNull(actualJobExecution.getExecutionId()); - Assert.assertNull(actualJobExecution.getJobName()); - Assert.assertNull(actualJobExecution.getJobVersion()); - Assert.assertNull(actualJobExecution.getDeployedDate()); - Assert.assertNull(actualJobExecution.getExecutionType()); - Assert.assertNull(actualJobExecution.getOpId()); - Assert.assertNull(actualJobExecution.getResourcesCpuRequest()); - Assert.assertNull(actualJobExecution.getResourcesCpuLimit()); - Assert.assertNull(actualJobExecution.getResourcesMemoryRequest()); - Assert.assertNull(actualJobExecution.getResourcesMemoryLimit()); - Assert.assertNull(actualJobExecution.getStartTime()); - Assert.assertNull(actualJobExecution.getEndTime()); - Assert.assertEquals(KubernetesService.JobExecution.Status.RUNNING, actualJobExecution.getStatus()); + Assertions.assertNull(actualJobExecution.getExecutionId()); + Assertions.assertNull(actualJobExecution.getJobName()); + Assertions.assertNull(actualJobExecution.getJobVersion()); + Assertions.assertNull(actualJobExecution.getDeployedDate()); + Assertions.assertNull(actualJobExecution.getExecutionType()); + Assertions.assertNull(actualJobExecution.getOpId()); + Assertions.assertNull(actualJobExecution.getResourcesCpuRequest()); + Assertions.assertNull(actualJobExecution.getResourcesCpuLimit()); + Assertions.assertNull(actualJobExecution.getResourcesMemoryRequest()); + Assertions.assertNull(actualJobExecution.getResourcesMemoryLimit()); + Assertions.assertNull(actualJobExecution.getStartTime()); + Assertions.assertNull(actualJobExecution.getEndTime()); + Assertions.assertEquals(KubernetesService.JobExecution.Status.RUNNING, actualJobExecution.getStatus()); } @Test @@ -134,22 +134,22 @@ public void testGetJobExecutionStatus_notEmptyJob_shouldReturnNotEmptyJobExecuti Mockito.when(mock.getJobExecutionStatus(expectedJob, condition)).thenCallRealMethod(); Optional actualJobExecutionStatusOptional = mock.getJobExecutionStatus(expectedJob, condition); - Assert.assertTrue(actualJobExecutionStatusOptional.isPresent()); + Assertions.assertTrue(actualJobExecutionStatusOptional.isPresent()); KubernetesService.JobExecution actualJobExecution = actualJobExecutionStatusOptional.get(); - Assert.assertEquals(kubernetesJobName, actualJobExecution.getExecutionId()); - Assert.assertEquals(dataJobName, actualJobExecution.getJobName()); - Assert.assertEquals(jobVersion, actualJobExecution.getJobVersion()); - Assert.assertEquals(OffsetDateTime.parse(deployedDate), actualJobExecution.getDeployedDate()); - Assert.assertEquals(executionType, actualJobExecution.getExecutionType()); - Assert.assertEquals(opId, actualJobExecution.getOpId()); - Assert.assertEquals(Float.valueOf(cpuRequest), actualJobExecution.getResourcesCpuRequest()); - Assert.assertEquals(Float.valueOf(cpuLimit), actualJobExecution.getResourcesCpuLimit()); - Assert.assertEquals(memoryRequest, actualJobExecution.getResourcesMemoryRequest()); - Assert.assertEquals(memoryLimit, actualJobExecution.getResourcesMemoryLimit()); - Assert.assertEquals(OffsetDateTime.ofInstant(Instant.ofEpochMilli(startTime.getMillis()), ZoneOffset.UTC), actualJobExecution.getStartTime()); - Assert.assertEquals(OffsetDateTime.ofInstant(Instant.ofEpochMilli(endTime.getMillis()), ZoneOffset.UTC), actualJobExecution.getEndTime()); - Assert.assertEquals(KubernetesService.JobExecution.Status.FINISHED, actualJobExecution.getStatus()); + Assertions.assertEquals(kubernetesJobName, actualJobExecution.getExecutionId()); + Assertions.assertEquals(dataJobName, actualJobExecution.getJobName()); + Assertions.assertEquals(jobVersion, actualJobExecution.getJobVersion()); + Assertions.assertEquals(OffsetDateTime.parse(deployedDate), actualJobExecution.getDeployedDate()); + Assertions.assertEquals(executionType, actualJobExecution.getExecutionType()); + Assertions.assertEquals(opId, actualJobExecution.getOpId()); + Assertions.assertEquals(Float.valueOf(cpuRequest), actualJobExecution.getResourcesCpuRequest()); + Assertions.assertEquals(Float.valueOf(cpuLimit), actualJobExecution.getResourcesCpuLimit()); + Assertions.assertEquals(memoryRequest, actualJobExecution.getResourcesMemoryRequest()); + Assertions.assertEquals(memoryLimit, actualJobExecution.getResourcesMemoryLimit()); + Assertions.assertEquals(OffsetDateTime.ofInstant(Instant.ofEpochMilli(startTime.getMillis()), ZoneOffset.UTC), actualJobExecution.getStartTime()); + Assertions.assertEquals(OffsetDateTime.ofInstant(Instant.ofEpochMilli(endTime.getMillis()), ZoneOffset.UTC), actualJobExecution.getEndTime()); + Assertions.assertEquals(KubernetesService.JobExecution.Status.FINISHED, actualJobExecution.getStatus()); } // Note that we are testing private functionality and mocking the surrounding methods @@ -168,14 +168,14 @@ public void testCreateV1beta1CronJobFromInternalResource() { // First we load the internal cronjob template. Method loadInternalCronjobTemplate = KubernetesService.class.getDeclaredMethod("loadInternalCronjobTemplate"); if(loadInternalCronjobTemplate == null) { - Assert.fail("The method 'loadInternalCronjobTemplate' does not exist."); + Assertions.fail("The method 'loadInternalCronjobTemplate' does not exist."); } loadInternalCronjobTemplate.setAccessible(true); V1beta1CronJob internalCronjobTemplate = (V1beta1CronJob) loadInternalCronjobTemplate.invoke(service); // Prepare the 'checkForMissingEntries' method. Method checkForMissingEntries = KubernetesService.class.getDeclaredMethod("checkForMissingEntries", V1beta1CronJob.class); if(checkForMissingEntries == null) { - Assert.fail("The method 'checkForMissingEntries' does not exist."); + Assertions.fail("The method 'checkForMissingEntries' does not exist."); } checkForMissingEntries.setAccessible(true); V1beta1CronJob emptyCronjobToBeFixed = new V1beta1CronJob(); // Worst case scenario to test - empty cronjob. @@ -183,38 +183,38 @@ public void testCreateV1beta1CronJobFromInternalResource() { // We can't rely on equality check on root metadata/spec level, because if the internal template // has missing elements, the equality check will miss them. Instead, we will check the most // important elements one by one. - Assert.assertNotNull(emptyCronjobToBeFixed.getMetadata()); - Assert.assertNotNull(emptyCronjobToBeFixed.getMetadata().getAnnotations()); - Assert.assertEquals(internalCronjobTemplate.getMetadata().getAnnotations(), + Assertions.assertNotNull(emptyCronjobToBeFixed.getMetadata()); + Assertions.assertNotNull(emptyCronjobToBeFixed.getMetadata().getAnnotations()); + Assertions.assertEquals(internalCronjobTemplate.getMetadata().getAnnotations(), emptyCronjobToBeFixed.getMetadata().getAnnotations()); - Assert.assertNotNull(emptyCronjobToBeFixed.getSpec()); - Assert.assertNotNull(emptyCronjobToBeFixed.getSpec().getJobTemplate()); - Assert.assertNotNull(emptyCronjobToBeFixed.getSpec().getJobTemplate().getSpec()); - Assert.assertNotNull(emptyCronjobToBeFixed.getSpec().getJobTemplate().getSpec().getTemplate()); - Assert.assertNotNull(emptyCronjobToBeFixed.getSpec().getJobTemplate().getSpec().getTemplate().getSpec()); - Assert.assertNotNull(emptyCronjobToBeFixed.getSpec().getJobTemplate().getSpec().getTemplate().getMetadata()); - Assert.assertEquals(internalCronjobTemplate.getSpec().getJobTemplate().getSpec().getTemplate().getMetadata().getLabels(), + Assertions.assertNotNull(emptyCronjobToBeFixed.getSpec()); + Assertions.assertNotNull(emptyCronjobToBeFixed.getSpec().getJobTemplate()); + Assertions.assertNotNull(emptyCronjobToBeFixed.getSpec().getJobTemplate().getSpec()); + Assertions.assertNotNull(emptyCronjobToBeFixed.getSpec().getJobTemplate().getSpec().getTemplate()); + Assertions.assertNotNull(emptyCronjobToBeFixed.getSpec().getJobTemplate().getSpec().getTemplate().getSpec()); + Assertions.assertNotNull(emptyCronjobToBeFixed.getSpec().getJobTemplate().getSpec().getTemplate().getMetadata()); + Assertions.assertEquals(internalCronjobTemplate.getSpec().getJobTemplate().getSpec().getTemplate().getMetadata().getLabels(), emptyCronjobToBeFixed.getSpec().getJobTemplate().getSpec().getTemplate().getMetadata().getLabels()); - Assert.assertNotNull(internalCronjobTemplate.getSpec().getJobTemplate().getMetadata()); + Assertions.assertNotNull(internalCronjobTemplate.getSpec().getJobTemplate().getMetadata()); // Step 3 - create and check the actual cronjob. Method[] methods = KubernetesService.class.getDeclaredMethods(); // This is much easier than describing the whole method signature. Optional method = Arrays.stream(methods).filter(m -> m.getName().equals("cronJobFromTemplate")).findFirst(); if(method.isEmpty()) { - Assert.fail("The method 'cronJobFromTemplate' does not exist."); + Assertions.fail("The method 'cronJobFromTemplate' does not exist."); } method.get().setAccessible(true); V1beta1CronJob cronjob = (V1beta1CronJob) method.get().invoke(service, "test-job-name", "test-job-schedule", true, null, null, null, Collections.EMPTY_MAP, Collections.EMPTY_MAP, Collections.EMPTY_MAP, Collections.EMPTY_MAP); - Assert.assertEquals("test-job-name", cronjob.getMetadata().getName()); - Assert.assertEquals("test-job-schedule", cronjob.getSpec().getSchedule()); - Assert.assertEquals(true, cronjob.getSpec().isSuspend()); - Assert.assertEquals(Collections.EMPTY_MAP, cronjob.getSpec().getJobTemplate().getMetadata().getLabels()); - Assert.assertEquals(Collections.EMPTY_MAP, cronjob.getSpec().getJobTemplate().getMetadata().getAnnotations()); + Assertions.assertEquals("test-job-name", cronjob.getMetadata().getName()); + Assertions.assertEquals("test-job-schedule", cronjob.getSpec().getSchedule()); + Assertions.assertEquals(true, cronjob.getSpec().isSuspend()); + Assertions.assertEquals(Collections.EMPTY_MAP, cronjob.getSpec().getJobTemplate().getMetadata().getLabels()); + Assertions.assertEquals(Collections.EMPTY_MAP, cronjob.getSpec().getJobTemplate().getMetadata().getAnnotations()); } catch(Exception e) { e.printStackTrace(); - Assert.fail(e.getMessage()); + Assertions.fail(e.getMessage()); } } } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/credentials/JobCredentialsServiceTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/credentials/JobCredentialsServiceTest.java index 66ac09aad7..8a25768341 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/credentials/JobCredentialsServiceTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/credentials/JobCredentialsServiceTest.java @@ -7,7 +7,7 @@ import com.vmware.taurus.service.kubernetes.DataJobsKubernetesService; import io.kubernetes.client.ApiException; -import org.junit.Assert; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -54,8 +54,8 @@ public void test_createJobCredentials() throws ApiException { ArgumentCaptor> argCaptor = ArgumentCaptor.forClass(Map.class); verify(kubernetesService, only()).saveSecretData(eq(secretName), argCaptor.capture()); - Assert.assertTrue(argCaptor.getValue().containsKey("keytab")); - Assert.assertArrayEquals("keytab-data".getBytes(), argCaptor.getValue().get("keytab")); + Assertions.assertTrue(argCaptor.getValue().containsKey("keytab")); + Assertions.assertArrayEquals("keytab-data".getBytes(), argCaptor.getValue().get("keytab")); } @Test diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/credentials/KerberosCredentialsServiceTestManual.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/credentials/KerberosCredentialsServiceTestManual.java index 748b480633..acfc923e0d 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/credentials/KerberosCredentialsServiceTestManual.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/credentials/KerberosCredentialsServiceTestManual.java @@ -5,7 +5,7 @@ package com.vmware.taurus.service.credentials; -import org.junit.Assert; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; @@ -36,13 +36,12 @@ public void test() throws IOException { String principal = "taurus-pipelines-test-user"; service.deletePrincipal(principal); - Assert.assertEquals(false, service.principalExists(principal)); + Assertions.assertFalse(service.principalExists(principal)); service.createPrincipal(principal, Optional.of(file)); - Assert.assertEquals(true, service.principalExists(principal)); - Assert.assertTrue(file.exists()); - Assert.assertTrue(file.length() > 0); + Assertions.assertTrue(service.principalExists(principal)); + Assertions.assertTrue(file.exists()); + Assertions.assertTrue(file.length() > 0); service.deletePrincipal(principal); - Assert.assertEquals(false, service.principalExists(principal)); + Assertions.assertFalse(service.principalExists(principal)); } - } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/DeploymentServiceTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/DeploymentServiceTest.java index e5668a0b15..d344b9adbc 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/DeploymentServiceTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/DeploymentServiceTest.java @@ -13,13 +13,15 @@ import com.vmware.taurus.service.monitoring.DeploymentMonitor; import com.vmware.taurus.service.notification.DataJobNotification; import io.kubernetes.client.ApiException; -import org.junit.Before; -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.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; import java.io.IOException; import java.util.Map; @@ -29,7 +31,8 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) public class DeploymentServiceTest { private static final String OP_ID = "c00b40dcc9904ae6"; @@ -83,7 +86,7 @@ public class DeploymentServiceTest { private DataJob testDataJob; - @Before + @BeforeEach public void setUp() { // We use lenient here as the mocked methods are indirectly invoked by the JobImageDeployer#updateCronJob diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/JobImageBuilderTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/JobImageBuilderTest.java index 1171b1844d..a607fb3b30 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/JobImageBuilderTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/JobImageBuilderTest.java @@ -11,13 +11,13 @@ import com.vmware.taurus.service.model.JobConfig; import com.vmware.taurus.service.model.JobDeployment; import io.kubernetes.client.ApiException; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.util.ReflectionTestUtils; import java.io.IOException; @@ -27,7 +27,7 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class JobImageBuilderTest { private static final String TEST_JOB_NAME = "test-job-name"; private static final String TEST_IMAGE_NAME = "test-image-name"; @@ -54,11 +54,12 @@ public class JobImageBuilderTest { private DataJob testDataJob; - @Before + @BeforeEach public void setUp() { ReflectionTestUtils.setField(jobImageBuilder, "dockerRepositoryUrl", "test-docker-repository"); ReflectionTestUtils.setField(jobImageBuilder, "registryType", "ecr"); ReflectionTestUtils.setField(jobImageBuilder, "deploymentDataJobBaseImage", "python:3.7-slim"); + ReflectionTestUtils.setField(jobImageBuilder, "extraArgs", ""); JobConfig jobConfig = new JobConfig(); jobConfig.setDbDefaultType(TEST_DB_DEFAULT_TYPE); @@ -86,11 +87,11 @@ public void buildImage_notExist_success() throws InterruptedException, ApiExcept var result = jobImageBuilder.buildImage("test-image", testDataJob, jobDeployment, true); verify(kubernetesService).createJob( - eq(TEST_BUILDER_JOB_NAME), eq(TEST_BUILDER_IMAGE_NAME), eq(true), any(), any(), + eq(TEST_BUILDER_JOB_NAME), eq(TEST_BUILDER_IMAGE_NAME), eq(false), any(), any(), any(), any(), eq(JobImageBuilder.BUILDER_IMAGE_PULL_POLICY), any(), any()); verify(kubernetesService).deleteJob(TEST_BUILDER_JOB_NAME); - Assert.assertTrue(result); + Assertions.assertTrue(result); } @Test @@ -112,9 +113,9 @@ public void buildImage_builderRunning_oldBuilderDeleted() throws InterruptedExce verify(kubernetesService, times(2)).deleteJob(TEST_BUILDER_IMAGE_NAME); verify(kubernetesService).createJob( - eq(TEST_BUILDER_JOB_NAME), eq(TEST_BUILDER_IMAGE_NAME), eq(true), any(), any(), + eq(TEST_BUILDER_JOB_NAME), eq(TEST_BUILDER_IMAGE_NAME), eq(false), any(), any(), any(), any(), eq(JobImageBuilder.BUILDER_IMAGE_PULL_POLICY), any(), any()); - Assert.assertTrue(result); + Assertions.assertTrue(result); } @Test @@ -133,7 +134,7 @@ public void buildImage_imageExists_buildSkipped() throws InterruptedException, A any(), any(), anyString(), any(), any()); verify(notificationHelper, never()) .verifyBuilderResult(anyString(), any(), any(), any(), anyString(), anyBoolean()); - Assert.assertTrue(result); + Assertions.assertTrue(result); } @Test @@ -154,12 +155,12 @@ public void buildImage_jobFailed_failure() throws InterruptedException, ApiExcep var result = jobImageBuilder.buildImage("test-image", testDataJob, jobDeployment, true); verify(kubernetesService).createJob( - eq(TEST_BUILDER_JOB_NAME), eq(TEST_BUILDER_IMAGE_NAME), eq(true), any(), any(), + eq(TEST_BUILDER_JOB_NAME), eq(TEST_BUILDER_IMAGE_NAME), eq(false), any(), any(), any(), any(), eq(JobImageBuilder.BUILDER_IMAGE_PULL_POLICY), any(), any()); // verify(kubernetesService).deleteJob(TEST_BUILDER_JOB_NAME); // not called in case of an error verify(notificationHelper).verifyBuilderResult(TEST_BUILDER_JOB_NAME, testDataJob, jobDeployment, builderJobResult, TEST_BUILDER_LOGS, true); - Assert.assertFalse(result); + Assertions.assertFalse(result); } } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/JobImageDeployerTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/JobImageDeployerTest.java index edf77f3a30..78b5b4eaed 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/JobImageDeployerTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/JobImageDeployerTest.java @@ -14,15 +14,17 @@ import com.vmware.taurus.service.model.JobDeployment; import io.kubernetes.client.ApiException; import io.kubernetes.client.models.V1Container; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; import java.io.IOException; import java.util.Collections; @@ -33,7 +35,8 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) public class JobImageDeployerTest { private static final String TEST_JOB_NAME = "test-job-name"; @@ -69,7 +72,7 @@ public class JobImageDeployerTest { private DataJob testDataJob; - @Before + @BeforeEach public void setUp() { // We use lenient here as the mocked methods are indirectly invoked by the JobImageDeployer#updateCronJob @@ -141,6 +144,6 @@ public void testJobContainerName() throws ApiException { anyList(), any(KubernetesService.Resources.class), any(KubernetesService.Resources.class), containerCaptor.capture(), any(V1Container.class), anyList(), anyMap(), anyMap(), anyMap(), anyMap()); var jobContainer = containerCaptor.getValue(); - Assert.assertEquals(testDataJob.getName(), jobContainer.getName()); + Assertions.assertEquals(testDataJob.getName(), jobContainer.getName()); } } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/VdkOptionsReaderTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/VdkOptionsReaderTest.java index ed77e5afa6..50312b6097 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/VdkOptionsReaderTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/VdkOptionsReaderTest.java @@ -5,14 +5,11 @@ package com.vmware.taurus.service.deploy; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import java.util.Map; -@RunWith(MockitoJUnitRunner.class) public class VdkOptionsReaderTest { private static final String VDK_INFLUX_DB_PASSWORD_KEY = "VDK_INFLUX_DB_PASSWORD"; @@ -27,21 +24,21 @@ public class VdkOptionsReaderTest { public void readVdkOptions_defaultOptions() { Map vdkOptions = vdkOptionsReader.readVdkOptions("unconfigured-job-name"); - Assert.assertEquals(3, vdkOptions.size()); - Assert.assertEquals("influx-db-pass", vdkOptions.get(VDK_INFLUX_DB_PASSWORD_KEY)); - Assert.assertEquals("rs-host", vdkOptions.get(VDK_REDSHIFT_HOST_KEY)); - Assert.assertEquals("rs-name", vdkOptions.get(VDK_REDSHIFT_NAME_KEY)); + Assertions.assertEquals(3, vdkOptions.size()); + Assertions.assertEquals("influx-db-pass", vdkOptions.get(VDK_INFLUX_DB_PASSWORD_KEY)); + Assertions.assertEquals("rs-host", vdkOptions.get(VDK_REDSHIFT_HOST_KEY)); + Assertions.assertEquals("rs-name", vdkOptions.get(VDK_REDSHIFT_NAME_KEY)); } @Test public void readVdkOptions_customJobOptions() { Map vdkOptions = vdkOptionsReader.readVdkOptions("example"); - Assert.assertEquals(5, vdkOptions.size()); - Assert.assertEquals("influx-db-pass", vdkOptions.get(VDK_INFLUX_DB_PASSWORD_KEY)); - Assert.assertEquals("rs-host", vdkOptions.get(VDK_REDSHIFT_HOST_KEY)); - Assert.assertEquals("rs-name", vdkOptions.get(VDK_REDSHIFT_NAME_KEY)); - Assert.assertEquals("10000", vdkOptions.get(VDK_RESOURCE_LIMIT_MEMORY_MB_KEY)); - Assert.assertEquals("5000", vdkOptions.get(VDK_RESOURCE_LIMIT_DISK_MB_KEY)); + Assertions.assertEquals(5, vdkOptions.size()); + Assertions.assertEquals("influx-db-pass", vdkOptions.get(VDK_INFLUX_DB_PASSWORD_KEY)); + Assertions.assertEquals("rs-host", vdkOptions.get(VDK_REDSHIFT_HOST_KEY)); + Assertions.assertEquals("rs-name", vdkOptions.get(VDK_REDSHIFT_NAME_KEY)); + Assertions.assertEquals("10000", vdkOptions.get(VDK_RESOURCE_LIMIT_MEMORY_MB_KEY)); + Assertions.assertEquals("5000", vdkOptions.get(VDK_RESOURCE_LIMIT_DISK_MB_KEY)); } } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/notification/DataJobNotificationTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/notification/DataJobNotificationTest.java index eb9417c7a3..cd3bc199cc 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/notification/DataJobNotificationTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/notification/DataJobNotificationTest.java @@ -5,7 +5,7 @@ package com.vmware.taurus.service.notification; -import org.junit.Test; +import org.junit.jupiter.api.Test; public class DataJobNotificationTest { diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/notification/NotificationContentTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/notification/NotificationContentTest.java index 66f9246477..c6b709eb69 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/notification/NotificationContentTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/notification/NotificationContentTest.java @@ -6,15 +6,12 @@ package com.vmware.taurus.service.notification; import com.vmware.taurus.service.model.JobConfig; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; -import java.util.ArrayList; -import java.util.List; - -import static junit.framework.TestCase.fail; +import java.util.Collections; public class NotificationContentTest { @@ -36,12 +33,12 @@ public void test_basic_notification() { "

Best,
Example Name

\n"; - Assert.assertEquals(notificationContent.getSender().getAddress(), expectedSender.getAddress()); - Assert.assertArrayEquals(notificationContent.getRecipients(), expectedRecipients); - Assert.assertEquals(notificationContent.getSubject(), expectedSubject); - Assert.assertEquals(notificationContent.getContent(), expectedContent); + Assertions.assertEquals(notificationContent.getSender().getAddress(), expectedSender.getAddress()); + Assertions.assertArrayEquals(notificationContent.getRecipients(), expectedRecipients); + Assertions.assertEquals(notificationContent.getSubject(), expectedSubject); + Assertions.assertEquals(notificationContent.getContent(), expectedContent); } catch (AddressException e) { - fail("Unexpected exception" + e.toString()); + Assertions.fail("Unexpected exception" + e.toString()); } } @@ -51,7 +48,7 @@ public void test_address_exception() { try { new NotificationContent(jobConfig, "run", "failure", "Example Name", "@vmware.com"); } catch (AddressException e) { - Assert.assertEquals("Missing local name", e.getMessage()); + Assertions.assertEquals("Missing local name", e.getMessage()); } } @@ -79,29 +76,25 @@ public void test_error_notification() { "

Best,
Example Name

\n"; - Assert.assertEquals(notificationContent.getSender().getAddress(), expectedSender.getAddress()); - Assert.assertArrayEquals(notificationContent.getRecipients(), expectedRecipients); - Assert.assertEquals(notificationContent.getSubject(), expectedSubject); - Assert.assertEquals(notificationContent.getContent(), expectedContent); + Assertions.assertEquals(notificationContent.getSender().getAddress(), expectedSender.getAddress()); + Assertions.assertArrayEquals(notificationContent.getRecipients(), expectedRecipients); + Assertions.assertEquals(notificationContent.getSubject(), expectedSubject); + Assertions.assertEquals(notificationContent.getContent(), expectedContent); } catch (AddressException e) { - fail("Unexpected exception" + e.toString()); + Assertions.fail("Unexpected exception" + e.toString()); } } private JobConfig createValidJobConfigStub() { JobConfig jobConfig = new JobConfig(); - List receivers = new ArrayList(); - receivers.add("receiver@vmware.com"); - jobConfig.setNotifiedOnJobDeploy(receivers); + jobConfig.setNotifiedOnJobDeploy(Collections.singletonList("receiver@vmware.com")); jobConfig.setJobName("test_job"); return jobConfig; } private JobConfig createInvalidJobConfigStub() { JobConfig jobConfig = new JobConfig(); - List receivers = new ArrayList(); - receivers.add("@vmware.com"); - jobConfig.setNotifiedOnJobDeploy(receivers); + jobConfig.setNotifiedOnJobDeploy(Collections.singletonList("@vmware.com")); jobConfig.setJobName("test_job"); return jobConfig; } diff --git a/projects/control-service/projects/versions-of-external-dependencies.gradle b/projects/control-service/projects/versions-of-external-dependencies.gradle index 128fb4aee2..7fc3066568 100644 --- a/projects/control-service/projects/versions-of-external-dependencies.gradle +++ b/projects/control-service/projects/versions-of-external-dependencies.gradle @@ -14,6 +14,8 @@ project.ext { 'org.projectlombok:lombok' : 'org.projectlombok:lombok:1.18.20', 'com.h2database:h2' : 'com.h2database:h2:1.4.200', 'org.apache.httpcomponents:httpclient' : 'org.apache.httpcomponents:httpclient:4.5.13', + 'org.junit.jupiter:junit-jupiter-api' : 'org.junit.jupiter:junit-jupiter-api:5.7.2', + 'org.junit.jupiter:junit-jupiter-engine' : 'org.junit.jupiter:junit-jupiter-engine:5.7.2', 'com.mmnaseri.utils:spring-data-mock' : 'com.mmnaseri.utils:spring-data-mock:2.2.0', 'org.mockito:mockito-core' : 'org.mockito:mockito-core:3.11.2', 'com.fasterxml.jackson.core:jackson-databind' : 'com.fasterxml.jackson.core:jackson-databind:2.12.4', From f1fd1d40fcd334d66382b0f054f7abe012eff3e7 Mon Sep 17 00:00:00 2001 From: ikoleva Date: Fri, 10 Sep 2021 15:01:56 +0300 Subject: [PATCH 2/3] pipelines-control-service: upgrade JUnit 4 to JUnit 5 A part of the unit tests were not triggered on test phase, due to tests runner discrepancies. As a result of that, some tests were not accurate due to code evolution, therefore failed after they got enabled. Added base module transitive junit dependencies explicitly, for visibility. Migrated in a consistent manner all unit and integration tests to JUnit 5. Tests fixed: * JobsServiceTest - repository usage changes * JobImageBuilderTest - container privileged false * JobExecutionServiceStartExecutionIT - map properties order fix, operationContext.getUser() duplication in jobExecutionRequest Testing Done: run unit tests, need to verify integration tests Signed-off-by: ikoleva --- .../taurus/datajobs/it/common/BaseIT.java | 2 +- .../KerberosSecurityTestcaseJunit5.java | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/KerberosSecurityTestcaseJunit5.java diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/BaseIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/BaseIT.java index e8cf0d5b82..218927d82f 100644 --- a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/BaseIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/BaseIT.java @@ -55,7 +55,7 @@ @ActiveProfiles({"test", "MockDecoder"}) @Import({BaseIT.KerberosConfig.class}) @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -public class BaseIT extends KerberosSecurityTestcase { +public class BaseIT extends KerberosSecurityTestcaseJunit5 { private static Logger log = LoggerFactory.getLogger(BaseIT.class); diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/KerberosSecurityTestcaseJunit5.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/KerberosSecurityTestcaseJunit5.java new file mode 100644 index 0000000000..e933b42553 --- /dev/null +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/KerberosSecurityTestcaseJunit5.java @@ -0,0 +1,25 @@ +/* + * Copyright 2021 VMware, Inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.vmware.taurus.datajobs.it.common; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.springframework.security.kerberos.test.KerberosSecurityTestcase; + +public class KerberosSecurityTestcaseJunit5 extends KerberosSecurityTestcase { + + @BeforeEach + @Override + public void startMiniKdc() throws Exception { + super.startMiniKdc(); + } + + @AfterEach + @Override + public void stopMiniKdc() { + super.stopMiniKdc(); + } +} From f2a83e8bc47e9cef80eaafe1551bc578d0d2e501 Mon Sep 17 00:00:00 2001 From: ikoleva Date: Fri, 10 Sep 2021 15:28:13 +0300 Subject: [PATCH 3/3] pipelines-control-service: upgrade JUnit 4 to JUnit 5 A part of the unit tests were not triggered on test phase, due to tests runner discrepancies. As a result of that, some tests were not accurate due to code evolution, therefore failed after they got enabled. Added base module transitive junit dependencies explicitly, for visibility. Migrated in a consistent manner all unit and integration tests to JUnit 5. Tests fixed: * JobsServiceTest - repository usage changes * JobImageBuilderTest - container privileged false * JobExecutionServiceStartExecutionIT - map properties order fix, operationContext.getUser() duplication in jobExecutionRequest Testing Done: run unit tests, need to verify integration tests Signed-off-by: ikoleva --- .../taurus/datajobs/it/DataJobTerminationStatusIT.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobTerminationStatusIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobTerminationStatusIT.java index b31d85dcf4..35474d1b2c 100644 --- a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobTerminationStatusIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobTerminationStatusIT.java @@ -300,9 +300,9 @@ private static void assertLabelEquals(String metrics, String expectedValue, Stri Matcher matcher = Pattern.compile(String.format(".*%s=\"([^\"]*)\".*", label), Pattern.CASE_INSENSITIVE).matcher(line); assertTrue(matcher.find(), String.format("The metrics %s does not have a matching label %s", metrics, label)); String actualValue = matcher.group(1); - assertEquals(String.format("The metrics %s does not have correct value for label %s. Expected: %s, Actual: %s", - metrics, label, expectedValue, actualValue), - expectedValue, actualValue); + assertEquals(expectedValue, actualValue, + String.format("The metrics %s does not have correct value for label %s. Expected: %s, Actual: %s", + metrics, label, expectedValue, actualValue)); } private Callable deploymentIsDeleted(String jobDeploymentName) {