16
16
17
17
package io .rsocket .internal ;
18
18
19
+ import static org .assertj .core .api .Assertions .assertThat ;
19
20
import static org .junit .Assert .assertEquals ;
20
21
21
22
import io .netty .buffer .ByteBuf ;
22
23
import io .netty .buffer .ByteBufAllocator ;
23
24
import io .netty .buffer .Unpooled ;
24
25
import io .rsocket .buffer .LeaksTrackingByteBufAllocator ;
25
- import io .rsocket .frame .*;
26
+ import io .rsocket .frame .ErrorFrameCodec ;
27
+ import io .rsocket .frame .KeepAliveFrameCodec ;
28
+ import io .rsocket .frame .LeaseFrameCodec ;
29
+ import io .rsocket .frame .MetadataPushFrameCodec ;
30
+ import io .rsocket .frame .ResumeFrameCodec ;
31
+ import io .rsocket .frame .ResumeOkFrameCodec ;
32
+ import io .rsocket .frame .SetupFrameCodec ;
26
33
import io .rsocket .plugins .InitializingInterceptorRegistry ;
27
34
import io .rsocket .test .util .TestDuplexConnection ;
28
35
import io .rsocket .util .DefaultPayload ;
29
36
import java .util .concurrent .atomic .AtomicInteger ;
37
+ import java .util .concurrent .atomic .AtomicReference ;
30
38
import org .junit .Before ;
31
39
import org .junit .Test ;
32
40
@@ -68,44 +76,44 @@ public void clientSplits() {
68
76
.doOnNext (f -> setupFrames .incrementAndGet ())
69
77
.subscribe ();
70
78
79
+ source .addToReceivedBuffer (setupFrame ().retain ());
80
+ assertEquals (0 , clientFrames .get ());
81
+ assertEquals (0 , serverFrames .get ());
82
+ assertEquals (1 , setupFrames .get ());
83
+
71
84
source .addToReceivedBuffer (errorFrame (1 ).retain ());
72
85
assertEquals (1 , clientFrames .get ());
73
86
assertEquals (0 , serverFrames .get ());
74
- assertEquals (0 , setupFrames .get ());
87
+ assertEquals (1 , setupFrames .get ());
75
88
76
89
source .addToReceivedBuffer (errorFrame (1 ).retain ());
77
90
assertEquals (2 , clientFrames .get ());
78
91
assertEquals (0 , serverFrames .get ());
79
- assertEquals (0 , setupFrames .get ());
92
+ assertEquals (1 , setupFrames .get ());
80
93
81
94
source .addToReceivedBuffer (leaseFrame ().retain ());
82
95
assertEquals (3 , clientFrames .get ());
83
96
assertEquals (0 , serverFrames .get ());
84
- assertEquals (0 , setupFrames .get ());
97
+ assertEquals (1 , setupFrames .get ());
85
98
86
99
source .addToReceivedBuffer (keepAliveFrame ().retain ());
87
100
assertEquals (4 , clientFrames .get ());
88
101
assertEquals (0 , serverFrames .get ());
89
- assertEquals (0 , setupFrames .get ());
102
+ assertEquals (1 , setupFrames .get ());
90
103
91
104
source .addToReceivedBuffer (errorFrame (2 ).retain ());
92
105
assertEquals (4 , clientFrames .get ());
93
106
assertEquals (1 , serverFrames .get ());
94
- assertEquals (0 , setupFrames .get ());
107
+ assertEquals (1 , setupFrames .get ());
95
108
96
109
source .addToReceivedBuffer (errorFrame (0 ).retain ());
97
110
assertEquals (5 , clientFrames .get ());
98
111
assertEquals (1 , serverFrames .get ());
99
- assertEquals (0 , setupFrames .get ());
112
+ assertEquals (1 , setupFrames .get ());
100
113
101
114
source .addToReceivedBuffer (metadataPushFrame ().retain ());
102
115
assertEquals (5 , clientFrames .get ());
103
116
assertEquals (2 , serverFrames .get ());
104
- assertEquals (0 , setupFrames .get ());
105
-
106
- source .addToReceivedBuffer (setupFrame ().retain ());
107
- assertEquals (5 , clientFrames .get ());
108
- assertEquals (2 , serverFrames .get ());
109
117
assertEquals (1 , setupFrames .get ());
110
118
111
119
source .addToReceivedBuffer (resumeFrame ().retain ());
@@ -141,44 +149,44 @@ public void serverSplits() {
141
149
.doOnNext (f -> setupFrames .incrementAndGet ())
142
150
.subscribe ();
143
151
152
+ source .addToReceivedBuffer (setupFrame ().retain ());
153
+ assertEquals (0 , clientFrames .get ());
154
+ assertEquals (0 , serverFrames .get ());
155
+ assertEquals (1 , setupFrames .get ());
156
+
144
157
source .addToReceivedBuffer (errorFrame (1 ).retain ());
145
158
assertEquals (1 , clientFrames .get ());
146
159
assertEquals (0 , serverFrames .get ());
147
- assertEquals (0 , setupFrames .get ());
160
+ assertEquals (1 , setupFrames .get ());
148
161
149
162
source .addToReceivedBuffer (errorFrame (1 ).retain ());
150
163
assertEquals (2 , clientFrames .get ());
151
164
assertEquals (0 , serverFrames .get ());
152
- assertEquals (0 , setupFrames .get ());
165
+ assertEquals (1 , setupFrames .get ());
153
166
154
167
source .addToReceivedBuffer (leaseFrame ().retain ());
155
168
assertEquals (2 , clientFrames .get ());
156
169
assertEquals (1 , serverFrames .get ());
157
- assertEquals (0 , setupFrames .get ());
170
+ assertEquals (1 , setupFrames .get ());
158
171
159
172
source .addToReceivedBuffer (keepAliveFrame ().retain ());
160
173
assertEquals (2 , clientFrames .get ());
161
174
assertEquals (2 , serverFrames .get ());
162
- assertEquals (0 , setupFrames .get ());
175
+ assertEquals (1 , setupFrames .get ());
163
176
164
177
source .addToReceivedBuffer (errorFrame (2 ).retain ());
165
178
assertEquals (2 , clientFrames .get ());
166
179
assertEquals (3 , serverFrames .get ());
167
- assertEquals (0 , setupFrames .get ());
180
+ assertEquals (1 , setupFrames .get ());
168
181
169
182
source .addToReceivedBuffer (errorFrame (0 ).retain ());
170
183
assertEquals (2 , clientFrames .get ());
171
184
assertEquals (4 , serverFrames .get ());
172
- assertEquals (0 , setupFrames .get ());
185
+ assertEquals (1 , setupFrames .get ());
173
186
174
187
source .addToReceivedBuffer (metadataPushFrame ().retain ());
175
188
assertEquals (3 , clientFrames .get ());
176
189
assertEquals (4 , serverFrames .get ());
177
- assertEquals (0 , setupFrames .get ());
178
-
179
- source .addToReceivedBuffer (setupFrame ().retain ());
180
- assertEquals (3 , clientFrames .get ());
181
- assertEquals (4 , serverFrames .get ());
182
190
assertEquals (1 , setupFrames .get ());
183
191
184
192
source .addToReceivedBuffer (resumeFrame ().retain ());
@@ -192,6 +200,43 @@ public void serverSplits() {
192
200
assertEquals (3 , setupFrames .get ());
193
201
}
194
202
203
+ @ Test
204
+ public void unexpectedFramesBeforeSetupFrame () {
205
+ AtomicInteger clientFrames = new AtomicInteger ();
206
+ AtomicInteger serverFrames = new AtomicInteger ();
207
+ AtomicInteger setupFrames = new AtomicInteger ();
208
+
209
+ AtomicReference <Throwable > clientError = new AtomicReference <>();
210
+ AtomicReference <Throwable > serverError = new AtomicReference <>();
211
+ AtomicReference <Throwable > setupError = new AtomicReference <>();
212
+
213
+ serverMultiplexer
214
+ .asClientConnection ()
215
+ .receive ()
216
+ .subscribe (bb -> clientFrames .incrementAndGet (), clientError ::set );
217
+ serverMultiplexer
218
+ .asServerConnection ()
219
+ .receive ()
220
+ .subscribe (bb -> serverFrames .incrementAndGet (), serverError ::set );
221
+ serverMultiplexer
222
+ .asSetupConnection ()
223
+ .receive ()
224
+ .subscribe (bb -> setupFrames .incrementAndGet (), setupError ::set );
225
+
226
+ source .addToReceivedBuffer (keepAliveFrame ().retain ());
227
+
228
+ assertThat (clientError .get ().getMessage ())
229
+ .isEqualTo ("SETUP or LEASE frame must be received before any others." );
230
+ assertThat (serverError .get ().getMessage ())
231
+ .isEqualTo ("SETUP or LEASE frame must be received before any others." );
232
+ assertThat (setupError .get ().getMessage ())
233
+ .isEqualTo ("SETUP or LEASE frame must be received before any others." );
234
+
235
+ assertEquals (0 , clientFrames .get ());
236
+ assertEquals (0 , serverFrames .get ());
237
+ assertEquals (0 , setupFrames .get ());
238
+ }
239
+
195
240
private ByteBuf resumeFrame () {
196
241
return ResumeFrameCodec .encode (allocator , Unpooled .EMPTY_BUFFER , 0 , 0 );
197
242
}
0 commit comments