killbill-aplcache

beatrix: util: iteration on making our tests more reliable Signed-off-by:

9/28/2017 10:21:05 AM

Details

diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueIntegration.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueIntegration.java
index 7dd3961..af2fc28 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueIntegration.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueIntegration.java
@@ -29,6 +29,7 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
 import org.killbill.billing.ErrorCode;
+import org.killbill.billing.api.FlakyRetryAnalyzer;
 import org.killbill.billing.api.TestApiListener.NextEvent;
 import org.killbill.billing.beatrix.integration.BeatrixIntegrationModule;
 import org.killbill.billing.beatrix.util.InvoiceChecker.ExpectedInvoiceItemCheck;
@@ -1025,7 +1026,8 @@ public class TestOverdueIntegration extends TestOverdueBase {
         checkODState(OverdueWrapper.CLEAR_STATE_NAME);
     }
 
-    @Test(groups = "slow", description = "Test overdue state with total unpaid invoice balance condition")
+    // Flaky, see https://github.com/killbill/killbill/issues/782
+    @Test(groups = "slow", description = "Test overdue state with total unpaid invoice balance condition", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testOverdueStateWithTotalUnpaidInvoiceBalanceCondition() throws Exception {
         // 2012-05-01T00:03:42.000Z
         clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
diff --git a/util/src/main/java/org/killbill/billing/util/glue/CacheProviderBase.java b/util/src/main/java/org/killbill/billing/util/glue/CacheProviderBase.java
index 24f2dbf..222dc7f 100644
--- a/util/src/main/java/org/killbill/billing/util/glue/CacheProviderBase.java
+++ b/util/src/main/java/org/killbill/billing/util/glue/CacheProviderBase.java
@@ -32,6 +32,7 @@ import com.codahale.metrics.Metric;
 import com.codahale.metrics.MetricFilter;
 import com.codahale.metrics.MetricRegistry;
 import com.codahale.metrics.jcache.JCacheGaugeSet;
+import com.google.common.base.Preconditions;
 
 abstract class CacheProviderBase {
 
@@ -61,6 +62,7 @@ abstract class CacheProviderBase {
         final MutableConfiguration<K, V> configuration = new MutableConfiguration<K, V>().setTypes(keyType, valueType)
                                                                                          .setStoreByValue(false); // Store by reference to avoid copying large objects (e.g. catalog)
         final Cache<K, V> cache = cacheManager.createCache(cacheName, configuration);
+        Preconditions.checkState(!cache.isClosed(), "Cache '%s' should not be closed", cacheName);
 
         // Re-create the metrics to support dynamically created caches (e.g. for Shiro)
         metricRegistry.removeMatching(new MetricFilter() {
diff --git a/util/src/main/java/org/killbill/billing/util/glue/Eh107CacheManagerProvider.java b/util/src/main/java/org/killbill/billing/util/glue/Eh107CacheManagerProvider.java
index 95677b2..d5de5cc 100644
--- a/util/src/main/java/org/killbill/billing/util/glue/Eh107CacheManagerProvider.java
+++ b/util/src/main/java/org/killbill/billing/util/glue/Eh107CacheManagerProvider.java
@@ -39,6 +39,7 @@ import com.codahale.metrics.MetricRegistry;
 public class Eh107CacheManagerProvider extends CacheProviderBase implements Provider<CacheManager> {
 
     private static final Logger logger = LoggerFactory.getLogger(Eh107CacheManagerProvider.class);
+    private static final EhcacheLoggingListener ehcacheLoggingListener = new EhcacheLoggingListener();
 
     private final Set<BaseCacheLoader> cacheLoaders;
 
@@ -66,7 +67,9 @@ public class Eh107CacheManagerProvider extends CacheProviderBase implements Prov
             cacheManager = cachingProvider.getCacheManager();
         }
 
-        cacheManager.unwrap(InternalCacheManager.class).registerListener(new EhcacheLoggingListener());
+        // Make sure we start from a clean state - this is mainly useful for tests
+        cacheManager.unwrap(InternalCacheManager.class).deregisterListener(ehcacheLoggingListener);
+        cacheManager.unwrap(InternalCacheManager.class).registerListener(ehcacheLoggingListener);
 
         for (final BaseCacheLoader<?, ?> cacheLoader : cacheLoaders) {
             createCache(cacheManager,