/*
* Copyright 2015 JBoss Inc
*
* 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.
*/
package io.apiman.gateway.engine.impl;
import io.apiman.gateway.engine.async.IAsyncResult;
import io.apiman.gateway.engine.async.IAsyncResultHandler;
import io.apiman.gateway.engine.components.jdbc.IJdbcClient;
import io.apiman.gateway.engine.components.jdbc.IJdbcConnection;
import io.apiman.gateway.engine.components.jdbc.IJdbcResultSet;
import io.apiman.gateway.engine.components.jdbc.JdbcOptionsBean;
import java.sql.Driver;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.dbcp.BasicDataSource;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Full test for the default JDBC component.
*
* @author eric.wittmann@redhat.com
*/
@SuppressWarnings("nls")
public class DefaultJdbcComponentTest {
List<Throwable> errors = new ArrayList<>();
@Before
public void before() {
System.out.println("Before!");
errors.clear();
}
@Test
public void testStandalone() throws Throwable {
DefaultJdbcComponent component = new DefaultJdbcComponent();
JdbcOptionsBean config = new JdbcOptionsBean();
config.setAutoCommit(true);
config.setJdbcUrl("jdbc:h2:mem:testStandalone;DB_CLOSE_DELAY=-1");
config.setUsername("sa");
config.setPassword("");
IJdbcClient client = component.createStandalone(config);
doAllTests(client);
}
@Test
public void testShared() throws Throwable {
DefaultJdbcComponent component = new DefaultJdbcComponent();
JdbcOptionsBean config = new JdbcOptionsBean();
config.setAutoCommit(true);
config.setJdbcUrl("jdbc:h2:mem:testShared;DB_CLOSE_DELAY=-1");
config.setUsername("sa");
config.setPassword("");
IJdbcClient client = component.createShared("sharedDS", config);
doAllTests(client);
}
@Test
public void testDataSource() throws Throwable {
DefaultJdbcComponent component = new DefaultJdbcComponent();
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(Driver.class.getName());
ds.setUsername("sa");
ds.setPassword("");
ds.setUrl("jdbc:h2:mem:testDataSource;DB_CLOSE_DELAY=-1");
try {
IJdbcClient client = component.create(ds);
doAllTests(client);
} finally {
try {
ds.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* @param client
*/
private void doAllTests(IJdbcClient client) throws Throwable {
client.connect(new IAsyncResultHandler<IJdbcConnection>() {
@Override
public void handle(IAsyncResult<IJdbcConnection> result) {
if (result.isError()) {
errors.add(result.getError());
} else {
doCreate(result.getResult());
}
}
});
try {
Throwable firstError = null;
for (Throwable throwable : errors) {
System.out.println("------------ ERROR DETECTED ----------------");
throwable.printStackTrace();
System.out.println("------------ -------------- ----------------");
if (firstError == null) {
firstError = throwable;
}
}
if (firstError != null) {
throw firstError;
}
} catch (Throwable t) {
throw t;
}
}
/**
* @param connection
*/
protected void doCreate(final IJdbcConnection connection) {
String createSql = "CREATE TABLE users ("
+ "userId VARCHAR(255) NOT NULL, "
+ "name VARCHAR(255) NOT NULL, "
+ "age INTEGER, "
+ "isAdmin BIT, "
+ "PRIMARY KEY (userId))";
IAsyncResultHandler<Void> afterCreateTable = new IAsyncResultHandler<Void>() {
@Override
public void handle(IAsyncResult<Void> result) {
if (result.isError()) {
errors.add(result.getError());
} else {
System.out.println("Create worked, inserting.");
doInserts(connection);
}
}
};
connection.execute(afterCreateTable, createSql);
}
/**
* @param connection
*/
protected void doInserts(IJdbcConnection connection) {
String insertSql = "INSERT INTO users (userId, name, age, isAdmin) VALUES (?, ?, ?, ?)";
IAsyncResultHandler<Void> dfltHandler = new IAsyncResultHandler<Void>() {
@Override
public void handle(IAsyncResult<Void> result) {
if (result.isError()) {
errors.add(result.getError());
} else {
System.out.println("Insert successful.");
}
}
};
connection.execute(dfltHandler, insertSql, "ewittman", "Eric Wittmann", 17, Boolean.TRUE);
connection.execute(dfltHandler, insertSql, "msavy", "Marc Savy", 50, Boolean.FALSE);
connection.execute(dfltHandler, insertSql, "ryordan", "Rachel Yordan", 92, Boolean.FALSE);
doQueries(connection);
}
/**
* @param connection
*/
private void doQueries(IJdbcConnection connection) {
IAsyncResultHandler<IJdbcResultSet> queryHandler = new IAsyncResultHandler<IJdbcResultSet>() {
@Override
public void handle(IAsyncResult<IJdbcResultSet> result) {
if (result.isError()) {
errors.add(result.getError());
} else {
try {
doQueryAssertions(result.getResult());
} catch (Throwable t) {
errors.add(t);
}
}
}
};
String querySql = "SELECT u.userId, u.name, u.age, u.isAdmin FROM users u WHERE userId = ?";
connection.query(queryHandler, querySql , "ewittman");
}
/**
* @param result
*/
protected void doQueryAssertions(IJdbcResultSet result) {
Assert.assertTrue("Expected the result set to have at least one row.", result.hasNext());
result.next();
Assert.assertEquals("ewittman", result.getString(1));
Assert.assertEquals("Eric Wittmann", result.getString(2));
Assert.assertEquals(new Integer(17), result.getInteger(3));
Assert.assertEquals(Boolean.TRUE, result.getBoolean(4));
Assert.assertFalse(result.hasNext());
}
}