22ac243708cefc3705f0cce1516918dd637c2af7
[ccsdk/oran.git] /
1 /*-
2  * ========================LICENSE_START=================================
3  * ONAP : ccsdk oran
4  * ======================================================================
5  * Copyright (C) 2020 Nordix Foundation. All rights reserved.
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.onap.ccsdk.oran.a1policymanagementservice.utils;
22
23 import static org.mockito.Mockito.spy;
24 import static org.mockito.Mockito.when;
25
26 import java.nio.charset.StandardCharsets;
27 import java.time.Duration;
28 import java.util.List;
29 import java.util.Vector;
30
31 import org.onap.ccsdk.oran.a1policymanagementservice.clients.A1Client;
32 import org.onap.ccsdk.oran.a1policymanagementservice.configuration.ApplicationConfig;
33 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Policies;
34 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Policy;
35 import org.onap.ccsdk.oran.a1policymanagementservice.repository.PolicyType;
36 import org.onap.ccsdk.oran.a1policymanagementservice.repository.PolicyTypes;
37 import org.springframework.http.HttpStatus;
38 import org.springframework.web.reactive.function.client.WebClientResponseException;
39
40 import reactor.core.publisher.Flux;
41 import reactor.core.publisher.Mono;
42 import reactor.core.publisher.MonoSink;
43
44 public class MockA1Client implements A1Client {
45     Policies policies;
46     private final PolicyTypes policyTypes;
47     private final Duration asynchDelay;
48
49     public MockA1Client(String ricId, ApplicationConfig appConfig, PolicyTypes policyTypes, Duration asynchDelay) {
50         this.policyTypes = policyTypes;
51         this.asynchDelay = asynchDelay;
52         ApplicationConfig cfg = spy(appConfig);
53         when(cfg.getVardataDirectory()).thenReturn(null);
54         this.policies = new Policies(cfg);
55     }
56
57     @Override
58     public Mono<List<String>> getPolicyTypeIdentities() {
59         List<String> result = new Vector<>();
60         for (PolicyType p : this.policyTypes.getAll()) {
61             result.add(p.getId());
62         }
63         return mono(result);
64     }
65
66     @Override
67     public Mono<List<String>> getPolicyIdentities() {
68         Vector<String> result = new Vector<>();
69         for (Policy policy : policies.getAll()) {
70             result.add(policy.getId());
71         }
72
73         return mono(result);
74     }
75
76     @Override
77     public Mono<String> getPolicyTypeSchema(String policyTypeId) {
78         try {
79             return mono(this.policyTypes.getType(policyTypeId).getSchema());
80         } catch (Exception e) {
81             return Mono.error(e);
82         }
83     }
84
85     @Override
86     public Mono<String> putPolicy(Policy p) {
87         this.policies.put(p);
88         return mono("OK");
89
90     }
91
92     @Override
93     public Mono<String> deletePolicy(Policy policy) {
94         this.policies.remove(policy);
95         return mono("OK");
96     }
97
98     public Policies getPolicies() {
99         return this.policies;
100     }
101
102     @Override
103     public Mono<A1ProtocolType> getProtocolVersion() {
104         return mono(A1ProtocolType.STD_V1_1);
105     }
106
107     @Override
108     public Flux<String> deleteAllPolicies() {
109         this.policies.clear();
110         return mono("OK") //
111                 .flatMapMany(Flux::just);
112     }
113
114     @Override
115     public Mono<String> getPolicyStatus(Policy policy) {
116         return mono("OK");
117     }
118
119     private <T> Mono<T> mono(T value) {
120         if (this.asynchDelay.isZero()) {
121             return Mono.just(value);
122         } else {
123             return Mono.create(monoSink -> asynchResponse(monoSink, value));
124         }
125     }
126
127     Mono<String> monoError(String responseBody, HttpStatus status) {
128         byte[] responseBodyBytes = responseBody.getBytes(StandardCharsets.UTF_8);
129         WebClientResponseException a1Exception = new WebClientResponseException(status.value(),
130                 status.getReasonPhrase(), null, responseBodyBytes, StandardCharsets.UTF_8, null);
131         return Mono.error(a1Exception);
132     }
133
134     @SuppressWarnings("squid:S2925") // "Thread.sleep" should not be used in tests.
135     private void sleep() {
136         try {
137             Thread.sleep(this.asynchDelay.toMillis());
138         } catch (InterruptedException e) {
139             e.printStackTrace();
140         }
141     }
142
143     private <T> void asynchResponse(MonoSink<T> callback, T str) {
144         Thread thread = new Thread(() -> {
145             sleep(); // Simulate a network delay
146             callback.success(str);
147         });
148         thread.start();
149     }
150
151 }