1 package vid.automation.test.services;
3 import static java.util.stream.Collectors.toList;
4 import static org.testng.Assert.assertEquals;
5 import static vid.automation.test.services.DropTestApiField.dropFieldCloudOwnerFromString;
6 import static vid.automation.test.services.DropTestApiField.dropTestApiFieldFromString;
8 import com.fasterxml.jackson.databind.DeserializationFeature;
9 import com.google.common.collect.ImmutableList;
10 import com.google.common.collect.ImmutableMap;
12 import java.util.Collection;
13 import java.util.List;
15 import java.util.function.Function;
16 import java.util.function.UnaryOperator;
17 import java.util.stream.Collectors;
18 import javax.ws.rs.client.Client;
19 import javax.ws.rs.client.ClientBuilder;
20 import javax.ws.rs.client.Entity;
21 import javax.ws.rs.client.WebTarget;
22 import javax.ws.rs.core.GenericType;
23 import javax.ws.rs.core.MediaType;
24 import javax.ws.rs.core.Response;
25 import org.glassfish.jersey.client.ClientProperties;
26 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJaxbJsonProvider;
27 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJsonProvider;
28 import org.glassfish.jersey.uri.internal.JerseyUriBuilder;
29 import org.onap.simulator.presetGenerator.presets.BasePresets.BasePreset;
30 import org.onap.simulator.presetGenerator.presets.model.RegistrationRequest;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33 import org.springframework.http.HttpStatus;
34 import vid.automation.test.utils.ReadFile;
36 public class SimulatorApi {
38 public enum RegistrationStrategy {
39 APPEND, CLEAR_THEN_SET
42 private static final Logger logger = LoggerFactory.getLogger(SimulatorApi.class);
45 these classes are partial representation of org.mockserver.model.HttpRequest.
46 We can not use HttpRequest since it contains Map with NottableString and jackson throw the following error :
47 com.fasterxml.jackson.databind.JsonMappingException: Can not find a (Map) Key deserializer for type
48 [simple type, class org.mockserver.model.NottableString]
50 public static class StringWrapper {
54 public static class RecordedHeaders {
55 public StringWrapper name;
56 public List<StringWrapper> values;
59 public static class BodyWrapper {
63 public static class HttpRequest {
64 public StringWrapper path;
65 public BodyWrapper body;
66 public List<RecordedHeaders> headers;
69 public static class RecordedRequests {
72 public Map<String, List<String>> headers;
74 public RecordedRequests(String path, String body, Map<String, List<String>> headers) {
77 this.headers = headers;
80 public RecordedRequests() {
84 private static final URI uri; //uri for registration
85 private static final URI simulationUri; //uri for getting simulated responses
86 private static final Client client;
88 private static final List<UnaryOperator<String>> presetStringPostProccessors =
89 ImmutableList.of(dropTestApiFieldFromString(), dropFieldCloudOwnerFromString());
92 String host = getSimulatorHost();
93 Integer port = Integer.valueOf(System.getProperty("SIM_PORT", System.getProperty("VID_PORT", "8080"))); //port for registration
94 uri = new JerseyUriBuilder().host(host).port(port).scheme("http").path("vidSimulator").build();
95 client = ClientBuilder.newClient();
96 client.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
97 //registering jacksonJsonProvider for avoiding exceptions like :
98 // org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:
99 // MessageBodyWriter not found for media type=application/json
100 JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider();
101 jacksonJsonProvider.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
102 client.register(jacksonJsonProvider);
104 Integer simulationPort = getSimulatedResponsesPort();
105 simulationUri = new JerseyUriBuilder().host(host).port(simulationPort).scheme("http").build();
108 public static String getSimulatorHost() {
109 return System.getProperty("SIM_HOST", System.getProperty("VID_HOST", "127.0.0.1"));
112 public static Integer getSimulatedResponsesPort() {
113 return Integer.valueOf(System.getProperty("SIMULATION_PORT", "1080"));
116 public static URI getSimulationUri() {
117 return simulationUri;
120 public static void registerExpectation(String expectationFilename, RegistrationStrategy registrationStrategy) {
121 registerExpectation(expectationFilename, ImmutableMap.<String, Object>of(), registrationStrategy);
124 public static void registerExpectation(RegistrationStrategy strategy, String... expectationTemplateFilenames) {
125 registerExpectation(expectationTemplateFilenames, ImmutableMap.of(), strategy);
128 public static void registerExpectation(String[] expectationTemplateFilenames, ImmutableMap<String, Object> templateParams, RegistrationStrategy strategy) {
129 if (strategy.equals(RegistrationStrategy.CLEAR_THEN_SET)) {
130 clearRegistrations();
132 for (String expectationTemplateFilename: expectationTemplateFilenames) {
133 registerExpectation(expectationTemplateFilename, templateParams, RegistrationStrategy.APPEND);
137 public static void registerExpectation(String expectationTemplateFilename, ImmutableMap<String, Object> templateParams, RegistrationStrategy registrationStrategy) {
139 String content = ReadFile.loadResourceAsString("registration_to_simulator/" + expectationTemplateFilename);
141 for (Map.Entry<String, Object> templateParam : templateParams.entrySet()) {
142 content = content.replaceAll(templateParam.getKey(), templateParam.getValue().toString());
145 registerToSimulatorAndAssertSuccess(expectationTemplateFilename, content, registrationStrategy);
149 public static void registerExpectationFromPreset(BasePreset preset, RegistrationStrategy registrationStrategy) {
150 RegistrationRequest content = preset.generateScenario();
151 registerToSimulatorAndAssertSuccess(preset.getClass().getCanonicalName(), content, registrationStrategy);
154 public static void registerExpectationFromPresetsCollections(Collection<Collection<BasePreset>> presets, RegistrationStrategy registrationStrategy) {
155 registerExpectationFromPresets(presets.stream()
156 .flatMap(Collection::stream)
157 .collect(toList()), registrationStrategy);
160 public static void registerExpectationFromPresets(Collection<BasePreset> presets, RegistrationStrategy registrationStrategy) {
161 if (registrationStrategy == RegistrationStrategy.CLEAR_THEN_SET) {
162 clearRegistrations();
166 try {registerToSimulatorAndAssertSuccess(preset.getClass().getCanonicalName(), preset.generateScenario());}
167 catch (Throwable e) {
168 throw new RuntimeException("Failed to register preset "+preset.getClass().getName(), e);
174 // public static List<HttpRequest> retrieveRecordedRequests() {
175 // Response response = client.target(uri).path("retrieveRecordedRequests").request().get();
176 // return response.readEntity(new GenericType<List<HttpRequest>>(){});
180 This method return counter of requests that has been sent to simulator.
181 The key of the map is a path, and the value is counter
183 public static Map<String, Long> retrieveRecordedRequestsPathCounter() {
184 List<HttpRequest> httpRequests = retrieveRecordedHttpRequests();
185 return httpRequests.stream().map(x->x.path.value).collect(
186 Collectors.groupingBy(Function.identity(), Collectors.counting()));
189 private static List<HttpRequest> retrieveRecordedHttpRequests() {
190 Response response = client.target(uri).path("retrieveRecordedRequests").request().get();
191 return response.readEntity(new GenericType<List<HttpRequest>>(){});
194 public static List<RecordedRequests> retrieveRecordedRequests() {
195 List<HttpRequest> rawRequests = retrieveRecordedHttpRequests();
196 return rawRequests.stream().map(request->new RecordedRequests(
198 request.body != null && request.body != null ? request.body.value : "",
199 request.headers.stream().collect(
202 x->x.values.stream().map(y->y.value).collect(toList())))
203 )).collect(toList());
206 private static void registerToSimulatorAndAssertSuccess(String name, Object content, RegistrationStrategy registrationStrategy) {
207 if (registrationStrategy == RegistrationStrategy.CLEAR_THEN_SET) {
208 clearRegistrations();
210 registerToSimulatorAndAssertSuccess(name, content);
213 private static void registerToSimulatorAndAssertSuccess(String name, Object content) {
214 logger.info("Setting {}", name);
216 content = postProccessContent(content);
218 Response response = createSimulatorRegistrationWebTarget().request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(content));
219 assertEquals(response.getStatus(), HttpStatus.OK.value());
222 private static Object postProccessContent(Object content) {
223 if (content instanceof String) {
224 for (UnaryOperator<String> presetStringPostProccessor : presetStringPostProccessors) {
225 content = presetStringPostProccessor.apply((String) content);
232 public static void clearExpectations() {
233 clearRegistrations();
236 private static void clearRegistrations() {
237 logger.info("Clearing Registrations");
238 Response response = createSimulatorRegistrationWebTarget().request().delete();
239 assertEquals(response.getStatus(), HttpStatus.OK.value());
242 private static WebTarget createSimulatorRegistrationWebTarget() {
243 return client.target(uri).path("registerToVidSimulator");
246 public static void clearAll() {
247 WebTarget webTarget = createSimulatorRegistrationWebTarget();
248 webTarget.request().delete();