Merge "vid-automation selenium tests"
[vid.git] / vid-automation / src / main / java / vid / automation / test / services / SimulatorApi.java
1 package vid.automation.test.services;
2
3 import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
4 import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
5 import com.google.common.collect.ImmutableList;
6 import com.google.common.collect.ImmutableMap;
7 import org.glassfish.jersey.client.ClientProperties;
8 import org.glassfish.jersey.uri.internal.JerseyUriBuilder;
9 import org.opencomp.simulator.presetGenerator.presets.BasePresets.BasePreset;
10 import org.opencomp.simulator.presetGenerator.presets.model.RegistrationRequest;
11 import org.springframework.http.HttpStatus;
12 import vid.automation.test.utils.ReadFile;
13
14 import javax.ws.rs.client.Client;
15 import javax.ws.rs.client.ClientBuilder;
16 import javax.ws.rs.client.Entity;
17 import javax.ws.rs.client.WebTarget;
18 import javax.ws.rs.core.MediaType;
19 import javax.ws.rs.core.Response;
20 import java.net.URI;
21 import java.util.Collection;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.function.UnaryOperator;
25
26 import static org.testng.Assert.assertEquals;
27 import static vid.automation.test.services.DropTestApiField.dropTestApiFieldFromString;
28
29 public class SimulatorApi {
30
31     public enum RegistrationStrategy {
32         APPEND, CLEAR_THEN_SET
33     }
34
35     private static final URI uri; //uri for registration
36     private static final URI simulationUri; //uri for getting simulated responses
37     private static final Client client;
38
39     private static final List<UnaryOperator<String>> presetStringPostProccessors =
40             ImmutableList.of(dropTestApiFieldFromString());
41
42     static {
43         String host = System.getProperty("VID_HOST", "127.0.0.1" );
44         Integer port = Integer.valueOf(System.getProperty("SIM_PORT", System.getProperty("VID_PORT", "8080"))); //port for registration
45         uri = new JerseyUriBuilder().host(host).port(port).scheme("http").path("vidSimulator").build();
46         client = ClientBuilder.newClient();
47         client.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
48         //registering jacksonJsonProvider for avoiding exceptions like :
49         // org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:
50         // MessageBodyWriter not found for media type=application/json
51         JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider();
52         client.register(jacksonJsonProvider);
53
54         Integer simulationPort = Integer.valueOf(System.getProperty("SIMULATION_PORT", "1080")); //port getting simulated responses
55         simulationUri = new JerseyUriBuilder().host(host).port(simulationPort).scheme("http").build();
56     }
57
58     public static URI getSimulationUri() {
59         return simulationUri;
60     }
61
62     public static void registerExpectation(String expectationFilename, RegistrationStrategy registrationStrategy) {
63         registerExpectation(expectationFilename, ImmutableMap.<String, Object>of(), registrationStrategy);
64     }
65
66     public static void registerExpectation(RegistrationStrategy strategy, String... expectationTemplateFilenames) {
67         registerExpectation(expectationTemplateFilenames, ImmutableMap.of(), strategy);
68     }
69
70     public static void registerExpectation(String[] expectationTemplateFilenames, ImmutableMap<String, Object> templateParams, RegistrationStrategy strategy) {
71         if (strategy.equals(RegistrationStrategy.CLEAR_THEN_SET)) {
72             clearRegistrations();
73         }
74         for (String expectationTemplateFilename: expectationTemplateFilenames) {
75             registerExpectation(expectationTemplateFilename, templateParams, RegistrationStrategy.APPEND);
76         }
77     }
78
79     public static void registerExpectation(String expectationTemplateFilename, ImmutableMap<String, Object> templateParams, RegistrationStrategy registrationStrategy) {
80
81         String content = ReadFile.loadResourceAsString("registration_to_simulator/" + expectationTemplateFilename);
82
83         for (Map.Entry<String, Object> templateParam : templateParams.entrySet()) {
84             content = content.replaceAll(templateParam.getKey(), templateParam.getValue().toString());
85         }
86
87         registerToSimulatorAndAssertSuccess(content, registrationStrategy);
88
89     }
90
91     public static void registerExpectationFromPreset(BasePreset preset, RegistrationStrategy registrationStrategy) {
92         RegistrationRequest content = preset.generateScenario();
93         registerToSimulatorAndAssertSuccess(content, registrationStrategy);
94     }
95
96     public static void registerExpectationFromPresets(Collection<BasePreset> presets, RegistrationStrategy registrationStrategy) {
97         if (registrationStrategy == RegistrationStrategy.CLEAR_THEN_SET) {
98             clearRegistrations();
99         }
100         presets.forEach(
101                 preset-> {
102                     try {registerToSimulatorAndAssertSuccess(preset.generateScenario());}
103                     catch (RuntimeException e) {
104                         throw new RuntimeException("Failed to register preset "+preset.getClass().getName(), e);
105                     }
106                 }
107         );
108     }
109
110     private static void registerToSimulatorAndAssertSuccess(Object content, RegistrationStrategy registrationStrategy) {
111         if (registrationStrategy == RegistrationStrategy.CLEAR_THEN_SET) {
112             clearRegistrations();
113         }
114         registerToSimulatorAndAssertSuccess(content);
115     }
116
117     private static void registerToSimulatorAndAssertSuccess(Object content) {
118
119         content = postProccessContent(content);
120
121         Response response = createSimulatorRegistrationWebTarget().request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(content));
122         assertEquals(response.getStatus(), HttpStatus.OK.value());
123     }
124
125     private static Object postProccessContent(Object content) {
126         if (content instanceof String) {
127             for (UnaryOperator<String> presetStringPostProccessor : presetStringPostProccessors) {
128                 content = presetStringPostProccessor.apply((String) content);
129             }
130         }
131
132         return content;
133     }
134
135     public static void clearExpectations() {
136         clearRegistrations();
137     }
138
139     private static void clearRegistrations() {
140         Response response = createSimulatorRegistrationWebTarget().request().delete();
141         assertEquals(response.getStatus(), HttpStatus.OK.value());
142     }
143
144     private static WebTarget createSimulatorRegistrationWebTarget() {
145         return client.target(uri).path("registerToVidSimulator");
146     }
147
148     public static void clearAll() {
149         WebTarget webTarget = createSimulatorRegistrationWebTarget();
150         webTarget.request().delete();
151     }
152 }