Improve vid-simulator cloud-nativeness
[vid.git] / vid-automation / src / main / java / vid / automation / test / services / SimulatorApi.java
1 package vid.automation.test.services;
2
3 import static org.testng.Assert.assertEquals;
4 import static vid.automation.test.services.DropTestApiField.dropFieldCloudOwnerFromString;
5 import static vid.automation.test.services.DropTestApiField.dropTestApiFieldFromString;
6
7 import com.fasterxml.jackson.databind.DeserializationFeature;
8 import com.google.common.collect.ImmutableList;
9 import com.google.common.collect.ImmutableMap;
10 import java.net.URI;
11 import java.util.Collection;
12 import java.util.List;
13 import java.util.Map;
14 import java.util.function.Function;
15 import java.util.function.UnaryOperator;
16 import java.util.stream.Collectors;
17 import javax.ws.rs.client.Client;
18 import javax.ws.rs.client.ClientBuilder;
19 import javax.ws.rs.client.Entity;
20 import javax.ws.rs.client.WebTarget;
21 import javax.ws.rs.core.GenericType;
22 import javax.ws.rs.core.MediaType;
23 import javax.ws.rs.core.Response;
24 import org.glassfish.jersey.client.ClientProperties;
25 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJaxbJsonProvider;
26 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJsonProvider;
27 import org.glassfish.jersey.uri.internal.JerseyUriBuilder;
28 import org.onap.simulator.presetGenerator.presets.BasePresets.BasePreset;
29 import org.onap.simulator.presetGenerator.presets.model.RegistrationRequest;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32 import org.springframework.http.HttpStatus;
33 import vid.automation.test.utils.ReadFile;
34
35 public class SimulatorApi {
36
37     public enum RegistrationStrategy {
38         APPEND, CLEAR_THEN_SET
39     }
40
41     private static final Logger logger = LoggerFactory.getLogger(SimulatorApi.class);
42
43     /*
44     these classes are partial representation of org.mockserver.model.HttpRequest.
45     We can not use HttpRequest since it contains Map with NottableString and jackson throw the following error :
46     com.fasterxml.jackson.databind.JsonMappingException: Can not find a (Map) Key deserializer for type
47      [simple type, class org.mockserver.model.NottableString]
48     */
49     public static class Path {
50         public String value;
51     }
52
53     public static class HttpRequest{
54         public Path path;
55     }
56
57     private static final URI uri; //uri for registration
58     private static final URI simulationUri; //uri for getting simulated responses
59     private static final Client client;
60
61     private static final List<UnaryOperator<String>> presetStringPostProccessors =
62             ImmutableList.of(dropTestApiFieldFromString(), dropFieldCloudOwnerFromString());
63
64     static {
65         String host = System.getProperty("SIM_HOST", System.getProperty("VID_HOST", "127.0.0.1"));
66         Integer port = Integer.valueOf(System.getProperty("SIM_PORT", System.getProperty("VID_PORT", "8080"))); //port for registration
67         uri = new JerseyUriBuilder().host(host).port(port).scheme("http").path("vidSimulator").build();
68         client = ClientBuilder.newClient();
69         client.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
70         //registering jacksonJsonProvider for avoiding exceptions like :
71         // org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:
72         // MessageBodyWriter not found for media type=application/json
73         JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider();
74         jacksonJsonProvider.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
75         client.register(jacksonJsonProvider);
76
77         Integer simulationPort = Integer.valueOf(System.getProperty("SIMULATION_PORT", "1080")); //port getting simulated responses
78         simulationUri = new JerseyUriBuilder().host(host).port(simulationPort).scheme("http").build();
79     }
80
81     public static URI getSimulationUri() {
82         return simulationUri;
83     }
84
85     public static void registerExpectation(String expectationFilename, RegistrationStrategy registrationStrategy) {
86         registerExpectation(expectationFilename, ImmutableMap.<String, Object>of(), registrationStrategy);
87     }
88
89     public static void registerExpectation(RegistrationStrategy strategy, String... expectationTemplateFilenames) {
90         registerExpectation(expectationTemplateFilenames, ImmutableMap.of(), strategy);
91     }
92
93     public static void registerExpectation(String[] expectationTemplateFilenames, ImmutableMap<String, Object> templateParams, RegistrationStrategy strategy) {
94         if (strategy.equals(RegistrationStrategy.CLEAR_THEN_SET)) {
95             clearRegistrations();
96         }
97         for (String expectationTemplateFilename: expectationTemplateFilenames) {
98             registerExpectation(expectationTemplateFilename, templateParams, RegistrationStrategy.APPEND);
99         }
100     }
101
102     public static void registerExpectation(String expectationTemplateFilename, ImmutableMap<String, Object> templateParams, RegistrationStrategy registrationStrategy) {
103
104         String content = ReadFile.loadResourceAsString("registration_to_simulator/" + expectationTemplateFilename);
105
106         for (Map.Entry<String, Object> templateParam : templateParams.entrySet()) {
107             content = content.replaceAll(templateParam.getKey(), templateParam.getValue().toString());
108         }
109
110         registerToSimulatorAndAssertSuccess(expectationTemplateFilename, content, registrationStrategy);
111
112     }
113
114     public static void registerExpectationFromPreset(BasePreset preset, RegistrationStrategy registrationStrategy) {
115         RegistrationRequest content = preset.generateScenario();
116         registerToSimulatorAndAssertSuccess(preset.getClass().getCanonicalName(), content, registrationStrategy);
117     }
118
119     public static void registerExpectationFromPresetsCollections(Collection<Collection<BasePreset>> presets, RegistrationStrategy registrationStrategy) {
120         registerExpectationFromPresets(presets.stream()
121                 .flatMap(Collection::stream)
122                 .collect(Collectors.toList()), registrationStrategy);
123     }
124
125     public static void registerExpectationFromPresets(Collection<BasePreset> presets, RegistrationStrategy registrationStrategy) {
126         if (registrationStrategy == RegistrationStrategy.CLEAR_THEN_SET) {
127             clearRegistrations();
128         }
129         presets.forEach(
130                 preset-> {
131                     try {registerToSimulatorAndAssertSuccess(preset.getClass().getCanonicalName(), preset.generateScenario());}
132                     catch (Throwable e) {
133                         throw new RuntimeException("Failed to register preset "+preset.getClass().getName(), e);
134                     }
135                 }
136         );
137     }
138
139 //    public static List<HttpRequest> retrieveRecordedRequests() {
140 //        Response response = client.target(uri).path("retrieveRecordedRequests").request().get();
141 //        return response.readEntity(new GenericType<List<HttpRequest>>(){});
142 //    }
143
144     /*
145         This method return counter of requests that has been sent to simulator.
146         The key of the map is a path, and the value is counter
147      */
148     public static Map<String, Long> retrieveRecordedRequestsPathCounter() {
149         Response response = client.target(uri).path("retrieveRecordedRequests").request().get();
150         List<HttpRequest> httpRequests =  response.readEntity(new GenericType<List<HttpRequest>>(){});
151         return httpRequests.stream().map(x->x.path.value).collect(
152                 Collectors.groupingBy(Function.identity(), Collectors.counting()));
153     }
154
155     private static void registerToSimulatorAndAssertSuccess(String name, Object content, RegistrationStrategy registrationStrategy) {
156         if (registrationStrategy == RegistrationStrategy.CLEAR_THEN_SET) {
157             clearRegistrations();
158         }
159         registerToSimulatorAndAssertSuccess(name, content);
160     }
161
162     private static void registerToSimulatorAndAssertSuccess(String name, Object content) {
163         logger.info("Setting {}", name);
164
165         content = postProccessContent(content);
166
167         Response response = createSimulatorRegistrationWebTarget().request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(content));
168         assertEquals(response.getStatus(), HttpStatus.OK.value());
169     }
170
171     private static Object postProccessContent(Object content) {
172         if (content instanceof String) {
173             for (UnaryOperator<String> presetStringPostProccessor : presetStringPostProccessors) {
174                 content = presetStringPostProccessor.apply((String) content);
175             }
176         }
177
178         return content;
179     }
180
181     public static void clearExpectations() {
182         clearRegistrations();
183     }
184
185     private static void clearRegistrations() {
186         logger.info("Clearing Registrations");
187         Response response = createSimulatorRegistrationWebTarget().request().delete();
188         assertEquals(response.getStatus(), HttpStatus.OK.value());
189     }
190
191     private static WebTarget createSimulatorRegistrationWebTarget() {
192         return client.target(uri).path("registerToVidSimulator");
193     }
194
195     public static void clearAll() {
196         WebTarget webTarget = createSimulatorRegistrationWebTarget();
197         webTarget.request().delete();
198     }
199 }