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.junit.Assert.assertEquals;
25 import static org.junit.jupiter.api.Assertions.assertFalse;
27 import com.google.gson.Gson;
28 import com.google.gson.GsonBuilder;
29 import com.google.gson.JsonArray;
30 import com.google.gson.JsonElement;
31 import com.google.gson.JsonParser;
33 import java.util.ArrayList;
34 import java.util.List;
35 import java.util.Vector;
37 import org.junit.jupiter.api.Test;
38 import org.junit.jupiter.api.extension.ExtendWith;
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.oransc.policyagent.repository.Services;
56 import org.oransc.policyagent.tasks.RepositorySupervision;
57 import org.oransc.policyagent.utils.MockA1Client;
58 import org.oransc.policyagent.utils.MockA1ClientFactory;
59 import org.springframework.beans.factory.annotation.Autowired;
60 import org.springframework.boot.test.context.SpringBootTest;
61 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
62 import org.springframework.boot.test.context.TestConfiguration;
63 import org.springframework.boot.web.server.LocalServerPort;
64 import org.springframework.context.ApplicationContext;
65 import org.springframework.context.annotation.Bean;
66 import org.springframework.http.HttpStatus;
67 import org.springframework.http.ResponseEntity;
68 import org.springframework.test.context.junit.jupiter.SpringExtension;
69 import org.springframework.web.client.RestTemplate;
71 @ExtendWith(SpringExtension.class)
72 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
73 public class ApplicationTest {
75 ApplicationContext context;
81 private Policies policies;
84 private PolicyTypes policyTypes;
87 MockA1ClientFactory a1ClientFactory;
90 RepositorySupervision supervision;
95 private static Gson gson = new GsonBuilder() //
99 public static class MockApplicationConfig extends ApplicationConfig {
101 public String getLocalConfigurationFilePath() {
102 return ""; // No config file loaded for the test
107 * Overrides the BeanFactory.
110 static class TestBeanFactory {
111 private final PolicyTypes policyTypes = new PolicyTypes();
114 public ApplicationConfig getApplicationConfig() {
115 return new MockApplicationConfig();
119 MockA1ClientFactory getA1ClientFactory() {
120 return new MockA1ClientFactory(this.policyTypes);
124 public Policies getPolicies() {
125 return new Policies();
129 public PolicyTypes getPolicyTypes() {
130 return this.policyTypes;
134 public Rics getRics() {
142 private final RestTemplate restTemplate = new RestTemplate();
144 private void reset() {
148 assertThat(policies.size()).isEqualTo(0);
152 public void testGetRics() throws Exception {
155 String url = baseUrl() + "/rics";
156 String rsp = this.restTemplate.getForObject(url, String.class);
157 System.out.println(rsp);
158 assertThat(rsp).contains("kista_1");
160 url = baseUrl() + "/rics?policyType=ANR";
161 rsp = this.restTemplate.getForObject(url, String.class);
162 assertThat(rsp).isEqualTo("[]");
166 public void testRecovery() throws Exception {
168 Policy policy2 = addPolicy("policyId2", "typeName", "service", "ric");
170 getA1Client("ric").putPolicy(policy2); // put it in the RIC
171 policies.remove(policy2); // Remove it from the repo -> should be deleted in the RIC
173 Policy policy = addPolicy("policyId", "typeName", "service", "ric"); // This should be created in the RIC
174 supervision.checkAllRics(); // The created policy should be put in the RIC
175 Policies ricPolicies = getA1Client("ric").getPolicies();
176 assertThat(ricPolicies.size()).isEqualTo(1);
177 Policy ricPolicy = ricPolicies.get("policyId");
178 assertThat(ricPolicy.json()).isEqualTo(policy.json());
181 MockA1Client getA1Client(String ricName) throws ServiceException {
182 return a1ClientFactory.getOrCreateA1Client(ricName);
186 public void testGetRic() throws Exception {
188 Ric ric = addRic("ric1");
189 ric.addManagedElement("kista_1");
190 String url = baseUrl() + "/ric?managedElementId=kista_1";
192 String rsp = this.restTemplate.getForObject(url, String.class);
193 System.out.println(rsp);
195 assertThat(rsp).isEqualTo("ric1");
199 public void testPutPolicy() throws Exception {
200 putService("service1");
202 String url = baseUrl() + "/policy?type=type1&instance=instance1&ric=ric1&service=service1";
204 addPolicyType("type1", "ric1");
205 this.rics.getRic("ric1").setState(Ric.RicState.IDLE);
207 this.restTemplate.put(url, json);
209 Policy policy = policies.getPolicy("instance1");
211 assertThat(policy).isNotNull();
212 assertThat(policy.id()).isEqualTo("instance1");
213 assertThat(policy.ownerServiceName()).isEqualTo("service1");
215 url = baseUrl() + "/policies";
216 String rsp = this.restTemplate.getForObject(url, String.class);
217 System.out.println(rsp);
220 private PolicyType addPolicyType(String policyTypeName, String ricName) {
221 PolicyType type = ImmutablePolicyType.builder() //
222 .name(policyTypeName) //
223 .schema("{\"title\":\"" + policyTypeName + "\"}") //
226 policyTypes.put(type);
227 addRic(ricName).addSupportedPolicyType(type);
231 private Ric addRic(String ricName) {
232 if (rics.get(ricName) != null) {
233 return rics.get(ricName);
235 Vector<String> mes = new Vector<>();
236 RicConfig conf = ImmutableRicConfig.builder() //
239 .managedElementIds(mes) //
241 Ric ric = new Ric(conf);
246 private Policy addPolicy(String id, String typeName, String service, String ric) throws ServiceException {
248 Policy p = ImmutablePolicy.builder().id(id) //
250 .ownerServiceName(service) //
251 .ric(rics.getRic(ric)) //
252 .type(addPolicyType(typeName, ric)) //
253 .lastModified("lastModified").build();
258 private Policy addPolicy(String id, String typeName, String service) throws ServiceException {
259 return addPolicy(id, typeName, service, "ric");
262 private String baseUrl() {
263 return "http://localhost:" + port;
267 public void testGetPolicy() throws Exception {
268 String url = baseUrl() + "/policy?instance=id";
269 Policy policy = addPolicy("id", "typeName", "service1", "ric1");
271 String rsp = this.restTemplate.getForObject(url, String.class);
272 assertThat(rsp).isEqualTo(policy.json());
275 policies.remove(policy);
276 ResponseEntity<String> rsp = this.restTemplate.getForEntity(url, String.class);
277 assertThat(rsp.getStatusCodeValue()).isEqualTo(HttpStatus.NO_CONTENT.value());
282 public void testDeletePolicy() throws Exception {
284 String url = baseUrl() + "/policy?instance=id";
285 Policy policy = addPolicy("id", "typeName", "service1", "ric1");
286 policy.ric().setState(Ric.RicState.IDLE);
287 assertThat(policies.size()).isEqualTo(1);
289 this.restTemplate.delete(url);
291 assertThat(policies.size()).isEqualTo(0);
295 public void testGetPolicySchemas() throws Exception {
297 addPolicyType("type1", "ric1");
298 addPolicyType("type2", "ric2");
300 String url = baseUrl() + "/policy_schemas";
301 String rsp = this.restTemplate.getForObject(url, String.class);
302 System.out.println("*** " + rsp);
303 assertThat(rsp).contains("type1");
304 assertThat(rsp).contains("type2");
305 assertThat(rsp).contains("title");
307 List<String> info = parseSchemas(rsp);
308 assertEquals(2, info.size());
310 url = baseUrl() + "/policy_schemas?ric=ric1";
311 rsp = this.restTemplate.getForObject(url, String.class);
312 assertThat(rsp).contains("type1");
313 info = parseSchemas(rsp);
314 assertEquals(1, info.size());
318 public void testGetPolicySchema() throws Exception {
320 addPolicyType("type1", "ric1");
321 addPolicyType("type2", "ric2");
323 String url = baseUrl() + "/policy_schema?id=type1";
324 String rsp = this.restTemplate.getForObject(url, String.class);
325 System.out.println(rsp);
326 assertThat(rsp).contains("type1");
327 assertThat(rsp).contains("title");
331 public void testGetPolicyTypes() throws Exception {
333 addPolicyType("type1", "ric1");
334 addPolicyType("type2", "ric2");
336 String url = baseUrl() + "/policy_types";
337 String rsp = this.restTemplate.getForObject(url, String.class);
338 assertThat(rsp).isEqualTo("[\"type2\",\"type1\"]");
340 url = baseUrl() + "/policy_types?ric=ric1";
341 rsp = this.restTemplate.getForObject(url, String.class);
342 assertThat(rsp).isEqualTo("[\"type1\"]");
346 public void testGetPolicies() throws Exception {
347 String url = baseUrl() + "/policies";
348 addPolicy("id1", "type1", "service1");
349 addPolicy("id2", "type2", "service2");
351 String rsp = this.restTemplate.getForObject(url, String.class);
352 System.out.println(rsp);
353 assertThat(rsp).contains("id1");
354 assertThat(rsp).contains("id2");
358 public void testGetPoliciesFilter() throws Exception {
359 addPolicy("id1", "type1", "service1");
360 addPolicy("id2", "type1", "service2");
361 addPolicy("id3", "type2", "service1");
363 String url = baseUrl() + "/policies?type=type1";
364 String rsp = this.restTemplate.getForObject(url, String.class);
365 System.out.println(rsp);
366 assertThat(rsp).contains("id1");
367 assertThat(rsp).contains("id2");
368 assertFalse(rsp.contains("id3"));
370 url = baseUrl() + "/policies?type=type1&service=service2";
371 rsp = this.restTemplate.getForObject(url, String.class);
372 System.out.println(rsp);
373 assertFalse(rsp.contains("id1"));
374 assertThat(rsp).contains("id2");
375 assertFalse(rsp.contains("id3"));
378 private String createServiceJson(String name) {
379 ServiceRegistrationInfo service = ImmutableServiceRegistrationInfo.builder() //
380 .keepAliveInterval(1) //
382 .callbackUrl("callbackUrl") //
384 String json = gson.toJson(service);
388 private void putService(String name) {
389 String url = baseUrl() + "/service";
390 this.restTemplate.put(url, createServiceJson(name));
394 public void testPutAndGetService() throws Exception {
399 String url = baseUrl() + "/services?name=name";
400 String rsp = this.restTemplate.getForObject(url, String.class);
401 List<ImmutableServiceStatus> info = parseList(rsp, ImmutableServiceStatus.class);
402 assertThat(info.size() == 1);
403 ServiceStatus status = info.iterator().next();
404 assertThat(status.keepAliveInterval() == 1);
405 assertThat(status.name().equals("name"));
408 url = baseUrl() + "/services";
409 rsp = this.restTemplate.getForObject(url, String.class);
410 assertThat(rsp.contains("name"));
411 System.out.println(rsp);
414 assertThat(services.size() == 1);
415 url = baseUrl() + "/services?name=name";
416 this.restTemplate.delete(url);
417 assertThat(services.size() == 0);
420 private static <T> List<T> parseList(String jsonString, Class<T> clazz) {
421 List<T> result = new ArrayList<>();
422 JsonArray jsonArr = JsonParser.parseString(jsonString).getAsJsonArray();
423 for (JsonElement jsonElement : jsonArr) {
424 T o = gson.fromJson(jsonElement.toString(), clazz);
430 private static List<String> parseSchemas(String jsonString) {
431 JsonArray arrayOfSchema = JsonParser.parseString(jsonString).getAsJsonArray();
432 List<String> result = new ArrayList<>();
433 for (JsonElement schemaObject : arrayOfSchema) {
434 result.add(schemaObject.toString());