X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=datarouter-node%2Fsrc%2Ftest%2Fjava%2Forg%2Fonap%2Fdmaap%2Fdatarouter%2Fnode%2FNodeServletTest.java;h=136e21d466045da8bd7b1c2b0ad825d21d056485;hb=adb2ad2d16e851fbf8dcc71af68949a74463204d;hp=048c44fae918510db86b793d3c0d94eb5150410a;hpb=cb1693e59584bb3e1b897ed9431478ae30c666cc;p=dmaap%2Fdatarouter.git diff --git a/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/NodeServletTest.java b/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/NodeServletTest.java index 048c44fa..136e21d4 100644 --- a/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/NodeServletTest.java +++ b/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/NodeServletTest.java @@ -22,22 +22,27 @@ ******************************************************************************/ package org.onap.dmaap.datarouter.node; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.read.ListAppender; +import ch.qos.logback.classic.Logger; import org.apache.commons.lang3.reflect.FieldUtils; -import org.junit.Before; -import org.junit.Test; +import org.junit.*; import org.junit.runner.RunWith; import org.mockito.Mock; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; +import org.slf4j.LoggerFactory; -import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; import java.util.*; import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.*; @@ -46,6 +51,7 @@ import static org.mockito.Mockito.*; public class NodeServletTest { private NodeServlet nodeServlet; + private Delivery delivery; @Mock private HttpServletRequest request; @@ -53,16 +59,29 @@ public class NodeServletTest { @Mock private HttpServletResponse response; + private ListAppender listAppender; + + private NodeConfigManager config = mock(NodeConfigManager.class); + @Before - public void setUp() throws Exception{ - nodeServlet = new NodeServlet(); + public void setUp() throws Exception { + listAppender = setTestLogger(); setBehalfHeader("Stub_Value"); when(request.getPathInfo()).thenReturn("2"); when(request.isSecure()).thenReturn(true); + createFilesAndDirectories(); setUpConfig(); setUpNodeMainDelivery(); + delivery = mock(Delivery.class); + when(delivery.markTaskSuccess("spool/s/0/1", "dmaap-dr-node.1234567")).thenReturn(true); + nodeServlet = new NodeServlet(delivery); when(request.getHeader("Authorization")).thenReturn("User1"); - when(request.getHeader("X-ATT-DR-PUBLISH-ID")).thenReturn("User1"); + when(request.getHeader("X-DMAAP-DR-PUBLISH-ID")).thenReturn("User1"); + } + + @AfterClass + public static void tearDown() { + deleteCreatedDirectories(); } @Test @@ -70,38 +89,23 @@ public class NodeServletTest { setNodeConfigManagerIsConfiguredToReturnFalse(); nodeServlet.doGet(request, response); verify(response).sendError(eq(HttpServletResponse.SC_SERVICE_UNAVAILABLE)); + verifyEnteringExitCalled(listAppender); } @Test - public void Given_Request_Is_HTTP_GET_And_Endpoint_Is_Internal_FetchProv_Then_No_Content_Response_Is_Generated() throws Exception { + public void Given_Request_Is_HTTP_GET_And_Endpoint_Is_Internal_FetchProv_Then_No_Content_Response_Is_Generated() { when(request.getPathInfo()).thenReturn("/internal/fetchProv"); nodeServlet.doGet(request, response); verify(response).setStatus(eq(HttpServletResponse.SC_NO_CONTENT)); + verifyEnteringExitCalled(listAppender); } @Test - public void Given_Request_Is_HTTP_GET_And_Endpoint_Is_ResetSubscription_Then_No_Content_Response_Is_Generated() throws Exception { + public void Given_Request_Is_HTTP_GET_And_Endpoint_Is_ResetSubscription_Then_No_Content_Response_Is_Generated() { when(request.getPathInfo()).thenReturn("/internal/resetSubscription/1"); nodeServlet.doGet(request, response); verify(response).setStatus(eq(HttpServletResponse.SC_NO_CONTENT)); - } - - @Test - public void Given_Request_Is_HTTP_GET_And_Endpoint_Is_Internal_Logs_And_File_Does_Not_Exist_Then_Not_Found_Response_Is_Generated() throws Exception { - when(request.getPathInfo()).thenReturn("/internal/logs/fileName"); - when(request.getRemoteAddr()).thenReturn("135.207.136.128"); - nodeServlet.doGet(request, response); - verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND)); - } - - @Test - public void Given_Request_Is_HTTP_GET_And_Endpoint_Is_Internal_Rtt_And_Error_Connecting_To_Socket_Occurs_Then_Ok_Response_Is_Generated() throws Exception { - when(request.getPathInfo()).thenReturn("/internal/rtt/0.0.0.0"); - when(request.getRemoteAddr()).thenReturn("135.207.136.128"); - ServletOutputStream outStream = mock(ServletOutputStream.class); - when(response.getOutputStream()).thenReturn(outStream); - nodeServlet.doGet(request, response); - verify(response).setStatus(eq(200)); + verifyEnteringExitCalled(listAppender); } @Test @@ -109,6 +113,7 @@ public class NodeServletTest { when(request.getPathInfo()).thenReturn("/incorrect"); nodeServlet.doGet(request, response); verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND)); + verifyEnteringExitCalled(listAppender); } @Test @@ -116,6 +121,7 @@ public class NodeServletTest { setNodeConfigManagerIsConfiguredToReturnFalse(); nodeServlet.doPut(request, response); verify(response).sendError(eq(HttpServletResponse.SC_SERVICE_UNAVAILABLE)); + verifyEnteringExitCalled(listAppender); } @Test @@ -123,6 +129,7 @@ public class NodeServletTest { when(request.getPathInfo()).thenReturn("/incorrect/"); nodeServlet.doPut(request, response); verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + verifyEnteringExitCalled(listAppender); } @Test @@ -130,6 +137,7 @@ public class NodeServletTest { when(request.isSecure()).thenReturn(false); nodeServlet.doPut(request, response); verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + verifyEnteringExitCalled(listAppender); } @Test @@ -137,6 +145,7 @@ public class NodeServletTest { when(request.getPathInfo()).thenReturn(null); nodeServlet.doPut(request, response); verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + verifyEnteringExitCalled(listAppender); } @Test @@ -144,6 +153,7 @@ public class NodeServletTest { when(request.getHeader("Authorization")).thenReturn(null); nodeServlet.doPut(request, response); verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + verifyEnteringExitCalled(listAppender); } @Test @@ -151,6 +161,7 @@ public class NodeServletTest { when(request.getPathInfo()).thenReturn("/publish/"); nodeServlet.doPut(request, response); verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + verifyEnteringExitCalled(listAppender); } @Test @@ -159,6 +170,7 @@ public class NodeServletTest { setNodeConfigManagerIsPublishPermittedToReturnAReason(); nodeServlet.doPut(request, response); verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + verifyEnteringExitCalled(listAppender); } @Test @@ -167,6 +179,7 @@ public class NodeServletTest { setNodeConfigManagerIsPublishPermittedToReturnAReason(); nodeServlet.doPut(request, response); verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN)); + verifyEnteringExitCalled(listAppender); } @Test @@ -174,6 +187,7 @@ public class NodeServletTest { when(request.getPathInfo()).thenReturn("/internal/publish/1/"); nodeServlet.doPut(request, response); verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + verifyEnteringExitCalled(listAppender); } @Test @@ -182,6 +196,7 @@ public class NodeServletTest { setNodeConfigManagerToAllowRedirectOnIngressNode(); nodeServlet.doPut(request, response); verify(response).sendRedirect(anyString()); + verifyEnteringExitCalled(listAppender); } @Test @@ -200,6 +215,17 @@ public class NodeServletTest { verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); } + @Test + public void Given_Request_Is_HTTP_PUT_On_Publish_On_AAF_Feed_And_Cadi_Enabled_And_No_Permissions_Then_Forbidden_Response_Is_Generated() throws Exception { + when(config.getCadiEnabled()).thenReturn(true); + when(config.getAafInstance("1")).thenReturn("*"); + when(request.getPathInfo()).thenReturn("/publish/1/fileName"); + setHeadersForValidRequest(true); + nodeServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + verifyEnteringExitCalled(listAppender); + } + @Test public void Given_Request_Is_HTTP_DELETE_On_Publish_With_Meta_Data_Malformed_Then_Bad_Request_Response_Is_Generated() throws Exception { when(request.getPathInfo()).thenReturn("/publish/1/fileName"); @@ -208,31 +234,109 @@ public class NodeServletTest { verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); } + @Test + public void Given_Request_Is_HTTP_DELETE_File_With_Invalid_Endpoint_Then_Not_Found_Response_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn("/delete/1"); + nodeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + verifyEnteringExitCalled(listAppender); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_File_And_Is_Not_Privileged_Subscription_Then_Not_Found_Response_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn("/delete/1/dmaap-dr-node.1234567"); + setUpConfigToReturnUnprivilegedSubscriber(); + nodeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_UNAUTHORIZED)); + verifyEnteringExitCalled(listAppender); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_File_And_Subscription_Does_Not_Exist_Then_Not_Found_Response_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn("/delete/1/dmaap-dr-node.1234567"); + setUpConfigToReturnNullOnIsDeletePermitted(); + nodeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND)); + verifyEnteringExitCalled(listAppender); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_File_Then_Request_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/delete/1/dmaap-dr-node.1234567"); + createFilesAndDirectories(); + nodeServlet.doDelete(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + verifyEnteringExitCalled(listAppender); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_File_And_File_Does_Not_Exist_Then_Not_Found_Response_Is_Generated() throws IOException { + when(request.getPathInfo()).thenReturn("/delete/1/nonExistingFile"); + nodeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + verifyEnteringExitCalled(listAppender); + } private void setBehalfHeader(String headerValue) { - when(request.getHeader("X-ATT-DR-ON-BEHALF-OF")).thenReturn(headerValue); + when(request.getHeader("X-DMAAP-DR-ON-BEHALF-OF")).thenReturn(headerValue); } - private void setUpConfig() throws IllegalAccessException{ - NodeConfigManager config = mock(NodeConfigManager.class); + private ListAppender setTestLogger() { + Logger Logger = (Logger) LoggerFactory.getLogger(NodeServlet.class); + ListAppender listAppender = new ListAppender<>(); + listAppender.start(); + Logger.addAppender(listAppender); + return listAppender; + } + + private void verifyEnteringExitCalled(ListAppender listAppender) { + assertEquals("EELF0004I Entering data router node component with RequestId and InvocationId", listAppender.list.get(0).getMessage()); + assertEquals("EELF0005I Exiting data router node component with RequestId and InvocationId", listAppender.list.get(listAppender.list.size() -1).getMessage()); + } + + private void setUpConfig() throws IllegalAccessException { PowerMockito.mockStatic(NodeConfigManager.class); when(config.isShutdown()).thenReturn(false); when(config.isConfigured()).thenReturn(true); - when(config.getSpoolDir()).thenReturn("spool/dir"); + when(config.getSpoolDir()).thenReturn("spool/f"); + when(config.getSpoolBase()).thenReturn("spool"); when(config.getLogDir()).thenReturn("log/dir"); when(config.getPublishId()).thenReturn("User1"); when(config.isAnotherNode(anyString(), anyString())).thenReturn(true); when(config.getEventLogInterval()).thenReturn("40"); + when(config.isDeletePermitted("1")).thenReturn(true); + when(config.getAllDests()).thenReturn(new DestInfo[0]); FieldUtils.writeDeclaredStaticField(NodeServlet.class, "config", config, true); - FieldUtils.writeDeclaredStaticField(NodeMain.class, "nodeConfigManager", config, true); + FieldUtils.writeDeclaredStaticField(NodeRunner.class, "nodeConfigManager", config, true); PowerMockito.when(NodeConfigManager.getInstance()).thenReturn(config); } + private void setUpConfigToReturnUnprivilegedSubscriber() throws IllegalAccessException { + NodeConfigManager config = mock(NodeConfigManager.class); + PowerMockito.mockStatic(NodeConfigManager.class); + when(config.isShutdown()).thenReturn(false); + when(config.isConfigured()).thenReturn(true); + when(config.isDeletePermitted("1")).thenReturn(false); + FieldUtils.writeDeclaredStaticField(NodeServlet.class, "config", config, true); + FieldUtils.writeDeclaredStaticField(NodeRunner.class, "nodeConfigManager", config, true); + PowerMockito.when(NodeConfigManager.getInstance()).thenReturn(config); + } + + private void setUpConfigToReturnNullOnIsDeletePermitted() throws IllegalAccessException { + NodeConfigManager config = mock(NodeConfigManager.class); + PowerMockito.mockStatic(NodeConfigManager.class); + when(config.isShutdown()).thenReturn(false); + when(config.isConfigured()).thenReturn(true); + when(config.isDeletePermitted("1")).thenThrow(new NullPointerException()); + FieldUtils.writeDeclaredStaticField(NodeServlet.class, "config", config, true); + FieldUtils.writeDeclaredStaticField(NodeRunner.class, "nodeConfigManager", config, true); + PowerMockito.when(NodeConfigManager.getInstance()).thenReturn(config); + } private void setUpNodeMainDelivery() throws IllegalAccessException{ Delivery delivery = mock(Delivery.class); doNothing().when(delivery).resetQueue(anyObject()); - FieldUtils.writeDeclaredStaticField(NodeMain.class, "delivery", delivery, true); + FieldUtils.writeDeclaredStaticField(NodeServer.class, "delivery", delivery, true); } private void setNodeConfigManagerIsConfiguredToReturnFalse() throws IllegalAccessException{ @@ -283,15 +387,42 @@ public class NodeServletTest { } List headers = new ArrayList<>(); headers.add("Content-Type"); - headers.add("X-ATT-DR-ON-BEHALF-OF"); - headers.add("X-ATT-DR-META"); + headers.add("X-DMAAP-DR-ON-BEHALF-OF"); + headers.add("X-DMAAP-DR-META"); Enumeration headerNames = Collections.enumeration(headers); when(request.getHeaderNames()).thenReturn(headerNames); Enumeration contentTypeHeader = Collections.enumeration(Arrays.asList("text/plain")); Enumeration behalfHeader = Collections.enumeration(Arrays.asList("User1")); Enumeration metaDataHeader = Collections.enumeration(Arrays.asList(metaDataString)); when(request.getHeaders("Content-Type")).thenReturn(contentTypeHeader); - when(request.getHeaders("X-ATT-DR-ON-BEHALF-OF")).thenReturn(behalfHeader); - when(request.getHeaders("X-ATT-DR-META")).thenReturn(metaDataHeader); + when(request.getHeaders("X-DMAAP-DR-ON-BEHALF-OF")).thenReturn(behalfHeader); + when(request.getHeaders("X-DMAAP-DR-META")).thenReturn(metaDataHeader); + } + + private void createFilesAndDirectories() throws IOException { + File nodeDir = new File("spool/n/172.0.0.1"); + File spoolDir = new File("spool/s/0/1"); + File dataFile = new File("spool/s/0/1/dmaap-dr-node.1234567"); + File metaDataFile = new File("spool/s/0/1/dmaap-dr-node.1234567.M"); + nodeDir.mkdirs(); + spoolDir.mkdirs(); + dataFile.createNewFile(); + metaDataFile.createNewFile(); + } + + private static void deleteCreatedDirectories() { + File spoolDir = new File("spool"); + delete(spoolDir); + } + + private static void delete(File file) { + if (file.isDirectory()) { + for (File f: file.listFiles()) { + delete(f); + } + } + if (!file.delete()) { + System.out.println("Failed to delete: " + file); + } } }