1 package vid.automation.test.services;
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;
7 import com.fasterxml.jackson.databind.DeserializationFeature;
8 import com.google.common.collect.ImmutableList;
9 import com.google.common.collect.ImmutableMap;
11 import java.util.Collection;
12 import java.util.List;
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;
35 public class SimulatorApi {
37 public enum RegistrationStrategy {
38 APPEND, CLEAR_THEN_SET
41 private static final Logger logger = LoggerFactory.getLogger(SimulatorApi.class);
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]
49 public static class Path {
53 public static class HttpRequest{
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;
61 private static final List<UnaryOperator<String>> presetStringPostProccessors =
62 ImmutableList.of(dropTestApiFieldFromString(), dropFieldCloudOwnerFromString());
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);
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();
81 public static URI getSimulationUri() {
85 public static void registerExpectation(String expectationFilename, RegistrationStrategy registrationStrategy) {
86 registerExpectation(expectationFilename, ImmutableMap.<String, Object>of(), registrationStrategy);
89 public static void registerExpectation(RegistrationStrategy strategy, String... expectationTemplateFilenames) {
90 registerExpectation(expectationTemplateFilenames, ImmutableMap.of(), strategy);
93 public static void registerExpectation(String[] expectationTemplateFilenames, ImmutableMap<String, Object> templateParams, RegistrationStrategy strategy) {
94 if (strategy.equals(RegistrationStrategy.CLEAR_THEN_SET)) {
97 for (String expectationTemplateFilename: expectationTemplateFilenames) {
98 registerExpectation(expectationTemplateFilename, templateParams, RegistrationStrategy.APPEND);
102 public static void registerExpectation(String expectationTemplateFilename, ImmutableMap<String, Object> templateParams, RegistrationStrategy registrationStrategy) {
104 String content = ReadFile.loadResourceAsString("registration_to_simulator/" + expectationTemplateFilename);
106 for (Map.Entry<String, Object> templateParam : templateParams.entrySet()) {
107 content = content.replaceAll(templateParam.getKey(), templateParam.getValue().toString());
110 registerToSimulatorAndAssertSuccess(expectationTemplateFilename, content, registrationStrategy);
114 public static void registerExpectationFromPreset(BasePreset preset, RegistrationStrategy registrationStrategy) {
115 RegistrationRequest content = preset.generateScenario();
116 registerToSimulatorAndAssertSuccess(preset.getClass().getCanonicalName(), content, registrationStrategy);
119 public static void registerExpectationFromPresets(Collection<BasePreset> presets, RegistrationStrategy registrationStrategy) {
120 if (registrationStrategy == RegistrationStrategy.CLEAR_THEN_SET) {
121 clearRegistrations();
125 try {registerToSimulatorAndAssertSuccess(preset.getClass().getCanonicalName(), preset.generateScenario());}
126 catch (RuntimeException e) {
127 throw new RuntimeException("Failed to register preset "+preset.getClass().getName(), e);
133 // public static List<HttpRequest> retrieveRecordedRequests() {
134 // Response response = client.target(uri).path("retrieveRecordedRequests").request().get();
135 // return response.readEntity(new GenericType<List<HttpRequest>>(){});
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
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()));
149 private static void registerToSimulatorAndAssertSuccess(String name, Object content, RegistrationStrategy registrationStrategy) {
150 if (registrationStrategy == RegistrationStrategy.CLEAR_THEN_SET) {
151 clearRegistrations();
153 registerToSimulatorAndAssertSuccess(name, content);
156 private static void registerToSimulatorAndAssertSuccess(String name, Object content) {
157 logger.info("Setting {}", name);
159 content = postProccessContent(content);
161 Response response = createSimulatorRegistrationWebTarget().request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(content));
162 assertEquals(response.getStatus(), HttpStatus.OK.value());
165 private static Object postProccessContent(Object content) {
166 if (content instanceof String) {
167 for (UnaryOperator<String> presetStringPostProccessor : presetStringPostProccessors) {
168 content = presetStringPostProccessor.apply((String) content);
175 public static void clearExpectations() {
176 clearRegistrations();
179 private static void clearRegistrations() {
180 logger.info("Clearing Registrations");
181 Response response = createSimulatorRegistrationWebTarget().request().delete();
182 assertEquals(response.getStatus(), HttpStatus.OK.value());
185 private static WebTarget createSimulatorRegistrationWebTarget() {
186 return client.target(uri).path("registerToVidSimulator");
189 public static void clearAll() {
190 WebTarget webTarget = createSimulatorRegistrationWebTarget();
191 webTarget.request().delete();