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