Merge "Update mrstub with nginx"
[nonrtric.git] / policy-agent / src / test / java / org / oransc / policyagent / dmaap / DmaapMessageConsumerTest.java
1 /*-
2  * ========================LICENSE_START=================================
3  * O-RAN-SC
4  * %%
5  * Copyright (C) 2020 Nordix Foundation
6  * %%
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ========================LICENSE_END===================================
19  */
20
21 package org.oransc.policyagent.dmaap;
22
23 import static ch.qos.logback.classic.Level.WARN;
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.mockito.ArgumentMatchers.any;
26 import static org.mockito.Mockito.doNothing;
27 import static org.mockito.Mockito.doReturn;
28 import static org.mockito.Mockito.inOrder;
29 import static org.mockito.Mockito.spy;
30 import static org.mockito.Mockito.verify;
31 import static org.mockito.Mockito.verifyNoMoreInteractions;
32 import static org.mockito.Mockito.when;
33
34 import ch.qos.logback.classic.spi.ILoggingEvent;
35 import ch.qos.logback.core.read.ListAppender;
36
37 import java.time.Duration;
38 import java.util.Arrays;
39 import java.util.Collections;
40 import java.util.LinkedList;
41 import java.util.List;
42 import java.util.Properties;
43
44 import org.junit.jupiter.api.AfterEach;
45 import org.junit.jupiter.api.Test;
46 import org.junit.jupiter.api.extension.ExtendWith;
47 import org.mockito.InOrder;
48 import org.mockito.Mock;
49 import org.mockito.junit.jupiter.MockitoExtension;
50 import org.onap.dmaap.mr.client.MRConsumer;
51 import org.onap.dmaap.mr.client.response.MRConsumerResponse;
52 import org.oransc.policyagent.configuration.ApplicationConfig;
53 import org.oransc.policyagent.utils.LoggingUtils;
54 import org.springframework.http.HttpStatus;
55
56 @ExtendWith(MockitoExtension.class)
57 public class DmaapMessageConsumerTest {
58     @Mock
59     private ApplicationConfig applicationConfigMock;
60     @Mock
61     private MRConsumer messageRouterConsumerMock;
62     @Mock
63     private DmaapMessageHandler messageHandlerMock;
64
65     private DmaapMessageConsumer messageConsumerUnderTest;
66
67     @AfterEach
68     public void resetLogging() {
69         LoggingUtils.getLogListAppender(DmaapMessageConsumer.class);
70     }
71
72     @Test
73     public void dmaapNotConfigured_thenSleepAndRetryUntilConfig() throws Exception {
74         messageConsumerUnderTest = spy(new DmaapMessageConsumer(applicationConfigMock));
75
76         doNothing().when(messageConsumerUnderTest).sleep(any(Duration.class));
77         doReturn(false, false, false, true).when(messageConsumerUnderTest).isStopped();
78         doReturn(false, true, true).when(messageConsumerUnderTest).isDmaapConfigured();
79         doReturn(new LinkedList<>()).when(messageConsumerUnderTest).fetchAllMessages();
80
81         messageConsumerUnderTest.start().join();
82
83         InOrder orderVerifier = inOrder(messageConsumerUnderTest);
84         orderVerifier.verify(messageConsumerUnderTest).sleep(DmaapMessageConsumer.TIME_BETWEEN_DMAAP_RETRIES);
85         orderVerifier.verify(messageConsumerUnderTest).fetchAllMessages();
86     }
87
88     @Test
89     public void dmaapConfigurationRemoved_thenStopPollingDmaapSleepAndRetry() throws Exception {
90         messageConsumerUnderTest = spy(new DmaapMessageConsumer(applicationConfigMock));
91
92         doNothing().when(messageConsumerUnderTest).sleep(any(Duration.class));
93         doReturn(false, false, false, false, true).when(messageConsumerUnderTest).isStopped();
94         doReturn(true, true, false).when(messageConsumerUnderTest).isDmaapConfigured();
95         doReturn(new LinkedList<>()).when(messageConsumerUnderTest).fetchAllMessages();
96
97         messageConsumerUnderTest.start().join();
98
99         InOrder orderVerifier = inOrder(messageConsumerUnderTest);
100         orderVerifier.verify(messageConsumerUnderTest).fetchAllMessages();
101         orderVerifier.verify(messageConsumerUnderTest).sleep(DmaapMessageConsumer.TIME_BETWEEN_DMAAP_RETRIES);
102     }
103
104     @Test
105     public void dmaapConfiguredAndNoMessages_thenPollOnce() throws Exception {
106         setUpMrConfig();
107
108         messageConsumerUnderTest = spy(new DmaapMessageConsumer(applicationConfigMock));
109
110         MRConsumerResponse response = new MRConsumerResponse();
111         response.setResponseCode(Integer.toString(HttpStatus.OK.value()));
112         response.setActualMessages(Collections.emptyList());
113
114         doReturn(false, true).when(messageConsumerUnderTest).isStopped();
115         doReturn(messageRouterConsumerMock).when(messageConsumerUnderTest)
116             .getMessageRouterConsumer(any(Properties.class));
117         when(messageRouterConsumerMock.fetchWithReturnConsumerResponse()).thenReturn(response);
118
119         messageConsumerUnderTest.start().join();
120
121         verify(messageRouterConsumerMock).fetchWithReturnConsumerResponse();
122         verifyNoMoreInteractions(messageRouterConsumerMock);
123     }
124
125     @Test
126     public void dmaapConfiguredAndErrorGettingMessages_thenLogWarningAndSleep() throws Exception {
127         setUpMrConfig();
128
129         messageConsumerUnderTest = spy(new DmaapMessageConsumer(applicationConfigMock));
130
131         doNothing().when(messageConsumerUnderTest).sleep(any(Duration.class));
132         doReturn(false, true).when(messageConsumerUnderTest).isStopped();
133         doReturn(messageRouterConsumerMock).when(messageConsumerUnderTest)
134             .getMessageRouterConsumer(any(Properties.class));
135
136         MRConsumerResponse response = new MRConsumerResponse();
137         int responseCode = HttpStatus.BAD_REQUEST.value();
138         response.setResponseCode(Integer.toString(responseCode));
139         String responseMessage = "Error";
140         response.setResponseMessage(responseMessage);
141         when(messageRouterConsumerMock.fetchWithReturnConsumerResponse()).thenReturn(response);
142
143         final ListAppender<ILoggingEvent> logAppender =
144             LoggingUtils.getLogListAppender(DmaapMessageConsumer.class, WARN);
145
146         messageConsumerUnderTest.start().join();
147
148         assertThat(logAppender.list.toString()
149             .contains("Cannot fetch because of Error respons " + responseCode + " " + responseMessage + " from DMaaP."))
150                 .isTrue();
151
152         verify(messageConsumerUnderTest).sleep(DmaapMessageConsumer.TIME_BETWEEN_DMAAP_RETRIES);
153     }
154
155     @Test
156     public void dmaapConfiguredAndOneMessage_thenPollOnceAndProcessMessage() throws Exception {
157         setUpMrConfig();
158         messageConsumerUnderTest = spy(new DmaapMessageConsumer(applicationConfigMock));
159
160         doReturn(false, true).when(messageConsumerUnderTest).isStopped();
161         doReturn(messageRouterConsumerMock).when(messageConsumerUnderTest)
162             .getMessageRouterConsumer(any(Properties.class));
163
164         MRConsumerResponse response = new MRConsumerResponse();
165         response.setResponseCode(Integer.toString(HttpStatus.OK.value()));
166         String responseMessage = "message";
167         List<String> messages = Arrays.asList(responseMessage);
168         response.setActualMessages(messages);
169         when(messageRouterConsumerMock.fetchWithReturnConsumerResponse()).thenReturn(response);
170
171         doReturn(messageHandlerMock).when(messageConsumerUnderTest).getDmaapMessageHandler();
172
173         messageConsumerUnderTest.start().join();
174
175         verify(messageHandlerMock).handleDmaapMsg(responseMessage);
176         verifyNoMoreInteractions(messageHandlerMock);
177     }
178
179     private Properties setUpMrConfig() {
180         Properties properties = new Properties();
181         properties.put("key", "value");
182         when(applicationConfigMock.getDmaapConsumerConfig()).thenReturn(properties);
183         when(applicationConfigMock.getDmaapPublisherConfig()).thenReturn(properties);
184         return properties;
185     }
186 }