@ -16,12 +16,14 @@
@@ -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 {
@@ -51,55 +53,111 @@ public class DefaultFlashMapManagerTests {
@Test
public void requestStarted ( ) {
boolean initialized = this . flashMapManager . requestStarted ( this . request ) ;
this . flashMapManager . requestStarted ( this . request ) ;
FlashMap flashMap = RequestContextUtils . getOutputFlashMap ( request ) ;
assertNotNull ( "Current FlashMap not found" , flashMap ) ;
}
assertTrue ( "Current FlashMap not initialized on first call" , initialized ) ;
assertNotNull ( "Current FlashMap not found" , RequestContextUtils . getOutputFlashMap ( request ) ) ;
@Test
public void requestStartedAlready ( ) {
FlashMap flashMap = new FlashMap ( ) ;
this . request . setAttribute ( OUTPUT_FLASH_MAP_ATTRIBUTE , flashMap ) ;
this . flashMapManager . requestStarted ( this . request ) ;
initialized = this . flashMapManager . requestStarted ( this . request ) ;
assertSame ( flashMap , RequestContextUtils . getOutputFlashMap ( request ) ) ;
}
@Test
public void lookupFlashMapByPath ( ) {
FlashMap flashMap = new FlashMap ( ) ;
flashMap . put ( "key" , "value" ) ;
flashMap . setTargetRequestPath ( "/path" ) ;
assertFalse ( "Current FlashMap initialized twice" , initialized ) ;
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 lookupInputFlashMap ( ) {
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 ( ) ) ;
}
List < FlashMap > allMaps = createFlashMapsSessionAttribute ( ) ;
@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 ) ;
assertEquals ( flashMap , request . getAttribute ( DefaultFlashMapManager . INPUT_FLASH_MAP_ATTRIBUTE ) ) ;
assertEquals ( "Input FlashMap should have been removed" , 0 , allMaps . size ( ) ) ;
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 lookupInputFlashMapExpectedUrlPath ( ) {
public void lookupFlashMapSortOrder ( ) {
FlashMap emptyFlashMap = new FlashMap ( ) ;
FlashMap oneFlashMap = new FlashMap ( ) ;
oneFlashMap . setExpectedRequestUri ( null , "/one" ) ;
FlashMap flashMapOne = new FlashMap ( ) ;
flashMapOne . put ( "key1" , "value1" ) ;
flashMapOne . setTargetRequestPath ( "/one" ) ;
FlashMap secondFlashMap = new FlashMap ( ) ;
secondFlashMap . setExpectedRequestUri ( null , "/one/two" ) ;
FlashMap flashMapTwo = new FlashMap ( ) ;
flashMapTwo . put ( "key1" , "value1" ) ;
flashMapTwo . put ( "key2" , "value2" ) ;
flashMapTwo . setTargetRequestPath ( "/one/two" ) ;
List < FlashMap > allMaps = createFlashMapsSessionAttribute ( ) ;
List < FlashMap > allMaps = createFlashMaps ( ) ;
allMaps . add ( emptyFlashMap ) ;
allMaps . add ( oneFlashMap ) ;
allMaps . add ( secondFlashMap ) ;
allMaps . add ( flashMapOne ) ;
allMaps . add ( flashMapTwo ) ;
Collections . shuffle ( allMaps ) ;
this . request . setRequestURI ( "/one" ) ;
this . request . setRequestURI ( "/one/two " ) ;
this . flashMapManager . requestStarted ( this . request ) ;
assertEquals ( oneFlashMap , request . getAttribute ( DefaultFlashMapManager . INPUT_FLASH_MAP_ATTRIBUTE ) ) ;
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 {
@@ -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 {
@@ -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 ) ;
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 ) ;
assertNull ( getFlashMapsSessionAttribute ( ) ) ;
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 ) ;
}
}