Resolve "Increase METRICO test coverage"

Closes #10 (closed)

Merge request reports

Loading
+28 −0
Changes for src/test/java/org/etsi/osl/metrico/prometheus/PrometheusQueriesTest.java: 28 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -7,10 +7,14 @@ import org.etsi.osl.tmf.pm628.model.ExecutionStateType;
import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.time.OffsetDateTime;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
@@ -121,4 +125,28 @@ class PrometheusQueriesTest {
        verify(metricoCommonMethods).updateService(eq("service-uuid"), any(), eq(true));
    }

    @Test
    void testStartPeriodicQuery_SchedulesStopJobWhenEndDateTimePresent() {
        Job job = new Job();
        job.setExecutionInterval(100);
        job.setEndDateTime(OffsetDateTime.now().plusSeconds(61));
        MeasurementCollectionJob mcj = new MeasurementCollectionJob();

        ScheduledExecutorService scheduler = mock(ScheduledExecutorService.class);

        try (MockedStatic<JobService> jobServiceStatic = mockStatic(JobService.class)) {
            jobServiceStatic.when(JobService::getScheduler).thenReturn(scheduler);

            when(jobService.startJob(any(Runnable.class), any(Job.class))).thenAnswer(invocation -> {
                Job j = invocation.getArgument(1);
                j.setState(ExecutionStateType.INPROGRESS);
                return j;
            });

            prometheusQueries.startPeriodicQuery("http://localhost:9090", "query=up", job, mcj);

            verify(scheduler).schedule(any(Runnable.class), eq(60L), eq(TimeUnit.SECONDS));
        }
    }

}
 No newline at end of file
+46 −0
Changes for src/test/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilderTest.java: 46 added lines, 0 removed lines.
Original line number Diff line number Diff line
package org.etsi.osl.metrico.services;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
import org.etsi.osl.metrico.MetricoCommonMethods;
import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob;
import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobCreateEvent;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
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.TestPropertySource;

import static org.mockito.Mockito.*;

@CamelSpringBootTest
@SpringBootTest
@TestPropertySource(properties = {
        "EVENT_MEASUREMENT_COLLECTION_JOB_CREATE=direct:eventMeasurementCollectionJobCreate"
})
class MetricoServiceRouteBuilderTest {

    @Autowired
    private ProducerTemplate producerTemplate;

    @MockBean
    private MetricoService metricoService;

    @MockBean
    private MetricoCommonMethods metricoCommonMethods;

    @Test
    void testRouteCallsMetricoService() throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        MeasurementCollectionJobCreateEvent event = new MeasurementCollectionJobCreateEvent();
        String eventJson = objectMapper.writeValueAsString(event);

        producerTemplate.sendBody("direct:eventMeasurementCollectionJobCreate", eventJson);

        ArgumentCaptor<MeasurementCollectionJobCreateEvent> captor = ArgumentCaptor.forClass(MeasurementCollectionJobCreateEvent.class);
        verify(metricoService, timeout(1000)).startPeriodicQueryToPrometheusEvent(captor.capture());
    }
}
 No newline at end of file
