SPR-6464 Add target request matching logic to DefaultFlashMapManager.
This commit is contained in:
@@ -21,7 +21,6 @@ import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.springframework.mock.web.MockHttpServletRequest;
|
||||
|
||||
/**
|
||||
* Test fixture for {@link FlashMap} tests.
|
||||
@@ -30,101 +29,6 @@ import org.springframework.mock.web.MockHttpServletRequest;
|
||||
*/
|
||||
public class FlashMapTests {
|
||||
|
||||
@Test
|
||||
public void matchAnyUrlPath() {
|
||||
FlashMap flashMap = new FlashMap();
|
||||
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "")));
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/")));
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/yes")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void matchUrlPath() {
|
||||
FlashMap flashMap = new FlashMap();
|
||||
flashMap.setExpectedRequestUri(null, "/yes");
|
||||
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/yes")));
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/yes/")));
|
||||
assertFalse(flashMap.matches(new MockHttpServletRequest("GET", "/yes/but")));
|
||||
assertFalse(flashMap.matches(new MockHttpServletRequest("GET", "/no")));
|
||||
|
||||
flashMap.setExpectedRequestUri(null, "/thats it?");
|
||||
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/thats it")));
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/thats%20it")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void matchRelativeUrlPath() {
|
||||
FlashMap flashMap = new FlashMap();
|
||||
|
||||
flashMap.setExpectedRequestUri(new MockHttpServletRequest("GET", "/oh/no"), "yes");
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/oh/yes")));
|
||||
|
||||
flashMap.setExpectedRequestUri(new MockHttpServletRequest("GET", "/oh/not/again"), "../ok");
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/oh/ok")));
|
||||
|
||||
flashMap.setExpectedRequestUri(new MockHttpServletRequest("GET", "/yes/it/is"), "..");
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/yes")));
|
||||
|
||||
flashMap.setExpectedRequestUri(new MockHttpServletRequest("GET", "/yes/it/is"), "../");
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/yes")));
|
||||
|
||||
flashMap.setExpectedRequestUri(new MockHttpServletRequest("GET", "/thats it/really"), "./");
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/thats%20it")));
|
||||
|
||||
flashMap.setExpectedRequestUri(new MockHttpServletRequest("GET", "/yes/it/is"), "..?url=http://example.com");
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/yes")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void matchAbsoluteUrlPath() {
|
||||
FlashMap flashMap = new FlashMap();
|
||||
flashMap.setExpectedRequestUri(new MockHttpServletRequest(), "http://example.com");
|
||||
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "")));
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/")));
|
||||
assertFalse(flashMap.matches(new MockHttpServletRequest("GET", "/no")));
|
||||
|
||||
flashMap.setExpectedRequestUri(null, "http://example.com/");
|
||||
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "")));
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/")));
|
||||
assertFalse(flashMap.matches(new MockHttpServletRequest("GET", "/no")));
|
||||
|
||||
flashMap.setExpectedRequestUri(null, "http://example.com/yes");
|
||||
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/yes")));
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/yes/")));
|
||||
assertFalse(flashMap.matches(new MockHttpServletRequest("GET", "/no")));
|
||||
assertFalse(flashMap.matches(new MockHttpServletRequest("GET", "/yes/no")));
|
||||
|
||||
flashMap.setExpectedRequestUri(null, "http://example.com/yes?a=1");
|
||||
|
||||
assertTrue(flashMap.matches(new MockHttpServletRequest("GET", "/yes")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void matchExpectedRequestParameter() {
|
||||
String parameterName = "numero";
|
||||
|
||||
FlashMap flashMap = new FlashMap();
|
||||
flashMap.setExpectedRequestParam(parameterName, "uno");
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
assertFalse(flashMap.matches(request));
|
||||
|
||||
request.setParameter(parameterName, "uno");
|
||||
assertTrue(flashMap.matches(request));
|
||||
|
||||
request.setParameter(parameterName, "dos");
|
||||
assertFalse(flashMap.matches(request));
|
||||
|
||||
request.setParameter(parameterName, (String) null);
|
||||
assertFalse(flashMap.matches(request));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isExpired() throws InterruptedException {
|
||||
FlashMap flashMap = new FlashMap();
|
||||
@@ -152,18 +56,18 @@ public class FlashMapTests {
|
||||
FlashMap flashMap2 = new FlashMap();
|
||||
assertEquals(0, flashMap1.compareTo(flashMap2));
|
||||
|
||||
flashMap1.setExpectedRequestUri(null, "/path1");
|
||||
flashMap1.setTargetRequestPath("/path1");
|
||||
assertEquals(-1, flashMap1.compareTo(flashMap2));
|
||||
assertEquals(1, flashMap2.compareTo(flashMap1));
|
||||
|
||||
flashMap2.setExpectedRequestUri(null, "/path2");
|
||||
flashMap2.setTargetRequestPath("/path2");
|
||||
assertEquals(0, flashMap1.compareTo(flashMap2));
|
||||
|
||||
flashMap1.setExpectedRequestParam("id", "1");
|
||||
flashMap1.addTargetRequestParam("id", "1");
|
||||
assertEquals(-1, flashMap1.compareTo(flashMap2));
|
||||
assertEquals(1, flashMap2.compareTo(flashMap1));
|
||||
|
||||
flashMap2.setExpectedRequestParam("id", "2");
|
||||
flashMap2.addTargetRequestParam("id", "2");
|
||||
assertEquals(0, flashMap1.compareTo(flashMap2));
|
||||
}
|
||||
|
||||
|
||||
@@ -16,12 +16,14 @@
|
||||
|
||||
package org.springframework.web.servlet.support;
|
||||
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertSame;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.springframework.web.servlet.FlashMapManager.INPUT_FLASH_MAP_ATTRIBUTE;
|
||||
import static org.springframework.web.servlet.FlashMapManager.OUTPUT_FLASH_MAP_ATTRIBUTE;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@@ -51,55 +53,111 @@ public class DefaultFlashMapManagerTests {
|
||||
|
||||
@Test
|
||||
public void requestStarted() {
|
||||
boolean initialized = this.flashMapManager.requestStarted(this.request);
|
||||
|
||||
assertTrue("Current FlashMap not initialized on first call", initialized);
|
||||
assertNotNull("Current FlashMap not found", RequestContextUtils.getOutputFlashMap(request));
|
||||
this.flashMapManager.requestStarted(this.request);
|
||||
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request);
|
||||
|
||||
initialized = this.flashMapManager.requestStarted(this.request);
|
||||
|
||||
assertFalse("Current FlashMap initialized twice", initialized);
|
||||
assertNotNull("Current FlashMap not found", flashMap);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lookupInputFlashMap() {
|
||||
public void requestStartedAlready() {
|
||||
FlashMap flashMap = new FlashMap();
|
||||
flashMap.put("key", "value");
|
||||
|
||||
List<FlashMap> allMaps = createFlashMapsSessionAttribute();
|
||||
allMaps.add(flashMap);
|
||||
|
||||
this.request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, flashMap);
|
||||
this.flashMapManager.requestStarted(this.request);
|
||||
|
||||
assertEquals(flashMap, request.getAttribute(DefaultFlashMapManager.INPUT_FLASH_MAP_ATTRIBUTE));
|
||||
assertEquals("Input FlashMap should have been removed", 0, allMaps.size());
|
||||
assertSame(flashMap, RequestContextUtils.getOutputFlashMap(request));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lookupInputFlashMapExpectedUrlPath() {
|
||||
FlashMap emptyFlashMap = new FlashMap();
|
||||
|
||||
FlashMap oneFlashMap = new FlashMap();
|
||||
oneFlashMap.setExpectedRequestUri(null, "/one");
|
||||
|
||||
FlashMap secondFlashMap = new FlashMap();
|
||||
secondFlashMap.setExpectedRequestUri(null, "/one/two");
|
||||
public void lookupFlashMapByPath() {
|
||||
FlashMap flashMap = new FlashMap();
|
||||
flashMap.put("key", "value");
|
||||
flashMap.setTargetRequestPath("/path");
|
||||
|
||||
List<FlashMap> allMaps = createFlashMapsSessionAttribute();
|
||||
allMaps.add(emptyFlashMap);
|
||||
allMaps.add(oneFlashMap);
|
||||
allMaps.add(secondFlashMap);
|
||||
Collections.shuffle(allMaps);
|
||||
|
||||
this.request.setRequestURI("/one");
|
||||
List<FlashMap> allMaps = createFlashMaps();
|
||||
allMaps.add(flashMap);
|
||||
|
||||
this.request.setRequestURI("/path");
|
||||
this.flashMapManager.requestStarted(this.request);
|
||||
|
||||
assertEquals(oneFlashMap, request.getAttribute(DefaultFlashMapManager.INPUT_FLASH_MAP_ATTRIBUTE));
|
||||
assertEquals(flashMap, RequestContextUtils.getInputFlashMap(this.request));
|
||||
assertEquals("Input FlashMap should have been removed", 0, getFlashMaps().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lookupFlashMapByPathWithTrailingSlash() {
|
||||
FlashMap flashMap = new FlashMap();
|
||||
flashMap.put("key", "value");
|
||||
flashMap.setTargetRequestPath("/path");
|
||||
|
||||
List<FlashMap> allMaps = createFlashMaps();
|
||||
allMaps.add(flashMap);
|
||||
|
||||
this.request.setRequestURI("/path/");
|
||||
this.flashMapManager.requestStarted(this.request);
|
||||
|
||||
assertEquals(flashMap, RequestContextUtils.getInputFlashMap(this.request));
|
||||
assertEquals("Input FlashMap should have been removed", 0, getFlashMaps().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lookupFlashMapWithParams() {
|
||||
FlashMap flashMap = new FlashMap();
|
||||
flashMap.put("key", "value");
|
||||
flashMap.addTargetRequestParam("number", "one");
|
||||
|
||||
List<FlashMap> allMaps = createFlashMaps();
|
||||
allMaps.add(flashMap);
|
||||
|
||||
this.request.setParameter("number", (String) null);
|
||||
this.flashMapManager.requestStarted(this.request);
|
||||
|
||||
assertNull(RequestContextUtils.getInputFlashMap(this.request));
|
||||
assertEquals("FlashMap should have been removed", 1, getFlashMaps().size());
|
||||
|
||||
clearRequestAttributes();
|
||||
this.request.setParameter("number", "two");
|
||||
this.flashMapManager.requestStarted(this.request);
|
||||
|
||||
assertNull(RequestContextUtils.getInputFlashMap(this.request));
|
||||
assertEquals("FlashMap should have been removed", 1, getFlashMaps().size());
|
||||
|
||||
clearRequestAttributes();
|
||||
this.request.setParameter("number", "one");
|
||||
this.flashMapManager.requestStarted(this.request);
|
||||
|
||||
assertEquals(flashMap, RequestContextUtils.getInputFlashMap(this.request));
|
||||
assertEquals("Input FlashMap should have been removed", 0, getFlashMaps().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lookupFlashMapSortOrder() {
|
||||
FlashMap emptyFlashMap = new FlashMap();
|
||||
|
||||
FlashMap flashMapOne = new FlashMap();
|
||||
flashMapOne.put("key1", "value1");
|
||||
flashMapOne.setTargetRequestPath("/one");
|
||||
|
||||
FlashMap flashMapTwo = new FlashMap();
|
||||
flashMapTwo.put("key1", "value1");
|
||||
flashMapTwo.put("key2", "value2");
|
||||
flashMapTwo.setTargetRequestPath("/one/two");
|
||||
|
||||
List<FlashMap> allMaps = createFlashMaps();
|
||||
allMaps.add(emptyFlashMap);
|
||||
allMaps.add(flashMapOne);
|
||||
allMaps.add(flashMapTwo);
|
||||
Collections.shuffle(allMaps);
|
||||
|
||||
this.request.setRequestURI("/one/two");
|
||||
this.flashMapManager.requestStarted(this.request);
|
||||
|
||||
assertEquals(flashMapTwo, request.getAttribute(INPUT_FLASH_MAP_ATTRIBUTE));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeExpiredFlashMaps() throws InterruptedException {
|
||||
List<FlashMap> allMaps = createFlashMapsSessionAttribute();
|
||||
List<FlashMap> allMaps = createFlashMaps();
|
||||
for (int i=0; i < 5; i++) {
|
||||
FlashMap flashMap = new FlashMap();
|
||||
allMaps.add(flashMap);
|
||||
@@ -114,17 +172,34 @@ public class DefaultFlashMapManagerTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void saveFlashMap() throws InterruptedException {
|
||||
public void saveFlashMapWithoutAttributes() throws InterruptedException {
|
||||
this.flashMapManager.requestStarted(this.request);
|
||||
this.flashMapManager.requestCompleted(this.request);
|
||||
|
||||
assertNull(getFlashMaps());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void saveFlashMapNotCreatedByThisManager() throws InterruptedException {
|
||||
FlashMap flashMap = new FlashMap();
|
||||
this.request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, flashMap);
|
||||
this.flashMapManager.requestCompleted(this.request);
|
||||
|
||||
assertNull(getFlashMaps());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void saveFlashMapWithAttributes() throws InterruptedException {
|
||||
this.flashMapManager.requestStarted(this.request);
|
||||
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(this.request);
|
||||
flashMap.put("name", "value");
|
||||
request.setAttribute(DefaultFlashMapManager.OUTPUT_FLASH_MAP_ATTRIBUTE, flashMap);
|
||||
|
||||
this.flashMapManager.setFlashMapTimeout(0);
|
||||
this.flashMapManager.requestCompleted(this.request);
|
||||
|
||||
Thread.sleep(1);
|
||||
|
||||
List<FlashMap> allMaps = getFlashMapsSessionAttribute();
|
||||
List<FlashMap> allMaps = getFlashMaps();
|
||||
|
||||
assertNotNull(allMaps);
|
||||
assertSame(flashMap, allMaps.get(0));
|
||||
@@ -132,22 +207,68 @@ public class DefaultFlashMapManagerTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void saveFlashMapIsEmpty() throws InterruptedException {
|
||||
request.setAttribute(DefaultFlashMapManager.OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
|
||||
public void decodeTargetPath() throws InterruptedException {
|
||||
this.flashMapManager.requestStarted(this.request);
|
||||
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(this.request);
|
||||
flashMap.put("key", "value");
|
||||
|
||||
flashMap.setTargetRequestPath("/once%20upon%20a%20time");
|
||||
this.flashMapManager.requestCompleted(this.request);
|
||||
|
||||
assertEquals("/once upon a time", flashMap.getTargetRequestPath());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void normalizeTargetPath() throws InterruptedException {
|
||||
this.flashMapManager.requestStarted(this.request);
|
||||
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(this.request);
|
||||
flashMap.put("key", "value");
|
||||
|
||||
flashMap.setTargetRequestPath(".");
|
||||
this.request.setRequestURI("/once/upon/a/time");
|
||||
this.flashMapManager.requestCompleted(this.request);
|
||||
|
||||
assertNull(getFlashMapsSessionAttribute());
|
||||
assertEquals("/once/upon/a", flashMap.getTargetRequestPath());
|
||||
|
||||
flashMap.setTargetRequestPath("./");
|
||||
this.request.setRequestURI("/once/upon/a/time");
|
||||
this.flashMapManager.requestCompleted(this.request);
|
||||
|
||||
assertEquals("/once/upon/a/", flashMap.getTargetRequestPath());
|
||||
|
||||
flashMap.setTargetRequestPath("..");
|
||||
this.request.setRequestURI("/once/upon/a/time");
|
||||
this.flashMapManager.requestCompleted(this.request);
|
||||
|
||||
assertEquals("/once/upon", flashMap.getTargetRequestPath());
|
||||
|
||||
flashMap.setTargetRequestPath("../");
|
||||
this.request.setRequestURI("/once/upon/a/time");
|
||||
this.flashMapManager.requestCompleted(this.request);
|
||||
|
||||
assertEquals("/once/upon/", flashMap.getTargetRequestPath());
|
||||
|
||||
flashMap.setTargetRequestPath("../../only");
|
||||
this.request.setRequestURI("/once/upon/a/time");
|
||||
this.flashMapManager.requestCompleted(this.request);
|
||||
|
||||
assertEquals("/once/only", flashMap.getTargetRequestPath());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private List<FlashMap> getFlashMapsSessionAttribute() {
|
||||
private List<FlashMap> getFlashMaps() {
|
||||
return (List<FlashMap>) this.request.getSession().getAttribute(DefaultFlashMapManager.class + ".FLASH_MAPS");
|
||||
}
|
||||
|
||||
private List<FlashMap> createFlashMapsSessionAttribute() {
|
||||
private List<FlashMap> createFlashMaps() {
|
||||
List<FlashMap> allMaps = new CopyOnWriteArrayList<FlashMap>();
|
||||
this.request.getSession().setAttribute(DefaultFlashMapManager.class + ".FLASH_MAPS", allMaps);
|
||||
return allMaps;
|
||||
}
|
||||
|
||||
private void clearRequestAttributes() {
|
||||
request.removeAttribute(INPUT_FLASH_MAP_ATTRIBUTE);
|
||||
request.removeAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,18 +16,25 @@
|
||||
|
||||
package org.springframework.web.servlet.view;
|
||||
|
||||
import static org.easymock.EasyMock.createMock;
|
||||
import static org.easymock.EasyMock.createNiceMock;
|
||||
import static org.easymock.EasyMock.expect;
|
||||
import static org.easymock.EasyMock.replay;
|
||||
import static org.easymock.EasyMock.verify;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import junit.framework.AssertionFailedError;
|
||||
import static org.easymock.EasyMock.*;
|
||||
import static org.junit.Assert.*;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.springframework.beans.TestBean;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.mock.web.MockHttpServletRequest;
|
||||
@@ -116,13 +123,13 @@ public class RedirectViewTests {
|
||||
FlashMap flashMap = new FlashMap();
|
||||
flashMap.put("successMessage", "yay!");
|
||||
request.setAttribute(FlashMapManager.OUTPUT_FLASH_MAP_ATTRIBUTE, flashMap);
|
||||
rv.render(new ModelMap("id", "1"), request, response);
|
||||
ModelMap model = new ModelMap("id", "1");
|
||||
rv.render(model, request, response);
|
||||
assertEquals(303, response.getStatus());
|
||||
assertEquals("http://url.somewhere.com/path?id=1", response.getHeader("Location"));
|
||||
|
||||
MockHttpServletRequest nextRequest = new MockHttpServletRequest("GET", "/path");
|
||||
nextRequest.addParameter("id", "1");
|
||||
assertTrue(flashMap.matches(nextRequest));
|
||||
assertEquals("/path", flashMap.getTargetRequestPath());
|
||||
assertEquals(model, flashMap.getTargetRequestParams());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -94,4 +94,14 @@ public class RedirectViewUriTemplateTests {
|
||||
assertEquals(url + "/value1/v1/value2?key3=value3", response.getRedirectedUrl());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void emptyRedirectString() throws Exception {
|
||||
Map<String, Object> model = new HashMap<String, Object>();
|
||||
|
||||
RedirectView redirectView = new RedirectView("");
|
||||
redirectView.renderMergedOutputModel(model, request, response);
|
||||
|
||||
assertEquals("", response.getRedirectedUrl());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user