Merge "Recovery handling"
[nonrtric.git] / policy-agent / src / test / java / org / oransc / policyagent / ApplicationTest.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 static org.assertj.core.api.Assertions.assertThat;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.jupiter.api.Assertions.assertFalse;
26
27 import com.google.gson.Gson;
28 import com.google.gson.GsonBuilder;
29 import com.google.gson.reflect.TypeToken;
30
31 import java.net.URL;
32 import java.util.Collection;
33 import java.util.List;
34 import java.util.Vector;
35
36 import org.junit.jupiter.api.Test;
37 import org.junit.jupiter.api.extension.ExtendWith;
38 import org.oransc.policyagent.clients.A1Client;
39 import org.oransc.policyagent.configuration.ApplicationConfig;
40 import org.oransc.policyagent.configuration.ImmutableRicConfig;
41 import org.oransc.policyagent.configuration.RicConfig;
42 import org.oransc.policyagent.controllers.ImmutableServiceRegistrationInfo;
43 import org.oransc.policyagent.controllers.ImmutableServiceStatus;
44 import org.oransc.policyagent.controllers.ServiceRegistrationInfo;
45 import org.oransc.policyagent.controllers.ServiceStatus;
46 import org.oransc.policyagent.exceptions.ServiceException;
47 import org.oransc.policyagent.repository.ImmutablePolicy;
48 import org.oransc.policyagent.repository.ImmutablePolicyType;
49 import org.oransc.policyagent.repository.Policies;
50 import org.oransc.policyagent.repository.Policy;
51 import org.oransc.policyagent.repository.PolicyType;
52 import org.oransc.policyagent.repository.PolicyTypes;
53 import org.oransc.policyagent.repository.Ric;
54 import org.oransc.policyagent.repository.Rics;
55 import org.springframework.beans.factory.annotation.Autowired;
56 import org.springframework.boot.test.context.SpringBootTest;
57 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
58 import org.springframework.boot.test.context.TestConfiguration;
59 import org.springframework.boot.web.server.LocalServerPort;
60 import org.springframework.context.ApplicationContext;
61 import org.springframework.context.annotation.Bean;
62 import org.springframework.http.HttpStatus;
63 import org.springframework.http.ResponseEntity;
64 import org.springframework.test.context.junit.jupiter.SpringExtension;
65 import org.springframework.web.client.RestTemplate;
66 import reactor.core.publisher.Mono;
67
68 @ExtendWith(SpringExtension.class)
69 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
70 public class ApplicationTest {
71     @Autowired
72     ApplicationContext context;
73
74     @Autowired
75     private Rics rics;
76
77     @Autowired
78     private Policies policies;
79
80     @Autowired
81     private PolicyTypes policyTypes;
82
83     private static Gson gson = new GsonBuilder() //
84         .serializeNulls() //
85         .create(); //
86
87     public static class MockApplicationConfig extends ApplicationConfig {
88         @Override
89         public void initialize() {
90             URL url = MockApplicationConfig.class.getClassLoader().getResource("test_application_configuration.json");
91             loadConfigurationFromFile(url.getFile());
92         }
93     }
94
95     static class A1ClientMock implements A1Client {
96         private final Policies policies;
97         private final PolicyTypes policyTypes;
98
99         A1ClientMock(Policies policies, PolicyTypes policyTypes) {
100             this.policies = policies;
101             this.policyTypes = policyTypes;
102         }
103
104         @Override
105         public Mono<Collection<String>> getPolicyTypeIdentities(String nearRtRicUrl) {
106             Vector<String> result = new Vector<>();
107             for (PolicyType p : this.policyTypes.getAll()) {
108                 result.add(p.name());
109             }
110             return Mono.just(result);
111         }
112
113         @Override
114         public Mono<String> getPolicyType(String nearRtRicUrl, String policyTypeId) {
115             try {
116                 return Mono.just(this.policies.get(policyTypeId).json());
117             } catch (Exception e) {
118                 return Mono.error(e);
119             }
120         }
121
122         @Override
123         public Mono<String> putPolicy(String nearRtRicUrl, String policyId, String policyString) {
124             return Mono.just("OK");
125         }
126
127         @Override
128         public Mono<String> deletePolicy(String nearRtRicUrl, String policyId) {
129             return Mono.just("OK");
130         }
131
132         @Override
133         public Mono<Collection<String>> getPolicyIdentities(String nearRtRicUrl) {
134             return Mono.empty(); // problem is that a recovery will start
135         }
136     }
137
138     /**
139      * Overrides the BeanFactory.
140      */
141     @TestConfiguration
142     static class TestBeanFactory {
143         private final Rics rics = new Rics();
144         private final Policies policies = new Policies();
145         private final PolicyTypes policyTypes = new PolicyTypes();
146
147         @Bean
148         public ApplicationConfig getApplicationConfig() {
149             return new MockApplicationConfig();
150         }
151
152         @Bean
153         A1Client getA1Client() {
154             return new A1ClientMock(this.policies, this.policyTypes);
155         }
156
157         @Bean
158         public Policies getPolicies() {
159             return this.policies;
160         }
161
162         @Bean
163         public PolicyTypes getPolicyTypes() {
164             return this.policyTypes;
165         }
166
167         @Bean
168         public Rics getRics() {
169             return this.rics;
170         }
171     }
172
173     @LocalServerPort
174     private int port;
175
176     private final RestTemplate restTemplate = new RestTemplate();
177
178     private void reset() {
179         rics.clear();
180         policies.clear();
181         policyTypes.clear();
182         assertThat(policies.size()).isEqualTo(0);
183     }
184
185     @Test
186     public void testGetRics() throws Exception {
187         reset();
188         addRic("kista_1");
189         String url = baseUrl() + "/rics";
190         String rsp = this.restTemplate.getForObject(url, String.class);
191         System.out.println(rsp);
192         assertThat(rsp).contains("kista_1");
193
194         url = baseUrl() + "/rics?policyType=ANR";
195         rsp = this.restTemplate.getForObject(url, String.class);
196         assertThat(rsp).isEqualTo("[]");
197     }
198
199     @Test
200     public void testGetRic() throws Exception {
201         reset();
202         String url = baseUrl() + "/ric?managedElementId=kista_1";
203         String rsp = this.restTemplate.getForObject(url, String.class);
204         System.out.println(rsp);
205         assertThat(rsp).isEqualTo("ric1");
206     }
207
208     @Test
209     public void testPutPolicy() throws Exception {
210         putService("service1");
211
212         String url = baseUrl() + "/policy?type=type1&instance=instance1&ric=ric1&service=service1";
213         String json = "{}";
214         addPolicyType("type1", "ric1");
215         this.rics.getRic("ric1").setState(Ric.RicState.ACTIVE);
216
217         this.restTemplate.put(url, json);
218
219         Policy policy = policies.getPolicy("instance1");
220
221         assertThat(policy).isNotNull();
222         assertThat(policy.id()).isEqualTo("instance1");
223         assertThat(policy.ownerServiceName()).isEqualTo("service1");
224
225         url = baseUrl() + "/policies";
226         String rsp = this.restTemplate.getForObject(url, String.class);
227         System.out.println(rsp);
228     }
229
230     private PolicyType addPolicyType(String policyTypeName, String ricName) {
231         PolicyType type = ImmutablePolicyType.builder() //
232             .name(policyTypeName) //
233             .schema("{\"title\":\"" + policyTypeName + "\"}") //
234             .build();
235
236         policyTypes.put(type);
237         addRic(ricName).addSupportedPolicyType(type);
238         return type;
239     }
240
241     private Ric addRic(String ricName) {
242         if (rics.get(ricName) != null) {
243             return rics.get(ricName);
244         }
245         Vector<String> mes = new Vector<>();
246         RicConfig conf = ImmutableRicConfig.builder() //
247             .name(ricName) //
248             .baseUrl("baseUrl") //
249             .managedElementIds(mes) //
250             .build();
251         Ric ric = new Ric(conf);
252         this.rics.put(ric);
253         return ric;
254     }
255
256     private Policy addPolicy(String id, String typeName, String service, String ric) throws ServiceException {
257         addRic(ric);
258         Policy p = ImmutablePolicy.builder().id(id) //
259             .json("{}") //
260             .ownerServiceName(service) //
261             .ric(rics.getRic(ric)) //
262             .type(addPolicyType(typeName, ric)) //
263             .lastModified("lastModified").build();
264         policies.put(p);
265         return p;
266     }
267
268     private Policy addPolicy(String id, String typeName, String service) throws ServiceException {
269         return addPolicy(id, typeName, service, "ric");
270     }
271
272     private String baseUrl() {
273         return "http://localhost:" + port;
274     }
275
276     @Test
277     public void testGetPolicy() throws Exception {
278         String url = baseUrl() + "/policy?instance=id";
279         Policy policy = addPolicy("id", "typeName", "service1", "ric1");
280         {
281             String rsp = this.restTemplate.getForObject(url, String.class);
282             assertThat(rsp).isEqualTo(policy.json());
283         }
284         {
285             policies.remove(policy);
286             ResponseEntity<String> rsp = this.restTemplate.getForEntity(url, String.class);
287             assertThat(rsp.getStatusCodeValue()).isEqualTo(HttpStatus.NO_CONTENT.value());
288         }
289     }
290
291     @Test
292     public void testDeletePolicy() throws Exception {
293         reset();
294         String url = baseUrl() + "/policy?instance=id";
295         Policy policy = addPolicy("id", "typeName", "service1", "ric1");
296         policy.ric().setState(Ric.RicState.ACTIVE);
297         assertThat(policies.size()).isEqualTo(1);
298
299         this.restTemplate.delete(url);
300
301         assertThat(policies.size()).isEqualTo(0);
302     }
303
304     private static <T> List<T> parseList(String json, Class<T> clazz) {
305         if (null == json) {
306             return null;
307         }
308         return gson.fromJson(json, new TypeToken<T>() {}.getType());
309
310     }
311
312     @Test
313     public void testGetPolicySchemas() throws Exception {
314         reset();
315         addPolicyType("type1", "ric1");
316         addPolicyType("type2", "ric2");
317
318         String url = baseUrl() + "/policy_schemas";
319         String rsp = this.restTemplate.getForObject(url, String.class);
320         System.out.println("*** " + rsp);
321         assertThat(rsp).contains("type1");
322         assertThat(rsp).contains("type2");
323         assertThat(rsp).contains("title");
324
325         List<String> info = parseList(rsp, String.class);
326         assertEquals(2, info.size());
327
328         url = baseUrl() + "/policy_schemas?ric=ric1";
329         rsp = this.restTemplate.getForObject(url, String.class);
330         assertThat(rsp).contains("type1");
331         info = parseList(rsp, String.class);
332         assertEquals(1, info.size());
333     }
334
335     @Test
336     public void testGetPolicySchema() throws Exception {
337         reset();
338         addPolicyType("type1", "ric1");
339         addPolicyType("type2", "ric2");
340
341         String url = baseUrl() + "/policy_schema?id=type1";
342         String rsp = this.restTemplate.getForObject(url, String.class);
343         System.out.println(rsp);
344         assertThat(rsp).contains("type1");
345         assertThat(rsp).contains("title");
346     }
347
348     @Test
349     public void testGetPolicyTypes() throws Exception {
350         reset();
351         addPolicyType("type1", "ric1");
352         addPolicyType("type2", "ric2");
353
354         String url = baseUrl() + "/policy_types";
355         String rsp = this.restTemplate.getForObject(url, String.class);
356         assertThat(rsp).isEqualTo("[\"type2\",\"type1\"]");
357
358         url = baseUrl() + "/policy_types?ric=ric1";
359         rsp = this.restTemplate.getForObject(url, String.class);
360         assertThat(rsp).isEqualTo("[\"type1\"]");
361     }
362
363     @Test
364     public void testGetPolicies() throws Exception {
365         String url = baseUrl() + "/policies";
366         addPolicy("id1", "type1", "service1");
367         addPolicy("id2", "type2", "service2");
368
369         String rsp = this.restTemplate.getForObject(url, String.class);
370         System.out.println(rsp);
371         assertThat(rsp).contains("id1");
372         assertThat(rsp).contains("id2");
373     }
374
375     @Test
376     public void testGetPoliciesFilter() throws Exception {
377         addPolicy("id1", "type1", "service1");
378         addPolicy("id2", "type1", "service2");
379         addPolicy("id3", "type2", "service1");
380
381         String url = baseUrl() + "/policies?type=type1";
382         String rsp = this.restTemplate.getForObject(url, String.class);
383         System.out.println(rsp);
384         assertThat(rsp).contains("id1");
385         assertThat(rsp).contains("id2");
386         assertFalse(rsp.contains("id3"));
387
388         url = baseUrl() + "/policies?type=type1&service=service2";
389         rsp = this.restTemplate.getForObject(url, String.class);
390         System.out.println(rsp);
391         assertFalse(rsp.contains("id1"));
392         assertThat(rsp).contains("id2");
393         assertFalse(rsp.contains("id3"));
394     }
395
396     private String createServiceJson(String name) {
397         ServiceRegistrationInfo service = ImmutableServiceRegistrationInfo.builder() //
398             .keepAliveInterval(1) //
399             .name(name) //
400             .build();
401         String json = gson.toJson(service);
402         return json;
403     }
404
405     private void putService(String name) {
406         String url = baseUrl() + "/service";
407         this.restTemplate.put(url, createServiceJson(name));
408     }
409
410     @Test
411     public void testPutAndGetService() throws Exception {
412         putService("name");
413
414         String url = baseUrl() + "/service?name=name";
415         String rsp = this.restTemplate.getForObject(url, String.class);
416         ServiceStatus status = gson.fromJson(rsp, ImmutableServiceStatus.class);
417         assertThat(status.keepAliveInterval() == 1);
418         assertThat(status.name().equals("name"));
419
420         url = baseUrl() + "/services";
421         rsp = this.restTemplate.getForObject(url, String.class);
422         assertThat(rsp.contains("name"));
423         System.out.println(rsp);
424
425         url = baseUrl() + "/service/ping";
426         this.restTemplate.put(url, "name");
427     }
428
429 }