dd57710cd02f37ea1b1f5434989fc02a6c012d82
[nonrtric.git] / policy-agent / src / test / java / org / oransc / policyagent / MockPolicyAgent.java
1 /*-
2  * ========================LICENSE_START=================================
3  * O-RAN-SC
4  * %%
5  * Copyright (C) 2019 Nordix Foundation
6  * %%
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ========================LICENSE_END===================================
19  */
20
21 package org.oransc.policyagent;
22
23 import com.google.gson.JsonObject;
24 import com.google.gson.JsonParser;
25
26 import java.io.File;
27 import java.io.IOException;
28 import java.net.URL;
29 import java.nio.file.Files;
30 import java.util.Collection;
31 import java.util.HashMap;
32 import java.util.Map;
33 import java.util.Vector;
34
35 import org.junit.jupiter.api.Test;
36 import org.junit.jupiter.api.extension.ExtendWith;
37 import org.oransc.policyagent.clients.A1Client;
38 import org.oransc.policyagent.configuration.ApplicationConfig;
39 import org.oransc.policyagent.repository.ImmutablePolicyType;
40 import org.oransc.policyagent.repository.Policies;
41 import org.oransc.policyagent.repository.PolicyType;
42 import org.oransc.policyagent.repository.PolicyTypes;
43 import org.oransc.policyagent.repository.Rics;
44 import org.springframework.beans.factory.annotation.Autowired;
45 import org.springframework.boot.test.context.SpringBootTest;
46 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
47 import org.springframework.boot.test.context.TestConfiguration;
48 import org.springframework.boot.web.server.LocalServerPort;
49 import org.springframework.context.annotation.Bean;
50 import org.springframework.test.context.junit.jupiter.SpringExtension;
51 import reactor.core.publisher.Mono;
52
53 @ExtendWith(SpringExtension.class)
54 @SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
55 public class MockPolicyAgent {
56
57     @Autowired
58     private Rics rics;
59
60     @Autowired
61     private Policies policies;
62
63     @Autowired
64     private PolicyTypes policyTypes;
65
66     static class MockApplicationConfig extends ApplicationConfig {
67
68         @Override
69         public void initialize() {
70             URL url = MockApplicationConfig.class.getClassLoader().getResource("test_application_configuration.json");
71             loadConfigurationFromFile(url.getFile());
72         }
73     }
74
75     private static class RicPolicyDatabase {
76         private Map<String, Map<String, String>> policies = new HashMap<>();
77
78         public void putPolicy(String nearRtRicUrl, String policyId, String policyString) {
79             getPolicies(nearRtRicUrl).put(policyId, policyString);
80         }
81
82         public Collection<String> getPolicyIdentities(String nearRtRicUrl) {
83             return getPolicies(nearRtRicUrl).keySet();
84         }
85
86         public void deletePolicy(String nearRtRicUrl, String policyId) {
87             getPolicies(nearRtRicUrl).remove(policyId);
88         }
89
90         private Map<String, String> getPolicies(String nearRtRicUrl) {
91             if (!policies.containsKey(nearRtRicUrl)) {
92                 policies.put(nearRtRicUrl, new HashMap<>());
93             }
94             return policies.get(nearRtRicUrl);
95         }
96     }
97
98     static class A1ClientMock implements A1Client {
99
100         private final RicPolicyDatabase policies = new RicPolicyDatabase();
101         private final PolicyTypes policyTypes = new PolicyTypes();
102
103         A1ClientMock() {
104             loadTypes(this.policyTypes);
105         }
106
107         @Override
108         public Mono<Collection<String>> getPolicyTypeIdentities(String nearRtRicUrl) {
109             Vector<String> result = new Vector<>();
110             for (PolicyType p : this.policyTypes.getAll()) {
111                 result.add(p.name());
112             }
113             return Mono.just(result);
114         }
115
116         @Override
117         public Mono<Collection<String>> getPolicyIdentities(String nearRtRicUrl) {
118             Collection<String> result = policies.getPolicyIdentities(nearRtRicUrl);
119             return Mono.just(result);
120         }
121
122         @Override
123         public Mono<String> getPolicyType(String nearRtRicUrl, String policyTypeId) {
124             try {
125                 return Mono.just(this.policyTypes.getType(policyTypeId).schema());
126             } catch (Exception e) {
127                 return Mono.error(e);
128             }
129         }
130
131         @Override
132         public Mono<String> putPolicy(String nearRtRicUrl, String policyId, String policyString) {
133             policies.putPolicy(nearRtRicUrl, policyId, policyString);
134             return Mono.just("OK");
135         }
136
137         @Override
138         public Mono<String> deletePolicy(String nearRtRicUrl, String policyId) {
139             policies.deletePolicy(nearRtRicUrl, policyId);
140             return Mono.just("OK");
141         }
142
143         private static File[] getResourceFolderFiles(String folder) {
144             ClassLoader loader = Thread.currentThread().getContextClassLoader();
145             URL url = loader.getResource(folder);
146             String path = url.getPath();
147             return new File(path).listFiles();
148         }
149
150         private static String readFile(File file) throws IOException {
151             return new String(Files.readAllBytes(file.toPath()));
152         }
153
154         private void loadTypes(PolicyTypes policyTypes) {
155             File[] files = getResourceFolderFiles("policy_types/");
156             for (File file : files) {
157                 try {
158                     String schema = readFile(file);
159                     String typeName = title(schema);
160                     PolicyType type = ImmutablePolicyType.builder().name(typeName).schema(schema).build();
161                     policyTypes.put(type);
162                 } catch (Exception e) {
163                     System.out.println("Could not load json schema " + e);
164                 }
165             }
166         }
167     }
168
169     /**
170      * overrides the BeanFactory
171      */
172     @TestConfiguration
173     static class TestBeanFactory {
174
175         private final Rics rics = new Rics();
176         private final Policies policies = new Policies();
177         private final PolicyTypes policyTypes = new PolicyTypes();
178
179         @Bean
180         public ApplicationConfig getApplicationConfig() {
181             return new MockApplicationConfig();
182         }
183
184         @Bean
185         A1Client getA1Client() {
186             return new A1ClientMock();
187         }
188
189         @Bean
190         public Policies getPolicies() {
191             return this.policies;
192         }
193
194         @Bean
195         public PolicyTypes getPolicyTypes() {
196             return this.policyTypes;
197         }
198
199         @Bean
200         public Rics getRics() {
201             return this.rics;
202         }
203     }
204
205     @LocalServerPort
206     private int port;
207
208     private void keepServerAlive() {
209         System.out.println("Keeping server alive!");
210         try {
211             synchronized (this) {
212                 this.wait();
213             }
214         } catch (Exception ex) {
215             System.out.println("Unexpected: " + ex.toString());
216         }
217     }
218
219     private static String title(String jsonSchema) {
220         JsonObject parsedSchema = (JsonObject) new JsonParser().parse(jsonSchema);
221         String title = parsedSchema.get("title").getAsString();
222         return title;
223     }
224
225     @Test
226     public void runMock() throws Exception {
227         keepServerAlive();
228     }
229
230 }