/* * Copyright 2001-2008 Geert Bevin (gbevin[remove] at uwyn dot com) * Licensed under the Apache License, Version 2.0 (the "License") * $Id: TestEngineMocks.java 3918 2008-04-14 17:35:35Z gbevin $ */ package com.uwyn.rife.test; import com.uwyn.rife.config.Config; import com.uwyn.rife.config.RifeConfig; import com.uwyn.rife.engine.ReservedParameters; import com.uwyn.rife.engine.SiteBuilder; import com.uwyn.rife.engine.exceptions.MultipartFileTooBigException; import com.uwyn.rife.resources.ResourceFinderClasspath; import com.uwyn.rife.tools.Base64; import com.uwyn.rife.tools.FileUtils; import com.uwyn.rife.tools.StringUtils; import com.uwyn.rife.tools.SwallowingLogFormatter; import junit.framework.TestCase; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.io.File; import java.util.HashMap; import java.util.List; import java.util.logging.Formatter; import java.util.logging.Handler; import java.util.logging.Logger; // These are just a collection of different kind of engine tests that // are already done in the engine testsuite within the embedded servlet // container. By using the same site-structures, we can check that the // out-of-container tests yield the same results. public class TestEngineMocks extends TestCase { public TestEngineMocks(String name) { super(name); } public void testSimpleHtml() throws Exception { SiteBuilder builder = new SiteBuilder("test", ResourceFinderClasspath.getInstance()) .enterElement("element/engine/simple_html.xml") .setUrl("/simple/html") .leaveElement(); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response = conversation.doRequest("http://localhost/simple/html"); assertEquals(200, response.getStatus()); assertEquals("text/html; charset=UTF-8", response.getContentType()); assertEquals("Just some text 127.0.0.1:localhost:.simple_html:", response.getText()); assertEquals(".simple_html", response.getLastElementId()); } public void testWrongServerRootUrl() throws Exception { SiteBuilder builder = new SiteBuilder("test", ResourceFinderClasspath.getInstance()) .enterElement("element/engine/simple_html.xml") .setUrl("/simple/html") .leaveElement(); MockConversation conversation = new MockConversation(builder.getSite()); assertNull(conversation.doRequest("http://10.0.0.1/simple/html")); } public void testContinuationsConditional() throws Exception { SiteBuilder builder = new SiteBuilder("site/continuations.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockForm form; ParsedHtml parsed; MockResponse response = conversation.doRequest("/conditional"); assertEquals(200, response.getStatus()); parsed = response.getParsedHtml(); assertEquals("printing", parsed.getTitle()); form = parsed.getFormWithName("pause"); assertNotNull(form); form.setParameter("answer", "1"); response = form.submit(); assertEquals(".conditional", response.getLastElementId()); parsed = response.getParsedHtml(); assertEquals("pauzing", parsed.getTitle()); form = parsed.getFormWithName("pause"); assertNotNull(form); form.setParameter("answer", "1"); // will not be checked response = form.submit(); assertEquals(".conditional", response.getLastElementId()); parsed = response.getParsedHtml(); assertEquals("pauzingprinting", parsed.getTitle()); form = parsed.getFormWithName("pause"); assertNotNull(form); form.setParameter("answer", "0"); response = form.submit(); assertEquals(".conditional", response.getLastElementId()); parsed = response.getParsedHtml(); assertEquals("printing", parsed.getTitle()); form = parsed.getFormWithName("pause"); assertNotNull(form); response = conversation.doRequest("/conditional", new MockRequest()); assertEquals(".conditional", response.getLastElementId()); parsed = response.getParsedHtml(); assertEquals("printing", parsed.getTitle()); form = parsed.getFormWithName("pause"); assertNotNull(form); form.setParameter("stop", "1"); response = form.submit(); assertEquals(".conditional", response.getLastElementId()); parsed = response.getParsedHtml(); assertEquals("stopping", parsed.getTitle()); } public void testCookies() throws Exception { SiteBuilder builder = new SiteBuilder("site/cookies.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()) .cookie("cookie1", "this is the first cookie") .cookie("cookie2", "this is the second cookie") .cookie("cookie3", "this is the third cookie"); MockResponse response = conversation.doRequest("/cookies/valid/source"); // check if the correct cookies were returned assertEquals(conversation.getCookie("cookie3").getValue(), "this is the first cookie"); assertEquals(conversation.getCookie("cookie4").getValue(), "this is the second cookie"); // new page with cookie context conversation.cookie("cookie4", "this is the fourth cookie"); response = conversation.doRequest("/cookies/valid/destination"); assertEquals(".COOKIES_VALID_DESTINATION", response.getLastElementId()); assertEquals("this is the second cookie,this is the first cookie,this is the fourth cookie", response.getText()); } public void testEmbeddingCookies() throws Exception { SiteBuilder builder = new SiteBuilder("site/embedding.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response = conversation.doRequest("/cookies"); assertEquals("value 1," + "value 2," + "value 3," + "value 4," + "<!--V 'OUTCOOKIE:cookie5'/-->," + "<form action=\"/cookies\"><input name=\"submission\" type=\"hidden\" value=\"submission\" /><input name=\"submissioncontext\" type=\"hidden\" value=\"" + Base64.encodeToString(".COOKIES::engine_embedding_cookies:.COOKIES_EMBEDDED^.COOKIES_EMBEDDED".getBytes("UTF-8"), false) + "\" /><input type=\"submit\" /></form>\n", response.getText()); ParsedHtml parsed = response.getParsedHtml(); MockForm form = parsed.getForms().get(0); response = form.submit(); assertEquals(".COOKIES", response.getLastElementId()); assertEquals("embedded value 1," + "embedded value 2," + "value 3," + "embedded value 4," + "<!--V 'OUTCOOKIE:cookie5'/-->,submitted\n", response.getText()); } public void testEmbeddingPriorities() throws Exception { SiteBuilder builder = new SiteBuilder("site/embedding.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response = conversation.doRequest("/priorities"); assertEquals("These elements are embedded:\n"+ ".PRIORITIES_EMBEDDED_LATE\n"+ ".PRIORITIES_EMBEDDED_NORMAL\n"+ ".PRIORITIES_EMBEDDED_EARLY\n"+ "done.\n"+ ".PRIORITIES_EMBEDDED_EARLY\n"+ ".PRIORITIES_EMBEDDED_NORMAL\n"+ ".PRIORITIES\n"+ ".PRIORITIES_EMBEDDED_LATE\n", response.getText()); List<MockResponse> embedded_reponses = response.getEmbeddedResponses(); assertEquals(3, embedded_reponses.size()); assertEquals(".PRIORITIES_EMBEDDED_EARLY", embedded_reponses.get(0).getLastElementId()); assertEquals(0, embedded_reponses.get(0).getEmbeddedResponses().size()); assertEquals(".PRIORITIES_EMBEDDED_NORMAL", embedded_reponses.get(1).getLastElementId()); assertEquals(0, embedded_reponses.get(1).getEmbeddedResponses().size()); assertEquals(".PRIORITIES_EMBEDDED_LATE", embedded_reponses.get(2).getLastElementId()); assertEquals(0, embedded_reponses.get(2).getEmbeddedResponses().size()); assertEquals(".PRIORITIES_EMBEDDED_EARLY", response.getEmbeddedResponse("-PRIORITIES_EMBEDDED_EARLY").getLastElementId()); assertEquals(".PRIORITIES_EMBEDDED_NORMAL", response.getEmbeddedResponse("PRIORITIES_EMBEDDED_NORMAL").getLastElementId()); assertEquals(".PRIORITIES_EMBEDDED_LATE", response.getEmbeddedResponse("+PRIORITIES_EMBEDDED_LATE").getLastElementId()); } public void testEmbeddingSuccessiveGlobalcookie() throws Exception { SiteBuilder builder = new SiteBuilder("site/embedding.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response = conversation.doRequest("/successive_globalcookie"); assertEquals(".SUCCESSIVE_GLOBALCOOKIE", response.getLastElementId()); assertEquals("embedded value 1,embedded value 2,<!--V 'OUTCOOKIE:cookie3'/-->,<!--V 'OUTCOOKIE:cookie4'/-->,<!--V 'OUTCOOKIE:cookie5'/-->\n" + "first: embedded\n" + "second: embedded value 1embedded value 2no cookie3\n", response.getText()); } public void testXPath() throws Exception { SiteBuilder builder = new SiteBuilder("site/exits.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response = null; response = conversation.doRequest("/exits/generatedurl/source"); NodeList links = response.xpathNodeSet("//a"); assertNotNull(links); assertEquals(4, links.getLength()); assertEquals("exit1", links.item(0).getTextContent()); assertEquals("exit2", links.item(1).getTextContent()); assertEquals("/exits/generatedurl/destination1?input2=the+second&input1=the+first", links.item(0).getAttributes().getNamedItem("href").getTextContent()); assertEquals("/exits/generatedurl/destination2?input1=the+second&input2=the+third", links.item(1).getAttributes().getNamedItem("href").getTextContent()); Node body = response.xpathNode("/html/body"); NodeList body_children = body.getChildNodes(); assertEquals(11, body_children.getLength()); assertEquals(Node.TEXT_NODE, body_children.item(0).getNodeType()); assertEquals("", body_children.item(0).getTextContent().trim()); assertEquals(Node.ELEMENT_NODE, body_children.item(1).getNodeType()); assertEquals("h1", body_children.item(1).getNodeName()); assertEquals(Node.TEXT_NODE, body_children.item(2).getNodeType()); assertEquals("", body_children.item(2).getTextContent().trim()); assertEquals(Node.ELEMENT_NODE, body_children.item(3).getNodeType()); assertEquals("a", body_children.item(3).getNodeName()); assertEquals(Node.TEXT_NODE, body_children.item(4).getNodeType()); assertEquals("", body_children.item(4).getTextContent().trim()); assertEquals(Node.ELEMENT_NODE, body_children.item(5).getNodeType()); assertEquals("a", body_children.item(5).getNodeName()); assertEquals(Node.TEXT_NODE, body_children.item(6).getNodeType()); assertEquals("", body_children.item(6).getTextContent().trim()); assertEquals("This is a template where the exit urls are generated.", response.xpathString("//h1/text()")); assertEquals(4, response.xpathNumber("count(//a)").intValue()); assertTrue(response.xpathBoolean("contains(//a[1]/text(), 'exit1')")); assertFalse(response.xpathBoolean("contains(//a[2]/text(), 'exit1')")); assertEquals(true, response.xpathBoolean("contains(a[1]/text(), 'exit1')", body).booleanValue()); assertEquals(true, response.xpathBoolean("contains(a[1]/text(), 'exit1')", body).booleanValue()); assertEquals(false, response.xpathBoolean("contains(a[2]/text(), 'exit1')", body).booleanValue()); assertEquals("/exits/generatedurl/destination1?input2=the+second&input1=the+first", response.xpathNode("a[1]", body).getAttributes().getNamedItem("href").getTextContent()); assertEquals(4, response.xpathNodeSet("a", body).getLength()); assertEquals(4, response.xpathNumber("count(a)", body).intValue()); assertEquals("This is a template where the exit urls are generated.", response.xpathString("h1", body)); } public void testExitsGeneratedUrl() throws Exception { SiteBuilder builder = new SiteBuilder("site/exits.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); ParsedHtml parsed; MockResponse response = null; response = conversation.doRequest("/exits/generatedurl/source"); parsed = response.getParsedHtml(); MockLink exit1_link = parsed.getLinkWithText("exit1"); response = exit1_link.click(); assertEquals(".GENERATEDURL_DESTINATION1", response.getLastElementId()); assertEquals("the first,the second", response.getText()); response = conversation.doRequest("/exits/generatedurl/source"); parsed = response.getParsedHtml(); MockLink exit2_link = parsed.getLinkWithText("exit2"); response = exit2_link.click(); assertEquals(".GENERATEDURL_DESTINATION2", response.getLastElementId()); assertEquals("the second,the third", response.getText()); response = conversation.doRequest("/exits/generatedurl/source?switch=overridden"); parsed = response.getParsedHtml(); MockLink exit1_link_overridden = parsed.getLinkWithText("exit1"); response = exit1_link_overridden.click(); assertEquals(".GENERATEDURL_DESTINATION1", response.getLastElementId()); assertEquals("the overridden first,the second", response.getText()); response = conversation.doRequest("/exits/generatedurl/source?switch=overridden"); parsed = response.getParsedHtml(); MockLink exit2_link_overridden = parsed.getLinkWithText("exit2"); response = exit2_link_overridden.click(); assertEquals(".GENERATEDURL_DESTINATION2", response.getLastElementId()); assertEquals("the second,the overridden third", response.getText()); } public void testExitSelective() throws Exception { SiteBuilder builder = new SiteBuilder("site/exits.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response1 = conversation.doRequest("/exits/selective/source", new MockRequest().parameter("switch", "1")); assertEquals(".SELECTIVE_DESTINATION1", response1.getLastElementId()); assertEquals("destination1", response1.getText()); MockResponse response2 = conversation.doRequest("/exits/selective/source", new MockRequest().parameter("switch", "2")); assertEquals(".SELECTIVE_DESTINATION2", response2.getLastElementId()); assertEquals("destination2", response2.getText()); MockResponse response3 = conversation.doRequest("/exits/selective/source", new MockRequest().parameter("switch", "3")); assertEquals(".SELECTIVE_DESTINATION3", response3.getLastElementId()); assertEquals("destination3", response3.getText()); } public void testExitsGeneratedUrlOverflow() throws Exception { SiteBuilder builder = new SiteBuilder("site/exits.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); // setup swallowing log formatters HashMap<Handler, Formatter> formatters = new HashMap<Handler, Formatter>(); SwallowingLogFormatter formatter = new SwallowingLogFormatter(); Logger logger = Logger.getLogger(""); for (Handler handler : logger.getHandlers()) { formatters.put(handler, handler.getFormatter()); handler.setFormatter(formatter); } try { MockResponse response = conversation.doRequest("/exits/generatedurloverflow/source"); assertEquals(".GENERATEDURLOVERFLOW_SOURCE", response.getLastElementId()); ParsedHtml parsed = response.getParsedHtml(); MockLink exit1_link = parsed.getLinkWithText("exit1"); assertTrue(exit1_link.getHref().startsWith("/exits/generatedurloverflow/destination;jsessionid=")); assertTrue(exit1_link.getHref().indexOf("?stateid=") != -1); response = exit1_link.click(); assertEquals(".GENERATEDURLOVERFLOW_DESTINATION", response.getLastElementId()); assertEquals("the first,"+StringUtils.repeat("abcdefghijklmnopqrstuvwxyz", 76)+"012345678", response.getText()); assertEquals(2, formatter.getRecords().size()); assertEquals("The exit 'exit1' of element '.GENERATEDURLOVERFLOW_SOURCE' generated an URL whose length of 2049 exceeds the maximum length of 2048 bytes, using session state store instead. The generated URL was '/exits/generatedurloverflow/destination?input1=the+first&input2="+StringUtils.repeat("abcdefghijklmnopqrstuvwxyz", 76)+"012345678"+"'.", formatter.getRecords().get(0).getMessage()); } finally { // restore the previous formatters for (Handler handler : logger.getHandlers()) { handler.setFormatter(formatters.get(handler)); } } } public void testExpressionInputsGroovy() throws Exception { SiteBuilder builder = new SiteBuilder("site/expressionelement.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response; response = conversation.doRequest("/inputs_groovy?input1=value1"); assertEquals(".INPUTS_GROOVY", response.getLastElementId()); assertEquals("this is value 1\n\n\n", response.getText()); response = conversation.doRequest("/inputs_groovy?input1=value2"); assertEquals(".INPUTS_GROOVY", response.getLastElementId()); assertEquals("this is value 2\n\n\n", response.getText()); response = conversation.doRequest("/inputs_groovy?input1=value3"); assertEquals(".INPUTS_GROOVY", response.getLastElementId()); assertEquals("<!--V 'GROOVY:value'/-->\n\n\n", response.getText()); } public void testInheritanceExits() throws Exception { SiteBuilder builder = new SiteBuilder("site/inheritance.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response; MockForm form; ParsedHtml parsed; response = conversation.doRequest("/inheritance/exits", new MockRequest() .parameter("childinput1", "will this") .parameter("childinput2", "arrive too")); assertEquals(".EXITS_PARENT2", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getFormWithName("formparent2"); response = form .parameter("activationparent2", "don't go to child") .submit(); assertEquals(".EXITS_PARENT2", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getFormWithName("formparent2"); response = form .parameter("activationparent2", "go to child") .submit(); assertEquals(".EXITS_PARENT1", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getFormWithName("formparent1"); response = form .parameter("activationparent1", "don't go to exit") .submit(); assertEquals(".EXITS_PARENT1", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getFormWithName("formparent1"); response = form .parameter("activationparent1", "go to exit") .submit(); assertEquals(".EXITS_PARENT1_EXIT1", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getFormWithName("formparent1exit1"); response = form .parameter("activationparent1exit1", "don't go to exit") .submit(); assertEquals(".EXITS_PARENT1_EXIT1", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getFormWithName("formparent1exit1"); response = form .parameter("activationparent1exit1", "go to exit") .submit(); assertEquals(".EXITS_PARENT1_EXIT2", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getFormWithName("formparent1exit2"); response = form .parameter("activationparent1exit2", "don't go to child") .submit(); assertEquals(".EXITS_PARENT1_EXIT2", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getFormWithName("formparent1exit2"); response = form .parameter("activationparent1exit2", "go to child") .submit(); assertEquals(".EXITS_PARENT2", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getFormWithName("formparent2"); response = form .parameter("activationparent2", "don't go to child") .submit(); assertEquals(".EXITS_PARENT2", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getFormWithName("formparent2"); response = form .parameter("activationparent2", "go to child") .submit(); assertEquals(".EXITS_CHILD", response.getLastElementId()); assertEquals("will this,arrive too", response.getText()); } public void testInputsNamedBeanPrefix() throws Exception { SiteBuilder builder = new SiteBuilder("site/inputs.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response; response = conversation.doRequest("/inputs/named_bean/prefix", new MockRequest() .parameter("prefix_string", "the string") .parameter("prefix_boolean", "y") .parameter("prefix_string", "the string") .parameter("prefix_stringbuffer", "the stringbuffer") .parameter("prefix_int", "23154") .parameter("prefix_integer", "893749") .parameter("prefix_char", "u") .parameter("prefix_character", "R") .parameter("prefix_boolean", "y") .parameter("prefix_booleanObject", "no") .parameter("prefix_byte", "120") .parameter("prefix_byteObject", "21") .parameter("prefix_double", "34878.34") .parameter("prefix_doubleObject", "25435.98") .parameter("prefix_float", "3434.76") .parameter("prefix_floatObject", "6534.8") .parameter("prefix_long", "34347897") .parameter("prefix_longObject", "2335454") .parameter("prefix_short", "32") .parameter("prefix_shortObject", "12")); assertEquals(".NAMED_BEAN_PREFIX", response.getLastElementId()); assertEquals("the string,the stringbuffer,23154,893749,u,null,true,false,0,21,34878.34,25435.98,3434.76,6534.8,34347897,2335454,32,12", response.getText()); response = conversation.doRequest("/inputs/named_bean/prefix", new MockRequest() .parameter("prefix_string", "the string") .parameter("prefix_boolean", "y") .parameter("prefix_string", "the string") .parameter("prefix_stringbuffer", "the stringbuffer") .parameter("prefix_int", "23fd33") .parameter("prefix_char", "u") .parameter("prefix_character", "R") .parameter("prefix_boolean", "y") .parameter("prefix_booleanObject", "no") .parameter("prefix_byte", "120") .parameter("prefix_byteObject", "21") .parameter("prefix_double", "zef.34") .parameter("prefix_doubleObject", "25435.98") .parameter("prefix_float", "3434.76") .parameter("prefix_floatObject", "6534.8") .parameter("prefix_long", "34347897") .parameter("prefix_longObject", "233f5454") .parameter("prefix_short", "32") .parameter("prefix_shortObject", "")); assertEquals(".NAMED_BEAN_PREFIX", response.getLastElementId()); assertEquals("NOTNUMERIC : int\nNOTNUMERIC : double\nNOTNUMERIC : longObject\nthe string,the stringbuffer,0,null,u,null,true,false,0,21,0.0,25435.98,3434.76,6534.8,34347897,null,32,null", response.getText()); } public void testInputsGenerated() throws Exception { SiteBuilder builder = new SiteBuilder("site/inputs.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response; response = conversation.doRequest("/inputs/generated", new MockRequest() .parameter("wantsupdates", "on") .parameter("colors", new String[] {"orange", "blue", "green"}) .parameter("firstname", "Geert") .parameter("lastname", "Bevin")); assertEquals(".GENERATED", response.getLastElementId()); assertEquals("Geert, Bevin\n" + "<input type=\"checkbox\" name=\"wantsupdates\" checked=\"checked\"> I want updates<br />\n" + "<input type=\"checkbox\" name=\"colors\" value=\"orange\" checked=\"checked\">orange<br />\n" + "<input type=\"checkbox\" name=\"colors\" value=\"blue\" checked=\"checked\">blue<br />\n" + "<input type=\"checkbox\" name=\"colors\" value=\"red\">red<br />\n" + "<input type=\"radio\" name=\"firstname\" checked=\"checked\"> Geert\n" + "<input type=\"radio\" name=\"firstname\"> Nathalie\n" + "<select name=\"lastname\">\n" + "\t<option value=\"Bevin\" selected=\"selected\">Bevin</option>\n" + "\t<option value=\"Mafessoni\">Mafessoni</option>\n" + "</select>\n", response.getText()); response = conversation.doRequest("/inputs/generated"); assertEquals(".GENERATED", response.getLastElementId()); assertEquals("<!--V 'INPUT:firstname'/-->, <!--V 'INPUT:lastname'/-->\n" + "<input type=\"checkbox\" name=\"wantsupdates\"> I want updates<br />\n" + "<input type=\"checkbox\" name=\"colors\" value=\"orange\">orange<br />\n" + "<input type=\"checkbox\" name=\"colors\" value=\"blue\">blue<br />\n" + "<input type=\"checkbox\" name=\"colors\" value=\"red\">red<br />\n" + "<input type=\"radio\" name=\"firstname\"> Geert\n" + "<input type=\"radio\" name=\"firstname\"> Nathalie\n" + "<select name=\"lastname\">\n" + "\t<option value=\"Bevin\">Bevin</option>\n" + "\t<option value=\"Mafessoni\">Mafessoni</option>\n" + "</select>\n", response.getText()); } public void testFileUploadSingleParam() throws Exception { SiteBuilder builder = new SiteBuilder("site/submissions.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response; MockForm form; ParsedHtml parsed; response = conversation.doRequest("/fileupload/simple"); assertEquals(".FILEUPLOAD_SIMPLE", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getForms().get(0); String upload_content = "abcdefghijklmnopqrstuvwxyz"; File upload = File.createTempFile("rifetest", ".tmp"); upload.deleteOnExit(); FileUtils.writeString(upload_content, upload); form.setParameter("purpose", "it will serve you well"); MockFileUpload file_upload = new MockFileUpload(upload); form.setFile("doc1", file_upload); response = form.submit(); assertEquals(".FILEUPLOAD_SIMPLE", response.getLastElementId()); assertEquals(upload_content+";no file 2;it will serve you well", response.getText()); upload.delete(); } public void testFileUploadMultipleParams() throws Exception { SiteBuilder builder = new SiteBuilder("site/submissions.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response; MockForm form; ParsedHtml parsed; response = conversation.doRequest("/fileupload/simple"); assertEquals(".FILEUPLOAD_SIMPLE", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getForms().get(0); String upload1_content = "abcdefghijklmnopqrstuvwxyz"; File upload1 = File.createTempFile("rifetest", ".tmp"); String upload2_content = "oiuezroizehfkjsdgfhgizeugfizuhfksjdhfiuzhfiuzehfizeuhfziuh"; File upload2 = File.createTempFile("rifetest", ".tmp"); upload1.deleteOnExit(); FileUtils.writeString(upload1_content, upload1); upload2.deleteOnExit(); FileUtils.writeString(upload2_content, upload2); form.setParameter("purpose", "it will serve you well"); MockFileUpload file_upload1 = new MockFileUpload(upload1); MockFileUpload file_upload2 = new MockFileUpload(upload2); form.setFile("doc1", file_upload1); form.setFile("doc2", file_upload2); response = form.submit(); assertEquals(".FILEUPLOAD_SIMPLE", response.getLastElementId()); assertEquals(upload1_content+";"+upload2_content+";it will serve you well", response.getText()); upload1.delete(); upload2.delete(); } public void testFileUploadSingleParamMultipleFiles() throws Exception { SiteBuilder builder = new SiteBuilder("site/submissions.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response; MockForm form; ParsedHtml parsed; response = conversation.doRequest("/fileupload/simple"); assertEquals(".FILEUPLOAD_SIMPLE", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getForms().get(0); String upload1_content = "abcdefghijklmnopqrstuvwxyz"; File upload1 = File.createTempFile("rifetest", ".tmp"); String upload2_content = "oiuezroizehfkjsdgfhgizeugfizuhfksjdhfiuzhfiuzehfizeuhfziuh"; File upload2 = File.createTempFile("rifetest", ".tmp"); upload1.deleteOnExit(); FileUtils.writeString(upload1_content, upload1); upload2.deleteOnExit(); FileUtils.writeString(upload2_content, upload2); form.setParameter("purpose", "it will serve you well"); MockFileUpload file_upload1 = new MockFileUpload(upload1); MockFileUpload file_upload2 = new MockFileUpload(upload2); form.setFiles("doc1", new MockFileUpload[] {file_upload1, file_upload2}); response = form.submit(); assertEquals(".FILEUPLOAD_SIMPLE", response.getLastElementId()); assertEquals(upload1_content+","+upload2_content+";no file 2;it will serve you well", response.getText()); upload1.delete(); upload2.delete(); } public void testFileUploadSizeLimit() throws Exception { SiteBuilder builder = new SiteBuilder("site/submissions.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response; MockForm form; ParsedHtml parsed; String upload_content_part = "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567"; // 128 bytes StringBuffer upload_content = new StringBuffer(); File upload = File.createTempFile("rifetest", ".tmp"); upload.deleteOnExit(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 8; j++) // 1KB { upload_content.append(upload_content_part); } } FileUtils.writeString(upload_content.toString(), upload); MockFileUpload file_upload = null; // exactly the same size as the limit Config.getRepInstance().setParameter(RifeConfig.Engine.PARAM_FILEUPLOAD_SIZE_LIMIT, ""+upload_content.length()); response = conversation.doRequest("/fileupload/simple"); assertEquals(".FILEUPLOAD_SIMPLE", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getForms().get(0); form.setParameter("purpose", "it will serve you well"); file_upload = new MockFileUpload(upload); form.setFile("doc1", file_upload); response = form.submit(); assertEquals(".FILEUPLOAD_SIMPLE", response.getLastElementId()); assertEquals(upload_content.toString()+";no file 2;it will serve you well", response.getText()); // exceeding the size by 1 Config.getRepInstance().setParameter(RifeConfig.Engine.PARAM_FILEUPLOAD_SIZE_LIMIT, ""+(upload_content.length()-1)); response = conversation.doRequest("/fileupload/simple"); assertEquals(".FILEUPLOAD_SIMPLE", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getForms().get(0); // throw no exception when size is exceeded, but don't provide the uploaded file Config.getRepInstance().setParameter(RifeConfig.Engine.PARAM_FILEUPLOAD_SIZE_EXCEPTION, false); form.setParameter("purpose", "it will serve you well"); file_upload = new MockFileUpload(upload); form.setFile("doc1", file_upload); response = form.submit(); assertEquals(".FILEUPLOAD_SIMPLE", response.getLastElementId()); assertEquals("file 1 size exceeded;no file 2;it will serve you well", response.getText()); // throw exception when size is exceeded Config.getRepInstance().setParameter(RifeConfig.Engine.PARAM_FILEUPLOAD_SIZE_EXCEPTION, true); form.setParameter("purpose", "it will serve you well"); file_upload = new MockFileUpload(upload); form.setFile("doc1", file_upload); try { response = form.submit(); fail(); } catch (MultipartFileTooBigException e) { assertEquals("doc1", e.getFileName()); assertEquals(upload_content.length()-1, e.getSizeLimit()); } // disable size limit Config.getRepInstance().setParameter(RifeConfig.Engine.PARAM_FILEUPLOAD_SIZE_CHECK, false); response = conversation.doRequest("/fileupload/simple"); assertEquals(".FILEUPLOAD_SIMPLE", response.getLastElementId()); parsed = response.getParsedHtml(); form = parsed.getForms().get(0); form.setParameter("purpose", "it will serve you well"); file_upload = new MockFileUpload(upload); form.setFile("doc1", file_upload); response = form.submit(); assertEquals(".FILEUPLOAD_SIMPLE", response.getLastElementId()); upload.delete(); Config.getRepInstance().setParameter(RifeConfig.Engine.PARAM_FILEUPLOAD_SIZE_CHECK, "true"); } private boolean isSessionResponse(MockResponse response) { return 1 == response.getNewCookieNames().size() && "JSESSIONID".equals(response.getNewCookieNames().get(0)); } private boolean isSessionLink(MockLink link) { return link.getHref().indexOf(ReservedParameters.STATEID) != -1; } private boolean isSessionForm(MockForm form) { return form.hasParameter(ReservedParameters.STATEID); } public void testSessionSubmissionInputsPreserved() throws Exception { SiteBuilder builder = new SiteBuilder("site/statesession.xml", ResourceFinderClasspath.getInstance()); MockConversation conversation = new MockConversation(builder.getSite()); MockResponse response; MockLink submission_link; MockForm submission_form; ParsedHtml parsed; response = conversation.doRequest("/submissions/inputspreserved", new MockRequest() .parameter("input1", "submission1input1value") .parameter("input4", "submission1input4value")); assertEquals(".INPUTSPRESERVED", response.getLastElementId()); parsed = response.getParsedHtml(); assertTrue(isSessionResponse(response)); submission_link = parsed.getLinkWithText("submission1"); assertTrue(isSessionLink(submission_link)); response = submission_link.click(); assertEquals(".INPUTSPRESERVED", response.getLastElementId()); assertEquals("thevalue"+ "submission1input1value"+ "null"+ "input3default", response.getText()); response = conversation.doRequest("/submissions/inputspreserved", new MockRequest() .parameter("input1", "submission2input1value") .parameter("input4", "submission2input4value")); assertEquals(".INPUTSPRESERVED", response.getLastElementId()); parsed = response.getParsedHtml(); submission_form = parsed.getForms().get(0); assertTrue(isSessionForm(submission_form)); submission_form.setParameter("login", "gbevin2"); response = submission_form.submit(); assertEquals(".INPUTSPRESERVED", response.getLastElementId()); submission_form = parsed.getForms().get(0); assertTrue(isSessionForm(submission_form)); submission_form.setParameter("password", "oncemoremypassword"); response = submission_form.submit(); assertEquals(".INPUTSPRESERVED", response.getLastElementId()); assertEquals("gbevin2,oncemoremypassword"+ "submission2input1value"+ "null"+ "input3default", response.getText()); response = conversation.doRequest("/submissions/inputspreserved", new MockRequest() .parameter("input1", "submission3input1value") .parameter("input4", "submission3input4value")); parsed = response.getParsedHtml(); submission_form = parsed.getForms().get(1); assertTrue(isSessionForm(submission_form)); response = submission_form.submit(); assertEquals(".INPUTSPRESERVED", response.getLastElementId()); submission_form = parsed.getForms().get(1); assertTrue(isSessionForm(submission_form)); submission_form.setParameter("login", "me"); response = submission_form.submit(); assertEquals(".INPUTSPRESERVED", response.getLastElementId()); assertEquals("me,it is"+ "submission3input1value"+ "null"+ "input3default", response.getText()); response = conversation.doRequest("/submissions/inputspreserved", new MockRequest() .parameter("input1", "submission4input1value") .parameter("input4", "submission4input4value")); assertEquals(".INPUTSPRESERVED", response.getLastElementId()); parsed = response.getParsedHtml(); submission_link = parsed.getLinkWithText("submission4"); assertTrue(isSessionLink(submission_link)); response = submission_link.click(); assertEquals(".INPUTSPRESERVED", response.getLastElementId()); assertEquals("submission4"+ "submission4input1value"+ "null"+ "input3default", response.getText()); } }