/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.server.sql;
import Sirius.server.property.ServerProperties;
import Sirius.server.search.Query;
import Sirius.server.search.SearchResult;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import de.cismet.remotetesthelper.RemoteTestHelperService;
import de.cismet.remotetesthelper.ws.rest.RemoteTestHelperClient;
import de.cismet.tools.ScriptRunner;
import static org.junit.Assert.*;
/**
* DOCUMENT ME!
*
* @author martin.scholl@cismet.de
* @version $Revision$, $Date$
*/
public class DBConnectionTest {
//~ Static fields/initializers ---------------------------------------------
private static final transient Logger LOG = Logger.getLogger(DBConnectionTest.class);
private static final String TEST = "TEST "; // NOI18N
private static final String TEST_DB_NAME = "dbconnection_test_db";
private static final RemoteTestHelperService service = new RemoteTestHelperClient();
private static final DBClassifier DB_CLASSIFIER = new DBClassifier(
"jdbc:postgresql://kif:5432/"
+ TEST_DB_NAME, // NOI18N
"postgres", // NOI18N
"x", // NOI18N
"org.postgresql.Driver", // NOI18N
5);
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @throws Throwable DOCUMENT ME!
* @throws IllegalStateException DOCUMENT ME!
*/
@BeforeClass
public static void setUpClass() throws Throwable {
final Properties p = new Properties();
p.put("log4j.appender.Remote", "org.apache.log4j.net.SocketAppender");
p.put("log4j.appender.Remote.remoteHost", "localhost");
p.put("log4j.appender.Remote.port", "4445");
p.put("log4j.appender.Remote.locationInfo", "true");
p.put("log4j.rootLogger", "ALL,Remote");
PropertyConfigurator.configure(p);
// drop first in case of cleanup has not been executed before
service.dropDatabase(TEST_DB_NAME);
if (!Boolean.valueOf(service.initCidsSystem(TEST_DB_NAME))) {
throw new IllegalStateException("cannot initilise test db");
}
final ServerProperties props = new ServerProperties(DBConnectionTest.class.getResourceAsStream(
"/Sirius/server/sql/runtime.properties")); // NOI18N
final DBConnectionPool pool = new DBConnectionPool(props);
final ScriptRunner runner = new ScriptRunner(pool.getConnection(), true, false);
final InputStream configAttrSchemaData = DBConnectionTest.class.getResourceAsStream(
"/Sirius/server/sql/cs_config_attr_schema.sql"); // NOI18N
final InputStream configAttrTestData = DBConnectionTest.class.getResourceAsStream(
"/Sirius/server/localserver/user/configAttrTestData.sql"); // NOI18N
final InputStream historyServerTestData = DBConnectionTest.class.getResourceAsStream(
"/Sirius/server/localserver/history/HistoryServerTest.sql"); // NOI18N
final BufferedReader cfgAttrSchemaReader = new BufferedReader(new InputStreamReader(configAttrSchemaData));
final BufferedReader cfgAttrReader = new BufferedReader(new InputStreamReader(configAttrTestData));
final BufferedReader historyReader = new BufferedReader(new InputStreamReader(historyServerTestData));
try {
runner.runScript(cfgAttrSchemaReader);
runner.runScript(cfgAttrReader);
runner.runScript(historyReader);
} finally {
cfgAttrSchemaReader.close();
cfgAttrReader.close();
historyReader.close();
}
pool.shutdown();
}
/**
* DOCUMENT ME!
*
* @throws IllegalStateException DOCUMENT ME!
*/
@AfterClass
public static void tearDownClass() {
if (!Boolean.valueOf(service.dropDatabase(TEST_DB_NAME))) {
throw new IllegalStateException("could not drop test db");
}
}
/**
* DOCUMENT ME!
*/
@Before
public void setUp() {
}
/**
* DOCUMENT ME!
*/
@After
public void tearDown() {
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private String getCurrentMethodName() {
return new Throwable().getStackTrace()[1].getMethodName();
}
/**
* DOCUMENT ME!
*/
@Ignore
@Test
public void testCharToBool() {
if (LOG.isInfoEnabled()) {
LOG.info(TEST + getCurrentMethodName());
}
final String message = "char was: ";
char c = 't';
assertTrue(message + c, DBConnection.charToBool(c));
c = 'T';
assertTrue(message + c, DBConnection.charToBool(c));
c = 'Z';
assertFalse(message + c, DBConnection.charToBool(c));
c = 'x';
assertFalse(message + c, DBConnection.charToBool(c));
c = '1';
assertFalse(message + c, DBConnection.charToBool(c));
}
/**
* DOCUMENT ME!
*/
@Ignore
@Test
public void testStringToBool() {
if (LOG.isInfoEnabled()) {
LOG.info(TEST + getCurrentMethodName());
}
final String message = "String was: ";
final String[] trues = new String[] { "t", "T", "tT", "Tt", "T23asdjk", "t32987tjngĀ§", "T.yjflsajg" };
for (final String s : trues) {
assertTrue(message + s, DBConnection.stringToBool(s));
}
final String[] falses = new String[] { "a", "A", "Aasdf", "afdg4rgf", "..fdas", "///", "\\", "\t", " " };
for (final String s : falses) {
assertFalse(message + s, DBConnection.stringToBool(s));
}
}
/**
* DOCUMENT ME!
*
* @throws Throwable DOCUMENT ME!
*/
@Test
public void testSubmitInternalQueryOK() throws Throwable {
if (LOG.isInfoEnabled()) {
LOG.info(TEST + getCurrentMethodName());
}
final DBConnection con = new DBConnection(DB_CLASSIFIER);
ResultSet set1 = null;
try {
set1 = con.submitInternalQuery(DBConnection.DESC_VERIFY_USER_PW, "admin", "cismet");
if (set1.next()) {
assertEquals("not exactly one user found", 1, set1.getInt(1));
} else {
fail("illegal resultset state");
}
} finally {
DBConnection.closeResultSets(set1);
}
try {
set1 = con.submitInternalQuery(DBConnection.DESC_FETCH_CONFIG_ATTR_KEY_ID, "abc");
if (set1.next()) {
assertEquals("not exactly one key found", 1, set1.getInt(1));
} else {
fail("illegal resultset state");
}
} finally {
DBConnection.closeResultSets(set1);
}
try {
set1 = con.submitInternalQuery(DBConnection.DESC_FETCH_CONFIG_ATTR_DOMAIN_VALUE, 1, 1);
if (set1.next()) {
assertEquals("not exactly one value found", "alphabeth", set1.getString(1));
} else {
fail("illegal resultset state");
}
} finally {
DBConnection.closeResultSets(set1);
}
try {
set1 = con.submitInternalQuery(DBConnection.DESC_FETCH_CONFIG_ATTR_UG_VALUE, 1, 1, 1);
if (set1.next()) {
assertEquals("not exactly one value found", "alphabeth2", set1.getString(1));
} else {
fail("illegal resultset state");
}
} finally {
DBConnection.closeResultSets(set1);
}
try {
set1 = con.submitInternalQuery(DBConnection.DESC_FETCH_CONFIG_ATTR_USER_VALUE, 1, 1, 1, 1);
if (set1.next()) {
assertEquals("not exactly one value found", "alphabeth3", set1.getString(1));
} else {
fail("illegal resultset state");
}
} finally {
DBConnection.closeResultSets(set1);
}
try {
set1 = con.submitInternalQuery(DBConnection.DESC_FETCH_DOMAIN_ID_FROM_DOMAIN_STRING, "LOCAL");
if (set1.next()) {
assertEquals("not exactly one value found", 1, set1.getInt(1));
} else {
fail("illegal resultset state");
}
} finally {
DBConnection.closeResultSets(set1);
}
try {
final Connection jdbccon = con.getConnection();
set1 = jdbccon.createStatement().executeQuery("select id from cs_class where name like 'test2'");
set1.next();
final int classId = set1.getInt(1);
DBConnection.closeResultSets(set1);
set1 = con.submitInternalQuery(DBConnection.DESC_FETCH_HISTORY, classId, 1);
if (set1.next() && set1.next() && set1.next()) {
if (set1.next()) {
fail("too many result rows");
}
} else {
fail("too less result rows");
}
} finally {
DBConnection.closeResultSets(set1);
}
con.close();
}
/**
* DOCUMENT ME!
*
* @throws Throwable DOCUMENT ME!
* @throws IllegalStateException DOCUMENT ME!
*/
@Test
public void testSubmitInternalQueryStresstest() throws Throwable {
if (LOG.isInfoEnabled()) {
LOG.info(TEST + getCurrentMethodName());
}
final DBConnectionPool pool = new DBConnectionPool(DB_CLASSIFIER);
final ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 0; i < 1000; ++i) {
executor.execute(new Runnable() {
@Override
public void run() {
ResultSet set1 = null;
try {
set1 = pool.submitInternalQuery(DBConnection.DESC_VERIFY_USER_PW, "admin", "cismet");
if (set1.next()) {
assertEquals("not exactly one user found", 1, set1.getInt(1));
} else {
fail("illegal resultset state");
}
if (LOG.isDebugEnabled()) {
LOG.debug("finished: " + Thread.currentThread());
}
} catch (final Exception e) {
LOG.error("could not execute", e);
fail("could not execute: " + e);
} finally {
DBConnection.closeResultSets(set1);
}
}
});
}
executor.shutdown();
if (!executor.awaitTermination(30, TimeUnit.SECONDS)) {
throw new IllegalStateException("could not terminate executor, tasks not finished yet");
}
pool.shutdown();
}
/**
* DOCUMENT ME!
*
* @throws Throwable DOCUMENT ME!
*/
@Ignore
@Test
public void testSubmitInternalUpdateOK() throws Throwable {
if (LOG.isInfoEnabled()) {
LOG.info(TEST + getCurrentMethodName());
}
final DBConnection con = new DBConnection(DB_CLASSIFIER);
int result = -1;
Timestamp now = new Timestamp(System.currentTimeMillis());
result = con.submitInternalUpdate(
DBConnection.DESC_INSERT_HISTORY_ENTRY,
1,
1,
1,
1,
now,
"testdata");
assertEquals("unexpected result state", 1, result);
PreparedStatement ps = con.getConnection().prepareStatement("select * from cs_history where valid_from = ?");
ResultSet rs = null;
try {
ps.setObject(1, now);
rs = ps.executeQuery();
assertTrue("no result found", rs.next());
assertFalse("too many results found", rs.next());
} finally {
DBConnection.closeResultSets(rs);
DBConnection.closeStatements(ps);
}
now = new Timestamp(System.currentTimeMillis());
result = con.submitInternalUpdate(
DBConnection.DESC_INSERT_HISTORY_ENTRY,
1,
1,
null,
null,
now,
"testdata");
assertEquals("unexpected result state", 1, result);
ps = con.getConnection()
.prepareStatement(
"select * from cs_history where valid_from = ? and ug_id is null and usr_id is null");
try {
ps.setObject(1, now);
rs = ps.executeQuery();
assertTrue("no result found", rs.next());
assertFalse("too many results found", rs.next());
} finally {
DBConnection.closeResultSets(rs);
DBConnection.closeStatements(ps);
}
con.close();
}
/**
* DOCUMENT ME!
*
* @throws Throwable DOCUMENT ME!
*/
@Ignore
@Test(expected = IllegalArgumentException.class)
public void testSubmitInternalQueryInvalidDescriptor() throws Throwable {
if (LOG.isInfoEnabled()) {
LOG.info(TEST + getCurrentMethodName());
}
final DBConnection con = new DBConnection(DB_CLASSIFIER);
ResultSet set1 = null;
try {
set1 = con.submitInternalQuery("x", "admin", "sb");
} finally {
DBConnection.closeResultSets(set1);
con.close();
}
}
/**
* DOCUMENT ME!
*
* @throws Throwable DOCUMENT ME!
*/
@Ignore
@Test(expected = IllegalArgumentException.class)
public void testSubmitInternalQueryTooManyParams() throws Throwable {
if (LOG.isInfoEnabled()) {
LOG.info(TEST + getCurrentMethodName());
}
final DBConnection con = new DBConnection(DB_CLASSIFIER);
ResultSet set1 = null;
try {
set1 = con.submitInternalQuery(
"verify_user_password",
"admin",
"sb",
"sb");
} finally {
DBConnection.closeResultSets(set1);
con.close();
}
}
/**
* DOCUMENT ME!
*
* @throws Throwable DOCUMENT ME!
*/
@Ignore
@Test(expected = IllegalArgumentException.class)
public void testSubmitInternalQueryTooLessParams() throws Throwable {
if (LOG.isInfoEnabled()) {
LOG.info(TEST + getCurrentMethodName());
}
final DBConnection con = new DBConnection(DB_CLASSIFIER);
ResultSet set1 = null;
try {
set1 = con.submitInternalQuery(
"verify_user_password",
"admin");
} finally {
DBConnection.closeResultSets(set1);
con.close();
}
}
/**
* DOCUMENT ME!
*/
@Ignore
@Test
public void testSubmitQuery_String_ObjectArr() {
if (LOG.isInfoEnabled()) {
LOG.info("TEST " + getCurrentMethodName());
}
}
/**
* DOCUMENT ME!
*/
@Ignore
@Test
public void testSubmitQuery_int_ObjectArr() {
if (LOG.isInfoEnabled()) {
LOG.info("TEST " + getCurrentMethodName());
}
}
/**
* DOCUMENT ME!
*/
@Ignore
@Test
public void testSubmitQuery_Query() {
if (LOG.isInfoEnabled()) {
LOG.info("TEST " + getCurrentMethodName());
}
}
/**
* DOCUMENT ME!
*/
@Ignore
@Test
public void testSubmitUpdate_Query() {
if (LOG.isInfoEnabled()) {
LOG.info("TEST " + getCurrentMethodName());
}
}
/**
* DOCUMENT ME!
*/
@Ignore
@Test
public void testSubmitUpdate_String_ObjectArr() {
if (LOG.isInfoEnabled()) {
LOG.info("TEST " + getCurrentMethodName());
}
}
/**
* DOCUMENT ME!
*/
@Ignore
@Test
public void testSubmitUpdate_int_ObjectArr() {
if (LOG.isInfoEnabled()) {
LOG.info("TEST " + getCurrentMethodName());
}
}
/**
* DOCUMENT ME!
*/
@Ignore
@Test
public void testFetchStatement_String() {
if (LOG.isInfoEnabled()) {
LOG.info("TEST " + getCurrentMethodName());
}
}
/**
* DOCUMENT ME!
*/
@Ignore
@Test
public void testFetchStatement_int() {
if (LOG.isInfoEnabled()) {
LOG.info("TEST " + getCurrentMethodName());
}
}
/**
* DOCUMENT ME!
*/
@Ignore
@Test
public void testGetStatementCache() {
if (LOG.isInfoEnabled()) {
LOG.info("TEST " + getCurrentMethodName());
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
// TODO: enable and resolve this issue
@Ignore
@Test
public void testExecuteQueryUpdateAdminPassword() throws Exception {
if (LOG.isInfoEnabled()) {
LOG.info("TEST " + getCurrentMethodName());
}
final DBConnection con = new DBConnection(DB_CLASSIFIER);
try {
con.executeQuery(new Query(
new SystemStatement(
true,
-1,
"",
false,
SearchResult.OBJECT,
"update cs_usr set password = 'corrupted' where login_name ilike '%admin%'"),
""));
} catch (final Exception e) {
ResultSet set = null;
try {
set = con.executeQuery(new Query(
new SystemStatement(
true,
-1,
"",
false,
SearchResult.OBJECT,
"select password from cs_usr where login_name ilike '%admin%'"),
""));
assertTrue(set.next());
assertFalse("password was corrupted", "corrupted".equals(set.getString(1)));
} finally {
DBConnection.closeResultSets(set);
}
} finally {
con.close();
}
}
/**
* DOCUMENT ME!
*/
@Ignore
@Test
public void testSubmitUpdateBatch_int_ObjectArr() {
if (LOG.isInfoEnabled()) {
LOG.info("TEST " + getCurrentMethodName());
}
}
/**
* DOCUMENT ME!
*/
@Ignore
@Test
public void testSubmitUpdateBatch_String_ObjectArr() {
if (LOG.isInfoEnabled()) {
LOG.info("TEST " + getCurrentMethodName());
}
}
}