Added tests 74/4774/2
authorPatrikBuhr <patrik.buhr@est.tech>
Fri, 25 Sep 2020 09:21:18 +0000 (11:21 +0200)
committerPatrikBuhr <patrik.buhr@est.tech>
Fri, 25 Sep 2020 11:37:42 +0000 (13:37 +0200)
Improved test, changed some behaviour.
Changed default port to 8081
Updated api.yaml documentation

Change-Id: Ide52dce3badc1c3a3725bd5fba56498fc3f5c463
Issue-ID: NONRTRIC-173
Signed-off-by: PatrikBuhr <patrik.buhr@est.tech>
enrichment-coordinator-service/docs/api.yaml
enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/ErrorResponse.java
enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerController.java
enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerController.java
enrichment-coordinator-service/src/main/java/org/oransc/enrichment/repository/EiJobs.java
enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java
enrichment-coordinator-service/src/test/java/org/oransc/enrichment/MockEnrichmentService.java

index 2fbf934..570caee 100644 (file)
@@ -512,6 +512,7 @@ definitions:
     required:
       - job_data
       - job_owner
+      - target_uri
     properties:
       job_data:
         type: object
@@ -519,6 +520,9 @@ definitions:
       job_owner:
         type: string
         description: Identity of the owner of the job
+      target_uri:
+        type: string
+        description: The target of the EI data
     title: ei_job_info
     description: Information for a Enrichment Information Job
   ei_job_status:
@@ -573,6 +577,9 @@ definitions:
       ei_type_identity:
         type: string
         description: Type idenitity for the job
+      target_uri:
+        type: string
+        description: URI for the target of the EI
     title: producer_ei_job_request
     description: The body of the EI producer callbacks for EI job creation and deletion
   producer_ei_type_info:
index c90a649..20e9f76 100644 (file)
@@ -90,8 +90,12 @@ public class ErrorResponse {
         if (e instanceof RuntimeException) {
             code = HttpStatus.INTERNAL_SERVER_ERROR;
         }
-        ErrorInfo p = new ErrorInfo(e.toString(), code.value());
-        String json = gson.toJson(p);
+        return create(e.toString(), code);
+    }
+
+    public static ResponseEntity<Object> create(String str, HttpStatus code) {
+        ErrorInfo errorInfo = new ErrorInfo(str, code.value());
+        String json = gson.toJson(errorInfo);
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_PROBLEM_JSON);
         return new ResponseEntity<>(json, headers, code);
