Merge "FINAL unit test covergae commit"
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTask.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTask.java
index 7ed3592..193fa65 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTask.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTask.java
@@ -296,7 +296,7 @@
      * @param httpURLConnection connection used to make request
      * @return AN Outpustream that can be used to send your data.
      */
-    private OutputStream getOutputStream(HttpURLConnection httpURLConnection) throws IOException {
+    OutputStream getOutputStream(HttpURLConnection httpURLConnection) throws IOException {
         OutputStream outputStream = null;
         try {
             outputStream = httpURLConnection.getOutputStream();
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfigManager.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfigManager.java
index be77d24..15672ee 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfigManager.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfigManager.java
@@ -24,13 +24,18 @@
 
 package org.onap.dmaap.datarouter.node;
 
+import static java.lang.System.exit;
+
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.net.URL;
+import java.nio.file.Files;
+import java.util.Objects;
 import java.util.Properties;
 import java.util.Timer;
 import org.onap.dmaap.datarouter.node.eelf.EelfMsgs;
@@ -134,13 +139,12 @@
          */
         //Disable and enable protocols*/
         enabledprotocols = ((drNodeProperties.getProperty("NodeHttpsProtocols")).trim()).split("\\|");
-
         try {
             provhost = (new URL(provurl)).getHost();
         } catch (Exception e) {
             NodeUtils.setIpAndFqdnForEelf(NODE_CONFIG_MANAGER);
             eelfLogger.error(EelfMsgs.MESSAGE_BAD_PROV_URL, e, provurl);
-            System.exit(1);
+            exit(1);
         }
         eelfLogger.debug("NODE0303 Provisioning server is " + provhost);
         eventlogurl = drNodeProperties.getProperty("LogUploadURL", "https://feeds-drtr.web.att.com/internal/logs");
@@ -151,9 +155,11 @@
         spooldir = drNodeProperties.getProperty("SpoolDir", "spool");
         File fdir = new File(spooldir + "/f");
         fdir.mkdirs();
-        for (File junk : fdir.listFiles()) {
-            if (junk.isFile()) {
-                junk.delete();
+        for (File junk : Objects.requireNonNull(fdir.listFiles())) {
+            try {
+                Files.deleteIfExists(junk.toPath());
+            } catch (IOException e) {
+                eelfLogger.error("NODE0313 Failed to clear junk files from " + fdir.getPath());
             }
         }
         logdir = drNodeProperties.getProperty("LogDir", "logs");
@@ -181,7 +187,7 @@
             NodeUtils.setIpAndFqdnForEelf(NODE_CONFIG_MANAGER);
             eelfLogger.error(EelfMsgs.MESSAGE_KEYSTORE_FETCH_ERROR, ksfile);
             eelfLogger.error("NODE0309 Unable to fetch canonical name from keystore file " + ksfile);
-            System.exit(1);
+            exit(1);
         }
         eelfLogger.debug("NODE0304 My certificate says my name is " + myname);
         pid = new PublishId(myname);
diff --git a/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/DeliveryTaskTest.java b/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/DeliveryTaskTest.java
index a0f0577..0123c31 100644
--- a/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/DeliveryTaskTest.java
+++ b/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/DeliveryTaskTest.java
@@ -20,15 +20,9 @@
 
 package org.onap.dmaap.datarouter.node;
 
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.io.OutputStream;
+import java.io.ByteArrayOutputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -42,14 +36,12 @@
 
 
 @RunWith(PowerMockRunner.class)
-@PrepareForTest({DeliveryTask.class})
+@PrepareForTest({URL.class})
 public class DeliveryTaskTest {
 
     @Mock
     private DeliveryQueue deliveryQueue;
 
-    private ExecutorService executorService;
-
     @Before
     public void setUp() throws Exception {
         DestInfo destInfo = getPrivDestInfo();
@@ -57,14 +49,13 @@
 
         URL url = PowerMockito.mock(URL.class);
         HttpURLConnection urlConnection = PowerMockito.mock(HttpURLConnection.class);
-        OutputStream outputStream = PowerMockito.mock(OutputStream.class);
 
-        PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments(Mockito.anyString())
-                .thenReturn(url);
-        PowerMockito.when(urlConnection.getOutputStream()).thenReturn(outputStream);
-        PowerMockito.when(url.openConnection()).thenReturn(urlConnection);
+        PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments(Mockito.anyString()).thenReturn(url);
+
+        PowerMockito.when(urlConnection.getOutputStream()).thenReturn(new ByteArrayOutputStream());
         PowerMockito.when(urlConnection.getHeaderField(0)).thenReturn("PUT");
         PowerMockito.when(urlConnection.getResponseCode()).thenReturn(200);
+        PowerMockito.when(url.openConnection()).thenReturn(urlConnection);
     }
 
     @After
@@ -74,8 +65,8 @@
 
     @Test
     public void Validate_Delivery_Task_Equals() {
-        DeliveryTask task = new DeliveryTask(deliveryQueue, "123456789.test-dr-datafile");
-        DeliveryTask task2 = new DeliveryTask(deliveryQueue, "123456789.test-dr-datafile");
+        DeliveryTask task = new DeliveryTask(deliveryQueue, "123456789.test-dr-node");
+        DeliveryTask task2 = new DeliveryTask(deliveryQueue, "123456789.test-dr-node");
         Assert.assertEquals(task, task2);
         Assert.assertEquals(task.hashCode(), task2.hashCode());
         Assert.assertEquals(task.toString(), task2.toString());
@@ -91,29 +82,19 @@
         Assert.assertEquals(task.getFileId(), task2.getFileId());
         Assert.assertEquals(task.getAttempts(), task2.getAttempts());
         Assert.assertEquals(task.getFollowRedirects(), task2.getFollowRedirects());
-
         Assert.assertEquals(0, task.compareTo(task2));
     }
 
     @Test
-    public void Validate_Delivery_Tasks_Success_For_Standard_File() throws InterruptedException {
+    public void Validate_Delivery_Tasks_Success_For_Standard_File() {
         DeliveryTask task = new DeliveryTask(deliveryQueue, "123456789.test-dr-node");
-        executorService = Executors.newSingleThreadExecutor();
-        executorService.execute(task);
-
-        executorService.shutdown();
-        executorService.awaitTermination(2, TimeUnit.SECONDS);
+        task.run();
     }
 
     @Test
-    public void Validate_Delivery_Tasks_Success_For_Compressed_File() throws InterruptedException {
-
+    public void Validate_Delivery_Tasks_Success_For_Compressed_File() {
         DeliveryTask task = new DeliveryTask(deliveryQueue, "123456789.test-dr-node.gz");
-        executorService = Executors.newSingleThreadExecutor();
-        executorService.execute(task);
-
-        executorService.shutdown();
-        executorService.awaitTermination(2, TimeUnit.SECONDS);
+        task.run();
     }
 
     private DestInfo getPrivDestInfo() {
@@ -125,8 +106,9 @@
     }
 
     private DeliveryQueue mockDelvieryQueue(DestInfo destInfo) {
-        DeliveryQueue mockedDeliveryQueue = mock(DeliveryQueue.class);
-        when(mockedDeliveryQueue.getDestinationInfo()).thenReturn(destInfo);
+        DeliveryQueue mockedDeliveryQueue = PowerMockito.mock(DeliveryQueue.class);
+        PowerMockito.when(mockedDeliveryQueue.getDestinationInfo()).thenReturn(destInfo);
+        PowerMockito.when(mockedDeliveryQueue.getDestURL(Mockito.anyString())).thenReturn("https://dmaap-dr-node:8443/internal/publish");
         return mockedDeliveryQueue;
     }
 
diff --git a/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/NodeConfigManagerTest.java b/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/NodeConfigManagerTest.java
new file mode 100644
index 0000000..87c2bdf
--- /dev/null
+++ b/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/NodeConfigManagerTest.java
@@ -0,0 +1,79 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dmaap.datarouter.node;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.URL;
+import org.apache.commons.io.FileUtils;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PowerMockIgnore({"javax.net.ssl.*", "javax.security.auth.x500.X500Principal"})
+@PrepareForTest({InetAddress.class, URL.class})
+public class NodeConfigManagerTest {
+
+    private NodeConfigManager nodeConfigManager = NodeConfigManager.getInstance();
+
+    @BeforeClass
+    public static void init() {
+        System.setProperty("org.onap.dmaap.datarouter.node.properties", "src/test/resources/node_test.properties");
+    }
+
+    @AfterClass
+    public static void tearDownClass() throws IOException {
+        FileUtils.deleteDirectory(new File(System.getProperty("user.dir") + "/src/test/resources/spool"));
+        FileUtils.deleteDirectory(new File(System.getProperty("user.dir") + "/src/test/resources/logs"));
+    }
+
+    @Test
+    public void Verify_NodeConfigMan_Getters() {
+        Assert.assertEquals("legacy", nodeConfigManager.getAafInstance());
+        Assert.assertEquals("src/test/resources/spool/f", nodeConfigManager.getSpoolDir());
+        Assert.assertEquals("src/test/resources/spool", nodeConfigManager.getSpoolBase());
+        Assert.assertEquals("jks", nodeConfigManager.getKSType());
+        Assert.assertEquals(8080, nodeConfigManager.getHttpPort());
+        Assert.assertEquals(8443, nodeConfigManager.getHttpsPort());
+        Assert.assertEquals(443, nodeConfigManager.getExtHttpsPort());
+        Assert.assertEquals("dmaap-dr-node", nodeConfigManager.getMyName());
+        Assert.assertEquals("https://dmaap-dr-prov:8443/internal/logs", nodeConfigManager.getEventLogUrl());
+        Assert.assertEquals("src/test/resources/logs/events", nodeConfigManager.getEventLogPrefix());
+        Assert.assertEquals(".log", nodeConfigManager.getEventLogSuffix());
+        Assert.assertEquals("src/test/resources/logs", nodeConfigManager.getLogDir());
+        Assert.assertEquals((86400000L * 30), nodeConfigManager.getLogRetention());
+        Assert.assertEquals(new String[] {"TLSv1.1", "TLSv1.2"}, nodeConfigManager.getEnabledprotocols());
+        Assert.assertEquals("org.onap.dmaap-dr.feed", nodeConfigManager.getAafType());
+        Assert.assertEquals("publish", nodeConfigManager.getAafAction());
+        Assert.assertEquals("https://aaf-onap-test.osaaf.org:8095", nodeConfigManager.getAafURL());
+        Assert.assertFalse(nodeConfigManager.getCadiEnabled());
+        Assert.assertFalse(nodeConfigManager.isShutdown());
+        Assert.assertFalse(nodeConfigManager.isConfigured());
+    }
+
+}
\ No newline at end of file
diff --git a/datarouter-node/src/test/resources/node_test.properties b/datarouter-node/src/test/resources/node_test.properties
new file mode 100644
index 0000000..9e0cd99
--- /dev/null
+++ b/datarouter-node/src/test/resources/node_test.properties
@@ -0,0 +1,103 @@
+#-------------------------------------------------------------------------------
+# ============LICENSE_START==================================================
+# * org.onap.dmaap
+# * ===========================================================================
+# * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# * ===========================================================================
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+#  *      http://www.apache.org/licenses/LICENSE-2.0
+# *
+#  * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# * ============LICENSE_END====================================================
+# *
+# * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+# *
+#-------------------------------------------------------------------------------
+#
+#    Configuration parameters set at startup for the DataRouter node
+#
+#    URL to retrieve dynamic configuration
+ProvisioningURL = https://dmaap-dr-prov:8443/internal/prov
+#
+#    URL to upload PUB/DEL/EXP logs
+LogUploadURL = https://dmaap-dr-prov:8443/internal/logs
+#
+#    The port number for http as seen within the server
+IntHttpPort = 8080
+#
+#    The port number for https as seen within the server
+IntHttpsPort = 8443
+#
+#    The external port number for https taking port mapping into account
+ExtHttpsPort = 443
+#
+#    The minimum interval between fetches of the dynamic configuration from the provisioning server
+MinProvFetchInterval = 10000
+#
+#    The minimum interval between saves of the redirection data file
+MinRedirSaveInterval = 10000
+#
+#    The path to the directory where log files are stored
+LogDir = src/test/resources/logs
+#
+#    The retention interval (in days) for log files
+LogRetention = 30
+#
+#    The path to the directories where data and meta data files are stored
+SpoolDir = src/test/resources/spool
+#
+#    The path to the redirection data file
+RedirectionFile = src/test/redirections.dat
+#
+#    The type of keystore for https
+KeyStoreType = jks
+#
+#    The path to the keystore for https
+KeyStoreFile = aaf_certs/org.onap.dmaap-dr.jks
+#
+#    The password for the https keystore
+KeyStorePassword=WGxd2P6MDo*Bi4+UdzWs{?$8
+#
+#    The password for the private key in the https keystore
+KeyPassword=WGxd2P6MDo*Bi4+UdzWs{?$8
+#
+#    The type of truststore for https
+TrustStoreType = jks
+#
+#    The path to the truststore for https
+TrustStoreFile = aaf_certs/org.onap.dmaap-dr.trust.jks
+#
+#    The password for the https truststore
+TrustStorePassword=)OBvCd{e{aWq.^mJJdX:S:1&
+#
+#    The path to the file used to trigger an orderly shutdown
+QuiesceFile = etc/SHUTDOWN
+#
+#    The key used to generate passwords for node to node transfers
+NodeAuthKey = Node123!
+#
+#    DR_NODE DEFAULT ENABLED TLS PROTOCOLS
+NodeHttpsProtocols = TLSv1.1|TLSv1.2
+#
+#    AAF type to generate permission string
+AAFType = org.onap.dmaap-dr.feed
+#
+#    AAF default instance to generate permission string - default should be legacy
+AAFInstance = legacy
+#
+#    AAF action to generate permission string - default should be publish
+AAFAction = publish
+#
+#    AAF URL to connect to AAF server
+AafUrl = https://aaf-onap-test.osaaf.org:8095
+#
+#    AAF CADI enabled flag
+CadiEnabled = false
+
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/ProxyServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/ProxyServlet.java
index 7542360..e47f9fb 100755
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/ProxyServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/ProxyServlet.java
@@ -24,6 +24,8 @@
 
 package org.onap.dmaap.datarouter.provisioning;
 
+import static org.onap.dmaap.datarouter.provisioning.utils.HttpServletUtils.sendResponseError;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -54,8 +56,6 @@
 import org.onap.dmaap.datarouter.provisioning.utils.DB;
 import org.onap.dmaap.datarouter.provisioning.utils.URLUtilities;
 
-import static org.onap.dmaap.datarouter.provisioning.utils.HttpServletUtils.sendResponseError;
-
 /**
  * This class is the base class for those servlets that need to proxy their requests from the standby to active server.
  * Its methods perform the proxy function to the active server. If the active server is not reachable, a 503
@@ -96,7 +96,7 @@
             // We are connecting with the node name, but the certificate will have the CNAME
             // So we need to accept a non-matching certificate name
             SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore,
-                props.getProperty(Main.KEYSTORE_PASS_PROPERTY), trustStore);
+                    props.getProperty(Main.KEYSTORE_PASS_PROPERTY), trustStore);
             socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
             sch = new Scheme("https", 443, socketFactory);
             inited = true;
@@ -125,7 +125,7 @@
      * @param req the HTTP request
      * @return true or false
      */
-    protected boolean isProxyOK(final HttpServletRequest req) {
+    boolean isProxyOK(final HttpServletRequest req) {
         String t = req.getQueryString();
         if (t != null) {
             t = t.replaceAll("&", "&");
@@ -144,7 +144,7 @@
      *
      * @return true if this server is the standby (and hence a proxy server).
      */
-    public boolean isProxyServer() {
+    boolean isProxyServer() {
         SynchronizerTask st = SynchronizerTask.getSynchronizer();
         return st.getPodState() == SynchronizerTask.STANDBY_POD;
     }
@@ -187,7 +187,7 @@
      *
      * @return true if the proxy succeeded
      */
-    public boolean doGetWithFallback(HttpServletRequest req, HttpServletResponse resp) {
+    boolean doGetWithFallback(HttpServletRequest req, HttpServletResponse resp) {
         boolean rv = false;
         if (inited) {
             String url = buildUrl(req);
@@ -234,12 +234,8 @@
 
                     // Copy request headers and request body
                     copyRequestHeaders(req, proxy);
-                    if ("POST".equals(method) || "PUT".equals(method)) {
-                        BasicHttpEntity body = new BasicHttpEntity();
-                        body.setContent(req.getInputStream());
-                        body.setContentLength(-1);    // -1 = unknown
-                        proxy.setEntity(body);
-                    }
+
+                    handlePutOrPost(req, method, proxy);
 
                     // Execute the request
                     HttpResponse pxyResponse = httpclient.execute(proxy);
@@ -263,6 +259,15 @@
         }
     }
 
+    private void handlePutOrPost(HttpServletRequest req, String method, ProxyHttpRequest proxy) throws IOException {
+        if ("POST".equals(method) || "PUT".equals(method)) {
+            BasicHttpEntity body = new BasicHttpEntity();
+            body.setContent(req.getInputStream());
+            body.setContentLength(-1);    // -1 = unknown
+            proxy.setEntity(body);
+        }
+    }
+
     private String buildUrl(HttpServletRequest req) {
         StringBuilder sb = new StringBuilder("https://");
         sb.append(URLUtilities.getPeerPodName());
@@ -275,7 +280,6 @@
     }
 
     private void copyRequestHeaders(HttpServletRequest from, HttpRequestBase to) {
-        @SuppressWarnings("unchecked")
         List<String> list = Collections.list(from.getHeaderNames());
         for (String name : list) {
             // Proxy code will add this one
@@ -285,7 +289,7 @@
         }
     }
 
-    private void copyResponseHeaders(HttpResponse from, HttpServletResponse to) {
+    void copyResponseHeaders(HttpResponse from, HttpServletResponse to) {
         for (Header hdr : from.getAllHeaders()) {
             // Don't copy Date: our Jetty will add another Date header
             if (!"Date".equals(hdr.getName())) {
@@ -294,7 +298,7 @@
         }
     }
 
-    private void copyEntityContent(HttpResponse pxyResponse, HttpServletResponse resp) {
+    void copyEntityContent(HttpResponse pxyResponse, HttpServletResponse resp) {
         HttpEntity entity = pxyResponse.getEntity();
         if (entity != null) {
             try (InputStream in = entity.getContent()) {
@@ -305,11 +309,11 @@
         }
     }
 
-    public class ProxyHttpRequest extends HttpEntityEnclosingRequestBase {
+    public static class ProxyHttpRequest extends HttpEntityEnclosingRequestBase {
 
         private final String method;
 
-        public ProxyHttpRequest(final String method, final String uri) {
+        ProxyHttpRequest(final String method, final String uri) {
             super();
             this.method = method;
             setURI(URI.create(uri));
diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/ProxyServletTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/ProxyServletTest.java
new file mode 100644
index 0000000..a0442c1
--- /dev/null
+++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/ProxyServletTest.java
@@ -0,0 +1,184 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dmaap.datarouter.provisioning;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.powermock.api.mockito.PowerMockito.when;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.servlet.ServletConfig;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.StatusLine;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.message.BasicHeader;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.onap.dmaap.datarouter.provisioning.utils.URLUtilities;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PowerMockIgnore("javax.net.ssl.*")
+@PrepareForTest({URLUtilities.class, BaseServlet.class, Scheme.class})
+public class ProxyServletTest {
+    private static ProxyServlet proxyServlet;
+    private static EntityManagerFactory emf;
+    private static EntityManager em;
+
+    @Mock
+    private DefaultHttpClient httpClient;
+    @Mock
+    private HttpServletRequest request;
+    @Mock
+    private HttpServletResponse servletResponse;
+    @Mock
+    private CloseableHttpResponse response;
+    @Mock
+    private StatusLine statusLine;
+
+    @BeforeClass
+    public static void init() {
+        emf = Persistence.createEntityManagerFactory("dr-unit-tests");
+        em = emf.createEntityManager();
+        System.setProperty(
+                "org.onap.dmaap.datarouter.provserver.properties",
+                "src/test/resources/h2Database.properties");
+    }
+
+    @AfterClass
+    public static void tearDownClass() {
+        em.clear();
+        em.close();
+        emf.close();
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        proxyServlet = new ProxyServlet();
+        FieldUtils.writeDeclaredField(proxyServlet, "inited", true, true);
+
+        org.apache.http.conn.ssl.SSLSocketFactory sslSocketFactory = PowerMockito.mock(org.apache.http.conn.ssl.SSLSocketFactory.class);
+        Mockito.doNothing().when(sslSocketFactory).setHostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+        Scheme scheme = new Scheme("http", 80, sslSocketFactory);
+        FieldUtils.writeDeclaredField(proxyServlet, "sch", scheme, true);
+
+        PowerMockito.mockStatic(BaseServlet.class);
+        PowerMockito.mockStatic(URLUtilities.class);
+        when(URLUtilities.getPeerPodName()).thenReturn("localhost");
+
+        SynchronizerTask synchronizerTask = SynchronizerTask.getSynchronizer();
+        FieldUtils.writeDeclaredField(synchronizerTask, "podState", 2, true);
+        FieldUtils.writeDeclaredStaticField(BaseServlet.class, "synctask", synchronizerTask, true);
+
+        proxyServlet.init(mock(ServletConfig.class));
+        setHeadersForValidRequest();
+        mockHttpClientForGetRequest();
+    }
+
+    @Test
+    public void Given_Request_Is_HTTP_POST_Exception_Is_Thrown() {
+        proxyServlet.doPost(request, servletResponse);
+    }
+
+    @Test
+    public void Given_Request_Is_HTTP_DELETE_Exception_Is_Thrown() {
+        proxyServlet.doDelete(request, servletResponse);
+    }
+
+    @Test
+    public void Given_Request_Is_HTTP_GET_Exception_Is_Thrown() {
+        proxyServlet.doGet(request, servletResponse);
+    }
+
+    @Test
+    public void Given_Request_Is_HTTP_PUT_Exception_Is_Thrown() {
+        proxyServlet.doPut(request, servletResponse);
+    }
+
+    @Test
+    public void Given_Request_Is_HTTP_GetWithFallBack_Exception_Is_Thrown() {
+        proxyServlet.doGetWithFallback(request, servletResponse);
+    }
+
+    @Test
+    public void Veirfy_Headers_Are_Copied() {
+        HttpResponse proxyResponse = PowerMockito.mock(HttpResponse.class);
+        Header[] headersArray = new Header[2];
+        headersArray[0] = new BasicHeader("cache-control", "public, max-age=86400");
+        headersArray[1] = new BasicHeader("content-type", "text/plain");
+        PowerMockito.when(proxyResponse.getAllHeaders()).thenReturn(headersArray);
+        proxyServlet.copyResponseHeaders(proxyResponse, servletResponse);
+    }
+
+    @Test
+    public void Veirfy_EntitiyContent_Copied() throws IOException {
+        HttpResponse proxyResponse = PowerMockito.mock(HttpResponse.class);
+        HttpEntity entity = PowerMockito.mock(HttpEntity.class);
+        PowerMockito.when(proxyResponse.getEntity()).thenReturn(entity);
+        PowerMockito.when(entity.getContent()).thenReturn(new ByteArrayInputStream("blah".getBytes()));
+        proxyServlet.copyEntityContent(proxyResponse, servletResponse);
+    }
+
+    private void setHeadersForValidRequest() {
+        List<String> headers = new ArrayList<>();
+        headers.add("Content-Type");
+        headers.add("X-DMAAP-DR-ON-BEHALF-OF");
+        headers.add("X-DMAAP-DR-META");
+        Enumeration<String> headerNames = Collections.enumeration(headers);
+        Mockito.when(request.getHeaderNames()).thenReturn(headerNames);
+        Enumeration<String> contentTypeHeader = Collections.enumeration(Collections.singletonList("text/plain"));
+        Enumeration<String> behalfHeader = Collections.enumeration(Collections.singletonList("User1"));
+        Enumeration<String> metaDataHeader = Collections.enumeration(Collections.singletonList("?#@><"));
+        Mockito.when(request.getHeaders("Content-Type")).thenReturn(contentTypeHeader);
+        Mockito.when(request.getHeaders("X-DMAAP-DR-ON-BEHALF-OF")).thenReturn(behalfHeader);
+        Mockito.when(request.getHeaders("X-DMAAP-DR-META")).thenReturn(metaDataHeader);
+    }
+
+    private void mockHttpClientForGetRequest() throws Exception {
+        PowerMockito.when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(response);
+        Mockito.when(request.getRequestURI()).thenReturn("/api");
+        Mockito.when(response.getStatusLine()).thenReturn(statusLine);
+    }
+}