import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.invoke.MethodHandles;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.Arrays;
+import java.util.Map;
import org.json.JSONObject;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.extension.ExtendWith;
import org.oransc.ics.clients.AsyncRestClient;
import org.oransc.ics.clients.AsyncRestClientFactory;
+import org.oransc.ics.clients.SecurityContext;
import org.oransc.ics.configuration.ApplicationConfig;
import org.oransc.ics.configuration.ImmutableHttpProxyConfig;
import org.oransc.ics.configuration.ImmutableWebClientConfig;
import org.oransc.ics.configuration.WebClientConfig;
import org.oransc.ics.configuration.WebClientConfig.HttpProxyConfig;
+import org.oransc.ics.controller.A1eCallbacksSimulatorController;
import org.oransc.ics.controller.ConsumerSimulatorController;
import org.oransc.ics.controller.ProducerSimulatorController;
import org.oransc.ics.controllers.a1e.A1eConsts;
@Autowired
ConsumerSimulatorController consumerSimulator;
+ @Autowired
+ A1eCallbacksSimulatorController a1eCallbacksSimulator;
+
@Autowired
ProducerSupervision producerSupervision;
@Autowired
InfoTypeSubscriptions infoTypeSubscriptions;
+ @Autowired
+ SecurityContext securityContext;
+
private static Gson gson = new GsonBuilder().create();
/**
this.infoTypeSubscriptions.clear();
this.producerSimulator.getTestResults().reset();
this.consumerSimulator.getTestResults().reset();
+ this.a1eCallbacksSimulator.getTestResults().reset();
+ this.securityContext.setAuthTokenFilePath(null);
}
@AfterEach
assertThat(this.infoJobs.size()).isZero();
ProducerSimulatorController.TestResults simulatorResults = this.producerSimulator.getTestResults();
- await().untilAsserted(() -> assertThat(simulatorResults.jobsStopped.size()).isEqualTo(1));
+ await().untilAsserted(() -> assertThat(simulatorResults.jobsStopped).hasSize(1));
assertThat(simulatorResults.jobsStopped.get(0)).isEqualTo("jobId");
+
}
@Test
assertThat(this.infoJobs.size()).isZero();
ProducerSimulatorController.TestResults simulatorResults = this.producerSimulator.getTestResults();
- await().untilAsserted(() -> assertThat(simulatorResults.jobsStopped.size()).isEqualTo(1));
+ await().untilAsserted(() -> assertThat(simulatorResults.jobsStopped).hasSize(1));
assertThat(simulatorResults.jobsStopped.get(0)).isEqualTo("jobId");
testErrorCode(restClient().delete(url), HttpStatus.NOT_FOUND, "Could not find Information job: jobId");
assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.CREATED);
ProducerSimulatorController.TestResults simulatorResults = this.producerSimulator.getTestResults();
- await().untilAsserted(() -> assertThat(simulatorResults.jobsStarted.size()).isEqualTo(1));
+ await().untilAsserted(() -> assertThat(simulatorResults.jobsStarted).hasSize(1));
ProducerJobInfo request = simulatorResults.jobsStarted.get(0);
assertThat(request.id).isEqualTo("jobId");
assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.CREATED);
ProducerSimulatorController.TestResults simulatorResults = this.producerSimulator.getTestResults();
- await().untilAsserted(() -> assertThat(simulatorResults.jobsStarted.size()).isEqualTo(1));
+ await().untilAsserted(() -> assertThat(simulatorResults.jobsStarted).hasSize(1));
ProducerJobInfo request = simulatorResults.jobsStarted.get(0);
assertThat(request.id).isEqualTo("jobId");
restClient().putForEntity(url, body).block();
ProducerSimulatorController.TestResults simulatorResults = this.producerSimulator.getTestResults();
- await().untilAsserted(() -> assertThat(simulatorResults.jobsStarted.size()).isEqualTo(2));
+ await().untilAsserted(() -> assertThat(simulatorResults.jobsStarted).hasSize(2));
ProducerJobInfo request = simulatorResults.jobsStarted.get(0);
assertThat(request.id).isEqualTo("jobId");
}
restClient().putForEntity(url, body).block();
ProducerSimulatorController.TestResults simulatorResults = this.producerSimulator.getTestResults();
- await().untilAsserted(() -> assertThat(simulatorResults.jobsStarted.size()).isEqualTo(1));
+ await().untilAsserted(() -> assertThat(simulatorResults.jobsStarted).hasSize(1));
ProducerJobInfo request = simulatorResults.jobsStarted.get(0);
assertThat(request.id).isEqualTo("jobId");
}
@Test
void a1eJobStatusNotifications() throws JsonMappingException, JsonProcessingException, ServiceException {
- ConsumerSimulatorController.TestResults consumerCalls = this.consumerSimulator.getTestResults();
+ A1eCallbacksSimulatorController.TestResults consumerCalls = this.a1eCallbacksSimulator.getTestResults();
ProducerSimulatorController.TestResults producerCalls = this.producerSimulator.getTestResults();
putInfoProducerWithOneType("infoProducerId", TYPE_ID);
putInfoJob(TYPE_ID, "jobId");
putInfoProducerWithOneType("infoProducerId2", TYPE_ID);
- await().untilAsserted(() -> assertThat(producerCalls.jobsStarted.size()).isEqualTo(2));
+ await().untilAsserted(() -> assertThat(producerCalls.jobsStarted).hasSize(2));
deleteInfoProducer("infoProducerId2");
assertThat(this.infoTypes.size()).isEqualTo(1); // The type remains, one producer left
deleteInfoProducer("infoProducerId");
assertThat(this.infoTypes.size()).isEqualTo(1); // The type remains
assertThat(this.infoJobs.size()).isEqualTo(1); // The job remains
- await().untilAsserted(() -> assertThat(consumerCalls.eiJobStatusCallbacks.size()).isEqualTo(1));
+ await().untilAsserted(() -> assertThat(consumerCalls.eiJobStatusCallbacks).hasSize(1));
assertThat(consumerCalls.eiJobStatusCallbacks.get(0).state)
.isEqualTo(A1eEiJobStatus.EiJobStatusValues.DISABLED);
putInfoProducerWithOneType("infoProducerId", TYPE_ID);
- await().untilAsserted(() -> assertThat(consumerCalls.eiJobStatusCallbacks.size()).isEqualTo(2));
+ await().untilAsserted(() -> assertThat(consumerCalls.eiJobStatusCallbacks).hasSize(2));
assertThat(consumerCalls.eiJobStatusCallbacks.get(1).state).isEqualTo(A1eEiJobStatus.EiJobStatusValues.ENABLED);
}
// change the type for the producer, the job shall be disabled
putInfoProducerWithOneType(PRODUCER_ID, "junk");
verifyJobStatus(EI_JOB_ID, "DISABLED");
- ConsumerSimulatorController.TestResults consumerCalls = this.consumerSimulator.getTestResults();
- await().untilAsserted(() -> assertThat(consumerCalls.eiJobStatusCallbacks.size()).isEqualTo(1));
+ A1eCallbacksSimulatorController.TestResults consumerCalls = this.a1eCallbacksSimulator.getTestResults();
+ await().untilAsserted(() -> assertThat(consumerCalls.eiJobStatusCallbacks).hasSize(1));
assertThat(consumerCalls.eiJobStatusCallbacks.get(0).state)
.isEqualTo(A1eEiJobStatus.EiJobStatusValues.DISABLED);
putInfoProducerWithOneType(PRODUCER_ID, TYPE_ID);
verifyJobStatus(EI_JOB_ID, "ENABLED");
- await().untilAsserted(() -> assertThat(consumerCalls.eiJobStatusCallbacks.size()).isEqualTo(2));
+ await().untilAsserted(() -> assertThat(consumerCalls.eiJobStatusCallbacks).hasSize(2));
assertThat(consumerCalls.eiJobStatusCallbacks.get(1).state).isEqualTo(A1eEiJobStatus.EiJobStatusValues.ENABLED);
}
ResponseEntity<String> resp = restClient().getForEntity(url).block();
assertThat(resp.getBody()).contains(PRODUCER_ID);
- url = ProducerConsts.API_ROOT + "/info-producers?info_type_id=" + TYPE_ID;
+ url = ProducerConsts.API_ROOT + "/info-producers?infoTypeId=" + TYPE_ID;
resp = restClient().getForEntity(url).block();
assertThat(resp.getBody()).contains(PRODUCER_ID);
- url = ProducerConsts.API_ROOT + "/info-producers?info_type_id=junk";
+ url = ProducerConsts.API_ROOT + "/info-producers?infoTypeId=junk";
resp = restClient().getForEntity(url).block();
assertThat(resp.getBody()).isEqualTo("[]");
}
@Test
void producerSupervision() throws JsonMappingException, JsonProcessingException, ServiceException {
- ConsumerSimulatorController.TestResults consumerResults = this.consumerSimulator.getTestResults();
+ A1eCallbacksSimulatorController.TestResults consumerResults = this.a1eCallbacksSimulator.getTestResults();
putInfoProducerWithOneTypeRejecting("simulateProducerError", TYPE_ID);
{
verifyJobStatus(EI_JOB_ID, "ENABLED");
deleteInfoProducer(PRODUCER_ID);
// A Job disabled status notification shall now be received
- await().untilAsserted(() -> assertThat(consumerResults.eiJobStatusCallbacks.size()).isEqualTo(1));
+ await().untilAsserted(() -> assertThat(consumerResults.eiJobStatusCallbacks).hasSize(1));
assertThat(consumerResults.eiJobStatusCallbacks.get(0).state)
.isEqualTo(A1eEiJobStatus.EiJobStatusValues.DISABLED);
verifyJobStatus(EI_JOB_ID, "DISABLED");
// Now we have one disabled job, and no producer.
// PUT a producer, then a Job ENABLED status notification shall be received
putInfoProducerWithOneType(PRODUCER_ID, TYPE_ID);
- await().untilAsserted(() -> assertThat(consumerResults.eiJobStatusCallbacks.size()).isEqualTo(2));
+ await().untilAsserted(() -> assertThat(consumerResults.eiJobStatusCallbacks).hasSize(2));
assertThat(consumerResults.eiJobStatusCallbacks.get(1).state)
.isEqualTo(A1eEiJobStatus.EiJobStatusValues.ENABLED);
verifyJobStatus(EI_JOB_ID, "ENABLED");
// Run the supervision and wait for the job to get started in the producer
this.producerSupervision.createTask().blockLast();
- ConsumerSimulatorController.TestResults consumerResults = this.consumerSimulator.getTestResults();
- await().untilAsserted(() -> assertThat(consumerResults.eiJobStatusCallbacks.size()).isEqualTo(1));
+ A1eCallbacksSimulatorController.TestResults consumerResults = this.a1eCallbacksSimulator.getTestResults();
+ await().untilAsserted(() -> assertThat(consumerResults.eiJobStatusCallbacks).hasSize(1));
assertThat(consumerResults.eiJobStatusCallbacks.get(0).state)
.isEqualTo(A1eEiJobStatus.EiJobStatusValues.ENABLED);
verifyJobStatus(EI_JOB_ID, "ENABLED");
assertThat(this.infoJobs.size()).isEqualTo(1);
ProducerSimulatorController.TestResults simulatorResults = this.producerSimulator.getTestResults();
- await().untilAsserted(() -> assertThat(simulatorResults.jobsStopped.size()).isEqualTo(3));
+ await().untilAsserted(() -> assertThat(simulatorResults.jobsStopped).hasSize(3));
}
@Test
// Test callback for PUT type
this.putInfoType(TYPE_ID);
- await().untilAsserted(() -> assertThat(consumerCalls.typeRegistrationInfoCallbacks.size()).isEqualTo(1));
+ await().untilAsserted(() -> assertThat(consumerCalls.typeRegistrationInfoCallbacks).hasSize(1));
assertThat(consumerCalls.typeRegistrationInfoCallbacks.get(0).state)
.isEqualTo(ConsumerTypeRegistrationInfo.ConsumerTypeStatusValues.REGISTERED);
// Test callback for DELETE type
this.deleteInfoType(TYPE_ID);
- await().untilAsserted(() -> assertThat(consumerCalls.typeRegistrationInfoCallbacks.size()).isEqualTo(2));
+ await().untilAsserted(() -> assertThat(consumerCalls.typeRegistrationInfoCallbacks).hasSize(2));
assertThat(consumerCalls.typeRegistrationInfoCallbacks.get(1).state)
.isEqualTo(ConsumerTypeRegistrationInfo.ConsumerTypeStatusValues.DEREGISTERED);
}
"Could not find Information subscription: junk");
}
+ @Test
+ void testAuthHeader() throws Exception {
+ final String AUTH_TOKEN = "testToken";
+ Path authFile = Files.createTempFile("icsTestAuthToken", ".txt");
+ Files.write(authFile, AUTH_TOKEN.getBytes());
+ this.securityContext.setAuthTokenFilePath(authFile);
+ putInfoProducerWithOneType(PRODUCER_ID, TYPE_ID);
+ putInfoJob(TYPE_ID, "jobId");
+
+ // Test that authorization header is sent to the producer.
+ await().untilAsserted(() -> assertThat(this.producerSimulator.getTestResults().receivedHeaders).hasSize(1));
+ Map<String, String> headers = this.producerSimulator.getTestResults().receivedHeaders.get(0);
+ assertThat(headers).containsEntry("authorization", "Bearer " + AUTH_TOKEN);
+
+ Files.delete(authFile);
+
+ // Test that it works. The cached header is used
+ putInfoJob(TYPE_ID, "jobId2");
+ await().untilAsserted(() -> assertThat(this.infoJobs.size()).isEqualByComparingTo(2));
+ headers = this.producerSimulator.getTestResults().receivedHeaders.get(1);
+ assertThat(headers).containsEntry("authorization", "Bearer " + AUTH_TOKEN);
+
+ }
+
private String typeSubscriptionUrl() {
return ConsumerConsts.API_ROOT + "/info-type-subscription";
}
ConsumerJobInfo consumerJobInfo(String typeId, String infoJobId)
throws JsonMappingException, JsonProcessingException {
return new ConsumerJobInfo(typeId, jsonObject(), "owner", "https://junk.com",
- baseUrl() + ConsumerSimulatorController.getJobStatusUrl(infoJobId));
+ baseUrl() + A1eCallbacksSimulatorController.getJobStatusUrl(infoJobId));
}
private A1eEiJobInfo infoJobInfo() throws JsonMappingException, JsonProcessingException {
A1eEiJobInfo infoJobInfo(String typeId, String infoJobId) throws JsonMappingException, JsonProcessingException {
return new A1eEiJobInfo(typeId, jsonObject(), "owner", "https://junk.com",
- baseUrl() + ConsumerSimulatorController.getJobStatusUrl(infoJobId));
+ baseUrl() + A1eCallbacksSimulatorController.getJobStatusUrl(infoJobId));
}
private Object jsonObject(String json) {
.trustStorePassword(config.trustStorePassword()) //
.httpProxyConfig(httpProxyConfig).build();
- AsyncRestClientFactory restClientFactory = new AsyncRestClientFactory(config);
+ AsyncRestClientFactory restClientFactory = new AsyncRestClientFactory(config, securityContext);
return restClientFactory.createRestClientNoHttpProxy(baseUrl());
}