65ef3679c49293f4d1daa86cb911e5a807ce296d
[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("VID_HOST", "10.0.0.10" );
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 registerExpectationFromPresets(Collection<BasePreset> presets, RegistrationStrategy registrationStrategy) {
120         if (registrationStrategy == RegistrationStrategy.CLEAR_THEN_SET) {
121             clearRegistrations();
122         }
123         presets.forEach(
124                 preset-> {
125                     try {registerToSimulatorAndAssertSuccess(preset.getClass().getCanonicalName(), preset.generateScenario());}
126                     catch (RuntimeException e) {
127                         throw new RuntimeException("Failed to register preset "+preset.getClass().getName(), e);
128                     }
129                 }
130         );
131     }
132
133 //    public static List<HttpRequest> retrieveRecordedRequests() {
134 //        Response response = client.target(uri).path("retrieveRecordedRequests").request().get();
135 //        return response.readEntity(new GenericType<List<HttpRequest>>(){});
136 //    }
137
138     /*
139         This method return counter of requests that has been sent to simulator.
140         The key of the map is a path, and the value is counter
141      */
142     public static Map<String, Long> retrieveRecordedRequestsPathCounter() {
143         Response response = client.target(uri).path("retrieveRecordedRequests").request().get();
144         List<HttpRequest> httpRequests =  response.readEntity(new GenericType<List<HttpRequest>>(){});
145         return httpRequests.stream().map(x->x.path.value).collect(
146                 Collectors.groupingBy(Function.identity(), Collectors.counting()));
147     }
148
149     private static void registerToSimulatorAndAssertSuccess(String name, Object content, RegistrationStrategy registrationStrategy) {
150         if (registrationStrategy == RegistrationStrategy.CLEAR_THEN_SET) {
151             clearRegistrations();
152         }
153         registerToSimulatorAndAssertSuccess(name, content);
154     }
155
156     private static void registerToSimulatorAndAssertSuccess(String name, Object content) {
157         logger.info("Setting {}", name);
158
159         content = postProccessContent(content);
160
161         Response response = createSimulatorRegistrationWebTarget().request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(content));
162         assertEquals(response.getStatus(), HttpStatus.OK.value());
163     }
164
165     private static Object postProccessContent(Object content) {
166         if (content instanceof String) {
167             for (UnaryOperator<String> presetStringPostProccessor : presetStringPostProccessors) {
168                 content = presetStringPostProccessor.apply((String) content);
169             }
170         }
171
172         return content;
173     }
174
175     public static void clearExpectations() {
176         clearRegistrations();
177     }
178
179     private static void clearRegistrations() {
180         logger.info("Clearing Registrations");
181         Response response = createSimulatorRegistrationWebTarget().request().delete();
182         assertEquals(response.getStatus(), HttpStatus.OK.value());
183     }
184
185     private static WebTarget createSimulatorRegistrationWebTarget() {
186         return client.target(uri).path("registerToVidSimulator");
187     }
188
189     public static void clearAll() {
190         WebTarget webTarget = createSimulatorRegistrationWebTarget();
191         webTarget.request().delete();
192     }
193 }