Increase unit test coverage 29/82429/1 dublin 4.0.0-ONAP
authorMichael Hwang <mhwang@research.att.com>
Thu, 14 Mar 2019 17:48:02 +0000 (13:48 -0400)
committerMichael Hwang <mhwang@research.att.com>
Fri, 15 Mar 2019 14:38:47 +0000 (10:38 -0400)
Change-Id: Id1067160082d117f2e48ad1476dfb0b3ba65134b
Issue-ID: DCAEGEN2-1263
Signed-off-by: Michael Hwang <mhwang@research.att.com>
src/main/java/org/onap/dcae/inventory/InventoryApplication.java
src/main/java/org/onap/dcae/inventory/daos/InventoryDAOManager.java
src/test/java/org/onap/dcae/inventory/InventoryApplicationTest.java [new file with mode: 0644]
src/test/java/org/onap/dcae/inventory/InventoryConfigurationTest.java
src/test/java/org/onap/dcae/inventory/dbthings/StringListArgumentTest.java [new file with mode: 0644]

index 173d66b..7b0911e 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * dcae-inventory
  * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2019 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.
@@ -70,27 +70,41 @@ public class InventoryApplication extends Application<InventoryConfiguration> {
        static final Logger debugLogger = LoggerFactory.getLogger("debugLogger");
     static boolean shouldRemoteFetchConfig = false;
 
-    public static void main(String[] args) throws Exception {
-       metricsLogger.info("DCAE inventory application main Startup");
-        // This is here to try to fix a "high" issue caught by Fortify. Did this **plus** setting locale for each of the
-        // string comparisons that use `toUpper` because of this StackOverflow post:
-        // http://stackoverflow.com/questions/38308777/fixed-fortify-scan-locale-changes-are-reappearing
-        Locale.setDefault(Locale.ENGLISH);
-
-        if (args.length < 2 && "server".equals(args[0])) {
+    /**
+     * Parses user's args and makes adjustments if necessary
+     *
+     * NOTE: This function adjusts global state of InventoryApplication - shouldRemoteFetchConfig
+     *
+     * @param userArgs
+     * @return Adjusted user's args or just the user's args untouched either way a String[]
+     */
+    public static String[] processArgs(String[] userArgs) {
+        if (userArgs.length < 2 && "server".equals(userArgs[0])) {
             // When the start command is just "server", this will trigger inventory to look for its configuration
             // from Consul's KV store.  The url is hardcoded here which should be used as the "path" variable into
             // the UrlConfigurationSourceProvider.
-            String[] customArgs = new String[args.length+1];
-            System.arraycopy(args, 0, customArgs, 0, args.length);
-            customArgs[args.length] = "http://consul:8500/v1/kv/inventory?raw=true";
+            String[] customArgs = new String[userArgs.length+1];
+            System.arraycopy(userArgs, 0, customArgs, 0, userArgs.length);
+            customArgs[userArgs.length] = "http://consul:8500/v1/kv/inventory?raw=true";
             shouldRemoteFetchConfig = true;
 
-            new InventoryApplication().run(customArgs);
+            return customArgs;
         } else {
             // You are here because you want to use the default way of configuring inventory - YAML file.
-            new InventoryApplication().run(args);
+            return userArgs;
         }
+    }
+
+    public static void main(String[] args) throws Exception {
+        metricsLogger.info("DCAE inventory application main Startup");
+        // This is here to try to fix a "high" issue caught by Fortify. Did this **plus** setting locale for each of the
+        // string comparisons that use `toUpper` because of this StackOverflow post:
+        // http://stackoverflow.com/questions/38308777/fixed-fortify-scan-locale-changes-are-reappearing
+        Locale.setDefault(Locale.ENGLISH);
+
+        final String[] processedArgs = processArgs(args);
+        new InventoryApplication().run(processedArgs);
+
         // revert to using logback.xml:
         LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
        context.reset();
index 5bdecfe..77a3e7e 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * dcae-inventory
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2019 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.
@@ -113,7 +113,7 @@ public final class InventoryDAOManager {
                 debugLogger.info(String.format("Sql table created: %s", daoClass.getSimpleName()));
             }
             // dcae_service_types DB table has been enhanced to include 2 new columns which need to be added if they don't already exist
-            if ( daoClass.getSimpleName().equals("DCAEServiceTypesDAO") ) {
+            if (daoClass.isInstance(DCAEServiceTypesDAO.class)) {
             if (dao.checkIfApplicationColumnExists()) {
                debugLogger.info(String.format("ApplicationColumn exists: %s", daoClass.getSimpleName()));
             } else {
diff --git a/src/test/java/org/onap/dcae/inventory/InventoryApplicationTest.java b/src/test/java/org/onap/dcae/inventory/InventoryApplicationTest.java
new file mode 100644 (file)
index 0000000..8011452
--- /dev/null
@@ -0,0 +1,115 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * dcae-inventory
+ * ================================================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+
+package org.onap.dcae.inventory;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.dropwizard.db.DataSourceFactory;
+import io.dropwizard.jersey.setup.JerseyEnvironment;
+import io.dropwizard.jetty.setup.ServletEnvironment;
+import io.dropwizard.setup.Bootstrap;
+import io.dropwizard.setup.Environment;
+import org.eclipse.jetty.servlets.CrossOriginFilter;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runner.manipulation.Filter;
+import org.onap.dcae.inventory.daos.InventoryDAOManager;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import javax.servlet.FilterRegistration;
+import java.util.HashMap;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * Created by mhwang on 3/14/19.
+ */
+@PrepareForTest({InventoryDAOManager.class})
+@RunWith(PowerMockRunner.class)
+public class InventoryApplicationTest {
+
+    @Test
+    public void testProcessArgs() {
+        String userArgs[] = {"server"};
+        assertEquals(InventoryApplication.processArgs(userArgs).length, 2);
+
+        userArgs = new String[] {"server some-yaml.yaml"};
+        assertArrayEquals(InventoryApplication.processArgs(userArgs), userArgs);
+
+        userArgs = new String[] {"foo"};
+        assertArrayEquals(InventoryApplication.processArgs(userArgs), userArgs);
+
+        userArgs = new String[] {"foo bar"};
+        assertArrayEquals(InventoryApplication.processArgs(userArgs), userArgs);
+    }
+
+    @Test
+    public void testAppInit() {
+        InventoryApplication app = new InventoryApplication();
+        assertEquals(app.getName(), "dcae-inventory");
+
+        Bootstrap<InventoryConfiguration> mockBootstrap = mock(Bootstrap.class);
+        app.initialize(mockBootstrap);
+
+        InventoryApplication.shouldRemoteFetchConfig = !InventoryApplication.shouldRemoteFetchConfig;
+        app.initialize(mockBootstrap);
+    }
+
+    @Test
+    public void testAppRun() {
+        InventoryApplication app = new InventoryApplication();
+
+        ServletEnvironment mockEnvServlet = mock(ServletEnvironment.class);
+        FilterRegistration.Dynamic mockFilters = mock(FilterRegistration.Dynamic.class);
+        when(mockEnvServlet.addFilter("CORSFilter", CrossOriginFilter.class)).thenReturn(mockFilters);
+        Environment mockEnv = mock(Environment.class);
+        when(mockEnv.servlets()).thenReturn(mockEnvServlet);
+        when(mockEnv.getObjectMapper()).thenReturn(new ObjectMapper());
+        JerseyEnvironment mockEnvJersey = mock(JerseyEnvironment.class);
+        when(mockEnv.jersey()).thenReturn(mockEnvJersey);
+
+        DataSourceFactory mockDSF = mock(DataSourceFactory.class);
+        when(mockDSF.getProperties()).thenReturn(new HashMap<String, String>());
+        InventoryConfiguration.DatabusControllerConnectionConfiguration mockConfigBus = mock(InventoryConfiguration.DatabusControllerConnectionConfiguration.class);
+        InventoryConfiguration mockConfig = mock(InventoryConfiguration.class);
+        when(mockConfig.getDataSourceFactory()).thenReturn(mockDSF);
+        when(mockConfig.getDatabusControllerConnection()).thenReturn(mockConfigBus);
+        when(mockConfigBus.getRequired()).thenReturn(Boolean.FALSE);
+
+        // PowerMockito does bytecode magic to mock static methods and use final classes
+        PowerMockito.mockStatic(InventoryDAOManager.class);
+        InventoryDAOManager mockDaoManager = mock(InventoryDAOManager.class);
+
+        when(InventoryDAOManager.getInstance()).thenReturn(mockDaoManager);
+        doAnswer((a) -> {return null;}).when(mockDaoManager).initialize();
+
+        app.run(mockConfig, mockEnv);
+    }
+
+}
index 1848a42..1935d8d 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * dcae-inventory
  * ================================================================================
- * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2019 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.
@@ -21,6 +21,7 @@
 package org.onap.dcae.inventory;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
 
 import java.io.File;
@@ -55,6 +56,12 @@ public class InventoryConfigurationTest {
             assertEquals(configuration.getDatabusControllerConnection().getHost(), "databus-controller-hostname");
             assertEquals((long) configuration.getDatabusControllerConnection().getPort(), 8443);
             assertEquals(configuration.getDatabusControllerConnection().getRequired(), true);
+            assertEquals(configuration.getDatabusControllerConnection().getMechId(), "some-mech-id");
+            assertEquals(configuration.getDatabusControllerConnection().getPassword(), "some-password");
+
+            configuration.setDefaultName("foo-config");
+            assertEquals(configuration.getDefaultName(), "foo-config");
+            assertNotNull(configuration.getJerseyClientConfiguration());
 
             assertEquals(configuration.getDataSourceFactory().getUrl(), "jdbc:postgresql://127.0.0.1:5432/dcae_inv");
         } catch (Exception e) {
diff --git a/src/test/java/org/onap/dcae/inventory/dbthings/StringListArgumentTest.java b/src/test/java/org/onap/dcae/inventory/dbthings/StringListArgumentTest.java
new file mode 100644 (file)
index 0000000..4fc2c6c
--- /dev/null
@@ -0,0 +1,126 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * dcae-inventory
+ * ================================================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+
+package org.onap.dcae.inventory.dbthings;
+
+import org.junit.Test;
+import org.skife.jdbi.v2.tweak.Argument;
+
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * Created by mhwang on 3/14/19.
+ */
+public class StringListArgumentTest {
+
+    @Test
+    public void testAccepts() {
+        StringListArgument test = new StringListArgument();
+        assertEquals(test.accepts(null, new ArrayList<>(), null), true);
+        assertEquals(test.accepts(null, null, null), false);
+        assertEquals(test.accepts(null, "fail case", null), false);
+    }
+
+    @Test
+    public void testStringListArgumentBuild() {
+        StringListArgument test = new StringListArgument();
+        assertNotNull(test.build(null, null, null));
+
+        List<String> value = new ArrayList<>();
+        Argument func = test.build(null, value, null);
+
+        try {
+            PreparedStatement statement = mock(PreparedStatement.class);
+            Connection conn = mock(Connection.class);
+            when(conn.createArrayOf(any(), any())).thenReturn(new Array() {
+                @Override
+                public String getBaseTypeName() throws SQLException {
+                    return null;
+                }
+
+                @Override
+                public int getBaseType() throws SQLException {
+                    return 0;
+                }
+
+                @Override
+                public Object getArray() throws SQLException {
+                    return null;
+                }
+
+                @Override
+                public Object getArray(Map<String, Class<?>> map) throws SQLException {
+                    return null;
+                }
+
+                @Override
+                public Object getArray(long index, int count) throws SQLException {
+                    return null;
+                }
+
+                @Override
+                public Object getArray(long index, int count, Map<String, Class<?>> map) throws SQLException {
+                    return null;
+                }
+
+                @Override
+                public ResultSet getResultSet() throws SQLException {
+                    return null;
+                }
+
+                @Override
+                public ResultSet getResultSet(Map<String, Class<?>> map) throws SQLException {
+                    return null;
+                }
+
+                @Override
+                public ResultSet getResultSet(long index, int count) throws SQLException {
+                    return null;
+                }
+
+                @Override
+                public ResultSet getResultSet(long index, int count, Map<String, Class<?>> map) throws SQLException {
+                    return null;
+                }
+
+                @Override
+                public void free() throws SQLException {
+
+                }
+            });
+            when(statement.getConnection()).thenReturn(conn);
+            func.apply(0, statement, null);
+        } catch (SQLException e) {
+            fail("Unexpected SQLException");
+            e.printStackTrace();
+        }
+    }
+
+}