1 package com.atlassian.messagequeue.internal.core;
2
3 import cloud.atlassian.external.container.DefaultProductContainerProxy;
4 import com.atlassian.messagequeue.registry.MessageContext;
5 import com.atlassian.messagequeue.registry.MessageRunner;
6 import com.atlassian.tenant.impl.TenantIdSetter;
7 import com.timgroup.statsd.StatsDClient;
8 import org.junit.After;
9 import org.junit.Before;
10 import org.junit.Test;
11 import org.junit.runner.RunWith;
12 import org.mockito.Mock;
13 import org.mockito.runners.MockitoJUnitRunner;
14
15 import java.util.Optional;
16
17 import static com.atlassian.messagequeue.internal.core.NestedMessageConstants.MESSAGE_RUNNER_KEY_ATTRIBUTE_NAME;
18 import static com.atlassian.messagequeue.internal.core.NestedMessageConstants.TENANT_ID_ATTRIBUTE_NAME;
19 import static com.atlassian.messagequeue.internal.core.NestedMessageConsumer.STATSD_MESSAGE_PROCESSING_COUNT;
20 import static com.atlassian.messagequeue.internal.core.NestedMessageConsumer.STATSD_MESSAGE_PROCESSING_DURATION;
21 import static com.atlassian.messagequeue.internal.core.NestedMessageConsumer.STATSD_MESSAGE_PROCESSING_TENANTID_SET;
22 import static com.atlassian.messagequeue.internal.core.NestedMessageConsumer.STATSD_MSG_RUNNER_TAG_PREFIX;
23 import static java.util.Collections.emptyList;
24 import static java.util.Optional.empty;
25 import static org.junit.Assert.fail;
26 import static org.mockito.Matchers.any;
27 import static org.mockito.Matchers.anyLong;
28 import static org.mockito.Matchers.eq;
29 import static org.mockito.Mockito.verify;
30 import static org.mockito.Mockito.when;
31
32 @RunWith(MockitoJUnitRunner.class)
33 public class NestedMessageConsumerTest {
34 private static final String TENANT_ID = "test_tenantID";
35 private static final String MSG_RUNNER_KEY = "test_messageRunnerKey";
36
37 @Mock
38 private MessageRunnerRegistryHelper messageRunnerHelper;
39 @Mock
40 private TenantIdSetter tenantIdSetter;
41 @Mock
42 private MessageValidatorRegistryHelper messageValidatorRegistryHelper;
43 @Mock
44 private StatsDClient statsDClient;
45 @Mock
46 private MessageRunner messageRunner;
47 @Mock
48 private MessageContext messageContext;
49
50 private NestedMessageConsumer nestedMessageConsumer;
51
52 @Before
53 public void setup() {
54 when(messageValidatorRegistryHelper.getAllValidators()).thenReturn(emptyList());
55 when(messageRunnerHelper.getMessageRunner(any())).thenReturn(Optional.of(messageRunner));
56 when(messageContext.getMessageId()).thenReturn(empty());
57 nestedMessageConsumer = new NestedMessageConsumer(messageRunnerHelper, tenantIdSetter, messageValidatorRegistryHelper);
58 }
59
60 @After
61 public void teardown() {
62 DefaultProductContainerProxy.getInstance().setComponentSupplier(StatsDClient.class, Optional::empty);
63 }
64
65 @Test
66 public void consume_send_metrics_when_statsdclient_available() {
67 NestedMessage nestedMessage = getNestedMessage();
68
69 DefaultProductContainerProxy.getInstance().setComponentSupplier(StatsDClient.class, () -> Optional.of(statsDClient));
70 final String TAG = STATSD_MSG_RUNNER_TAG_PREFIX + MSG_RUNNER_KEY;
71 nestedMessageConsumer.consume(nestedMessage, messageContext);
72 verify(statsDClient).increment(STATSD_MESSAGE_PROCESSING_COUNT, TAG);
73 verify(statsDClient).recordExecutionTime(eq(STATSD_MESSAGE_PROCESSING_DURATION), anyLong(), eq(TAG));
74 verify(statsDClient).recordSetValue(STATSD_MESSAGE_PROCESSING_TENANTID_SET, TENANT_ID, TAG);
75
76 }
77
78 @Test
79 public void consume_resilent_when_statsdclient_NOT_available() {
80 NestedMessage nestedMessage = getNestedMessage();
81
82 DefaultProductContainerProxy.getInstance().setComponentSupplier(StatsDClient.class, Optional::empty);
83 try {
84 nestedMessageConsumer.consume(nestedMessage, messageContext);
85 } catch (Exception anyException) {
86 fail("There shouldn't be Exception procrssing the msg.");
87 }
88 }
89
90 private static NestedMessage getNestedMessage() {
91 NestedMessage nestedMessage = new NestedMessage();
92 nestedMessage.addAttribute(TENANT_ID_ATTRIBUTE_NAME, TENANT_ID);
93 nestedMessage.addAttribute(MESSAGE_RUNNER_KEY_ATTRIBUTE_NAME, MSG_RUNNER_KEY);
94 return nestedMessage;
95 }
96 }