/* * Copyright (c) 2008, SQL Power Group Inc. * * This file is part of SQL Power Library. * * SQL Power Library is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * SQL Power Library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package ca.sqlpower.sql; import java.util.Map; import java.util.TreeMap; import junit.framework.TestCase; import ca.sqlpower.testutil.CountingPropertyChangeListener; public class SPDataSourceTest extends TestCase { JDBCDataSource ds; protected void setUp() throws Exception { super.setUp(); ds = new JDBCDataSource(new PlDotIni()); System.out.println("NEW DATA SOURCE parent type name = "+ds.getPropertiesMap().get(JDBCDataSource.DBCS_CONNECTION_TYPE)); ds.setDisplayName("Regression Test"); ds.getParentType().setJdbcDriver("com.does.not.exist"); ds.setName("test_name"); ds.setOdbcDsn("fake_odbc_dsn"); ds.setPass("fake_password"); ds.setPlDbType("fake_pl_type"); ds.setPlSchema("my_fake_pl_schema"); ds.setUrl("jdbc:fake:fake:fake"); ds.setUser("fake_user"); System.out.println("NEW DATA SOURCE after init parent type name = "+ds.getPropertiesMap().get(JDBCDataSource.DBCS_CONNECTION_TYPE)); } protected void tearDown() throws Exception { super.tearDown(); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.hashCode()' */ public void testHashCode() { // cache the old hash code, change a property, and ensure the hash code changes String oldPass = ds.getPass(); int oldCode = ds.hashCode(); ds.setPass("cows"); assertFalse(oldCode == ds.hashCode()); // now put the property back, and ensure the hash code goes back to its original value ds.setPass(oldPass); assertEquals(oldCode, ds.hashCode()); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.ArchitectDataSource()' */ public void testArchitectDataSource() { assertNotNull(ds.getPropertiesMap()); assertNotNull(ds.getPropertyChangeListeners()); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.put(String, String)' */ public void testPut() { CountingPropertyChangeListener l = new CountingPropertyChangeListener(); ds.addPropertyChangeListener(l); ds.put("test_key", "peek-a-boo!"); assertEquals(1, l.getPropertyChangeCount()); assertEquals("test_key", l.getLastPropertyChange()); assertEquals("peek-a-boo!", ds.get("test_key")); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.getPropertiesMap()' */ public void testGetPropertiesMap() { // ensure clients can't get at a mutable reference to the map! Map m = ds.getPropertiesMap(); assertNotNull(m); try { m.put("won't work", "fooooooey"); fail("client view of property map must be immutable"); } catch (UnsupportedOperationException ex) { assertTrue(true); } } /* * Test method for 'ca.sqlpower.architect.SPDataSource.equals(Object)' */ public void testEquals() { JDBCDataSource ds1 = new JDBCDataSource(new PlDotIni()); JDBCDataSource ds2 = new JDBCDataSource(new PlDotIni()); ds1.setDisplayName("Regression Test"); ds2.setDisplayName("Regression Test"); ds1.getParentType().setJdbcDriver("com.does.not.exist"); ds2.getParentType().setJdbcDriver("com.does.not.exist"); ds1.setName("test_name"); ds2.setName("test_name"); ds1.setOdbcDsn("fake_odbc_dsn"); ds2.setOdbcDsn("fake_odbc_dsn"); ds1.setPass("fake_password"); ds2.setPass("fake_password"); ds1.setPlDbType("fake_pl_type"); ds2.setPlDbType("fake_pl_type"); ds1.setPlSchema("my_fake_pl_schema"); ds2.setPlSchema("my_fake_pl_schema"); ds1.setUrl("jdbc:fake:fake:fake"); ds2.setUrl("jdbc:fake:fake:fake"); ds1.setUser("fake_user"); ds2.setUser("fake_user"); assertEquals(ds1, ds2); // try a known property ds2.setDisplayName("x"); assertFalse(ds1.equals(ds2)); ds2.setDisplayName(ds1.getDisplayName()); assertEquals(ds1, ds2); // try a dynamic property ds1.put("cow", "moo"); assertFalse(ds1.equals(ds2)); } public void testEqualsNull() { assertFalse("This is really to check null comparison is allowed", ds.equals(null)); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.addPropertyChangeListener(PropertyChangeListener)' */ public void testAddPropertyChangeListener() { CountingPropertyChangeListener l = new CountingPropertyChangeListener(); ds.addPropertyChangeListener(l); assertTrue(ds.getPropertyChangeListeners().contains(l)); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.removePropertyChangeListener(PropertyChangeListener)' */ public void testRemovePropertyChangeListener() { CountingPropertyChangeListener l = new CountingPropertyChangeListener(); ds.addPropertyChangeListener(l); assertTrue(ds.getPropertyChangeListeners().contains(l)); ds.removePropertyChangeListener(l); assertFalse(ds.getPropertyChangeListeners().contains(l)); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.setName(String)' */ public void testSetName() { CountingPropertyChangeListener l = new CountingPropertyChangeListener(); ds.addPropertyChangeListener(l); ds.setName("test"); assertEquals(1, l.getPropertyChangeCount()); assertEquals("name", l.getLastPropertyChange()); assertEquals("test", ds.getName()); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.setDisplayName(String)' */ public void testSetDisplayName() { CountingPropertyChangeListener l = new CountingPropertyChangeListener(); ds.addPropertyChangeListener(l); ds.setDisplayName("test"); assertEquals(1, l.getPropertyChangeCount()); assertEquals("name", l.getLastPropertyChange()); assertEquals("test", ds.getDisplayName()); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.setUrl(String)' */ public void testSetUrl() { CountingPropertyChangeListener l = new CountingPropertyChangeListener(); ds.addPropertyChangeListener(l); ds.setUrl("test"); assertEquals(1, l.getPropertyChangeCount()); assertEquals("url", l.getLastPropertyChange()); assertEquals("test", ds.getUrl()); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.setUser(String)' */ public void testSetUser() { CountingPropertyChangeListener l = new CountingPropertyChangeListener(); ds.addPropertyChangeListener(l); ds.setUser("test"); assertEquals(1, l.getPropertyChangeCount()); assertEquals("user", l.getLastPropertyChange()); assertEquals("test", ds.getUser()); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.setPass(String)' */ public void testSetPass() { CountingPropertyChangeListener l = new CountingPropertyChangeListener(); ds.addPropertyChangeListener(l); ds.setPass("test"); assertEquals(1, l.getPropertyChangeCount()); assertEquals("pass", l.getLastPropertyChange()); assertEquals("test", ds.getPass()); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.setPlSchema(String)' */ public void testSetPlSchema() { CountingPropertyChangeListener l = new CountingPropertyChangeListener(); ds.addPropertyChangeListener(l); ds.setPlSchema("test"); assertEquals(1, l.getPropertyChangeCount()); assertEquals("plSchema", l.getLastPropertyChange()); assertEquals("test", ds.getPlSchema()); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.setPlDbType(String)' */ public void testSetPlDbType() { CountingPropertyChangeListener l = new CountingPropertyChangeListener(); ds.addPropertyChangeListener(l); ds.setPlDbType("test"); assertEquals(1, l.getPropertyChangeCount()); assertEquals("plDbType", l.getLastPropertyChange()); assertEquals("test", ds.getPlDbType()); } /* * Test method for 'ca.sqlpower.architect.SPDataSource.setOdbcDsn(String)' */ public void testSetOdbcDsn() { CountingPropertyChangeListener l = new CountingPropertyChangeListener(); ds.addPropertyChangeListener(l); ds.setOdbcDsn("test"); assertEquals(1, l.getPropertyChangeCount()); assertEquals("odbcDsn", l.getLastPropertyChange()); assertEquals("test", ds.getOdbcDsn()); } public void testComparator() { // set up identical second data source JDBCDataSource ds2 = new JDBCDataSource(new PlDotIni()); ds2.setParentType(ds.getParentType()); for (String key : ds.getPropertiesMap().keySet()) { ds2.put(key, ds.get(key)); } assertEquals(0, ds.compareTo(ds2)); // test that the display name takes precedence over other properties ds2.setDisplayName("a"); ds2.setUser("z"); assertTrue(ds.compareTo(ds2) > 0); ds2.setDisplayName("z"); ds2.setUser("a"); assertTrue(ds.compareTo(ds2) < 0); } /* The parent type name is just stored in the map as a string. When the parent type's * name changes at runtime, some magic is required to update the parent name in the map * so it matches. */ public void testParentNameSync() { assertEquals(ds.getParentType().getName(), ds.getPropertiesMap().get(JDBCDataSource.DBCS_CONNECTION_TYPE)); ds.getParentType().setName("New Name"); assertEquals(ds.getParentType().getName(), ds.getPropertiesMap().get(JDBCDataSource.DBCS_CONNECTION_TYPE)); } public void testCopyFrom() { JDBCDataSource targetDs = new JDBCDataSource(new PlDotIni()); targetDs.copyFrom(ds); // need to copy all props into a tree map so they're both sorted in the same order Map<Object, Object> sourceMap = new TreeMap<Object, Object>(ds.getPropertiesMap()); Map<Object, Object> targetMap = new TreeMap<Object, Object>(targetDs.getPropertiesMap()); assertEquals(sourceMap.toString(), targetMap.toString()); assertSame(ds.getParentType(), targetDs.getParentType()); } public void testCopyFromFiresNameChange() { CountingPropertyChangeListener pcl = new CountingPropertyChangeListener(); JDBCDataSource targetDs = new JDBCDataSource(new PlDotIni()); targetDs.addPropertyChangeListener(pcl); targetDs.copyFrom(ds); assertEquals(1, pcl.getPropertyChangeCount("name")); } }