6
6
import io .rsocket .transport .ClientTransport ;
7
7
import io .rsocket .util .EmptyPayload ;
8
8
import io .rsocket .util .RSocketProxy ;
9
- import java .time .Duration ;
10
- import java .util .Arrays ;
11
- import java .util .Collections ;
12
- import java .util .List ;
13
- import java .util .concurrent .atomic .AtomicInteger ;
14
9
import org .assertj .core .api .Assertions ;
10
+ import org .junit .jupiter .api .AfterAll ;
11
+ import org .junit .jupiter .api .BeforeEach ;
15
12
import org .junit .jupiter .api .Test ;
16
13
import org .mockito .Mockito ;
17
14
import org .reactivestreams .Publisher ;
24
21
import reactor .test .util .RaceTestUtils ;
25
22
import reactor .util .context .Context ;
26
23
24
+ import java .time .Duration ;
25
+ import java .util .Arrays ;
26
+ import java .util .Collections ;
27
+ import java .util .List ;
28
+ import java .util .concurrent .atomic .AtomicInteger ;
29
+
27
30
public class LoadbalanceTest {
28
31
29
- @ Test
30
- public void shouldDeliverAllTheRequestsWithRoundRobinStrategy () {
32
+ @ BeforeEach
33
+ void setUp () {
31
34
Hooks .onErrorDropped ((__ ) -> {});
35
+ }
36
+
37
+ @ AfterAll
38
+ static void afterAll () {
39
+ Hooks .resetOnErrorDropped ();
40
+ }
32
41
42
+ @ Test
43
+ public void shouldDeliverAllTheRequestsWithRoundRobinStrategy () throws Exception {
33
44
final AtomicInteger counter = new AtomicInteger ();
34
45
final ClientTransport mockTransport = Mockito .mock (ClientTransport .class );
35
46
final RSocketConnector rSocketConnectorMock = Mockito .mock (RSocketConnector .class );
@@ -76,21 +87,28 @@ public Mono<Void> fireAndForget(Payload payload) {
76
87
});
77
88
78
89
Assertions .assertThat (counter .get ()).isEqualTo (1000 );
79
-
80
90
counter .set (0 );
81
91
}
82
92
}
83
93
84
94
@ Test
85
- public void shouldDeliverAllTheRequestsWithWightedStrategy () {
86
- Hooks .onErrorDropped ((__ ) -> {});
87
-
95
+ public void shouldDeliverAllTheRequestsWithWeightedStrategy () throws InterruptedException {
88
96
final AtomicInteger counter = new AtomicInteger ();
89
- final ClientTransport mockTransport = Mockito .mock (ClientTransport .class );
90
- final RSocketConnector rSocketConnectorMock = Mockito .mock (RSocketConnector .class );
91
97
92
- Mockito .when (rSocketConnectorMock .connect (Mockito .any (ClientTransport .class )))
93
- .then (im -> Mono .just (new TestRSocket (new WeightedRSocket (counter ))));
98
+ final ClientTransport mockTransport1 = Mockito .mock (ClientTransport .class );
99
+ final ClientTransport mockTransport2 = Mockito .mock (ClientTransport .class );
100
+
101
+ final LoadbalanceTarget target1 = LoadbalanceTarget .from ("1" , mockTransport1 );
102
+ final LoadbalanceTarget target2 = LoadbalanceTarget .from ("2" , mockTransport2 );
103
+
104
+ final WeightedRSocket weightedRSocket1 = new WeightedRSocket (counter );
105
+ final WeightedRSocket weightedRSocket2 = new WeightedRSocket (counter );
106
+
107
+ final RSocketConnector rSocketConnectorMock = Mockito .mock (RSocketConnector .class );
108
+ Mockito .when (rSocketConnectorMock .connect (mockTransport1 ))
109
+ .then (im -> Mono .just (new TestRSocket (weightedRSocket1 )));
110
+ Mockito .when (rSocketConnectorMock .connect (mockTransport2 ))
111
+ .then (im -> Mono .just (new TestRSocket (weightedRSocket2 )));
94
112
95
113
for (int i = 0 ; i < 1000 ; i ++) {
96
114
final TestPublisher <List <LoadbalanceTarget >> source = TestPublisher .create ();
@@ -99,42 +117,39 @@ public void shouldDeliverAllTheRequestsWithWightedStrategy() {
99
117
rSocketConnectorMock ,
100
118
source ,
101
119
WeightedLoadbalanceStrategy .builder ()
102
- .weightedStatsResolver (r -> (WeightedStats ) r )
120
+ .weightedStatsResolver (
121
+ rsocket ->
122
+ ((PooledRSocket ) rsocket ).target () == target1
123
+ ? weightedRSocket1
124
+ : weightedRSocket2 )
103
125
.build ());
104
126
105
127
RaceTestUtils .race (
106
128
() -> {
107
129
for (int j = 0 ; j < 1000 ; j ++) {
108
130
Mono .defer (() -> rSocketPool .select ().fireAndForget (EmptyPayload .INSTANCE ))
109
131
.retry ()
110
- .subscribe ();
132
+ .subscribe (aVoid -> {}, Throwable :: printStackTrace );
111
133
}
112
134
},
113
135
() -> {
114
136
for (int j = 0 ; j < 100 ; j ++) {
115
137
source .next (Collections .emptyList ());
116
- source .next (Collections .singletonList (LoadbalanceTarget .from ("1" , mockTransport )));
117
- source .next (
118
- Arrays .asList (
119
- LoadbalanceTarget .from ("1" , mockTransport ),
120
- LoadbalanceTarget .from ("2" , mockTransport )));
121
- source .next (Collections .singletonList (LoadbalanceTarget .from ("1" , mockTransport )));
122
- source .next (Collections .singletonList (LoadbalanceTarget .from ("2" , mockTransport )));
138
+ source .next (Collections .singletonList (target1 ));
139
+ source .next (Arrays .asList (target1 , target2 )).next (Collections .singletonList (target1 ));
140
+ source .next (Collections .singletonList (target2 ));
123
141
source .next (Collections .emptyList ());
124
- source .next (Collections .singletonList (LoadbalanceTarget . from ( "2" , mockTransport ) ));
142
+ source .next (Collections .singletonList (target2 ));
125
143
}
126
144
});
127
145
128
146
Assertions .assertThat (counter .get ()).isEqualTo (1000 );
129
-
130
147
counter .set (0 );
131
148
}
132
149
}
133
150
134
151
@ Test
135
152
public void ensureRSocketIsCleanedFromThePoolIfSourceRSocketIsDisposed () {
136
- Hooks .onErrorDropped ((__ ) -> {});
137
-
138
153
final AtomicInteger counter = new AtomicInteger ();
139
154
final ClientTransport mockTransport = Mockito .mock (ClientTransport .class );
140
155
final RSocketConnector rSocketConnectorMock = Mockito .mock (RSocketConnector .class );
@@ -179,8 +194,6 @@ public Mono<Void> fireAndForget(Payload payload) {
179
194
180
195
@ Test
181
196
public void ensureContextIsPropagatedCorrectlyForRequestChannel () {
182
- Hooks .onErrorDropped ((__ ) -> {});
183
-
184
197
final AtomicInteger counter = new AtomicInteger ();
185
198
final ClientTransport mockTransport = Mockito .mock (ClientTransport .class );
186
199
final RSocketConnector rSocketConnectorMock = Mockito .mock (RSocketConnector .class );
0 commit comments