killbill-memoizeit
Changes
beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueBase.java 4(+4 -0)
beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionCancellation.java 9(+5 -4)
beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionEOTCancellation.java 4(+2 -2)
beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithTags.java 4(+2 -2)
beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoInvoiceDraft.java 4(+4 -0)
beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoInvoiceOffTag.java 4(+4 -0)
beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoPayOff.java 4(+4 -0)
beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithCatalogUpdate.java 4(+4 -0)
beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithWrittenOffTag.java 4(+4 -0)
beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java 8(+8 -0)
catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideBlockDefinitionSqlDao.java 4(+4 -0)
catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseDefinitionSqlDao.java 4(+4 -0)
catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseUsageSqlDao.java 4(+4 -0)
catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePlanDefinitionSqlDao.java 4(+4 -0)
catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePlanPhaseSqlDao.java 4(+4 -0)
catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideTierBlockSqlDao.java 4(+4 -0)
catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideTierDefinitionSqlDao.java 4(+4 -0)
catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideUsageDefinitionSqlDao.java 4(+4 -0)
catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideUsageTierSqlDao.java 4(+4 -0)
entitlement/src/main/resources/org/killbill/billing/entitlement/dao/BlockingStateSqlDao.sql.stg 2(+2 -0)
entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionBundleTimeline.java 4(+4 -0)
invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java 4(+4 -0)
invoice/src/test/java/org/killbill/billing/invoice/generator/TestDefaultInvoiceGenerator.java 4(+4 -0)
invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java 4(+4 -0)
invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java 4(+4 -0)
invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalCapacityInArrear.java 10(+0 -10)
invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalConsumableInArrear.java 10(+0 -10)
invoice/src/test/java/org/killbill/billing/invoice/usage/TestSubscriptionConsumableInArrear.java 5(+0 -5)
overdue/src/test/java/org/killbill/billing/overdue/notification/TestDefaultOverdueCheckPoster.java 4(+4 -0)
payment/src/test/java/org/killbill/billing/payment/api/TestPaymentGatewayApiWithPaymentControl.java 4(+3 -1)
payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCache.java 3(+3 -0)
payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCacheInvalidationCallback.java 3(+3 -0)
payment/src/test/java/org/killbill/billing/payment/core/janitor/TestIncompletePaymentTransactionTaskWithDB.java 7(+7 -0)
payment/src/test/java/org/killbill/billing/payment/core/TestPaymentMethodProcessorRefreshWithDB.java 4(+4 -0)
payment/src/test/java/org/killbill/billing/payment/core/TestPaymentMethodProcessorWithDB.java 53(+28 -25)
payment/src/test/java/org/killbill/billing/payment/invoice/dao/TestInvoicePaymentControlDao.java 4(+4 -0)
payment/src/test/java/org/killbill/billing/payment/provider/TestExternalPaymentProviderPlugin.java 3(+3 -0)
pom.xml 2(+1 -1)
profiles/killbill/src/main/java/org/killbill/billing/server/notifications/PushNotificationListener.java 13(+7 -6)
profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentPluginProperties.java 14(+11 -3)
profiles/killbill/src/test/java/org/killbill/billing/server/security/TestKillbillJdbcTenantRealm.java 4(+4 -0)
profiles/killbill/src/test/java/org/killbill/billing/server/security/TestTenantFilter.java 27(+10 -17)
subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java 4(+4 -0)
subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java 4(+4 -0)
subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java 4(+4 -0)
util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldUserApi.java 7(+7 -0)
util/src/test/java/org/killbill/billing/util/customfield/api/TestDefaultCustomFieldUserApi.java 4(+4 -0)
Details
diff --git a/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java b/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java
index 46a3ea0..be52cb0 100644
--- a/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java
+++ b/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java
@@ -239,4 +239,9 @@ public class DefaultAccountUserApi extends DefaultAccountApiBase implements Acco
public List<AuditLogWithHistory> getAuditLogsWithHistoryForId(final UUID accountId, final AuditLevel auditLevel, final TenantContext tenantContext) throws AccountApiException {
return accountDao.getAuditLogsWithHistoryForId(accountId, auditLevel, internalCallContextFactory.createInternalTenantContext(accountId, tenantContext));
}
+
+ @Override
+ public List<AuditLogWithHistory> getEmailAuditLogsWithHistoryForId(final UUID accountEmailId, final AuditLevel auditLevel, final TenantContext tenantContext) throws AccountApiException {
+ return accountDao.getEmailAuditLogsWithHistoryForId(accountEmailId, auditLevel, internalCallContextFactory.createInternalTenantContext(tenantContext.getAccountId(), tenantContext));
+ }
}
diff --git a/account/src/main/java/org/killbill/billing/account/dao/AccountDao.java b/account/src/main/java/org/killbill/billing/account/dao/AccountDao.java
index 1e0e94c..81de578 100644
--- a/account/src/main/java/org/killbill/billing/account/dao/AccountDao.java
+++ b/account/src/main/java/org/killbill/billing/account/dao/AccountDao.java
@@ -58,4 +58,7 @@ public interface AccountDao extends EntityDao<AccountModelDao, Account, AccountA
List<AccountModelDao> getAccountsByParentId(UUID parentAccountId, InternalTenantContext context);
List<AuditLogWithHistory> getAuditLogsWithHistoryForId(UUID accountId, AuditLevel auditLevel, InternalTenantContext context) throws AccountApiException;
+
+ List<AuditLogWithHistory> getEmailAuditLogsWithHistoryForId(UUID accountEmailId, AuditLevel auditLevel, InternalTenantContext context) throws AccountApiException;
+
}
diff --git a/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java b/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java
index dddab19..909db49 100644
--- a/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java
+++ b/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java
@@ -334,4 +334,15 @@ public class DefaultAccountDao extends EntityDaoBase<AccountModelDao, Account, A
}
});
}
+
+ @Override
+ public List<AuditLogWithHistory> getEmailAuditLogsWithHistoryForId(final UUID accountEmailId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ return transactionalSqlDao.execute(true, new EntitySqlDaoTransactionWrapper<List<AuditLogWithHistory>>() {
+ @Override
+ public List<AuditLogWithHistory> inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) {
+ final AccountEmailSqlDao transactional = entitySqlDaoWrapperFactory.become(AccountEmailSqlDao.class);
+ return auditDao.getAuditLogsWithHistoryForId(transactional, TableName.ACCOUNT_EMAIL, accountEmailId, auditLevel, context);
+ }
+ });
+ }
}
diff --git a/account/src/test/java/org/killbill/billing/account/dao/MockAccountDao.java b/account/src/test/java/org/killbill/billing/account/dao/MockAccountDao.java
index 077ca8d..69e8199 100644
--- a/account/src/test/java/org/killbill/billing/account/dao/MockAccountDao.java
+++ b/account/src/test/java/org/killbill/billing/account/dao/MockAccountDao.java
@@ -193,4 +193,9 @@ public class MockAccountDao extends MockEntityDaoBase<AccountModelDao, Account,
public List<AuditLogWithHistory> getAuditLogsWithHistoryForId(final UUID accountId, final AuditLevel auditLevel, final InternalTenantContext context) throws AccountApiException {
throw new UnsupportedOperationException();
}
+
+ @Override
+ public List<AuditLogWithHistory> getEmailAuditLogsWithHistoryForId(final UUID accountEmailId, final AuditLevel auditLevel, final InternalTenantContext context) throws AccountApiException {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/beatrix/src/main/java/org/killbill/billing/beatrix/extbus/BeatrixListener.java b/beatrix/src/main/java/org/killbill/billing/beatrix/extbus/BeatrixListener.java
index 0c86b09..e8ba29b 100644
--- a/beatrix/src/main/java/org/killbill/billing/beatrix/extbus/BeatrixListener.java
+++ b/beatrix/src/main/java/org/killbill/billing/beatrix/extbus/BeatrixListener.java
@@ -106,6 +106,7 @@ public class BeatrixListener {
try {
final BusEvent externalEvent = computeExtBusEventEntryFromBusInternalEvent(event, internalContext);
if (externalEvent != null) {
+ log.info("Sending extBusEvent='{}' from busEvent='{}'", externalEvent, event);
externalBus.post(externalEvent);
}
} catch (final EventBusException e) {
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/db/TestDBRouter.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/db/TestDBRouter.java
index a8d4727..94cb0ac 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/db/TestDBRouter.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/db/TestDBRouter.java
@@ -56,6 +56,10 @@ public class TestDBRouter extends TestIntegrationBase {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
this.externalBusCount = new AtomicInteger(0);
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueBase.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueBase.java
index ff36bb8..27268de 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueBase.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueBase.java
@@ -49,6 +49,10 @@ public abstract class TestOverdueBase extends TestIntegrationBase {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
final String configXml = getOverdueConfig();
final InputStream is = new ByteArrayInputStream(configXml.getBytes());
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionCancellation.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionCancellation.java
index a2ea242..569f02f 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionCancellation.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionCancellation.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
* The Billing Project 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
@@ -22,6 +22,7 @@ import java.math.BigDecimal;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
+import org.killbill.billing.api.FlakyRetryAnalyzer;
import org.killbill.billing.api.TestApiListener.NextEvent;
import org.killbill.billing.beatrix.util.InvoiceChecker.ExpectedInvoiceItemCheck;
import org.killbill.billing.catalog.api.BillingPeriod;
@@ -65,7 +66,7 @@ public class TestOverdueWithSubscriptionCancellation extends TestOverdueBase {
return configXml;
}
- @Test(groups = "slow")
+ @Test(groups = "slow", retryAnalyzer = FlakyRetryAnalyzer.class)
public void testCheckSubscriptionCancellation() throws Exception {
clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
@@ -112,7 +113,7 @@ public class TestOverdueWithSubscriptionCancellation extends TestOverdueBase {
assertTrue(cancelledAddon1.getState() == EntitlementState.CANCELLED);
}
- @Test(groups = "slow")
+ @Test(groups = "slow", retryAnalyzer = FlakyRetryAnalyzer.class)
public void testCheckSubscriptionCancellationWithMultipleBundles() throws Exception {
// 2012-05-01T00:03:53.000Z
clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionEOTCancellation.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionEOTCancellation.java
index a91f3b0..16b0e5a 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionEOTCancellation.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionEOTCancellation.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2014-2017 Groupon, Inc
- * Copyright 2014-2017 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
* The Billing Project 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
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithTags.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithTags.java
index 0bbb25e..dbbdf32 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithTags.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueWithTags.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
* The Billing Project 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
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestCustomFieldApi.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestCustomFieldApi.java
index 0025633..88da850 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestCustomFieldApi.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestCustomFieldApi.java
@@ -53,6 +53,10 @@ public class TestCustomFieldApi extends TestIntegrationBase {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
account = createAccountWithNonOsgiPaymentMethod(getAccountData(25));
assertNotNull(account);
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
index e6c094e..7f2648f 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
@@ -324,6 +324,10 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB implemen
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
log.debug("beforeMethod callcontext classLoader = " + (Thread.currentThread().getContextClassLoader() != null ? Thread.currentThread().getContextClassLoader().toString() : "null"));
@@ -352,6 +356,10 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB implemen
@AfterMethod(groups = "slow")
public void afterMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
lifecycle.fireShutdownSequencePriorEventUnRegistration();
busService.getBus().unregister(busHandler);
lifecycle.fireShutdownSequencePostEventUnRegistration();
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoInvoiceDraft.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoInvoiceDraft.java
index aa882fd..7f38be9 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoInvoiceDraft.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoInvoiceDraft.java
@@ -68,6 +68,10 @@ public class TestIntegrationWithAutoInvoiceDraft extends TestIntegrationBase {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
account = createAccountWithNonOsgiPaymentMethod(getAccountData(25));
assertNotNull(account);
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoInvoiceOffTag.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoInvoiceOffTag.java
index abf22b8..ec65082 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoInvoiceOffTag.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoInvoiceOffTag.java
@@ -60,6 +60,10 @@ public class TestIntegrationWithAutoInvoiceOffTag extends TestIntegrationBase {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
account = createAccountWithNonOsgiPaymentMethod(getAccountData(25));
assertNotNull(account);
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoPayOff.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoPayOff.java
index 397b50e..f901875 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoPayOff.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithAutoPayOff.java
@@ -53,6 +53,10 @@ public class TestIntegrationWithAutoPayOff extends TestIntegrationBase {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
account = createAccountWithNonOsgiPaymentMethod(getAccountData(25));
assertNotNull(account);
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithCatalogUpdate.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithCatalogUpdate.java
index 05931c8..2553410 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithCatalogUpdate.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithCatalogUpdate.java
@@ -81,6 +81,10 @@ public class TestIntegrationWithCatalogUpdate extends TestIntegrationBase {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
// Set original time
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithWrittenOffTag.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithWrittenOffTag.java
index 7dc81fe..b4173f6 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithWrittenOffTag.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationWithWrittenOffTag.java
@@ -61,6 +61,10 @@ public class TestIntegrationWithWrittenOffTag extends TestIntegrationBase {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
account = createAccountWithNonOsgiPaymentMethod(getAccountData(25));
assertNotNull(account);
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPaymentRefund.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPaymentRefund.java
index a9b8c5a..9b1379b 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPaymentRefund.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPaymentRefund.java
@@ -75,6 +75,10 @@ public class TestPaymentRefund extends TestIntegrationBase {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
invoiceItemCount = 1;
setupRefundTest();
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPaymentWithControl.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPaymentWithControl.java
index 6b56100..7d71472 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPaymentWithControl.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPaymentWithControl.java
@@ -65,6 +65,10 @@ public class TestPaymentWithControl extends TestIntegrationBase {
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
this.testPaymentControlWithControl = new TestPaymentControlPluginApi();
@@ -104,6 +108,10 @@ public class TestPaymentWithControl extends TestIntegrationBase {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
testPaymentControlWithControl.reset();
}
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestTagApi.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestTagApi.java
index e1998a0..9332d5c 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestTagApi.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestTagApi.java
@@ -47,6 +47,10 @@ public class TestTagApi extends TestIntegrationBase {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
account = createAccountWithNonOsgiPaymentMethod(getAccountData(25));
assertNotNull(account);
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithCatalogPlugin.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithCatalogPlugin.java
index 134819d..8978a13 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithCatalogPlugin.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithCatalogPlugin.java
@@ -83,6 +83,10 @@ public class TestWithCatalogPlugin extends TestIntegrationBase {
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
this.testCatalogPluginApi = new TestCatalogPluginApi(priceOverride, internalCallContext, internalCallContextFactory);
@@ -106,6 +110,10 @@ public class TestWithCatalogPlugin extends TestIntegrationBase {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
testCatalogPluginApi.reset();
}
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java
index 38ed77c..53bf21c 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java
@@ -65,6 +65,10 @@ public class TestWithEntilementPlugin extends TestIntegrationBase {
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
this.testEntitlementPluginApi = new TestEntitlementPluginApi();
@@ -88,6 +92,10 @@ public class TestWithEntilementPlugin extends TestIntegrationBase {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
testEntitlementPluginApi.setPlanPhasePriceOverride(null);
}
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithInvoicePlugin.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithInvoicePlugin.java
index 55bb042..c6a2b73 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithInvoicePlugin.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithInvoicePlugin.java
@@ -92,6 +92,10 @@ public class TestWithInvoicePlugin extends TestIntegrationBase {
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
this.testInvoicePluginApi = new TestInvoicePluginApi();
@@ -656,7 +660,7 @@ public class TestWithInvoicePlugin extends TestIntegrationBase {
private void checkRetryBusEvents(final int retryNb, final int expectedFutureInvoiceNotifications) throws NoSuchNotificationQueue {
// Verify notification(s) moved to the retry queue
- Awaitility.await().atMost(5, TimeUnit.SECONDS).until(new Callable<Boolean>() {
+ Awaitility.await().atMost(15, TimeUnit.SECONDS).until(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
final List<NotificationEventWithMetadata> futureInvoiceRetryableBusEvents = getFutureInvoiceRetryableBusEvents();
@@ -668,7 +672,7 @@ public class TestWithInvoicePlugin extends TestIntegrationBase {
private void checkRetryNotifications(final String retryDateTime, final int expectedFutureInvoiceNotifications) throws NoSuchNotificationQueue {
// Verify notification(s) moved to the retry queue
- Awaitility.await().atMost(5, TimeUnit.SECONDS).until(new Callable<Boolean>() {
+ Awaitility.await().atMost(15, TimeUnit.SECONDS).until(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
final List<NotificationEventWithMetadata> futureInvoiceRetryableNotifications = getFutureInvoiceRetryableNotifications();
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTaxItems.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTaxItems.java
index d9b37e5..15ffb45 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTaxItems.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTaxItems.java
@@ -70,6 +70,10 @@ public class TestWithTaxItems extends TestIntegrationBase {
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
this.testInvoicePluginApi = new TestInvoicePluginApi();
@@ -93,6 +97,10 @@ public class TestWithTaxItems extends TestIntegrationBase {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
testInvoicePluginApi.reset();
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideBlockDefinitionSqlDao.java b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideBlockDefinitionSqlDao.java
index f4f6fc0..0583789 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideBlockDefinitionSqlDao.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideBlockDefinitionSqlDao.java
@@ -34,6 +34,10 @@ public class TestCatalogOverrideBlockDefinitionSqlDao extends CatalogTestSuiteWi
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
((DBI) dbi).registerMapper(new LowerToCamelBeanMapperFactory(CatalogOverrideBlockDefinitionModelDao.class));
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseDefinitionSqlDao.java b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseDefinitionSqlDao.java
index 6090a65..1e3a109 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseDefinitionSqlDao.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseDefinitionSqlDao.java
@@ -35,6 +35,10 @@ public class TestCatalogOverridePhaseDefinitionSqlDao extends CatalogTestSuiteWi
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
((DBI) dbi).registerMapper(new LowerToCamelBeanMapperFactory(CatalogOverridePhaseDefinitionModelDao.class));
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseUsageSqlDao.java b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseUsageSqlDao.java
index f32c850..49ecac4 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseUsageSqlDao.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseUsageSqlDao.java
@@ -35,6 +35,10 @@ public class TestCatalogOverridePhaseUsageSqlDao extends CatalogTestSuiteWithEmb
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
((DBI) dbi).registerMapper(new LowerToCamelBeanMapperFactory(CatalogOverridePhaseUsageModelDao.class));
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePlanDefinitionSqlDao.java b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePlanDefinitionSqlDao.java
index 89844d8..9a64412 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePlanDefinitionSqlDao.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePlanDefinitionSqlDao.java
@@ -34,6 +34,10 @@ public class TestCatalogOverridePlanDefinitionSqlDao extends CatalogTestSuiteWit
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
((DBI) dbi).registerMapper(new LowerToCamelBeanMapperFactory(CatalogOverridePlanDefinitionModelDao.class));
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePlanPhaseSqlDao.java b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePlanPhaseSqlDao.java
index 996b186..9d8417a 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePlanPhaseSqlDao.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePlanPhaseSqlDao.java
@@ -36,6 +36,10 @@ public class TestCatalogOverridePlanPhaseSqlDao extends CatalogTestSuiteWithEmbe
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
((DBI) dbi).registerMapper(new LowerToCamelBeanMapperFactory(CatalogOverridePlanPhaseModelDao.class));
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideTierBlockSqlDao.java b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideTierBlockSqlDao.java
index 1f05919..9746363 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideTierBlockSqlDao.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideTierBlockSqlDao.java
@@ -35,6 +35,10 @@ public class TestCatalogOverrideTierBlockSqlDao extends CatalogTestSuiteWithEmbe
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
((DBI) dbi).registerMapper(new LowerToCamelBeanMapperFactory(CatalogOverrideTierBlockModelDao.class));
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideTierDefinitionSqlDao.java b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideTierDefinitionSqlDao.java
index 997d547..ef59adb 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideTierDefinitionSqlDao.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideTierDefinitionSqlDao.java
@@ -33,6 +33,10 @@ import static org.testng.Assert.assertEquals;
public class TestCatalogOverrideTierDefinitionSqlDao extends CatalogTestSuiteWithEmbeddedDB {
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
((DBI) dbi).registerMapper(new LowerToCamelBeanMapperFactory(CatalogOverrideTierDefinitionModelDao.class));
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideUsageDefinitionSqlDao.java b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideUsageDefinitionSqlDao.java
index 222c929..8552b4c 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideUsageDefinitionSqlDao.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideUsageDefinitionSqlDao.java
@@ -36,6 +36,10 @@ public class TestCatalogOverrideUsageDefinitionSqlDao extends CatalogTestSuiteWi
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
((DBI) dbi).registerMapper(new LowerToCamelBeanMapperFactory(CatalogOverrideUsageDefinitionModelDao.class));
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideUsageTierSqlDao.java b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideUsageTierSqlDao.java
index a97e0a8..1560b63 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideUsageTierSqlDao.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideUsageTierSqlDao.java
@@ -35,6 +35,10 @@ public class TestCatalogOverrideUsageTierSqlDao extends CatalogTestSuiteWithEmbe
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
((DBI) dbi).registerMapper(new LowerToCamelBeanMapperFactory(CatalogOverrideUsageTierModelDao.class));
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/TestLimits.java b/catalog/src/test/java/org/killbill/billing/catalog/TestLimits.java
index bd730c4..337404c 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/TestLimits.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/TestLimits.java
@@ -29,6 +29,10 @@ public class TestLimits extends CatalogTestSuiteNoDB {
@BeforeClass(groups = "fast")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
catalog = loader.loadDefaultCatalog(Resources.getResource("WeaponsHireSmall.xml").toString());
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/TestVersionedCatalog.java b/catalog/src/test/java/org/killbill/billing/catalog/TestVersionedCatalog.java
index b70e54f..a6fe002 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/TestVersionedCatalog.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/TestVersionedCatalog.java
@@ -35,6 +35,10 @@ public class TestVersionedCatalog extends CatalogTestSuiteNoDB {
@BeforeClass(groups = "fast")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
vc = loader.loadDefaultCatalog("versionedCatalog");
}
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/dao/ProxyBlockingStateDao.java b/entitlement/src/main/java/org/killbill/billing/entitlement/dao/ProxyBlockingStateDao.java
index bc3a845..aac961f 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/dao/ProxyBlockingStateDao.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/dao/ProxyBlockingStateDao.java
@@ -199,7 +199,7 @@ public class ProxyBlockingStateDao implements BlockingStateDao {
}
@Override
- public BlockingStateModelDao getById(final UUID id, final InternalTenantContext context) {
+ public BlockingStateModelDao getById(final UUID id, final InternalTenantContext context) throws EntitlementApiException {
return delegate.getById(id, context);
}
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/DefaultEntitlementService.java b/entitlement/src/main/java/org/killbill/billing/entitlement/DefaultEntitlementService.java
index 0dcf6f6..00ab6c3 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/DefaultEntitlementService.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/DefaultEntitlementService.java
@@ -175,11 +175,15 @@ public class DefaultEntitlementService implements EntitlementService {
}
}
- private void processBlockingNotification(final BlockingTransitionNotificationKey key, final InternalCallContext internalCallContext) {
+ private void processBlockingNotification(final BlockingTransitionNotificationKey key, final InternalCallContext internalCallContext){
// Check if the blocking state has been deleted since
- if (blockingStateDao.getById(key.getBlockingStateId(), internalCallContext) == null) {
- log.debug("BlockingState {} has been deleted, not sending a bus event", key.getBlockingStateId());
- return;
+ try {
+ if (blockingStateDao.getById(key.getBlockingStateId(), internalCallContext) == null) {
+ log.debug("BlockingState {} has been deleted, not sending a bus event", key.getBlockingStateId());
+ return;
+ }
+ } catch (final EntitlementApiException e) {
+ throw new IllegalStateException(String.format("Unexpected exception when fetching blockingState='%s'", key.getBlockingStateId()), e);
}
final BusEvent event = new DefaultBlockingTransitionInternalEvent(key.getBlockableId(),
diff --git a/entitlement/src/main/resources/org/killbill/billing/entitlement/dao/BlockingStateSqlDao.sql.stg b/entitlement/src/main/resources/org/killbill/billing/entitlement/dao/BlockingStateSqlDao.sql.stg
index 1e6d9dd..f5227a1 100644
--- a/entitlement/src/main/resources/org/killbill/billing/entitlement/dao/BlockingStateSqlDao.sql.stg
+++ b/entitlement/src/main/resources/org/killbill/billing/entitlement/dao/BlockingStateSqlDao.sql.stg
@@ -78,6 +78,7 @@ join (
on t.record_id = tmp.record_id
where t.type = :type
and <accountRecordIdField("t.")> = :accountRecordId
+<AND_CHECK_TENANT("t.")>
<defaultOrderBy("t.")>
;
>>
@@ -99,6 +100,7 @@ join (
) tmp
on t.record_id = tmp.record_id
where <accountRecordIdField("t.")> = :accountRecordId
+<AND_CHECK_TENANT("t.")>
<defaultOrderBy("t.")>
;
>>
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionBundleTimeline.java b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionBundleTimeline.java
index b82d6e8..c54cc1f 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionBundleTimeline.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionBundleTimeline.java
@@ -56,6 +56,10 @@ public class TestDefaultSubscriptionBundleTimeline extends EntitlementTestSuiteN
@BeforeClass(groups = "fast")
protected void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
bundleId = UUID.randomUUID();
bundleExternalKey = bundleId.toString();
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/block/TestBlockingApi.java b/entitlement/src/test/java/org/killbill/billing/entitlement/block/TestBlockingApi.java
index 55a6964..96fb988 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/block/TestBlockingApi.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/block/TestBlockingApi.java
@@ -53,6 +53,10 @@ public class TestBlockingApi extends EntitlementTestSuiteWithEmbeddedDB {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
clock.resetDeltaFromReality();
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java b/invoice/src/main/java/org/killbill/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
index fddc528..7ed4140 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
@@ -78,7 +78,7 @@ public class DefaultInvoiceInternalApi implements InvoiceInternalApi {
return getInvoiceByIdInternal(invoiceId, context);
}
- private DefaultInvoice getInvoiceByIdInternal(final UUID invoiceId, final InternalTenantContext context) {
+ private DefaultInvoice getInvoiceByIdInternal(final UUID invoiceId, final InternalTenantContext context)throws InvoiceApiException {
return new DefaultInvoice(dao.getById(invoiceId, context));
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
index 5550652..23ce2f9 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -207,7 +207,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
return getInvoiceInternal(invoiceId, context);
}
- private DefaultInvoice getInvoiceInternal(final UUID invoiceId, final TenantContext context) {
+ private DefaultInvoice getInvoiceInternal(final UUID invoiceId, final TenantContext context) throws InvoiceApiException {
final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(invoiceId, ObjectType.INVOICE, context);
return new DefaultInvoice(dao.getById(invoiceId, internalTenantContext), getCatalogSafelyForPrettyNames(internalTenantContext));
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
index cacc2ea..5cd89af 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
@@ -222,10 +222,10 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
}
@Override
- public InvoiceModelDao getById(final UUID invoiceId, final InternalTenantContext context) {
+ public InvoiceModelDao getById(final UUID invoiceId, final InternalTenantContext context) throws InvoiceApiException {
final List<Tag> invoicesTags = getInvoicesTags(context);
- return transactionalSqlDao.execute(true, new EntitySqlDaoTransactionWrapper<InvoiceModelDao>() {
+ return transactionalSqlDao.execute(true, InvoiceApiException.class, new EntitySqlDaoTransactionWrapper<InvoiceModelDao>() {
@Override
public InvoiceModelDao inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
final InvoiceSqlDao invoiceSqlDao = entitySqlDaoWrapperFactory.become(InvoiceSqlDao.class);
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java b/invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
index 283421f..890988d 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
@@ -55,6 +55,10 @@ public class TestDefaultInvoiceMigrationApi extends InvoiceTestSuiteWithEmbedded
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
date_migrated = clock.getUTCToday().minusYears(1);
date_regular = clock.getUTCToday();
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestDefaultInvoiceUserApi.java b/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
index d289ef3..9a64ce5 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
@@ -61,6 +61,10 @@ public class TestDefaultInvoiceUserApi extends InvoiceTestSuiteWithEmbeddedDB {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
final Account account = invoiceUtil.createAccount(callContext);
accountId = account.getId();
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestInvoiceFlagBehaviors.java b/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestInvoiceFlagBehaviors.java
index 89b7d85..b37c05a 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestInvoiceFlagBehaviors.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestInvoiceFlagBehaviors.java
@@ -44,6 +44,10 @@ public class TestInvoiceFlagBehaviors extends InvoiceTestSuiteWithEmbeddedDB {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
final Account account = invoiceUtil.createAccount(callContext);
accountId = account.getId();
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java
index c14fc93..dbddbae 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java
@@ -168,10 +168,8 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
try {
invoiceDao.getById(UUID.randomUUID(), context);
Assert.fail();
- } catch (TransactionFailedException e) {
- // TODO FIXME getById defined in EntityDaoBase
- Assert.assertTrue(e.getCause() instanceof InvoiceApiException);
- Assert.assertEquals(((InvoiceApiException) e.getCause()).getCode(), ErrorCode.INVOICE_NOT_FOUND.getCode());
+ } catch (InvoiceApiException e) {
+ Assert.assertEquals(e.getCode(), ErrorCode.INVOICE_NOT_FOUND.getCode());
}
try {
@@ -1010,7 +1008,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
}
@Test(groups = "slow")
- public void testInvoiceCreditWithBalancePositive() throws EntityPersistenceException {
+ public void testInvoiceCreditWithBalancePositive() throws EntityPersistenceException, InvoiceApiException {
final BigDecimal creditAmount = new BigDecimal("2.0");
final BigDecimal expectedBalance = new BigDecimal("3.0");
final boolean expectCBA = false;
@@ -1018,7 +1016,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
}
@Test(groups = "slow")
- public void testInvoiceCreditWithBalanceNegative() throws EntityPersistenceException {
+ public void testInvoiceCreditWithBalanceNegative() throws EntityPersistenceException, InvoiceApiException {
final BigDecimal creditAmount = new BigDecimal("7.0");
final BigDecimal expectedBalance = new BigDecimal("0.0");
final boolean expectCBA = true;
@@ -1026,14 +1024,14 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
}
@Test(groups = "slow")
- public void testInvoiceCreditWithBalanceZero() throws EntityPersistenceException {
+ public void testInvoiceCreditWithBalanceZero() throws EntityPersistenceException, InvoiceApiException {
final BigDecimal creditAmount = new BigDecimal("5.0");
final BigDecimal expectedBalance = new BigDecimal("0.0");
final boolean expectCBA = false;
testInvoiceCreditInternal(creditAmount, expectedBalance, expectCBA);
}
- private void testInvoiceCreditInternal(final BigDecimal creditAmount, final BigDecimal expectedBalance, final boolean expectCBA) throws EntityPersistenceException {
+ private void testInvoiceCreditInternal(final BigDecimal creditAmount, final BigDecimal expectedBalance, final boolean expectCBA) throws EntityPersistenceException, InvoiceApiException {
final UUID accountId = account.getId();
final UUID bundleId = UUID.randomUUID();
@@ -1133,7 +1131,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
}
@Test(groups = "slow")
- public void testGetUnpaidInvoicesByAccountIdWithDraftInvoice() throws EntityPersistenceException {
+ public void testGetUnpaidInvoicesByAccountIdWithDraftInvoice() throws EntityPersistenceException, InvoiceApiException {
final UUID accountId = account.getId();
final UUID bundleId = UUID.randomUUID();
final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
@@ -1760,11 +1758,11 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
}
- private InvoiceItemModelDao createCredit(final UUID accountId, final LocalDate effectiveDate, final BigDecimal creditAmount, final boolean draft) {
+ private InvoiceItemModelDao createCredit(final UUID accountId, final LocalDate effectiveDate, final BigDecimal creditAmount, final boolean draft)throws InvoiceApiException {
return createCredit(accountId, null, effectiveDate, creditAmount, draft);
}
- private InvoiceItemModelDao createCredit(final UUID accountId, @Nullable final UUID invoiceId, final LocalDate effectiveDate, final BigDecimal creditAmount, final boolean draft) {
+ private InvoiceItemModelDao createCredit(final UUID accountId, @Nullable final UUID invoiceId, final LocalDate effectiveDate, final BigDecimal creditAmount, final boolean draft) throws InvoiceApiException {
final InvoiceModelDao invoiceModelDao;
if (invoiceId == null) {
invoiceModelDao = new InvoiceModelDao(accountId, effectiveDate, effectiveDate, Currency.USD, false, draft ? InvoiceStatus.DRAFT : InvoiceStatus.COMMITTED);
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/generator/TestDefaultInvoiceGenerator.java b/invoice/src/test/java/org/killbill/billing/invoice/generator/TestDefaultInvoiceGenerator.java
index 9418c7d..ee9fe6c 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/generator/TestDefaultInvoiceGenerator.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/generator/TestDefaultInvoiceGenerator.java
@@ -108,6 +108,10 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
@BeforeClass(groups = "fast")
protected void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
final Clock clock = new DefaultClock();
this.account = new MockAccountBuilder().name(UUID.randomUUID().toString().substring(1, 8))
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleNoDB.java b/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleNoDB.java
index 278a808..8390365 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleNoDB.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleNoDB.java
@@ -39,6 +39,8 @@ import org.killbill.billing.mock.glue.MockAccountModule;
import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
import org.killbill.billing.mock.glue.MockTagModule;
import org.killbill.billing.platform.api.KillbillConfigSource;
+import org.killbill.billing.util.audit.dao.AuditDao;
+import org.killbill.billing.util.audit.dao.MockAuditDao;
import org.mockito.Mockito;
public class TestInvoiceModuleNoDB extends TestInvoiceModule {
@@ -58,7 +60,7 @@ public class TestInvoiceModuleNoDB extends TestInvoiceModule {
install(new MockNonEntityDaoModule(configSource));
install(new MockTagModule(configSource));
install(new MockAccountModule(configSource));
-
+ bind(AuditDao.class).toInstance(new MockAuditDao());
installCurrencyConversionApi();
}
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java b/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
index c24a19f..cd48d9c 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
@@ -58,6 +58,10 @@ public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
@BeforeClass(groups = "fast")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
config = new ConfigurationObjectFactory(skifeConfigSource).build(TranslatorConfig.class);
templateEngine = new MustacheTemplateEngine();
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java b/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java
index 090b4c6..12e2e8a 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java
@@ -47,6 +47,10 @@ public class TestDefaultInvoiceItemFormatter extends InvoiceTestSuiteNoDB {
@Override
@BeforeClass(groups = "fast")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
config = new ConfigurationObjectFactory(skifeConfigSource).build(TranslatorConfig.class);
templateEngine = new MustacheTemplateEngine();
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/TestHtmlInvoiceGenerator.java b/invoice/src/test/java/org/killbill/billing/invoice/TestHtmlInvoiceGenerator.java
index 70b1cc1..c2796c1 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/TestHtmlInvoiceGenerator.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/TestHtmlInvoiceGenerator.java
@@ -50,6 +50,10 @@ public class TestHtmlInvoiceGenerator extends InvoiceTestSuiteNoDB {
@Override
@BeforeClass(groups = "fast")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
final TranslatorConfig config = new ConfigurationObjectFactory(skifeConfigSource).build(TranslatorConfig.class);
final TemplateEngine templateEngine = new MustacheTemplateEngine();
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceDispatcher.java b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceDispatcher.java
index 682022e..b994b58 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceDispatcher.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceDispatcher.java
@@ -71,6 +71,10 @@ public class TestInvoiceDispatcher extends InvoiceTestSuiteWithEmbeddedDB {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
account = invoiceUtil.createAccount(callContext);
subscription = invoiceUtil.createSubscription();
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalCapacityInArrear.java b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalCapacityInArrear.java
index 43897cc..bd4d5db 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalCapacityInArrear.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalCapacityInArrear.java
@@ -60,16 +60,6 @@ import static org.testng.Assert.assertTrue;
public class TestContiguousIntervalCapacityInArrear extends TestUsageInArrearBase {
- @BeforeClass(groups = "fast")
- protected void beforeClass() throws Exception {
- super.beforeClass();
- }
-
- @BeforeMethod(groups = "fast")
- public void beforeMethod() {
- super.beforeMethod();
- }
-
@Test(groups = "fast")
public void testComputeToBeBilledUsage() {
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalConsumableInArrear.java b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalConsumableInArrear.java
index 5e13615..87642cc 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalConsumableInArrear.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalConsumableInArrear.java
@@ -76,16 +76,6 @@ public class TestContiguousIntervalConsumableInArrear extends TestUsageInArrearB
}
});
- @BeforeClass(groups = "fast")
- protected void beforeClass() throws Exception {
- super.beforeClass();
- }
-
- @BeforeMethod(groups = "fast")
- public void beforeMethod() {
- super.beforeMethod();
- }
-
@Test(groups = "fast")
public void testBilledDetailsForUnitType() throws JsonProcessingException {
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestSubscriptionConsumableInArrear.java b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestSubscriptionConsumableInArrear.java
index 17831a6..c9fe78b 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestSubscriptionConsumableInArrear.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestSubscriptionConsumableInArrear.java
@@ -41,11 +41,6 @@ import static org.testng.Assert.assertTrue;
public class TestSubscriptionConsumableInArrear extends TestUsageInArrearBase {
- @BeforeClass(groups = "fast")
- protected void beforeClass() throws Exception {
- super.beforeClass();
- }
-
@Test(groups = "fast")
public void testComputeInArrearUsageInterval() {
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestUsageInArrearBase.java b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestUsageInArrearBase.java
index 93ca59f..d9ac9f3 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestUsageInArrearBase.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestUsageInArrearBase.java
@@ -66,6 +66,10 @@ public abstract class TestUsageInArrearBase extends InvoiceTestSuiteNoDB {
@BeforeClass(groups = "fast")
protected void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
BCD = 15;
usageName = "foo";
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/NotificationJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/NotificationJson.java
index 40e7c5c..241692a 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/NotificationJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/NotificationJson.java
@@ -1,7 +1,9 @@
/*
* Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -78,4 +80,52 @@ public class NotificationJson {
public String getMetaData() {
return metaData;
}
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("NotificationJson{");
+ sb.append("eventType='").append(eventType).append('\'');
+ sb.append(", accountId=").append(accountId);
+ sb.append(", objectType='").append(objectType).append('\'');
+ sb.append(", objectId=").append(objectId);
+ sb.append(", metaData='").append(metaData).append('\'');
+ sb.append('}');
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ final NotificationJson that = (NotificationJson) o;
+
+ if (eventType != null ? !eventType.equals(that.eventType) : that.eventType != null) {
+ return false;
+ }
+ if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null) {
+ return false;
+ }
+ if (objectType != null ? !objectType.equals(that.objectType) : that.objectType != null) {
+ return false;
+ }
+ if (objectId != null ? !objectId.equals(that.objectId) : that.objectId != null) {
+ return false;
+ }
+ return metaData != null ? metaData.equals(that.metaData) : that.metaData == null;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = eventType != null ? eventType.hashCode() : 0;
+ result = 31 * result + (accountId != null ? accountId.hashCode() : 0);
+ result = 31 * result + (objectType != null ? objectType.hashCode() : 0);
+ result = 31 * result + (objectId != null ? objectId.hashCode() : 0);
+ result = 31 * result + (metaData != null ? metaData.hashCode() : 0);
+ return result;
+ }
}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
index bcb9d1d..ecf1c9d 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
@@ -1434,6 +1434,20 @@ public class AccountResource extends JaxRsResourceBase {
return Response.status(Status.OK).build();
}
+ @TimedResource
+ @GET
+ @Path("/{accountId:" + UUID_PATTERN + "}/" + EMAILS + "/{accountEmailId:" + UUID_PATTERN + "}/" + AUDIT_LOG_WITH_HISTORY)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Retrieve account email audit logs with history by id", response = AuditLogJson.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 404, message = "Account not found")})
+ public Response getAccountEmailAuditLogsWithHistory(@PathParam("accountId") final UUID accountId,
+ @PathParam("accountEmailId") final UUID accountEmailId,
+ @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException {
+ final TenantContext tenantContext = context.createTenantContextWithAccountId(accountId, request);
+ final List<AuditLogWithHistory> auditLogWithHistory = accountUserApi.getEmailAuditLogsWithHistoryForId(accountEmailId, AuditLevel.FULL, tenantContext);
+ return Response.status(Status.OK).entity(getAuditLogsWithHistory(auditLogWithHistory)).build();
+ }
+
@Override
protected ObjectType getObjectType() {
return ObjectType.ACCOUNT;
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CustomFieldResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CustomFieldResource.java
index 69fcd94..92a8f76 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CustomFieldResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CustomFieldResource.java
@@ -18,6 +18,7 @@ package org.killbill.billing.jaxrs.resources;
import java.net.URI;
import java.util.List;
+import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.DefaultValue;
@@ -27,18 +28,23 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
import org.killbill.billing.ObjectType;
+import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.jaxrs.json.AuditLogJson;
import org.killbill.billing.jaxrs.json.CustomFieldJson;
import org.killbill.billing.jaxrs.util.Context;
import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
import org.killbill.billing.payment.api.PaymentApi;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.AuditUserApi;
import org.killbill.billing.util.api.CustomFieldApiException;
import org.killbill.billing.util.api.CustomFieldUserApi;
import org.killbill.billing.util.api.TagUserApi;
import org.killbill.billing.util.audit.AuditLog;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.callcontext.TenantContext;
import org.killbill.billing.util.customfield.CustomField;
import org.killbill.billing.util.entity.Pagination;
@@ -51,6 +57,7 @@ import com.google.inject.Inject;
import com.google.inject.Singleton;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
@@ -124,4 +131,17 @@ public class CustomFieldResource extends JaxRsResourceBase {
},
nextPageUri);
}
+
+ @TimedResource
+ @GET
+ @Path("/{customFieldId:" + UUID_PATTERN + "}/" + AUDIT_LOG_WITH_HISTORY)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Retrieve custom field audit logs with history by id", response = AuditLogJson.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 404, message = "Account not found")})
+ public Response getCustomFieldAuditLogsWithHistory(@PathParam("customFieldId") final UUID customFieldId,
+ @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException {
+ final TenantContext tenantContext = context.createTenantContextNoAccountId(request);
+ final List<AuditLogWithHistory> auditLogWithHistory = customFieldUserApi.getCustomFieldAuditLogsWithHistoryForId(customFieldId, AuditLevel.FULL, tenantContext);
+ return Response.status(Status.OK).entity(getAuditLogsWithHistory(auditLogWithHistory)).build();
+ }
}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
index c95abc4..409b58b 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
@@ -18,9 +18,6 @@
package org.killbill.billing.jaxrs.resources;
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.QueryParam;
-
public interface JaxrsResource {
public static final String API_PREFIX = "";
@@ -196,6 +193,7 @@ public interface JaxrsResource {
public static final String CHARGES = "charges";
public static final String CHARGES_PATH = PREFIX + "/" + INVOICES + "/" + CHARGES;
+ public static final String ATTEMPTS = "attempts";
public static final String PAYMENTS = "payments";
public static final String PAYMENTS_PATH = PREFIX + "/" + PAYMENTS;
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java
index 89e3ac5..3445337 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java
@@ -45,6 +45,7 @@ import org.killbill.billing.ObjectType;
import org.killbill.billing.account.api.Account;
import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.jaxrs.json.AuditLogJson;
import org.killbill.billing.jaxrs.json.CustomFieldJson;
import org.killbill.billing.jaxrs.json.PaymentMethodJson;
import org.killbill.billing.jaxrs.util.Context;
@@ -53,11 +54,13 @@ import org.killbill.billing.payment.api.PaymentApi;
import org.killbill.billing.payment.api.PaymentApiException;
import org.killbill.billing.payment.api.PaymentMethod;
import org.killbill.billing.payment.api.PluginProperty;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.AuditUserApi;
import org.killbill.billing.util.api.CustomFieldApiException;
import org.killbill.billing.util.api.CustomFieldUserApi;
import org.killbill.billing.util.api.TagUserApi;
import org.killbill.billing.util.audit.AccountAuditLogs;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.TenantContext;
import org.killbill.billing.util.entity.Pagination;
@@ -346,6 +349,19 @@ public class PaymentMethodResource extends JaxRsResourceBase {
context.createCallContextNoAccountId(createdBy, reason, comment, request));
}
+ @TimedResource
+ @GET
+ @Path("/{paymentMethodId:" + UUID_PATTERN + "}/" + AUDIT_LOG_WITH_HISTORY)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Retrieve payment method audit logs with history by id", response = AuditLogJson.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 404, message = "Account not found")})
+ public Response getPaymentMethodAuditLogsWithHistory(@PathParam("paymentMethodId") final UUID paymentMethodId,
+ @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException {
+ final TenantContext tenantContext = context.createTenantContextNoAccountId(request);
+ final List<AuditLogWithHistory> auditLogWithHistory = paymentApi.getPaymentMethodAuditLogsWithHistoryForId(paymentMethodId, AuditLevel.FULL, tenantContext);
+ return Response.status(Status.OK).entity(getAuditLogsWithHistory(auditLogWithHistory)).build();
+ }
+
@Override
protected ObjectType getObjectType() {
return ObjectType.PAYMENT_METHOD;
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
index 6c7d14c..9ceeda6 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
@@ -47,6 +47,7 @@ import org.killbill.billing.account.api.Account;
import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountUserApi;
import org.killbill.billing.catalog.api.Currency;
+import org.killbill.billing.jaxrs.json.AuditLogJson;
import org.killbill.billing.jaxrs.json.ComboPaymentTransactionJson;
import org.killbill.billing.jaxrs.json.CustomFieldJson;
import org.killbill.billing.jaxrs.json.PaymentJson;
@@ -60,6 +61,7 @@ import org.killbill.billing.payment.api.PaymentApiException;
import org.killbill.billing.payment.api.PaymentOptions;
import org.killbill.billing.payment.api.PluginProperty;
import org.killbill.billing.payment.api.TransactionType;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.AuditUserApi;
import org.killbill.billing.util.api.CustomFieldApiException;
import org.killbill.billing.util.api.CustomFieldUserApi;
@@ -67,6 +69,7 @@ import org.killbill.billing.util.api.TagApiException;
import org.killbill.billing.util.api.TagDefinitionApiException;
import org.killbill.billing.util.api.TagUserApi;
import org.killbill.billing.util.audit.AccountAuditLogs;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.TenantContext;
import org.killbill.billing.util.entity.Pagination;
@@ -896,6 +899,32 @@ public class PaymentResource extends ComboPaymentResource {
context.createCallContextNoAccountId(createdBy, reason, comment, request));
}
+ @TimedResource
+ @GET
+ @Path("/{paymentId:" + UUID_PATTERN + "}/" + AUDIT_LOG_WITH_HISTORY)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Retrieve payment audit logs with history by id", response = AuditLogJson.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 404, message = "Account not found")})
+ public Response getPaymentAuditLogsWithHistory(@PathParam("paymentId") final UUID paymentId,
+ @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException {
+ final TenantContext tenantContext = context.createTenantContextNoAccountId(request);
+ final List<AuditLogWithHistory> auditLogWithHistory = paymentApi.getPaymentAuditLogsWithHistoryForId(paymentId, AuditLevel.FULL, tenantContext);
+ return Response.status(Status.OK).entity(getAuditLogsWithHistory(auditLogWithHistory)).build();
+ }
+
+ @TimedResource
+ @GET
+ @Path("/" + ATTEMPTS + "/{paymentAttemptId:" + UUID_PATTERN + "}/" + AUDIT_LOG_WITH_HISTORY)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Retrieve payment attempt audit logs with history by id", response = AuditLogJson.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 404, message = "Account not found")})
+ public Response getPaymentAttemptAuditLogsWithHistory(@PathParam("paymentAttemptId") final UUID paymentAttemptId,
+ @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException {
+ final TenantContext tenantContext = context.createTenantContextNoAccountId(request);
+ final List<AuditLogWithHistory> auditLogWithHistory = paymentApi.getPaymentAttemptAuditLogsWithHistoryForId(paymentAttemptId, AuditLevel.FULL, tenantContext);
+ return Response.status(Status.OK).entity(getAuditLogsWithHistory(auditLogWithHistory)).build();
+ }
+
@Override
protected ObjectType getObjectType() {
return ObjectType.PAYMENT;
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagDefinitionResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagDefinitionResource.java
index 7f5d997..cf9c557 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagDefinitionResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagDefinitionResource.java
@@ -37,16 +37,20 @@ import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriInfo;
import org.killbill.billing.ObjectType;
+import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.jaxrs.json.AuditLogJson;
import org.killbill.billing.jaxrs.json.TagDefinitionJson;
import org.killbill.billing.jaxrs.util.Context;
import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
import org.killbill.billing.payment.api.PaymentApi;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.AuditUserApi;
import org.killbill.billing.util.api.CustomFieldUserApi;
import org.killbill.billing.util.api.TagDefinitionApiException;
import org.killbill.billing.util.api.TagUserApi;
import org.killbill.billing.util.audit.AuditLog;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.callcontext.TenantContext;
import org.killbill.billing.util.tag.TagDefinition;
import org.killbill.clock.Clock;
@@ -153,6 +157,19 @@ public class TagDefinitionResource extends JaxRsResourceBase {
return Response.status(Status.NO_CONTENT).build();
}
+ @TimedResource
+ @GET
+ @Path("/{tagDefinitionId:" + UUID_PATTERN + "}/" + AUDIT_LOG_WITH_HISTORY)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Retrieve tag definition audit logs with history by id", response = AuditLogJson.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 404, message = "Account not found")})
+ public Response getTagDefinitionAuditLogsWithHistory(@PathParam("tagDefinitionId") final UUID tagDefinitionId,
+ @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException {
+ final TenantContext tenantContext = context.createTenantContextNoAccountId(request);
+ final List<AuditLogWithHistory> auditLogWithHistory = tagUserApi.getTagDefinitionAuditLogsWithHistoryForId(tagDefinitionId, AuditLevel.FULL, tenantContext);
+ return Response.status(Status.OK).entity(getAuditLogsWithHistory(auditLogWithHistory)).build();
+ }
+
@Override
protected ObjectType getObjectType() {
return ObjectType.TAG_DEFINITION;
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagResource.java
index e194d3c..96114a0 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagResource.java
@@ -30,10 +30,15 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
import org.killbill.billing.ObjectType;
+import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.jaxrs.json.AuditLogJson;
import org.killbill.billing.payment.api.PaymentApi;
+import org.killbill.billing.util.api.AuditLevel;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.clock.Clock;
import org.killbill.billing.jaxrs.json.TagJson;
import org.killbill.billing.jaxrs.util.Context;
@@ -55,6 +60,7 @@ import com.google.inject.Inject;
import com.google.inject.Singleton;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
@@ -141,4 +147,17 @@ public class TagResource extends JaxRsResourceBase {
},
nextPageUri);
}
+
+ @TimedResource
+ @GET
+ @Path("/{tagId:" + UUID_PATTERN + "}/" + AUDIT_LOG_WITH_HISTORY)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Retrieve tag audit logs with history by id", response = AuditLogJson.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 404, message = "Account not found")})
+ public Response getTagAuditLogsWithHistory(@PathParam("tagId") final UUID tagId,
+ @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException {
+ final TenantContext tenantContext = context.createTenantContextNoAccountId(request);
+ final List<AuditLogWithHistory> auditLogWithHistory = tagUserApi.getTagAuditLogsWithHistoryForId(tagId, AuditLevel.FULL, tenantContext);
+ return Response.status(Status.OK).entity(getAuditLogsWithHistory(auditLogWithHistory)).build();
+ }
}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TransactionResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TransactionResource.java
index 31f6522..da16de5 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TransactionResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TransactionResource.java
@@ -34,12 +34,14 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriInfo;
import org.killbill.billing.ObjectType;
import org.killbill.billing.account.api.Account;
import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.jaxrs.json.AuditLogJson;
import org.killbill.billing.jaxrs.json.CustomFieldJson;
import org.killbill.billing.jaxrs.json.PaymentJson;
import org.killbill.billing.jaxrs.json.PaymentTransactionJson;
@@ -52,6 +54,7 @@ import org.killbill.billing.payment.api.PaymentApiException;
import org.killbill.billing.payment.api.PaymentOptions;
import org.killbill.billing.payment.api.PluginProperty;
import org.killbill.billing.payment.api.TransactionStatus;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.AuditUserApi;
import org.killbill.billing.util.api.CustomFieldApiException;
import org.killbill.billing.util.api.CustomFieldUserApi;
@@ -59,6 +62,7 @@ import org.killbill.billing.util.api.TagApiException;
import org.killbill.billing.util.api.TagDefinitionApiException;
import org.killbill.billing.util.api.TagUserApi;
import org.killbill.billing.util.audit.AccountAuditLogs;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.TenantContext;
import org.killbill.clock.Clock;
@@ -261,6 +265,19 @@ public class TransactionResource extends JaxRsResourceBase {
context.createCallContextNoAccountId(createdBy, reason, comment, request));
}
+ @TimedResource
+ @GET
+ @Path("/{transactionId:" + UUID_PATTERN + "}/" + AUDIT_LOG_WITH_HISTORY)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Retrieve payment transaction audit logs with history by id", response = AuditLogJson.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 404, message = "Account not found")})
+ public Response getTransactionAuditLogsWithHistory(@PathParam("transactionId") final UUID transactionId,
+ @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException {
+ final TenantContext tenantContext = context.createTenantContextNoAccountId(request);
+ final List<AuditLogWithHistory> auditLogWithHistory = paymentApi.getPaymentTransactionAuditLogsWithHistoryForId(transactionId, AuditLevel.FULL, tenantContext);
+ return Response.status(Status.OK).entity(getAuditLogsWithHistory(auditLogWithHistory)).build();
+ }
+
@Override
protected ObjectType getObjectType() {
return ObjectType.TRANSACTION;
diff --git a/overdue/src/main/java/org/killbill/billing/overdue/applicator/OverdueStateApplicator.java b/overdue/src/main/java/org/killbill/billing/overdue/applicator/OverdueStateApplicator.java
index b880b1d..cc5ecfa 100644
--- a/overdue/src/main/java/org/killbill/billing/overdue/applicator/OverdueStateApplicator.java
+++ b/overdue/src/main/java/org/killbill/billing/overdue/applicator/OverdueStateApplicator.java
@@ -135,6 +135,8 @@ public class OverdueStateApplicator {
if (previousOverdueState.getName().equals(nextOverdueState.getName())) {
log.debug("OverdueStateApplicator is no-op: previousState={}, nextState={}", previousOverdueState, nextOverdueState);
return;
+ } else {
+ log.debug("OverdueStateApplicator has new state: previousState={}, nextState={}", previousOverdueState, nextOverdueState);
}
cancelSubscriptionsIfRequired(effectiveDate, account, nextOverdueState, context);
diff --git a/overdue/src/main/java/org/killbill/billing/overdue/listener/OverdueListener.java b/overdue/src/main/java/org/killbill/billing/overdue/listener/OverdueListener.java
index 7ecdb5c..e247a1f 100644
--- a/overdue/src/main/java/org/killbill/billing/overdue/listener/OverdueListener.java
+++ b/overdue/src/main/java/org/killbill/billing/overdue/listener/OverdueListener.java
@@ -153,27 +153,38 @@ public class OverdueListener {
private void insertBusEventIntoNotificationQueue(final UUID accountId, final OverdueAsyncBusNotificationAction action, final InternalCallContext callContext) {
final boolean shouldInsertNotification = shouldInsertNotification(callContext);
- if (shouldInsertNotification) {
- OverdueAsyncBusNotificationKey notificationKey = new OverdueAsyncBusNotificationKey(accountId, action);
- asyncPoster.insertOverdueNotification(accountId, callContext.getCreatedDate(), OverdueAsyncBusNotifier.OVERDUE_ASYNC_BUS_NOTIFIER_QUEUE, notificationKey, callContext);
-
- try {
- final List<Account> childrenAccounts = accountApi.getChildrenAccounts(accountId, callContext);
- if (childrenAccounts != null) {
- for (Account childAccount : childrenAccounts) {
-
- if (childAccount.isPaymentDelegatedToParent()) {
- final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(childAccount.getId(), callContext);
- final InternalCallContext accountContext = internalCallContextFactory.createInternalCallContext(internalTenantContext.getAccountRecordId(), callContext);
- notificationKey = new OverdueAsyncBusNotificationKey(childAccount.getId(), action);
- asyncPoster.insertOverdueNotification(childAccount.getId(), callContext.getCreatedDate(), OverdueAsyncBusNotifier.OVERDUE_ASYNC_BUS_NOTIFIER_QUEUE, notificationKey, accountContext);
- }
+ if (!shouldInsertNotification) {
+ log.debug("OverdueListener: shouldInsertNotification=false");
+ return;
+ }
+
+ OverdueAsyncBusNotificationKey notificationKey = new OverdueAsyncBusNotificationKey(accountId, action);
+ asyncPoster.insertOverdueNotification(accountId, callContext.getCreatedDate(), OverdueAsyncBusNotifier.OVERDUE_ASYNC_BUS_NOTIFIER_QUEUE, notificationKey, callContext);
+
+ try {
+ // Refresh parent
+ final Account account = accountApi.getAccountById(accountId, callContext);
+ if (account.getParentAccountId() != null && account.isPaymentDelegatedToParent()) {
+ final InternalTenantContext parentAccountInternalTenantContext = internalCallContextFactory.createInternalTenantContext(account.getParentAccountId(), callContext);
+ final InternalCallContext parentAccountContext = internalCallContextFactory.createInternalCallContext(parentAccountInternalTenantContext.getAccountRecordId(), callContext);
+ notificationKey = new OverdueAsyncBusNotificationKey(account.getParentAccountId(), action);
+ asyncPoster.insertOverdueNotification(account.getParentAccountId(), callContext.getCreatedDate(), OverdueAsyncBusNotifier.OVERDUE_ASYNC_BUS_NOTIFIER_QUEUE, notificationKey, parentAccountContext);
+ }
+
+ // Refresh children
+ final List<Account> childrenAccounts = accountApi.getChildrenAccounts(accountId, callContext);
+ if (childrenAccounts != null) {
+ for (final Account childAccount : childrenAccounts) {
+ if (childAccount.isPaymentDelegatedToParent()) {
+ final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(childAccount.getId(), callContext);
+ final InternalCallContext accountContext = internalCallContextFactory.createInternalCallContext(internalTenantContext.getAccountRecordId(), callContext);
+ notificationKey = new OverdueAsyncBusNotificationKey(childAccount.getId(), action);
+ asyncPoster.insertOverdueNotification(childAccount.getId(), callContext.getCreatedDate(), OverdueAsyncBusNotifier.OVERDUE_ASYNC_BUS_NOTIFIER_QUEUE, notificationKey, accountContext);
}
}
- } catch (Exception e) {
- log.error("Error loading child accounts from account " + accountId);
}
-
+ } catch (final Exception e) {
+ log.error("Error loading child accounts from accountId='{}'", accountId);
}
}
@@ -183,7 +194,7 @@ public class OverdueListener {
try {
overdueConfig = overdueConfigCache.getOverdueConfig(internalTenantContext);
} catch (final OverdueApiException e) {
- log.warn("Failed to extract overdue config for tenant " + internalTenantContext.getTenantRecordId());
+ log.warn("Failed to extract overdue config for tenantRecordId='{}'", internalTenantContext.getTenantRecordId());
overdueConfig = null;
}
if (overdueConfig == null || overdueConfig.getOverdueStatesAccount() == null || overdueConfig.getOverdueStatesAccount().getStates() == null) {
@@ -197,5 +208,4 @@ public class OverdueListener {
}
return false;
}
-
}
diff --git a/overdue/src/test/java/org/killbill/billing/overdue/notification/TestDefaultOverdueCheckPoster.java b/overdue/src/test/java/org/killbill/billing/overdue/notification/TestDefaultOverdueCheckPoster.java
index 8c2a498..36bd147 100644
--- a/overdue/src/test/java/org/killbill/billing/overdue/notification/TestDefaultOverdueCheckPoster.java
+++ b/overdue/src/test/java/org/killbill/billing/overdue/notification/TestDefaultOverdueCheckPoster.java
@@ -51,6 +51,10 @@ public class TestDefaultOverdueCheckPoster extends OverdueTestSuiteWithEmbeddedD
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
entitySqlDaoTransactionalJdbiWrapper = new EntitySqlDaoTransactionalJdbiWrapper(dbi, roDbi, clock, cacheControllerDispatcher, nonEntityDao, internalCallContextFactory);
diff --git a/overdue/src/test/java/org/killbill/billing/overdue/wrapper/TestOverdueWrapper.java b/overdue/src/test/java/org/killbill/billing/overdue/wrapper/TestOverdueWrapper.java
index 7b5c9a3..2830ca0 100644
--- a/overdue/src/test/java/org/killbill/billing/overdue/wrapper/TestOverdueWrapper.java
+++ b/overdue/src/test/java/org/killbill/billing/overdue/wrapper/TestOverdueWrapper.java
@@ -35,6 +35,10 @@ public class TestOverdueWrapper extends OverdueTestSuiteWithEmbeddedDB {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
((MockOverdueConfigCache) overdueConfigCache).loadOverwriteDefaultOverdueConfig(null);
}
diff --git a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
index 57e2596..c9ffb84 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
@@ -34,7 +34,10 @@ import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.payment.core.PaymentMethodProcessor;
import org.killbill.billing.payment.core.PaymentProcessor;
import org.killbill.billing.payment.core.PluginControlPaymentProcessor;
+import org.killbill.billing.payment.dao.PaymentDao;
import org.killbill.billing.util.UUIDs;
+import org.killbill.billing.util.api.AuditLevel;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.callcontext.TenantContext;
@@ -61,13 +64,15 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
private final PaymentProcessor paymentProcessor;
private final PaymentMethodProcessor paymentMethodProcessor;
private final PluginControlPaymentProcessor pluginControlPaymentProcessor;
+ private final PaymentDao paymentDao;
@Inject
- public DefaultPaymentApi(final PaymentConfig paymentConfig, final PaymentProcessor paymentProcessor, final PaymentMethodProcessor paymentMethodProcessor, final PluginControlPaymentProcessor pluginControlPaymentProcessor, final InternalCallContextFactory internalCallContextFactory) {
+ public DefaultPaymentApi(final PaymentConfig paymentConfig, final PaymentProcessor paymentProcessor, final PaymentMethodProcessor paymentMethodProcessor, final PluginControlPaymentProcessor pluginControlPaymentProcessor, final PaymentDao paymentDao, final InternalCallContextFactory internalCallContextFactory) {
super(paymentConfig, internalCallContextFactory);
this.paymentProcessor = paymentProcessor;
this.paymentMethodProcessor = paymentMethodProcessor;
this.pluginControlPaymentProcessor = pluginControlPaymentProcessor;
+ this.paymentDao = paymentDao;
}
@Override
@@ -1072,6 +1077,26 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
}
@Override
+ public List<AuditLogWithHistory> getPaymentAuditLogsWithHistoryForId(final UUID paymentId, final AuditLevel auditLevel, final TenantContext tenantContext) {
+ return paymentDao.getPaymentAuditLogsWithHistoryForId(paymentId, auditLevel, internalCallContextFactory.createInternalTenantContext(paymentId, ObjectType.PAYMENT, tenantContext));
+ }
+
+ @Override
+ public List<AuditLogWithHistory> getPaymentMethodAuditLogsWithHistoryForId(final UUID paymentMethodId, final AuditLevel auditLevel, final TenantContext tenantContext) {
+ return paymentDao.getPaymentMethodAuditLogsWithHistoryForId(paymentMethodId, auditLevel, internalCallContextFactory.createInternalTenantContext(paymentMethodId, ObjectType.PAYMENT_METHOD, tenantContext));
+ }
+
+ @Override
+ public List<AuditLogWithHistory> getPaymentAttemptAuditLogsWithHistoryForId(final UUID paymentAttemptId, final AuditLevel auditLevel, final TenantContext tenantContext) {
+ return paymentDao.getPaymentAttemptAuditLogsWithHistoryForId(paymentAttemptId, auditLevel, internalCallContextFactory.createInternalTenantContext(paymentAttemptId, ObjectType.PAYMENT_ATTEMPT, tenantContext));
+ }
+
+ @Override
+ public List<AuditLogWithHistory> getPaymentTransactionAuditLogsWithHistoryForId(final UUID paymentTransactionId, final AuditLevel auditLevel, final TenantContext tenantContext) {
+ return paymentDao.getPaymentTransactionAuditLogsWithHistoryForId(paymentTransactionId, auditLevel, internalCallContextFactory.createInternalTenantContext(paymentTransactionId, ObjectType.TRANSACTION, tenantContext));
+ }
+
+ @Override
public Payment getPaymentByTransactionId(final UUID transactionId, final boolean withPluginInfo, final boolean withAttempts, final Iterable<PluginProperty> properties, final TenantContext context) throws PaymentApiException {
final Payment payment = paymentProcessor.getPaymentByTransactionId(transactionId, withPluginInfo, withAttempts, properties, context, internalCallContextFactory.createInternalTenantContext(transactionId, ObjectType.TRANSACTION, context));
if (payment == null) {
diff --git a/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java b/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java
index 114744a..b7aa24f 100644
--- a/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java
+++ b/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java
@@ -48,9 +48,14 @@ import org.killbill.billing.payment.api.PaymentTransaction;
import org.killbill.billing.payment.api.TransactionStatus;
import org.killbill.billing.payment.api.TransactionType;
import org.killbill.billing.payment.core.sm.PaymentStateMachineHelper;
+import org.killbill.billing.util.api.AuditLevel;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
+import org.killbill.billing.util.audit.dao.AuditDao;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
+import org.killbill.billing.util.callcontext.TenantContext;
import org.killbill.billing.util.dao.NonEntityDao;
+import org.killbill.billing.util.dao.TableName;
import org.killbill.billing.util.entity.Entity;
import org.killbill.billing.util.entity.Pagination;
import org.killbill.billing.util.entity.dao.DefaultPaginationSqlDaoHelper;
@@ -60,6 +65,7 @@ import org.killbill.billing.util.entity.dao.EntityDaoBase;
import org.killbill.billing.util.entity.dao.EntitySqlDaoTransactionWrapper;
import org.killbill.billing.util.entity.dao.EntitySqlDaoTransactionalJdbiWrapper;
import org.killbill.billing.util.entity.dao.EntitySqlDaoWrapperFactory;
+import org.killbill.billing.util.tag.dao.TagSqlDao;
import org.killbill.bus.api.PersistentBus;
import org.killbill.bus.api.PersistentBus.EventBusException;
import org.killbill.clock.Clock;
@@ -83,14 +89,16 @@ public class DefaultPaymentDao extends EntityDaoBase<PaymentModelDao, Payment, P
private final DefaultPaginationSqlDaoHelper paginationHelper;
private final PersistentBus eventBus;
private final Clock clock;
+ private final AuditDao auditDao;
@Inject
public DefaultPaymentDao(final IDBI dbi, @Named(MAIN_RO_IDBI_NAMED) final IDBI roDbi, final Clock clock, final CacheControllerDispatcher cacheControllerDispatcher,
- final NonEntityDao nonEntityDao, final InternalCallContextFactory internalCallContextFactory, final PersistentBus eventBus) {
+ final NonEntityDao nonEntityDao, final InternalCallContextFactory internalCallContextFactory, final PersistentBus eventBus, final AuditDao auditDao) {
super(new EntitySqlDaoTransactionalJdbiWrapper(dbi, roDbi, clock, cacheControllerDispatcher, nonEntityDao, internalCallContextFactory), PaymentSqlDao.class);
this.paginationHelper = new DefaultPaginationSqlDaoHelper(transactionalSqlDao);
this.eventBus = eventBus;
this.clock = clock;
+ this.auditDao = auditDao;
}
@Override
@@ -663,6 +671,50 @@ public class DefaultPaymentDao extends EntityDaoBase<PaymentModelDao, Payment, P
});
}
+ @Override
+ public List<AuditLogWithHistory> getPaymentAuditLogsWithHistoryForId(final UUID paymentId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ return transactionalSqlDao.execute(true, new EntitySqlDaoTransactionWrapper<List<AuditLogWithHistory>>() {
+ @Override
+ public List<AuditLogWithHistory> inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) {
+ final PaymentSqlDao transactional = entitySqlDaoWrapperFactory.become(PaymentSqlDao.class);
+ return auditDao.getAuditLogsWithHistoryForId(transactional, TableName.PAYMENTS, paymentId, auditLevel, context);
+ }
+ });
+ }
+
+ @Override
+ public List<AuditLogWithHistory> getPaymentMethodAuditLogsWithHistoryForId(final UUID paymentMethodId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ return transactionalSqlDao.execute(true, new EntitySqlDaoTransactionWrapper<List<AuditLogWithHistory>>() {
+ @Override
+ public List<AuditLogWithHistory> inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) {
+ final PaymentMethodSqlDao transactional = entitySqlDaoWrapperFactory.become(PaymentMethodSqlDao.class);
+ return auditDao.getAuditLogsWithHistoryForId(transactional, TableName.PAYMENT_METHODS, paymentMethodId, auditLevel, context);
+ }
+ });
+ }
+
+ @Override
+ public List<AuditLogWithHistory> getPaymentAttemptAuditLogsWithHistoryForId(final UUID paymentAttemptId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ return transactionalSqlDao.execute(true, new EntitySqlDaoTransactionWrapper<List<AuditLogWithHistory>>() {
+ @Override
+ public List<AuditLogWithHistory> inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) {
+ final PaymentAttemptSqlDao transactional = entitySqlDaoWrapperFactory.become(PaymentAttemptSqlDao.class);
+ return auditDao.getAuditLogsWithHistoryForId(transactional, TableName.PAYMENT_ATTEMPTS, paymentAttemptId, auditLevel, context);
+ }
+ });
+ }
+
+ @Override
+ public List<AuditLogWithHistory> getPaymentTransactionAuditLogsWithHistoryForId(final UUID paymentTransactionId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ return transactionalSqlDao.execute(true, new EntitySqlDaoTransactionWrapper<List<AuditLogWithHistory>>() {
+ @Override
+ public List<AuditLogWithHistory> inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) {
+ final TransactionSqlDao transactional = entitySqlDaoWrapperFactory.become(TransactionSqlDao.class);
+ return auditDao.getAuditLogsWithHistoryForId(transactional, TableName.PAYMENT_TRANSACTIONS, paymentTransactionId, auditLevel, context);
+ }
+ });
+ }
+
private void postPaymentEventFromTransaction(final UUID accountId,
final TransactionStatus transactionStatus,
final TransactionType transactionType,
diff --git a/payment/src/main/java/org/killbill/billing/payment/dao/PaymentDao.java b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentDao.java
index 375bbdd..fe1c1bf 100644
--- a/payment/src/main/java/org/killbill/billing/payment/dao/PaymentDao.java
+++ b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentDao.java
@@ -28,8 +28,14 @@ import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.payment.api.Payment;
import org.killbill.billing.payment.api.PaymentApiException;
+import org.killbill.billing.payment.api.PaymentAttempt;
+import org.killbill.billing.payment.api.PaymentMethod;
+import org.killbill.billing.payment.api.PaymentTransaction;
import org.killbill.billing.payment.api.TransactionStatus;
import org.killbill.billing.payment.api.TransactionType;
+import org.killbill.billing.util.api.AuditLevel;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
+import org.killbill.billing.util.entity.Entity;
import org.killbill.billing.util.entity.Pagination;
import org.killbill.billing.util.entity.dao.EntityDao;
@@ -104,4 +110,12 @@ public interface PaymentDao extends EntityDao<PaymentModelDao, Payment, PaymentA
public void deletedPaymentMethod(UUID paymentMethodId, InternalCallContext context);
public List<PaymentMethodModelDao> refreshPaymentMethods(String pluginName, List<PaymentMethodModelDao> paymentMethods, InternalCallContext context);
+
+ List<AuditLogWithHistory> getPaymentAuditLogsWithHistoryForId(UUID paymentId, AuditLevel auditLevel, InternalTenantContext context);
+
+ List<AuditLogWithHistory> getPaymentMethodAuditLogsWithHistoryForId(UUID paymentMethodId, AuditLevel auditLevel, InternalTenantContext context);
+
+ List<AuditLogWithHistory> getPaymentAttemptAuditLogsWithHistoryForId(UUID paymentAttemptId, AuditLevel auditLevel, InternalTenantContext context);
+
+ List<AuditLogWithHistory> getPaymentTransactionAuditLogsWithHistoryForId(UUID paymentTransactionId, AuditLevel auditLevel, InternalTenantContext context);
}
diff --git a/payment/src/test/java/org/killbill/billing/payment/api/TestExternalPaymentPlugin.java b/payment/src/test/java/org/killbill/billing/payment/api/TestExternalPaymentPlugin.java
index 48a7419..7d22863 100644
--- a/payment/src/test/java/org/killbill/billing/payment/api/TestExternalPaymentPlugin.java
+++ b/payment/src/test/java/org/killbill/billing/payment/api/TestExternalPaymentPlugin.java
@@ -37,13 +37,12 @@ public class TestExternalPaymentPlugin extends PaymentTestSuiteWithEmbeddedDB {
private Account account;
- @BeforeClass(groups = "slow")
- protected void beforeClass() throws Exception {
- super.beforeClass();
- }
-
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
account = testHelper.createTestAccount("bob@gmail.com", false);
account = addTestExternalPaymentMethod(account, new DefaultNoOpPaymentMethodPlugin(UUID.randomUUID().toString(), true, null));
diff --git a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java
index 1e98dff..5d45b6c 100644
--- a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java
+++ b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java
@@ -98,12 +98,20 @@ public class TestPaymentApi extends PaymentTestSuiteWithEmbeddedDB {
@BeforeClass(groups = "slow")
protected void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
mockPaymentProviderPlugin = (MockPaymentProviderPlugin) registry.getServiceForName(MockPaymentProviderPlugin.PLUGIN_NAME);
}
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
mockPaymentProviderPlugin.clear();
account = testHelper.createTestAccount("bobo@gmail.com", true);
diff --git a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApiNoDB.java b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApiNoDB.java
index b71b66f..2b41c96 100644
--- a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApiNoDB.java
+++ b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApiNoDB.java
@@ -66,12 +66,19 @@ public class TestPaymentApiNoDB extends PaymentTestSuiteNoDB {
@BeforeClass(groups = "fast")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
account = testHelper.createTestAccount("yoyo.yahoo.com", false);
}
@BeforeMethod(groups = "fast")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
super.beforeMethod();
final PaymentMethodPlugin paymentMethodInfo = new DefaultNoOpPaymentMethodPlugin(UUID.randomUUID().toString(), true, null);
account = testHelper.addTestPaymentMethod(account, paymentMethodInfo);
diff --git a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApiWithControl.java b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApiWithControl.java
index 5d52fa5..c7e66c5 100644
--- a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApiWithControl.java
+++ b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApiWithControl.java
@@ -67,6 +67,10 @@ public class TestPaymentApiWithControl extends PaymentTestSuiteWithEmbeddedDB {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
account = testHelper.createTestAccount("bobo@gmail.com", true);
diff --git a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentGatewayApiWithPaymentControl.java b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentGatewayApiWithPaymentControl.java
index 4698e0d..dc1f11d 100644
--- a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentGatewayApiWithPaymentControl.java
+++ b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentGatewayApiWithPaymentControl.java
@@ -58,7 +58,9 @@ public class TestPaymentGatewayApiWithPaymentControl extends PaymentTestSuiteNoD
@BeforeMethod(groups = "fast")
public void beforeMethod() throws Exception {
-
+ if (hasFailed()) {
+ return;
+ }
super.beforeMethod();
account = testHelper.createTestAccount("arthur@gmail.com", true);
diff --git a/payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCache.java b/payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCache.java
index cb2383a..337ae9e 100644
--- a/payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCache.java
+++ b/payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCache.java
@@ -46,6 +46,9 @@ public class TestStateMachineConfigCache extends PaymentTestSuiteNoDB {
@BeforeMethod(groups = "fast")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
super.beforeMethod();
cacheControllerDispatcher.clearAll();
diff --git a/payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCacheInvalidationCallback.java b/payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCacheInvalidationCallback.java
index 18b1f31..49a672c 100644
--- a/payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCacheInvalidationCallback.java
+++ b/payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCacheInvalidationCallback.java
@@ -39,6 +39,9 @@ public class TestStateMachineConfigCacheInvalidationCallback extends PaymentTest
@BeforeMethod(groups = "fast")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
super.beforeMethod();
cacheControllerDispatcher.clearAll();
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/janitor/TestIncompletePaymentTransactionTaskWithDB.java b/payment/src/test/java/org/killbill/billing/payment/core/janitor/TestIncompletePaymentTransactionTaskWithDB.java
index 168e06e..2843ef0 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/janitor/TestIncompletePaymentTransactionTaskWithDB.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/janitor/TestIncompletePaymentTransactionTaskWithDB.java
@@ -54,6 +54,9 @@ public class TestIncompletePaymentTransactionTaskWithDB extends PaymentTestSuite
@BeforeClass(groups = "slow")
protected void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
super.beforeClass();
mockPaymentProviderPlugin = (MockPaymentProviderPlugin) registry.getServiceForName(MockPaymentProviderPlugin.PLUGIN_NAME);
@@ -61,6 +64,10 @@ public class TestIncompletePaymentTransactionTaskWithDB extends PaymentTestSuite
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
mockPaymentProviderPlugin.clear();
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestPluginOperation.java b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestPluginOperation.java
index b70932f..e9323d4 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestPluginOperation.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestPluginOperation.java
@@ -76,6 +76,9 @@ public class TestPluginOperation extends PaymentTestSuiteNoDB {
@BeforeMethod(groups = "fast")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
super.beforeMethod();
Mockito.when(account.getId()).thenReturn(UUID.randomUUID());
}
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestRetryablePayment.java b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestRetryablePayment.java
index 5b121ee..74f67f9 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestRetryablePayment.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestRetryablePayment.java
@@ -129,6 +129,10 @@ public class TestRetryablePayment extends PaymentTestSuiteNoDB {
@BeforeClass(groups = "fast")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
account = testHelper.createTestAccount("lolo@gmail.com", false);
Mockito.when(accountInternalApi.getAccountById(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(account);
@@ -154,6 +158,9 @@ public class TestRetryablePayment extends PaymentTestSuiteNoDB {
@BeforeMethod(groups = "fast")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
super.beforeMethod();
this.utcNow = clock.getUTCNow();
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentMethodProcessorRefreshWithDB.java b/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentMethodProcessorRefreshWithDB.java
index def20b8..d9684ad 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentMethodProcessorRefreshWithDB.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentMethodProcessorRefreshWithDB.java
@@ -41,6 +41,10 @@ public class TestPaymentMethodProcessorRefreshWithDB extends PaymentTestSuiteWit
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
getPluginApi().resetPaymentMethods(null, null, PLUGIN_PROPERTIES, callContext);
}
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentMethodProcessorWithDB.java b/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentMethodProcessorWithDB.java
index 3912a51..e444b0a 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentMethodProcessorWithDB.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentMethodProcessorWithDB.java
@@ -27,8 +27,12 @@ import org.killbill.billing.payment.api.PaymentMethod;
import org.killbill.billing.payment.api.PluginProperty;
import org.killbill.billing.payment.dao.PaymentMethodModelDao;
import org.killbill.billing.payment.dao.PaymentMethodSqlDao;
+import org.killbill.billing.payment.dao.PaymentModelDao;
+import org.killbill.billing.util.api.AuditLevel;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.audit.ChangeType;
import org.killbill.billing.util.dao.EntityHistoryModelDao;
+import org.killbill.billing.util.dao.TableName;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -69,35 +73,34 @@ public class TestPaymentMethodProcessorWithDB extends PaymentTestSuiteWithEmbedd
final UUID paymentMethodId = paymentMethodProcessor.createOrGetExternalPaymentMethod("pmExternalKey", account, PLUGIN_PROPERTIES, callContext, internalCallContext);
final PaymentMethodModelDao paymentMethodModelDao = paymentDao.getPaymentMethod(paymentMethodId, internalCallContext);
- final List<EntityHistoryModelDao<PaymentMethodModelDao, PaymentMethod>> history1 = getPaymentMethodHistory(paymentMethodModelDao.getRecordId());
- Assert.assertEquals(history1.size(), 1);
- Assert.assertEquals(history1.get(0).getChangeType(), ChangeType.INSERT);
- Assert.assertEquals(history1.get(0).getEntity().getAccountRecordId(), paymentMethodModelDao.getAccountRecordId());
- Assert.assertEquals(history1.get(0).getEntity().getTenantRecordId(), paymentMethodModelDao.getTenantRecordId());
- Assert.assertEquals(history1.get(0).getEntity().getExternalKey(), paymentMethodModelDao.getExternalKey());
- Assert.assertTrue(history1.get(0).getEntity().isActive());
+ List<AuditLogWithHistory> auditLogsWithHistory = paymentDao.getPaymentMethodAuditLogsWithHistoryForId(paymentMethodModelDao.getId(), AuditLevel.FULL, internalCallContext);
+ Assert.assertEquals(auditLogsWithHistory.size(), 1);
+
+ PaymentMethodModelDao history1 = (PaymentMethodModelDao) auditLogsWithHistory.get(0).getEntity();
+ Assert.assertEquals(auditLogsWithHistory.get(0).getChangeType(), ChangeType.INSERT);
+ Assert.assertEquals(history1.getAccountRecordId(), paymentMethodModelDao.getAccountRecordId());
+ Assert.assertEquals(history1.getTenantRecordId(), paymentMethodModelDao.getTenantRecordId());
+ Assert.assertEquals(history1.getExternalKey(), paymentMethodModelDao.getExternalKey());
+ Assert.assertTrue(history1.isActive());
paymentMethodProcessor.deletedPaymentMethod(account, paymentMethodId, true, true, ImmutableList.<PluginProperty>of(), callContext, internalCallContext);
- final List<EntityHistoryModelDao<PaymentMethodModelDao, PaymentMethod>> history2 = getPaymentMethodHistory(paymentMethodModelDao.getRecordId());
- Assert.assertEquals(history2.size(), 2);
- Assert.assertEquals(history2.get(0).getChangeType(), ChangeType.INSERT);
- Assert.assertEquals(history2.get(0).getEntity().getAccountRecordId(), paymentMethodModelDao.getAccountRecordId());
- Assert.assertEquals(history2.get(0).getEntity().getTenantRecordId(), paymentMethodModelDao.getTenantRecordId());
- Assert.assertEquals(history2.get(0).getEntity().getExternalKey(), paymentMethodModelDao.getExternalKey());
- Assert.assertTrue(history2.get(0).getEntity().isActive());
+ auditLogsWithHistory = paymentDao.getPaymentMethodAuditLogsWithHistoryForId(paymentMethodModelDao.getId(), AuditLevel.FULL, internalCallContext);
+ Assert.assertEquals(auditLogsWithHistory.size(), 2);
+
+ history1 = (PaymentMethodModelDao) auditLogsWithHistory.get(0).getEntity();
+ PaymentMethodModelDao history2 = (PaymentMethodModelDao) auditLogsWithHistory.get(1).getEntity();
+ Assert.assertEquals(auditLogsWithHistory.get(0).getChangeType(), ChangeType.INSERT);
+ Assert.assertEquals(history1.getAccountRecordId(), paymentMethodModelDao.getAccountRecordId());
+ Assert.assertEquals(history1.getTenantRecordId(), paymentMethodModelDao.getTenantRecordId());
+ Assert.assertEquals(history1.getExternalKey(), paymentMethodModelDao.getExternalKey());
+ Assert.assertTrue(history1.isActive());
// Note: it looks like we don't consider this as a DELETE, probably because we can un-delete such payment methods?
- Assert.assertEquals(history2.get(1).getChangeType(), ChangeType.UPDATE);
- Assert.assertEquals(history2.get(1).getEntity().getAccountRecordId(), paymentMethodModelDao.getAccountRecordId());
- Assert.assertEquals(history2.get(1).getEntity().getTenantRecordId(), paymentMethodModelDao.getTenantRecordId());
- Assert.assertEquals(history2.get(1).getEntity().getExternalKey(), paymentMethodModelDao.getExternalKey());
+ Assert.assertEquals(auditLogsWithHistory.get(1).getChangeType(), ChangeType.UPDATE);
+ Assert.assertEquals(history2.getAccountRecordId(), paymentMethodModelDao.getAccountRecordId());
+ Assert.assertEquals(history2.getTenantRecordId(), paymentMethodModelDao.getTenantRecordId());
+ Assert.assertEquals(history2.getExternalKey(), paymentMethodModelDao.getExternalKey());
// Note: upon deletion, the recorded state is the same as before the delete
- Assert.assertTrue(history2.get(1).getEntity().isActive());
- }
-
- private List<EntityHistoryModelDao<PaymentMethodModelDao, PaymentMethod>> getPaymentMethodHistory(final Long paymentMethodRecordId) {
- // See https://github.com/killbill/killbill/issues/335
- final PaymentMethodSqlDao paymentMethodSqlDao = dbi.onDemand(PaymentMethodSqlDao.class);
- return paymentMethodSqlDao.getHistoryForTargetRecordId(paymentMethodRecordId, internalCallContext);
+ Assert.assertTrue(history2.isActive());
}
}
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentProcessor.java b/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentProcessor.java
index d9e9b96..92470f0 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentProcessor.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentProcessor.java
@@ -65,6 +65,9 @@ public class TestPaymentProcessor extends PaymentTestSuiteWithEmbeddedDB {
@BeforeMethod(groups = "slow")
public void setUp() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
mockPaymentProviderPlugin = (MockPaymentProviderPlugin) registry.getServiceForName(MockPaymentProviderPlugin.PLUGIN_NAME);
account = testHelper.createTestAccount(UUID.randomUUID().toString(), true);
diff --git a/payment/src/test/java/org/killbill/billing/payment/dao/MockPaymentDao.java b/payment/src/test/java/org/killbill/billing/payment/dao/MockPaymentDao.java
index 1db8422..5380fee 100644
--- a/payment/src/test/java/org/killbill/billing/payment/dao/MockPaymentDao.java
+++ b/payment/src/test/java/org/killbill/billing/payment/dao/MockPaymentDao.java
@@ -39,6 +39,8 @@ import org.killbill.billing.payment.api.Payment;
import org.killbill.billing.payment.api.PaymentApiException;
import org.killbill.billing.payment.api.TransactionStatus;
import org.killbill.billing.payment.api.TransactionType;
+import org.killbill.billing.util.api.AuditLevel;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.entity.DefaultPagination;
import org.killbill.billing.util.entity.Pagination;
import org.killbill.billing.util.entity.dao.MockEntityDaoBase;
@@ -426,6 +428,26 @@ public class MockPaymentDao extends MockEntityDaoBase<PaymentModelDao, Payment,
}
@Override
+ public List<AuditLogWithHistory> getPaymentAuditLogsWithHistoryForId(final UUID paymentId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<AuditLogWithHistory> getPaymentMethodAuditLogsWithHistoryForId(final UUID paymentMethodId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<AuditLogWithHistory> getPaymentAttemptAuditLogsWithHistoryForId(final UUID paymentAttemptId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<AuditLogWithHistory> getPaymentTransactionAuditLogsWithHistoryForId(final UUID paymentTransactionId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public PaymentMethodModelDao getPaymentMethodIncludedDeleted(final UUID paymentMethodId, final InternalTenantContext context) {
return getPaymentMethod(paymentMethodId, context);
}
diff --git a/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java b/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java
index c587c69..8c5599a 100644
--- a/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java
+++ b/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java
@@ -29,13 +29,13 @@ import org.killbill.billing.account.api.Account;
import org.killbill.billing.api.FlakyRetryAnalyzer;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.payment.PaymentTestSuiteWithEmbeddedDB;
-import org.killbill.billing.payment.api.Payment;
import org.killbill.billing.payment.api.PluginProperty;
import org.killbill.billing.payment.api.TransactionStatus;
import org.killbill.billing.payment.api.TransactionType;
import org.killbill.billing.payment.dao.PluginPropertySerializer.PluginPropertySerializerException;
+import org.killbill.billing.util.api.AuditLevel;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.audit.ChangeType;
-import org.killbill.billing.util.dao.EntityHistoryModelDao;
import org.killbill.billing.util.entity.Pagination;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -54,8 +54,8 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
@Test(groups = "slow")
public void testPaymentAttempt() throws PluginPropertySerializerException {
final UUID transactionId = UUID.randomUUID();
- final String paymentExternalKey = "vraiment?";
- final String transactionExternalKey = "tduteuqweq";
+ final String paymentExternalKey = UUID.randomUUID().toString();
+ final String transactionExternalKey = UUID.randomUUID().toString();
final String stateName = "INIT";
final TransactionType transactionType = TransactionType.AUTHORIZE;
final String pluginName = "superPlugin";
@@ -100,9 +100,9 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
public void testPaymentAndTransactions() {
final UUID paymentMethodId = UUID.randomUUID();
final UUID accountId = UUID.randomUUID();
- final String externalKey = "hhhhooo";
- final String transactionExternalKey = "grrrrrr";
- final String transactionExternalKey2 = "hahahaha";
+ final String externalKey = UUID.randomUUID().toString();
+ final String transactionExternalKey = UUID.randomUUID().toString();
+ final String transactionExternalKey2 = UUID.randomUUID().toString();
final DateTime utcNow = clock.getUTCNow();
@@ -119,16 +119,18 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
assertEquals(savedPayment.getPaymentMethodId(), paymentModelDao.getPaymentMethodId());
assertNull(savedPayment.getStateName());
- final List<EntityHistoryModelDao<PaymentModelDao, Payment>> history1 = getPaymentHistory(savedPayment.getRecordId());
- Assert.assertEquals(history1.size(), 1);
- Assert.assertEquals(history1.get(0).getChangeType(), ChangeType.INSERT);
- Assert.assertEquals(history1.get(0).getEntity().getAccountRecordId(), savedPayment.getAccountRecordId());
- Assert.assertEquals(history1.get(0).getEntity().getTenantRecordId(), savedPayment.getTenantRecordId());
- Assert.assertEquals(history1.get(0).getEntity().getExternalKey(), savedPayment.getExternalKey());
- Assert.assertEquals(history1.get(0).getEntity().getStateName(), savedPayment.getStateName());
- Assert.assertEquals(history1.get(0).getEntity().getLastSuccessStateName(), savedPayment.getLastSuccessStateName());
- Assert.assertNull(history1.get(0).getEntity().getStateName());
- Assert.assertNull(history1.get(0).getEntity().getLastSuccessStateName());
+ List<AuditLogWithHistory> auditLogsWithHistory = paymentDao.getPaymentAuditLogsWithHistoryForId(savedPayment.getId(), AuditLevel.FULL, internalCallContext);
+ Assert.assertEquals(auditLogsWithHistory.size(), 1);
+
+ PaymentModelDao history1 = (PaymentModelDao) auditLogsWithHistory.get(0).getEntity();
+ Assert.assertEquals(auditLogsWithHistory.get(0).getChangeType(), ChangeType.INSERT);
+ Assert.assertEquals(history1.getAccountRecordId(), savedPayment.getAccountRecordId());
+ Assert.assertEquals(history1.getTenantRecordId(), savedPayment.getTenantRecordId());
+ Assert.assertEquals(history1.getExternalKey(), savedPayment.getExternalKey());
+ Assert.assertEquals(history1.getStateName(), savedPayment.getStateName());
+ Assert.assertEquals(history1.getLastSuccessStateName(), savedPayment.getLastSuccessStateName());
+ Assert.assertNull(history1.getStateName());
+ Assert.assertNull(history1.getLastSuccessStateName());
final PaymentModelDao savedPayment2 = paymentDao.getPayment(savedPayment.getId(), internalCallContext);
assertEquals(savedPayment2.getId(), paymentModelDao.getId());
@@ -175,19 +177,22 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
assertEquals(savedTransactionModelDao2.getAmount().compareTo(BigDecimal.TEN), 0);
assertEquals(savedTransactionModelDao2.getCurrency(), Currency.AED);
- final List<EntityHistoryModelDao<PaymentModelDao, Payment>> history2 = getPaymentHistory(savedPayment.getRecordId());
- Assert.assertEquals(history2.size(), 2);
- Assert.assertEquals(history2.get(0).getChangeType(), ChangeType.INSERT);
- Assert.assertEquals(history2.get(0).getEntity().getAccountRecordId(), savedPayment.getAccountRecordId());
- Assert.assertEquals(history2.get(0).getEntity().getTenantRecordId(), savedPayment.getTenantRecordId());
- Assert.assertEquals(history2.get(0).getEntity().getExternalKey(), savedPayment.getExternalKey());
- Assert.assertEquals(history2.get(1).getChangeType(), ChangeType.UPDATE);
- Assert.assertEquals(history2.get(1).getEntity().getAccountRecordId(), savedPayment.getAccountRecordId());
- Assert.assertEquals(history2.get(1).getEntity().getTenantRecordId(), savedPayment.getTenantRecordId());
- Assert.assertEquals(history2.get(1).getEntity().getExternalKey(), savedPayment.getExternalKey());
- Assert.assertTrue(history2.get(1).getEntity().getUpdatedDate().compareTo(history2.get(0).getEntity().getUpdatedDate()) >= 0);
- Assert.assertNull(history2.get(1).getEntity().getStateName());
- Assert.assertNull(history2.get(1).getEntity().getLastSuccessStateName());
+ auditLogsWithHistory = paymentDao.getPaymentAuditLogsWithHistoryForId(savedPayment.getId(), AuditLevel.FULL, internalCallContext);
+ Assert.assertEquals(auditLogsWithHistory.size(), 2);
+
+ history1 = (PaymentModelDao) auditLogsWithHistory.get(0).getEntity();
+ PaymentModelDao history2 = (PaymentModelDao) auditLogsWithHistory.get(1).getEntity();
+ Assert.assertEquals(auditLogsWithHistory.get(0).getChangeType(), ChangeType.INSERT);
+ Assert.assertEquals(history1.getAccountRecordId(), savedPayment.getAccountRecordId());
+ Assert.assertEquals(history1.getTenantRecordId(), savedPayment.getTenantRecordId());
+ Assert.assertEquals(history1.getExternalKey(), savedPayment.getExternalKey());
+ Assert.assertEquals(auditLogsWithHistory.get(1).getChangeType(), ChangeType.UPDATE);
+ Assert.assertEquals(history2.getAccountRecordId(), savedPayment.getAccountRecordId());
+ Assert.assertEquals(history2.getTenantRecordId(), savedPayment.getTenantRecordId());
+ Assert.assertEquals(history2.getExternalKey(), savedPayment.getExternalKey());
+ Assert.assertTrue(history2.getUpdatedDate().compareTo(history2.getUpdatedDate()) >= 0);
+ Assert.assertNull(history2.getStateName());
+ Assert.assertNull(history2.getLastSuccessStateName());
final List<PaymentTransactionModelDao> transactions = paymentDao.getTransactionsForPayment(savedPayment.getId(), internalCallContext);
assertEquals(transactions.size(), 2);
@@ -203,24 +208,28 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
assertEquals(savedPayment4.getStateName(), "AUTH_ABORTED");
assertEquals(savedPayment4.getLastSuccessStateName(), "AUTH_SUCCESS");
- final List<EntityHistoryModelDao<PaymentModelDao, Payment>> history3 = getPaymentHistory(savedPayment.getRecordId());
- Assert.assertEquals(history3.size(), 3);
- Assert.assertEquals(history3.get(0).getChangeType(), ChangeType.INSERT);
- Assert.assertEquals(history3.get(0).getEntity().getAccountRecordId(), savedPayment.getAccountRecordId());
- Assert.assertEquals(history3.get(0).getEntity().getTenantRecordId(), savedPayment.getTenantRecordId());
- Assert.assertEquals(history3.get(0).getEntity().getExternalKey(), savedPayment.getExternalKey());
- Assert.assertEquals(history3.get(1).getChangeType(), ChangeType.UPDATE);
- Assert.assertEquals(history3.get(1).getEntity().getAccountRecordId(), savedPayment.getAccountRecordId());
- Assert.assertEquals(history3.get(1).getEntity().getTenantRecordId(), savedPayment.getTenantRecordId());
- Assert.assertEquals(history3.get(1).getEntity().getExternalKey(), savedPayment.getExternalKey());
- Assert.assertTrue(history3.get(1).getEntity().getUpdatedDate().compareTo(history3.get(0).getEntity().getUpdatedDate()) >= 0);
- Assert.assertEquals(history3.get(2).getChangeType(), ChangeType.UPDATE);
- Assert.assertEquals(history3.get(2).getEntity().getAccountRecordId(), savedPayment.getAccountRecordId());
- Assert.assertEquals(history3.get(2).getEntity().getTenantRecordId(), savedPayment.getTenantRecordId());
- Assert.assertEquals(history3.get(2).getEntity().getExternalKey(), savedPayment.getExternalKey());
- Assert.assertTrue(history3.get(2).getEntity().getUpdatedDate().compareTo(history3.get(2).getEntity().getUpdatedDate()) >= 0);
- Assert.assertEquals(history3.get(2).getEntity().getStateName(), savedPayment4.getStateName());
- Assert.assertEquals(history3.get(2).getEntity().getLastSuccessStateName(), savedPayment4.getLastSuccessStateName());
+ auditLogsWithHistory = paymentDao.getPaymentAuditLogsWithHistoryForId(savedPayment.getId(), AuditLevel.FULL, internalCallContext);
+ Assert.assertEquals(auditLogsWithHistory.size(), 3);
+
+ history1 = (PaymentModelDao) auditLogsWithHistory.get(0).getEntity();
+ history2 = (PaymentModelDao) auditLogsWithHistory.get(1).getEntity();
+ final PaymentModelDao history3 = (PaymentModelDao) auditLogsWithHistory.get(2).getEntity();
+ Assert.assertEquals(auditLogsWithHistory.get(0).getChangeType(), ChangeType.INSERT);
+ Assert.assertEquals(history1.getAccountRecordId(), savedPayment.getAccountRecordId());
+ Assert.assertEquals(history1.getTenantRecordId(), savedPayment.getTenantRecordId());
+ Assert.assertEquals(history1.getExternalKey(), savedPayment.getExternalKey());
+ Assert.assertEquals(auditLogsWithHistory.get(1).getChangeType(), ChangeType.UPDATE);
+ Assert.assertEquals(history2.getAccountRecordId(), savedPayment.getAccountRecordId());
+ Assert.assertEquals(history2.getTenantRecordId(), savedPayment.getTenantRecordId());
+ Assert.assertEquals(history2.getExternalKey(), savedPayment.getExternalKey());
+ Assert.assertTrue(auditLogsWithHistory.get(1).getEntity().getUpdatedDate().compareTo(auditLogsWithHistory.get(0).getEntity().getUpdatedDate()) >= 0);
+ Assert.assertEquals(auditLogsWithHistory.get(2).getChangeType(), ChangeType.UPDATE);
+ Assert.assertEquals(history3.getAccountRecordId(), savedPayment.getAccountRecordId());
+ Assert.assertEquals(history3.getTenantRecordId(), savedPayment.getTenantRecordId());
+ Assert.assertEquals(history3.getExternalKey(), savedPayment.getExternalKey());
+ Assert.assertTrue(history3.getUpdatedDate().compareTo(history3.getUpdatedDate()) >= 0);
+ Assert.assertEquals(history3.getStateName(), savedPayment4.getStateName());
+ Assert.assertEquals(history3.getLastSuccessStateName(), savedPayment4.getLastSuccessStateName());
final PaymentTransactionModelDao savedTransactionModelDao4 = paymentDao.getPaymentTransaction(savedTransactionModelDao2.getId(), internalCallContext);
assertEquals(savedTransactionModelDao4.getTransactionExternalKey(), transactionExternalKey2);
@@ -301,11 +310,11 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
final UUID paymentMethodId = UUID.randomUUID();
final UUID accountId = UUID.randomUUID();
- final String externalKey = "hhhhooo";
- final String transactionExternalKey1 = "transaction1";
- final String transactionExternalKey2 = "transaction2";
- final String transactionExternalKey3 = "transaction3";
- final String transactionExternalKey4 = "transaction4";
+ final String externalKey = UUID.randomUUID().toString();
+ final String transactionExternalKey1 = UUID.randomUUID().toString();
+ final String transactionExternalKey2 = UUID.randomUUID().toString();
+ final String transactionExternalKey3 = UUID.randomUUID().toString();
+ final String transactionExternalKey4 = UUID.randomUUID().toString();
final DateTime initialTime = clock.getUTCNow().minusMinutes(1);
@@ -376,20 +385,20 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
@Test(groups = "slow")
public void testPaymentByStatesAcrossTenants() throws Exception {
- final String externalKey1 = "XXhhhhooo1";
- final String transactionExternalKey1 = "transactionXX1";
+ final String externalKey1 = UUID.randomUUID().toString();
+ final String transactionExternalKey1 = UUID.randomUUID().toString();
- final String externalKey2 = "XXhhhhooo2";
- final String transactionExternalKey2 = "transactionXX2";
+ final String externalKey2 = UUID.randomUUID().toString();
+ final String transactionExternalKey2 = UUID.randomUUID().toString();
- final String externalKey3 = "XXhhhhooo3";
- final String transactionExternalKey3 = "transactionXX3";
+ final String externalKey3 = UUID.randomUUID().toString();
+ final String transactionExternalKey3 = UUID.randomUUID().toString();
- final String externalKey4 = "XXhhhhooo4";
- final String transactionExternalKey4 = "transactionXX4";
+ final String externalKey4 = UUID.randomUUID().toString();
+ final String transactionExternalKey4 = UUID.randomUUID().toString();
- final String externalKey5 = "XXhhhhooo5";
- final String transactionExternalKey5 = "transactionXX5";
+ final String externalKey5 = UUID.randomUUID().toString();
+ final String transactionExternalKey5 = UUID.randomUUID().toString();
final DateTime createdAfterDate = clock.getUTCNow().minusDays(10);
final DateTime createdBeforeDate = clock.getUTCNow().minusDays(1);
@@ -542,8 +551,8 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
final Account account = testHelper.createTestAccount(UUID.randomUUID().toString(), true);
- final String externalKey1 = "2354";
- final String transactionExternalKey1 = "jkjkjk";
+ final String externalKey1 = UUID.randomUUID().toString();
+ final String transactionExternalKey1 = UUID.randomUUID().toString();
final String stateName = "RRRRR";
final String pluginName = "elated";
@@ -597,11 +606,5 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
}
}));
}
-
- private List<EntityHistoryModelDao<PaymentModelDao, Payment>> getPaymentHistory(final Long paymentRecordId) {
- // See https://github.com/killbill/killbill/issues/335
- final PaymentSqlDao paymentSqlDao = dbi.onDemand(PaymentSqlDao.class);
- return paymentSqlDao.getHistoryForTargetRecordId(paymentRecordId, internalCallContext);
- }
}
diff --git a/payment/src/test/java/org/killbill/billing/payment/dispatcher/TestPluginDispatcher.java b/payment/src/test/java/org/killbill/billing/payment/dispatcher/TestPluginDispatcher.java
index b582f33..32e4e38 100644
--- a/payment/src/test/java/org/killbill/billing/payment/dispatcher/TestPluginDispatcher.java
+++ b/payment/src/test/java/org/killbill/billing/payment/dispatcher/TestPluginDispatcher.java
@@ -43,6 +43,9 @@ public class TestPluginDispatcher extends PaymentTestSuiteNoDB {
@BeforeMethod(groups = "fast")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
super.beforeMethod();
eventBus.start();
voidPluginDispatcher = new PluginDispatcher<Void>(10, paymentExecutors);
diff --git a/payment/src/test/java/org/killbill/billing/payment/invoice/dao/TestInvoicePaymentControlDao.java b/payment/src/test/java/org/killbill/billing/payment/invoice/dao/TestInvoicePaymentControlDao.java
index 5768cbc..3a3b1e0 100644
--- a/payment/src/test/java/org/killbill/billing/payment/invoice/dao/TestInvoicePaymentControlDao.java
+++ b/payment/src/test/java/org/killbill/billing/payment/invoice/dao/TestInvoicePaymentControlDao.java
@@ -35,6 +35,10 @@ public class TestInvoicePaymentControlDao extends PaymentTestSuiteWithEmbeddedDB
@BeforeClass(groups = "slow")
protected void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
dao = new InvoicePaymentControlDao(dbi);
}
diff --git a/payment/src/test/java/org/killbill/billing/payment/provider/TestExternalPaymentProviderPlugin.java b/payment/src/test/java/org/killbill/billing/payment/provider/TestExternalPaymentProviderPlugin.java
index 5bd6128..d2a0430 100644
--- a/payment/src/test/java/org/killbill/billing/payment/provider/TestExternalPaymentProviderPlugin.java
+++ b/payment/src/test/java/org/killbill/billing/payment/provider/TestExternalPaymentProviderPlugin.java
@@ -44,6 +44,9 @@ public class TestExternalPaymentProviderPlugin extends PaymentTestSuiteNoDB {
@Override
@BeforeMethod(groups = "fast")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
super.beforeMethod();
plugin = new ExternalPaymentProviderPlugin(clock, paymentConfig);
}
diff --git a/payment/src/test/java/org/killbill/billing/payment/TestJanitor.java b/payment/src/test/java/org/killbill/billing/payment/TestJanitor.java
index 1f2e03a..704250d 100644
--- a/payment/src/test/java/org/killbill/billing/payment/TestJanitor.java
+++ b/payment/src/test/java/org/killbill/billing/payment/TestJanitor.java
@@ -47,6 +47,7 @@ import org.killbill.billing.payment.api.TransactionType;
import org.killbill.billing.payment.bus.PaymentBusEventHandler;
import org.killbill.billing.payment.core.janitor.Janitor;
import org.killbill.billing.payment.dao.PaymentAttemptModelDao;
+import org.killbill.billing.payment.dao.PaymentModelDao;
import org.killbill.billing.payment.dao.PaymentTransactionModelDao;
import org.killbill.billing.payment.glue.DefaultPaymentService;
import org.killbill.billing.payment.invoice.InvoicePaymentControlPluginApi;
@@ -55,6 +56,8 @@ import org.killbill.billing.payment.plugin.api.PaymentTransactionInfoPlugin;
import org.killbill.billing.payment.provider.DefaultNoOpPaymentInfoPlugin;
import org.killbill.billing.payment.provider.MockPaymentProviderPlugin;
import org.killbill.billing.platform.api.KillbillConfigSource;
+import org.killbill.billing.util.api.AuditLevel;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.entity.dao.DBRouterUntyped;
import org.killbill.billing.util.entity.dao.DBRouterUntyped.THREAD_STATE;
@@ -127,12 +130,19 @@ public class TestJanitor extends PaymentTestSuiteWithEmbeddedDB {
@BeforeClass(groups = "slow")
protected void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
super.beforeClass();
mockPaymentProviderPlugin = (MockPaymentProviderPlugin) registry.getServiceForName(MockPaymentProviderPlugin.PLUGIN_NAME);
}
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
retryService.initialize();
@@ -331,7 +341,7 @@ public class TestJanitor extends PaymentTestSuiteWithEmbeddedDB {
"foo", "bar", internalCallContext);
testListener.assertListenerStatus();
- final List<PaymentTransactionModelDao> paymentTransactionHistoryBeforeJanitor = getPaymentTransactionHistory(transactionExternalKey);
+ final List<AuditLogWithHistory> paymentTransactionHistoryBeforeJanitor = paymentDao.getPaymentTransactionAuditLogsWithHistoryForId(payment.getTransactions().get(0).getId(), AuditLevel.FULL, internalCallContext);
Assert.assertEquals(paymentTransactionHistoryBeforeJanitor.size(), 3);
// Move clock for notification to be processed
@@ -341,9 +351,11 @@ public class TestJanitor extends PaymentTestSuiteWithEmbeddedDB {
testListener.assertListenerStatus();
// Proves the Janitor ran (and updated the transaction)
- final List<PaymentTransactionModelDao> paymentTransactionHistoryAfterJanitor = getPaymentTransactionHistory(transactionExternalKey);
+ final List<AuditLogWithHistory> paymentTransactionHistoryAfterJanitor = paymentDao.getPaymentTransactionAuditLogsWithHistoryForId(payment.getTransactions().get(0).getId(), AuditLevel.FULL, internalCallContext);
Assert.assertEquals(paymentTransactionHistoryAfterJanitor.size(), 4);
- Assert.assertEquals(paymentTransactionHistoryAfterJanitor.get(3).getTransactionStatus(), TransactionStatus.PAYMENT_FAILURE);
+
+ PaymentTransactionModelDao history3 = (PaymentTransactionModelDao) paymentTransactionHistoryAfterJanitor.get(3).getEntity();
+ Assert.assertEquals(history3.getTransactionStatus(), TransactionStatus.PAYMENT_FAILURE);
final Payment updatedPayment = paymentApi.getPayment(payment.getId(), false, false, ImmutableList.<PluginProperty>of(), callContext);
// Janitor should have moved us to PAYMENT_FAILURE
@@ -381,11 +393,11 @@ public class TestJanitor extends PaymentTestSuiteWithEmbeddedDB {
// NO because we will keep retrying as we can't fix it...
//assertNotificationsCompleted(internalCallContext, 5);
- final List<PaymentTransactionModelDao> paymentTransactionHistoryBeforeJanitor = getPaymentTransactionHistory(transactionExternalKey);
+ final List<AuditLogWithHistory> paymentTransactionHistoryBeforeJanitor = paymentDao.getPaymentTransactionAuditLogsWithHistoryForId(payment.getTransactions().get(0).getId(), AuditLevel.FULL, internalCallContext);
Assert.assertEquals(paymentTransactionHistoryBeforeJanitor.size(), 3);
// Nothing new happened
- final List<PaymentTransactionModelDao> paymentTransactionHistoryAfterJanitor = getPaymentTransactionHistory(transactionExternalKey);
+ final List<AuditLogWithHistory> paymentTransactionHistoryAfterJanitor = paymentDao.getPaymentTransactionAuditLogsWithHistoryForId(payment.getTransactions().get(0).getId(), AuditLevel.FULL, internalCallContext);
Assert.assertEquals(paymentTransactionHistoryAfterJanitor.size(), 3);
}
@@ -521,35 +533,6 @@ public class TestJanitor extends PaymentTestSuiteWithEmbeddedDB {
return result;
}
- // I wish we had a simplest way to query our history rows..
- private List<PaymentTransactionModelDao> getPaymentTransactionHistory(final String transactionExternalKey) {
- return dbi.withHandle(new HandleCallback<List<PaymentTransactionModelDao>>() {
- @Override
- public List<PaymentTransactionModelDao> withHandle(final Handle handle) throws Exception {
- final List<Map<String, Object>> queryResult = handle.select("select * from payment_transaction_history where transaction_external_key = ? order by record_id asc",
- transactionExternalKey);
- final List<PaymentTransactionModelDao> result = new ArrayList<PaymentTransactionModelDao>(queryResult.size());
- for (final Map<String, Object> row : queryResult) {
- final PaymentTransactionModelDao transactionModelDao = new PaymentTransactionModelDao(UUID.fromString((String) row.get("id")),
- null,
- (String) row.get("transaction_external_key"),
- null,
- null,
- UUID.fromString((String) row.get("payment_id")),
- TransactionType.valueOf((String) row.get("transaction_type")),
- null,
- TransactionStatus.valueOf((String) row.get("transaction_status")),
- (BigDecimal) row.get("amount"),
- Currency.valueOf((String) row.get("currency")),
- (String) row.get("gateway_error_code"),
- String.valueOf(row.get("gateway_error_msg")));
- result.add(transactionModelDao);
- }
- return result;
- }
- });
- }
-
private void assertNotificationsCompleted(final InternalCallContext internalCallContext, final long timeoutSec) {
try {
await().atMost(timeoutSec, SECONDS).until(new Callable<Boolean>() {
diff --git a/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java b/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java
index 1ce8045..5d3ae1a 100644
--- a/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java
+++ b/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java
@@ -61,6 +61,10 @@ public class TestRetryService extends PaymentTestSuiteNoDB {
@Override
@BeforeMethod(groups = "fast")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
setDefaultPollInterval(Duration.ONE_HUNDRED_MILLISECONDS);
@@ -74,6 +78,10 @@ public class TestRetryService extends PaymentTestSuiteNoDB {
@Override
@AfterMethod(groups = "fast")
public void afterMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.afterMethod();
retryService.stop();
}
pom.xml 2(+1 -1)
diff --git a/pom.xml b/pom.xml
index 0737bf3..de60a0e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
<parent>
<artifactId>killbill-oss-parent</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.141.62</version>
+ <version>0.141.65</version>
</parent>
<artifactId>killbill</artifactId>
<version>0.19.14-SNAPSHOT</version>
diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/notifications/PushNotificationListener.java b/profiles/killbill/src/main/java/org/killbill/billing/server/notifications/PushNotificationListener.java
index abb1544..4ec1caf 100644
--- a/profiles/killbill/src/main/java/org/killbill/billing/server/notifications/PushNotificationListener.java
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/notifications/PushNotificationListener.java
@@ -127,6 +127,7 @@ public class PushNotificationListener {
private boolean doPost(final UUID tenantId, final String url, final String body, final NotificationJson notification,
final int timeoutSec, final int attemptRetryNumber) {
+ log.info("Sending push notification url='{}', body='{}', attemptRetryNumber='{}'", url, body, attemptRetryNumber);
final BoundRequestBuilder builder = httpClient.preparePost(url);
builder.setBody(body == null ? "{}" : body);
builder.addHeader(HTTP_HEADER_CONTENT_TYPE, CONTENT_TYPE_JSON);
@@ -142,7 +143,7 @@ public class PushNotificationListener {
});
response = futureStatus.get(timeoutSec, TimeUnit.SECONDS);
} catch (final TimeoutException toe) {
- saveRetryPushNotificationInQueue(tenantId, url, notification, attemptRetryNumber);
+ saveRetryPushNotificationInQueue(tenantId, url, notification, attemptRetryNumber, "Timeout");
return false;
} catch (final Exception e) {
log.warn("Failed to push notification url='{}', tenantId='{}'", url, tenantId, e);
@@ -152,7 +153,7 @@ public class PushNotificationListener {
if (response.getStatusCode() >= 200 && response.getStatusCode() < 300) {
return true;
} else {
- saveRetryPushNotificationInQueue(tenantId, url, notification, attemptRetryNumber);
+ saveRetryPushNotificationInQueue(tenantId, url, notification, attemptRetryNumber, "statusCode=" + response.getStatusCode());
return false;
}
}
@@ -168,7 +169,7 @@ public class PushNotificationListener {
doPost(key.getTenantId(), key.getUrl(), body, notification, TIMEOUT_NOTIFICATION, key.getAttemptNumber());
}
- private void saveRetryPushNotificationInQueue(final UUID tenantId, final String url, final NotificationJson notificationJson, final int attemptRetryNumber) {
+ private void saveRetryPushNotificationInQueue(final UUID tenantId, final String url, final NotificationJson notificationJson, final int attemptRetryNumber, final String reason) {
final PushNotificationKey key = new PushNotificationKey(tenantId,
notificationJson.getAccountId(),
notificationJson.getEventType(),
@@ -185,16 +186,16 @@ public class PushNotificationListener {
log.warn("Max attempt number reached for push notification url='{}', tenantId='{}'", key.getUrl(), key.getTenantId());
return;
}
- log.debug("Push notification is scheduled to send at {} for url='{}', tenantId='{}'", nextNotificationTime, key.getUrl(), key.getTenantId());
+ log.warn("Push notification {} is re-scheduled to be sent at {}, url='{}', reason='{}'", key, nextNotificationTime, key.getUrl(), reason);
final Long accountRecordId = internalCallContextFactory.getRecordIdFromObject(key.getAccountId(), ObjectType.ACCOUNT, tenantContext);
final Long tenantRecordId = internalCallContextFactory.getRecordIdFromObject(key.getTenantId(), ObjectType.TENANT, tenantContext);
try {
final NotificationQueue notificationQueue = notificationQueueService.getNotificationQueue(DefaultServerService.SERVER_SERVICE, PushNotificationRetryService.QUEUE_NAME);
notificationQueue.recordFutureNotification(nextNotificationTime, key, null, MoreObjects.firstNonNull(accountRecordId, new Long(0)), tenantRecordId);
- } catch (NoSuchNotificationQueue noSuchNotificationQueue) {
+ } catch (final NoSuchNotificationQueue noSuchNotificationQueue) {
log.error("Failed to push notification url='{}', tenantId='{}'", key.getUrl(), key.getTenantId(), noSuchNotificationQueue);
- } catch (IOException e) {
+ } catch (final IOException e) {
log.error("Failed to push notification url='{}', tenantId='{}'", key.getUrl(), key.getTenantId(), e);
}
}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/CallbackServer.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/CallbackServer.java
new file mode 100644
index 0000000..15654a2
--- /dev/null
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/CallbackServer.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
+ *
+ * The Billing Project 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 org.killbill.billing.jaxrs;
+
+import javax.servlet.Servlet;
+
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+
+public class CallbackServer {
+
+ private static final int SERVER_PORT = 8087;
+ private static final String CALLBACK_ENDPOINT = "/callmeback";
+
+ private final Server server;
+ private final String callbackEndpoint;
+ private final Servlet servlet;
+
+ public CallbackServer(final Servlet servlet) {
+ this.callbackEndpoint = CALLBACK_ENDPOINT;
+ this.servlet = servlet;
+ this.server = new Server(SERVER_PORT);
+ }
+
+ public void startServer() throws Exception {
+ final ServletContextHandler context = new ServletContextHandler();
+ context.setContextPath("/");
+ server.setHandler(context);
+ context.addServlet(new ServletHolder(servlet), callbackEndpoint);
+ server.start();
+ }
+
+ public void stopServer() throws Exception {
+ server.stop();
+ }
+
+ public static String getServletEndpoint() {
+ return "http://127.0.0.1:" + SERVER_PORT + CALLBACK_ENDPOINT;
+ }
+}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/CallbackServlet.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/CallbackServlet.java
new file mode 100644
index 0000000..bf0535d
--- /dev/null
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/CallbackServlet.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
+ *
+ * The Billing Project 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 org.killbill.billing.jaxrs;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Stack;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.killbill.billing.jaxrs.json.NotificationJson;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.Joiner;
+import com.google.common.io.CharStreams;
+
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
+public class CallbackServlet extends HttpServlet {
+
+ private static final Logger log = LoggerFactory.getLogger(CallbackServlet.class);
+
+ private static final ObjectMapper objectMapper = new ObjectMapper();
+ private static final Joiner SPACE_JOINER = Joiner.on(" ");
+ private static final long DELAY = 60000;
+
+ // Cross tenants (for now)
+ private final Collection<ExtBusEventType> nextExpectedEvent = new Stack<ExtBusEventType>();
+
+ private boolean isListenerFailed = false;
+ private String listenerFailedMsg;
+ private boolean completed = true;
+
+ final AtomicInteger receivedCalls = new AtomicInteger(0);
+ final AtomicBoolean forceToFail = new AtomicBoolean(false);
+
+ @Override
+ protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
+ final int current = receivedCalls.incrementAndGet();
+ if (forceToFail.get()) {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ log.info("CallmebackServlet is forced to fail for testing purposes");
+ return;
+ }
+
+ final String body = CharStreams.toString(new InputStreamReader(request.getInputStream(), "UTF-8"));
+ response.setStatus(HttpServletResponse.SC_OK);
+
+ final NotificationJson notification = objectMapper.readValue(body, NotificationJson.class);
+ log.info("Got notification: {}", notification);
+ assertEqualsNicely(notification.getEventType() == null ? null : ExtBusEventType.valueOf(notification.getEventType()));
+ notifyIfStackEmpty();
+ }
+
+ public void assertListenerStatus() {
+ // Bail early
+ if (isListenerFailed) {
+ log.error(listenerFailedMsg);
+ Assert.fail(listenerFailedMsg);
+ }
+
+ try {
+ assertTrue(isCompleted(DELAY));
+ } catch (final Exception e) {
+ fail("assertListenerStatus didn't complete", e);
+ }
+
+ if (isListenerFailed) {
+ log.error(listenerFailedMsg);
+ Assert.fail(listenerFailedMsg);
+ }
+ }
+
+ public synchronized void reset() {
+ receivedCalls.set(0);
+ forceToFail.set(false);
+ nextExpectedEvent.clear();
+ completed = true;
+
+ isListenerFailed = false;
+ listenerFailedMsg = null;
+ }
+
+ public void pushExpectedEvents(final ExtBusEventType... events) {
+ for (final ExtBusEventType event : events) {
+ pushExpectedEvent(event);
+ }
+ }
+
+ public synchronized void pushExpectedEvent(final ExtBusEventType next) {
+ nextExpectedEvent.add(next);
+ log.info("Stacking expected event {}, got [{}]", next, SPACE_JOINER.join(nextExpectedEvent));
+ completed = false;
+ }
+
+ private synchronized boolean isCompleted(final long timeout) {
+ long waitTimeMs = timeout;
+ do {
+ try {
+ final long before = System.currentTimeMillis();
+ wait(100);
+ final long after = System.currentTimeMillis();
+ waitTimeMs -= (after - before);
+ } catch (final Exception ignore) {
+ return false;
+ }
+ } while (waitTimeMs > 0 && !completed);
+
+ if (!completed) {
+ log.error("CallbackServlet did not complete in " + timeout + " ms, remaining events are " + SPACE_JOINER.join(nextExpectedEvent));
+ }
+ return completed;
+ }
+
+ private synchronized void notifyIfStackEmpty() {
+ if (nextExpectedEvent.isEmpty()) {
+ log.debug("CallbackServlet EMPTY");
+ completed = true;
+ notify();
+ }
+ }
+
+ private synchronized void assertEqualsNicely(final ExtBusEventType received) {
+ boolean foundIt = false;
+ final Iterator<ExtBusEventType> it = nextExpectedEvent.iterator();
+ while (it.hasNext()) {
+ final ExtBusEventType ev = it.next();
+ if (ev == received) {
+ it.remove();
+ foundIt = true;
+ log.info("Found expected event: {}; remaining expected events [{}]", received, SPACE_JOINER.join(nextExpectedEvent));
+ break;
+ }
+ }
+ if (!foundIt) {
+ final String errorMsg = "CallbackServlet: received unexpected event " + received + "; remaining expected events [" + SPACE_JOINER.join(nextExpectedEvent) + "]";
+ log.error(errorMsg);
+ failed(errorMsg);
+ }
+ }
+
+ private void failed(final String msg) {
+ this.isListenerFailed = true;
+ this.listenerFailedMsg = msg;
+ }
+}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/KillbillClient.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/KillbillClient.java
index ffdbd07..732e860 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/KillbillClient.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/KillbillClient.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
* The Billing Project 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
@@ -38,6 +38,7 @@ import org.killbill.billing.client.model.PaymentMethodPluginDetail;
import org.killbill.billing.client.model.PluginProperty;
import org.killbill.billing.client.model.Subscription;
import org.killbill.billing.client.model.Tags;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.payment.provider.ExternalPaymentProviderPlugin;
import org.killbill.billing.util.UUIDs;
import org.killbill.billing.util.tag.ControlTagType;
@@ -53,6 +54,9 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
protected static final String DEFAULT_CURRENCY = "USD";
+ // static to be shared across test class instances (initialized once in @BeforeSuite)
+ protected static CallbackServlet callbackServlet;
+
// Multi-Tenancy information, if enabled
protected String DEFAULT_API_KEY = UUID.randomUUID().toString();
protected String DEFAULT_API_SECRET = UUID.randomUUID().toString();
@@ -100,20 +104,22 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
}
protected Account createAccountWithDefaultPaymentMethod(final String externalkey) throws Exception {
- return createAccountWithDefaultPaymentMethod(externalkey, null);
+ return createAccountWithDefaultPaymentMethod(externalkey, null);
}
protected Account createAccountWithDefaultPaymentMethod() throws Exception {
- return createAccountWithDefaultPaymentMethod(UUID.randomUUID().toString(), null);
+ return createAccountWithDefaultPaymentMethod(UUID.randomUUID().toString(), null);
}
protected Account createAccountWithDefaultPaymentMethod(final String externalkey, @Nullable final List<PluginProperty> pmProperties) throws Exception {
final Account input = createAccount();
+ callbackServlet.pushExpectedEvent(ExtBusEventType.ACCOUNT_CHANGE);
final PaymentMethodPluginDetail info = new PaymentMethodPluginDetail();
info.setProperties(pmProperties);
final PaymentMethod paymentMethodJson = new PaymentMethod(null, externalkey, input.getAccountId(), true, PLUGIN_NAME, info);
killBillClient.createPaymentMethod(paymentMethodJson, createdBy, reason, comment);
+ callbackServlet.assertListenerStatus();
return killBillClient.getAccount(input.getExternalKey());
}
@@ -126,10 +132,15 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
}
protected PaymentMethod createPaymentMethod(final Account input, final boolean isDefault) throws KillBillClientException {
+ if (isDefault) {
+ callbackServlet.pushExpectedEvent(ExtBusEventType.ACCOUNT_CHANGE);
+ }
final PaymentMethodPluginDetail info = new PaymentMethodPluginDetail();
final PaymentMethod paymentMethodJson = new PaymentMethod(null, UUIDs.randomUUID().toString(), input.getAccountId(),
isDefault, ExternalPaymentProviderPlugin.PLUGIN_NAME, info);
- return killBillClient.createPaymentMethod(paymentMethodJson, requestOptions);
+ final PaymentMethod paymentMethod = killBillClient.createPaymentMethod(paymentMethodJson, requestOptions);
+ callbackServlet.assertListenerStatus();
+ return paymentMethod;
}
protected Account createAccount() throws Exception {
@@ -137,12 +148,25 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
}
protected Account createAccount(final UUID parentAccountId) throws Exception {
+ callbackServlet.pushExpectedEvent(ExtBusEventType.ACCOUNT_CREATION);
+ final Account account = createAccountNoEvent(parentAccountId);
+ callbackServlet.assertListenerStatus();
+ return account;
+ }
+
+ protected Account createAccountNoEvent(final UUID parentAccountId) throws KillBillClientException {
final Account input = getAccount(parentAccountId);
return killBillClient.createAccount(input, createdBy, reason, comment);
}
protected Subscription createEntitlement(final UUID accountId, final String bundleExternalKey, final String productName,
final ProductCategory productCategory, final BillingPeriod billingPeriod, final boolean waitCompletion) throws Exception {
+ final Account account = killBillClient.getAccount(accountId, requestOptions);
+ if (account.getBillCycleDayLocal() == null || account.getBillCycleDayLocal() == 0) {
+ callbackServlet.pushExpectedEvent(ExtBusEventType.ACCOUNT_CHANGE);
+ }
+ callbackServlet.pushExpectedEvents(ExtBusEventType.ENTITLEMENT_CREATION, ExtBusEventType.SUBSCRIPTION_CREATION, ExtBusEventType.SUBSCRIPTION_CREATION, ExtBusEventType.INVOICE_CREATION);
+
final Subscription input = new Subscription();
input.setAccountId(accountId);
input.setExternalKey(bundleExternalKey);
@@ -151,19 +175,46 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
input.setBillingPeriod(billingPeriod);
input.setPriceList(PriceListSet.DEFAULT_PRICELIST_NAME);
- return killBillClient.createSubscription(input, null, null, waitCompletion ? DEFAULT_WAIT_COMPLETION_TIMEOUT_SEC : -1, false, requestOptions);
+ final Subscription subscription = killBillClient.createSubscription(input, null, null, waitCompletion ? DEFAULT_WAIT_COMPLETION_TIMEOUT_SEC : -1, false, requestOptions);
+ callbackServlet.assertListenerStatus();
+
+ return subscription;
}
protected Account createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice() throws Exception {
+ return createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice(true);
+ }
+
+ protected Account createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice(final boolean paymentSuccess) throws Exception {
+ return createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice("Shotgun", paymentSuccess);
+ }
+
+ protected Account createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice(final String productName, final boolean paymentSuccess) throws Exception {
+ return createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice(productName, paymentSuccess, paymentSuccess);
+ }
+
+ protected Account createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice(final String productName, final boolean invoicePaymentSuccess, final boolean paymentSuccess) throws Exception {
final Account accountJson = createAccountWithDefaultPaymentMethod();
assertNotNull(accountJson);
// Add a bundle, subscription and move the clock to get the first invoice
- final Subscription subscriptionJson = createEntitlement(accountJson.getAccountId(), UUID.randomUUID().toString(), "Shotgun",
+ final Subscription subscriptionJson = createEntitlement(accountJson.getAccountId(), UUID.randomUUID().toString(), productName,
ProductCategory.BASE, BillingPeriod.MONTHLY, true);
assertNotNull(subscriptionJson);
+
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE, ExtBusEventType.INVOICE_CREATION);
+ if (invoicePaymentSuccess) {
+ callbackServlet.pushExpectedEvents(ExtBusEventType.INVOICE_PAYMENT_SUCCESS);
+ } else {
+ callbackServlet.pushExpectedEvents(ExtBusEventType.INVOICE_PAYMENT_FAILED);
+ }
+ if (paymentSuccess) {
+ callbackServlet.pushExpectedEvents(ExtBusEventType.PAYMENT_SUCCESS);
+ } else {
+ callbackServlet.pushExpectedEvents(ExtBusEventType.PAYMENT_FAILED);
+ }
clock.addDays(32);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
return accountJson;
}
@@ -172,7 +223,9 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
final Account accountJson = createAccountWithExternalPaymentMethod();
assertNotNull(accountJson);
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TAG_CREATION);
final Tags accountTag = killBillClient.createAccountTag(accountJson.getAccountId(), ControlTagType.MANUAL_PAY.getId(), requestOptions);
+ callbackServlet.assertListenerStatus();
assertNotNull(accountTag);
assertEquals(accountTag.get(0).getTagDefinitionId(), ControlTagType.MANUAL_PAY.getId());
@@ -180,8 +233,10 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
final Subscription subscriptionJson = createEntitlement(accountJson.getAccountId(), UUID.randomUUID().toString(), "Shotgun",
ProductCategory.BASE, BillingPeriod.MONTHLY, true);
assertNotNull(subscriptionJson);
+
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE, ExtBusEventType.INVOICE_CREATION);
clock.addDays(32);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
return accountJson;
}
@@ -208,10 +263,11 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
final Subscription subscriptionJson = createEntitlement(accountJson.getAccountId(), UUID.randomUUID().toString(), "Shotgun",
ProductCategory.BASE, BillingPeriod.MONTHLY, true);
assertNotNull(subscriptionJson);
- clock.addMonths(1);
- crappyWaitForLackOfProperSynchonization();
// No payment will be triggered as the account doesn't have a payment method
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE, ExtBusEventType.INVOICE_CREATION, ExtBusEventType.INVOICE_PAYMENT_FAILED);
+ clock.addMonths(1);
+ callbackServlet.assertListenerStatus();
return accountJson;
}
@@ -249,18 +305,4 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
return new Account(accountId, name, length, externalKey, email, null, currency, parentAccountId, isPaymentDelegatedToParent, null, null, timeZone,
address1, address2, postalCode, company, city, state, country, locale, phone, notes, false, false, null, null);
}
-
- /**
- * We could implement a ClockResource in jaxrs with the ability to sync on user token
- * but until we have a strong need for it, this is in the TODO list...
- */
- protected void crappyWaitForLackOfProperSynchonization() throws Exception {
- crappyWaitForLackOfProperSynchonization(5000);
- }
-
-
- protected void crappyWaitForLackOfProperSynchonization(int sleepValueMSec) throws Exception {
- Thread.sleep(sleepValueMSec);
- }
-
}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
index 66ff2e5..031493d 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
@@ -20,6 +20,7 @@ package org.killbill.billing.jaxrs;
import java.math.BigDecimal;
import java.util.Collection;
+import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
@@ -53,6 +54,7 @@ import com.google.inject.Inject;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
@@ -66,12 +68,20 @@ public class TestAccount extends TestJaxrsBase {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
mockPaymentProviderPlugin = (MockPaymentProviderPlugin) registry.getServiceForName(PLUGIN_NAME);
}
@AfterMethod(groups = "slow")
public void tearDown() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
mockPaymentProviderPlugin.clear();
}
@@ -551,4 +561,37 @@ public class TestAccount extends TestJaxrsBase {
assertEquals(auditLogsJson.get(3).getObjectId(), accountCustomFields.get(2).getCustomFieldId());
}
+ @Test(groups = "slow", description = "retrieve account logs")
+ public void testGetAccountAuditLogsWithHistory() throws Exception {
+ final Account accountJson = createAccount();
+ assertNotNull(accountJson);
+
+ // Update Account
+ final Account newInput = new Account(accountJson.getAccountId(),
+ "zozo", 4, accountJson.getExternalKey(), "rr@google.com", 18,
+ "USD", null, false, null, null, "UTC",
+ "bl1", "bh2", "", "", "ca", "San Francisco", "usa", "en", "415-255-2991",
+ "notes", false, false, null, null);
+
+ final Account updatedAccount = killBillClient.updateAccount(newInput, requestOptions);
+
+
+ final List<AuditLog> auditLogWithHistories = killBillClient.getAccountAuditLogsWithHistory(accountJson.getAccountId());
+ assertEquals(auditLogWithHistories.size(), 2);
+ assertEquals(auditLogWithHistories.get(0).getChangeType(), ChangeType.INSERT.toString());
+ assertEquals(auditLogWithHistories.get(0).getObjectType(), ObjectType.ACCOUNT);
+ assertEquals(auditLogWithHistories.get(0).getObjectId(), accountJson.getAccountId());
+
+ final LinkedHashMap history1 = (LinkedHashMap) auditLogWithHistories.get(0).getHistory();
+ assertNotNull(history1);
+ assertEquals(history1.get("externalKey"), accountJson.getExternalKey());
+ assertEquals(history1.get("name"), accountJson.getName());
+
+ final LinkedHashMap history2 = (LinkedHashMap) auditLogWithHistories.get(1).getHistory();
+ assertNotNull(history2);
+ assertEquals(history2.get("externalKey"), accountJson.getExternalKey());
+ assertNotEquals(history2.get("name"), accountJson.getName());
+ assertEquals(history2.get("name"), "zozo");
+ }
+
}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccountEmail.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccountEmail.java
index f0ef8d6..29b6613 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccountEmail.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccountEmail.java
@@ -18,14 +18,21 @@
package org.killbill.billing.jaxrs;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.UUID;
+import org.killbill.billing.ObjectType;
import org.killbill.billing.client.model.Account;
import org.killbill.billing.client.model.AccountEmail;
+import org.killbill.billing.client.model.AuditLog;
+import org.killbill.billing.util.audit.ChangeType;
import org.testng.Assert;
import org.testng.annotations.Test;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
public class TestAccountEmail extends TestJaxrsBase {
@Test(groups = "slow", description = "Can create and delete account emails")
@@ -75,4 +82,30 @@ public class TestAccountEmail extends TestJaxrsBase {
killBillClient.addEmailToAccount(accountEmailJson2, createdBy, reason, comment);
Assert.assertEquals(killBillClient.getEmailsForAccount(accountId), fourthEmails);
}
+
+ @Test(groups = "slow", description = "retrieve account logs")
+ public void testGetAccountEmailAuditLogsWithHistory() throws Exception {
+ final Account accountJson = createAccount();
+ assertNotNull(accountJson);
+
+ final String email1 = UUID.randomUUID().toString();
+ final AccountEmail accountEmailJson1 = new AccountEmail(accountJson.getAccountId(), email1);
+
+ // Add an email
+ killBillClient.addEmailToAccount(accountEmailJson1, requestOptions);
+
+ // get all audit for the account
+ final List<AuditLog> auditLogsJson = killBillClient.getAccountAuditLogs(accountJson.getAccountId());
+ Assert.assertEquals(auditLogsJson.size(), 2);
+
+ final List<AuditLog> emailAuditLogWithHistories = killBillClient.getAccountEmailAuditLogsWithHistory(accountJson.getAccountId(), auditLogsJson.get(0).getObjectId());
+ assertEquals(emailAuditLogWithHistories.size(), 1);
+ assertEquals(emailAuditLogWithHistories.get(0).getChangeType(), ChangeType.INSERT.toString());
+ assertEquals(emailAuditLogWithHistories.get(0).getObjectType(), ObjectType.ACCOUNT_EMAIL);
+ assertEquals(emailAuditLogWithHistories.get(0).getObjectId(), auditLogsJson.get(0).getObjectId());
+
+ final LinkedHashMap history1 = (LinkedHashMap) emailAuditLogWithHistories.get(0).getHistory();
+ assertNotNull(history1);
+ assertEquals(history1.get("email"), email1);
+ }
}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAdmin.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAdmin.java
index 26e2a9c..56e1427 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAdmin.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAdmin.java
@@ -37,6 +37,7 @@ import org.killbill.billing.client.model.Invoice;
import org.killbill.billing.client.model.Payment;
import org.killbill.billing.client.model.PaymentTransaction;
import org.killbill.billing.jaxrs.json.AdminPaymentJson;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.payment.api.TransactionStatus;
import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.jackson.ObjectMapper;
@@ -55,8 +56,7 @@ import static org.testng.Assert.assertNotNull;
public class TestAdmin extends TestJaxrsBase {
- // Flaky, see https://github.com/killbill/killbill/issues/860
- @Test(groups = "slow", retryAnalyzer = FlakyRetryAnalyzer.class)
+ @Test(groups = "slow")
public void testAdminPaymentEndpoint() throws Exception {
final Account account = createAccountWithDefaultPaymentMethod();
@@ -70,32 +70,19 @@ public class TestAdmin extends TestJaxrsBase {
authTransaction.setPaymentExternalKey(paymentExternalKey);
authTransaction.setTransactionExternalKey(authTransactionExternalKey);
authTransaction.setTransactionType("AUTHORIZE");
+ callbackServlet.pushExpectedEvent(ExtBusEventType.PAYMENT_SUCCESS);
final Payment authPayment = killBillClient.createPayment(account.getAccountId(), account.getPaymentMethodId(), authTransaction, requestOptions);
-
- // First fix transactionStatus and paymentSstate (but not lastSuccessPaymentState
- // Note that state is not consistent between TransactionStatus and lastSuccessPaymentState but we don't care.
- fixPaymentState(authPayment, null, "AUTH_FAILED", TransactionStatus.PAYMENT_FAILURE);
-
- final Payment updatedPayment1 = killBillClient.getPayment(authPayment.getPaymentId());
- Assert.assertEquals(updatedPayment1.getTransactions().size(), 1);
- final PaymentTransaction authTransaction1 = updatedPayment1.getTransactions().get(0);
- Assert.assertEquals(authTransaction1.getStatus(), TransactionStatus.PAYMENT_FAILURE.toString());
-
- // Capture should succeed because lastSuccessPaymentState was left untouched
- doCapture(updatedPayment1, false);
+ callbackServlet.assertListenerStatus();
fixPaymentState(authPayment, "AUTH_FAILED", "AUTH_FAILED", TransactionStatus.PAYMENT_FAILURE);
- final Payment updatedPayment2 = killBillClient.getPayment(authPayment.getPaymentId());
- Assert.assertEquals(updatedPayment2.getTransactions().size(), 2);
- final PaymentTransaction authTransaction2 = updatedPayment2.getTransactions().get(0);
+ final Payment updatedPayment = killBillClient.getPayment(authPayment.getPaymentId());
+ Assert.assertEquals(updatedPayment.getTransactions().size(), 1);
+ final PaymentTransaction authTransaction2 = updatedPayment.getTransactions().get(0);
Assert.assertEquals(authTransaction2.getStatus(), TransactionStatus.PAYMENT_FAILURE.toString());
- final PaymentTransaction captureTransaction2 = updatedPayment2.getTransactions().get(1);
- Assert.assertEquals(captureTransaction2.getStatus(), TransactionStatus.SUCCESS.toString());
-
- // Capture should now failed because lastSuccessPaymentState was moved to AUTH_FAILED
- doCapture(updatedPayment2, true);
+ // Capture should fail because lastSuccessPaymentState was moved to AUTH_FAILED
+ doCapture(updatedPayment, true);
}
@Test(groups = "slow")
@@ -116,7 +103,6 @@ public class TestAdmin extends TestJaxrsBase {
BillingPeriod.MONTHLY,
true);
clock.addDays(2);
- crappyWaitForLackOfProperSynchonization();
Assert.assertEquals(killBillClient.getInvoices(requestOptions).getPaginationMaxNbRecords(), i + 1);
final List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), false, false, false, false, AuditLevel.NONE, requestOptions);
@@ -124,8 +110,11 @@ public class TestAdmin extends TestJaxrsBase {
}
// Trigger first non-trial invoice
+ for (int i = 0; i < 5; i++) {
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE, ExtBusEventType.INVOICE_CREATION, ExtBusEventType.INVOICE_PAYMENT_SUCCESS, ExtBusEventType.PAYMENT_SUCCESS);
+ }
clock.addDays(32);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
Assert.assertEquals(killBillClient.getInvoices(requestOptions).getPaginationMaxNbRecords(), 10);
for (final UUID accountId : accounts) {
@@ -138,12 +127,16 @@ public class TestAdmin extends TestJaxrsBase {
final Map<String, String> perTenantProperties = new HashMap<String, String>();
perTenantProperties.put("org.killbill.invoice.enabled", "false");
final String perTenantConfig = mapper.writeValueAsString(perTenantProperties);
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TENANT_CONFIG_CHANGE);
killBillClient.postConfigurationPropertiesForTenant(perTenantConfig, requestOptions);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
// Verify the second invoice isn't generated
+ for (int i = 0; i < 5; i++) {
+ callbackServlet.pushExpectedEvents(ExtBusEventType.TAG_CREATION);
+ }
clock.addDays(32);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
Assert.assertEquals(killBillClient.getInvoices(requestOptions).getPaginationMaxNbRecords(), 10);
for (final UUID accountId : accounts) {
@@ -157,7 +150,7 @@ public class TestAdmin extends TestJaxrsBase {
Assert.assertEquals(killBillClient.getInvoices(requestOptions).getPaginationMaxNbRecords(), 11);
// Fix all accounts
- final Response response2 = triggerInvoiceGenerationForParkedAccounts(5);
+ final Response response2 = triggerInvoiceGenerationForParkedAccounts(4);
final Map<String,String> fixedAccounts = mapper.readValue(response2.getResponseBody(), new TypeReference<Map<String,String>>() {});
Assert.assertEquals(fixedAccounts.size(), 4);
Assert.assertEquals(fixedAccounts.get(accounts.get(1).toString()), "OK");
@@ -202,7 +195,9 @@ public class TestAdmin extends TestJaxrsBase {
result.put(KillBillHttpClient.AUDIT_OPTION_CREATED_BY, createdBy);
result.put(KillBillHttpClient.AUDIT_OPTION_REASON, reason);
result.put(KillBillHttpClient.AUDIT_OPTION_COMMENT, comment);
+ callbackServlet.pushExpectedEvent(ExtBusEventType.PAYMENT_FAILED);
killBillHttpClient.doPut(uri, body, result);
+ callbackServlet.assertListenerStatus();
}
private Response triggerInvoiceGenerationForParkedAccounts(final int limit) throws KillBillClientException {
@@ -213,6 +208,11 @@ public class TestAdmin extends TestJaxrsBase {
.withCreatedBy(createdBy)
.withReason(reason)
.withComment(comment).build();
- return killBillHttpClient.doPost(uri, null, requestOptions);
+ for (int i = 0; i < limit; i++) {
+ callbackServlet.pushExpectedEvents(ExtBusEventType.TAG_DELETION, ExtBusEventType.INVOICE_CREATION, ExtBusEventType.INVOICE_PAYMENT_SUCCESS, ExtBusEventType.PAYMENT_SUCCESS);
+ }
+ final Response response = killBillHttpClient.doPost(uri, null, requestOptions);
+ callbackServlet.assertListenerStatus();
+ return response;
}
}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCache.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCache.java
index ee38da4..83b74fe 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCache.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCache.java
@@ -19,20 +19,12 @@ package org.killbill.billing.jaxrs;
import java.util.UUID;
-import org.joda.time.LocalDate;
import org.killbill.automaton.StateMachineConfig;
import org.killbill.billing.account.api.ImmutableAccountData;
-import org.killbill.billing.api.FlakyRetryAnalyzer;
-import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.Catalog;
-import org.killbill.billing.catalog.api.PriceListSet;
-import org.killbill.billing.catalog.api.ProductCategory;
-import org.killbill.billing.client.RequestOptions;
import org.killbill.billing.client.model.Account;
-import org.killbill.billing.client.model.PaymentMethod;
-import org.killbill.billing.client.model.PaymentMethodPluginDetail;
-import org.killbill.billing.client.model.Subscription;
import org.killbill.billing.client.model.Tenant;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.overdue.api.OverdueConfig;
import org.killbill.billing.util.cache.Cachable.CacheType;
import org.killbill.billing.util.cache.CacheController;
@@ -102,32 +94,18 @@ public class TestCache extends TestJaxrsBase {
Assert.assertFalse(accountBcdCache.isKeyInCache(input.getAccountId()));
}
- // Flaky, see https://github.com/killbill/killbill/issues/860
- @Test(groups = "slow", description = "Can Invalidate (clear) all Tenant Caches for current Tenant", retryAnalyzer = FlakyRetryAnalyzer.class)
+ @Test(groups = "slow", description = "Can Invalidate (clear) all Tenant Caches for current Tenant")
public void testInvalidateCacheByTenant() throws Exception {
// creating a new Tenant for this test
- final String testApiKey = "testApiKey";
- final String testApiSecret = "testApiSecret";
- final Tenant tenant = new Tenant();
- tenant.setApiKey(testApiKey);
- tenant.setApiSecret(testApiSecret);
- loginTenant(testApiKey, testApiSecret);
- Tenant currentTenant = killBillClient.createTenant(tenant, false, requestOptions);
-
- // using custom RequestOptions with the new Tenant created before
- RequestOptions inputOptions = RequestOptions.builder()
- .withCreatedBy(createdBy)
- .withReason(reason)
- .withComment(comment)
- .withTenantApiKey(currentTenant.getApiKey())
- .withTenantApiSecret(currentTenant.getApiSecret())
- .build();
+ final Tenant currentTenant = createTenant("testApiKey", "testApiSecret", false);
// Uploading the test catalog using the new Tenant created before
- killBillClient.uploadXMLCatalog(Resources.getResource("SpyCarAdvanced.xml").getPath(), inputOptions);
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TENANT_CONFIG_CHANGE);
+ killBillClient.uploadXMLCatalog(Resources.getResource("SpyCarAdvanced.xml").getPath(), requestOptions);
+ callbackServlet.assertListenerStatus();
// creating an Account with PaymentMethod and a Subscription
- createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoiceWithInputOptions(inputOptions);
+ createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice("Sports", true);
// get all caches per tenant level
final CacheController<String, Long> tenantRecordIdCache = cacheControllerDispatcher.getCacheController(CacheType.TENANT_RECORD_ID);
@@ -143,19 +121,19 @@ public class TestCache extends TestJaxrsBase {
final Long tenantRecordId = tenantRecordIdCache.get(currentTenant.getTenantId().toString(), null);
assertTrue(hasKeysByTenantRecordId(tenantPaymentStateMachineConfigCache, tenantRecordId.toString()));
- assertTrue(tenantCache.isKeyInCache(testApiKey));
+ assertTrue(tenantCache.isKeyInCache(currentTenant.getApiKey()));
assertTrue(hasKeysByTenantRecordId(tenantKvCache, tenantRecordId.toString()));
assertTrue(tenantConfigCache.isKeyInCache(tenantRecordId));
assertTrue(tenantOverdueConfigCache.isKeyInCache(tenantRecordId));
assertTrue(tenantCatalogCache.isKeyInCache(tenantRecordId));
// invalidate caches per tenant level
- killBillClient.invalidateCacheByTenant(inputOptions);
+ killBillClient.invalidateCacheByTenant(requestOptions);
// verify that now the caches don't have the previous values
assertFalse(tenantRecordIdCache.isKeyInCache(currentTenant.getTenantId().toString()));
assertFalse(hasKeysByTenantRecordId(tenantPaymentStateMachineConfigCache, tenantRecordId.toString()));
- assertFalse(tenantCache.isKeyInCache(testApiKey));
+ assertFalse(tenantCache.isKeyInCache(currentTenant.getApiKey()));
assertFalse(hasKeysByTenantRecordId(tenantKvCache, tenantRecordId.toString()));
assertFalse(tenantConfigCache.isKeyInCache(tenantRecordId));
assertFalse(tenantOverdueConfigCache.isKeyInCache(tenantRecordId));
@@ -170,29 +148,4 @@ public class TestCache extends TestJaxrsBase {
}
return false;
}
-
- private void createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoiceWithInputOptions(final RequestOptions inputOptions) throws Exception {
- Account account = killBillClient.createAccount(getAccount(), inputOptions);
-
- final PaymentMethodPluginDetail info = new PaymentMethodPluginDetail();
- info.setProperties(null);
- final PaymentMethod paymentMethodJson = new PaymentMethod(null, UUID.randomUUID().toString(), account.getAccountId(), true, PLUGIN_NAME, info);
- killBillClient.createPaymentMethod(paymentMethodJson, inputOptions);
-
- final Subscription subscription = new Subscription();
- subscription.setAccountId(account.getAccountId());
- subscription.setExternalKey(UUID.randomUUID().toString());
- subscription.setProductName("Sports");
- subscription.setProductCategory(ProductCategory.BASE);
- subscription.setBillingPeriod(BillingPeriod.MONTHLY);
- subscription.setPriceList(PriceListSet.DEFAULT_PRICELIST_NAME);
-
- clock.resetDeltaFromReality();
- clock.setDay(new LocalDate(2013, 3, 1));
- final Subscription subscriptionJson = killBillClient.createSubscription(subscription, clock.getUTCToday(), DEFAULT_WAIT_COMPLETION_TIMEOUT_SEC, inputOptions);
-
- assertNotNull(subscriptionJson);
- clock.addDays(32);
- crappyWaitForLackOfProperSynchonization();
- }
}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCatalog.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCatalog.java
index 14563ed..cbb6486 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCatalog.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCatalog.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2017 Groupon, Inc
- * Copyright 2014-2017 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
* The Billing Project 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
@@ -31,21 +31,16 @@ import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.catalog.api.ProductCategory;
import org.killbill.billing.catalog.api.TimeUnit;
import org.killbill.billing.client.KillBillClientException;
-import org.killbill.billing.client.KillBillHttpClient;
-import org.killbill.billing.client.RequestOptions;
import org.killbill.billing.client.model.Catalog;
import org.killbill.billing.client.model.Plan;
import org.killbill.billing.client.model.PlanDetail;
import org.killbill.billing.client.model.Product;
import org.killbill.billing.client.model.SimplePlan;
-import org.killbill.billing.client.model.Tenant;
import org.killbill.billing.client.model.Usage;
import org.testng.Assert;
import org.testng.annotations.Test;
-import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Multimap;
import com.google.common.io.Resources;
public class TestCatalog extends TestJaxrsBase {
@@ -187,22 +182,14 @@ public class TestCatalog extends TestJaxrsBase {
@Test(groups = "slow", description = "Upload and retrieve a per plugin payment state machine config")
public void testAddSimplePlanWithoutKBDefault() throws Exception {
// Create another tenant initialized with no default catalog,...
- final Tenant otherTenantNoKBDefault = new Tenant();
- otherTenantNoKBDefault.setApiKey(UUID.randomUUID().toString());
- otherTenantNoKBDefault.setApiSecret(UUID.randomUUID().toString());
+ createTenant(UUID.randomUUID().toString(), UUID.randomUUID().toString(), false);
- killBillClient.createTenant(otherTenantNoKBDefault, false, requestOptions);
-
- final RequestOptions requestOptionsOtherTenant = requestOptions.extend()
- .withTenantApiKey(otherTenantNoKBDefault.getApiKey())
- .withTenantApiSecret(otherTenantNoKBDefault.getApiSecret())
- .build();
// Verify the template catalog is not returned
- List<Catalog> catalogsJson = killBillClient.getJSONCatalog(requestOptionsOtherTenant);
+ List<Catalog> catalogsJson = killBillClient.getJSONCatalog(requestOptions);
Assert.assertEquals(catalogsJson.size(), 0);
- killBillClient.addSimplePan(new SimplePlan("foo-monthly", "Foo", ProductCategory.BASE, Currency.USD, BigDecimal.TEN, BillingPeriod.MONTHLY, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptionsOtherTenant);
- catalogsJson = killBillClient.getJSONCatalog(requestOptionsOtherTenant);
+ killBillClient.addSimplePan(new SimplePlan("foo-monthly", "Foo", ProductCategory.BASE, Currency.USD, BigDecimal.TEN, BillingPeriod.MONTHLY, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptions);
+ catalogsJson = killBillClient.getJSONCatalog(requestOptions);
Assert.assertEquals(catalogsJson.size(),1);
Assert.assertEquals(catalogsJson.get(0).getProducts().size(),1);
Assert.assertEquals(catalogsJson.get(0).getProducts().get(0).getName(),"Foo");
@@ -212,9 +199,9 @@ public class TestCatalog extends TestJaxrsBase {
Assert.assertEquals(catalogsJson.get(0).getPriceLists().get(0).getPlans().get(0), "foo-monthly");
- killBillClient.addSimplePan(new SimplePlan("foo-annual", "Foo", ProductCategory.BASE, Currency.USD, new BigDecimal("100.00"), BillingPeriod.ANNUAL, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptionsOtherTenant);
+ killBillClient.addSimplePan(new SimplePlan("foo-annual", "Foo", ProductCategory.BASE, Currency.USD, new BigDecimal("100.00"), BillingPeriod.ANNUAL, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptions);
- catalogsJson = killBillClient.getJSONCatalog(requestOptionsOtherTenant);
+ catalogsJson = killBillClient.getJSONCatalog(requestOptions);
Assert.assertEquals(catalogsJson.size(),1);
Assert.assertEquals(catalogsJson.get(0).getProducts().size(),1);
Assert.assertEquals(catalogsJson.get(0).getProducts().get(0).getName(),"Foo");
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestChargeback.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestChargeback.java
index 405c415..58005dd 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestChargeback.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestChargeback.java
@@ -33,6 +33,7 @@ import org.killbill.billing.client.model.InvoicePayments;
import org.killbill.billing.client.model.Payment;
import org.killbill.billing.client.model.PaymentTransaction;
import org.killbill.billing.client.model.Subscription;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.payment.api.TransactionType;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -174,8 +175,12 @@ public class TestChargeback extends TestJaxrsBase {
assertNotNull(subscriptionJson);
// Move after the trial period to trigger an invoice with a non-zero invoice item
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_SUCCESS,
+ ExtBusEventType.PAYMENT_SUCCESS);
clock.addDays(32);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
// Retrieve the invoice
final List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId());
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCredit.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCredit.java
index c7562dd..dddb0dc 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCredit.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCredit.java
@@ -39,6 +39,10 @@ public class TestCredit extends TestJaxrsBase {
@BeforeMethod(groups = "slow")
public void setUp() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java
index c66ff3b..a0fadbb 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java
@@ -18,6 +18,8 @@
package org.killbill.billing.jaxrs;
+import java.util.LinkedHashMap;
+import java.util.List;
import java.util.UUID;
import javax.annotation.Nullable;
@@ -25,14 +27,19 @@ import javax.annotation.Nullable;
import org.killbill.billing.ObjectType;
import org.killbill.billing.client.KillBillClientException;
import org.killbill.billing.client.model.Account;
+import org.killbill.billing.client.model.AuditLog;
import org.killbill.billing.client.model.CustomField;
import org.killbill.billing.client.model.CustomFields;
import org.killbill.billing.util.api.AuditLevel;
+import org.killbill.billing.util.audit.ChangeType;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
public class TestCustomField extends TestJaxrsBase {
@@ -105,6 +112,39 @@ public class TestCustomField extends TestJaxrsBase {
Assert.assertEquals(allBundleCustomFieldsForAccount.size(), 5);
}
+ @Test(groups = "slow", description = "retrieve account logs")
+ public void testCustomFieldTagAuditLogsWithHistory() throws Exception {
+ final Account accountJson = createAccount();
+ assertNotNull(accountJson);
+
+ final CustomField customField = new CustomField();
+ customField.setName("custom");
+ customField.setValue(UUID.randomUUID().toString().substring(0, 5));
+ killBillClient.createAccountCustomField(accountJson.getAccountId(), customField, requestOptions);
+
+ // get all audit for the account
+ final List<AuditLog> auditLogsJson = killBillClient.getAccountAuditLogs(accountJson.getAccountId());
+ Assert.assertEquals(auditLogsJson.size(), 2);
+ UUID objectId = null;
+ for (AuditLog auditLog : auditLogsJson) {
+ if (auditLog.getObjectType().equals(ObjectType.CUSTOM_FIELD)) {
+ objectId = auditLog.getObjectId();
+ break;
+ }
+ }
+ assertNotNull(objectId);
+ final List<AuditLog> customFieldAuditLogWithHistory = killBillClient.getCustomFieldsAuditLogsWithHistory(accountJson.getAccountId(), objectId);
+ assertEquals(customFieldAuditLogWithHistory.size(), 1);
+ assertEquals(customFieldAuditLogWithHistory.get(0).getChangeType(), ChangeType.INSERT.toString());
+ assertEquals(customFieldAuditLogWithHistory.get(0).getObjectType(), ObjectType.CUSTOM_FIELD);
+ assertEquals(customFieldAuditLogWithHistory.get(0).getObjectId(), objectId);
+
+ final LinkedHashMap history1 = (LinkedHashMap) customFieldAuditLogWithHistory.get(0).getHistory();
+ assertNotNull(history1);
+ assertEquals(history1.get("fieldName"), "custom");
+
+ }
+
private void doSearchCustomField(final String searchKey, @Nullable final CustomField expectedCustomField) throws KillBillClientException {
final CustomFields customFields = killBillClient.searchCustomFields(searchKey, requestOptions);
if (expectedCustomField == null) {
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestEntitlement.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestEntitlement.java
index 021e62c..5324b13 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestEntitlement.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestEntitlement.java
@@ -27,7 +27,6 @@ import java.util.regex.Pattern;
import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.joda.time.LocalDate;
-import org.killbill.billing.api.FlakyRetryAnalyzer;
import org.killbill.billing.catalog.DefaultPriceListSet;
import org.killbill.billing.catalog.api.BillingActionPolicy;
import org.killbill.billing.catalog.api.BillingPeriod;
@@ -46,6 +45,7 @@ import org.killbill.billing.client.model.Tags;
import org.killbill.billing.entitlement.api.Entitlement.EntitlementActionPolicy;
import org.killbill.billing.entitlement.api.Entitlement.EntitlementState;
import org.killbill.billing.entitlement.api.SubscriptionEventType;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.util.api.AuditLevel;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -89,6 +89,10 @@ public class TestEntitlement extends TestJaxrsBase {
entitlementJson.setPriceOverrides(null);
Assert.assertTrue(objFromJson.equals(entitlementJson));
+ // Change the clock otherwise the CREATE event might be replaced (instead of having a CHANGE event)
+ clock.addDays(1);
+ callbackServlet.assertListenerStatus();
+
// Change plan IMM
final String newProductName = "Assault-Rifle";
@@ -99,14 +103,18 @@ public class TestEntitlement extends TestJaxrsBase {
newInput.setProductCategory(ProductCategory.BASE);
newInput.setBillingPeriod(entitlementJson.getBillingPeriod());
newInput.setPriceList(entitlementJson.getPriceList());
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_CHANGE, ExtBusEventType.SUBSCRIPTION_CHANGE, ExtBusEventType.INVOICE_CREATION);
objFromJson = killBillClient.updateSubscription(newInput, CALL_COMPLETION_TIMEOUT_SEC, requestOptions);
+ callbackServlet.assertListenerStatus();
Assert.assertNotNull(objFromJson);
// MOVE AFTER TRIAL
- final Interval it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(31));
- clock.addDeltaFromReality(it.toDurationMillis());
-
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_SUCCESS,
+ ExtBusEventType.PAYMENT_SUCCESS);
+ clock.addDays(30);
+ callbackServlet.assertListenerStatus();
// Cancel IMM (Billing EOT)
killBillClient.cancelSubscription(newInput.getSubscriptionId(), CALL_COMPLETION_TIMEOUT_SEC, requestOptions);
@@ -147,10 +155,12 @@ public class TestEntitlement extends TestJaxrsBase {
Assert.assertTrue(objFromJson.equals(entitlementJson));
// MOVE AFTER TRIAL
- final Interval it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(31));
- clock.addDeltaFromReality(it.toDurationMillis());
-
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_SUCCESS,
+ ExtBusEventType.PAYMENT_SUCCESS);
+ clock.addDays(31);
+ callbackServlet.assertListenerStatus();
// Cancel EOT
killBillClient.cancelSubscription(entitlementJson.getSubscriptionId(), EntitlementActionPolicy.END_OF_TERM,
@@ -255,7 +265,15 @@ public class TestEntitlement extends TestJaxrsBase {
overrides.add(new PhasePriceOverride(null, null, PhaseType.TRIAL.toString(), BigDecimal.TEN, null, null));
input.setPriceOverrides(overrides);
+ callbackServlet.pushExpectedEvents(ExtBusEventType.ACCOUNT_CHANGE,
+ ExtBusEventType.ENTITLEMENT_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_SUCCESS,
+ ExtBusEventType.PAYMENT_SUCCESS);
final Subscription subscription = killBillClient.createSubscription(input, null, DEFAULT_WAIT_COMPLETION_TIMEOUT_SEC, requestOptions);
+ callbackServlet.assertListenerStatus();
Assert.assertEquals(subscription.getPriceOverrides().size(), 2);
Assert.assertEquals(subscription.getEvents().size(), 3);
@@ -283,8 +301,12 @@ public class TestEntitlement extends TestJaxrsBase {
assertEquals(invoices.get(0).getAmount().compareTo(BigDecimal.TEN), 0);
// Move clock after phase
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_SUCCESS,
+ ExtBusEventType.PAYMENT_SUCCESS);
clock.addDays(30);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
final Subscription subscription2 = killBillClient.getSubscription(subscription.getSubscriptionId(), requestOptions);
Assert.assertEquals(subscription2.getEvents().size(), 3);
@@ -391,8 +413,7 @@ public class TestEntitlement extends TestJaxrsBase {
assertEquals(killBillClient.getInvoiceTags(invoicesAfterClose.get(0).getInvoiceId(), requestOptions).size(), 1);
}
- // Flaky, see https://github.com/killbill/killbill/issues/860
- @Test(groups = "slow", description = "Create a bulk of base entitlement and addOns under the same transaction", retryAnalyzer = FlakyRetryAnalyzer.class)
+ @Test(groups = "slow", description = "Create a bulk of base entitlement and addOns under the same transaction")
public void testCreateEntitlementsWithAddOnsThenCloseAccountWithItemAdjustment() throws Exception {
final DateTime initialDate = new DateTime(2012, 4, 25, 0, 3, 42, 0);
clock.setDeltaFromReality(initialDate.getMillis() - clock.getUTCNow().getMillis());
@@ -429,7 +450,30 @@ public class TestEntitlement extends TestJaxrsBase {
bulkList.add(new BulkBaseSubscriptionAndAddOns(subscriptions));
bulkList.add(new BulkBaseSubscriptionAndAddOns(subscriptions));
+ callbackServlet.pushExpectedEvents(ExtBusEventType.ACCOUNT_CHANGE,
+ ExtBusEventType.ENTITLEMENT_CREATION,
+ ExtBusEventType.ENTITLEMENT_CREATION,
+ ExtBusEventType.ENTITLEMENT_CREATION,
+ ExtBusEventType.ENTITLEMENT_CREATION,
+ ExtBusEventType.ENTITLEMENT_CREATION,
+ ExtBusEventType.ENTITLEMENT_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_FAILED);
final Bundles bundles = killBillClient.createSubscriptionsWithAddOns(bulkList, null, 10, requestOptions);
+ callbackServlet.assertListenerStatus();
+
assertNotNull(bundles);
assertEquals(bundles.size(), 2);
assertFalse(bundles.get(0).getExternalKey().equals(bundles.get(1).getExternalKey()));
@@ -447,7 +491,36 @@ public class TestEntitlement extends TestJaxrsBase {
}
}
+ clock.addDays(1);
+ callbackServlet.assertListenerStatus();
+
+ callbackServlet.pushExpectedEvents(ExtBusEventType.ENTITLEMENT_CANCEL,
+ ExtBusEventType.ENTITLEMENT_CANCEL,
+ ExtBusEventType.ENTITLEMENT_CANCEL,
+ ExtBusEventType.ENTITLEMENT_CANCEL,
+ ExtBusEventType.ENTITLEMENT_CANCEL,
+ ExtBusEventType.ENTITLEMENT_CANCEL,
+ ExtBusEventType.SUBSCRIPTION_CANCEL,
+ ExtBusEventType.SUBSCRIPTION_CANCEL,
+ ExtBusEventType.SUBSCRIPTION_CANCEL,
+ ExtBusEventType.SUBSCRIPTION_CANCEL,
+ ExtBusEventType.SUBSCRIPTION_CANCEL,
+ ExtBusEventType.SUBSCRIPTION_CANCEL,
+ ExtBusEventType.SUBSCRIPTION_CANCEL,
+ ExtBusEventType.SUBSCRIPTION_CANCEL,
+ ExtBusEventType.SUBSCRIPTION_CANCEL,
+ ExtBusEventType.SUBSCRIPTION_CANCEL,
+ ExtBusEventType.SUBSCRIPTION_CANCEL,
+ ExtBusEventType.SUBSCRIPTION_CANCEL,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_FAILED,
+ ExtBusEventType.INVOICE_ADJUSTMENT,
+ ExtBusEventType.INVOICE_ADJUSTMENT,
+ ExtBusEventType.INVOICE_ADJUSTMENT,
+ ExtBusEventType.INVOICE_ADJUSTMENT,
+ ExtBusEventType.BLOCKING_STATE);
killBillClient.closeAccount(accountJson.getAccountId(), true, false, true, requestOptions);
+ callbackServlet.assertListenerStatus();
final Bundles accountBundlesAfterClose = killBillClient.getAccountBundles(accountJson.getAccountId(), requestOptions);
assertEquals(accountBundlesAfterClose.size(), 2);
@@ -458,7 +531,7 @@ public class TestEntitlement extends TestJaxrsBase {
}
final List<Invoice> invoicesAfterClose = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), true, false, false, requestOptions);
- assertEquals(invoicesAfterClose.size(), 1);
+ assertEquals(invoicesAfterClose.size(), 2);
assertEquals(invoicesAfterClose.get(0).getBalance().compareTo(BigDecimal.ZERO), 0);
assertEquals(killBillClient.getInvoiceTags(invoicesAfterClose.get(0).getInvoiceId(), requestOptions).size(), 0);
}
@@ -621,16 +694,18 @@ public class TestEntitlement extends TestJaxrsBase {
final Subscription updatedSubscription = new Subscription();
updatedSubscription.setSubscriptionId(entitlementJson.getSubscriptionId());
updatedSubscription.setBillCycleDayLocal(9);
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_BCD_CHANGE);
killBillClient.updateSubscriptionBCD(updatedSubscription, null, DEFAULT_WAIT_COMPLETION_TIMEOUT_SEC, requestOptions);
-
+ callbackServlet.assertListenerStatus();
final Subscription result = killBillClient.getSubscription(entitlementJson.getSubscriptionId(), requestOptions);
// Still shows as the 4 (BCD did not take effect)
Assert.assertEquals(result.getBillCycleDayLocal(), new Integer(25));
// 2012, 5, 9
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_BCD_CHANGE);
clock.addDays(14);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
final Subscription result2 = killBillClient.getSubscription(entitlementJson.getSubscriptionId(), requestOptions);
// Still shows as the 4 (BCD did not take effect)
@@ -693,7 +768,9 @@ public class TestEntitlement extends TestJaxrsBase {
newInput.setBillingPeriod(entitlementJson.getBillingPeriod());
newInput.setPriceList(entitlementJson.getPriceList());
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_CHANGE);
Subscription refreshedSubscription = killBillClient.updateSubscription(newInput, new LocalDate(2012, 4, 28), null, CALL_COMPLETION_TIMEOUT_SEC, requestOptions);
+ callbackServlet.assertListenerStatus();
Assert.assertNotNull(refreshedSubscription);
@@ -703,10 +780,12 @@ public class TestEntitlement extends TestJaxrsBase {
killBillClient.undoChangePlan(refreshedSubscription.getSubscriptionId(), requestOptions);
// MOVE AFTER TRIAL
- final Interval it2 = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(30));
- clock.addDeltaFromReality(it2.toDurationMillis());
-
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_SUCCESS,
+ ExtBusEventType.PAYMENT_SUCCESS);
+ clock.addDays(30);
+ callbackServlet.assertListenerStatus();
// Retrieves to check EndDate
refreshedSubscription = killBillClient.getSubscription(entitlementJson.getSubscriptionId(), requestOptions);
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java
index ee74ce5..c3c279a 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java
@@ -26,7 +26,6 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
-import org.killbill.billing.api.FlakyRetryAnalyzer;
import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.ProductCategory;
import org.killbill.billing.client.KillBillClientException;
@@ -45,6 +44,7 @@ import org.killbill.billing.entitlement.api.SubscriptionEventType;
import org.killbill.billing.invoice.api.DryRunType;
import org.killbill.billing.invoice.api.InvoiceItemType;
import org.killbill.billing.invoice.api.InvoiceStatus;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.payment.provider.ExternalPaymentProviderPlugin;
import org.killbill.billing.util.api.AuditLevel;
import org.testng.Assert;
@@ -530,8 +530,7 @@ public class TestInvoice extends TestJaxrsBase {
assertEquals(killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions).size(), 3);
}
- // Flaky, see https://github.com/killbill/killbill/issues/801
- @Test(groups = "slow", description = "Can create multiple external charges with same invoice and external keys", retryAnalyzer = FlakyRetryAnalyzer.class)
+ @Test(groups = "slow", description = "Can create multiple external charges with same invoice and external keys")
public void testExternalChargesWithSameInvoiceAndExternalKeys() throws Exception {
final Account accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
@@ -633,8 +632,9 @@ public class TestInvoice extends TestJaxrsBase {
createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
for (int i = 0; i < 3; i++) {
+ callbackServlet.pushExpectedEvents(ExtBusEventType.INVOICE_CREATION, ExtBusEventType.INVOICE_PAYMENT_SUCCESS, ExtBusEventType.PAYMENT_SUCCESS);
clock.addMonths(1);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
}
final Invoices allInvoices = killBillClient.getInvoices(requestOptions);
@@ -782,9 +782,15 @@ public class TestInvoice extends TestJaxrsBase {
createEntitlement(childAccount3.getAccountId(), UUID.randomUUID().toString(), "Shotgun",
ProductCategory.BASE, BillingPeriod.MONTHLY, true);
-
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE,
+ ExtBusEventType.SUBSCRIPTION_PHASE,
+ ExtBusEventType.SUBSCRIPTION_PHASE,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_CREATION);
clock.addDays(32);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
final List<Invoice> child1Invoices = killBillClient.getInvoicesForAccount(childAccount1.getAccountId(), true, false, requestOptions);
final List<Invoice> child2Invoices = killBillClient.getInvoicesForAccount(childAccount2.getAccountId(), true, false, requestOptions);
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoicePayment.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoicePayment.java
index 14b0023..c382e30 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoicePayment.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoicePayment.java
@@ -39,6 +39,7 @@ import org.killbill.billing.client.model.PaymentMethod;
import org.killbill.billing.client.model.PaymentTransaction;
import org.killbill.billing.client.model.Payments;
import org.killbill.billing.client.model.Subscription;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.osgi.api.OSGIServiceRegistration;
import org.killbill.billing.payment.api.TransactionType;
import org.killbill.billing.payment.plugin.api.PaymentPluginApi;
@@ -66,6 +67,10 @@ public class TestInvoicePayment extends TestJaxrsBase {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
mockPaymentProviderPlugin = (MockPaymentProviderPlugin) registry.getServiceForName(PLUGIN_NAME);
}
@@ -75,7 +80,7 @@ public class TestInvoicePayment extends TestJaxrsBase {
@Test(groups = "slow")
public void testRetrievePayment() throws Exception {
- final InvoicePayment paymentJson = setupScenarioWithPayment();
+ final InvoicePayment paymentJson = setupScenarioWithPayment(true);
final Payment retrievedPaymentJson = killBillClient.getPayment(paymentJson.getPaymentId(), false, requestOptions);
Assert.assertTrue(retrievedPaymentJson.equals((Payment) paymentJson));
}
@@ -85,7 +90,7 @@ public class TestInvoicePayment extends TestJaxrsBase {
public void testInvoicePaymentCompletion() throws Exception {
mockPaymentProviderPlugin.makeNextPaymentPending();
- final InvoicePayment paymentJson = setupScenarioWithPayment();
+ final InvoicePayment paymentJson = setupScenarioWithPayment(false);
final Payment retrievedPaymentJson = killBillClient.getPayment(paymentJson.getPaymentId(), false, requestOptions);
Assert.assertTrue(retrievedPaymentJson.equals((Payment) paymentJson));
@@ -108,7 +113,7 @@ public class TestInvoicePayment extends TestJaxrsBase {
@Test(groups = "slow", description = "Can create a full refund with no adjustment")
public void testFullRefundWithNoAdjustment() throws Exception {
- final InvoicePayment invoicePaymentJson = setupScenarioWithPayment();
+ final InvoicePayment invoicePaymentJson = setupScenarioWithPayment(true);
// Issue a refund for the full amount
final BigDecimal refundAmount = invoicePaymentJson.getPurchasedAmount();
@@ -127,7 +132,7 @@ public class TestInvoicePayment extends TestJaxrsBase {
@Test(groups = "slow", description = "Can create a partial refund with no adjustment")
public void testPartialRefundWithNoAdjustment() throws Exception {
- final InvoicePayment paymentJson = setupScenarioWithPayment();
+ final InvoicePayment paymentJson = setupScenarioWithPayment(true);
// Issue a refund for a fraction of the amount
final BigDecimal refundAmount = getFractionOfAmount(paymentJson.getPurchasedAmount());
@@ -146,7 +151,7 @@ public class TestInvoicePayment extends TestJaxrsBase {
@Test(groups = "slow", description = "Can create a full refund with invoice item adjustment")
public void testRefundWithFullInvoiceItemAdjustment() throws Exception {
- final InvoicePayment paymentJson = setupScenarioWithPayment();
+ final InvoicePayment paymentJson = setupScenarioWithPayment(true);
// Get the individual items for the invoice
final Invoice invoice = killBillClient.getInvoice(paymentJson.getTargetInvoiceId(), true, false, requestOptions);
@@ -174,7 +179,7 @@ public class TestInvoicePayment extends TestJaxrsBase {
@Test(groups = "slow", description = "Can create a partial refund with invoice item adjustment")
public void testPartialRefundWithInvoiceItemAdjustment() throws Exception {
- final InvoicePayment paymentJson = setupScenarioWithPayment();
+ final InvoicePayment paymentJson = setupScenarioWithPayment(true);
// Get the individual items for the invoice
final Invoice invoice = killBillClient.getInvoice(paymentJson.getTargetInvoiceId(), true, false, requestOptions);
@@ -201,7 +206,7 @@ public class TestInvoicePayment extends TestJaxrsBase {
@Test(groups = "slow", description = "Cannot create invoice item adjustments for more than the refund amount")
public void testPartialRefundWithFullInvoiceItemAdjustment() throws Exception {
- final InvoicePayment paymentJson = setupScenarioWithPayment();
+ final InvoicePayment paymentJson = setupScenarioWithPayment(true);
// Get the individual items for the invoice
final Invoice invoice = killBillClient.getInvoice(paymentJson.getTargetInvoiceId(), true, false, requestOptions);
@@ -232,7 +237,7 @@ public class TestInvoicePayment extends TestJaxrsBase {
@Test(groups = "slow", description = "Can paginate through all payments and refunds")
public void testPaymentsAndRefundsPagination() throws Exception {
- InvoicePayment lastPayment = setupScenarioWithPayment();
+ InvoicePayment lastPayment = setupScenarioWithPayment(true);
for (int i = 0; i < 5; i++) {
final InvoicePaymentTransaction refund = new InvoicePaymentTransaction();
@@ -272,7 +277,7 @@ public class TestInvoicePayment extends TestJaxrsBase {
final DateTime initialDate = new DateTime(2012, 4, 25, 0, 3, 42, 0);
clock.setDeltaFromReality(initialDate.getMillis() - clock.getUTCNow().getMillis());
- final Account accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+ final Account accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice(false);
InvoicePayments invoicePayments = killBillClient.getInvoicePaymentsForAccount(accountJson.getAccountId(), requestOptions);
assertEquals(invoicePayments.size(), 1);
@@ -296,27 +301,29 @@ public class TestInvoicePayment extends TestJaxrsBase {
}
}
-
@Test(groups = "slow")
public void testManualInvoicePayment() throws Exception {
-
final Account accountJson = createAccountWithDefaultPaymentMethod();
assertNotNull(accountJson);
// Disable automatic payments
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TAG_CREATION);
killBillClient.createAccountTag(accountJson.getAccountId(), ControlTagType.AUTO_PAY_OFF.getId(), requestOptions);
+ callbackServlet.assertListenerStatus();
// Add a bundle, subscription and move the clock to get the first invoice
final Subscription subscriptionJson = createEntitlement(accountJson.getAccountId(), UUID.randomUUID().toString(), "Shotgun",
ProductCategory.BASE, BillingPeriod.MONTHLY, true);
assertNotNull(subscriptionJson);
+
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE,
+ ExtBusEventType.INVOICE_CREATION);
clock.addDays(32);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
final List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
assertEquals(invoices.size(), 2);
-
final InvoicePayment invoicePayment1 = new InvoicePayment();
invoicePayment1.setPurchasedAmount(invoices.get(1).getBalance().add(BigDecimal.TEN));
invoicePayment1.setAccountId(accountJson.getAccountId());
@@ -330,7 +337,6 @@ public class TestInvoicePayment extends TestJaxrsBase {
assertTrue(true);
}
-
final InvoicePayment invoicePayment2 = new InvoicePayment();
invoicePayment2.setPurchasedAmount(invoices.get(1).getBalance());
invoicePayment2.setAccountId(accountJson.getAccountId());
@@ -350,8 +356,8 @@ public class TestInvoicePayment extends TestJaxrsBase {
return amount.divide(BigDecimal.TEN).setScale(2, BigDecimal.ROUND_HALF_UP);
}
- private InvoicePayment setupScenarioWithPayment() throws Exception {
- final Account accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+ private InvoicePayment setupScenarioWithPayment(final boolean invoicePaymentSuccess) throws Exception {
+ final Account accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice("Shotgun", invoicePaymentSuccess, true);
final List<InvoicePayment> paymentsForAccount = killBillClient.getInvoicePaymentsForAccount(accountJson.getAccountId(), requestOptions);
Assert.assertEquals(paymentsForAccount.size(), 1);
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoiceVoid.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoiceVoid.java
index ed56795..6a79b16 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoiceVoid.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoiceVoid.java
@@ -24,7 +24,6 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
-import org.killbill.billing.api.FlakyRetryAnalyzer;
import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.ProductCategory;
import org.killbill.billing.client.KillBillClientException;
@@ -35,6 +34,7 @@ import org.killbill.billing.client.model.InvoicePaymentTransaction;
import org.killbill.billing.client.model.InvoicePayments;
import org.killbill.billing.client.model.PaymentTransaction;
import org.killbill.billing.invoice.api.InvoiceStatus;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.payment.api.TransactionType;
import org.killbill.billing.util.api.AuditLevel;
import org.testng.Assert;
@@ -147,8 +147,7 @@ public class TestInvoiceVoid extends TestJaxrsBase {
}
- // Flaky, see https://github.com/killbill/killbill/issues/860
- @Test(groups = "slow", description = "Void a child invoice", retryAnalyzer = FlakyRetryAnalyzer.class)
+ @Test(groups = "slow", description = "Void a child invoice")
public void testChildVoidInvoice() throws Exception {
final DateTime initialDate = new DateTime(2012, 4, 25, 0, 3, 42, 0);
final LocalDate triggeredDate = new LocalDate(2012, 5, 26);
@@ -162,13 +161,16 @@ public class TestInvoiceVoid extends TestJaxrsBase {
ProductCategory.BASE, BillingPeriod.MONTHLY, true);
// trigger an invoice generation
+ callbackServlet.pushExpectedEvent(ExtBusEventType.INVOICE_CREATION);
killBillClient.createInvoice(childAccount1.getAccountId(), triggeredDate, requestOptions);
+ callbackServlet.assertListenerStatus();
List<Invoice> child1Invoices = killBillClient.getInvoicesForAccount(childAccount1.getAccountId(), true, false, requestOptions);
assertEquals(child1Invoices.size(), 2);
// move one day so that the parent invoice is committed
+ callbackServlet.pushExpectedEvents(ExtBusEventType.INVOICE_CREATION, ExtBusEventType.INVOICE_PAYMENT_FAILED);
clock.addDays(1);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
List<Invoice> parentInvoices = killBillClient.getInvoicesForAccount(parentAccount.getAccountId(), true, false, requestOptions);
assertEquals(parentInvoices.size(), 1);
@@ -176,10 +178,17 @@ public class TestInvoiceVoid extends TestJaxrsBase {
killBillClient.voidInvoice(child1Invoices.get(1).getInvoiceId(), requestOptions);
// move the clock 1 month to check if invoices change
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE,
+ ExtBusEventType.INVOICE_CREATION,
+ // Overdue state is computed from the parent state
+ ExtBusEventType.OVERDUE_CHANGE,
+ ExtBusEventType.BLOCKING_STATE,
+ ExtBusEventType.OVERDUE_CHANGE,
+ ExtBusEventType.BLOCKING_STATE);
clock.addDays(31);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
- // The parent added other invoice, now it has two (duplicate)
+ // The parent added another invoice, now it has two (duplicate)
parentInvoices = killBillClient.getInvoicesForAccount(parentAccount.getAccountId(), true, false, requestOptions);
assertEquals(parentInvoices.size(), 2);
@@ -188,8 +197,7 @@ public class TestInvoiceVoid extends TestJaxrsBase {
assertEquals(child1Invoices.size(), 2);
}
- // Flaky, see https://github.com/killbill/killbill/issues/860
- @Test(groups = "slow", description = "Void a parent invoice", retryAnalyzer = FlakyRetryAnalyzer.class)
+ @Test(groups = "slow", description = "Void a parent invoice")
public void testParentVoidInvoice() throws Exception {
final DateTime initialDate = new DateTime(2012, 4, 25, 0, 3, 42, 0);
final LocalDate triggeredDate = new LocalDate(2012, 5, 26);
@@ -203,13 +211,16 @@ public class TestInvoiceVoid extends TestJaxrsBase {
ProductCategory.BASE, BillingPeriod.MONTHLY, true);
// trigger an invoice generation
+ callbackServlet.pushExpectedEvents(ExtBusEventType.INVOICE_CREATION);
killBillClient.createInvoice(childAccount1.getAccountId(), triggeredDate, requestOptions);
+ callbackServlet.assertListenerStatus();
List<Invoice> child1Invoices = killBillClient.getInvoicesForAccount(childAccount1.getAccountId(), true, false, requestOptions);
assertEquals(child1Invoices.size(), 2);
// move one day so that the parent invoice is committed
+ callbackServlet.pushExpectedEvents(ExtBusEventType.INVOICE_CREATION, ExtBusEventType.INVOICE_PAYMENT_FAILED);
clock.addDays(1);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
List<Invoice> parentInvoices = killBillClient.getInvoicesForAccount(parentAccount.getAccountId(), true, false, requestOptions);
assertEquals(parentInvoices.size(), 1);
@@ -217,8 +228,9 @@ public class TestInvoiceVoid extends TestJaxrsBase {
killBillClient.voidInvoice(parentInvoices.get(0).getInvoiceId(), requestOptions);
// move the clock 1 month to check if invoices change
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE);
clock.addDays(31);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
// since the child did not have any change, the parent does not have an invoice
// after the void.
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
index 91d4f61..a464a62 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
@@ -40,6 +40,7 @@ import org.killbill.billing.GuicyKillbillTestWithEmbeddedDBModule;
import org.killbill.billing.api.TestApiListener;
import org.killbill.billing.beatrix.integration.db.TestDBRouterAPI;
import org.killbill.billing.client.KillBillClient;
+import org.killbill.billing.client.KillBillClientException;
import org.killbill.billing.client.KillBillHttpClient;
import org.killbill.billing.client.model.Payment;
import org.killbill.billing.client.model.PaymentTransaction;
@@ -49,6 +50,7 @@ import org.killbill.billing.jaxrs.resources.TestDBRouterResource;
import org.killbill.billing.jetty.HttpServer;
import org.killbill.billing.jetty.HttpServerConfig;
import org.killbill.billing.lifecycle.glue.BusModule;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.osgi.api.OSGIServiceRegistration;
import org.killbill.billing.payment.glue.PaymentModule;
import org.killbill.billing.payment.provider.MockPaymentProviderPluginModule;
@@ -128,6 +130,7 @@ public class TestJaxrsBase extends KillbillClient {
protected HttpServerConfig config;
private HttpServer server;
+ private CallbackServer callbackServer;
@Override
protected KillbillConfigSource getConfigSource() {
@@ -217,6 +220,10 @@ public class TestJaxrsBase extends KillbillClient {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
// Because we truncate the tables, the database record_id auto_increment will be reset
@@ -226,23 +233,57 @@ public class TestJaxrsBase extends KillbillClient {
internalBus.start();
cacheControllerDispatcher.clearAll();
busHandler.reset();
+ callbackServlet.reset();
+
clock.resetDeltaFromReality();
clock.setDay(new LocalDate(2012, 8, 25));
// Make sure to re-generate the api key and secret (could be cached by Shiro)
DEFAULT_API_KEY = UUID.randomUUID().toString();
DEFAULT_API_SECRET = UUID.randomUUID().toString();
- loginTenant(DEFAULT_API_KEY, DEFAULT_API_SECRET);
// Recreate the tenant (tables have been cleaned-up)
+ createTenant(DEFAULT_API_KEY, DEFAULT_API_SECRET, true);
+ }
+
+ protected Tenant createTenant(final String apiKey, final String apiSecret, final boolean useGlobalDefault) throws KillBillClientException {
+ callbackServlet.assertListenerStatus();
+ callbackServlet.reset();
+
+ loginTenant(apiKey, apiSecret);
final Tenant tenant = new Tenant();
- tenant.setApiKey(DEFAULT_API_KEY);
- tenant.setApiSecret(DEFAULT_API_SECRET);
- killBillClient.createTenant(tenant, createdBy, reason, comment);
+ tenant.setApiKey(apiKey);
+ tenant.setApiSecret(apiSecret);
+
+ requestOptions = requestOptions.extend()
+ .withTenantApiKey(apiKey)
+ .withTenantApiSecret(apiSecret)
+ .build();
+
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TENANT_CONFIG_CHANGE);
+ if (!useGlobalDefault) {
+ // Catalog
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TENANT_CONFIG_CHANGE);
+ }
+
+ final Tenant createdTenant = killBillClient.createTenant(tenant, useGlobalDefault, requestOptions);
+
+ // Register tenant for callback
+ final String callback = callbackServer.getServletEndpoint();
+ killBillClient.registerCallbackNotificationForTenant(callback, requestOptions);
+ callbackServlet.assertListenerStatus();
+
+ createdTenant.setApiSecret(apiSecret);
+
+ return createdTenant;
}
@AfterMethod(groups = "slow")
public void afterMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
killBillClient.close();
externalBus.stop();
internalBus.stop();
@@ -285,6 +326,10 @@ public class TestJaxrsBase extends KillbillClient {
server = new HttpServer();
server.configure(config, getListeners(), getFilters());
server.start();
+
+ callbackServlet = new CallbackServlet();
+ callbackServer = new CallbackServer(callbackServlet);
+ callbackServer.startServer();
}
@@ -307,6 +352,7 @@ public class TestJaxrsBase extends KillbillClient {
public void afterSuite() {
try {
server.stop();
+ callbackServer.stopServer();
} catch (final Exception ignored) {
}
}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java
index 6b13996..0c8124e 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java
@@ -22,12 +22,12 @@ import java.math.BigDecimal;
import java.util.Comparator;
import java.util.List;
-import org.killbill.billing.client.KillBillClientException;
import org.killbill.billing.client.model.Account;
import org.killbill.billing.client.model.Invoice;
import org.killbill.billing.client.model.InvoicePayment;
import org.killbill.billing.client.model.Invoices;
import org.killbill.billing.client.model.Tags;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.util.tag.ControlTagType;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -61,16 +61,19 @@ public class TestOverdue extends TestJaxrsBase {
// We're still clear - see the configuration
Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getIsClearState());
+ callbackServlet.pushExpectedEvents(ExtBusEventType.INVOICE_CREATION, ExtBusEventType.INVOICE_PAYMENT_FAILED, ExtBusEventType.BLOCKING_STATE, ExtBusEventType.OVERDUE_CHANGE);
clock.addDays(30);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
Assert.assertEquals(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getName(), "OD1");
+ callbackServlet.pushExpectedEvents(ExtBusEventType.TAG_CREATION, ExtBusEventType.BLOCKING_STATE, ExtBusEventType.OVERDUE_CHANGE);
clock.addDays(10);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
Assert.assertEquals(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getName(), "OD2");
+ callbackServlet.pushExpectedEvents(ExtBusEventType.BLOCKING_STATE, ExtBusEventType.OVERDUE_CHANGE);
clock.addDays(10);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
Assert.assertEquals(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getName(), "OD3");
// Post external payments, paying the most recent invoice first: this is to avoid a race condition where
@@ -85,17 +88,19 @@ public class TestOverdue extends TestJaxrsBase {
}).reverse().sortedCopy(invoicesForAccount);
for (final Invoice invoice : mostRecentInvoiceFirst) {
if (invoice.getBalance().compareTo(BigDecimal.ZERO) > 0) {
-
final InvoicePayment invoicePayment = new InvoicePayment();
invoicePayment.setPurchasedAmount(invoice.getAmount());
invoicePayment.setAccountId(accountJson.getAccountId());
invoicePayment.setTargetInvoiceId(invoice.getInvoiceId());
+ callbackServlet.pushExpectedEvents(ExtBusEventType.INVOICE_PAYMENT_SUCCESS, ExtBusEventType.PAYMENT_SUCCESS);
killBillClient.createInvoicePayment(invoicePayment, true, requestOptions);
+ callbackServlet.assertListenerStatus();
}
}
// Wait a bit for overdue to pick up the payment events...
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.pushExpectedEvents(ExtBusEventType.TAG_DELETION, ExtBusEventType.BLOCKING_STATE, ExtBusEventType.OVERDUE_CHANGE);
+ callbackServlet.assertListenerStatus();
// Verify we're in clear state
Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getIsClearState());
@@ -103,20 +108,25 @@ public class TestOverdue extends TestJaxrsBase {
@Test(groups = "slow", description = "Allow overdue condition by control tag defined in overdue config xml file")
public void testControlTagOverdueConfig() throws Exception {
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TENANT_CONFIG_CHANGE);
final String overdueConfigPath = Resources.getResource("overdueWithControlTag.xml").getPath();
killBillClient.uploadXMLOverdueConfig(overdueConfigPath, requestOptions);
+ callbackServlet.assertListenerStatus();
// Create an account without a payment method and assign a TEST tag
final Account accountJson = createAccountNoPMBundleAndSubscription();
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TAG_CREATION);
final Tags accountTag = killBillClient.createAccountTag(accountJson.getAccountId(), ControlTagType.TEST.getId(), requestOptions);
+ callbackServlet.assertListenerStatus();
assertEquals(accountTag.get(0).getTagDefinitionId(), ControlTagType.TEST.getId());
// Create an account without a TEST tag
final Account accountJsonNoTag = createAccountNoPMBundleAndSubscription();
// No payment will be triggered as the account doesn't have a payment method
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE, ExtBusEventType.SUBSCRIPTION_PHASE, ExtBusEventType.INVOICE_CREATION, ExtBusEventType.INVOICE_CREATION, ExtBusEventType.INVOICE_PAYMENT_FAILED, ExtBusEventType.INVOICE_PAYMENT_FAILED);
clock.addMonths(1);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
// Get the invoices
final List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
@@ -131,8 +141,14 @@ public class TestOverdue extends TestJaxrsBase {
Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getIsClearState());
Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJsonNoTag.getAccountId(), requestOptions).getIsClearState());
+ callbackServlet.pushExpectedEvents(ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_FAILED,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_FAILED,
+ ExtBusEventType.BLOCKING_STATE,
+ ExtBusEventType.OVERDUE_CHANGE);
clock.addDays(30);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
// This account is expected to move to OD1 state because it matches with controlTag defined
Assert.assertEquals(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getName(), "OD1");
@@ -142,12 +158,16 @@ public class TestOverdue extends TestJaxrsBase {
@Test(groups = "slow", description = "Allow overdue condition by exclusion control tag defined in overdue config xml file")
public void testExclusionControlTagOverdueConfig() throws Exception {
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TENANT_CONFIG_CHANGE);
final String overdueConfigPath = Resources.getResource("overdueWithExclusionControlTag.xml").getPath();
killBillClient.uploadXMLOverdueConfig(overdueConfigPath, requestOptions);
+ callbackServlet.assertListenerStatus();
// Create an account without a payment method and assign a TEST tag
final Account accountJson = createAccountNoPMBundleAndSubscription();
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TAG_CREATION);
final Tags accountTag = killBillClient.createAccountTag(accountJson.getAccountId(), ControlTagType.TEST.getId(), requestOptions);
+ callbackServlet.assertListenerStatus();
assertEquals(accountTag.get(0).getTagDefinitionId(), ControlTagType.TEST.getId());
// Create an account without a TEST tag
@@ -155,8 +175,14 @@ public class TestOverdue extends TestJaxrsBase {
// move a month a wait for invoicing
// No payment will be triggered as the account doesn't have a payment method
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_FAILED,
+ ExtBusEventType.SUBSCRIPTION_PHASE,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_FAILED);
clock.addMonths(1);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
// Get the invoices
final List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
@@ -171,8 +197,14 @@ public class TestOverdue extends TestJaxrsBase {
Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getIsClearState());
Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJsonNoTag.getAccountId(), requestOptions).getIsClearState());
+ callbackServlet.pushExpectedEvents(ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_FAILED,
+ ExtBusEventType.INVOICE_PAYMENT_FAILED,
+ ExtBusEventType.BLOCKING_STATE,
+ ExtBusEventType.OVERDUE_CHANGE);
clock.addDays(30);
- crappyWaitForLackOfProperSynchonization();
+ callbackServlet.assertListenerStatus();
// This account is not expected to move to OD1 state because it does not match with exclusion controlTag defined
Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getIsClearState());
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
index 2b3f8a7..eb3e108 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
@@ -21,6 +21,8 @@ import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
import java.util.UUID;
@@ -31,6 +33,7 @@ import org.killbill.billing.ObjectType;
import org.killbill.billing.client.KillBillClientException;
import org.killbill.billing.client.RequestOptions;
import org.killbill.billing.client.model.Account;
+import org.killbill.billing.client.model.AuditLog;
import org.killbill.billing.client.model.ComboPaymentTransaction;
import org.killbill.billing.client.model.InvoicePayments;
import org.killbill.billing.client.model.Payment;
@@ -51,6 +54,7 @@ import org.killbill.billing.payment.plugin.api.PaymentPluginStatus;
import org.killbill.billing.payment.provider.MockPaymentControlProviderPlugin;
import org.killbill.billing.payment.provider.MockPaymentProviderPlugin;
import org.killbill.billing.util.api.AuditLevel;
+import org.killbill.billing.util.audit.ChangeType;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
@@ -64,6 +68,7 @@ import com.google.inject.Inject;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
@@ -79,6 +84,10 @@ public class TestPayment extends TestJaxrsBase {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
mockPaymentProviderPlugin = (MockPaymentProviderPlugin) registry.getServiceForName(PLUGIN_NAME);
@@ -103,6 +112,10 @@ public class TestPayment extends TestJaxrsBase {
@AfterMethod(groups = "slow")
public void tearDown() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
mockPaymentProviderPlugin.clear();
}
@@ -208,7 +221,7 @@ public class TestPayment extends TestJaxrsBase {
@Test(groups = "slow")
public void testWithFailedPaymentAndScheduledAttemptsGetInvoicePayment() throws Exception {
mockPaymentProviderPlugin.makeNextPaymentFailWithError();
- final Account account = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+ final Account account = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice(false);
// Getting Invoice #2 (first after Trial period)
UUID failedInvoiceId = killBillClient.getInvoicesForAccount(account.getAccountId(), false, false, RequestOptions.empty()).get(1).getInvoiceId();
@@ -239,7 +252,7 @@ public class TestPayment extends TestJaxrsBase {
@Test(groups = "slow")
public void testWithFailedPaymentAndScheduledAttemptsGetPaymentsForAccount() throws Exception {
mockPaymentProviderPlugin.makeNextPaymentFailWithError();
- final Account account = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+ final Account account = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice(false);
HashMultimap<String, String> queryParams = HashMultimap.create();
queryParams.put("withAttempts", "true");
@@ -259,7 +272,7 @@ public class TestPayment extends TestJaxrsBase {
@Test(groups = "slow")
public void testWithFailedPaymentAndScheduledAttemptsGetPayments() throws Exception {
mockPaymentProviderPlugin.makeNextPaymentFailWithError();
- createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+ createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice(false);
HashMultimap<String, String> queryParams = HashMultimap.create();
queryParams.put("withAttempts", "true");
@@ -279,7 +292,7 @@ public class TestPayment extends TestJaxrsBase {
@Test(groups = "slow")
public void testWithFailedPaymentAndScheduledAttemptsSearchPayments() throws Exception {
mockPaymentProviderPlugin.makeNextPaymentFailWithError();
- createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+ createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice(false);
HashMultimap<String, String> queryParams = HashMultimap.create();
queryParams.put("withAttempts", "true");
@@ -299,7 +312,7 @@ public class TestPayment extends TestJaxrsBase {
@Test(groups = "slow")
public void testWithFailedPaymentAndScheduledAttemptsGetPaymentById() throws Exception {
mockPaymentProviderPlugin.makeNextPaymentFailWithError();
- createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+ createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice(false);
Payments payments = killBillClient.searchPayments("", 0L, 100L, AuditLevel.NONE, requestOptions);
Assert.assertNotNull(payments.get(0));
@@ -758,6 +771,48 @@ public class TestPayment extends TestJaxrsBase {
Assert.assertEquals(paymentTransactionTag.get(0).getTagDefinitionName(), tagDefinitionName);
}
+ @Test(groups = "slow", description = "retrieve account logs")
+ public void testPaymentAuditLogsWithHistory() throws Exception {
+ final Account account = createAccountWithDefaultPaymentMethod();
+ final String externalPaymentKey = UUID.randomUUID().toString();
+ final UUID paymentId = testCreateRetrievePayment(account, null, externalPaymentKey, 1);
+
+ final Payment payment = killBillClient.getPaymentByExternalKey(externalPaymentKey);
+ assertEquals(payment.getPaymentId(), paymentId);
+
+ final List<AuditLog> paymentAuditLogWithHistory = killBillClient.getPaymentAuditLogsWithHistory(account.getAccountId(), paymentId);
+ assertEquals(paymentAuditLogWithHistory.size(), 8);
+ assertEquals(paymentAuditLogWithHistory.get(0).getChangeType(), ChangeType.INSERT.toString());
+ assertEquals(paymentAuditLogWithHistory.get(0).getObjectType(), ObjectType.PAYMENT);
+ assertEquals(paymentAuditLogWithHistory.get(0).getObjectId(), paymentId);
+
+ final LinkedHashMap history1 = (LinkedHashMap) paymentAuditLogWithHistory.get(0).getHistory();
+ assertNotNull(history1);
+ assertEquals(history1.get("stateName"), null );
+ final LinkedHashMap history2 = (LinkedHashMap) paymentAuditLogWithHistory.get(1).getHistory();
+ assertNotNull(history2);
+ assertEquals(history2.get("stateName"), "AUTH_SUCCESS" );
+ final LinkedHashMap history3 = (LinkedHashMap) paymentAuditLogWithHistory.get(2).getHistory();
+ assertNotNull(history3);
+ assertEquals(history3.get("stateName"), "AUTH_SUCCESS" );
+ final LinkedHashMap history4 = (LinkedHashMap) paymentAuditLogWithHistory.get(3).getHistory();
+ assertNotNull(history4);
+ assertEquals(history4.get("stateName"), "CAPTURE_SUCCESS" );
+ final LinkedHashMap history5 = (LinkedHashMap) paymentAuditLogWithHistory.get(4).getHistory();
+ assertNotNull(history5);
+ assertEquals(history5.get("stateName"), "CAPTURE_SUCCESS" );
+ final LinkedHashMap history6 = (LinkedHashMap) paymentAuditLogWithHistory.get(5).getHistory();
+ assertNotNull(history6);
+ assertEquals(history6.get("stateName"), "CAPTURE_SUCCESS" );
+ final LinkedHashMap history7 = (LinkedHashMap) paymentAuditLogWithHistory.get(6).getHistory();
+ assertNotNull(history7);
+ assertEquals(history7.get("stateName"), "CAPTURE_SUCCESS" );
+ final LinkedHashMap history8 = (LinkedHashMap) paymentAuditLogWithHistory.get(7).getHistory();
+ assertNotNull(history8);
+ assertEquals(history8.get("stateName"), "REFUND_SUCCESS" );
+
+ }
+
private UUID testCreateRetrievePayment(final Account account, @Nullable final UUID paymentMethodId,
final String paymentExternalKey, final int paymentNb) throws Exception {
// Authorization
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentMethod.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentMethod.java
index e44da34..c2e6dc9 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentMethod.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentMethod.java
@@ -20,20 +20,26 @@ package org.killbill.billing.jaxrs;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.UUID;
import org.killbill.billing.ObjectType;
import org.killbill.billing.client.model.Account;
+import org.killbill.billing.client.model.AuditLog;
import org.killbill.billing.client.model.CustomField;
import org.killbill.billing.client.model.CustomFields;
import org.killbill.billing.client.model.PaymentMethod;
import org.killbill.billing.client.model.PaymentMethods;
import org.killbill.billing.client.model.PluginProperty;
import org.killbill.billing.util.api.AuditLevel;
+import org.killbill.billing.util.audit.ChangeType;
import org.testng.Assert;
import org.testng.annotations.Test;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
public class TestPaymentMethod extends TestJaxrsBase {
@Test(groups = "slow", description = "Create/retrieve by externalKey")
@@ -137,6 +143,24 @@ public class TestPaymentMethod extends TestJaxrsBase {
Assert.assertEquals(deletedCustomFields.size(), 0);
}
+ @Test(groups = "slow", description = "retrieve account logs")
+ public void testPaymentMethodAuditLogsWithHistory() throws Exception {
+ final Account account = createAccountWithDefaultPaymentMethod();
+ assertNotNull(account);
+ final UUID paymentMethodId = account.getPaymentMethodId();
+
+ final List<AuditLog> paymentMethodAuditLogWithHistory = killBillClient.getPaymentMethodAuditLogsWithHistory(account.getAccountId(), paymentMethodId);
+ assertEquals(paymentMethodAuditLogWithHistory.size(), 1);
+ assertEquals(paymentMethodAuditLogWithHistory.get(0).getChangeType(), ChangeType.INSERT.toString());
+ assertEquals(paymentMethodAuditLogWithHistory.get(0).getObjectType(), ObjectType.PAYMENT_METHOD);
+ assertEquals(paymentMethodAuditLogWithHistory.get(0).getObjectId(), paymentMethodId);
+
+ final LinkedHashMap history1 = (LinkedHashMap) paymentMethodAuditLogWithHistory.get(0).getHistory();
+ assertNotNull(history1);
+ assertEquals(history1.get("accountId"), account.getAccountId().toString());
+
+ }
+
private void doSearch(final String searchKey, final PaymentMethod paymentMethodJson) throws Exception {
final List<PaymentMethod> results1 = killBillClient.searchPaymentMethodsByKey(searchKey, true);
Assert.assertEquals(results1.size(), 1);
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentPluginProperties.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentPluginProperties.java
index 3d87984..9904585 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentPluginProperties.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentPluginProperties.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
* The Billing Project 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
@@ -126,6 +126,10 @@ public class TestPaymentPluginProperties extends TestJaxrsBase {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
mockPaymentControlProviderPlugin = new PluginPropertiesVerificator();
@@ -149,6 +153,10 @@ public class TestPaymentPluginProperties extends TestJaxrsBase {
@AfterMethod(groups = "slow")
public void tearDown() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
mockPaymentControlProviderPlugin.clearExpectPluginProperties();
}
@@ -274,4 +282,4 @@ public class TestPaymentPluginProperties extends TestJaxrsBase {
bodyProperties.add(new PluginProperty(key, value, false));
expectProperties.add(new org.killbill.billing.payment.api.PluginProperty(key, value, false));
}
-}
\ No newline at end of file
+}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPerTenantConfig.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPerTenantConfig.java
index a8d572d..cbe1e97 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPerTenantConfig.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPerTenantConfig.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
* The Billing Project 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
@@ -18,13 +18,11 @@
package org.killbill.billing.jaxrs;
import java.util.HashMap;
-import java.util.concurrent.Callable;
-import java.util.concurrent.TimeUnit;
import org.killbill.billing.client.model.Account;
import org.killbill.billing.client.model.Payments;
-import org.killbill.billing.client.model.Tenant;
import org.killbill.billing.client.model.TenantKey;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.osgi.api.OSGIServiceRegistration;
import org.killbill.billing.payment.api.TransactionStatus;
import org.killbill.billing.payment.plugin.api.PaymentPluginApi;
@@ -36,8 +34,6 @@ import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.google.inject.Inject;
-import org.awaitility.Awaitility;
-import org.awaitility.Duration;
public class TestPerTenantConfig extends TestJaxrsBase {
@@ -48,25 +44,27 @@ public class TestPerTenantConfig extends TestJaxrsBase {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
mockPaymentProviderPlugin = (MockPaymentProviderPlugin) registry.getServiceForName(PLUGIN_NAME);
}
@AfterMethod(groups = "slow")
public void tearDown() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
mockPaymentProviderPlugin.clear();
}
@Test(groups = "slow")
public void testFailedPaymentWithPerTenantRetryConfig() throws Exception {
// Create the tenant
- final String apiKeyTenant1 = "tenantSuperTuned";
- final String apiSecretTenant1 = "2367$$ffr79";
- loginTenant(apiKeyTenant1, apiSecretTenant1);
- final Tenant tenant1 = new Tenant();
- tenant1.setApiKey(apiKeyTenant1);
- tenant1.setApiSecret(apiSecretTenant1);
- killBillClient.createTenant(tenant1, createdBy, reason, comment);
+ createTenant("tenantSuperTuned", "2367$$ffr79", true);
// Configure our plugin to fail
mockPaymentProviderPlugin.makeAllInvoicesFailWithError(true);
@@ -77,9 +75,11 @@ public class TestPerTenantConfig extends TestJaxrsBase {
perTenantProperties.put("org.killbill.payment.retry.days", "1,1,1");
final String perTenantConfig = mapper.writeValueAsString(perTenantProperties);
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TENANT_CONFIG_CHANGE);
final TenantKey tenantKey = killBillClient.postConfigurationPropertiesForTenant(perTenantConfig, requestOptions);
+ callbackServlet.assertListenerStatus();
- final Account accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+ final Account accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice(false);
final Payments payments = killBillClient.getPaymentsForAccount(accountJson.getAccountId());
Assert.assertEquals(payments.size(), 1);
@@ -92,22 +92,14 @@ public class TestPerTenantConfig extends TestJaxrsBase {
//
// Now unregister special per tenant config and we the first retry occurs one day after (and still fails), it now sets a retry date of 8 days
//
+ callbackServlet.pushExpectedEvents(ExtBusEventType.TENANT_CONFIG_DELETION);
killBillClient.unregisterConfigurationForTenant(requestOptions);
- // org.killbill.tenant.broadcast.rate has been set to 1s
- crappyWaitForLackOfProperSynchonization(2000);
+ callbackServlet.assertListenerStatus();
+ callbackServlet.pushExpectedEvents(ExtBusEventType.INVOICE_PAYMENT_FAILED, ExtBusEventType.PAYMENT_FAILED);
clock.addDays(1);
+ callbackServlet.assertListenerStatus();
- Awaitility.await()
- .atMost(4, TimeUnit.SECONDS)
- .pollInterval(Duration.ONE_SECOND)
- .until(new Callable<Boolean>() {
- @Override
- public Boolean call() throws Exception {
-
- return killBillClient.getPaymentsForAccount(accountJson.getAccountId()).get(0).getTransactions().size() == 2;
- }
- });
final Payments payments2 = killBillClient.getPaymentsForAccount(accountJson.getAccountId());
Assert.assertEquals(payments2.size(), 1);
Assert.assertEquals(payments2.get(0).getTransactions().size(), 2);
@@ -115,7 +107,7 @@ public class TestPerTenantConfig extends TestJaxrsBase {
Assert.assertEquals(payments2.get(0).getTransactions().get(1).getStatus(), TransactionStatus.PAYMENT_FAILURE.name());
clock.addDays(1);
- crappyWaitForLackOfProperSynchonization(3000);
+ callbackServlet.assertListenerStatus();
// No retry with default config
final Payments payments3 = killBillClient.getPaymentsForAccount(accountJson.getAccountId());
@@ -123,17 +115,10 @@ public class TestPerTenantConfig extends TestJaxrsBase {
Assert.assertEquals(payments3.get(0).getTransactions().size(), 2);
mockPaymentProviderPlugin.makeAllInvoicesFailWithError(false);
+ callbackServlet.pushExpectedEvents(ExtBusEventType.INVOICE_PAYMENT_SUCCESS, ExtBusEventType.PAYMENT_SUCCESS);
clock.addDays(7);
+ callbackServlet.assertListenerStatus();
- Awaitility.await()
- .atMost(4, TimeUnit.SECONDS)
- .pollInterval(Duration.ONE_SECOND)
- .until(new Callable<Boolean>() {
- @Override
- public Boolean call() throws Exception {
- return killBillClient.getPaymentsForAccount(accountJson.getAccountId()).get(0).getTransactions().size() == 3;
- }
- });
final Payments payments4 = killBillClient.getPaymentsForAccount(accountJson.getAccountId());
Assert.assertEquals(payments4.size(), 1);
Assert.assertEquals(payments4.get(0).getTransactions().size(), 3);
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPlugin.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPlugin.java
index 3b4ce0c..9a03015 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPlugin.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPlugin.java
@@ -57,6 +57,10 @@ public class TestPlugin extends TestJaxrsBase {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
setupOSGIPlugin();
resetAllMarkers();
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPushNotification.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPushNotification.java
index 5d08db5..d7d1d89 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPushNotification.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPushNotification.java
@@ -18,130 +18,31 @@
package org.killbill.billing.jaxrs;
-import java.io.IOException;
-import java.io.InputStreamReader;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
import org.awaitility.Awaitility;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
import org.joda.time.DateTime;
import org.killbill.CreatorName;
-import org.killbill.billing.api.FlakyRetryAnalyzer;
-import org.killbill.billing.client.KillBillClientException;
-import org.killbill.billing.client.model.TenantKey;
-import org.killbill.billing.jaxrs.json.NotificationJson;
import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.server.DefaultServerService;
import org.killbill.billing.server.notifications.PushNotificationKey;
-import org.killbill.billing.server.notifications.PushNotificationListener;
-import org.killbill.billing.tenant.api.TenantKV;
import org.killbill.notificationq.NotificationQueueDispatcher;
import org.killbill.notificationq.api.NotificationEvent;
import org.killbill.notificationq.api.NotificationQueue;
import org.killbill.notificationq.api.NotificationQueueService.NotificationQueueHandler;
import org.killbill.notificationq.dao.NotificationEventModelDao;
import org.killbill.queue.QueueObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.io.CharStreams;
public class TestPushNotification extends TestJaxrsBase {
- private CallbackServer callbackServer;
-
- private static final int SERVER_PORT = 8087;
- private static final String CALLBACK_ENDPOINT = "/callmeback";
-
- private volatile boolean callbackCompleted;
- private volatile boolean callbackCompletedWithError;
- private volatile int expectedNbCalls = 1;
- private volatile boolean forceToFail = false;
- private volatile int failedResponseStatus = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
-
- @Override
- @BeforeMethod(groups = "slow")
- public void beforeMethod() throws Exception {
- super.beforeMethod();
- callbackServer = new CallbackServer(this, SERVER_PORT, CALLBACK_ENDPOINT);
- resetCallbackStatusProperties();
- callbackServer.startServer();
- this.expectedNbCalls = 1;
- }
-
- @AfterMethod(groups = "slow")
- public void afterMethod() throws Exception {
- callbackServer.stopServer();
- }
-
- private void assertAllCallbacksCompleted() throws InterruptedException {
- final boolean waitForCallbacksToComplete = waitForCallbacksToComplete();
- if (!waitForCallbacksToComplete) {
- printThreadDump();
- }
- Assert.assertTrue(waitForCallbacksToComplete, "Fail to see push notification callbacks");
- }
-
- private boolean waitForCallbacksToComplete() throws InterruptedException {
- long remainingMs = DEFAULT_REQUEST_TIMEOUT_SEC * 1000;
- do {
- if (callbackCompleted) {
- break;
- }
- Thread.sleep(100);
- remainingMs -= 100;
- } while (remainingMs > 0);
- return (remainingMs > 0);
- }
-
- public void retrieveAccountWithAsserts(final UUID accountId) {
- try {
- // Just check we can retrieve the account with the id from the callback
- killBillClient.getAccount(accountId, requestOptions);
- } catch (final Exception e) {
- Assert.fail(e.getMessage());
- }
- }
-
- @Test(groups = "slow")
- public void testPushNotification() throws Exception {
- final String callback = registerTenantForCallback();
-
- // set expected number of calls
- // 1st: was "eventType":"TENANT_CONFIG_CHANGE"
- // 2nd: is "eventType":"ACCOUNT_CREATION"
- this.expectedNbCalls = 2;
-
- // Create account to trigger a push notification
- createAccount();
-
- assertAllCallbacksCompleted();
-
- if (callbackCompletedWithError) {
- Assert.fail("Assertion during callback failed...");
- }
-
- unregisterTenantForCallback(callback);
- }
-
@Test(groups = "slow", description = "https://github.com/killbill/killbill/issues/726")
public void testVerify726Backport() throws Exception {
// Record an event without the metadata field
@@ -208,257 +109,170 @@ public class TestPushNotification extends TestJaxrsBase {
Assert.assertNull(retrievedKey.getMetaData());
}
- private void unregisterTenantForCallback(final String callback) throws KillBillClientException {
- final TenantKey result = killBillClient.getCallbackNotificationForTenant(requestOptions);
- Assert.assertEquals(result.getKey(), TenantKV.TenantKey.PUSH_NOTIFICATION_CB.toString());
- Assert.assertEquals(result.getValues().size(), 1);
- Assert.assertEquals(result.getValues().get(0), callback);
-
- killBillClient.unregisterCallbackNotificationForTenant(requestOptions);
- final TenantKey result2 = killBillClient.getCallbackNotificationForTenant(requestOptions);
- Assert.assertEquals(result2.getKey(), TenantKV.TenantKey.PUSH_NOTIFICATION_CB.toString());
- Assert.assertEquals(result2.getValues().size(), 0);
- }
-
- private String registerTenantForCallback() throws KillBillClientException, InterruptedException {// Register tenant for callback
- final String callback = "http://127.0.0.1:" + SERVER_PORT + CALLBACK_ENDPOINT;
- final TenantKey result0 = killBillClient.registerCallbackNotificationForTenant(callback, requestOptions);
-
- Assert.assertTrue(waitForCallbacksToComplete());
-
- Assert.assertEquals(result0.getKey(), TenantKV.TenantKey.PUSH_NOTIFICATION_CB.toString());
- Assert.assertEquals(result0.getValues().size(), 1);
- Assert.assertEquals(result0.getValues().get(0), callback);
-
- // reset values
- resetCallbackStatusProperties();
- return callback;
- }
-
- // Flaky, see https://github.com/killbill/killbill/issues/860
- @Test(groups = "slow", retryAnalyzer = FlakyRetryAnalyzer.class)
+ @Test(groups = "slow")
public void testPushNotificationRetries() throws Exception {
- final String callback = registerTenantForCallback();
+ Assert.assertEquals(callbackServlet.receivedCalls.get(), 1);
// force server to fail
// Notifications retries are set to:
// org.killbill.billing.server.notifications.retries=15m,1h,1d,2d
- this.forceToFail = true;
+ callbackServlet.forceToFail.set(true);
- // set expected number of calls
// 1st: was "eventType":"TENANT_CONFIG_CHANGE"
// 2nd: is original "eventType":"ACCOUNT_CREATION" call [force error]
// 3rd: is 1st notification retry (+ 15m) [force error]
// 4th: is 1st notification retry (+ 1h) [force error]
// 5th: is 1st notification retry (+ 1d) [success]
- this.expectedNbCalls = 5;
// Create account to trigger a push notification
- createAccount();
-
- assertAllCallbacksCompleted();
- Assert.assertTrue(callbackCompletedWithError);
-
- resetCallbackStatusProperties();
+ createAccountNoEvent(null);
+ Awaitility.await()
+ .atMost(10, TimeUnit.SECONDS)
+ .until(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ return callbackServlet.receivedCalls.get() == 2;
+ }
+ });
+ callbackServlet.assertListenerStatus();
+ Assert.assertEquals(callbackServlet.receivedCalls.get(), 2);
// move clock 15 minutes and get 1st retry
clock.addDeltaFromReality(900000);
- assertAllCallbacksCompleted();
- Assert.assertTrue(callbackCompletedWithError);
-
- resetCallbackStatusProperties();
+ Awaitility.await()
+ .atMost(10, TimeUnit.SECONDS)
+ .until(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ return callbackServlet.receivedCalls.get() == 3;
+ }
+ });
+ callbackServlet.assertListenerStatus();
+ Assert.assertEquals(callbackServlet.receivedCalls.get(), 3);
// move clock an hour and get 2nd retry
clock.addDeltaFromReality(3600000);
- assertAllCallbacksCompleted();
- Assert.assertTrue(callbackCompletedWithError);
-
- resetCallbackStatusProperties();
+ Awaitility.await()
+ .atMost(10, TimeUnit.SECONDS)
+ .until(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ return callbackServlet.receivedCalls.get() == 4;
+ }
+ });
+ callbackServlet.assertListenerStatus();
+ Assert.assertEquals(callbackServlet.receivedCalls.get(), 4);
// make call success
- this.forceToFail = false;
+ callbackServlet.pushExpectedEvents(ExtBusEventType.ACCOUNT_CREATION);
+ callbackServlet.forceToFail.set(false);
// move clock a day, get 3rd retry and wait for a success push notification
clock.addDays(1);
- assertAllCallbacksCompleted();
- Assert.assertFalse(callbackCompletedWithError);
-
- unregisterTenantForCallback(callback);
+ Awaitility.await()
+ .atMost(10, TimeUnit.SECONDS)
+ .until(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ return callbackServlet.receivedCalls.get() == 5;
+ }
+ });
+ callbackServlet.assertListenerStatus();
+ Assert.assertEquals(callbackServlet.receivedCalls.get(), 5);
}
- // Flaky, see https://github.com/killbill/killbill/issues/860
- @Test(groups = "slow", retryAnalyzer = FlakyRetryAnalyzer.class)
+ @Test(groups = "slow")
public void testPushNotificationRetriesMaxAttemptNumber() throws Exception {
- final String callback = registerTenantForCallback();
+ Assert.assertEquals(callbackServlet.receivedCalls.get(), 1);
// force server to fail
// Notifications retries are set to:
// org.killbill.billing.server.notifications.retries=15m,1h,1d,2d
- this.forceToFail = true;
+ callbackServlet.forceToFail.set(true);
- // set expected number of calls
// 1st: was "eventType":"TENANT_CONFIG_CHANGE"
// 2nd: is original "eventType":"ACCOUNT_CREATION" call [force error]
// 3rd: is 1st notification retry (+ 15m) [force error]
// 4th: is 2nd notification retry (+ 1h) [force error]
// 5th: is 3rd notification retry (+ 1d) [force error]
// 6th: is 4th notification retry (+ 2d) [force error]
- this.expectedNbCalls = 6;
// Create account to trigger a push notification
- createAccount();
-
- assertAllCallbacksCompleted();
- Assert.assertTrue(callbackCompletedWithError);
-
- resetCallbackStatusProperties();
+ createAccountNoEvent(null);
+ Awaitility.await()
+ .atMost(10, TimeUnit.SECONDS)
+ .until(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ return callbackServlet.receivedCalls.get() == 2;
+ }
+ });
+ callbackServlet.assertListenerStatus();
+ Assert.assertEquals(callbackServlet.receivedCalls.get(), 2);
// move clock 15 minutes (+10s for flakiness) and get 1st retry
clock.addDeltaFromReality(910000);
- assertAllCallbacksCompleted();
- Assert.assertTrue(callbackCompletedWithError);
-
- resetCallbackStatusProperties();
+ Awaitility.await()
+ .atMost(10, TimeUnit.SECONDS)
+ .until(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ return callbackServlet.receivedCalls.get() == 3;
+ }
+ });
+ callbackServlet.assertListenerStatus();
+ Assert.assertEquals(callbackServlet.receivedCalls.get(), 3);
// move clock an hour (+10s for flakiness) and get 2nd retry
clock.addDeltaFromReality(3610000);
- assertAllCallbacksCompleted();
- Assert.assertTrue(callbackCompletedWithError);
-
- resetCallbackStatusProperties();
+ Awaitility.await()
+ .atMost(10, TimeUnit.SECONDS)
+ .until(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ return callbackServlet.receivedCalls.get() == 4;
+ }
+ });
+ callbackServlet.assertListenerStatus();
+ Assert.assertEquals(callbackServlet.receivedCalls.get(), 4);
// move clock a day and get 3rd retry
clock.addDays(1);
- assertAllCallbacksCompleted();
- Assert.assertTrue(callbackCompletedWithError);
-
- resetCallbackStatusProperties();
-
- // move clock a day and get 4rd retry
+ Awaitility.await()
+ .atMost(10, TimeUnit.SECONDS)
+ .until(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ return callbackServlet.receivedCalls.get() == 5;
+ }
+ });
+ callbackServlet.assertListenerStatus();
+ Assert.assertEquals(callbackServlet.receivedCalls.get(), 5);
+
+ // move clock a day and get 4th retry
clock.addDays(2);
- assertAllCallbacksCompleted();
- Assert.assertTrue(callbackCompletedWithError);
- resetCallbackStatusProperties();
+ Awaitility.await()
+ .atMost(10, TimeUnit.SECONDS)
+ .until(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ return callbackServlet.receivedCalls.get() == 6;
+ }
+ });
+ callbackServlet.assertListenerStatus();
+ Assert.assertEquals(callbackServlet.receivedCalls.get(), 6);
clock.addDays(4);
- Assert.assertFalse(waitForCallbacksToComplete());
- Assert.assertFalse(callbackCompletedWithError);
-
- unregisterTenantForCallback(callback);
- }
-
- private void resetCallbackStatusProperties() {
- // reset values
- this.callbackCompleted = false;
- this.callbackCompletedWithError = false;
- }
-
- public void setCompleted(final boolean withError) {
- callbackCompleted = true;
- callbackCompletedWithError = withError;
- }
-
- public static class CallbackServer {
-
- private final Server server;
- private final String callbackEndpoint;
- private final TestPushNotification test;
-
- public CallbackServer(final TestPushNotification test, final int port, final String callbackEndpoint) {
- this.callbackEndpoint = callbackEndpoint;
- this.test = test;
- this.server = new Server(port);
- }
-
- public void startServer() throws Exception {
- final ServletContextHandler context = new ServletContextHandler();
- context.setContextPath("/");
- server.setHandler(context);
- context.addServlet(new ServletHolder(new CallmebackServlet(test)), callbackEndpoint);
- server.start();
- }
-
- public void stopServer() throws Exception {
- server.stop();
- }
- }
-
- public static class CallmebackServlet extends HttpServlet {
-
- private static final long serialVersionUID = -5181211514918217301L;
-
- private static final Logger log = LoggerFactory.getLogger(CallmebackServlet.class);
-
- private final AtomicInteger receivedCalls;
- private final TestPushNotification test;
- private final ObjectMapper objectMapper = new ObjectMapper();
-
- private boolean withError;
-
- public CallmebackServlet(final TestPushNotification test) {
- this.test = test;
- this.receivedCalls = new AtomicInteger(0);
- }
-
- @Override
- protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
- final int current = receivedCalls.incrementAndGet();
- final String body = CharStreams.toString(new InputStreamReader(request.getInputStream(), "UTF-8"));
-
- log.info("CallmebackServlet received {} calls , current = {} at {}", current, body, getClock().getUTCNow());
-
- if (test.forceToFail) {
- response.setStatus(test.failedResponseStatus);
- log.info("CallmebackServlet is force to fail for testing purposes");
- test.setCompleted(true);
- return;
- }
-
- response.setStatus(HttpServletResponse.SC_OK);
-
- log.info("Got body {}", body);
-
- final NotificationJson notification = objectMapper.readValue(body, NotificationJson.class);
-
- final ExtBusEventType type = ExtBusEventType.valueOf(notification.getEventType());
- switch (type) {
- case TENANT_CONFIG_CHANGE:
- Assert.assertEquals(notification.getEventType(), "TENANT_CONFIG_CHANGE");
- Assert.assertEquals(notification.getObjectType(), "TENANT_KVS");
- Assert.assertNotNull(notification.getObjectId());
- Assert.assertNull(notification.getAccountId());
- Assert.assertNotNull(notification.getMetaData());
- Assert.assertEquals(notification.getMetaData(), "PUSH_NOTIFICATION_CB");
- break;
- case ACCOUNT_CREATION:
- Assert.assertEquals(notification.getEventType(), "ACCOUNT_CREATION");
- Assert.assertEquals(notification.getObjectType(), "ACCOUNT");
- Assert.assertNotNull(notification.getObjectId());
- Assert.assertNotNull(notification.getAccountId());
- Assert.assertEquals(notification.getObjectId(), notification.getAccountId());
- break;
- }
-
- test.retrieveAccountWithAsserts(notification.getObjectId());
-
- Assert.assertEquals(request.getHeader(PushNotificationListener.HTTP_HEADER_CONTENT_TYPE), PushNotificationListener.CONTENT_TYPE_JSON);
- stopServerWhenComplete(current, false);
- }
-
- private void stopServerWhenComplete(final int current, final boolean withError) {
- if (current == test.expectedNbCalls) {
- log.info("Excellent, we are done!");
- test.setCompleted(withError);
- }
- }
+ callbackServlet.assertListenerStatus();
+ Assert.assertEquals(callbackServlet.receivedCalls.get(), 6);
}
public static final class PushNotificationKeyPre726 implements NotificationEvent {
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestTag.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestTag.java
index ae69442..a4142aa 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestTag.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestTag.java
@@ -18,6 +18,7 @@
package org.killbill.billing.jaxrs;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.UUID;
@@ -29,11 +30,13 @@ import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.ProductCategory;
import org.killbill.billing.client.KillBillClientException;
import org.killbill.billing.client.model.Account;
+import org.killbill.billing.client.model.AuditLog;
import org.killbill.billing.client.model.Subscription;
import org.killbill.billing.client.model.Tag;
import org.killbill.billing.client.model.TagDefinition;
import org.killbill.billing.client.model.Tags;
import org.killbill.billing.util.api.AuditLevel;
+import org.killbill.billing.util.audit.ChangeType;
import org.killbill.billing.util.tag.ControlTagType;
import org.killbill.billing.util.tag.dao.SystemTags;
import org.testng.Assert;
@@ -165,6 +168,40 @@ public class TestTag extends TestJaxrsBase {
}
}
+ @Test(groups = "slow", description = "retrieve account logs")
+ public void testGetTagAuditLogsWithHistory() throws Exception {
+ final Account accountJson = createAccount();
+ assertNotNull(accountJson);
+
+ final TagDefinition accountTagDefInput = new TagDefinition(null, false, "accounttagdef", "nothing special", ImmutableList.<ObjectType>of(ObjectType.TRANSACTION));
+ final TagDefinition accountTagDef = killBillClient.createTagDefinition(accountTagDefInput, requestOptions);
+ killBillClient.createAccountTag(accountJson.getAccountId(), accountTagDef.getId(), requestOptions);
+
+ // get all audit for the account
+ final List<AuditLog> auditLogsJson = killBillClient.getAccountAuditLogs(accountJson.getAccountId());
+ Assert.assertEquals(auditLogsJson.size(), 2);
+ UUID objectId = null;
+ for (AuditLog auditLog : auditLogsJson) {
+ if (auditLog.getObjectType().equals(ObjectType.TAG)) {
+ objectId = auditLog.getObjectId();
+ break;
+ }
+ }
+ assertNotNull(objectId);
+ final List<AuditLog> tagAuditLogWithHistories = killBillClient.getTagAuditLogsWithHistory(accountJson.getAccountId(), objectId);
+ assertEquals(tagAuditLogWithHistories.size(), 1);
+ assertEquals(tagAuditLogWithHistories.get(0).getChangeType(), ChangeType.INSERT.toString());
+ assertEquals(tagAuditLogWithHistories.get(0).getObjectType(), ObjectType.TAG);
+ assertEquals(tagAuditLogWithHistories.get(0).getObjectId(), objectId);
+
+ final LinkedHashMap history1 = (LinkedHashMap) tagAuditLogWithHistories.get(0).getHistory();
+ assertNotNull(history1);
+ assertEquals(history1.get("tagDefinitionId"), accountTagDef.getId().toString());
+ assertEquals(history1.get("objectId"), accountJson.getAccountId().toString());
+ assertEquals(history1.get("objectType"), ObjectType.ACCOUNT.toString());
+
+ }
+
@Test(groups = "slow", description = "Can paginate through all tags")
public void testTagsPagination() throws Exception {
final Account account = createAccount();
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestTenantKV.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestTenantKV.java
index fbff4b5..80a3363 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestTenantKV.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestTenantKV.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
* The Billing Project 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
@@ -35,6 +35,7 @@ import org.killbill.billing.client.model.PaymentTransaction;
import org.killbill.billing.client.model.PluginProperty;
import org.killbill.billing.client.model.Tenant;
import org.killbill.billing.client.model.TenantKey;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.payment.api.TransactionStatus;
import org.killbill.billing.tenant.api.TenantKV;
import org.testng.Assert;
@@ -53,7 +54,9 @@ public class TestTenantKV extends TestJaxrsBase {
final String pluginName = "PLUGIN_FOO";
final String pluginPath = Resources.getResource("plugin.yml").getPath();
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TENANT_CONFIG_CHANGE);
final TenantKey tenantKey0 = killBillClient.registerPluginConfigurationForTenant(pluginName, pluginPath, createdBy, reason, comment);
+ callbackServlet.assertListenerStatus();
Assert.assertEquals(tenantKey0.getKey(), TenantKV.TenantKey.PLUGIN_CONFIG_.toString() + pluginName);
final TenantKey tenantKey1 = killBillClient.getPluginConfigurationForTenant(pluginName);
@@ -68,53 +71,55 @@ public class TestTenantKV extends TestJaxrsBase {
@Test(groups = "slow", description = "Upload and retrieve a per plugin payment state machine config")
public void testPerTenantPluginPaymentStateMachineConfig() throws Exception {
+ final RequestOptions requestOptionsForOriginalTenant = requestOptions;
+
// Create another tenant - it will have a different state machine
- final Tenant otherTenantWithDifferentStateMachine = new Tenant();
- otherTenantWithDifferentStateMachine.setApiKey(UUID.randomUUID().toString());
- otherTenantWithDifferentStateMachine.setApiSecret(UUID.randomUUID().toString());
- killBillClient.createTenant(otherTenantWithDifferentStateMachine, true, requestOptions);
- final RequestOptions requestOptionsOtherTenant = requestOptions.extend()
- .withTenantApiKey(otherTenantWithDifferentStateMachine.getApiKey())
- .withTenantApiSecret(otherTenantWithDifferentStateMachine.getApiSecret())
- .build();
+ final Tenant otherTenantWithDifferentStateMachine = createTenant(UUID.randomUUID().toString(), UUID.randomUUID().toString(), true);
// Verify initial state
- final TenantKey emptyTenantKey = killBillClient.getPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, requestOptions);
+ final TenantKey emptyTenantKey = killBillClient.getPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, requestOptionsForOriginalTenant);
Assert.assertEquals(emptyTenantKey.getValues().size(), 0);
- final TenantKey emptyTenantKeyOtherTenant = killBillClient.getPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, requestOptionsOtherTenant);
+ final TenantKey emptyTenantKeyOtherTenant = killBillClient.getPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, requestOptions);
Assert.assertEquals(emptyTenantKeyOtherTenant.getValues().size(), 0);
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TENANT_CONFIG_CHANGE);
final String stateMachineConfigPath = Resources.getResource("SimplePaymentStates.xml").getPath();
- final TenantKey tenantKey0 = killBillClient.registerPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, stateMachineConfigPath, requestOptionsOtherTenant);
+ final TenantKey tenantKey0 = killBillClient.registerPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, stateMachineConfigPath, requestOptions);
+ callbackServlet.assertListenerStatus();
Assert.assertEquals(tenantKey0.getKey(), TenantKV.TenantKey.PLUGIN_PAYMENT_STATE_MACHINE_.toString() + PLUGIN_NAME);
// Verify only the other tenant has the new state machine
- final TenantKey emptyTenantKey1 = killBillClient.getPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, requestOptions);
+ final TenantKey emptyTenantKey1 = killBillClient.getPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, requestOptionsForOriginalTenant);
Assert.assertEquals(emptyTenantKey1.getValues().size(), 0);
- final TenantKey tenantKey1OtherTenant = killBillClient.getPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, requestOptionsOtherTenant);
+ final TenantKey tenantKey1OtherTenant = killBillClient.getPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, requestOptions);
Assert.assertEquals(tenantKey1OtherTenant.getKey(), TenantKV.TenantKey.PLUGIN_PAYMENT_STATE_MACHINE_.toString() + PLUGIN_NAME);
Assert.assertEquals(tenantKey1OtherTenant.getValues().size(), 1);
// Create an auth in both tenant
- final Payment payment = createComboPaymentTransaction(requestOptions);
- final Payment paymentOtherTenant = createComboPaymentTransaction(requestOptionsOtherTenant);
+ final Payment payment = createComboPaymentTransaction(requestOptionsForOriginalTenant);
+ final Payment paymentOtherTenant = createComboPaymentTransaction(requestOptions);
// Void in the first tenant (allowed by the default state machine)
- final Payment voidPayment = killBillClient.voidPayment(payment.getPaymentId(), payment.getPaymentExternalKey(), UUID.randomUUID().toString(), ImmutableList.<String>of(), ImmutableMap.<String, String>of(), requestOptions);
+ callbackServlet.pushExpectedEvent(ExtBusEventType.PAYMENT_SUCCESS);
+ final Payment voidPayment = killBillClient.voidPayment(payment.getPaymentId(), payment.getPaymentExternalKey(), UUID.randomUUID().toString(), ImmutableList.<String>of(), ImmutableMap.<String, String>of(), requestOptionsForOriginalTenant);
+ callbackServlet.assertListenerStatus();
Assert.assertEquals(voidPayment.getTransactions().get(0).getStatus(), TransactionStatus.SUCCESS.toString());
Assert.assertEquals(voidPayment.getTransactions().get(1).getStatus(), TransactionStatus.SUCCESS.toString());
// Void in the other tenant (disallowed)
try {
- killBillClient.voidPayment(paymentOtherTenant.getPaymentId(), paymentOtherTenant.getPaymentExternalKey(), UUID.randomUUID().toString(), ImmutableList.<String>of(), ImmutableMap.<String, String>of(), requestOptionsOtherTenant);
+ killBillClient.voidPayment(paymentOtherTenant.getPaymentId(), paymentOtherTenant.getPaymentExternalKey(), UUID.randomUUID().toString(), ImmutableList.<String>of(), ImmutableMap.<String, String>of(), requestOptions);
Assert.fail();
} catch (final KillBillClientException e) {
Assert.assertEquals((int) e.getBillingException().getCode(), ErrorCode.PAYMENT_INVALID_OPERATION.getCode());
}
+ callbackServlet.assertListenerStatus();
// Remove the custom state machine
- killBillClient.unregisterPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, requestOptionsOtherTenant);
- final TenantKey tenantKey2 = killBillClient.getPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, requestOptionsOtherTenant);
+ callbackServlet.pushExpectedEvent(ExtBusEventType.TENANT_CONFIG_DELETION);
+ killBillClient.unregisterPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, requestOptions);
+ callbackServlet.assertListenerStatus();
+ final TenantKey tenantKey2 = killBillClient.getPluginPaymentStateMachineConfigurationForTenant(PLUGIN_NAME, requestOptions);
Assert.assertEquals(tenantKey2.getKey(), TenantKV.TenantKey.PLUGIN_PAYMENT_STATE_MACHINE_.toString() + PLUGIN_NAME);
Assert.assertEquals(tenantKey2.getValues().size(), 0);
@@ -127,7 +132,9 @@ public class TestTenantKV extends TestJaxrsBase {
public Boolean call() throws Exception {
// The void should now go through
try {
- final Payment voidPaymentOtherTenant2 = killBillClient.voidPayment(paymentOtherTenant.getPaymentId(), paymentOtherTenant.getPaymentExternalKey(), UUID.randomUUID().toString(), ImmutableList.<String>of(), ImmutableMap.<String, String>of(), requestOptionsOtherTenant);
+ callbackServlet.pushExpectedEvent(ExtBusEventType.PAYMENT_SUCCESS);
+ final Payment voidPaymentOtherTenant2 = killBillClient.voidPayment(paymentOtherTenant.getPaymentId(), paymentOtherTenant.getPaymentExternalKey(), UUID.randomUUID().toString(), ImmutableList.<String>of(), ImmutableMap.<String, String>of(), requestOptions);
+ callbackServlet.assertListenerStatus();
voidPaymentOtherTenant2Ref.set(voidPaymentOtherTenant2);
return voidPaymentOtherTenant2 != null;
} catch (final KillBillClientException e) {
@@ -158,8 +165,10 @@ public class TestTenantKV extends TestJaxrsBase {
authTransactionJson.setTransactionExternalKey(authTransactionExternalKey);
authTransactionJson.setTransactionType("AUTHORIZE");
+ callbackServlet.pushExpectedEvents(ExtBusEventType.ACCOUNT_CREATION, ExtBusEventType.ACCOUNT_CHANGE, ExtBusEventType.PAYMENT_SUCCESS);
final ComboPaymentTransaction comboAuthorization = new ComboPaymentTransaction(accountJson, paymentMethodJson, authTransactionJson, ImmutableList.<PluginProperty>of(), ImmutableList.<PluginProperty>of());
final Payment payment = killBillClient.createPayment(comboAuthorization, ImmutableMap.<String, String>of(), requestOptions);
+ callbackServlet.assertListenerStatus();
Assert.assertEquals(payment.getTransactions().get(0).getStatus(), TransactionStatus.SUCCESS.toString());
return payment;
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestUsage.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestUsage.java
index 3909fa6..e20f909 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestUsage.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestUsage.java
@@ -19,8 +19,6 @@ package org.killbill.billing.jaxrs;
import java.util.UUID;
-import javax.annotation.Nullable;
-
import org.killbill.billing.ErrorCode;
import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.PriceListSet;
@@ -36,6 +34,7 @@ import org.killbill.billing.client.model.SubscriptionUsageRecord;
import org.killbill.billing.client.model.UnitUsageRecord;
import org.killbill.billing.client.model.UsageRecord;
import org.killbill.billing.invoice.api.InvoiceItemType;
+import org.killbill.billing.notification.plugin.api.ExtBusEventType;
import org.killbill.billing.util.api.AuditLevel;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -64,10 +63,19 @@ public class TestUsage extends TestJaxrsBase {
addOn.setBillingPeriod(BillingPeriod.NO_BILLING_PERIOD);
addOn.setPriceList(PriceListSet.DEFAULT_PRICELIST_NAME);
+ callbackServlet.pushExpectedEvents(ExtBusEventType.ACCOUNT_CHANGE,
+ ExtBusEventType.ENTITLEMENT_CREATION,
+ ExtBusEventType.ENTITLEMENT_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.SUBSCRIPTION_CREATION,
+ ExtBusEventType.INVOICE_CREATION);
final Bundle bundle = killBillClient.createSubscriptionWithAddOns(ImmutableList.<Subscription>of(base, addOn),
null,
DEFAULT_WAIT_COMPLETION_TIMEOUT_SEC,
requestOptions);
+ callbackServlet.assertListenerStatus();
final UUID addOnSubscriptionId = Iterables.<Subscription>find(bundle.getSubscriptions(),
new Predicate<Subscription>() {
@Override
@@ -95,6 +103,7 @@ public class TestUsage extends TestJaxrsBase {
usage.setUnitUsageRecords(ImmutableList.<UnitUsageRecord>of(unitUsageRecord));
killBillClient.createSubscriptionUsageRecord(usage, requestOptions);
+ callbackServlet.assertListenerStatus();
final RolledUpUsage retrievedUsage1 = killBillClient.getRolledUpUsage(addOnSubscriptionId, unitUsageRecord.getUnitType(), clock.getUTCToday().minusDays(1), clock.getUTCToday(), requestOptions);
Assert.assertEquals(retrievedUsage1.getSubscriptionId(), usage.getSubscriptionId());
@@ -121,9 +130,12 @@ public class TestUsage extends TestJaxrsBase {
Assert.assertEquals(retrievedUsage4.getRolledUpUnits().get(0).getUnitType(), "bullets");
Assert.assertEquals((long) retrievedUsage4.getRolledUpUnits().get(0).getAmount(), 5);
+ callbackServlet.pushExpectedEvents(ExtBusEventType.SUBSCRIPTION_PHASE,
+ ExtBusEventType.INVOICE_CREATION,
+ ExtBusEventType.INVOICE_PAYMENT_SUCCESS,
+ ExtBusEventType.PAYMENT_SUCCESS);
clock.addMonths(1);
- crappyWaitForLackOfProperSynchonization();
-
+ callbackServlet.assertListenerStatus();
final Invoices invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), true, false, false, false, AuditLevel.MINIMAL, requestOptions);
Assert.assertEquals(invoices.size(), 2);
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/server/security/TestKillbillJdbcTenantRealm.java b/profiles/killbill/src/test/java/org/killbill/billing/server/security/TestKillbillJdbcTenantRealm.java
index 292cd25..937c529 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/server/security/TestKillbillJdbcTenantRealm.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/server/security/TestKillbillJdbcTenantRealm.java
@@ -48,6 +48,10 @@ public class TestKillbillJdbcTenantRealm extends TestJaxrsBase {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
// Create the tenant
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/server/security/TestTenantFilter.java b/profiles/killbill/src/test/java/org/killbill/billing/server/security/TestTenantFilter.java
index fdc95ce..4e64cf8 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/server/security/TestTenantFilter.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/server/security/TestTenantFilter.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
* The Billing Project 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
@@ -32,6 +32,10 @@ public class TestTenantFilter extends TestJaxrsBase {
@AfterMethod(groups = "slow")
public void tearDown() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
// Default credentials
loginTenant(DEFAULT_API_KEY, DEFAULT_API_SECRET);
}
@@ -46,15 +50,10 @@ public class TestTenantFilter extends TestJaxrsBase {
} catch (final KillBillClientException e) {
Assert.assertEquals(e.getResponse().getStatusCode(), Status.UNAUTHORIZED.getStatusCode());
}
+ callbackServlet.assertListenerStatus();
// Create the tenant
- final String apiKeyTenant1 = "pierre";
- final String apiSecretTenant1 = "pierreIsFr3nch";
- loginTenant(apiKeyTenant1, apiSecretTenant1);
- final Tenant tenant1 = new Tenant();
- tenant1.setApiKey(apiKeyTenant1);
- tenant1.setApiSecret(apiSecretTenant1);
- killBillClient.createTenant(tenant1, createdBy, reason, comment);
+ final Tenant tenant1 = createTenant("pierre", "pierreIsFr3nch", true);
final Account account1 = createAccount();
Assert.assertEquals(killBillClient.getAccount(account1.getExternalKey()), account1);
@@ -62,13 +61,7 @@ public class TestTenantFilter extends TestJaxrsBase {
logoutTenant();
// Create another tenant
- final String apiKeyTenant2 = "stephane";
- final String apiSecretTenant2 = "stephane1sAlsoFr3nch";
- loginTenant(apiKeyTenant2, apiSecretTenant2);
- final Tenant tenant2 = new Tenant();
- tenant2.setApiKey(apiKeyTenant2);
- tenant2.setApiSecret(apiSecretTenant2);
- killBillClient.createTenant(tenant2, createdBy, reason, comment);
+ createTenant("stephane", "stephane1sAlsoFr3nch", true);
final Account account2 = createAccount();
Assert.assertEquals(killBillClient.getAccount(account2.getExternalKey()), account2);
@@ -77,7 +70,7 @@ public class TestTenantFilter extends TestJaxrsBase {
Assert.assertNull(killBillClient.getAccount(account1.getExternalKey()));
// Same for tenant1 and account2
- loginTenant(apiKeyTenant1, apiSecretTenant1);
+ loginTenant(tenant1.getApiKey(), tenant1.getApiSecret());
Assert.assertNull(killBillClient.getAccount(account2.getExternalKey()));
}
}
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java b/subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java
index 7b2ec78..6fe78b1 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java
@@ -50,6 +50,10 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
@Override
@BeforeClass(groups = "fast")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
planAligner = new PlanAligner();
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java b/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java
index 7f3dc38..88305a8 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java
@@ -57,6 +57,10 @@ public class TestTransfer extends SubscriptionTestSuiteWithEmbeddedDB {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
// Note: this will cleanup all tables
super.beforeMethod();
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java b/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java
index 5933ced..c3bb42a 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java
@@ -61,6 +61,10 @@ public class TestSubscriptionDao extends SubscriptionTestSuiteWithEmbeddedDB {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
// Note: this will cleanup all tables
super.beforeMethod();
diff --git a/util/src/main/java/org/killbill/billing/util/audit/dao/DefaultAuditDao.java b/util/src/main/java/org/killbill/billing/util/audit/dao/DefaultAuditDao.java
index b5e08a8..34d3d50 100644
--- a/util/src/main/java/org/killbill/billing/util/audit/dao/DefaultAuditDao.java
+++ b/util/src/main/java/org/killbill/billing/util/audit/dao/DefaultAuditDao.java
@@ -191,7 +191,7 @@ public class DefaultAuditDao implements AuditDao {
@Override
public List<AuditLogWithHistory> inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
final Long targetRecordId = dbRouter.onDemand(true).getRecordIdFromObject(objectId.toString(), tableName.getTableName());
- final List<EntityHistoryModelDao> objectHistory = transactional.getHistoryForTargetRecordId(targetRecordId, context);
+ final List<EntityHistoryModelDao> objectHistory = transactional.getHistoryForTargetRecordId(true, targetRecordId, context);
return ImmutableList.<AuditLogWithHistory>copyOf(Collections2.transform(entitySqlDaoWrapperFactory.become(EntitySqlDao.class).getAuditLogsViaHistoryForTargetRecordId(historyTableName.name(),
historyTableName.getTableName().toLowerCase(),
diff --git a/util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldUserApi.java b/util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldUserApi.java
index 45d033b..0a48837 100644
--- a/util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldUserApi.java
+++ b/util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldUserApi.java
@@ -22,8 +22,10 @@ import java.util.UUID;
import org.killbill.billing.ObjectType;
import org.killbill.billing.callcontext.InternalCallContext;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.CustomFieldApiException;
import org.killbill.billing.util.api.CustomFieldUserApi;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.callcontext.TenantContext;
@@ -149,6 +151,11 @@ public class DefaultCustomFieldUserApi implements CustomFieldUserApi {
return withCustomFieldsTransform(customFieldDao.getCustomFieldsForAccount(internalCallContextFactory.createInternalTenantContext(accountId, context)));
}
+ @Override
+ public List<AuditLogWithHistory> getCustomFieldAuditLogsWithHistoryForId(final UUID customFieldId, final AuditLevel auditLevel, final TenantContext tenantContext) {
+ return customFieldDao.getCustomFieldAuditLogsWithHistoryForId(customFieldId, auditLevel, internalCallContextFactory.createInternalTenantContext(customFieldId, ObjectType.CUSTOM_FIELD, tenantContext));
+ }
+
private List<CustomField> withCustomFieldsTransform(final Collection<CustomFieldModelDao> input) {
return ImmutableList.<CustomField>copyOf(Collections2.transform(input, CUSTOM_FIELD_MODEL_DAO_CUSTOM_FIELD_FUNCTION));
}
diff --git a/util/src/main/java/org/killbill/billing/util/customfield/dao/CustomFieldDao.java b/util/src/main/java/org/killbill/billing/util/customfield/dao/CustomFieldDao.java
index 6dea17a..313643e 100644
--- a/util/src/main/java/org/killbill/billing/util/customfield/dao/CustomFieldDao.java
+++ b/util/src/main/java/org/killbill/billing/util/customfield/dao/CustomFieldDao.java
@@ -22,7 +22,9 @@ import java.util.UUID;
import org.killbill.billing.ObjectType;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.CustomFieldApiException;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.customfield.CustomField;
import org.killbill.billing.util.entity.Pagination;
import org.killbill.billing.util.entity.dao.EntityDao;
@@ -40,4 +42,6 @@ public interface CustomFieldDao extends EntityDao<CustomFieldModelDao, CustomFie
void deleteCustomFields(Iterable<UUID> customFieldIds, InternalCallContext context) throws CustomFieldApiException;
void updateCustomFields(Iterable<CustomFieldModelDao> customFieldIds, InternalCallContext context) throws CustomFieldApiException;
+
+ List<AuditLogWithHistory> getCustomFieldAuditLogsWithHistoryForId(UUID customFieldId, AuditLevel auditLevel, InternalTenantContext context);
}
diff --git a/util/src/main/java/org/killbill/billing/util/customfield/dao/DefaultCustomFieldDao.java b/util/src/main/java/org/killbill/billing/util/customfield/dao/DefaultCustomFieldDao.java
index d541e9e..1677cc8 100644
--- a/util/src/main/java/org/killbill/billing/util/customfield/dao/DefaultCustomFieldDao.java
+++ b/util/src/main/java/org/killbill/billing/util/customfield/dao/DefaultCustomFieldDao.java
@@ -31,14 +31,18 @@ import org.killbill.billing.ObjectType;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.events.BusInternalEvent;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.CustomFieldApiException;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.audit.ChangeType;
+import org.killbill.billing.util.audit.dao.AuditDao;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.customfield.CustomField;
import org.killbill.billing.util.customfield.api.DefaultCustomFieldCreationEvent;
import org.killbill.billing.util.customfield.api.DefaultCustomFieldDeletionEvent;
import org.killbill.billing.util.dao.NonEntityDao;
+import org.killbill.billing.util.dao.TableName;
import org.killbill.billing.util.entity.Pagination;
import org.killbill.billing.util.entity.dao.DefaultPaginationSqlDaoHelper.Ordering;
import org.killbill.billing.util.entity.dao.DefaultPaginationSqlDaoHelper.PaginationIteratorBuilder;
@@ -47,6 +51,7 @@ import org.killbill.billing.util.entity.dao.EntitySqlDao;
import org.killbill.billing.util.entity.dao.EntitySqlDaoTransactionWrapper;
import org.killbill.billing.util.entity.dao.EntitySqlDaoTransactionalJdbiWrapper;
import org.killbill.billing.util.entity.dao.EntitySqlDaoWrapperFactory;
+import org.killbill.billing.util.tag.dao.TagSqlDao;
import org.killbill.bus.api.PersistentBus;
import org.killbill.clock.Clock;
import org.skife.jdbi.v2.IDBI;
@@ -66,12 +71,14 @@ public class DefaultCustomFieldDao extends EntityDaoBase<CustomFieldModelDao, Cu
private static final Logger log = LoggerFactory.getLogger(DefaultCustomFieldDao.class);
private final PersistentBus bus;
+ private final AuditDao auditDao;
@Inject
public DefaultCustomFieldDao(final IDBI dbi, @Named(MAIN_RO_IDBI_NAMED) final IDBI roDbi, final Clock clock, final CacheControllerDispatcher controllerDispatcher,
- final NonEntityDao nonEntityDao, final InternalCallContextFactory internalCallContextFactory, final PersistentBus bus) {
+ final NonEntityDao nonEntityDao, final InternalCallContextFactory internalCallContextFactory, final PersistentBus bus, final AuditDao auditDao) {
super(new EntitySqlDaoTransactionalJdbiWrapper(dbi, roDbi, clock, controllerDispatcher, nonEntityDao, internalCallContextFactory), CustomFieldSqlDao.class);
this.bus = bus;
+ this.auditDao = auditDao;
}
@Override
@@ -166,6 +173,17 @@ public class DefaultCustomFieldDao extends EntityDaoBase<CustomFieldModelDao, Cu
}
@Override
+ public List<AuditLogWithHistory> getCustomFieldAuditLogsWithHistoryForId(final UUID customFieldId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ return transactionalSqlDao.execute(true, new EntitySqlDaoTransactionWrapper<List<AuditLogWithHistory>>() {
+ @Override
+ public List<AuditLogWithHistory> inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) {
+ final CustomFieldSqlDao transactional = entitySqlDaoWrapperFactory.become(CustomFieldSqlDao.class);
+ return auditDao.getAuditLogsWithHistoryForId(transactional, TableName.CUSTOM_FIELD, customFieldId, auditLevel, context);
+ }
+ });
+ }
+
+ @Override
protected CustomFieldApiException generateAlreadyExistsException(final CustomFieldModelDao entity, final InternalCallContext context) {
return new CustomFieldApiException(ErrorCode.CUSTOM_FIELD_ALREADY_EXISTS, entity.getId());
}
diff --git a/util/src/main/java/org/killbill/billing/util/dao/HistorySqlDao.java b/util/src/main/java/org/killbill/billing/util/dao/HistorySqlDao.java
index 23c763e..8bd523d 100644
--- a/util/src/main/java/org/killbill/billing/util/dao/HistorySqlDao.java
+++ b/util/src/main/java/org/killbill/billing/util/dao/HistorySqlDao.java
@@ -29,11 +29,15 @@ import org.killbill.commons.jdbi.binder.SmartBindBean;
import org.skife.jdbi.v2.sqlobject.GetGeneratedKeys;
import org.skife.jdbi.v2.sqlobject.SqlQuery;
import org.skife.jdbi.v2.sqlobject.SqlUpdate;
+import org.skife.jdbi.v2.sqlobject.customizers.Define;
public interface HistorySqlDao<M extends EntityModelDao<E>, E extends Entity> {
+ // bypassMappingRegistryCache is to be used in the mapping registry to bypass cache. This is useful for generic classes since it will prevent to return previously cached class, that could result in wrong maps.
+ // https://github.com/killbill/killbill-commons/blob/work-for-release-0.19.x/jdbi/src/main/java/org/skife/jdbi/v2/MappingRegistry.java#L67
@SqlQuery
- public List<EntityHistoryModelDao<M, E>> getHistoryForTargetRecordId(@Bind("targetRecordId") final long targetRecordId,
+ public List<EntityHistoryModelDao<M, E>> getHistoryForTargetRecordId(@Define("bypassMappingRegistryCache") final boolean bypassMappingRegistryCache,
+ @Bind("targetRecordId") final long targetRecordId,
@SmartBindBean InternalTenantContext context);
@SqlUpdate
@GetGeneratedKeys
diff --git a/util/src/main/java/org/killbill/billing/util/entity/dao/EntityDao.java b/util/src/main/java/org/killbill/billing/util/entity/dao/EntityDao.java
index 953f1fc..775c6ba 100644
--- a/util/src/main/java/org/killbill/billing/util/entity/dao/EntityDao.java
+++ b/util/src/main/java/org/killbill/billing/util/entity/dao/EntityDao.java
@@ -32,7 +32,7 @@ public interface EntityDao<M extends EntityModelDao<E>, E extends Entity, U exte
public M getByRecordId(Long recordId, InternalTenantContext context);
- public M getById(UUID id, InternalTenantContext context);
+ public M getById(UUID id, InternalTenantContext context) throws U;
public Pagination<M> getAll(InternalTenantContext context);
diff --git a/util/src/main/java/org/killbill/billing/util/entity/dao/EntityDaoBase.java b/util/src/main/java/org/killbill/billing/util/entity/dao/EntityDaoBase.java
index 17040e4..a4684b3 100644
--- a/util/src/main/java/org/killbill/billing/util/entity/dao/EntityDaoBase.java
+++ b/util/src/main/java/org/killbill/billing/util/entity/dao/EntityDaoBase.java
@@ -157,7 +157,7 @@ public abstract class EntityDaoBase<M extends EntityModelDao<E>, E extends Entit
}
@Override
- public M getById(final UUID id, final InternalTenantContext context) {
+ public M getById(final UUID id, final InternalTenantContext context) throws U /* Does not throw anything, but allows class overriding this method to throw */{
return transactionalSqlDao.execute(true, new EntitySqlDaoTransactionWrapper<M>() {
@Override
diff --git a/util/src/main/java/org/killbill/billing/util/export/dao/DatabaseExportDao.java b/util/src/main/java/org/killbill/billing/util/export/dao/DatabaseExportDao.java
index 0f99263..05bea16 100644
--- a/util/src/main/java/org/killbill/billing/util/export/dao/DatabaseExportDao.java
+++ b/util/src/main/java/org/killbill/billing/util/export/dao/DatabaseExportDao.java
@@ -16,6 +16,7 @@
package org.killbill.billing.util.export.dao;
+import java.io.IOException;
import java.sql.Blob;
import java.util.ArrayList;
import java.util.List;
@@ -34,10 +35,14 @@ import org.skife.jdbi.v2.Handle;
import org.skife.jdbi.v2.IDBI;
import org.skife.jdbi.v2.ResultIterator;
import org.skife.jdbi.v2.tweak.HandleCallback;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
@Singleton
public class DatabaseExportDao {
+ private static final Logger logger = LoggerFactory.getLogger(DatabaseExportDao.class);
+
private final DatabaseSchemaDao databaseSchemaDao;
private final IDBI dbi;
@@ -172,7 +177,12 @@ public class DatabaseExportDao {
}
}
- out.write(row);
+ try {
+ out.write(row);
+ } catch (final IOException e) {
+ logger.warn("Unable to write row: {}", row, e);
+ throw e;
+ }
}
} finally {
iterator.close();
diff --git a/util/src/main/java/org/killbill/billing/util/tag/api/DefaultTagUserApi.java b/util/src/main/java/org/killbill/billing/util/tag/api/DefaultTagUserApi.java
index eb81b50..920c958 100644
--- a/util/src/main/java/org/killbill/billing/util/tag/api/DefaultTagUserApi.java
+++ b/util/src/main/java/org/killbill/billing/util/tag/api/DefaultTagUserApi.java
@@ -24,9 +24,11 @@ import java.util.UUID;
import org.killbill.billing.ErrorCode;
import org.killbill.billing.ObjectType;
import org.killbill.billing.callcontext.InternalCallContext;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.TagApiException;
import org.killbill.billing.util.api.TagDefinitionApiException;
import org.killbill.billing.util.api.TagUserApi;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.callcontext.TenantContext;
@@ -207,6 +209,16 @@ public class DefaultTagUserApi implements TagUserApi {
return withModelTransform(tagDao.getTagsForAccount(includedDeleted, internalCallContextFactory.createInternalTenantContext(accountId, context)));
}
+ @Override
+ public List<AuditLogWithHistory> getTagAuditLogsWithHistoryForId(final UUID tagId, final AuditLevel auditLevel, final TenantContext tenantContext) {
+ return tagDao.getTagAuditLogsWithHistoryForId(tagId, auditLevel, internalCallContextFactory.createInternalTenantContext(tagId, ObjectType.TAG, tenantContext));
+ }
+
+ @Override
+ public List<AuditLogWithHistory> getTagDefinitionAuditLogsWithHistoryForId(final UUID tagDefinitionId, final AuditLevel auditLevel, final TenantContext tenantContext) {
+ return tagDefinitionDao.getTagDefinitionAuditLogsWithHistoryForId(tagDefinitionId, auditLevel, internalCallContextFactory.createInternalTenantContext(tagDefinitionId, ObjectType.TAG_DEFINITION, tenantContext));
+ }
+
private List<Tag> withModelTransform(final Collection<TagModelDao> input) {
return ImmutableList.<Tag>copyOf(Collections2.transform(input, TAG_MODEL_DAO_TAG_FUNCTION));
}
diff --git a/util/src/main/java/org/killbill/billing/util/tag/dao/DefaultTagDao.java b/util/src/main/java/org/killbill/billing/util/tag/dao/DefaultTagDao.java
index a2398a1..7c7298c 100644
--- a/util/src/main/java/org/killbill/billing/util/tag/dao/DefaultTagDao.java
+++ b/util/src/main/java/org/killbill/billing/util/tag/dao/DefaultTagDao.java
@@ -30,11 +30,15 @@ import org.killbill.billing.ObjectType;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.events.TagInternalEvent;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.TagApiException;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.audit.ChangeType;
+import org.killbill.billing.util.audit.dao.AuditDao;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.dao.NonEntityDao;
+import org.killbill.billing.util.dao.TableName;
import org.killbill.billing.util.entity.Pagination;
import org.killbill.billing.util.entity.dao.DefaultPaginationSqlDaoHelper.Ordering;
import org.killbill.billing.util.entity.dao.DefaultPaginationSqlDaoHelper.PaginationIteratorBuilder;
@@ -66,13 +70,15 @@ public class DefaultTagDao extends EntityDaoBase<TagModelDao, Tag, TagApiExcepti
private final TagEventBuilder tagEventBuilder;
private final PersistentBus bus;
+ private final AuditDao auditDao;
@Inject
public DefaultTagDao(final IDBI dbi, @Named(MAIN_RO_IDBI_NAMED) final IDBI roDbi, final TagEventBuilder tagEventBuilder, final PersistentBus bus, final Clock clock,
- final CacheControllerDispatcher controllerDispatcher, final NonEntityDao nonEntityDao, final InternalCallContextFactory internalCallContextFactory) {
+ final CacheControllerDispatcher controllerDispatcher, final NonEntityDao nonEntityDao, final InternalCallContextFactory internalCallContextFactory, final AuditDao auditDao) {
super(new EntitySqlDaoTransactionalJdbiWrapper(dbi, roDbi, clock, controllerDispatcher, nonEntityDao, internalCallContextFactory), TagSqlDao.class);
this.tagEventBuilder = tagEventBuilder;
this.bus = bus;
+ this.auditDao = auditDao;
}
@Override
@@ -117,6 +123,17 @@ public class DefaultTagDao extends EntityDaoBase<TagModelDao, Tag, TagApiExcepti
}
@Override
+ public List<AuditLogWithHistory> getTagAuditLogsWithHistoryForId(final UUID tagId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ return transactionalSqlDao.execute(true, new EntitySqlDaoTransactionWrapper<List<AuditLogWithHistory>>() {
+ @Override
+ public List<AuditLogWithHistory> inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) {
+ final TagSqlDao transactional = entitySqlDaoWrapperFactory.become(TagSqlDao.class);
+ return auditDao.getAuditLogsWithHistoryForId(transactional, TableName.TAG, tagId, auditLevel, context);
+ }
+ });
+ }
+
+ @Override
protected void postBusEventFromTransaction(final TagModelDao tag, final TagModelDao savedTag, final ChangeType changeType,
final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory, final InternalCallContext context)
throws BillingExceptionBase {
diff --git a/util/src/main/java/org/killbill/billing/util/tag/dao/DefaultTagDefinitionDao.java b/util/src/main/java/org/killbill/billing/util/tag/dao/DefaultTagDefinitionDao.java
index 6a42f6f..ce6fd4e 100644
--- a/util/src/main/java/org/killbill/billing/util/tag/dao/DefaultTagDefinitionDao.java
+++ b/util/src/main/java/org/killbill/billing/util/tag/dao/DefaultTagDefinitionDao.java
@@ -31,11 +31,15 @@ import org.killbill.billing.ErrorCode;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.events.TagDefinitionInternalEvent;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.TagDefinitionApiException;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.audit.ChangeType;
+import org.killbill.billing.util.audit.dao.AuditDao;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.dao.NonEntityDao;
+import org.killbill.billing.util.dao.TableName;
import org.killbill.billing.util.entity.dao.EntityDaoBase;
import org.killbill.billing.util.entity.dao.EntitySqlDaoTransactionWrapper;
import org.killbill.billing.util.entity.dao.EntitySqlDaoTransactionalJdbiWrapper;
@@ -62,13 +66,15 @@ public class DefaultTagDefinitionDao extends EntityDaoBase<TagDefinitionModelDao
private final TagEventBuilder tagEventBuilder;
private final PersistentBus bus;
+ private final AuditDao auditDao;
@Inject
public DefaultTagDefinitionDao(final IDBI dbi, @Named(MAIN_RO_IDBI_NAMED) final IDBI roDbi, final TagEventBuilder tagEventBuilder, final PersistentBus bus, final Clock clock,
- final CacheControllerDispatcher controllerDispatcher, final NonEntityDao nonEntityDao, final InternalCallContextFactory internalCallContextFactory) {
+ final CacheControllerDispatcher controllerDispatcher, final NonEntityDao nonEntityDao, final InternalCallContextFactory internalCallContextFactory, final AuditDao auditDao) {
super(new EntitySqlDaoTransactionalJdbiWrapper(dbi, roDbi, clock, controllerDispatcher, nonEntityDao, internalCallContextFactory), TagDefinitionSqlDao.class);
this.tagEventBuilder = tagEventBuilder;
this.bus = bus;
+ this.auditDao = auditDao;
}
@Override
@@ -90,24 +96,28 @@ public class DefaultTagDefinitionDao extends EntityDaoBase<TagDefinitionModelDao
}
@Override
- public TagDefinitionModelDao getByName(final String definitionName, final InternalTenantContext context) {
- return transactionalSqlDao.execute(true, new EntitySqlDaoTransactionWrapper<TagDefinitionModelDao>() {
+ public TagDefinitionModelDao getByName(final String definitionName, final InternalTenantContext context) throws TagDefinitionApiException {
+ return transactionalSqlDao.execute(true, TagDefinitionApiException.class, new EntitySqlDaoTransactionWrapper<TagDefinitionModelDao>() {
@Override
public TagDefinitionModelDao inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
- final TagDefinitionModelDao tagDefinitionModelDao = SystemTags.lookup(definitionName);
- return tagDefinitionModelDao != null ? tagDefinitionModelDao : entitySqlDaoWrapperFactory.become(TagDefinitionSqlDao.class).getByName(definitionName, context);
+ final TagDefinitionModelDao systemTag = SystemTags.lookup(definitionName);
+ final TagDefinitionModelDao tag = systemTag != null ? systemTag : entitySqlDaoWrapperFactory.become(TagDefinitionSqlDao.class).getByName(definitionName, context);
+ if (tag == null) {
+ throw new TagDefinitionApiException(ErrorCode.TAG_DEFINITION_DOES_NOT_EXIST, definitionName);
+ }
+ return tag;
}
});
}
@Override
- public TagDefinitionModelDao getById(final UUID definitionId, final InternalTenantContext context) {
- return transactionalSqlDao.execute(true, new EntitySqlDaoTransactionWrapper<TagDefinitionModelDao>() {
+ public TagDefinitionModelDao getById(final UUID definitionId, final InternalTenantContext context) throws TagDefinitionApiException {
+ return transactionalSqlDao.execute(true, TagDefinitionApiException.class, new EntitySqlDaoTransactionWrapper<TagDefinitionModelDao>() {
@Override
public TagDefinitionModelDao inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
final TagDefinitionModelDao systemTag = SystemTags.lookup(definitionId);
final TagDefinitionModelDao tag = systemTag != null ? systemTag : entitySqlDaoWrapperFactory.become(TagDefinitionSqlDao.class).getById(definitionId.toString(), context);
- if(tag == null) {
+ if (tag == null) {
throw new TagDefinitionApiException(ErrorCode.TAG_DEFINITION_DOES_NOT_EXIST, definitionId);
}
return tag;
@@ -228,6 +238,17 @@ public class DefaultTagDefinitionDao extends EntityDaoBase<TagDefinitionModelDao
}
}
+ @Override
+ public List<AuditLogWithHistory> getTagDefinitionAuditLogsWithHistoryForId(final UUID tagDefinitionId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ return transactionalSqlDao.execute(true, new EntitySqlDaoTransactionWrapper<List<AuditLogWithHistory>>() {
+ @Override
+ public List<AuditLogWithHistory> inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) {
+ final TagDefinitionSqlDao transactional = entitySqlDaoWrapperFactory.become(TagDefinitionSqlDao.class);
+ return auditDao.getAuditLogsWithHistoryForId(transactional, TableName.TAG_DEFINITIONS, tagDefinitionId, auditLevel, context);
+ }
+ });
+ }
+
protected void postBusEventFromTransaction(final TagDefinitionModelDao tagDefinition, final TagDefinitionModelDao savedTagDefinition,
final ChangeType changeType, final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory, final InternalCallContext context)
throws BillingExceptionBase {
diff --git a/util/src/main/java/org/killbill/billing/util/tag/dao/TagDao.java b/util/src/main/java/org/killbill/billing/util/tag/dao/TagDao.java
index 5dd9135..d09f069 100644
--- a/util/src/main/java/org/killbill/billing/util/tag/dao/TagDao.java
+++ b/util/src/main/java/org/killbill/billing/util/tag/dao/TagDao.java
@@ -22,7 +22,9 @@ import java.util.UUID;
import org.killbill.billing.ObjectType;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.TagApiException;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.entity.Pagination;
import org.killbill.billing.util.entity.dao.EntityDao;
import org.killbill.billing.util.tag.Tag;
@@ -38,4 +40,7 @@ public interface TagDao extends EntityDao<TagModelDao, Tag, TagApiException> {
List<TagModelDao> getTagsForAccountType(ObjectType objectType, boolean includedDeleted, InternalTenantContext internalTenantContext);
List<TagModelDao> getTagsForAccount(boolean includedDeleted, InternalTenantContext internalTenantContext);
+
+ List<AuditLogWithHistory> getTagAuditLogsWithHistoryForId(UUID tagId, AuditLevel auditLevel, InternalTenantContext context);
+
}
diff --git a/util/src/main/java/org/killbill/billing/util/tag/dao/TagDefinitionDao.java b/util/src/main/java/org/killbill/billing/util/tag/dao/TagDefinitionDao.java
index e409c89..ba71d89 100644
--- a/util/src/main/java/org/killbill/billing/util/tag/dao/TagDefinitionDao.java
+++ b/util/src/main/java/org/killbill/billing/util/tag/dao/TagDefinitionDao.java
@@ -22,7 +22,9 @@ import java.util.UUID;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.TagDefinitionApiException;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.entity.dao.EntityDao;
import org.killbill.billing.util.tag.TagDefinition;
@@ -30,11 +32,13 @@ public interface TagDefinitionDao extends EntityDao<TagDefinitionModelDao, TagDe
public List<TagDefinitionModelDao> getTagDefinitions(boolean includeSystemTags, InternalTenantContext context);
- public TagDefinitionModelDao getByName(String definitionName, InternalTenantContext context);
+ public TagDefinitionModelDao getByName(String definitionName, InternalTenantContext context) throws TagDefinitionApiException;
public List<TagDefinitionModelDao> getByIds(Collection<UUID> definitionIds, InternalTenantContext context);
public TagDefinitionModelDao create(String definitionName, String description, String tagDefinitionObjectTypes, InternalCallContext context) throws TagDefinitionApiException;
public void deleteById(UUID definitionId, InternalCallContext context) throws TagDefinitionApiException;
+
+ List<AuditLogWithHistory> getTagDefinitionAuditLogsWithHistoryForId(UUID tagDefinitionId, AuditLevel auditLevel, InternalTenantContext context);
}
diff --git a/util/src/test/java/org/killbill/billing/api/TestApiListener.java b/util/src/test/java/org/killbill/billing/api/TestApiListener.java
index d730885..83cb4c2 100644
--- a/util/src/test/java/org/killbill/billing/api/TestApiListener.java
+++ b/util/src/test/java/org/killbill/billing/api/TestApiListener.java
@@ -294,7 +294,7 @@ public class TestApiListener {
}
}
- public boolean isCompleted(final long timeout) {
+ private boolean isCompleted(final long timeout) {
synchronized (this) {
long waitTimeMs = timeout;
do {
diff --git a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
index 135f7aa..e5ef206 100644
--- a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
+++ b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
@@ -27,6 +27,7 @@ import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.killbill.billing.api.AbortAfterFirstFailureListener;
import org.killbill.billing.api.FlakyInvokedMethodListener;
+import org.killbill.billing.api.FlakyRetryAnalyzer;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.callcontext.MutableCallContext;
import org.killbill.billing.callcontext.MutableInternalCallContext;
@@ -42,7 +43,6 @@ import org.mockito.stubbing.Answer;
import org.skife.config.ConfigSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.testng.Assert;
import org.testng.IHookCallBack;
import org.testng.IHookable;
import org.testng.ITestResult;
@@ -149,7 +149,7 @@ public class GuicyKillbillTestSuite implements IHookable {
@BeforeMethod(alwaysRun = true)
public void beforeMethodAlwaysRun(final Method method) throws Exception {
- if (AbortAfterFirstFailureListener.hasFailures()) {
+ if (hasFailed()) {
return;
}
@@ -198,7 +198,7 @@ public class GuicyKillbillTestSuite implements IHookable {
@AfterMethod(alwaysRun = true)
public void afterMethodAlwaysRun(final Method method, final ITestResult result) throws Exception {
- if (AbortAfterFirstFailureListener.hasFailures()) {
+ if (hasFailed()) {
return;
}
@@ -233,7 +233,11 @@ public class GuicyKillbillTestSuite implements IHookable {
(result.getEndMillis() - result.getStartMillis()) / 1000});
log.info("***************************************************************************************************");
if (!hasFailed && !result.isSuccess()) {
- hasFailed = true;
+ // Ignore if the current test method is flaky
+ final boolean isFlakyTest = result.getMethod().getRetryAnalyzer() != null && result.getMethod().getRetryAnalyzer() instanceof FlakyRetryAnalyzer;
+ if (!isFlakyTest) {
+ hasFailed = true;
+ }
}
}
diff --git a/util/src/test/java/org/killbill/billing/KillbillTestSuite.java b/util/src/test/java/org/killbill/billing/KillbillTestSuite.java
index 7b4bdf7..8591c1f 100644
--- a/util/src/test/java/org/killbill/billing/KillbillTestSuite.java
+++ b/util/src/test/java/org/killbill/billing/KillbillTestSuite.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
* The Billing Project 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
@@ -20,6 +20,7 @@ package org.killbill.billing;
import java.lang.reflect.Method;
+import org.killbill.billing.api.AbortAfterFirstFailureListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.ITestResult;
@@ -35,6 +36,10 @@ public class KillbillTestSuite {
@BeforeMethod(alwaysRun = true)
public void startTestSuite(final Method method) throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
log.info("***************************************************************************************************");
log.info("*** Starting test {}:{}", method.getDeclaringClass().getName(), method.getName());
log.info("***************************************************************************************************");
@@ -42,6 +47,10 @@ public class KillbillTestSuite {
@AfterMethod(alwaysRun = true)
public void endTestSuite(final Method method, final ITestResult result) throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
log.info("***************************************************************************************************");
log.info("*** Ending test {}:{} {} ({} s.)", new Object[]{method.getDeclaringClass().getName(), method.getName(),
result.isSuccess() ? "SUCCESS" : "!!! FAILURE !!!",
@@ -53,6 +62,6 @@ public class KillbillTestSuite {
}
public boolean hasFailed() {
- return hasFailed;
+ return hasFailed || AbortAfterFirstFailureListener.hasFailures();
}
}
diff --git a/util/src/test/java/org/killbill/billing/mock/api/MockAccountUserApi.java b/util/src/test/java/org/killbill/billing/mock/api/MockAccountUserApi.java
index cbbf33a..3773ee1 100644
--- a/util/src/test/java/org/killbill/billing/mock/api/MockAccountUserApi.java
+++ b/util/src/test/java/org/killbill/billing/mock/api/MockAccountUserApi.java
@@ -191,7 +191,12 @@ public class MockAccountUserApi implements AccountUserApi {
}
@Override
- public List<AuditLogWithHistory> getAuditLogsWithHistoryForId(final UUID uuid, final AuditLevel auditLevel, final TenantContext tenantContext) throws AccountApiException {
+ public List<AuditLogWithHistory> getAuditLogsWithHistoryForId(final UUID accountId, final AuditLevel auditLevel, final TenantContext tenantContext) throws AccountApiException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<AuditLogWithHistory> getEmailAuditLogsWithHistoryForId(final UUID accountEmailId, final AuditLevel auditLevel, final TenantContext tenantContext) throws AccountApiException {
throw new UnsupportedOperationException();
}
}
diff --git a/util/src/test/java/org/killbill/billing/util/broadcast/TestBroadcastService.java b/util/src/test/java/org/killbill/billing/util/broadcast/TestBroadcastService.java
index a52cd80..8bb02b2 100644
--- a/util/src/test/java/org/killbill/billing/util/broadcast/TestBroadcastService.java
+++ b/util/src/test/java/org/killbill/billing/util/broadcast/TestBroadcastService.java
@@ -41,6 +41,10 @@ public class TestBroadcastService extends UtilTestSuiteWithEmbeddedDB {
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
((DefaultBroadcastService) broadcastService).initialize();
((DefaultBroadcastService) broadcastService).start();
diff --git a/util/src/test/java/org/killbill/billing/util/customfield/api/TestDefaultCustomFieldUserApi.java b/util/src/test/java/org/killbill/billing/util/customfield/api/TestDefaultCustomFieldUserApi.java
index a2acf84..90f54ba 100644
--- a/util/src/test/java/org/killbill/billing/util/customfield/api/TestDefaultCustomFieldUserApi.java
+++ b/util/src/test/java/org/killbill/billing/util/customfield/api/TestDefaultCustomFieldUserApi.java
@@ -50,6 +50,10 @@ public class TestDefaultCustomFieldUserApi extends UtilTestSuiteWithEmbeddedDB {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
final ImmutableAccountData immutableAccountData = Mockito.mock(ImmutableAccountData.class);
diff --git a/util/src/test/java/org/killbill/billing/util/customfield/dao/MockCustomFieldDao.java b/util/src/test/java/org/killbill/billing/util/customfield/dao/MockCustomFieldDao.java
index ae80cd4..e3a782a 100644
--- a/util/src/test/java/org/killbill/billing/util/customfield/dao/MockCustomFieldDao.java
+++ b/util/src/test/java/org/killbill/billing/util/customfield/dao/MockCustomFieldDao.java
@@ -23,7 +23,9 @@ import java.util.UUID;
import org.killbill.billing.ObjectType;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.CustomFieldApiException;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.customfield.CustomField;
import org.killbill.billing.util.entity.Pagination;
import org.killbill.billing.util.entity.dao.MockEntityDaoBase;
@@ -63,6 +65,11 @@ public class MockCustomFieldDao extends MockEntityDaoBase<CustomFieldModelDao, C
}
@Override
+ public List<AuditLogWithHistory> getCustomFieldAuditLogsWithHistoryForId(final UUID customFieldId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public Pagination<CustomFieldModelDao> searchCustomFields(final String searchKey, final Long offset, final Long limit, final InternalTenantContext context) {
throw new UnsupportedOperationException();
}
diff --git a/util/src/test/java/org/killbill/billing/util/email/DefaultCatalogTranslationTest.java b/util/src/test/java/org/killbill/billing/util/email/DefaultCatalogTranslationTest.java
index 6af5d3e..3d7fc2d 100644
--- a/util/src/test/java/org/killbill/billing/util/email/DefaultCatalogTranslationTest.java
+++ b/util/src/test/java/org/killbill/billing/util/email/DefaultCatalogTranslationTest.java
@@ -39,12 +39,6 @@ import static org.testng.Assert.assertEquals;
public class DefaultCatalogTranslationTest extends UtilTestSuiteNoDB {
- @Override
- @BeforeClass(groups = "fast")
- public void beforeClass() throws Exception {
- super.beforeClass();
- }
-
private ResourceBundle getBundle(final Locale locale) throws IOException, URISyntaxException {
final String propertiesFileNameWithCountry = "org/killbill/billing/util/template/translation/CatalogTranslation" + "_" + locale.getLanguage() + "_" + locale.getCountry() + ".properties";
final InputStream inputStream = UriAccessor.accessUri(propertiesFileNameWithCountry);
diff --git a/util/src/test/java/org/killbill/billing/util/listener/TestRetryableService.java b/util/src/test/java/org/killbill/billing/util/listener/TestRetryableService.java
index e7e492d..eed7a14 100644
--- a/util/src/test/java/org/killbill/billing/util/listener/TestRetryableService.java
+++ b/util/src/test/java/org/killbill/billing/util/listener/TestRetryableService.java
@@ -61,6 +61,10 @@ public class TestRetryableService extends UtilTestSuiteWithEmbeddedDB {
@BeforeClass(groups = "slow")
public void setUpClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
final ImmutableAccountData immutableAccountData = Mockito.mock(ImmutableAccountData.class);
Mockito.when(immutableAccountInternalApi.getImmutableAccountDataByRecordId(Mockito.<Long>eq(internalCallContext.getAccountRecordId()), Mockito.<InternalTenantContext>any())).thenReturn(immutableAccountData);
}
diff --git a/util/src/test/java/org/killbill/billing/util/security/shiro/realm/TestKillBillJdbcRealm.java b/util/src/test/java/org/killbill/billing/util/security/shiro/realm/TestKillBillJdbcRealm.java
index ea70d42..167d3bd 100644
--- a/util/src/test/java/org/killbill/billing/util/security/shiro/realm/TestKillBillJdbcRealm.java
+++ b/util/src/test/java/org/killbill/billing/util/security/shiro/realm/TestKillBillJdbcRealm.java
@@ -50,6 +50,10 @@ public class TestKillBillJdbcRealm extends UtilTestSuiteWithEmbeddedDB {
@Override
@BeforeMethod(groups = "slow")
public void beforeMethod() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeMethod();
final KillBillJdbcRealm realm = new KillBillJdbcRealm(helper.getDataSource(), securityConfig);
securityManager = new DefaultSecurityManager(realm);
diff --git a/util/src/test/java/org/killbill/billing/util/tag/dao/MockTagDao.java b/util/src/test/java/org/killbill/billing/util/tag/dao/MockTagDao.java
index 636c76f..bfe0afe 100644
--- a/util/src/test/java/org/killbill/billing/util/tag/dao/MockTagDao.java
+++ b/util/src/test/java/org/killbill/billing/util/tag/dao/MockTagDao.java
@@ -26,7 +26,9 @@ import java.util.UUID;
import org.killbill.billing.ObjectType;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.TagApiException;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.entity.Pagination;
import org.killbill.billing.util.entity.dao.MockEntityDaoBase;
import org.killbill.billing.util.tag.Tag;
@@ -106,6 +108,11 @@ public class MockTagDao extends MockEntityDaoBase<TagModelDao, Tag, TagApiExcept
return tagStore.get(getAccountId(internalTenantContext.getAccountRecordId()));
}
+ @Override
+ public List<AuditLogWithHistory> getTagAuditLogsWithHistoryForId(final UUID tagId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ throw new UnsupportedOperationException();
+ }
+
public void clear() {
tagStore.clear();
}
diff --git a/util/src/test/java/org/killbill/billing/util/tag/dao/MockTagDefinitionDao.java b/util/src/test/java/org/killbill/billing/util/tag/dao/MockTagDefinitionDao.java
index 8ae3ab6..16c91db 100644
--- a/util/src/test/java/org/killbill/billing/util/tag/dao/MockTagDefinitionDao.java
+++ b/util/src/test/java/org/killbill/billing/util/tag/dao/MockTagDefinitionDao.java
@@ -25,7 +25,9 @@ import java.util.concurrent.ConcurrentHashMap;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.util.api.AuditLevel;
import org.killbill.billing.util.api.TagDefinitionApiException;
+import org.killbill.billing.util.audit.AuditLogWithHistory;
import org.killbill.billing.util.entity.dao.MockEntityDaoBase;
import org.killbill.billing.util.tag.TagDefinition;
@@ -60,6 +62,11 @@ public class MockTagDefinitionDao extends MockEntityDaoBase<TagDefinitionModelDa
}
@Override
+ public List<AuditLogWithHistory> getTagDefinitionAuditLogsWithHistoryForId(final UUID tagDefinitionId, final AuditLevel auditLevel, final InternalTenantContext context) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public List<TagDefinitionModelDao> getByIds(final Collection<UUID> definitionIds, final InternalTenantContext context) {
return null;
}
diff --git a/util/src/test/java/org/killbill/billing/util/tag/dao/TestDefaultTagDefinitionDao.java b/util/src/test/java/org/killbill/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
index 1e5d3cf..8abce3c 100644
--- a/util/src/test/java/org/killbill/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
+++ b/util/src/test/java/org/killbill/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
@@ -16,27 +16,25 @@
package org.killbill.billing.util.tag.dao;
-import java.io.ObjectOutput;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
+import org.killbill.billing.ErrorCode;
import org.killbill.billing.ObjectType;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import org.killbill.billing.api.TestApiListener;
import org.killbill.billing.api.TestApiListener.NextEvent;
-import org.killbill.billing.util.UtilTestSuiteWithEmbeddedDB;
import org.killbill.billing.events.BusInternalEvent;
import org.killbill.billing.events.TagDefinitionInternalEvent;
+import org.killbill.billing.util.UtilTestSuiteWithEmbeddedDB;
+import org.killbill.billing.util.api.TagDefinitionApiException;
+import org.testng.Assert;
+import org.testng.annotations.Test;
import com.google.common.eventbus.Subscribe;
public class TestDefaultTagDefinitionDao extends UtilTestSuiteWithEmbeddedDB {
+
@Test(groups = "slow")
public void testCatchEventsOnCreateAndDelete() throws Exception {
final String definitionName = UUID.randomUUID().toString().substring(0, 5);
@@ -70,7 +68,21 @@ public class TestDefaultTagDefinitionDao extends UtilTestSuiteWithEmbeddedDB {
assertListenerStatus();
// Make sure the tag definition is deleted
- Assert.assertNull(tagDefinitionDao.getByName(definitionName, internalCallContext));
+ try {
+ tagDefinitionDao.getByName(definitionName, internalCallContext);
+ Assert.fail("Retrieving tag definition should fail");
+ } catch (final TagDefinitionApiException e) {
+ Assert.assertEquals(e.getCode(), ErrorCode.TAG_DEFINITION_DOES_NOT_EXIST.getCode());
+ }
+
+ try {
+ tagDefinitionDao.getById(UUID.randomUUID(), internalCallContext);
+ Assert.fail("Retrieving random tag definition should fail");
+ } catch (final TagDefinitionApiException e) {
+ Assert.assertEquals(e.getCode(), ErrorCode.TAG_DEFINITION_DOES_NOT_EXIST.getCode());
+ }
+
+
/*
// Verify we caught an event on the bus
diff --git a/util/src/test/java/org/killbill/billing/util/tag/TestTagStore.java b/util/src/test/java/org/killbill/billing/util/tag/TestTagStore.java
index d9bd318..a21826f 100644
--- a/util/src/test/java/org/killbill/billing/util/tag/TestTagStore.java
+++ b/util/src/test/java/org/killbill/billing/util/tag/TestTagStore.java
@@ -19,6 +19,7 @@ package org.killbill.billing.util.tag;
import java.util.List;
import java.util.UUID;
+import org.testng.Assert;
import org.testng.annotations.Test;
import org.killbill.billing.ObjectType;
@@ -93,8 +94,11 @@ public class TestTagStore extends UtilTestSuiteWithEmbeddedDB {
tagDefinitionDao.deleteById(tagDefinition.getId(), internalCallContext);
assertListenerStatus();
- tagDefinition = tagDefinitionDao.getByName(definitionName, internalCallContext);
- assertNull(tagDefinition);
+ try {
+ tagDefinitionDao.getByName(definitionName, internalCallContext);
+ Assert.fail("Call should fail");
+ } catch (TagDefinitionApiException expected) {
+ }
}
@Test(groups = "slow", expectedExceptions = TagDefinitionApiException.class)
diff --git a/util/src/test/java/org/killbill/billing/util/validation/TestValidationManager.java b/util/src/test/java/org/killbill/billing/util/validation/TestValidationManager.java
index 1a9761a..06d8d2e 100644
--- a/util/src/test/java/org/killbill/billing/util/validation/TestValidationManager.java
+++ b/util/src/test/java/org/killbill/billing/util/validation/TestValidationManager.java
@@ -40,6 +40,10 @@ public class TestValidationManager extends UtilTestSuiteWithEmbeddedDB {
@Override
@BeforeClass(groups = "slow")
public void beforeClass() throws Exception {
+ if (hasFailed()) {
+ return;
+ }
+
super.beforeClass();
final DatabaseSchemaDao dao = new DatabaseSchemaDao(dbi, roDbi);
vm = new ValidationManager(dao);