From: PatrikBuhr Date: Fri, 25 Sep 2020 09:21:18 +0000 (+0200) Subject: Added tests X-Git-Tag: 2.1.0~41 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=af40dc43f26d3fea66ac04625080314162e93496;hp=--cc;p=nonrtric.git Added tests 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 --- af40dc43f26d3fea66ac04625080314162e93496 diff --git a/enrichment-coordinator-service/docs/api.yaml b/enrichment-coordinator-service/docs/api.yaml index 2fbf934e..570caee6 100644 --- a/enrichment-coordinator-service/docs/api.yaml +++ b/enrichment-coordinator-service/docs/api.yaml @@ -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: diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/ErrorResponse.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/ErrorResponse.java index c90a6491..20e9f762 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/ErrorResponse.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/ErrorResponse.java @@ -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 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); diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerController.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerController.java index e167eb85..ff045223 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerController.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerController.java @@ -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); diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerController.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerController.java index af259510..c9b6467c 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerController.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerController.java @@ -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 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 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 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); } } } diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/repository/EiJobs.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/repository/EiJobs.java index 9326195f..606ee416 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/repository/EiJobs.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/repository/EiJobs.java @@ -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; } diff --git a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java index 4c844884..4997539c 100644 --- a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java +++ b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java @@ -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 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 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); } diff --git a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/MockEnrichmentService.java b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/MockEnrichmentService.java index eaaf543e..fa110445 100644 --- a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/MockEnrichmentService.java +++ b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/MockEnrichmentService.java @@ -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;