/* * $Id$ * * Copyright 2009 Glencoe Software, Inc. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package ome.server.utests; import java.sql.SQLException; import javax.sql.DataSource; import ome.conditions.DatabaseBusyException; import ome.services.db.SelfCorrectingDataSource; import org.jmock.Mock; import org.jmock.MockObjectTestCase; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @Test(groups = { "db", "ticket:619" }) public class SelfCorrectingDatabaseUnitTest extends MockObjectTestCase { Mock mock; DataSource ds; SelfCorrectingDataSource self; class MySQLException extends SQLException { } @BeforeMethod public void setup() { mock = mock(DataSource.class); ds = (javax.sql.DataSource) mock.proxy(); self = new SelfCorrectingDataSource(ds, 300000L, 0, 3000); mock.expects(atLeastOnce()).will( throwException(new MySQLException())); } @Test(expectedExceptions = DatabaseBusyException.class) public void testSimple() throws Exception { self.getConnection(); } public void testLotsNoRetries() throws Exception { long backOff1 = assertFailsAndReturnBackOff(); long backOff2 = assertFailsAndReturnBackOff(); long backOff3 = assertFailsAndReturnBackOff(); long backOff4 = assertFailsAndReturnBackOff(); assertTrue(0 == backOff1); assertTrue(backOff1 <= backOff2); assertTrue(backOff2 <= backOff3); assertTrue(backOff3 <= backOff4); } public void testLotsWithReductionNoRetries() throws Exception { self = new SelfCorrectingDataSource(ds, 1L, 0, 3000); // Short time long backOff1 = assertFailsAndReturnBackOff(); Thread.sleep(2L); long backOff2 = assertFailsAndReturnBackOff(); Thread.sleep(2L); long backOff3 = assertFailsAndReturnBackOff(); Thread.sleep(2L); long backOff4 = assertFailsAndReturnBackOff(); assertTrue(0 == backOff1); assertTrue(backOff1 == backOff2); assertTrue(backOff2 == backOff3); assertTrue(backOff3 == backOff4); } @Test(timeOut = 30000) public void testRetries() throws Exception { self = new SelfCorrectingDataSource(ds, 30000L, 5, 3000); // 5 retries long backOff1 = assertFailsAndReturnBackOff(); long backOff2 = assertFailsAndReturnBackOff(); assertEquals(2000, backOff1); assertEquals(3000, backOff2); } // Helpers // ========================= private long assertFailsAndReturnBackOff() throws SQLException { try { self.getConnection(); throw new RuntimeException("should throw"); } catch (DatabaseBusyException dbe) { return dbe.backOff; } } }