killbill-aplcache

test: start a single Mysql instance for all tests To speed

6/8/2012 1:02:11 AM

Details

diff --git a/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestModule.java b/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestModule.java
index 71c35ac..cf56fed 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestModule.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestModule.java
@@ -59,7 +59,7 @@ public class AnalyticsTestModule extends AnalyticsModule {
         install(new DefaultJunctionModule());
 
         // Install the Dao layer
-        final MysqlTestingHelper helper = new MysqlTestingHelper();
+        final MysqlTestingHelper helper = TestWithEmbeddedDB.getMysqlTestingHelper();
         bind(MysqlTestingHelper.class).toInstance(helper);
         final IDBI dbi = helper.getDBI();
         bind(IDBI.class).toInstance(dbi);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestSuite.java b/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestSuite.java
new file mode 100644
index 0000000..489f5a1
--- /dev/null
+++ b/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestSuite.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you 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 com.ning.billing.analytics;
+
+import java.lang.reflect.Method;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+
+public abstract class AnalyticsTestSuite {
+    private static final Logger log = LoggerFactory.getLogger(AnalyticsTestSuite.class);
+
+    @BeforeMethod(alwaysRun = true)
+    public void startTest(final Method method) throws Exception {
+        log.info("***************************************************************************************************");
+        log.info("*** Starting test {}:{}", method.getDeclaringClass().getName(), method.getName());
+        log.info("***************************************************************************************************");
+    }
+
+    @AfterMethod(alwaysRun = true)
+    public void endTest(final Method method) throws Exception {
+        log.info("***************************************************************************************************");
+        log.info("***   Ending test {}:{}", method.getDeclaringClass().getName(), method.getName());
+        log.info("***************************************************************************************************");
+    }
+}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 6037013..06954e1 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -24,11 +24,10 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.UUID;
 
-import org.apache.commons.io.IOUtils;
 import org.joda.time.DateTime;
 import org.testng.Assert;
-import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
@@ -46,6 +45,7 @@ import com.ning.billing.analytics.MockDuration;
 import com.ning.billing.analytics.MockPhase;
 import com.ning.billing.analytics.MockPlan;
 import com.ning.billing.analytics.MockProduct;
+import com.ning.billing.analytics.TestWithEmbeddedDB;
 import com.ning.billing.analytics.dao.BusinessAccountDao;
 import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionDao;
 import com.ning.billing.catalog.MockCatalogModule;
@@ -59,7 +59,6 @@ import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
-import com.ning.billing.dbi.MysqlTestingHelper;
 import com.ning.billing.entitlement.api.user.DefaultSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
@@ -98,13 +97,11 @@ import com.ning.billing.util.tag.dao.TagDefinitionSqlDao;
 import static org.testng.Assert.fail;
 
 @Guice(modules = {AnalyticsTestModule.class, MockCatalogModule.class})
-public class TestAnalyticsService {
-
+public class TestAnalyticsService extends TestWithEmbeddedDB {
     final Product product = new MockProduct("platinum", "subscription", ProductCategory.BASE);
     final Plan plan = new MockPlan("platinum-monthly", product);
     final PlanPhase phase = new MockPhase(PhaseType.EVERGREEN, plan, MockDuration.UNLIMITED(), 25.95);
 
-
     private static final UUID ID = UUID.randomUUID();
     private static final String KEY = "12345";
     private static final String ACCOUNT_KEY = "pierre-12345";
@@ -145,9 +142,6 @@ public class TestAnalyticsService {
     @Inject
     private BusinessAccountDao accountDao;
 
-    @Inject
-    private MysqlTestingHelper helper;
-
     private SubscriptionEvent transition;
     private BusinessSubscriptionTransition expectedTransition;
 
@@ -161,17 +155,17 @@ public class TestAnalyticsService {
     private Catalog catalog;
 
     @BeforeClass(groups = "slow")
-    public void startMysql() throws IOException, ClassNotFoundException, SQLException, EntitlementUserApiException {
-
+    public void setUp() throws IOException, ClassNotFoundException, SQLException, EntitlementUserApiException {
         catalog = catalogService.getFullCatalog();
         ((ZombieControl) catalog).addResult("findPlan", plan);
         ((ZombieControl) catalog).addResult("findPhase", phase);
 
         // Killbill generic setup
-        setupBusAndMySQL();
-
-        helper.cleanupAllTables();
+        bus.start();
+    }
 
+    @BeforeMethod(groups = "slow")
+    public void createMocks() {
         tagDao.create(TAG_ONE, context);
         tagDao.create(TAG_TWO, context);
 
@@ -192,30 +186,6 @@ public class TestAnalyticsService {
         }
     }
 
-    private void setupBusAndMySQL() throws IOException {
-
-        final String analyticsDdl = IOUtils.toString(BusinessSubscriptionTransitionDao.class.getResourceAsStream("/com/ning/billing/analytics/ddl.sql"));
-        final String accountDdl = IOUtils.toString(BusinessSubscriptionTransitionDao.class.getResourceAsStream("/com/ning/billing/account/ddl.sql"));
-        final String entitlementDdl = IOUtils.toString(BusinessSubscriptionTransitionDao.class.getResourceAsStream("/com/ning/billing/entitlement/ddl.sql"));
-        final String invoiceDdl = IOUtils.toString(BusinessSubscriptionTransitionDao.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
-        final String paymentDdl = IOUtils.toString(BusinessSubscriptionTransitionDao.class.getResourceAsStream("/com/ning/billing/payment/ddl.sql"));
-        final String utilDdl = IOUtils.toString(BusinessSubscriptionTransitionDao.class.getResourceAsStream("/com/ning/billing/util/ddl.sql"));
-        final String junctionDdl = IOUtils.toString(BusinessSubscriptionTransitionDao.class.getResourceAsStream("/com/ning/billing/junction/ddl.sql"));
-
-        helper.startMysql();
-        helper.initDb(analyticsDdl);
-        helper.initDb(accountDdl);
-        helper.initDb(entitlementDdl);
-        helper.initDb(invoiceDdl);
-        helper.initDb(paymentDdl);
-        helper.initDb(utilDdl);
-        helper.initDb(junctionDdl);
-
-        helper.cleanupAllTables();
-
-        bus.start();
-    }
-
     private void createSubscriptionTransitionEvent(final Account account) throws EntitlementUserApiException {
         final SubscriptionBundle bundle = entitlementApi.createBundleForAccount(account.getId(), KEY, context);
 
@@ -289,12 +259,7 @@ public class TestAnalyticsService {
         Assert.assertEquals(paymentDao.getPaymentInfoList(Arrays.asList(invoice.getId())).size(), 1);
     }
 
-    @AfterClass(groups = "slow")
-    public void stopMysql() {
-        helper.stopMysql();
-    }
-
-    @Test(groups = "slow", enabled = true)
+    @Test(groups = "slow")
     public void testRegisterForNotifications() throws Exception {
         // Make sure the service has been instantiated
         Assert.assertEquals(service.getName(), "analytics-service");
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
index 31b9097..de9831f 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
@@ -41,6 +41,7 @@ import com.ning.billing.analytics.MockDuration;
 import com.ning.billing.analytics.MockPhase;
 import com.ning.billing.analytics.MockPlan;
 import com.ning.billing.analytics.MockProduct;
+import com.ning.billing.analytics.TestWithEmbeddedDB;
 import com.ning.billing.analytics.utils.Rounder;
 import com.ning.billing.catalog.api.Catalog;
 import com.ning.billing.catalog.api.CatalogService;
@@ -50,18 +51,16 @@ import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
-import com.ning.billing.dbi.MysqlTestingHelper;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.mock.BrainDeadProxyFactory;
 import com.ning.billing.mock.BrainDeadProxyFactory.ZombieControl;
 import com.ning.billing.util.tag.Tag;
 
-public class TestAnalyticsDao {
+public class TestAnalyticsDao extends TestWithEmbeddedDB {
     private static final UUID EVENT_ID = UUID.randomUUID();
     private static final String EVENT_KEY = "23456";
     private static final String ACCOUNT_KEY = "pierre-143343-vcc";
 
-    private final MysqlTestingHelper helper = new MysqlTestingHelper();
     private final Product product = new MockProduct("platinium", "subscription", ProductCategory.BASE);
     private final Plan plan = new MockPlan("platinum-monthly", product);
     private final PlanPhase phase = new MockPhase(PhaseType.EVERGREEN, plan, MockDuration.UNLIMITED(), 25.95);
@@ -75,17 +74,11 @@ public class TestAnalyticsDao {
     private final Catalog catalog = BrainDeadProxyFactory.createBrainDeadProxyFor(Catalog.class);
 
     @BeforeClass(alwaysRun = true)
-    public void startMysql() throws IOException, ClassNotFoundException, SQLException {
-
+    public void setup() throws IOException, ClassNotFoundException, SQLException {
         ((ZombieControl) catalog).addResult("findPlan", plan);
         ((ZombieControl) catalog).addResult("findPhase", phase);
         ((ZombieControl) catalogService).addResult("getFullCatalog", catalog);
 
-        final String ddl = IOUtils.toString(BusinessSubscriptionTransitionDao.class.getResourceAsStream("/com/ning/billing/analytics/ddl.sql"));
-
-        helper.startMysql();
-        helper.initDb(ddl);
-
         setupBusinessSubscriptionTransition();
         setupBusinessAccount();
     }
@@ -96,7 +89,6 @@ public class TestAnalyticsDao {
         final BusinessSubscription nextSubscription = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, new DateTime(DateTimeZone.UTC), Subscription.SubscriptionState.CANCELLED, UUID.randomUUID(), UUID.randomUUID(), catalog);
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCancelled(plan.getName(), catalog, requestedTimestamp, requestedTimestamp);
 
-
         transition = new BusinessSubscriptionTransition(EVENT_ID, EVENT_KEY, ACCOUNT_KEY, requestedTimestamp, event, prevSubscription, nextSubscription);
 
         final IDBI dbi = helper.getDBI();
@@ -135,17 +127,6 @@ public class TestAnalyticsDao {
         return tag;
     }
 
-    @AfterClass(groups = "slow")
-    public void stopMysql() {
-        helper.stopMysql();
-    }
-
-    @BeforeMethod(groups = "slow")
-    public void cleanup() throws Exception {
-        helper.cleanupTable("bst");
-        helper.cleanupTable("bac");
-    }
-
     @Test(groups = "slow")
     public void testHandleDuplicatedEvents() {
         final BusinessSubscriptionTransition transitionWithNullPrev = new BusinessSubscriptionTransition(
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
index e928caf..f3baf8e 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
@@ -43,7 +43,7 @@ import com.ning.billing.entitlement.events.user.ApiEventType;
 import com.ning.billing.mock.BrainDeadProxyFactory;
 import com.ning.billing.mock.BrainDeadProxyFactory.ZombieControl;
 
-public class TestAnalyticsListener {
+public class TestAnalyticsListener extends AnalyticsTestSuite {
     private static final String KEY = "1234";
     private static final String ACCOUNT_KEY = "pierre-1234";
     private final Currency CURRENCY = Currency.BRL;
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessAccount.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessAccount.java
index 3588d5e..51e5b50 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessAccount.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessAccount.java
@@ -27,7 +27,7 @@ import org.testng.annotations.Test;
 import com.ning.billing.mock.BrainDeadProxyFactory;
 import com.ning.billing.util.tag.Tag;
 
-public class TestBusinessAccount {
+public class TestBusinessAccount extends AnalyticsTestSuite {
     private BusinessAccount account;
 
     @BeforeMethod(alwaysRun = true)
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscription.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscription.java
index dff0c53..f9f7df1 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscription.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscription.java
@@ -36,7 +36,7 @@ import com.ning.billing.mock.BrainDeadProxyFactory.ZombieControl;
 
 import static com.ning.billing.catalog.api.Currency.USD;
 
-public class TestBusinessSubscription {
+public class TestBusinessSubscription extends AnalyticsTestSuite {
     private final Duration MONTHLY = MockDuration.MONHTLY();
     private final Duration YEARLY = MockDuration.YEARLY();
     final Object[][] catalogMapping = {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionEvent.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionEvent.java
index 79d01d9..f7433e5 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionEvent.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionEvent.java
@@ -32,7 +32,7 @@ import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.mock.BrainDeadProxyFactory;
 import com.ning.billing.mock.BrainDeadProxyFactory.ZombieControl;
 
-public class TestBusinessSubscriptionEvent {
+public class TestBusinessSubscriptionEvent extends AnalyticsTestSuite {
     private Product product;
     private Plan plan;
     private PlanPhase phase;
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransition.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransition.java
index c72692e..8bc9caf 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransition.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransition.java
@@ -37,7 +37,7 @@ import com.ning.billing.mock.BrainDeadProxyFactory.ZombieControl;
 
 import static com.ning.billing.catalog.api.Currency.USD;
 
-public class TestBusinessSubscriptionTransition {
+public class TestBusinessSubscriptionTransition extends AnalyticsTestSuite {
     private BusinessSubscription prevSubscription;
     private BusinessSubscription nextSubscription;
     private BusinessSubscriptionEvent event;
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestWithEmbeddedDB.java b/analytics/src/test/java/com/ning/billing/analytics/TestWithEmbeddedDB.java
new file mode 100644
index 0000000..ad99469
--- /dev/null
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestWithEmbeddedDB.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you 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 com.ning.billing.analytics;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.sql.SQLException;
+
+import org.apache.commons.io.IOUtils;
+import org.testng.annotations.AfterSuite;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeSuite;
+
+import com.google.common.io.Resources;
+import com.ning.billing.dbi.MysqlTestingHelper;
+
+public abstract class TestWithEmbeddedDB extends AnalyticsTestSuite {
+    protected static final MysqlTestingHelper helper = new MysqlTestingHelper();
+
+    public static MysqlTestingHelper getMysqlTestingHelper() {
+        return helper;
+    }
+
+    @BeforeSuite(groups = "slow")
+    public void startMysql() throws IOException, ClassNotFoundException, SQLException, URISyntaxException {
+        helper.startMysql();
+
+        for (final String pack : new String[]{"account", "analytics", "entitlement", "util", "payment", "invoice", "junction"}) {
+            final String ddl = IOUtils.toString(Resources.getResource("com/ning/billing/" + pack + "/ddl.sql").openStream());
+            helper.initDb(ddl);
+        }
+
+        helper.cleanupAllTables();
+    }
+
+    @BeforeMethod(alwaysRun = true)
+    public void cleanup() {
+        try {
+            helper.cleanupAllTables();
+        } catch (Exception ignored) {
+        }
+    }
+
+    @AfterSuite(groups = "slow")
+    public void shutdownMysql() throws IOException, ClassNotFoundException, SQLException, URISyntaxException {
+        try {
+            helper.cleanupAllTables();
+            helper.stopMysql();
+        } catch (Exception ignored) {
+        }
+    }
+}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/utils/TestRounder.java b/analytics/src/test/java/com/ning/billing/analytics/utils/TestRounder.java
index 5b15474..e685641 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/utils/TestRounder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/utils/TestRounder.java
@@ -21,7 +21,9 @@ import java.math.BigDecimal;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-public class TestRounder {
+import com.ning.billing.analytics.AnalyticsTestSuite;
+
+public class TestRounder extends AnalyticsTestSuite {
     @Test(groups = "fast")
     public void testRound() throws Exception {
         Assert.assertEquals(Rounder.round(null), 0.0);