@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2024 the original author or authors .
* Copyright 2002 - 2025 the original author or authors .
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
@ -19,7 +19,6 @@ package org.springframework.web.server.session;
@@ -19,7 +19,6 @@ package org.springframework.web.server.session;
import java.time.Clock ;
import java.time.Duration ;
import java.time.Instant ;
import java.util.Map ;
import java.util.stream.IntStream ;
import org.junit.jupiter.api.Test ;
@ -35,10 +34,11 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
@@ -35,10 +34,11 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
* Tests for { @link InMemoryWebSessionStore } .
*
* @author Rob Winch
* @author Sam Brannen
* /
class InMemoryWebSessionStoreTests {
private InMemoryWebSessionStore store = new InMemoryWebSessionStore ( ) ;
private final InMemoryWebSessionStore store = new InMemoryWebSessionStore ( ) ;
@Test
@ -59,7 +59,7 @@ class InMemoryWebSessionStoreTests {
@@ -59,7 +59,7 @@ class InMemoryWebSessionStoreTests {
}
@Test // gh-24027, gh-26958
public void createSessionDoesNotBlock ( ) {
void createSessionDoesNotBlock ( ) {
this . store . createWebSession ( )
. doOnNext ( session - > assertThat ( Schedulers . isInNonBlockingThread ( ) ) . isTrue ( ) )
. block ( ) ;
@ -103,7 +103,7 @@ class InMemoryWebSessionStoreTests {
@@ -103,7 +103,7 @@ class InMemoryWebSessionStoreTests {
}
@Test // SPR-17051
public void sessionInvalidatedBeforeSave ( ) {
void sessionInvalidatedBeforeSave ( ) {
// Request 1 creates session
WebSession session1 = this . store . createWebSession ( ) . block ( ) ;
assertThat ( session1 ) . isNotNull ( ) ;
@ -132,33 +132,31 @@ class InMemoryWebSessionStoreTests {
@@ -132,33 +132,31 @@ class InMemoryWebSessionStoreTests {
@Test
void expirationCheckPeriod ( ) {
DirectFieldAccessor accessor = new DirectFieldAccessor ( this . store ) ;
Map < ? , ? > sessions = ( Map < ? , ? > ) accessor . getPropertyValue ( "sessions" ) ;
assertThat ( sessions ) . isNotNull ( ) ;
// Create 100 sessions
IntStream . range ( 0 , 100 ) . forEach ( i - > insertSession ( ) ) ;
assertThat ( sessions ) . hasSize ( 100 ) ;
IntStream . rangeClosed ( 1 , 100 ) . forEach ( i - > insertSession ( ) ) ;
assertNumSessions ( 100 ) ;
// Force a new clock (31 min later), don't use setter which would clean expired sessions
// Force a new clock (31 min later). Don't use setter which would clean expired sessions.
DirectFieldAccessor accessor = new DirectFieldAccessor ( this . store ) ;
accessor . setPropertyValue ( "clock" , Clock . offset ( this . store . getClock ( ) , Duration . ofMinutes ( 31 ) ) ) ;
assertThat ( sessions ) . hasSize ( 100 ) ;
assertNumSessions ( 100 ) ;
// Create 1 more which forces a time-based check (clock moved forward)
// Create 1 more which forces a time-based check (clock moved forward).
insertSession ( ) ;
assertThat ( sessions ) . hasSize ( 1 ) ;
assertNumSessions ( 1 ) ;
}
@Test
void maxSessions ( ) {
this . store . setMaxSessions ( 10 ) ;
IntStream . range ( 0 , 1000 0) . forEach ( i - > insertSession ( ) ) ;
assertThatIllegalStateException ( ) . isThrownBy (
this : : insertSession )
. withMessage ( "Max sessions limit reached: 1000 0" ) ;
IntStream . rangeClosed ( 1 , 1 0 ) . forEach ( i - > insertSession ( ) ) ;
assertThatIllegalStateException ( )
. isThrownBy ( this : : insertSession )
. withMessage ( "Max sessions limit reached: 10" ) ;
}
private WebSession insertSession ( ) {
WebSession session = this . store . createWebSession ( ) . block ( ) ;
assertThat ( session ) . isNotNull ( ) ;
@ -167,4 +165,8 @@ class InMemoryWebSessionStoreTests {
@@ -167,4 +165,8 @@ class InMemoryWebSessionStoreTests {
return session ;
}
private void assertNumSessions ( int numSessions ) {
assertThat ( store . getSessions ( ) ) . hasSize ( numSessions ) ;
}
}