From 4545ce1221e81f15f73cbadaedd1ccfb3ba42c41 Mon Sep 17 00:00:00 2001 From: Michael Hwang Date: Thu, 14 Mar 2019 13:48:02 -0400 Subject: Increase unit test coverage Change-Id: Id1067160082d117f2e48ad1476dfb0b3ba65134b Issue-ID: DCAEGEN2-1263 Signed-off-by: Michael Hwang --- .../onap/dcae/inventory/InventoryApplication.java | 42 ++++--- .../dcae/inventory/daos/InventoryDAOManager.java | 4 +- .../dcae/inventory/InventoryApplicationTest.java | 115 +++++++++++++++++++ .../dcae/inventory/InventoryConfigurationTest.java | 9 +- .../inventory/dbthings/StringListArgumentTest.java | 126 +++++++++++++++++++++ 5 files changed, 279 insertions(+), 17 deletions(-) create mode 100644 src/test/java/org/onap/dcae/inventory/InventoryApplicationTest.java create mode 100644 src/test/java/org/onap/dcae/inventory/dbthings/StringListArgumentTest.java diff --git a/src/main/java/org/onap/dcae/inventory/InventoryApplication.java b/src/main/java/org/onap/dcae/inventory/InventoryApplication.java index 173d66b..7b0911e 100644 --- a/src/main/java/org/onap/dcae/inventory/InventoryApplication.java +++ b/src/main/java/org/onap/dcae/inventory/InventoryApplication.java @@ -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 { 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(); diff --git a/src/main/java/org/onap/dcae/inventory/daos/InventoryDAOManager.java b/src/main/java/org/onap/dcae/inventory/daos/InventoryDAOManager.java index 5bdecfe..77a3e7e 100644 --- a/src/main/java/org/onap/dcae/inventory/daos/InventoryDAOManager.java +++ b/src/main/java/org/onap/dcae/inventory/daos/InventoryDAOManager.java @@ -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 index 0000000..8011452 --- /dev/null +++ b/src/test/java/org/onap/dcae/inventory/InventoryApplicationTest.java @@ -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 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()); + 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); + } + +} diff --git a/src/test/java/org/onap/dcae/inventory/InventoryConfigurationTest.java b/src/test/java/org/onap/dcae/inventory/InventoryConfigurationTest.java index 1848a42..1935d8d 100644 --- a/src/test/java/org/onap/dcae/inventory/InventoryConfigurationTest.java +++ b/src/test/java/org/onap/dcae/inventory/InventoryConfigurationTest.java @@ -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 index 0000000..4fc2c6c --- /dev/null +++ b/src/test/java/org/onap/dcae/inventory/dbthings/StringListArgumentTest.java @@ -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 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> 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> map) throws SQLException { + return null; + } + + @Override + public ResultSet getResultSet() throws SQLException { + return null; + } + + @Override + public ResultSet getResultSet(Map> 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> 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(); + } + } + +} -- cgit 1.2.3-korg