2 * ========================LICENSE_START=================================
5 * Copyright (C) 2019 Nordix Foundation
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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===================================
21 package org.oransc.policyagent;
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.awaitility.Awaitility.await;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.jupiter.api.Assertions.assertFalse;
28 import com.google.gson.Gson;
29 import com.google.gson.GsonBuilder;
30 import com.google.gson.JsonArray;
31 import com.google.gson.JsonElement;
32 import com.google.gson.JsonParser;
34 import java.io.IOException;
35 import java.util.ArrayList;
36 import java.util.List;
37 import java.util.Vector;
39 import org.junit.jupiter.api.Test;
40 import org.junit.jupiter.api.extension.ExtendWith;
41 import org.oransc.policyagent.configuration.ApplicationConfig;
42 import org.oransc.policyagent.configuration.ImmutableRicConfig;
43 import org.oransc.policyagent.configuration.RicConfig;
44 import org.oransc.policyagent.controllers.PolicyInfo;
45 import org.oransc.policyagent.controllers.ServiceRegistrationInfo;
46 import org.oransc.policyagent.controllers.ServiceStatus;
47 import org.oransc.policyagent.exceptions.ServiceException;
48 import org.oransc.policyagent.repository.ImmutablePolicy;
49 import org.oransc.policyagent.repository.ImmutablePolicyType;
50 import org.oransc.policyagent.repository.Policies;
51 import org.oransc.policyagent.repository.Policy;
52 import org.oransc.policyagent.repository.PolicyType;
53 import org.oransc.policyagent.repository.PolicyTypes;
54 import org.oransc.policyagent.repository.Ric;
55 import org.oransc.policyagent.repository.Ric.RicState;
56 import org.oransc.policyagent.repository.Rics;
57 import org.oransc.policyagent.repository.Services;
58 import org.oransc.policyagent.tasks.RepositorySupervision;
59 import org.oransc.policyagent.utils.MockA1Client;
60 import org.oransc.policyagent.utils.MockA1ClientFactory;
61 import org.springframework.beans.factory.annotation.Autowired;
62 import org.springframework.boot.test.context.SpringBootTest;
63 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
64 import org.springframework.boot.test.context.TestConfiguration;
65 import org.springframework.boot.web.server.LocalServerPort;
66 import org.springframework.context.ApplicationContext;
67 import org.springframework.context.annotation.Bean;
68 import org.springframework.http.HttpEntity;
69 import org.springframework.http.HttpHeaders;
70 import org.springframework.http.HttpStatus;
71 import org.springframework.http.HttpStatus.Series;
72 import org.springframework.http.MediaType;
73 import org.springframework.http.ResponseEntity;
74 import org.springframework.http.client.ClientHttpResponse;
75 import org.springframework.test.context.junit.jupiter.SpringExtension;
76 import org.springframework.web.client.ResponseErrorHandler;
77 import org.springframework.web.client.RestTemplate;
79 @ExtendWith(SpringExtension.class)
80 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
81 public class ApplicationTest {
83 ApplicationContext context;
89 private Policies policies;
92 private PolicyTypes policyTypes;
95 MockA1ClientFactory a1ClientFactory;
98 RepositorySupervision supervision;
103 private static Gson gson = new GsonBuilder() //
107 public static class MockApplicationConfig extends ApplicationConfig {
109 public String getLocalConfigurationFilePath() {
110 return ""; // No config file loaded for the test
115 * Overrides the BeanFactory.
118 static class TestBeanFactory {
119 private final PolicyTypes policyTypes = new PolicyTypes();
122 public ApplicationConfig getApplicationConfig() {
123 return new MockApplicationConfig();
127 MockA1ClientFactory getA1ClientFactory() {
128 return new MockA1ClientFactory(this.policyTypes);
132 public Policies getPolicies() {
133 return new Policies();
137 public PolicyTypes getPolicyTypes() {
138 return this.policyTypes;
142 public Rics getRics() {
150 private final RestTemplate restTemplate = new RestTemplate();
152 public class RestTemplateResponseErrorHandler implements ResponseErrorHandler {
155 public boolean hasError(ClientHttpResponse httpResponse) throws IOException {
156 return (httpResponse.getStatusCode().series() == Series.CLIENT_ERROR
157 || httpResponse.getStatusCode().series() == Series.SERVER_ERROR);
161 public void handleError(ClientHttpResponse httpResponse) throws IOException {
162 System.out.println("Error " + httpResponse.toString());
166 private void reset() {
170 assertThat(policies.size()).isEqualTo(0);
171 restTemplate.setErrorHandler(new RestTemplateResponseErrorHandler());
175 public void testGetRics() throws Exception {
178 String url = baseUrl() + "/rics";
179 String rsp = this.restTemplate.getForObject(url, String.class);
180 System.out.println(rsp);
181 assertThat(rsp).contains("kista_1");
183 url = baseUrl() + "/rics?policyType=STD_PolicyModelUnconstrained_0.2.0";
184 rsp = this.restTemplate.getForObject(url, String.class);
185 assertThat(rsp).isEqualTo("[]");
189 public void testRecovery() throws Exception {
191 Policy policy2 = addPolicy("policyId2", "typeName", "service", "ric");
193 getA1Client("ric").putPolicy(policy2); // put it in the RIC
194 policies.remove(policy2); // Remove it from the repo -> should be deleted in the RIC
196 Policy policy = addPolicy("policyId", "typeName", "service", "ric"); // This should be created in the RIC
197 supervision.checkAllRics(); // The created policy should be put in the RIC
198 await().untilAsserted(() -> RicState.IDLE.equals(rics.getRic("ric").getState()));
200 Policies ricPolicies = getA1Client("ric").getPolicies();
201 assertThat(ricPolicies.size()).isEqualTo(1);
202 Policy ricPolicy = ricPolicies.get("policyId");
203 assertThat(ricPolicy.json()).isEqualTo(policy.json());
206 MockA1Client getA1Client(String ricName) throws ServiceException {
207 return a1ClientFactory.getOrCreateA1Client(ricName);
211 public void testGetRic() throws Exception {
213 Ric ric = addRic("ric1");
214 ric.addManagedElement("kista_1");
215 String url = baseUrl() + "/ric?managedElementId=kista_1";
217 String rsp = this.restTemplate.getForObject(url, String.class);
218 System.out.println(rsp);
219 assertThat(rsp).isEqualTo("ric1");
223 public void testPutPolicy() throws Exception {
225 putService("service1");
226 addPolicyType("type1", "ric1");
228 String url = baseUrl() + "/policy?type=type1&instance=instance1&ric=ric1&service=service1";
229 final String json = jsonString();
230 this.rics.getRic("ric1").setState(Ric.RicState.IDLE);
232 this.restTemplate.put(url, createJsonHttpEntity(json));
233 Policy policy = policies.getPolicy("instance1");
235 assertThat(policy).isNotNull();
236 assertThat(policy.id()).isEqualTo("instance1");
237 assertThat(policy.ownerServiceName()).isEqualTo("service1");
239 url = baseUrl() + "/policies";
240 String rsp = this.restTemplate.getForObject(url, String.class);
241 System.out.println(rsp);
244 private PolicyType addPolicyType(String policyTypeName, String ricName) {
245 PolicyType type = ImmutablePolicyType.builder() //
246 .name(policyTypeName) //
247 .schema("{\"title\":\"" + policyTypeName + "\"}") //
250 policyTypes.put(type);
251 addRic(ricName).addSupportedPolicyType(type);
255 private Ric addRic(String ricName) {
256 if (rics.get(ricName) != null) {
257 return rics.get(ricName);
259 Vector<String> mes = new Vector<>();
260 RicConfig conf = ImmutableRicConfig.builder() //
263 .managedElementIds(mes) //
265 Ric ric = new Ric(conf);
270 private String createServiceJson(String name) {
271 ServiceRegistrationInfo service = new ServiceRegistrationInfo(name, 1, "callbackUrl");
273 String json = gson.toJson(service);
277 HttpEntity<String> createJsonHttpEntity(String content) {
278 HttpHeaders headers = new HttpHeaders();
279 headers.setContentType(MediaType.APPLICATION_JSON);
280 return new HttpEntity<String>(content, headers);
283 private void putService(String name) {
284 String url = baseUrl() + "/service";
285 HttpEntity<String> entity = createJsonHttpEntity(createServiceJson(name));
286 this.restTemplate.put(url, entity);
289 private String jsonString() {
290 return "{\n \"servingCellNrcgi\": \"1\"\n }";
293 private Policy addPolicy(String id, String typeName, String service, String ric) throws ServiceException {
295 Policy p = ImmutablePolicy.builder().id(id) //
296 .json(jsonString()) //
297 .ownerServiceName(service) //
298 .ric(rics.getRic(ric)) //
299 .type(addPolicyType(typeName, ric)) //
300 .lastModified("lastModified").build();
305 private Policy addPolicy(String id, String typeName, String service) throws ServiceException {
306 return addPolicy(id, typeName, service, "ric");
309 private String baseUrl() {
310 return "http://localhost:" + port;
314 public void testGetPolicy() throws Exception {
315 String url = baseUrl() + "/policy?instance=id";
316 Policy policy = addPolicy("id", "typeName", "service1", "ric1");
318 String rsp = this.restTemplate.getForObject(url, String.class);
319 assertThat(rsp).isEqualTo(policy.json());
322 policies.remove(policy);
323 ResponseEntity<String> rsp = this.restTemplate.getForEntity(url, String.class);
324 assertThat(rsp.getStatusCodeValue()).isEqualTo(HttpStatus.NO_CONTENT.value());
329 public void testDeletePolicy() throws Exception {
331 String url = baseUrl() + "/policy?instance=id";
332 Policy policy = addPolicy("id", "typeName", "service1", "ric1");
333 policy.ric().setState(Ric.RicState.IDLE);
334 assertThat(policies.size()).isEqualTo(1);
336 this.restTemplate.delete(url);
338 assertThat(policies.size()).isEqualTo(0);
342 public void testGetPolicySchemas() throws Exception {
344 addPolicyType("type1", "ric1");
345 addPolicyType("type2", "ric2");
347 String url = baseUrl() + "/policy_schemas";
348 String rsp = this.restTemplate.getForObject(url, String.class);
349 System.out.println("*** " + rsp);
350 assertThat(rsp).contains("type1");
351 assertThat(rsp).contains("type2");
352 assertThat(rsp).contains("title");
354 List<String> info = parseSchemas(rsp);
355 assertEquals(2, info.size());
357 url = baseUrl() + "/policy_schemas?ric=ric1";
358 rsp = this.restTemplate.getForObject(url, String.class);
359 assertThat(rsp).contains("type1");
360 info = parseSchemas(rsp);
361 assertEquals(1, info.size());
365 public void testGetPolicySchema() throws Exception {
367 addPolicyType("type1", "ric1");
368 addPolicyType("type2", "ric2");
370 String url = baseUrl() + "/policy_schema?id=type1";
371 String rsp = this.restTemplate.getForObject(url, String.class);
372 System.out.println(rsp);
373 assertThat(rsp).contains("type1");
374 assertThat(rsp).contains("title");
378 public void testGetPolicyTypes() throws Exception {
380 addPolicyType("type1", "ric1");
381 addPolicyType("type2", "ric2");
383 String url = baseUrl() + "/policy_types";
384 String rsp = this.restTemplate.getForObject(url, String.class);
385 assertThat(rsp).isEqualTo("[\"type2\",\"type1\"]");
387 url = baseUrl() + "/policy_types?ric=ric1";
388 rsp = this.restTemplate.getForObject(url, String.class);
389 assertThat(rsp).isEqualTo("[\"type1\"]");
393 public void testGetPolicies() throws Exception {
394 String url = baseUrl() + "/policies";
395 addPolicy("id1", "type1", "service1");
397 String rsp = this.restTemplate.getForObject(url, String.class);
398 System.out.println(rsp);
399 List<PolicyInfo> info = parseList(rsp, PolicyInfo.class);
400 assertThat(info).size().isEqualTo(1);
401 PolicyInfo policyInfo = info.get(0);
402 assert (policyInfo.validate());
403 assertThat(policyInfo.id).isEqualTo("id1");
404 assertThat(policyInfo.type).isEqualTo("type1");
405 assertThat(policyInfo.service).isEqualTo("service1");
409 public void testGetPoliciesFilter() throws Exception {
410 addPolicy("id1", "type1", "service1");
411 addPolicy("id2", "type1", "service2");
412 addPolicy("id3", "type2", "service1");
414 String url = baseUrl() + "/policies?type=type1";
415 String rsp = this.restTemplate.getForObject(url, String.class);
416 System.out.println(rsp);
417 assertThat(rsp).contains("id1");
418 assertThat(rsp).contains("id2");
419 assertFalse(rsp.contains("id3"));
421 url = baseUrl() + "/policies?type=type1&service=service2";
422 rsp = this.restTemplate.getForObject(url, String.class);
423 System.out.println(rsp);
424 assertFalse(rsp.contains("id1"));
425 assertThat(rsp).contains("id2");
426 assertFalse(rsp.contains("id3"));
430 public void testPutAndGetService() throws Exception {
436 String url = baseUrl() + "/services?name=name";
437 String rsp = this.restTemplate.getForObject(url, String.class);
438 List<ServiceStatus> info = parseList(rsp, ServiceStatus.class);
439 assertThat(info.size() == 1);
440 ServiceStatus status = info.iterator().next();
441 assertThat(status.keepAliveIntervalSeconds == 1);
442 assertThat(status.name.equals("name"));
445 url = baseUrl() + "/services";
446 rsp = this.restTemplate.getForObject(url, String.class);
447 assertThat(rsp.contains("name"));
448 System.out.println(rsp);
451 url = baseUrl() + "/services/keepalive?name=name";
452 rsp = this.restTemplate.postForObject(url, null, String.class);
453 assertThat(rsp.contains("OK"));
456 assertThat(services.size() == 1);
457 url = baseUrl() + "/services?name=name";
458 this.restTemplate.delete(url);
459 assertThat(services.size() == 0);
461 // Keep alive, no registerred service
462 url = baseUrl() + "/services/keepalive?name=nameXXX";
463 ResponseEntity<String> entity = this.restTemplate.postForEntity(url, null, String.class);
464 assertThat(entity.getStatusCode().equals(HttpStatus.NOT_FOUND));
467 private static <T> List<T> parseList(String jsonString, Class<T> clazz) {
468 List<T> result = new ArrayList<>();
469 JsonArray jsonArr = JsonParser.parseString(jsonString).getAsJsonArray();
470 for (JsonElement jsonElement : jsonArr) {
471 T o = gson.fromJson(jsonElement.toString(), clazz);
477 private static List<String> parseSchemas(String jsonString) {
478 JsonArray arrayOfSchema = JsonParser.parseString(jsonString).getAsJsonArray();
479 List<String> result = new ArrayList<>();
480 for (JsonElement schemaObject : arrayOfSchema) {
481 result.add(schemaObject.toString());