[DMaaP DR] JKD 11 migration
[dmaap/datarouter.git] / datarouter-node / src / test / java / org / onap / dmaap / datarouter / node / DeliveryQueueTest.java
1 /*******************************************************************************
2  * ============LICENSE_START==================================================
3  * * org.onap.dmaap
4  * * ===========================================================================
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
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  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
21  * *
22  ******************************************************************************/
23
24 package org.onap.dmaap.datarouter.node;
25
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertFalse;
28 import static org.junit.Assert.assertNull;
29 import static org.junit.Assert.assertTrue;
30 import static org.mockito.Matchers.anyLong;
31 import static org.mockito.Mockito.mock;
32 import static org.mockito.Mockito.times;
33 import static org.mockito.Mockito.verify;
34 import static org.mockito.Mockito.when;
35
36 import java.io.File;
37 import java.util.ArrayList;
38 import java.util.HashMap;
39 import java.util.List;
40 import java.util.Vector;
41 import org.apache.commons.lang3.reflect.FieldUtils;
42 import org.jetbrains.annotations.NotNull;
43 import org.junit.Before;
44 import org.junit.Test;
45 import org.junit.runner.RunWith;
46 import org.mockito.Mock;
47 import org.powermock.api.mockito.PowerMockito;
48 import org.powermock.core.classloader.annotations.PowerMockIgnore;
49 import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
50 import org.powermock.modules.junit4.PowerMockRunner;
51
52 @RunWith(PowerMockRunner.class)
53 @SuppressStaticInitializationFor("org.onap.dmaap.datarouter.node.NodeConfigManager")
54 @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*"})
55 public class DeliveryQueueTest {
56
57     @Mock
58     DeliveryQueueHelper deliveryQueueHelper;
59     private DeliveryQueue deliveryQueue;
60     @Mock
61     private DestInfo destInfo;
62     private String dirPath = "/tmp/dir001/";
63     private String fileName = "10000000000004.fileName.M";
64
65     @Before
66     public void setUp() throws IllegalAccessException {
67         when(destInfo.getSpool()).thenReturn(dirPath);
68         when(destInfo.isPrivilegedSubscriber()).thenReturn(true);
69         deliveryQueue = new DeliveryQueue(deliveryQueueHelper, destInfo);
70         NodeConfigManager configManager = mockNodeConfigManager();
71         FieldUtils.writeDeclaredStaticField(StatusLog.class, "config", configManager, true);
72     }
73
74     @Test
75     public void Given_New_DeliveryQueue_Directory_Is_Created_As_Defined_By_DestInfo() {
76         File file = new File("/tmp");
77         assertTrue(file.exists());
78     }
79
80     @Test
81     public void Given_Delivery_Task_Failed_And_Resume_Time_Not_Reached_Return_Null() throws Exception {
82         FieldUtils.writeField(deliveryQueue, "failed", true, true);
83         FieldUtils.writeField(deliveryQueue, "resumetime", System.currentTimeMillis() * 2, true);
84         assertNull(deliveryQueue.peekNext());
85     }
86
87     @Test
88     public void Given_Delivery_Task_Return_Next_Delivery_Task_Id() throws Exception {
89         prepareFiles();
90         when(destInfo.getSpool()).thenReturn(dirPath);
91         deliveryQueue = new DeliveryQueue(deliveryQueueHelper, destInfo);
92         DeliveryTask nt = deliveryQueue.getNext();
93         assertEquals("10000000000004.fileName", nt.getPublishId());
94         deleteFile(dirPath + fileName);
95         deleteFile(dirPath);
96     }
97
98     @Test
99     public void Given_Task_In_Todo_Is_Already_Cleaned_GetNext_Returns_Null() throws Exception {
100         when(deliveryQueueHelper.getExpirationTimer()).thenReturn(10000L);
101         deliveryQueue = new DeliveryQueue(deliveryQueueHelper, destInfo);
102         Vector<DeliveryTask> tasks = new Vector<>();
103         DeliveryTask task = new DeliveryTask(deliveryQueue, "123.node.datarouternew.com");
104         task.clean();
105         tasks.add(task);
106         FieldUtils.writeField(deliveryQueue, "todoList", tasks, true);
107         DeliveryTask nt = deliveryQueue.getNext();
108         assertNull(nt);
109     }
110
111     @Test
112     public void Given_Task_In_Todo_Has_Resume_Time_In_Future_GetNext_Returns_Null() throws Exception {
113         when(destInfo.isPrivilegedSubscriber()).thenReturn(true);
114         when(deliveryQueueHelper.getExpirationTimer()).thenReturn(10000L);
115         deliveryQueue = new DeliveryQueue(deliveryQueueHelper, destInfo);
116         Vector<DeliveryTask> tasks = new Vector<>();
117         DeliveryTask task = new DeliveryTask(deliveryQueue, "123.node.datarouternew.com");
118         long timeInFuture = 2558366240223L;
119         task.setResumeTime(timeInFuture);
120         tasks.add(task);
121         FieldUtils.writeField(deliveryQueue, "todoList", tasks, true);
122         DeliveryTask nt = deliveryQueue.getNext();
123         assertNull(nt);
124     }
125
126     @Test
127     public void Given_Task_In_Todo_Is_Expired_GetNext_Returns_Null() throws Exception {
128         when(destInfo.isPrivilegedSubscriber()).thenReturn(true);
129         when(deliveryQueueHelper.getExpirationTimer()).thenReturn(10000L);
130         deliveryQueue = new DeliveryQueue(deliveryQueueHelper, destInfo);
131         Vector<DeliveryTask> tasks = new Vector<>();
132         DeliveryTask task = new DeliveryTask(deliveryQueue, "123.node.datarouternew.com");
133         long timeInPast = 1058366240223L;
134         task.setResumeTime(timeInPast);
135         tasks.add(task);
136         FieldUtils.writeField(deliveryQueue, "todoList", tasks, true);
137         DeliveryTask nt = deliveryQueue.getNext();
138         assertNull(nt);
139     }
140
141     @Test
142     public void Given_Delivery_Task_Cancel_And_FileId_Is_Null_Return_Zero() {
143         long rc = deliveryQueue.cancelTask("123.node.datarouternew.com");
144         assertEquals(0, rc);
145     }
146
147     @Test
148     public void Given_Delivery_Task_Is_Working_Cancel_Task_Returns_Zero() throws IllegalAccessException {
149         HashMap<String, DeliveryTask> tasks = new HashMap<>();
150         tasks.put("123.node.datarouternew.com", new DeliveryTask(deliveryQueue, "123.node.datarouternew.com"));
151         FieldUtils.writeField(deliveryQueue, "working", tasks, true);
152         long rc = deliveryQueue.cancelTask("123.node.datarouternew.com");
153         assertEquals(0, rc);
154     }
155
156     @Test
157     public void Given_Delivery_Task_In_Todo_Cancel_Task_Returns_Zero() throws IllegalAccessException {
158         List<DeliveryTask> tasks = new ArrayList<>();
159         tasks.add(new DeliveryTask(deliveryQueue, "123.node.datarouternew.com"));
160         FieldUtils.writeField(deliveryQueue, "todoList", tasks, true);
161         long rc = deliveryQueue.cancelTask("123.node.datarouternew.com");
162         assertEquals(0, rc);
163     }
164
165     @Test
166     public void Given_Ok_Status_And_Privileged_Subscriber_Then_Set_Resume_Time_Is_Called_On_DeliveryTask() {
167         DeliveryTask deliveryTask = mockDeliveryTask();
168         deliveryQueue.reportStatus(deliveryTask, 200, "123456789.dmaap-dr-node", "delivery");
169         verify(deliveryTask, times(1)).setResumeTime(anyLong());
170         cleanUpLogging();
171     }
172
173     @Test
174     public void Given_Ok_Status_And_Not_Privileged_Subscriber_Then_Clean_Is_Called_On_DeliveryTask() {
175         DeliveryTask deliveryTask = mockDeliveryTask();
176         when(destInfo.isPrivilegedSubscriber()).thenReturn(false);
177         deliveryQueue = new DeliveryQueue(deliveryQueueHelper, destInfo);
178         deliveryQueue.reportStatus(deliveryTask, 200, "123456789.dmaap-dr-node", "delivery");
179         verify(deliveryTask, times(1)).clean();
180         cleanUpLogging();
181     }
182
183     @Test
184     public void Given_Not_Ok_Status_Then_Clean_Is_Called_On_DeliveryTask() {
185         DeliveryTask deliveryTask = mockDeliveryTask();
186         deliveryQueue.reportStatus(deliveryTask, 400, "123456789.dmaap-dr-node", "delivery");
187         verify(deliveryTask, times(1)).clean();
188         cleanUpLogging();
189     }
190
191     @Test
192     public void Given_Task_In_Working_MarkTaskSuccess_Returns_True() throws IllegalAccessException {
193         HashMap<String, DeliveryTask> tasks = new HashMap<>();
194         tasks.put("123.node.datarouternew.com", new DeliveryTask(deliveryQueue, "123.node.datarouternew.com"));
195         FieldUtils.writeField(deliveryQueue, "working", tasks, true);
196         assertTrue(deliveryQueue.markTaskSuccess("123.node.datarouternew.com"));
197     }
198
199     @Test
200     public void Given_Task_In_Retry_MarkTaskSuccess_Returns_True() throws IllegalAccessException {
201         HashMap<String, DeliveryTask> tasks = new HashMap<>();
202         tasks.put("123.node.datarouternew.com", new DeliveryTask(deliveryQueue, "123.node.datarouternew.com"));
203         FieldUtils.writeField(deliveryQueue, "retry", tasks, true);
204         assertTrue(deliveryQueue.markTaskSuccess("123.node.datarouternew.com"));
205     }
206
207     @Test
208     public void Given_Task_Does_Not_Exist_MarkTaskSuccess_Returns_False() {
209         assertFalse(deliveryQueue.markTaskSuccess("false.pubId.com"));
210     }
211
212     private void cleanUpLogging() {
213         final File currentDir = new File(System.getProperty("user.dir"));
214         final File[] files = currentDir.listFiles((file, name) -> name.matches("null.*"));
215         if (files != null) {
216             for (final File file : files) {
217                 file.delete();
218             }
219         }
220     }
221
222     @NotNull
223     private DeliveryTask mockDeliveryTask() {
224         DeliveryTask deliveryTask = mock(DeliveryTask.class);
225         when(deliveryTask.getPublishId()).thenReturn("123456789.dmaap-dr-node");
226         when(deliveryTask.getFeedId()).thenReturn("1");
227         when(deliveryTask.getSubId()).thenReturn("1");
228         when(deliveryTask.getURL()).thenReturn("http://subcriber.com:7070/delivery");
229         when(deliveryTask.getCType()).thenReturn("application/json");
230         when(deliveryTask.getLength()).thenReturn(486L);
231         return deliveryTask;
232     }
233
234     private NodeConfigManager mockNodeConfigManager() {
235         NodeConfigManager config = mock(NodeConfigManager.class);
236         PowerMockito.when(config.getEventLogInterval()).thenReturn("30000");
237         return config;
238     }
239
240     private void prepareFiles() throws Exception {
241         createFolder(dirPath);
242         createFile(fileName, dirPath);
243     }
244
245     private void createFolder(String dirName) {
246         File newDirectory = new File(dirName);
247         newDirectory.mkdirs();
248     }
249
250     private void createFile(String file, String dir) throws Exception {
251         File newFile = new File(dir + File.separator + file);
252         newFile.createNewFile();
253     }
254
255     private void deleteFile(String fileName) {
256         File file = new File(fileName);
257
258         if (file.exists()) {
259             file.delete();
260         }
261     }
262
263 }