+110 −0
Changes for src/test/java/org/etsi/osl/metrico/services/MetricoServiceTest.java: 110 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -170,4 +170,114 @@ class MetricoServiceTest {

        verify(metricoCommonMethods).retrieveMeasurementCollectionJob("123e4567-e89b-12d3-a456-426614174002");
    }


    @Test
    void testRestartPendingOrInProgressJobs_skipsJobWithNoDataAccessEndpoint() {
        MeasurementCollectionJob mcj = validMCJ();
        mcj.setDataAccessEndpoint(null);

        ArrayList <MeasurementCollectionJob> mcjList = new ArrayList<>();
        mcjList.add(mcj);

        when(metricoCommonMethods.listPendingOrInProgressMeasurementCollectionJobs())
                .thenReturn(mcjList);
        when(metricoCommonMethods.retrieveMeasurementCollectionJob(mcj.getUuid()))
                .thenReturn(mcj);

        metricoService.restartPendingOrInProgressJobs();

        verify(metricoCommonMethods).updateMeasurementCollectionJobById(eq(mcj.getUuid()), any(MeasurementCollectionJobMVO.class));
        verify(jobService).stopAllJobs();
    }

    @Test
    void testRestartPendingOrInProgressJobs_skipsJobWithMultipleDataAccessEndpoints() {
        MeasurementCollectionJob mcj = validMCJ();
        DataAccessEndpoint dae2 = new DataAccessEndpoint();
        dae2.setUuid(UUID.randomUUID().toString());
        dae2.setApiType("Prometheus");
        dae2.setUri(URI.create("http://localhost:9091/api/v1/query?query=down"));
        List<DataAccessEndpoint> endpoints = new ArrayList<>(mcj.getDataAccessEndpoint());
        endpoints.add(dae2);
        mcj.setDataAccessEndpoint(endpoints);

        ArrayList <MeasurementCollectionJob> mcjList = new ArrayList<>();
        mcjList.add(mcj);

        when(metricoCommonMethods.listPendingOrInProgressMeasurementCollectionJobs())
                .thenReturn(mcjList);
        when(metricoCommonMethods.retrieveMeasurementCollectionJob(mcj.getUuid()))
                .thenReturn(mcj);

        metricoService.restartPendingOrInProgressJobs();

        verify(metricoCommonMethods).updateMeasurementCollectionJobById(eq(mcj.getUuid()), any(MeasurementCollectionJobMVO.class));
        verify(jobService).stopAllJobs();
    }

    @Test
    void testRestartPendingOrInProgressJobs_skipsJobWithMultipleScheduleDefinitions() {
        MeasurementCollectionJob mcj = validMCJ();
        ScheduleDefinition schedule2 = new ScheduleDefinition();
        schedule2.setScheduleDefinitionStartTime(OffsetDateTime.now().plusSeconds(2));
        schedule2.setScheduleDefinitionEndTime(OffsetDateTime.now().plusHours(2));
        List<ScheduleDefinition> schedules = new ArrayList<>(mcj.getScheduleDefinition());
        schedules.add(schedule2);
        mcj.setScheduleDefinition(schedules);

        ArrayList <MeasurementCollectionJob> mcjList = new ArrayList<>();
        mcjList.add(mcj);

        when(metricoCommonMethods.listPendingOrInProgressMeasurementCollectionJobs())
                .thenReturn(mcjList);
        when(metricoCommonMethods.retrieveMeasurementCollectionJob(mcj.getUuid()))
                .thenReturn(mcj);

        metricoService.restartPendingOrInProgressJobs();

        verify(metricoCommonMethods).updateMeasurementCollectionJobById(eq(mcj.getUuid()), any(MeasurementCollectionJobMVO.class));
        verify(jobService).stopAllJobs();
    }

    @Test
    void testRestartPendingOrInProgressJobs_skipsJobWithEndedScheduleDefinition() {
        MeasurementCollectionJob mcj = validMCJ();
        OffsetDateTime start = OffsetDateTime.now().minusHours(2);
        OffsetDateTime end = OffsetDateTime.now().minusHours(1);
        mcj.getScheduleDefinition().get(0).setScheduleDefinitionStartTime(start);
        mcj.getScheduleDefinition().get(0).setScheduleDefinitionEndTime(end);

        ArrayList <MeasurementCollectionJob> mcjList = new ArrayList<>();
        mcjList.add(mcj);

        when(metricoCommonMethods.listPendingOrInProgressMeasurementCollectionJobs())
                .thenReturn(mcjList);
        when(metricoCommonMethods.retrieveMeasurementCollectionJob(mcj.getUuid()))
                .thenReturn(mcj);

        metricoService.restartPendingOrInProgressJobs();

        verify(metricoCommonMethods).updateMeasurementCollectionJobById(eq(mcj.getUuid()), any(MeasurementCollectionJobMVO.class));
        verify(jobService).stopAllJobs();
    }

    @Test
    void testRestartPendingOrInProgressJobs_jobWithNoScheduleDefinition_addsAndSkipsIfEnded() {
        MeasurementCollectionJob mcj = validMCJ();
        mcj.setScheduleDefinition(new ArrayList<>()); // No schedule definitions
        mcj.setCreationTime(OffsetDateTime.now().minusHours(2));
        ArrayList <MeasurementCollectionJob> mcjList = new ArrayList<>();
        mcjList.add(mcj);

        when(metricoCommonMethods.listPendingOrInProgressMeasurementCollectionJobs())
                .thenReturn(mcjList);
        when(metricoCommonMethods.retrieveMeasurementCollectionJob(mcj.getUuid()))
                .thenReturn(mcj);

        metricoService.restartPendingOrInProgressJobs();

        verify(metricoCommonMethods).updateMeasurementCollectionJobById(eq(mcj.getUuid()), any(MeasurementCollectionJobMVO.class));
        verify(jobService).stopAllJobs();
    }
}
 No newline at end of file
