package ch.ethz.syslab.telesto.test; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Types; import java.util.List; import org.junit.BeforeClass; import org.junit.Test; import org.postgresql.ds.PGPoolingDataSource; import ch.ethz.syslab.telesto.common.config.CONFIG; import ch.ethz.syslab.telesto.common.model.Client; import ch.ethz.syslab.telesto.common.model.ClientMode; import ch.ethz.syslab.telesto.common.model.Queue; import ch.ethz.syslab.telesto.common.protocol.handler.PacketProcessingException; import ch.ethz.syslab.telesto.server.db.Database; import ch.ethz.syslab.telesto.server.db.procedure.ClientProcedure; import ch.ethz.syslab.telesto.server.db.procedure.MessageProcedure; import ch.ethz.syslab.telesto.server.db.procedure.QueueProcedure; public class DBTests { private static int RUNS = 5000; private static Database db; @BeforeClass public static void initialize() throws SQLException { db = new Database(); db.initialize(); String[] stms = new String[] { "ALTER SEQUENCE clients_client_id_seq RESTART", "ALTER SEQUENCE queue_queue_id_seq RESTART", "ALTER SEQUENCE messages_message_id_seq RESTART", "TRUNCATE clients, queues, messages" }; PreparedStatement s = null; for (String stm : stms) { s = db.getConnection().prepareStatement(stm); s.execute(); } s.getConnection().close(); } @Test public void createConnectionPool() throws SQLException { PGPoolingDataSource connectionPool = new PGPoolingDataSource(); connectionPool.setApplicationName(CONFIG.DB_SERVER_NAME); connectionPool.setServerName(CONFIG.DB_SERVER_NAME); connectionPool.setPortNumber(CONFIG.DB_PORT_NUMBER); connectionPool.setDatabaseName(CONFIG.DB_NAME); connectionPool.setUser(CONFIG.DB_USER); connectionPool.setPassword(CONFIG.DB_PASSWORD); connectionPool.setMaxConnections(CONFIG.DB_MAX_CONNECTIONS); Connection c = connectionPool.getConnection(); // request id for user dola with mode 1 CallableStatement s = c.prepareCall("{ ? = call request_id( ? , ? ) }"); s.registerOutParameter(1, Types.INTEGER); s.setString(2, "blubbedi"); s.setInt(3, 1); s.execute(); Integer client_id = s.getInt(1); s.close(); assertNotNull("returned client id is null", client_id); } @Test public void testPreparedStatementGeneration() { for (int i = 0; i < RUNS; i++) { String out = Database.buildCallStatement("method1", 5, true); assertEquals(out, "{ ? = call method1( ? , ? , ? , ? , ? ) }"); } String out = Database.buildCallStatement("method2", 0, false); assertEquals(out, "{ call method2() }"); out = Database.buildCallStatement("method3", 0, true); assertEquals(out, "{ ? = call method3() }"); out = Database.buildCallStatement("method4", 2, false); assertEquals(out, "{ call method4( ? , ? ) }"); } @Test public void testManySimpleProcedures() throws PacketProcessingException { for (int i = 2; i < RUNS; i++) { db.callSimpleProcedure(ClientProcedure.REQUEST_ID, "dola " + i, ClientMode.FULL.getByteValue()); } } @Test public void testClientProcedure1() throws PacketProcessingException { int id = db.callSimpleProcedure(ClientProcedure.REQUEST_ID, "dola", ClientMode.FULL.getByteValue()); List<Client> result = db.callClientProcedure(ClientProcedure.IDENTIFY, id); assertEquals(1, result.size()); assertEquals("dola", result.get(0).name); assertEquals(ClientMode.FULL, result.get(0).mode); } @Test public void testQueueCreation() throws PacketProcessingException { String[] names = new String[] { "oneWayQueue", "requestResponsePairQueue", "serviceQueue" }; // queue_id, queue_name for (String name : names) { List<Queue> queues = db.callQueueProcedure(QueueProcedure.CREATE_QUEUE, name); assertEquals(1, queues.size()); assertEquals(name, queues.get(0).name); } } @Test public void testMessageInsert() throws PacketProcessingException { List<Queue> queues = db.callQueueProcedure(QueueProcedure.CREATE_QUEUE, "messageInsertTestQueue"); int queueId = queues.get(0).id; // queue_id, sender_id, receiver_id, context, priority, message int insertedQueueId = db.callSimpleProcedure(MessageProcedure.PUT_MESSAGE, queueId, 1, null, null, 10, "hallo"); assertEquals(queueId, insertedQueueId); } @Test public void testMultiMessageInsert() throws PacketProcessingException { Integer[] queuesToInsert = new Integer[3]; for (int i = 0; i < 3; i++) { List<Queue> queues = db.callQueueProcedure(QueueProcedure.CREATE_QUEUE, "messageInsertTestQueue" + i); queuesToInsert[i] = queues.get(0).id; } // queue_id, sender_id, receiver_id, context, priority, message List<Integer> queues = db.callIntegerListProcedure(MessageProcedure.PUT_MESSAGES, queuesToInsert, 1, null, null, 10, "ich bin in Queue 1, 2 und 3"); assertArrayEquals(queuesToInsert, queues.toArray()); } @Test public void testSelectingProcedure2() throws PacketProcessingException { String queueName = "first Queue"; List<Queue> result = db.callQueueProcedure(QueueProcedure.CREATE_QUEUE, queueName); assertEquals(result.size(), 1); assertEquals(result.get(0).name, queueName); } }