15
15
*/
16
16
package org .springframework .security .web .server .header ;
17
17
18
- import static org .mockito .Mockito .verify ;
19
- import static org .mockito .Mockito .when ;
20
-
21
- import java .util .Arrays ;
22
-
23
18
import org .junit .Before ;
24
19
import org .junit .Test ;
25
20
import org .junit .runner .RunWith ;
28
23
import org .springframework .mock .http .server .reactive .MockServerHttpRequest ;
29
24
import org .springframework .mock .web .server .MockServerWebExchange ;
30
25
import org .springframework .web .server .ServerWebExchange ;
31
-
32
26
import reactor .core .publisher .Mono ;
33
27
import reactor .test .StepVerifier ;
34
28
29
+ import java .time .Duration ;
30
+ import java .util .Arrays ;
31
+ import java .util .concurrent .CountDownLatch ;
32
+ import java .util .concurrent .TimeUnit ;
33
+ import java .util .concurrent .atomic .AtomicBoolean ;
34
+
35
+ import static org .assertj .core .api .Assertions .assertThat ;
36
+ import static org .mockito .Mockito .verify ;
37
+ import static org .mockito .Mockito .when ;
38
+
35
39
/**
36
40
*
37
41
* @author Rob Winch
@@ -55,7 +59,6 @@ public void setup() {
55
59
@ Test
56
60
public void writeHttpHeadersWhenErrorNoErrorThenError () {
57
61
when (writer1 .writeHttpHeaders (exchange )).thenReturn (Mono .error (new RuntimeException ()));
58
- when (writer2 .writeHttpHeaders (exchange )).thenReturn (Mono .empty ());
59
62
60
63
Mono <Void > result = writer .writeHttpHeaders (exchange );
61
64
@@ -64,13 +67,11 @@ public void writeHttpHeadersWhenErrorNoErrorThenError() {
64
67
.verify ();
65
68
66
69
verify (writer1 ).writeHttpHeaders (exchange );
67
- verify (writer2 ).writeHttpHeaders (exchange );
68
70
}
69
71
70
72
@ Test
71
73
public void writeHttpHeadersWhenErrorErrorThenError () {
72
74
when (writer1 .writeHttpHeaders (exchange )).thenReturn (Mono .error (new RuntimeException ()));
73
- when (writer2 .writeHttpHeaders (exchange )).thenReturn (Mono .error (new RuntimeException ()));
74
75
75
76
Mono <Void > result = writer .writeHttpHeaders (exchange );
76
77
@@ -79,7 +80,6 @@ public void writeHttpHeadersWhenErrorErrorThenError() {
79
80
.verify ();
80
81
81
82
verify (writer1 ).writeHttpHeaders (exchange );
82
- verify (writer2 ).writeHttpHeaders (exchange );
83
83
}
84
84
85
85
@ Test
@@ -96,4 +96,26 @@ public void writeHttpHeadersWhenNoErrorThenNoError() {
96
96
verify (writer1 ).writeHttpHeaders (exchange );
97
97
verify (writer2 ).writeHttpHeaders (exchange );
98
98
}
99
+
100
+ @ Test
101
+ public void writeHttpHeadersSequential () throws Exception {
102
+ AtomicBoolean slowDone = new AtomicBoolean ();
103
+ CountDownLatch latch = new CountDownLatch (1 );
104
+ ServerHttpHeadersWriter slow = exchange ->
105
+ Mono .delay (Duration .ofMillis (100 ))
106
+ .doOnSuccess (__ -> slowDone .set (true ))
107
+ .then ();
108
+ ServerHttpHeadersWriter second = exchange ->
109
+ Mono .fromRunnable (() -> {
110
+ latch .countDown ();
111
+ assertThat (slowDone .get ())
112
+ .describedAs ("ServerLogoutHandler should be executed sequentially" )
113
+ .isTrue ();
114
+ });
115
+ CompositeServerHttpHeadersWriter writer = new CompositeServerHttpHeadersWriter (slow , second );
116
+
117
+ writer .writeHttpHeaders (this .exchange ).block ();
118
+
119
+ assertThat (latch .await (3 , TimeUnit .SECONDS )).isTrue ();
120
+ }
99
121
}
0 commit comments