4048012bb85ae7972b9c721bb58e94d5be85e395
[ccsdk/features.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP : CCSDK.apps.sdnr.wt.apigateway
4  * ================================================================================
5  * Copyright (C) 2018 highstreet technologies GmbH Intellectual Property.
6  * All rights reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21 package org.onap.ccsdk.features.sdnr.wt.apigateway.test.helper;
22
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertTrue;
25 import static org.junit.Assert.fail;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.verify;
28 import static org.mockito.Mockito.when;
29 import com.sun.net.httpserver.HttpExchange;
30 import com.sun.net.httpserver.HttpHandler;
31 import com.sun.net.httpserver.HttpServer;
32 import java.io.IOException;
33 import java.io.OutputStream;
34 import java.net.InetSocketAddress;
35 import java.util.Enumeration;
36 import java.util.Map;
37 import java.util.Vector;
38 import java.util.concurrent.ExecutorService;
39 import java.util.concurrent.Executors;
40 import javax.servlet.http.HttpServletRequest;
41 import javax.servlet.http.HttpServletResponse;
42 import org.junit.After;
43 import org.junit.Before;
44 import org.onap.ccsdk.features.sdnr.wt.common.test.ServletInputStreamFromByteArrayInputStream;
45 import org.onap.ccsdk.features.sdnr.wt.common.test.ServletOutputStreamToStringWriter;
46
47 @SuppressWarnings("restriction")
48 public class HelpServletBase {
49
50     public static final String HTTPMETHOD_GET = "GET";
51     public static final String HTTPMETHOD_POST = "POST";
52     public static final String HTTPMETHOD_PUT = "PUT";
53     public static final String HTTPMETHOD_DELETE = "DELETE";
54     public static final String HTTPMETHOD_OPTIONS = "OPTIONS";
55     private IPublicServlet servlet;
56     private static HttpServer server;
57     private static ExecutorService httpThreadPool;
58
59     public final String HOST = "localhost";
60     protected static int testPort;
61     private final String baseUri;
62     protected static final String LR = "\n";
63
64     public HelpServletBase(String baseuri, int port) {
65         this.baseUri = baseuri;
66         testPort = port;
67     }
68
69     public void setServlet(IPublicServlet s) {
70         this.servlet = s;
71     }
72
73     protected void testrequest(String method, String data, String expectedResponse, boolean exact) {
74         this.testrequest("/mwtn/test", method, data, expectedResponse, exact, null);
75     }
76
77     protected void testrequest(String uri, String method, String data, String expectedResponse, boolean exact) {
78         this.testrequest(uri, method, data, expectedResponse, exact, null);
79     }
80
81     protected void testrequest(String uri, String method, String data, String expectedResponse, boolean exact,
82             Map<String, String> headersToCheck) {
83
84         HttpServletRequest mockRequest = mock(HttpServletRequest.class);
85         HttpServletResponse mockResponse = mock(HttpServletResponse.class);
86
87         ServletOutputStreamToStringWriter printOut = new ServletOutputStreamToStringWriter();
88         ServletInputStreamFromByteArrayInputStream inputStream = new ServletInputStreamFromByteArrayInputStream(data.getBytes());
89         Vector<String> headers = new Vector<String>();
90         headers.addElement("Accept");
91         headers.add("User-Agent");
92         Enumeration<String> headerNames = headers.elements();
93         try {
94             when(mockRequest.getRequestURI()).thenReturn(this.baseUri + uri);
95             when(mockRequest.getHeaderNames()).thenReturn(headerNames);
96             when(mockRequest.getHeader("Accept")).thenReturn("application/json");
97             when(mockRequest.getHeader("User-Agent")).thenReturn("Gecko abc");
98             when(mockRequest.getInputStream()).thenReturn(inputStream);
99             when(mockResponse.getOutputStream()).thenReturn(printOut);
100             System.out.println("do a " + method + " request");
101             if (method == HTTPMETHOD_GET)
102                 this.servlet.doGet(mockRequest, mockResponse);
103             else if (method == HTTPMETHOD_POST)
104                 this.servlet.doPost(mockRequest, mockResponse);
105             else if (method == HTTPMETHOD_PUT)
106                 this.servlet.doPut(mockRequest, mockResponse);
107             else if (method == HTTPMETHOD_DELETE)
108                 this.servlet.doDelete(mockRequest, mockResponse);
109             else if (method == HTTPMETHOD_OPTIONS)
110                 this.servlet.doOptions(mockRequest, mockResponse);
111             else
112                 fail("http request method " + method + " test not implemented");
113         } catch (Exception e) {
114             System.err.println(e.getMessage());
115         }
116
117         verify(mockResponse).setStatus(200);
118         if (exact)
119             assertEquals(expectedResponse, printOut.getStringWriter().toString());
120         else
121             assertTrue("response not for method " + method + "correct", printOut.getStringWriter().toString().contains(expectedResponse));
122         // currently unable to check extra headers
123         if (headersToCheck != null) {
124
125         }
126     }
127
128     @Before
129     private void init() throws IOException {
130
131
132         initEsTestWebserver(testPort);
133     }
134
135     @After
136     private void deinit() {
137         stopTestWebserver();
138     }
139
140     public static void initEsTestWebserver(int port) throws IOException {
141         initEsTestWebserver(port, "/mwtn/test");
142     }
143
144     public static void initEsTestWebserver(int port, String baseUri) throws IOException {
145         server = HttpServer.create(new InetSocketAddress("127.0.0.1", port), 0);
146         httpThreadPool = Executors.newFixedThreadPool(5);
147         server.setExecutor(httpThreadPool);
148         server.createContext(baseUri, new MyHandler());
149         //server.createContext("/", new MyRootHandler());
150         server.setExecutor(null); // creates a default executor
151         server.start();
152         System.out.println("http server started");
153     }
154
155     public static void stopTestWebserver() {
156         if (server != null) {
157             server.stop(0);
158             httpThreadPool.shutdownNow();
159             System.out.println("http server stopped");
160         }
161     }
162
163
164
165     public static class MyHandler implements HttpHandler {
166         @Override
167         public void handle(HttpExchange t) throws IOException {
168             String method = t.getRequestMethod();
169             System.out.println(String.format("req received: %s %s", method, t.getRequestURI()));
170             OutputStream os = null;
171             try {
172                 if (method.equals(HTTPMETHOD_GET)) {
173                     t.sendResponseHeaders(200, HelpEsServlet.RESPONSE_GET.length());
174                     os = t.getResponseBody();
175                     os.write(HelpEsServlet.RESPONSE_GET.getBytes());
176                 } else if (method.equals(HTTPMETHOD_POST)) {
177                     t.sendResponseHeaders(200, HelpEsServlet.RESPONSE_POST.length());
178                     os = t.getResponseBody();
179                     os.write(HelpEsServlet.RESPONSE_POST.getBytes());
180                 } else if (method.equals(HTTPMETHOD_PUT)) {
181                     t.sendResponseHeaders(200, HelpEsServlet.RESPONSE_PUT.length());
182                     os = t.getResponseBody();
183                     os.write(HelpEsServlet.RESPONSE_PUT.getBytes());
184                 } else if (method.equals(HTTPMETHOD_DELETE)) {
185                     t.sendResponseHeaders(200, HelpEsServlet.RESPONSE_DELETE.length());
186                     os = t.getResponseBody();
187                     os.write(HelpEsServlet.RESPONSE_DELETE.getBytes());
188                 } else if (method.equals(HTTPMETHOD_OPTIONS)) {
189                     t.sendResponseHeaders(200, HelpEsServlet.RESPONSE_OPTIONS.length());
190                     //os = t.getResponseBody();
191                     //os.write(RESPONSE_OPTIONS.getBytes());
192                 } else {
193                     t.sendResponseHeaders(404, 0);
194                 }
195                 System.out.println("req handled successful");
196
197             } catch (Exception e) {
198                 System.out.println(e.getMessage());
199             } finally {
200                 if (os != null) {
201                     os.close();
202                 }
203             }
204         }
205     }
206 }