0bc42c34263715d2278e7895c2232240ad43ec5b
[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
30 import java.io.ByteArrayInputStream;
31 import java.io.IOException;
32 import java.io.OutputStream;
33 import java.io.StringWriter;
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
41 import javax.servlet.ServletInputStream;
42 import javax.servlet.ServletOutputStream;
43 import javax.servlet.http.HttpServletRequest;
44 import javax.servlet.http.HttpServletResponse;
45
46 import org.junit.After;
47 import org.junit.Before;
48 import com.sun.net.httpserver.HttpExchange;
49 import com.sun.net.httpserver.HttpHandler;
50 import com.sun.net.httpserver.HttpServer;
51
52 public class HelpServletBase {
53
54     public static final String HTTPMETHOD_GET = "GET";
55     public static final String HTTPMETHOD_POST = "POST";
56     public static final String HTTPMETHOD_PUT = "PUT";
57     public static final String HTTPMETHOD_DELETE = "DELETE";
58     public static final String HTTPMETHOD_OPTIONS = "OPTIONS";
59     private IPublicServlet servlet;
60     private static HttpServer server;
61     private static ExecutorService httpThreadPool;
62
63     public final String HOST = "localhost";
64     protected static int testPort;
65     private final String baseUri;
66     protected static final String LR = "\n";
67
68     public HelpServletBase(String baseuri, int port) {
69         this.baseUri = baseuri;
70         testPort = port;
71     }
72
73     public void setServlet(IPublicServlet s) {
74         this.servlet = s;
75     }
76
77     protected void testrequest(String method, String data, String expectedResponse, boolean exact) {
78         this.testrequest("/mwtn/test", method, data, expectedResponse, exact, null);
79     }
80
81     protected void testrequest(String uri, String method, String data, String expectedResponse, boolean exact) {
82         this.testrequest(uri, method, data, expectedResponse, exact, null);
83     }
84
85     protected void testrequest(String uri, String method, String data, String expectedResponse, boolean exact,
86             Map<String, String> headersToCheck) {
87
88         HttpServletRequest mockRequest = mock(HttpServletRequest.class);
89         HttpServletResponse mockResponse = mock(HttpServletResponse.class);
90
91         StringWriter out = new StringWriter();
92         ServletOutputStream printOut = new ServletOutputStream() {
93
94             @Override
95             public void write(int arg0) throws IOException {
96                 out.write(arg0);
97             }
98         };
99         ByteArrayInputStream bis = new ByteArrayInputStream(data.getBytes());
100         ServletInputStream inputStream = new ServletInputStream() {
101             @Override
102             public int read() throws IOException {
103                 return bis.read();
104             }
105         };
106         Vector<String> headers = new Vector<String>();
107         headers.addElement("Accept");
108         headers.add("User-Agent");
109         Enumeration<String> headerNames = headers.elements();
110         try {
111             when(mockRequest.getRequestURI()).thenReturn(this.baseUri + uri);
112             when(mockRequest.getHeaderNames()).thenReturn(headerNames);
113             when(mockRequest.getHeader("Accept")).thenReturn("application/json");
114             when(mockRequest.getHeader("User-Agent")).thenReturn("Gecko abc");
115             when(mockRequest.getInputStream()).thenReturn(inputStream);
116             when(mockResponse.getOutputStream()).thenReturn(printOut);
117             System.out.println("do a " + method + " request");
118             if (method == HTTPMETHOD_GET)
119                 this.servlet.doGet(mockRequest, mockResponse);
120             else if (method == HTTPMETHOD_POST)
121                 this.servlet.doPost(mockRequest, mockResponse);
122             else if (method == HTTPMETHOD_PUT)
123                 this.servlet.doPut(mockRequest, mockResponse);
124             else if (method == HTTPMETHOD_DELETE)
125                 this.servlet.doDelete(mockRequest, mockResponse);
126             else if (method == HTTPMETHOD_OPTIONS)
127                 this.servlet.doOptions(mockRequest, mockResponse);
128             else
129                 fail("http request method " + method + " test not implemented");
130         } catch (Exception e) {
131             System.err.println(e.getMessage());
132         }
133
134         verify(mockResponse).setStatus(200);
135         if (exact)
136             assertEquals(expectedResponse, out.toString());
137         else
138             assertTrue("response not for method " + method + "correct", out.toString().contains(expectedResponse));
139         // currently unable to check extra headers
140         if (headersToCheck != null) {
141
142         }
143     }
144
145     @Before
146     private void init() throws IOException {
147
148
149         initEsTestWebserver(testPort);
150     }
151
152     @After
153     private void deinit() {
154         stopTestWebserver();
155     }
156
157     public static void initEsTestWebserver(int port) throws IOException {
158         initEsTestWebserver(port, "/mwtn/test");
159     }
160
161     public static void initEsTestWebserver(int port, String baseUri) throws IOException {
162         server = HttpServer.create(new InetSocketAddress("127.0.0.1", port), 0);
163         httpThreadPool = Executors.newFixedThreadPool(5);
164         server.setExecutor(httpThreadPool);
165         server.createContext(baseUri, new MyHandler());
166         //server.createContext("/", new MyRootHandler());
167         server.setExecutor(null); // creates a default executor
168         server.start();
169         System.out.println("http server started");
170     }
171
172     public static void stopTestWebserver() {
173         if (server != null) {
174             server.stop(0);
175             httpThreadPool.shutdownNow();
176             System.out.println("http server stopped");
177         }
178     }
179
180
181
182     public static class MyHandler implements HttpHandler {
183         @Override
184         public void handle(HttpExchange t) throws IOException {
185             String method = t.getRequestMethod();
186             System.out.println(String.format("req received: %s %s", method, t.getRequestURI()));
187             OutputStream os = null;
188             try {
189                 if (method.equals(HTTPMETHOD_GET)) {
190                     t.sendResponseHeaders(200, HelpEsServlet.RESPONSE_GET.length());
191                     os = t.getResponseBody();
192                     os.write(HelpEsServlet.RESPONSE_GET.getBytes());
193                 } else if (method.equals(HTTPMETHOD_POST)) {
194                     t.sendResponseHeaders(200, HelpEsServlet.RESPONSE_POST.length());
195                     os = t.getResponseBody();
196                     os.write(HelpEsServlet.RESPONSE_POST.getBytes());
197                 } else if (method.equals(HTTPMETHOD_PUT)) {
198                     t.sendResponseHeaders(200, HelpEsServlet.RESPONSE_PUT.length());
199                     os = t.getResponseBody();
200                     os.write(HelpEsServlet.RESPONSE_PUT.getBytes());
201                 } else if (method.equals(HTTPMETHOD_DELETE)) {
202                     t.sendResponseHeaders(200, HelpEsServlet.RESPONSE_DELETE.length());
203                     os = t.getResponseBody();
204                     os.write(HelpEsServlet.RESPONSE_DELETE.getBytes());
205                 } else if (method.equals(HTTPMETHOD_OPTIONS)) {
206                     t.sendResponseHeaders(200, HelpEsServlet.RESPONSE_OPTIONS.length());
207                     //os = t.getResponseBody();
208                     //os.write(RESPONSE_OPTIONS.getBytes());
209                 } else {
210                     t.sendResponseHeaders(404, 0);
211                 }
212                 System.out.println("req handled successful");
213
214             } catch (Exception e) {
215                 System.out.println(e.getMessage());
216             } finally {
217                 if (os != null) {
218                     os.close();
219                 }
220             }
221         }
222     }
223 }