index e167eb8..ff04522 100644 (file)
@@ -252,10 +252,14 @@ public class ConsumerController {
         try {
             EiType eiType = this.eiTypes.getType(eiTypeId);
             validateJobData(eiType.getJobDataSchema(), eiJobInfo.jobData);
-            final boolean newJob = this.eiJobs.get(eiJobId) == null;
-            EiJob eiJob = toEiJob(eiJobInfo, eiJobId, eiType);
-            this.eiJobs.put(eiJob);
-            this.producerCallbacks.notifyProducersJobCreated(eiJob);
+            EiJob existingEiJob = this.eiJobs.get(eiJobId);
+            final boolean newJob = existingEiJob == null;
+            if (existingEiJob != null && !existingEiJob.type().getId().equals(eiTypeId)) {
+                return ErrorResponse.create("Not allowed to change type for existing EI job", HttpStatus.CONFLICT);
+            }
+            EiJob newEiJob = toEiJob(eiJobInfo, eiJobId, eiType);
+            this.eiJobs.put(newEiJob);
+            this.producerCallbacks.notifyProducersJobCreated(newEiJob);
             return new ResponseEntity<>(newJob ? HttpStatus.CREATED : HttpStatus.OK);
         } catch (Exception e) {
             return ErrorResponse.create(e, HttpStatus.NOT_FOUND);
index af25951..c9b6467 100644 (file)
@@ -204,12 +204,17 @@ public class ProducerController {
         @PathVariable("eiProducerId") String eiProducerId, //
         @RequestBody ProducerRegistrationInfo registrationInfo) {
         try {
-            final EiProducer previousDefinition = this.eiProducers.get(eiProducerId);
+            EiProducer previousDefinition = this.eiProducers.get(eiProducerId);
             if (previousDefinition != null) {
-                deregisterProducer(previousDefinition, false);
+                for (EiType type : previousDefinition.eiTypes()) {
+                    type.removeProducer(previousDefinition);
+                }
             }
 
             registerProducer(eiProducerId, registrationInfo);
+            if (previousDefinition != null) {
+                purgeTypes(previousDefinition.eiTypes());
+            }
 
             return new ResponseEntity<>(previousDefinition == null ? HttpStatus.CREATED : HttpStatus.OK);
         } catch (Exception e) {
@@ -217,6 +222,14 @@ public class ProducerController {
         }
     }
 
+    private void purgeTypes(Collection<EiType> types) {
+        for (EiType type : types) {
+            if (type.getProducerIds().isEmpty()) {
+                this.deregisterType(type);
+            }
+        }
+    }
+
     @DeleteMapping(
         path = ProducerConsts.API_ROOT + "/eiproducers/{eiProducerId}",
         produces = MediaType.APPLICATION_JSON_VALUE)
@@ -229,7 +242,7 @@ public class ProducerController {
     public ResponseEntity<Object> deleteEiProducer(@PathVariable("eiProducerId") String eiProducerId) {
         try {
             final EiProducer producer = this.eiProducers.getProducer(eiProducerId);
-            deregisterProducer(producer, true);
+            deregisterProducer(producer);
             return new ResponseEntity<>(HttpStatus.NO_CONTENT);
         } catch (Exception e) {
             return ErrorResponse.create(e, HttpStatus.NOT_FOUND);
@@ -255,7 +268,7 @@ public class ProducerController {
             .build();
     }
 
-    private void registerProducer(String producerId, ProducerRegistrationInfo registrationInfo) {
+    private EiProducer registerProducer(String producerId, ProducerRegistrationInfo registrationInfo) {
         ArrayList<EiType> types = new ArrayList<>();
         for (ProducerEiTypeRegistrationInfo typeInfo : registrationInfo.types) {
             types.add(registerType(typeInfo));
@@ -269,21 +282,26 @@ public class ProducerController {
             }
             type.addProducer(producer);
         }
+        return producer;
+    }
+
+    private void deregisterType(EiType type) {
+        this.eiTypes.remove(type);
+        for (EiJob job : this.eiJobs.getJobsForType(type.getId())) {
+            this.eiJobs.remove(job);
+            this.logger.warn("Deleted job {} because no producers left", job.id());
+        }
     }
 
-    private void deregisterProducer(EiProducer producer, boolean deleteJobs) {
+    private void deregisterProducer(EiProducer producer) {
         this.eiProducers.remove(producer);
         for (EiType type : producer.eiTypes()) {
             boolean removed = type.removeProducer(producer) != null;
             if (!removed) {
                 this.logger.error("Bug, no producer found");
             }
-            if (type.getProducerIds().isEmpty() && deleteJobs) {
-                this.eiTypes.remove(type);
-                for (EiJob job : this.eiJobs.getJobsForType(type.getId())) {
-                    this.eiJobs.remove(job);
-                    this.logger.warn("Deleted job {} because no producers left", job.id());
-                }
+            if (type.getProducerIds().isEmpty()) {
+                deregisterType(type);
             }
         }
     }
index 9326195..606ee41 100644 (file)
@@ -47,7 +47,7 @@ public class EiJobs {
     public synchronized EiJob getJob(String id) throws ServiceException {
         EiJob ric = allEiJobs.get(id);
         if (ric == null) {
-            throw new ServiceException("Could not find EI Job: " + id);
+            throw new ServiceException("Could not find EI job: " + id);
         }
         return ric;
     }
index 4c84488..4997539 100644 (file)
@@ -54,8 +54,6 @@ import org.oransc.enrichment.repository.EiJobs;
 import org.oransc.enrichment.repository.EiProducers;
 import org.oransc.enrichment.repository.EiType;
 import org.oransc.enrichment.repository.EiTypes;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
@@ -82,8 +80,8 @@ import reactor.test.StepVerifier;
         "server.ssl.key-store=./config/keystore.jks", //
         "app.webclient.trust-store=./config/truststore.jks"})
 class ApplicationTest {
-    private static final Logger logger = LoggerFactory.getLogger(ApplicationTest.class);
     private final String EI_TYPE_ID = "typeId";
+    private final String EI_PRODUCER_ID = "producerId";
     private final String EI_JOB_PROPERTY = "\"property1\"";
 
     @Autowired
@@ -137,7 +135,7 @@ class ApplicationTest {
 
     @Test
     void testGetEiTypes() throws Exception {
-        putEiProducerWithOneType("test");
+        putEiProducerWithOneType(EI_PRODUCER_ID, "test");
         String url = ConsumerConsts.API_ROOT + "/eitypes";
         String rsp = restClient().get(url).block();
         assertThat(rsp).isEqualTo("[\"test\"]");
@@ -145,7 +143,7 @@ class ApplicationTest {
 
     @Test
     void testGetEiType() throws Exception {
-        putEiProducerWithOneType("test");
+        putEiProducerWithOneType(EI_PRODUCER_ID, "test");
         String url = ConsumerConsts.API_ROOT + "/eitypes/test";
         String rsp = restClient().get(url).block();
         assertThat(rsp).contains("job_data_schema");
@@ -159,7 +157,7 @@ class ApplicationTest {
 
     @Test
     void testGetEiJobsIds() throws Exception {
-        putEiProducerWithOneType(EI_TYPE_ID);
+        putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
         putEiJob(EI_TYPE_ID, "jobId");
         String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs";
         String rsp = restClient().get(url).block();
@@ -174,16 +172,23 @@ class ApplicationTest {
 
     @Test
     void testGetEiJob() throws Exception {
-        putEiProducerWithOneType(EI_TYPE_ID);
+        putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
         putEiJob(EI_TYPE_ID, "jobId");
         String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/jobId";
         String rsp = restClient().get(url).block();
         assertThat(rsp).contains("job_data");
     }
 
+    @Test
+    void testGetEiJobNotFound() throws Exception {
+        putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
+        String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/junk";
+        testErrorCode(restClient().get(url), HttpStatus.NOT_FOUND, "Could not find EI job: junk");
+    }
+
     @Test
     void testGetEiJobStatus() throws Exception {
-        putEiProducerWithOneType(EI_TYPE_ID);
+        putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
         putEiJob(EI_TYPE_ID, "jobId");
         String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/jobId/status";
         String rsp = restClient().get(url).block();
@@ -194,7 +199,7 @@ class ApplicationTest {
 
     @Test
     void testDeleteEiJob() throws Exception {
-        putEiProducerWithOneType(EI_TYPE_ID);
+        putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
         putEiJob(EI_TYPE_ID, "jobId");
         assertThat(this.eiJobs.size()).isEqualTo(1);
         String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/jobId";
@@ -206,9 +211,16 @@ class ApplicationTest {
         assertThat(simulatorResults.jobsStopped.get(0).id).isEqualTo("jobId");
     }
 
+    @Test
+    void testDeleteEiJobNotFound() throws Exception {
+        putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
+        String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/junk";
+        testErrorCode(restClient().get(url), HttpStatus.NOT_FOUND, "Could not find EI job: junk");
+    }
+
     @Test
     void testPutEiJob() throws Exception {
-        putEiProducerWithOneType(EI_TYPE_ID);
+        putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
 
         String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/jobId";
         String body = gson.toJson(eiJobInfo());
@@ -229,7 +241,7 @@ class ApplicationTest {
 
     @Test
     void testPutEiJob_jsonSchemavalidationError() throws Exception {
-        putEiProducerWithOneType(EI_TYPE_ID);
+        putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
 
         String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/jobId";
         // The element with name "property1" is mandatory in the schema
@@ -242,12 +254,43 @@ class ApplicationTest {
 
     @Test
     void testGetEiProducerTypes() throws Exception {
-        putEiProducerWithOneType(EI_TYPE_ID);
+        final String EI_TYPE_ID_2 = EI_TYPE_ID + "_2";
+        putEiProducerWithOneType("producer1", EI_TYPE_ID);
         putEiJob(EI_TYPE_ID, "jobId");
+        putEiProducerWithOneType("producer2", EI_TYPE_ID_2);
+        putEiJob(EI_TYPE_ID_2, "jobId2");
         String url = ProducerConsts.API_ROOT + "/eitypes";
 
         ResponseEntity<String> resp = restClient().getForEntity(url).block();
         assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK);
+        assertThat(resp.getBody()).contains(EI_TYPE_ID);
+        assertThat(resp.getBody()).contains(EI_TYPE_ID_2);
+    }
+
+    @Test
+    void testReplacingEiProducerTypes() throws Exception {
+        final String REPLACED_TYPE_ID = "replaced";
+        putEiProducerWithOneType(EI_PRODUCER_ID, REPLACED_TYPE_ID);
+        putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
+
+        String url = ProducerConsts.API_ROOT + "/eitypes";
+
+        ResponseEntity<String> resp = restClient().getForEntity(url).block();
+        assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK);
+        assertThat(resp.getBody()).contains(EI_TYPE_ID);
+        assertThat(resp.getBody()).doesNotContain(REPLACED_TYPE_ID);
+    }
+
+    @Test
+    void testChangingEiTypeGetRejected() throws Exception {
+        putEiProducerWithOneType("producer1", "typeId1");
+        putEiProducerWithOneType("producer2", "typeId2");
+        putEiJob("typeId1", "jobId");
+
+        String url = ConsumerConsts.API_ROOT + "/eitypes/typeId2/eijobs/jobId";
+        String body = gson.toJson(eiJobInfo());
+        testErrorCode(restClient().put(url, body), HttpStatus.CONFLICT,
+            "Not allowed to change type for existing EI job");
     }
 
     @Test
@@ -275,7 +318,7 @@ class ApplicationTest {
 
     @Test
     void testPutEiProducerExistingJob() throws Exception {
-        putEiProducerWithOneType(EI_TYPE_ID);
+        putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
         putEiJob(EI_TYPE_ID, "jobId");
         String url = ProducerConsts.API_ROOT + "/eiproducers/eiProducerId";
         String body = gson.toJson(producerEiRegistratioInfo(EI_TYPE_ID));
@@ -307,7 +350,7 @@ class ApplicationTest {
 
     @Test
     void testGetEiJobsForProducer() throws JsonMappingException, JsonProcessingException, ServiceException {
-        putEiProducerWithOneType(EI_TYPE_ID);
+        putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
         putEiJob(EI_TYPE_ID, "jobId1");
         putEiJob(EI_TYPE_ID, "jobId2");
 
@@ -336,14 +379,18 @@ class ApplicationTest {
         EiType type = this.eiTypes.getType(EI_TYPE_ID);
         assertThat(type.getProducerIds().contains("eiProducerId")).isTrue();
         assertThat(type.getProducerIds().contains("eiProducerId2")).isTrue();
+        putEiJob(EI_TYPE_ID, "jobId");
+        assertThat(this.eiJobs.size()).isEqualTo(1);
 
         restClient().deleteForEntity(url).block();
         assertThat(this.eiProducers.size()).isEqualTo(1);
         assertThat(this.eiTypes.getType(EI_TYPE_ID).getProducerIds().contains("eiProducerId")).isFalse();
+        assertThat(this.eiJobs.size()).isEqualTo(1);
 
         restClient().deleteForEntity(url2).block();
         assertThat(this.eiProducers.size()).isEqualTo(0);
         assertThat(this.eiTypes.size()).isEqualTo(0);
+        assertThat(this.eiJobs.size()).isEqualTo(0);
     }
 
     ProducerEiTypeRegistrationInfo producerEiTypeRegistrationInfo(String typeId)
@@ -395,20 +442,19 @@ class ApplicationTest {
     private EiJob putEiJob(String eiTypeId, String jobId)
         throws JsonMappingException, JsonProcessingException, ServiceException {
 
-        String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/" + jobId;
+        String url = ConsumerConsts.API_ROOT + "/eitypes/" + eiTypeId + "/eijobs/" + jobId;
         String body = gson.toJson(eiJobInfo());
         restClient().putForEntity(url, body).block();
 
         return this.eiJobs.getJob(jobId);
     }
 
-    private EiType putEiProducerWithOneType(String eiTypeId)
+    private EiType putEiProducerWithOneType(String producerId, String eiTypeId)
         throws JsonMappingException, JsonProcessingException, ServiceException {
-        String url = ProducerConsts.API_ROOT + "/eiproducers/eiProducerId";
+        String url = ProducerConsts.API_ROOT + "/eiproducers/" + producerId;
         String body = gson.toJson(producerEiRegistratioInfo(eiTypeId));
 
         restClient().putForEntity(url, body).block();
-        assertThat(this.eiTypes.size()).isEqualTo(1);
         return this.eiTypes.getType(eiTypeId);
     }
 
index eaaf543..fa11044 100644 (file)
@@ -26,7 +26,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
-import org.springframework.boot.test.context.TestConfiguration;
 import org.springframework.boot.web.server.LocalServerPort;
 import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
@@ -40,14 +39,6 @@ import org.springframework.test.context.junit.jupiter.SpringExtension;
 class MockEnrichmentService {
     private static final Logger logger = LoggerFactory.getLogger(ApplicationTest.class);
 
-    /**
-     * Overrides the BeanFactory.
-     */
-    @TestConfiguration
-    static class TestBeanFactory {
-
-    }
-
     @LocalServerPort
     private int port;