View Javadoc
1   package com.atlassian.activeobjects.internal;
2   
3   import com.atlassian.activeobjects.spi.DatabaseType;
4   import net.java.ao.DatabaseProvider;
5   import net.java.ao.db.ClientDerbyDatabaseProvider;
6   import net.java.ao.db.EmbeddedDerbyDatabaseProvider;
7   import net.java.ao.db.HSQLDatabaseProvider;
8   import net.java.ao.db.MsJdbcSQLServerDatabaseProvider;
9   import net.java.ao.db.MySQLDatabaseProvider;
10  import net.java.ao.db.OracleDatabaseProvider;
11  import net.java.ao.db.PostgreSQLDatabaseProvider;
12  import net.java.ao.db.SQLServerDatabaseProvider;
13  import org.junit.After;
14  import org.junit.Before;
15  import org.junit.Ignore;
16  import org.junit.Rule;
17  import org.junit.Test;
18  import org.junit.rules.ExpectedException;
19  import org.junit.runner.RunWith;
20  import org.mockito.Mock;
21  import org.mockito.junit.MockitoJUnitRunner;
22  
23  import javax.sql.DataSource;
24  import java.sql.Connection;
25  import java.sql.DatabaseMetaData;
26  import java.sql.SQLException;
27  import java.sql.Statement;
28  
29  import static org.junit.Assert.assertEquals;
30  import static org.junit.Assert.assertNotNull;
31  import static org.mockito.Mockito.mock;
32  import static org.mockito.Mockito.when;
33  
34  /**
35   * Testing {@link com.atlassian.activeobjects.internal.JdbcDriverDatabaseProviderFactory}
36   */
37  
38  @RunWith(MockitoJUnitRunner.class)
39  public class JdbcDriverDatabaseProviderFactoryTest {
40      private static final String SOME_UNKOWN_DRIVER = "some unknown driver";
41  
42      @Rule
43      public ExpectedException expectedException = ExpectedException.none();
44  
45      private DatabaseProviderFactory databaseProviderFactory;
46      @Mock
47      private DriverNameExtractor driverNameExtractor;
48  
49      @Before
50      public void setUp() {
51          databaseProviderFactory = new JdbcDriverDatabaseProviderFactory(driverNameExtractor);
52      }
53  
54      @After
55      public void tearDown() {
56          databaseProviderFactory = null;
57          driverNameExtractor = null;
58      }
59  
60      @Test
61      public void testGetDatabaseProviderForUnknownDriver() throws Exception {
62          expectedException.expect(DatabaseProviderNotFoundException.class);
63          databaseProviderFactory.getDatabaseProvider(getMockDataSource(SOME_UNKOWN_DRIVER), DatabaseType.UNKNOWN, null);
64      }
65  
66      @Test
67      public void testGetDatabaseProviderForMySqlDriver() throws Exception {
68          testGetProviderOfTypeForDriverClassName(MySQLDatabaseProvider.class, "MySQL-AB JDBC Driver", DatabaseType.UNKNOWN);
69      }
70  
71      @Test
72      public void testGetDatabaseProviderForMySqlDatabaseType() throws Exception {
73          testGetProviderOfTypeForDriverClassName(MySQLDatabaseProvider.class, SOME_UNKOWN_DRIVER, DatabaseType.MYSQL);
74      }
75  
76      @Test
77      public void testGetDatabaseProviderForClientDerbyDriver() throws Exception {
78          testGetProviderOfTypeForDriverClassName(ClientDerbyDatabaseProvider.class, "Apache Derby Embedded JDBC Driver", DatabaseType.UNKNOWN);
79      }
80  
81      @Test
82      public void testGetDatabaseProviderForClientDerbyDatabaseType() throws Exception {
83          testGetProviderOfTypeForDriverClassName(ClientDerbyDatabaseProvider.class, SOME_UNKOWN_DRIVER, DatabaseType.DERBY_NETWORK);
84      }
85  
86      @Test
87      @Ignore
88      public void testGetDatabaseProviderForEmbeddedDerbyDriver() throws Exception {
89          testGetProviderOfTypeForDriverClassName(EmbeddedDerbyDatabaseProvider.class, "org.apache.derby.jdbc.EmbeddedDriver", DatabaseType.UNKNOWN);
90      }
91  
92      @Test
93      public void testGetDatabaseProviderForEmbeddedDerbyDatabaseType() throws Exception {
94          testGetProviderOfTypeForDriverClassName(EmbeddedDerbyDatabaseProvider.class, SOME_UNKOWN_DRIVER, DatabaseType.DERBY_EMBEDDED);
95      }
96  
97      @Test
98      public void testGetDatabaseProviderForOracleDriver() throws Exception {
99          testGetProviderOfTypeForDriverClassName(OracleDatabaseProvider.class, "Oracle JDBC driver", DatabaseType.UNKNOWN);
100     }
101 
102     @Test
103     public void testGetDatabaseProviderForOracleDatabaseType() throws Exception {
104         testGetProviderOfTypeForDriverClassName(OracleDatabaseProvider.class, SOME_UNKOWN_DRIVER, DatabaseType.ORACLE);
105     }
106 
107     @Test
108     public void testGetDatabaseProviderForPostgresDriver() throws Exception {
109         testGetProviderOfTypeForDriverClassName(PostgreSQLDatabaseProvider.class, "PostgreSQL Native Driver", DatabaseType.UNKNOWN);
110     }
111 
112     @Test
113     public void testGetDatabaseProviderForPostgresDatabaseType() throws Exception {
114         testGetProviderOfTypeForDriverClassName(PostgreSQLDatabaseProvider.class, SOME_UNKOWN_DRIVER, DatabaseType.POSTGRESQL);
115     }
116 
117     @Test
118     public void testGetDatabaseProviderForMsSqlDriverMsSqlDatabaseType() throws Exception {
119         testGetProviderOfTypeForDriverClassName(MsJdbcSQLServerDatabaseProvider.class, "Microsoft JDBC Driver 4.2 for SQL Server", DatabaseType.MS_SQL);
120     }
121 
122     @Test
123     public void testGetDatabaseProviderForJtdsDriverMsSqlDatabaseType() throws Exception {
124         testGetProviderOfTypeForDriverClassName(SQLServerDatabaseProvider.class, "jTDS Type 4 JDBC Driver for MS SQL Server and Sybase", DatabaseType.MS_SQL);
125     }
126 
127     @Test
128     public void testGetDatabaseProviderForUnknownDriverMsSqlDatabaseType() throws Exception {
129         expectedException.expect(DatabaseProviderNotFoundException.class);
130         testGetProviderOfTypeForDriverClassName(SQLServerDatabaseProvider.class, SOME_UNKOWN_DRIVER, DatabaseType.MS_SQL);
131     }
132 
133     @Test
134     public void testGetDatabaseProviderForMsSqlDriverUnknownDatabaseType() throws Exception {
135         expectedException.expect(DatabaseProviderNotFoundException.class);
136         testGetProviderOfTypeForDriverClassName(SQLServerDatabaseProvider.class, "Microsoft JDBC Driver 4.2 for SQL Server", DatabaseType.UNKNOWN);
137     }
138 
139     @Test
140     public void testGetDatabaseProviderForJtdsDriverUnknownDatabaseType() throws Exception {
141         expectedException.expect(DatabaseProviderNotFoundException.class);
142         testGetProviderOfTypeForDriverClassName(SQLServerDatabaseProvider.class, "jTDS Type 4 JDBC Driver for MS SQL Server and Sybase", DatabaseType.UNKNOWN);
143     }
144 
145     @Test
146     public void testGetDatabaseProviderForHsqlDriver() throws Exception {
147         testGetProviderOfTypeForDriverClassName(HSQLDatabaseProvider.class, "HSQL Database Engine Driver", DatabaseType.UNKNOWN);
148     }
149 
150     @Test
151     public void testGetDatabaseProviderForHsqlDatabaseType() throws Exception {
152         testGetProviderOfTypeForDriverClassName(HSQLDatabaseProvider.class, SOME_UNKOWN_DRIVER, DatabaseType.HSQL);
153     }
154 
155     private void testGetProviderOfTypeForDriverClassName(Class<? extends DatabaseProvider> providerClass, String driver, DatabaseType databaseType) throws Exception {
156         final DataSource dataSource = getMockDataSource(driver);
157 
158         final DatabaseProvider provider = databaseProviderFactory.getDatabaseProvider(dataSource, databaseType, null);
159         assertNotNull(provider);
160         assertEquals(providerClass, provider.getClass());
161     }
162 
163     private DataSource getMockDataSource(String driver) throws SQLException {
164         final DataSource dataSource = mock(DataSource.class);
165         final Connection connection = mock(Connection.class);
166         final DatabaseMetaData metaData = mock(DatabaseMetaData.class);
167         final Statement statement = mock(Statement.class);
168 
169         when(driverNameExtractor.getDriverName(dataSource)).thenReturn(driver);
170         when(dataSource.getConnection()).thenReturn(connection);
171         when(connection.getMetaData()).thenReturn(metaData);
172         when(connection.createStatement()).thenReturn(statement);
173         when(metaData.getIdentifierQuoteString()).thenReturn("");
174         return dataSource;
175     }
176 }