diff options
Diffstat (limited to 'nanolets/src/test/java/fi/iki/elonen/router/TestNanolets.java')
-rw-r--r-- | nanolets/src/test/java/fi/iki/elonen/router/TestNanolets.java | 375 |
1 files changed, 375 insertions, 0 deletions
diff --git a/nanolets/src/test/java/fi/iki/elonen/router/TestNanolets.java b/nanolets/src/test/java/fi/iki/elonen/router/TestNanolets.java new file mode 100644 index 0000000..7b1ae56 --- /dev/null +++ b/nanolets/src/test/java/fi/iki/elonen/router/TestNanolets.java @@ -0,0 +1,375 @@ +package fi.iki.elonen.router; + +/* + * #%L + * NanoHttpd nano application server + * %% + * Copyright (C) 2012 - 2015 nanohttpd + * %% + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the nanohttpd nor the names of its contributors + * may be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * #L% + */ + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.client.methods.HttpTrace; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +import fi.iki.elonen.NanoHTTPD; +import fi.iki.elonen.router.RouterNanoHTTPD.GeneralHandler; +import fi.iki.elonen.router.RouterNanoHTTPD.UriResource; + +public class TestNanolets { + + private static PipedOutputStream stdIn; + + private static Thread serverStartThread; + + @BeforeClass + public static void setUp() throws Exception { + stdIn = new PipedOutputStream(); + System.setIn(new PipedInputStream(stdIn)); + serverStartThread = new Thread(new Runnable() { + + @Override + public void run() { + String[] args = {}; + AppNanolets.main(args); + } + }); + serverStartThread.start(); + // give the server some tine to start. + Thread.sleep(200); + } + + public static void main(String[] args) { + { + String uri = "def"; + Pattern.compile("([A-Za-z0-9\\-\\._~:/?#\\[\\]@!\\$&'\\(\\)\\*\\+,;=]+)"); + Pattern URI_PATTERN = Pattern.compile("([A-Za-z0-9\\-\\._~:/?#\\[\\]@!\\$&'\\(\\)\\*\\+,;=]+)"); + System.out.println(URI_PATTERN.matcher(uri).matches()); + } + + String uri = "photos/abc/def"; + Pattern URI_PATTERN = Pattern.compile("photos/([A-Za-z0-9\\-\\._~:/?#\\[\\]@!\\$&'\\(\\)\\*\\+,;=]+)/([A-Za-z0-9\\-\\._~:/?#\\[\\]@!\\$&'\\(\\)\\*\\+,;=]+)"); + Matcher matcher = URI_PATTERN.matcher(uri); + System.out.println("--------------->" + "/" + uri); + while (matcher.matches()) { + + System.out.println(matcher.group()); + } + // for (int index = 0; index < matcher.groupCount(); index++) { + // System.out.println(matcher.group()); + // } + } + + @Test + public void doSomeBasicMethodTest() throws Exception { + CloseableHttpClient httpclient = HttpClients.createDefault(); + + HttpGet httpget = new HttpGet("http://localhost:9090/user/blabla"); + CloseableHttpResponse response = httpclient.execute(httpget); + HttpEntity entity = response.getEntity(); + String string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals( + "<html><body>User handler. Method: GET<br><h1>Uri parameters:</h1><div> Param: id Value: blabla</div><h1>Query parameters:</h1></body></html>", string); + response.close(); + + HttpPost httppost = new HttpPost("http://localhost:9090/user/blabla"); + response = httpclient.execute(httppost); + entity = response.getEntity(); + string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals( + "<html><body>User handler. Method: POST<br><h1>Uri parameters:</h1><div> Param: id Value: blabla</div><h1>Query parameters:</h1></body></html>", string); + response.close(); + + HttpPut httpgput = new HttpPut("http://localhost:9090/user/blabla"); + response = httpclient.execute(httpgput); + entity = response.getEntity(); + string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals( + "<html><body>User handler. Method: PUT<br><h1>Uri parameters:</h1><div> Param: id Value: blabla</div><h1>Query parameters:</h1></body></html>", string); + response.close(); + + HttpDelete httpdelete = new HttpDelete("http://localhost:9090/user/blabla"); + response = httpclient.execute(httpdelete); + entity = response.getEntity(); + string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals( + "<html><body>User handler. Method: DELETE<br><h1>Uri parameters:</h1><div> Param: id Value: blabla</div><h1>Query parameters:</h1></body></html>", string); + response.close(); + } + + @Test + public void doNonRouterRequest() throws Exception { + CloseableHttpClient httpclient = HttpClients.createDefault(); + + HttpGet httpget = new HttpGet("http://localhost:9090/test"); + CloseableHttpResponse response = httpclient.execute(httpget); + HttpEntity entity = response.getEntity(); + String string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("Return: java.lang.String.toString() -> ", string); + response.close(); + } + + @Test + public void doExceptionRequest() throws Exception { + CloseableHttpClient httpclient = HttpClients.createDefault(); + + HttpGet httpget = new HttpGet("http://localhost:9090/interface"); + CloseableHttpResponse response = httpclient.execute(httpget); + HttpEntity entity = response.getEntity(); + String string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("Error: java.lang.InstantiationException : fi.iki.elonen.router.RouterNanoHTTPD$UriResponder", string); + response.close(); + } + + @Test + public void doDeletedRoute() throws Exception { + CloseableHttpClient httpclient = HttpClients.createDefault(); + + HttpGet httpget = new HttpGet("http://localhost:9090/toBeDeleted"); + CloseableHttpResponse response = httpclient.execute(httpget); + HttpEntity entity = response.getEntity(); + String string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("<html><body><h3>Error 404: the requested page doesn't exist.</h3></body></html>", string); + response.close(); + } + + @Test + public void doUriSelection1() throws Exception { + CloseableHttpClient httpclient = HttpClients.createDefault(); + + HttpGet httpget = new HttpGet("http://localhost:9090/user/help"); + CloseableHttpResponse response = httpclient.execute(httpget); + HttpEntity entity = response.getEntity(); + String string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("<html><body><h1>Url: /user/help</h1><br><p>no params in url</p><br>", string); + response.close(); + } + + @Test + public void doStreamOfData() throws Exception { + CloseableHttpClient httpclient = HttpClients.createDefault(); + + HttpGet httpget = new HttpGet("http://localhost:9090/stream"); + CloseableHttpResponse response = httpclient.execute(httpget); + HttpEntity entity = response.getEntity(); + String string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("a stream of data ;-)", string); + response.close(); + } + + @Test(expected = IllegalStateException.class) + public void illegalMethod1() throws Exception { + new AppNanolets.UserHandler().getData(); + } + + @Test(expected = IllegalStateException.class) + public void illegalMethod2() throws Exception { + new RouterNanoHTTPD.GeneralHandler().getText(); + } + + @Test(expected = IllegalStateException.class) + public void illegalMethod3() throws Exception { + new RouterNanoHTTPD.StaticPageHandler().getText(); + } + + @Test(expected = IllegalStateException.class) + public void illegalMethod4() throws Exception { + new RouterNanoHTTPD.StaticPageHandler().getMimeType(); + } + + @Test(expected = ClassCastException.class) + public void checkIniParameter1() throws Exception { + new RouterNanoHTTPD.UriResource("browse", 100, null, "init").initParameter(String.class); + new RouterNanoHTTPD.UriResource("browse", 100, null, "init").initParameter(Integer.class); + } + + @Test + public void checkIniParameter2() throws Exception { + Assert.assertEquals("init", new RouterNanoHTTPD.UriResource("browse", 100, null, "init").initParameter(String.class)); + Assert.assertNull(new RouterNanoHTTPD.UriResource("browse", 100, null).initParameter(String.class)); + } + + @Test + public void doGeneralParams() throws Exception { + CloseableHttpClient httpclient = HttpClients.createDefault(); + + HttpGet httpget = new HttpGet("http://localhost:9090/general/value1/value2?param3=value3¶m4=value4"); + + CloseableHttpResponse response = httpclient.execute(httpget); + HttpEntity entity = response.getEntity(); + String string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("<html><body><h1>Url: /general/value1/value2</h1><br><p>Param 'param3' = value3</p><p>Param 'param4' = value4</p>", string); + response.close(); + } + + @Test + public void doIndexHandler() throws Exception { + CloseableHttpClient httpclient = HttpClients.createDefault(); + + HttpGet httpget = new HttpGet("http://localhost:9090/index.html"); + CloseableHttpResponse response = httpclient.execute(httpget); + HttpEntity entity = response.getEntity(); + String string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("<html><body><h2>Hello world!</h3></body></html>", string); + response.close(); + } + + @Test + public void doMissingHandler() throws Exception { + CloseableHttpClient httpclient = HttpClients.createDefault(); + + HttpGet httpget = new HttpGet("http://localhost:9090/photos/abc/def"); + CloseableHttpResponse response = httpclient.execute(httpget); + HttpEntity entity = response.getEntity(); + String string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("<html><body><h2>The uri is mapped in the router, but no handler is specified. <br> Status: Not implemented!</h3></body></html>", string); + response.close(); + } + + @Test + public void uriToString() throws Exception { + Assert.assertEquals(// + "UrlResource{uri='photos/:customer_id/:photo_id', urlParts=[customer_id, photo_id]}",// + new UriResource("/photos/:customer_id/:photo_id", 100, GeneralHandler.class).toString()); + } + + @Test + public void doOtherMethod() throws Exception { + CloseableHttpClient httpclient = HttpClients.createDefault(); + + HttpTrace httphead = new HttpTrace("http://localhost:9090/index.html"); + CloseableHttpResponse response = httpclient.execute(httphead); + HttpEntity entity = response.getEntity(); + String string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("<html><body><h2>Hello world!</h3></body></html>", string); + response.close(); + } + + @Test + public void normalize() throws Exception { + Assert.assertNull(RouterNanoHTTPD.normalizeUri(null)); + Assert.assertEquals("", RouterNanoHTTPD.normalizeUri("/")); + Assert.assertEquals("xxx/yyy", RouterNanoHTTPD.normalizeUri("/xxx/yyy")); + Assert.assertEquals("xxx/yyy", RouterNanoHTTPD.normalizeUri("/xxx/yyy/")); + } + + private byte[] readContents(HttpEntity entity) throws IOException { + InputStream instream = entity.getContent(); + return readContents(instream); + } + + private byte[] readContents(InputStream instream) throws IOException { + byte[] bytes; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + try { + byte[] buffer = new byte[1024]; + int count; + while ((count = instream.read(buffer)) >= 0) { + out.write(buffer, 0, count); + } + bytes = out.toByteArray(); + } finally { + instream.close(); + } + return bytes; + } + + @Test + public void staticFiles() throws Exception { + CloseableHttpClient httpclient = HttpClients.createDefault(); + + HttpTrace httphead = new HttpTrace("http://localhost:9090/browse/blabla.html"); + CloseableHttpResponse response = httpclient.execute(httphead); + HttpEntity entity = response.getEntity(); + String string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("<html><body><h3>just a page</h3></body></html>", string); + response.close(); + + httphead = new HttpTrace("http://localhost:9090/browse/dir/blabla.html"); + response = httpclient.execute(httphead); + entity = response.getEntity(); + string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("<html><body><h3>just an other page</h3></body></html>", string); + response.close(); + + httphead = new HttpTrace("http://localhost:9090/browse/dir/nanohttpd_logo.png"); + response = httpclient.execute(httphead); + entity = response.getEntity(); + Assert.assertEquals("image/png", entity.getContentType().getValue()); + response.close(); + + httphead = new HttpTrace("http://localhost:9090/browse/dir/xxx.html"); + response = httpclient.execute(httphead); + entity = response.getEntity(); + string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("<html><body><h3>Error 404: the requested page doesn't exist.</h3></body></html>", string); + response.close(); + + httphead = new HttpTrace("http://localhost:9090/browse/dir/"); + response = httpclient.execute(httphead); + entity = response.getEntity(); + string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("<html><body><h3>just an index page</h3></body></html>", string); + response.close(); + + httphead = new HttpTrace("http://localhost:9090/browse/exception.html"); + response = httpclient.execute(httphead); + Assert.assertEquals(NanoHTTPD.Response.Status.REQUEST_TIMEOUT.getRequestStatus(), response.getStatusLine().getStatusCode()); + entity = response.getEntity(); + string = new String(readContents(entity), "UTF-8"); + Assert.assertEquals("", string); + response.close(); + } + + @AfterClass + public static void tearDown() throws Exception { + stdIn.write("\n\n".getBytes()); + serverStartThread.join(2000); + Assert.assertFalse(serverStartThread.isAlive()); + } + +} |