Merge "Added STD sim 2.0.0 tests"
[nonrtric.git] / policy-agent / src / test / java / org / oransc / policyagent / MockPolicyAgent.java
index d02522c..f42a631 100644 (file)
  * limitations under the License.
  * ========================LICENSE_END===================================
  */
+
 package org.oransc.policyagent;
 
+import static org.awaitility.Awaitility.await;
+
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 
@@ -27,103 +30,182 @@ import java.io.IOException;
 import java.net.URL;
 import java.nio.file.Files;
 
-import org.junit.Test;
-import org.junit.runner.RunWith;
+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 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
-    private Rics rics;
+    Rics rics;
 
     @Autowired
-    private Policies policies;
+    Policies policies;
 
     @Autowired
-    private PolicyTypes policyTypes;
+    PolicyTypes policyTypes;
+
+    @Autowired
+    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());
+            return url.getFile();
         }
     }
 
     /**
-     * overrides the BeanFactory
+     * Overrides the BeanFactory.
      */
     @TestConfiguration
     static class TestBeanFactory {
 
+        private final Rics rics = new Rics();
+        private final Policies policies = new Policies();
+        private final PolicyTypes policyTypes = new PolicyTypes();
+
         @Bean
         public ApplicationConfig getApplicationConfig() {
             return new MockApplicationConfig();
         }
-    }
 
-    @LocalServerPort
-    private int port;
+        @Bean
+        public MockA1ClientFactory getA1ClientFactory() {
+            PolicyTypes ricTypes = new PolicyTypes();
+            loadTypes(ricTypes);
+            return new MockA1ClientFactory(ricTypes);
+        }
 
-    public void keepServerAlive() {
-        System.out.println("Keeping server alive!");
-        try {
-            synchronized (this) {
-                this.wait();
+        @Bean
+        public Policies getPolicies() {
+            return this.policies;
+        }
+
+        @Bean
+        public PolicyTypes getPolicyTypes() {
+            return this.policyTypes;
+        }
+
+        @Bean
+        public Rics getRics() {
+            return this.rics;
+        }
+
+        private static File[] getResourceFolderFiles(String folder) {
+            return getFile(folder).listFiles();
+        }
+
+        private static String readFile(File file) throws IOException {
+            return new String(Files.readAllBytes(file.toPath()));
+        }
+
+        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();
     }