Java tutorial
/******************************************************************************* * Copyright (c) 2017, Battelle Memorial Institute All rights reserved. * Battelle Memorial Institute (hereinafter Battelle) hereby grants permission to any person or entity * lawfully obtaining a copy of this software and associated documentation files (hereinafter the * Software) to redistribute and use the Software in source and binary forms, with or without modification. * Such person or entity may use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and may permit others to do so, subject to the following conditions: * Redistributions of source code must retain the above copyright notice, this list of conditions and the * following disclaimers. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or other materials provided with the distribution. * Other than as used herein, neither the name Battelle Memorial Institute or Battelle may be used in any * form whatsoever without the express written consent of Battelle. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * BATTELLE OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * General disclaimer for use with OSS licenses * * This material was prepared as an account of work sponsored by an agency of the United States Government. * Neither the United States Government nor the United States Department of Energy, nor Battelle, nor any * of their employees, nor any jurisdiction or organization that has cooperated in the development of these * materials, makes any warranty, express or implied, or assumes any legal liability or responsibility for * the accuracy, completeness, or usefulness or any information, apparatus, product, software, or process * disclosed, or represents that its use would not infringe privately owned rights. * * Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, * or otherwise does not necessarily constitute or imply its endorsement, recommendation, or favoring by the United * States Government or any agency thereof, or Battelle Memorial Institute. The views and opinions of authors expressed * herein do not necessarily state or reflect those of the United States Government or any agency thereof. * * PACIFIC NORTHWEST NATIONAL LABORATORY operated by BATTELLE for the * UNITED STATES DEPARTMENT OF ENERGY under Contract DE-AC05-76RL01830 ******************************************************************************/ package gov.pnnl.goss.gridappsd; import org.slf4j.Logger; import static org.junit.Assert.*; import java.io.Serializable; import java.sql.SQLException; import java.util.Collection; import java.util.Dictionary; import java.util.HashMap; import java.util.Hashtable; import java.util.List; import java.util.Properties; import javax.jms.Destination; import static gov.pnnl.goss.gridappsd.TestConstants.*; import org.apache.felix.dm.annotation.api.ServiceDependency; import org.apache.http.client.fluent.Request; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import gov.pnnl.goss.gridappsd.data.GridAppsDataSourcesImpl; import pnnl.goss.core.server.DataSourceBuilder; import pnnl.goss.core.server.DataSourceObject; import pnnl.goss.core.server.DataSourcePooledJdbc; import pnnl.goss.core.server.DataSourceRegistry; import pnnl.goss.server.registry.DataSourceRegistryImpl; @RunWith(MockitoJUnitRunner.class) public class GridAppsDataSourcesComponentTests { @Mock Logger logger; @Mock private DataSourceBuilder datasourceBuilder; private DataSourceRegistry datasourceRegistry = new DataSourceRegistryImpl(); @Captor ArgumentCaptor<String> argCaptor; @Mock DataSourcePooledJdbc datasourceObject; @Test /** * Succeeds when the proper number of properties are set on the updated call, and datasourcebuilder.create is called, and the correct registered datasource name is added */ public void registryUpdatedWhen_dataSourcesStarted() { ArgumentCaptor<String> argCaptor = ArgumentCaptor.forClass(String.class); Properties datasourceProperties = new Properties(); GridAppsDataSourcesImpl dataSources = new GridAppsDataSourcesImpl(logger, datasourceBuilder, datasourceRegistry, datasourceProperties); Hashtable<String, String> props = new Hashtable<String, String>(); String datasourceName = "pnnl.goss.sql.datasource.gridappsd"; props.put("name", datasourceName); props.put(DataSourceBuilder.DATASOURCE_USER, "gridappsduser"); props.put(DataSourceBuilder.DATASOURCE_PASSWORD, "gridappsdpw"); props.put(DataSourceBuilder.DATASOURCE_URL, "mysql://lalala"); props.put("driver", "com.mysql.jdbc.Driver"); dataSources.updated(props); assertEquals(5, datasourceProperties.size()); dataSources.start(); //verify datasourceBuilder.create(datasourceName, datasourceProperties); try { Mockito.verify(datasourceBuilder).create(argCaptor.capture(), Mockito.any()); assertEquals(datasourceName, argCaptor.getValue()); } catch (ClassNotFoundException e) { e.printStackTrace(); assert (false); } catch (Exception e) { e.printStackTrace(); assert (false); } //verify registeredDatasources.add(datasourceName); List<String> registeredDatasources = dataSources.getRegisteredDatasources(); assertEquals(1, registeredDatasources.size()); } @Test /** * Succeeds when the registry is empty after the service has been stopped */ public void registryClearedWhen_dataSourcesStopped() { ArgumentCaptor<String> argCaptor = ArgumentCaptor.forClass(String.class); Properties datasourceProperties = new Properties(); GridAppsDataSourcesImpl dataSources = new GridAppsDataSourcesImpl(logger, datasourceBuilder, datasourceRegistry, datasourceProperties); Hashtable<String, String> props = new Hashtable<String, String>(); String datasourceName = "pnnl.goss.sql.datasource.gridappsd"; props.put("name", datasourceName); props.put(DataSourceBuilder.DATASOURCE_USER, "gridappsduser"); props.put(DataSourceBuilder.DATASOURCE_PASSWORD, "gridappsdpw"); props.put(DataSourceBuilder.DATASOURCE_URL, "mysql://lalala"); props.put("driver", "com.mysql.jdbc.Driver"); dataSources.updated(props); assertEquals(5, datasourceProperties.size()); dataSources.start(); //verify datasourceBuilder.create(datasourceName, datasourceProperties); try { Mockito.verify(datasourceBuilder).create(argCaptor.capture(), Mockito.any()); assertEquals(datasourceName, argCaptor.getValue()); } catch (ClassNotFoundException e) { e.printStackTrace(); assert (false); } catch (Exception e) { e.printStackTrace(); assert (false); } //verify registeredDatasources.add(datasourceName); List<String> registeredDatasources = dataSources.getRegisteredDatasources(); assertEquals(1, registeredDatasources.size()); dataSources.stop(); assertEquals(0, dataSources.getRegisteredDatasources().size()); } @Test /** * Succeeds when there was an error because no properties were passed in */ public void errorWhen_dataSourcesStartedWithNoProperties() { ArgumentCaptor<String> argCaptor = ArgumentCaptor.forClass(String.class); Properties datasourceProperties = new Properties(); GridAppsDataSourcesImpl dataSources = new GridAppsDataSourcesImpl(logger, datasourceBuilder, datasourceRegistry, datasourceProperties); try { dataSources.start(); } catch (Exception e) { assertEquals("No datasource name provided when registering data source", e.getMessage()); } } @Test /** * Succeeds when the proper number of properties are set on the updated call, and datasourcebuilder.create is called, and the correct registered datasource name is added */ public void registryKeysExistWhen_dataSourcesStarted() { ArgumentCaptor<String> argCaptor = ArgumentCaptor.forClass(String.class); try { //When datasourceBuilder.create is called add a face datasource object to the datasourceRegistry (similar to what the actual implementation would do) Answer answer = new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { Object[] args = invocation.getArguments(); String dsName = args[0].toString(); datasourceRegistry.add(dsName, datasourceObject); return null; } }; Mockito.doAnswer(answer).when(datasourceBuilder).create(argCaptor.capture(), Mockito.any()); } catch (Exception e) { e.printStackTrace(); } Properties datasourceProperties = new Properties(); GridAppsDataSourcesImpl dataSources = new GridAppsDataSourcesImpl(logger, datasourceBuilder, datasourceRegistry, datasourceProperties); Hashtable<String, String> props = new Hashtable<String, String>(); String datasourceName = "pnnl.goss.sql.datasource.gridappsd"; props.put("name", datasourceName); props.put(DataSourceBuilder.DATASOURCE_USER, "gridappsduser"); props.put(DataSourceBuilder.DATASOURCE_PASSWORD, "gridappsdpw"); props.put(DataSourceBuilder.DATASOURCE_URL, "mysql://lalala"); props.put("driver", "com.mysql.jdbc.Driver"); dataSources.updated(props); assertEquals(5, datasourceProperties.size()); dataSources.start(); //verify datasourceBuilder.create(datasourceName, datasourceProperties); try { Mockito.verify(datasourceBuilder).create(argCaptor.capture(), Mockito.any()); assertEquals(datasourceName, argCaptor.getValue()); } catch (ClassNotFoundException e) { e.printStackTrace(); assert (false); } catch (Exception e) { e.printStackTrace(); assert (false); } //verify registeredDatasources.add(datasourceName); List<String> registeredDatasources = dataSources.getRegisteredDatasources(); assertEquals(1, registeredDatasources.size()); // test get data source keys Collection<String> dsKeys = dataSources.getDataSourceKeys(); assertEquals(datasourceName, dsKeys.toArray()[0]); // test get data source by key DataSourcePooledJdbc obj = dataSources.getDataSourceByKey(datasourceName); assertEquals(datasourceObject, obj); // test get connection by key dataSources.getConnectionByKey(datasourceName); try { Mockito.verify(datasourceObject).getConnection(); } catch (SQLException e) { e.printStackTrace(); } //verify datasourceregistry size assertEquals(1, datasourceRegistry.getAvailable().size()); } }