+0 −53
Changes for src/test/java/org/etsi/osl/metrico/DummyRouteBuilder.java: 0 added lines, 53 removed lines.
Original line number Diff line number Diff line
package org.etsi.osl.metrico;

import org.apache.camel.builder.RouteBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Profile("testing")
@Component
public class DummyRouteBuilder extends RouteBuilder {
    private static final Logger logger = LoggerFactory.getLogger(DummyRouteBuilder.class);

    @Value("${PM_MEASUREMENT_COLLECTION_JOB_UPDATE}")
    private String PM_MEASUREMENT_COLLECTION_JOB_UPDATE = "";
    @Value("${PM_MEASUREMENT_COLLECTION_GET_JOB_BY_ID}")
    private String PM_MEASUREMENT_COLLECTION_GET_JOB_BY_ID = "";
    @Value("${PM_MEASUREMENT_COLLECTION_JOBS_GET}")
    private String PM_MEASUREMENT_COLLECTION_JOBS_GET = "";
    @Value("${CATALOG_GET_SERVICE_BY_ID}")
    private String CATALOG_GET_SERVICE_BY_ID = ""; 
    @Value("${CATALOG_UPD_SERVICE}")
    private String CATALOG_UPD_SERVICE = "";
    @Value("${CATALOG_GET_RESOURCE_BY_ID}")
    private String CATALOG_GET_RESOURCE_BY_ID = "";
    @Value("${CATALOG_UPD_RESOURCE}")
    private String CATALOG_UPD_RESOURCE = "";
    @Value("${CATALOG_UPDADD_RESOURCESPEC}")
    private String CATALOG_UPDADD_RESOURCESPEC = "";

    private final String measurementCollectionJobJson = "{\n" +
            "  \"outputFormat\": \"JSON\",\n" +
            "  \"@type\": \"MeasurementCollectionJob\",\n" +
            "  \"consumingApplicationId\": \"app123\",\n" +
            "  \"producingApplicationId\": \"app456\",\n" +
            "  \"dataAccessEndpoint\": [],\n" +
            "  \"jobPriority\": 1,\n" +
            "  \"lastModifiedTime\": \"2023-01-01T00:00:00Z\",\n" +
            "  \"scheduleDefinition\": []\n" +
            "}";

    @Override
    public void configure() throws Exception {
        logger.info("Configuring dummy routes...");

        from("direct:PM.MEASUREMENTCOLLECTIONJOB.GET_BY_ID")
                .process(exchange -> {
                    logger.info("Processing GET_BY_ID route");
                    exchange.getIn().setBody(measurementCollectionJobJson);
                });
    }
}
 No newline at end of file
+10 −0
Changes for src/test/java/org/etsi/osl/metrico/JsonUtilTest.java: 10 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -44,4 +44,14 @@ class JsonUtilTest {
        assertNull(jsonString);
    }

    @Test
    void toJsonString_unserializableObject_returnsNull() {
        class SelfRef {
            public SelfRef ref;
        }
        SelfRef obj = new SelfRef();
        obj.ref = obj; // creates a circular reference
        String jsonString = JsonUtil.toJsonString(obj);
        assertNull(jsonString);
    }
}
 No newline at end of file
Loading
Loading