7abed5a414959874a7ec6e48050c8675315583a4
[policy/apex-pdp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.apex.apps.uservice.test.adapt.restrequestor;
22
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertTrue;
25
26 import com.google.gson.Gson;
27
28 import java.io.ByteArrayOutputStream;
29 import java.io.File;
30 import java.io.IOException;
31 import java.io.PrintStream;
32 import java.net.URI;
33 import java.util.Map;
34
35 import javax.ws.rs.client.Client;
36 import javax.ws.rs.client.ClientBuilder;
37 import javax.ws.rs.core.Response;
38
39 import org.glassfish.grizzly.http.server.HttpServer;
40 import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
41 import org.glassfish.jersey.server.ResourceConfig;
42 import org.junit.AfterClass;
43 import org.junit.Before;
44 import org.junit.BeforeClass;
45 import org.junit.Test;
46 import org.onap.policy.apex.core.infrastructure.messaging.MessagingException;
47 import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
48 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
49 import org.onap.policy.apex.service.engine.main.ApexMain;
50
51 /**
52  * The Class TestRestRequestor.
53  */
54 public class RestRequestorTest {
55     private static final String BASE_URI = "http://localhost:32801/TestRESTRequestor";
56     private static HttpServer server;
57
58     private ByteArrayOutputStream outContent = new ByteArrayOutputStream();
59     private ByteArrayOutputStream errContent = new ByteArrayOutputStream();
60
61     private final PrintStream stdout = System.out;
62     private final PrintStream stderr = System.err;
63
64     /**
65      * Sets the up.
66      *
67      * @throws Exception the exception
68      */
69     @BeforeClass
70     public static void setUp() throws Exception {
71         final ResourceConfig rc = new ResourceConfig(RestRequestorEndpointTest.class);
72         server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
73
74         while (!server.isStarted()) {
75             ThreadUtilities.sleep(50);
76         }
77     }
78
79     /**
80      * Tear down.
81      *
82      * @throws Exception the exception
83      */
84     @AfterClass
85     public static void tearDown() throws Exception {
86         server.shutdownNow();
87
88         new File("src/test/resources/events/EventsOut.json").delete();
89         new File("src/test/resources/events/EventsOutMulti0.json").delete();
90         new File("src/test/resources/events/EventsOutMulti1.json").delete();
91     }
92
93     /**
94      * Reset counters.
95      */
96     @Before
97     public void resetCounters() {
98         RestRequestorEndpointTest.resetCounters();
99     }
100
101     /**
102      * Test rest requestor get.
103      *
104      * @throws MessagingException the messaging exception
105      * @throws ApexException the apex exception
106      * @throws IOException Signals that an I/O exception has occurred.
107      */
108     @Test
109     public void testRestRequestorGet() throws MessagingException, ApexException, IOException {
110         final Client client = ClientBuilder.newClient();
111
112         final String[] args =
113             { "src/test/resources/prodcons/File2RESTRequest2FileGet.json" };
114         final ApexMain apexMain = new ApexMain(args);
115
116         Response response = null;
117
118         // Wait for the required amount of events to be received or for 10 seconds
119         Double getsSoFar = 0.0;
120         for (int i = 0; i < 40; i++) {
121             ThreadUtilities.sleep(100);
122
123             response = client.target("http://localhost:32801/TestRESTRequestor/apex/event/Stats")
124                             .request("application/json").get();
125
126             if (Response.Status.OK.getStatusCode() != response.getStatus()) {
127                 break;
128             }
129
130             final String responseString = response.readEntity(String.class);
131
132             @SuppressWarnings("unchecked")
133             final Map<String, Object> jsonMap = new Gson().fromJson(responseString, Map.class);
134             getsSoFar = Double.valueOf(jsonMap.get("GET").toString());
135
136             if (getsSoFar >= 50.0) {
137                 break;
138             }
139         }
140
141         apexMain.shutdown();
142         client.close();
143
144         assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
145
146         assertEquals(Double.valueOf(50.0), getsSoFar);
147     }
148
149     /**
150      * Test REST requestor put.
151      *
152      * @throws MessagingException the messaging exception
153      * @throws ApexException the apex exception
154      * @throws IOException Signals that an I/O exception has occurred.
155      */
156     @Test
157     public void testRestRequestorPut() throws MessagingException, ApexException, IOException {
158         final Client client = ClientBuilder.newClient();
159
160         final String[] args =
161             { "src/test/resources/prodcons/File2RESTRequest2FilePut.json" };
162         final ApexMain apexMain = new ApexMain(args);
163
164         // Wait for the required amount of events to be received or for 10 seconds
165         Double putsSoFar = 0.0;
166
167         Response response = null;
168         for (int i = 0; i < 40; i++) {
169             ThreadUtilities.sleep(100);
170
171             response = client.target("http://localhost:32801/TestRESTRequestor/apex/event/Stats")
172                             .request("application/json").get();
173
174             if (Response.Status.OK.getStatusCode() != response.getStatus()) {
175                 break;
176             }
177
178             final String responseString = response.readEntity(String.class);
179
180             @SuppressWarnings("unchecked")
181             final Map<String, Object> jsonMap = new Gson().fromJson(responseString, Map.class);
182             putsSoFar = Double.valueOf(jsonMap.get("PUT").toString());
183
184             if (putsSoFar >= 50.0) {
185                 break;
186             }
187         }
188
189         apexMain.shutdown();
190         client.close();
191
192         assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
193         assertEquals(Double.valueOf(50.0), putsSoFar);
194     }
195
196     /**
197      * Test REST requestor post.
198      *
199      * @throws MessagingException the messaging exception
200      * @throws ApexException the apex exception
201      * @throws IOException Signals that an I/O exception has occurred.
202      */
203     @Test
204     public void testRestRequestorPost() throws MessagingException, ApexException, IOException {
205         final Client client = ClientBuilder.newClient();
206
207         final String[] args =
208             { "src/test/resources/prodcons/File2RESTRequest2FilePost.json" };
209         final ApexMain apexMain = new ApexMain(args);
210
211         // Wait for the required amount of events to be received or for 10 seconds
212         Double postsSoFar = 0.0;
213         for (int i = 0; i < 40; i++) {
214             ThreadUtilities.sleep(100);
215
216             final Response response = client.target("http://localhost:32801/TestRESTRequestor/apex/event/Stats")
217                             .request("application/json").get();
218
219             assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
220             final String responseString = response.readEntity(String.class);
221
222             @SuppressWarnings("unchecked")
223             final Map<String, Object> jsonMap = new Gson().fromJson(responseString, Map.class);
224             postsSoFar = Double.valueOf(jsonMap.get("POST").toString());
225
226             if (postsSoFar >= 50.0) {
227                 break;
228             }
229         }
230
231         apexMain.shutdown();
232         client.close();
233
234         assertEquals(Double.valueOf(50.0), postsSoFar);
235     }
236
237     /**
238      * Test REST requestor delete.
239      *
240      * @throws MessagingException the messaging exception
241      * @throws ApexException the apex exception
242      * @throws IOException Signals that an I/O exception has occurred.
243      */
244     @Test
245     public void testRestRequestorDelete() throws MessagingException, ApexException, IOException {
246         final Client client = ClientBuilder.newClient();
247
248         final String[] args =
249             { "src/test/resources/prodcons/File2RESTRequest2FileDelete.json" };
250         final ApexMain apexMain = new ApexMain(args);
251
252         // Wait for the required amount of events to be received or for 10 seconds
253         Double deletesSoFar = 0.0;
254         for (int i = 0; i < 40; i++) {
255             ThreadUtilities.sleep(100);
256
257             final Response response = client.target("http://localhost:32801/TestRESTRequestor/apex/event/Stats")
258                             .request("application/json").get();
259
260             assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
261             final String responseString = response.readEntity(String.class);
262
263             @SuppressWarnings("unchecked")
264             final Map<String, Object> jsonMap = new Gson().fromJson(responseString, Map.class);
265             deletesSoFar = Double.valueOf(jsonMap.get("DELETE").toString());
266
267             if (deletesSoFar >= 50.0) {
268                 break;
269             }
270         }
271
272         apexMain.shutdown();
273         client.close();
274
275         assertEquals(Double.valueOf(50.0), deletesSoFar);
276     }
277
278     /**
279      * Test REST requestor multi inputs.
280      *
281      * @throws MessagingException the messaging exception
282      * @throws ApexException the apex exception
283      * @throws IOException Signals that an I/O exception has occurred.
284      */
285     @Test
286     public void testRestRequestorMultiInputs() throws MessagingException, ApexException, IOException {
287         final Client client = ClientBuilder.newClient();
288
289         final String[] args =
290             { "src/test/resources/prodcons/File2RESTRequest2FileGetMulti.json" };
291         final ApexMain apexMain = new ApexMain(args);
292
293         // Wait for the required amount of events to be received or for 10 seconds
294         Double getsSoFar = 0.0;
295         for (int i = 0; i < 40; i++) {
296             ThreadUtilities.sleep(100);
297
298             final Response response = client.target("http://localhost:32801/TestRESTRequestor/apex/event/Stats")
299                             .request("application/json").get();
300
301             assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
302             final String responseString = response.readEntity(String.class);
303
304             @SuppressWarnings("unchecked")
305             final Map<String, Object> jsonMap = new Gson().fromJson(responseString, Map.class);
306             getsSoFar = Double.valueOf(jsonMap.get("GET").toString());
307
308             if (getsSoFar >= 8.0) {
309                 break;
310             }
311         }
312
313         apexMain.shutdown();
314         client.close();
315
316         assertEquals(Double.valueOf(8.0), getsSoFar);
317
318         ThreadUtilities.sleep(1000);
319     }
320
321     /**
322      * Test REST requestor producer alone.
323      *
324      * @throws MessagingException the messaging exception
325      * @throws ApexException the apex exception
326      * @throws IOException Signals that an I/O exception has occurred.
327      */
328     @Test
329     public void testRestRequestorProducerAlone() throws MessagingException, ApexException, IOException {
330         System.setOut(new PrintStream(outContent));
331         System.setErr(new PrintStream(errContent));
332
333         final String[] args =
334             { "src/test/resources/prodcons/File2RESTRequest2FileGetProducerAlone.json" };
335
336         final ApexMain apexMain = new ApexMain(args);
337         ThreadUtilities.sleep(200);
338         apexMain.shutdown();
339
340         final String outString = outContent.toString();
341
342         System.setOut(stdout);
343         System.setErr(stderr);
344
345         assertTrue(outString.contains("REST Requestor producer (RestRequestorProducer) "
346                         + "must run in peered requestor mode with a REST Requestor consumer"));
347     }
348
349     /**
350      * Test REST requestor consumer alone.
351      *
352      * @throws MessagingException the messaging exception
353      * @throws ApexException the apex exception
354      * @throws IOException Signals that an I/O exception has occurred.
355      */
356     @Test
357     public void testRestRequestorConsumerAlone() throws MessagingException, ApexException, IOException {
358         System.setOut(new PrintStream(outContent));
359         System.setErr(new PrintStream(errContent));
360
361         final String[] args =
362             { "src/test/resources/prodcons/File2RESTRequest2FileGetConsumerAlone.json" };
363
364         final ApexMain apexMain = new ApexMain(args);
365         ThreadUtilities.sleep(200);
366         apexMain.shutdown();
367
368         final String outString = outContent.toString();
369
370         System.setOut(stdout);
371         System.setErr(stderr);
372
373         assertTrue(outString.contains("peer \"RestRequestorProducer for peered mode REQUESTOR "
374                         + "does not exist or is not defined with the same peered mode"));
375     }
376 }