/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ package org.ops4j.pax.jdbc.config.impl; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.capture; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import static org.junit.Assert.assertEquals; import java.sql.SQLException; import java.util.Dictionary; import java.util.Hashtable; import java.util.Properties; import javax.sql.ConnectionPoolDataSource; import javax.sql.DataSource; import javax.sql.XADataSource; import org.easymock.Capture; import org.easymock.EasyMock; import org.easymock.IMocksControl; import org.junit.Test; import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceRegistration; import org.osgi.service.cm.ConfigurationException; import org.osgi.service.jdbc.DataSourceFactory; @SuppressWarnings({ "rawtypes", "unchecked" }) public class DataSourceRegistrationTest { private static final String H2_DRIVER_CLASS = "org.h2.Driver"; @Test public void testPublishedAndUnpublished() throws ConfigurationException, InvalidSyntaxException, SQLException { Capture<Properties> capturedDsProps = EasyMock.newCapture(); Capture<Dictionary> capturedServiceProps = EasyMock.newCapture(); IMocksControl c = EasyMock.createControl(); BundleContext context = c.createMock(BundleContext.class); final DataSourceFactory dsf = c.createMock(DataSourceFactory.class); // Expect that a DataSource is created using the DataSourceFactory DataSource ds = c.createMock(DataSource.class); expect(dsf.createDataSource(capture(capturedDsProps))).andReturn(ds); // Expect DataSource is registered as a service ServiceRegistration dsSreg = c.createMock(ServiceRegistration.class); expect( context.registerService(eq(DataSource.class.getName()), eq(ds), capture(capturedServiceProps))).andReturn(dsSreg); // create and publish the datasource c.replay(); Dictionary<String, String> properties = new Hashtable<String, String>(); properties.put(DataSourceFactory.OSGI_JDBC_DRIVER_CLASS, H2_DRIVER_CLASS); properties.put(DataSourceFactory.JDBC_DATABASE_NAME, "mydbname"); properties.put(DataSourceFactory.JDBC_DATASOURCE_NAME, "myDsName"); DataSourceRegistration publisher = new DataSourceRegistration(context, dsf, properties, properties, null); c.verify(); // Check that correct properties were sent to DataSourceFactory Properties dsProps = capturedDsProps.getValue(); assertEquals("mydbname", dsProps.get(DataSourceFactory.JDBC_DATABASE_NAME)); // Check that correct properties were set on the DataSource service Dictionary serviceProps = capturedServiceProps.getValue(); assertEquals("myDsName", serviceProps.get(DataSourceFactory.JDBC_DATASOURCE_NAME)); assertEquals("myDsName", serviceProps.get("osgi.jndi.service.name")); c.reset(); // Check unpublish unregisters the services dsSreg.unregister(); expectLastCall(); c.replay(); publisher.close(); c.verify(); } @Test public void testPublishedConnectionPoolDS() throws ConfigurationException, InvalidSyntaxException, SQLException { IMocksControl c = EasyMock.createControl(); BundleContext context = c.createMock(BundleContext.class); final DataSourceFactory dsf = c.createMock(DataSourceFactory.class); // Expect that a ConnectionPoolDataSource is created using the DataSourceFactory ConnectionPoolDataSource cpds = c.createMock(ConnectionPoolDataSource.class); expect(dsf.createConnectionPoolDataSource(anyObject(Properties.class))).andReturn(cpds); // Expect DataSource is registered as a service ServiceRegistration dsSreg = c.createMock(ServiceRegistration.class); expect( context.registerService(eq(ConnectionPoolDataSource.class.getName()), eq(cpds), anyObject(Dictionary.class))).andReturn(dsSreg); dsSreg.unregister(); expectLastCall(); // create and publish the datasource c.replay(); Dictionary<String, String> properties = new Hashtable<String, String>(); properties.put(DataSourceRegistration.JNDI_SERVICE_NAME, "test"); properties.put(DataSourceRegistration.DATASOURCE_TYPE, ConnectionPoolDataSource.class.getSimpleName()); DataSourceRegistration publisher = new DataSourceRegistration(context, dsf, properties, properties, null); publisher.close(); c.verify(); } @SuppressWarnings("resource") @Test public void testPublishedXADS() throws ConfigurationException, InvalidSyntaxException, SQLException { IMocksControl c = EasyMock.createControl(); BundleContext context = c.createMock(BundleContext.class); final DataSourceFactory dsf = c.createMock(DataSourceFactory.class); // Expect that a ConnectionPoolDataSource is created using the DataSourceFactory XADataSource xads = c.createMock(XADataSource.class); expect(dsf.createXADataSource(anyObject(Properties.class))).andReturn(xads); // Expect DataSource is registered as a service ServiceRegistration dsSreg = c.createMock(ServiceRegistration.class); expect( context.registerService(eq(XADataSource.class.getName()), eq(xads), anyObject(Dictionary.class))).andReturn(dsSreg); // create and publish the datasource c.replay(); Dictionary<String, String> properties = new Hashtable<String, String>(); properties.put(DataSourceRegistration.JNDI_SERVICE_NAME, "test"); properties.put(DataSourceRegistration.DATASOURCE_TYPE, XADataSource.class.getSimpleName()); new DataSourceRegistration(context, dsf, properties, properties, null); c.verify(); } @SuppressWarnings("resource") @Test(expected = IllegalArgumentException.class) public void testError() throws ConfigurationException, InvalidSyntaxException, SQLException { IMocksControl c = EasyMock.createControl(); BundleContext context = c.createMock(BundleContext.class); final DataSourceFactory dsf = c.createMock(DataSourceFactory.class); // create and publish the datasource c.replay(); Dictionary<String, String> properties = new Hashtable<String, String>(); properties.put(DataSourceRegistration.JNDI_SERVICE_NAME, "test"); properties.put(DataSourceRegistration.DATASOURCE_TYPE, "something else"); new DataSourceRegistration(context, dsf, properties, properties, null); c.verify(); } }