package org.oransc.policyagent;
+import static org.awaitility.Awaitility.await;
+
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
-import java.util.Vector;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.oransc.policyagent.clients.A1Client;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import org.oransc.policyagent.configuration.ApplicationConfig;
+import org.oransc.policyagent.repository.ImmutablePolicy;
import org.oransc.policyagent.repository.ImmutablePolicyType;
import org.oransc.policyagent.repository.Policies;
+import org.oransc.policyagent.repository.Policy;
import org.oransc.policyagent.repository.PolicyType;
import org.oransc.policyagent.repository.PolicyTypes;
+import org.oransc.policyagent.repository.Ric;
import org.oransc.policyagent.repository.Rics;
+import org.oransc.policyagent.utils.MockA1ClientFactory;
+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;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.context.annotation.Bean;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import reactor.core.publisher.Flux;
-import reactor.core.publisher.Mono;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.util.StringUtils;
-@RunWith(SpringRunner.class)
+@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
-public class MockPolicyAgent {
+@TestPropertySource(
+ properties = { //
+ "server.ssl.key-store=./config/keystore.jks", //
+ "app.webclient.trust-store=./config/truststore.jks"})
+class MockPolicyAgent {
+ private static final Logger logger = LoggerFactory.getLogger(MockPolicyAgent.class);
+
+ @Autowired
+ Rics rics;
@Autowired
- private Rics rics;
+ Policies policies;
@Autowired
- private Policies policies;
+ PolicyTypes policyTypes;
@Autowired
- private PolicyTypes policyTypes;
+ ApplicationConfig applicationConfig;
static class MockApplicationConfig extends ApplicationConfig {
@Override
- public void initialize() {
+ public String getLocalConfigurationFilePath() {
URL url = MockApplicationConfig.class.getClassLoader().getResource("test_application_configuration.json");
- loadConfigurationFromFile(url.getFile());
- }
- }
-
- static class A1ClientMock implements A1Client {
- private final Policies policies;
- private final PolicyTypes policyTypes;
-
- A1ClientMock(Policies policies, PolicyTypes policyTypes) {
- this.policies = policies;
- this.policyTypes = policyTypes;
- }
-
- @Override
- public Flux<String> getAllPolicyTypes(String nearRtRicUrl) {
- Vector<String> result = new Vector<>();
- for (PolicyType p : this.policyTypes.getAll()) {
- result.add(p.name());
- }
- return Flux.fromIterable(result);
- }
-
- @Override
- public Flux<String> getPoliciesForType(String nearRtRicUrl, String policyTypeId) {
- return Flux.empty();
- }
-
- @Override
- public Mono<String> getPolicy(String nearRtRicUrl, String policyId) {
- try {
- return Mono.just(this.policies.get(policyId).json());
- } catch (Exception e) {
- return Mono.error(e);
- }
- }
-
- @Override
- public Mono<String> putPolicy(String nearRtRicUrl, String policyId, String policyString) {
- return Mono.just("OK");
+ return url.getFile();
}
-
- @Override
- public Mono<Void> deletePolicy(String nearRtRicUrl, String policyId) {
- return Mono.error(new Exception("TODO We cannot use Void like this")); // TODO We cannot use Void like this
- }
-
}
/**
- * overrides the BeanFactory
+ * Overrides the BeanFactory.
*/
@TestConfiguration
static class TestBeanFactory {
}
@Bean
- A1Client getA1Client() {
- return new A1ClientMock(this.policies, this.policyTypes);
+ public MockA1ClientFactory getA1ClientFactory() {
+ PolicyTypes ricTypes = new PolicyTypes();
+ loadTypes(ricTypes);
+ return new MockA1ClientFactory(ricTypes);
}
@Bean
return this.rics;
}
- }
+ private static File[] getResourceFolderFiles(String folder) {
+ return getFile(folder).listFiles();
+ }
- @LocalServerPort
- private int port;
+ private static String readFile(File file) throws IOException {
+ return new String(Files.readAllBytes(file.toPath()));
+ }
- public void keepServerAlive() {
- System.out.println("Keeping server alive!");
- try {
- synchronized (this) {
- this.wait();
+ private void loadTypes(PolicyTypes policyTypes) {
+ File[] files = getResourceFolderFiles("policy_types/");
+ for (File file : files) {
+ try {
+ String schema = readFile(file);
+ String typeName = title(schema);
+ PolicyType type = ImmutablePolicyType.builder().name(typeName).schema(schema).build();
+ policyTypes.put(type);
+ } catch (Exception e) {
+ logger.error("Could not load json schema ", e);
+ }
}
- } catch (Exception ex) {
- System.out.println("Unexpected: " + ex.toString());
+ policyTypes.put(ImmutablePolicyType.builder().name("").schema("{}").build());
}
}
- private static File[] getResourceFolderFiles(String folder) {
+ private static File getFile(String path) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
- URL url = loader.getResource(folder);
- String path = url.getPath();
- return new File(path).listFiles();
+ URL url = loader.getResource(path);
+ return new File(url.getPath());
+ }
+
+ @LocalServerPort
+ private int port;
+
+ private void keepServerAlive() throws InterruptedException, IOException {
+ waitForConfigurationToBeLoaded();
+ loadInstances();
+ logger.info("Keeping server alive!");
+ synchronized (this) {
+ this.wait();
+ }
}
- private static String readFile(File file) throws IOException {
- return new String(Files.readAllBytes(file.toPath()));
+ private void waitForConfigurationToBeLoaded() throws IOException {
+ String json = getConfigJsonFromFile();
+ try {
+ int noOfRicsInConfigFile = StringUtils.countOccurrencesOf(json, "baseUrl");
+ await().until(() -> rics.size() == noOfRicsInConfigFile);
+ } catch (Exception e) {
+ logger.info("Loaded rics: {}, and no of rics in config file: {} never matched!", rics.size(),
+ StringUtils.countOccurrencesOf(json, "baseUrl"));
+ }
}
private static String title(String jsonSchema) {
- JsonObject parsedSchema = (JsonObject) new JsonParser().parse(jsonSchema);
+ JsonObject parsedSchema = (JsonObject) JsonParser.parseString(jsonSchema);
String title = parsedSchema.get("title").getAsString();
return title;
}
- private static void loadTypes(PolicyTypes policyTypes) {
- File[] files = getResourceFolderFiles("policy_types/");
- for (File file : files) {
- try {
- String schema = readFile(file);
- String typeName = title(schema);
- PolicyType type = ImmutablePolicyType.builder().name(typeName).jsonSchema(schema).build();
- policyTypes.put(type);
- } catch (Exception e) {
- System.out.println("Could not load json schema " + e);
- }
- }
+ private void loadInstances() throws IOException {
+ PolicyType unnamedPolicyType = policyTypes.get("");
+ Ric ric = rics.get("ric1");
+ String json = getConfigJsonFromFile();
+
+ Policy policy = ImmutablePolicy.builder() //
+ .id("typelessPolicy") //
+ .json(json) //
+ .ownerServiceName("MockPolicyAgent") //
+ .ric(ric) //
+ .type(unnamedPolicyType) //
+ .lastModified("now") //
+ .isTransient(false) //
+ .build();
+ this.policies.put(policy);
+ }
+
+ private String getConfigJsonFromFile() throws IOException {
+ File jsonFile = getFile("test_application_configuration.json");
+ String json = new String(Files.readAllBytes(jsonFile.toPath()));
+ return json;
}
@Test
- public void runMock() throws Exception {
- loadTypes(this.policyTypes);
+ @SuppressWarnings("squid:S2699") // Tests should include assertions. This test is only for keeping the server
+ // alive, so it will only be confusing to add an assertion.
+ void runMock() throws Exception {
keepServerAlive();
}