|
30 | 30 | import io.grpc.stub.ServerCallStreamObserver; |
31 | 31 | import io.grpc.stub.StreamObserver; |
32 | 32 | import java.util.ArrayList; |
| 33 | +import java.util.Arrays; |
33 | 34 | import java.util.Collections; |
34 | 35 | import java.util.HashMap; |
35 | 36 | import java.util.List; |
36 | 37 | import java.util.concurrent.CompletableFuture; |
| 38 | +import java.util.stream.Collectors; |
| 39 | +import org.apache.rocketmq.client.consumer.AckResult; |
37 | 40 | import org.apache.rocketmq.client.consumer.PopResult; |
38 | 41 | import org.apache.rocketmq.client.consumer.PopStatus; |
39 | 42 | import org.apache.rocketmq.common.MixAll; |
40 | 43 | import org.apache.rocketmq.common.constant.PermName; |
| 44 | +import org.apache.rocketmq.common.consumer.ReceiptHandle; |
| 45 | +import org.apache.rocketmq.common.message.MessageAccessor; |
| 46 | +import org.apache.rocketmq.common.message.MessageConst; |
| 47 | +import org.apache.rocketmq.common.message.MessageExt; |
41 | 48 | import org.apache.rocketmq.proxy.common.ProxyContext; |
42 | 49 | import org.apache.rocketmq.proxy.config.ConfigurationManager; |
43 | 50 | import org.apache.rocketmq.proxy.grpc.v2.BaseActivityTest; |
|
61 | 68 | import static org.mockito.Mockito.doNothing; |
62 | 69 | import static org.mockito.Mockito.mock; |
63 | 70 | import static org.mockito.Mockito.when; |
| 71 | +import static org.mockito.Mockito.times; |
| 72 | +import static org.mockito.Mockito.verify; |
64 | 73 |
|
65 | 74 | public class ReceiveMessageActivityTest extends BaseActivityTest { |
66 | 75 |
|
@@ -223,6 +232,87 @@ public void testReceiveMessageIllegalInvisibleTimeTooLarge() { |
223 | 232 | assertEquals(Code.ILLEGAL_INVISIBLE_TIME, getResponseCodeFromReceiveMessageResponseList(responseArgumentCaptor.getAllValues())); |
224 | 233 | } |
225 | 234 |
|
| 235 | + @Test |
| 236 | + public void testReceiveMessageAddReceiptHandle() { |
| 237 | + ConfigurationManager.getProxyConfig().setEnableProxyAutoRenew(true); |
| 238 | + StreamObserver<ReceiveMessageResponse> receiveStreamObserver = mock(ServerCallStreamObserver.class); |
| 239 | + doNothing().when(receiveStreamObserver).onNext(any()); |
| 240 | + when(this.grpcClientSettingsManager.getClientSettings(any())).thenReturn(Settings.newBuilder().getDefaultInstanceForType()); |
| 241 | + |
| 242 | + MessageExt messageExt1 = new MessageExt(); |
| 243 | + String msgId1 = "msgId1"; |
| 244 | + String popCk1 = "0 0 60000 0 0 broker 0 0 0"; |
| 245 | + messageExt1.setTopic(TOPIC); |
| 246 | + messageExt1.setMsgId(msgId1); |
| 247 | + MessageAccessor.putProperty(messageExt1, MessageConst.PROPERTY_POP_CK, popCk1); |
| 248 | + messageExt1.setBody("body1".getBytes()); |
| 249 | + MessageExt messageExt2 = new MessageExt(); |
| 250 | + String msgId2 = "msgId2"; |
| 251 | + String popCk2 = "0 0 60000 0 0 broker 0 1 1000"; |
| 252 | + messageExt2.setTopic(TOPIC); |
| 253 | + messageExt2.setMsgId(msgId2); |
| 254 | + MessageAccessor.putProperty(messageExt2, MessageConst.PROPERTY_POP_CK, popCk2); |
| 255 | + messageExt2.setBody("body2".getBytes()); |
| 256 | + PopResult popResult = new PopResult(PopStatus.FOUND, Arrays.asList(messageExt1, messageExt2)); |
| 257 | + when(this.messagingProcessor.popMessage( |
| 258 | + any(), |
| 259 | + any(), |
| 260 | + anyString(), |
| 261 | + anyString(), |
| 262 | + anyInt(), |
| 263 | + anyLong(), |
| 264 | + anyLong(), |
| 265 | + anyInt(), |
| 266 | + any(), |
| 267 | + anyBoolean(), |
| 268 | + any(), |
| 269 | + isNull(), |
| 270 | + anyLong())).thenReturn(CompletableFuture.completedFuture(popResult)); |
| 271 | + ArgumentCaptor<String> msgIdCaptor = ArgumentCaptor.forClass(String.class); |
| 272 | + ArgumentCaptor<ReceiptHandle> receiptHandleCaptor = ArgumentCaptor.forClass(ReceiptHandle.class); |
| 273 | + when(this.messagingProcessor.changeInvisibleTime( |
| 274 | + any(), |
| 275 | + receiptHandleCaptor.capture(), |
| 276 | + msgIdCaptor.capture(), |
| 277 | + anyString(), |
| 278 | + anyString(), |
| 279 | + anyLong())).thenReturn(CompletableFuture.completedFuture(new AckResult())); |
| 280 | + |
| 281 | + // normal |
| 282 | + ProxyContext ctx = createContext(); |
| 283 | + this.grpcChannelManager.createChannel(ctx, ctx.getClientID()); |
| 284 | + ReceiveMessageRequest receiveMessageRequest = ReceiveMessageRequest.newBuilder() |
| 285 | + .setGroup(Resource.newBuilder().setName(CONSUMER_GROUP).build()) |
| 286 | + .setMessageQueue(MessageQueue.newBuilder().setTopic(Resource.newBuilder().setName(TOPIC).build()).build()) |
| 287 | + .setAutoRenew(true) |
| 288 | + .setFilterExpression(FilterExpression.newBuilder() |
| 289 | + .setType(FilterType.TAG) |
| 290 | + .setExpression("*") |
| 291 | + .build()) |
| 292 | + .build(); |
| 293 | + this.receiveMessageActivity.receiveMessage(ctx, receiveMessageRequest, receiveStreamObserver); |
| 294 | + verify(this.messagingProcessor, times(0)).changeInvisibleTime( |
| 295 | + any(), |
| 296 | + any(), |
| 297 | + anyString(), |
| 298 | + anyString(), |
| 299 | + anyString(), |
| 300 | + anyLong()); |
| 301 | + |
| 302 | + // abnormal |
| 303 | + this.grpcChannelManager.removeChannel(ctx.getClientID()); |
| 304 | + this.receiveMessageActivity.receiveMessage(ctx, receiveMessageRequest, receiveStreamObserver); |
| 305 | + verify(this.messagingProcessor, times(2)).changeInvisibleTime( |
| 306 | + any(), |
| 307 | + any(), |
| 308 | + anyString(), |
| 309 | + anyString(), |
| 310 | + anyString(), |
| 311 | + anyLong()); |
| 312 | + assertEquals(Arrays.asList(msgId1, msgId2), msgIdCaptor.getAllValues()); |
| 313 | + assertEquals(Arrays.asList(popCk1, popCk2), receiptHandleCaptor.getAllValues().stream().map(ReceiptHandle::encode).collect(Collectors.toList())); |
| 314 | + } |
| 315 | + |
226 | 316 | @Test |
227 | 317 | public void testReceiveMessage() { |
228 | 318 | StreamObserver<ReceiveMessageResponse> receiveStreamObserver = mock(ServerCallStreamObserver.class); |
|
0 commit comments