/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.jmeterplugins.protocol.http.control; import kg.apc.emulators.TestJMeterUtils; import org.apache.commons.io.IOUtils; import org.junit.Test; import java.io.*; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class HttpSimpleTableServerTest { private final String DATA_DIR; private static final String CRLF = HttpSimpleTableServer.lineSeparator; public HttpSimpleTableServerTest() { DATA_DIR = TestJMeterUtils.getTempDir(); } @Test public void testGetRequest() throws Exception { // create a file to test the STS BufferedWriter out; String filename = "test-login.csv"; out = new BufferedWriter(new FileWriter(new File(DATA_DIR, filename))); out.write("login1;password1"); out.write(CRLF); out.write("login2;password2"); out.write(CRLF); out.close(); HttpSimpleTableServer obj = new HttpSimpleTableServerEmul(-1, true, DATA_DIR); // HELP (GET) String result = sendHttpGet(obj, "" + "/sts"); assertTrue(0 < result.length() && result .startsWith("<html><head><title>URL for the dataset</title><head>")); // HELP (GET) result = sendHttpGet(obj, "" + "/sts/"); assertTrue(0 < result.length() && result .startsWith("<html><head><title>URL for the dataset</title><head>")); // STATUS (GET) : ERROR EMPTY DATABASE result = sendHttpGet(obj, "" + "/sts/STATUS"); assertEquals("<html><title>KO</title>" + CRLF + "<body>" + "Error : Database was empty !</body>" + CRLF + "</html>", result); // INITFILE (GET) result = sendHttpGet(obj, "/sts/INITFILE", this.createParm("FILENAME", filename)); assertEquals("<html><title>OK</title>" + CRLF + "<body>2</body>" + CRLF + "</html>", result); // INITFILE (GET) : ERROR FILE NOT FOUND result = sendHttpGet(obj, "/sts/INITFILE", this.createParm("FILENAME", "unknown.txt")); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : file not found !</body>" + CRLF + "</html>", result); // INITFILE (GET) : ERROR MISSING FILENAME result = sendHttpGet(obj, "/sts/INITFILE", new HashMap<String, String>()); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : FILENAME parameter was missing !</body>" + CRLF + "</html>", result); // Delete the file test-login.csv File dataset = new File(DATA_DIR, filename); dataset.delete(); // READ LAST KEEP=TRUE (GET) Map<String, String> map1 = this.createParm("FILENAME", filename); map1.put("READ_MODE", "LAST"); result = sendHttpGet(obj, "/sts/READ", map1); assertEquals("<html><title>OK</title>" + CRLF + "<body>login2;password2</body>" + CRLF + "</html>", result); // READ FIRST KEEP=FALSE (GET) Map<String, String> map2 = this.createParm("FILENAME", filename); map2.put("READ_MODE", "FIRST"); map2.put("KEEP", "FALSE"); result = sendHttpGet(obj, "/sts/READ", map2); assertEquals("<html><title>OK</title>" + CRLF + "<body>login1;password1</body>" + CRLF + "</html>", result); // READ (GET) : ERROR UNKNOWN READ_MODE Map<String, String> map3 = this.createParm("FILENAME", filename); map3.put("READ_MODE", "SECOND"); result = sendHttpGet(obj, "/sts/READ", map3); assertEquals( "<html><title>KO</title>" + CRLF + "<body>Error : READ_MODE value has to be FIRST, LAST or RANDOM !</body>" + CRLF + "</html>", result); // READ (GET) : ERROR MISSING FILENAME Map<String, String> map4 = this.createParm("A", filename); map4.put("READ_MODE", "LAST"); result = sendHttpGet(obj, "/sts/READ", map4); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : FILENAME parameter was missing !</body>" + CRLF + "</html>", result); // READ (GET) : ERROR UNKNOWN FILENAME result = sendHttpGet(obj, "/sts/READ", this.createParm("FILENAME", "unexpected.txt")); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : unexpected.txt not loaded yet !</body>" + CRLF + "</html>", result); // READ (GET) : ERROR UNKNOWN KEEP Map<String, String> map5 = this.createParm("FILENAME", filename); map5.put("KEEP", "NO"); result = sendHttpGet(obj, "/sts/READ", map5); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : KEEP value has to be TRUE or FALSE !</body>" + CRLF + "</html>", result); // LENGTH (GET) result = sendHttpGet(obj, "/sts/LENGTH", this.createParm("FILENAME", filename)); assertEquals("<html><title>OK</title>" + CRLF + "<body>1</body>" + CRLF + "</html>", result); // LENGTH (POST) result = sendHttpPost(obj, "/sts/LENGTH", this.createParm("FILENAME", filename)); assertEquals("<html><title>OK</title>" + CRLF + "<body>1</body>" + CRLF + "</html>", result); // LENGTH (GET) ERROR FILE NOT FOUND result = sendHttpGet(obj, "/sts/LENGTH", this.createParm("FILENAME", "unknown.txt")); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : unknown.txt not loaded yet !</body>" + CRLF + "</html>", result); // LENGTH (GET) ERROR MISSING FILENAME result = sendHttpGet(obj, "/sts/LENGTH", this.createParm("A", "unknown.txt")); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : FILENAME parameter was missing !</body>" + CRLF + "</html>", result); // ADD (POST) Map<String, String> urlParameters = this.createParm("FILENAME", "unknown.txt"); urlParameters.put("ADD_MODE", "LAST"); urlParameters.put("FILENAME", "test-login.csv"); urlParameters.put("LINE", "login3;password3"); result = sendHttpPost(obj, "/sts/ADD", urlParameters); assertEquals("<html><title>OK</title>" + CRLF + "<body></body>" + CRLF + "</html>", result); // ADD (GET) : ERROR ADD SHOULD USE POST METHOD result = sendHttpGet(obj, "" + "/sts/ADD?LINE=login4;password4&FILENAME=" + filename); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : unknown command !</body>" + CRLF + "</html>", result); // ADD (POST) : ERROR MISSING LINE Map<String, String> urlParameters2 = this.createParm("FILENAME", "unknown.txt"); urlParameters2.put("ADD_MODE", "LAST"); urlParameters2.put("FILENAME", "test-login.csv"); result = sendHttpPost(obj, "/sts/ADD", urlParameters2); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : LINE parameter was missing !</body>" + CRLF + "</html>", result); // ADD (POST) : MISSING ADD_MODE Map<String, String> urlParameters3 = this.createParm("FILENAME", "unknown.txt"); urlParameters3.put("FILENAME", "test-login.csv"); urlParameters3.put("LINE", "login3;password3"); result = sendHttpPost(obj, "/sts/ADD", urlParameters3); assertEquals("<html><title>OK</title>" + CRLF + "<body></body>" + CRLF + "</html>", result); // ADD (POST) : ERROR WRONG ADD MODE Map<String, String> urlParameters4 = this.createParm("FILENAME", "unknown.txt"); urlParameters4.put("ADD_MODE", "RANDOM"); urlParameters4.put("FILENAME", "test-login.csv"); urlParameters4.put("LINE", "login3;password3"); result = sendHttpPost(obj, "/sts/ADD", urlParameters4); assertEquals( "<html><title>KO</title>" + CRLF + "<body>Error : ADD_MODE value has to be FIRST or LAST !</body>" + CRLF + "</html>", result); // READ RANDOM KEEP=TRUE (GET) Map<String, String> urlParameters5 = this.createParm("FILENAME", filename); urlParameters4.put("READ_MODE", "RANDOM"); result = sendHttpGet(obj, "/sts/READ", urlParameters5); assertTrue(result.startsWith("<html><title>OK</title>")); // SAVE (GET) result = sendHttpGet(obj, "/sts/SAVE", this.createParm("FILENAME", filename)); assertEquals("<html><title>OK</title>" + CRLF + "<body>3</body>" + CRLF + "</html>", result); // SAVE (GET) : ERROR MAX SIZE REACHED result = sendHttpGet(obj, "/sts/SAVE", this.createParm("FILENAME", "aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmmmm.txt" + filename)); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : Maximum size reached (128) !</body>" + CRLF + "</html>", result); // SAVE (GET) : ERROR ILLEGAL CHAR result = sendHttpGet(obj, "/sts/SAVE", this.createParm("FILENAME", "logins:passwords.csv")); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : Illegal character found !</body>" + CRLF + "</html>", result); // SAVE (GET) : ERROR ILLEGAL FILENAME . result = sendHttpGet(obj, "/sts/SAVE", this.createParm("FILENAME", ".")); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : Illegal character found !</body>" + CRLF + "</html>", result); // SAVE (GET) : ERROR ILLEGAL FILENAME .. result = sendHttpGet(obj, "/sts/SAVE", this.createParm("FILENAME", "..")); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : Illegal character found !</body>" + CRLF + "</html>", result); // Delete the newly saved file test-login.csv dataset = new File(DATA_DIR, filename); dataset.delete(); // RESET (GET) result = sendHttpGet(obj, "/sts/RESET", this.createParm("FILENAME", filename)); assertEquals("<html><title>OK</title>" + CRLF + "<body></body>" + CRLF + "</html>", result); // RESET (GET) ERROR MISSING FILENAME result = sendHttpGet(obj, "/sts/RESET", this.createParm("A", filename)); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : FILENAME parameter was missing !</body>" + CRLF + "</html>", result); // READ (GET) : ERROR LIST IS EMPTY result = sendHttpGet(obj, "/sts/READ", this.createParm("FILENAME", filename)); assertEquals("<html><title>KO</title>" + CRLF + "<body>Error : No more line !</body>" + CRLF + "</html>", result); // STATUS (GET) result = sendHttpGet(obj, "/sts/STATUS"); assertEquals("<html><title>OK</title>" + CRLF + "<body>" + CRLF + filename + " = 0<br />" + CRLF + "</body></html>", result); } private Map<String, String> createParm(String filename, String filename1) { Map<String, String> res = new HashMap<String, String>(); res.put(filename, filename1); return res; } private String sendHttpGet(HttpSimpleTableServer obj, String s, Map<String, String> params) throws IOException { SessionEmulator sess = new SessionEmulator(s); if (params != null) { sess.setParms(params); } NanoHTTPD.Response resp = obj.serve(sess); InputStream inputStream = resp.getData(); StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer); return writer.toString(); } private String sendHttpGet(HttpSimpleTableServer obj, String url) throws Exception { return sendHttpGet(obj, url, null); } private String sendHttpPost(HttpSimpleTableServer obj, String url, Map<String, String> parms) throws Exception { SessionEmulator sess = new SessionEmulator(url); sess.setMethod(NanoHTTPD.Method.POST); sess.setBody((parms)); NanoHTTPD.Response resp = obj.serve(sess); InputStream inputStream = resp.getData(); StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer); return writer.toString(); } private class SessionEmulator implements NanoHTTPD.IHTTPSession { private final String url; private Map<String, String> parms; private NanoHTTPD.Method method; private Map<String, String> body; public SessionEmulator(String url) { this.url = url; } @Override public void execute() throws IOException { } @Override public Map<String, String> getParms() { return this.parms; } @Override public Map<String, String> getHeaders() { return null; } @Override public String getUri() { return this.url; } @Override public String getQueryParameterString() { return null; } @Override public NanoHTTPD.Method getMethod() { return this.method; } @Override public InputStream getInputStream() { return null; } @Override public NanoHTTPD.CookieHandler getCookies() { return null; } @Override public void parseBody(Map<String, String> files) throws IOException, NanoHTTPD.ResponseException { files.putAll(this.body); parms = body; } public void setParms(Map<String, String> parms) { this.parms = parms; } public void setMethod(NanoHTTPD.Method method) { this.method = method; } public void setBody(Map<String, String> body) { this.body = body; } } }