killbill-memoizeit

Add change required fo tests

11/12/2011 2:47:22 PM

Changes

Details

diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java b/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
index 7717796..e208852 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
@@ -44,13 +44,13 @@ public class MockSubscription implements ISubscription
     }
 
     @Override
-    public void cancel()
+    public void cancel(DateTime requestedDate, boolean eot)
     {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public void changePlan(final String productName, final BillingPeriod term, final String planSet)
+    public void changePlan(final String productName, final BillingPeriod term, final String planSet, DateTime requestedDate)
     {
         throw new UnsupportedOperationException();
     }
diff --git a/api/src/main/java/com/ning/billing/config/IEntitlementConfig.java b/api/src/main/java/com/ning/billing/config/IEntitlementConfig.java
index 0cb228b..167e1e5 100644
--- a/api/src/main/java/com/ning/billing/config/IEntitlementConfig.java
+++ b/api/src/main/java/com/ning/billing/config/IEntitlementConfig.java
@@ -26,14 +26,14 @@ public interface IEntitlementConfig {
     public long getDaoClaimTimeMs();
 
     @Config("killbill.entitlement.dao.ready.max")
-    @Default("1")
+    @Default("10")
     public int getDaoMaxReadyEvents();
 
-    @Config("killbill.entitlement.catalog.config.file")
-    @Default("hum, not sure")
-    public String getCatalogConfigFileName();
-
     @Config("killbill.entitlement.engine.notifications.sleep")
     @Default("500")
     public long getNotificationSleepTimeMs();
+
+    @Config("killbill.entitlement.engine.events.off")
+    @Default("false")
+    public boolean isEventProcessingOff();
 }
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/IEntitlementService.java b/api/src/main/java/com/ning/billing/entitlement/api/IEntitlementService.java
index 41cd37d..ddcdf0c 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/IEntitlementService.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/IEntitlementService.java
@@ -19,6 +19,7 @@ package com.ning.billing.entitlement.api;
 import java.util.List;
 
 import com.ning.billing.entitlement.api.billing.IEntitlementBillingApi;
+import com.ning.billing.entitlement.api.test.IEntitlementTestApi;
 import com.ning.billing.entitlement.api.user.IApiListener;
 import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
 import com.ning.billing.lifecycle.IService;
@@ -33,4 +34,7 @@ public interface IEntitlementService extends IService {
 
     public IEntitlementBillingApi getBillingApi();
 
+    public IEntitlementTestApi getTestApi();
+
+
 }
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/test/IEntitlementTestApi.java b/api/src/main/java/com/ning/billing/entitlement/api/test/IEntitlementTestApi.java
new file mode 100644
index 0000000..fbaa68e
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/entitlement/api/test/IEntitlementTestApi.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.entitlement.api.test;
+
+public interface IEntitlementTestApi {
+
+    public void doProcessReadyEvents();
+
+}
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/IEntitlementUserApi.java b/api/src/main/java/com/ning/billing/entitlement/api/user/IEntitlementUserApi.java
index fb21eea..c3f79dc 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/user/IEntitlementUserApi.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/IEntitlementUserApi.java
@@ -19,6 +19,8 @@ package com.ning.billing.entitlement.api.user;
 import java.util.List;
 import java.util.UUID;
 
+import org.joda.time.DateTime;
+
 import com.ning.billing.account.api.IAccount;
 import com.ning.billing.catalog.api.BillingPeriod;
 
@@ -38,6 +40,6 @@ public interface IEntitlementUserApi {
     public ISubscriptionBundle createBundleForAccount(IAccount account, String bundleKey)
         throws EntitlementUserApiException;
 
-    public ISubscription createSubscription(UUID bundleId, String productName, BillingPeriod term, String planSet)
+    public ISubscription createSubscription(UUID bundleId, String productName, BillingPeriod term, String planSet, DateTime requestedDate)
         throws EntitlementUserApiException;
 }
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/ISubscription.java b/api/src/main/java/com/ning/billing/entitlement/api/user/ISubscription.java
index 4795655..574de30 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/user/ISubscription.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/ISubscription.java
@@ -29,13 +29,13 @@ import com.ning.billing.catalog.api.ActionPolicy;
 
 public interface ISubscription extends IPrivateFields {
 
-    public void cancel()
+    public void cancel(DateTime requestedDate, boolean eot)
     throws EntitlementUserApiException;
 
     public void uncancel()
     throws EntitlementUserApiException;
 
-    public void changePlan(String productName, BillingPeriod term, String planSet)
+    public void changePlan(String productName, BillingPeriod term, String planSet, DateTime requestedDate)
         throws EntitlementUserApiException ;
 
     public void pause()
diff --git a/api/src/main/java/com/ning/billing/ErrorCode.java b/api/src/main/java/com/ning/billing/ErrorCode.java
index d89ff97..24ee8c7 100644
--- a/api/src/main/java/com/ning/billing/ErrorCode.java
+++ b/api/src/main/java/com/ning/billing/ErrorCode.java
@@ -28,7 +28,8 @@ public enum ErrorCode {
      * Range 1000 : ENTITLEMENTS
      *
      */
-    /* Not yet */
+    /* Generic through APIs */
+    ENT_INVALID_REQUESTED_DATE(1001, "Requested in the future is not allowed : %s"),
 
     /* Creation */
     ENT_CREATE_BAD_CATALOG(1011, "Plan for product %s, term %s and set %s does not exist in the catalog"),
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/test/EntitlementTestApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/test/EntitlementTestApi.java
new file mode 100644
index 0000000..8ba459e
--- /dev/null
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/test/EntitlementTestApi.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.entitlement.api.test;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.ning.billing.config.IEntitlementConfig;
+import com.ning.billing.entitlement.engine.core.IApiEventProcessor;
+
+public class EntitlementTestApi implements IEntitlementTestApi {
+
+    private final static Logger log = LoggerFactory.getLogger(EntitlementTestApi.class);
+
+    private final IApiEventProcessor apiEventProcessor;
+    private final IEntitlementConfig config;
+
+    public EntitlementTestApi(IApiEventProcessor apiEventProcessor, IEntitlementConfig config) {
+        this.apiEventProcessor = apiEventProcessor;
+        this.config = config;
+    }
+
+    @Override
+    public void doProcessReadyEvents() {
+        if (config.isEventProcessingOff()) {
+            log.warn("Running event processing loop");
+            apiEventProcessor.processAllReadyEvents();
+        }
+    }
+}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/EntitlementUserApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/EntitlementUserApi.java
index 8561ce0..e46bc69 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/EntitlementUserApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/EntitlementUserApi.java
@@ -103,12 +103,17 @@ public class EntitlementUserApi implements IEntitlementUserApi {
 
     @Override
     public ISubscription createSubscription(UUID bundleId, String productName,
-            BillingPeriod term, String priceList) throws EntitlementUserApiException {
+            BillingPeriod term, String priceList, DateTime requestedDate) throws EntitlementUserApiException {
 
         // STEPH Should really get 'standard' from catalog
         String realPriceList = (priceList == null) ? "standard" : priceList;
 
         DateTime now = clock.getUTCNow();
+        if (requestedDate != null && requestedDate.isAfter(now)) {
+            throw new EntitlementUserApiException(ErrorCode.ENT_INVALID_REQUESTED_DATE, requestedDate.toString());
+        }
+
+        requestedDate = (requestedDate == null) ? now : requestedDate;
 
         IPlan plan = catalog.getPlan(productName, term, realPriceList);
         if (plan == null) {
@@ -135,7 +140,7 @@ public class EntitlementUserApi implements IEntitlementUserApi {
             if (baseSubscription != null) {
                 throw new EntitlementUserApiException(ErrorCode.ENT_CREATE_BP_EXISTS, bundleId);
             }
-            bundleStartDate = now;
+            bundleStartDate = requestedDate;
             break;
         case ADD_ON:
             if (baseSubscription == null) {
@@ -148,14 +153,14 @@ public class EntitlementUserApi implements IEntitlementUserApi {
                      plan.getProduct().getCategory().toString()));
         }
 
-        DateTime effectiveDate = now;
-
+        DateTime effectiveDate = requestedDate;
         Subscription subscription = new Subscription(bundleId, plan.getProduct().getCategory(), bundleStartDate, effectiveDate);
 
         TimedPhase currentTimedPhase =  planAligner.getCurrentTimedPhaseOnCreate(subscription, plan, realPriceList, effectiveDate);
         ApiEventCreate creationEvent =
             new ApiEventCreate(subscription.getId(), bundleStartDate, now, plan.getName(), currentTimedPhase.getPhase().getName(), realPriceList,
-                    now, effectiveDate, subscription.getActiveVersion());
+                    requestedDate, effectiveDate, subscription.getActiveVersion());
+
 
         TimedPhase nextTimedPhase =  planAligner.getNextTimedPhaseOnCreate(subscription, plan, realPriceList, effectiveDate);
         IPhaseEvent nextPhaseEvent = PhaseEvent.getNextPhaseEvent(nextTimedPhase, subscription, now);
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
index a5cd11e..2c04998 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
@@ -206,7 +206,7 @@ public class Subscription extends PrivateFields  implements ISubscription {
 
 
     @Override
-    public void cancel() throws EntitlementUserApiException  {
+    public void cancel(DateTime requestedDate, boolean eot) throws EntitlementUserApiException  {
 
         SubscriptionState currentState = getState();
         if (currentState != SubscriptionState.ACTIVE) {
@@ -214,6 +214,9 @@ public class Subscription extends PrivateFields  implements ISubscription {
         }
 
         DateTime now = clock.getUTCNow();
+        if (requestedDate != null && requestedDate.isAfter(now)) {
+            throw new EntitlementUserApiException(ErrorCode.ENT_INVALID_REQUESTED_DATE, requestedDate.toString());
+        }
 
         IPlan currentPlan = getCurrentPlan();
         PlanPhaseSpecifier planPhase = new PlanPhaseSpecifier(currentPlan.getProduct().getName(),
@@ -251,7 +254,7 @@ public class Subscription extends PrivateFields  implements ISubscription {
 
     @Override
     public void changePlan(String productName, BillingPeriod term,
-            String priceList) throws EntitlementUserApiException {
+            String priceList, DateTime requestedDate) throws EntitlementUserApiException {
 
         String currentPriceList = getCurrentPriceList();
         String realPriceList = (priceList == null) ? currentPriceList : priceList;
@@ -399,22 +402,6 @@ public class Subscription extends PrivateFields  implements ISubscription {
         return false;
     }
 
-    // STEPH do we need that? forgot?
-    private boolean isSubscriptionFutureChanged() {
-        if (transitions == null) {
-            return false;
-        }
-
-        for (SubscriptionTransition cur : transitions) {
-            if (cur.getEffectiveTransitionTime().isBefore(clock.getUTCNow()) ||
-                    cur.getEventType() == EventType.PHASE ||
-                    cur.getApiEventType() != ApiEventType.CHANGE) {
-                continue;
-            }
-            return true;
-        }
-        return false;
-    }
 
     private DateTime getPlanChangeEffectiveDate(ActionPolicy policy, DateTime now) {
 
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/ApiEventProcessor.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/ApiEventProcessor.java
index 9389969..541de37 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/ApiEventProcessor.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/ApiEventProcessor.java
@@ -33,11 +33,11 @@ public class ApiEventProcessor extends ApiEventProcessorBase {
 
 
     @Override
-    protected void doProcessEvents(int sequenceId) {
+    protected boolean doProcessEvents(int sequenceId) {
         long prev = nbProcessedEvents;
         List<IEvent> claimedEvents = dao.getEventsReady(apiProcessorId, sequenceId);
         if (claimedEvents.size() == 0) {
-            return;
+            return false;
         }
         log.debug(String.format("ApiEventProcessor got %d events", claimedEvents.size()));
 
@@ -51,6 +51,7 @@ public class ApiEventProcessor extends ApiEventProcessorBase {
         dao.clearEventsReady(apiProcessorId, claimedEvents);
         log.debug(String.format("ApiEventProcessor cleared events %d", nbProcessedEvents - prev));
         //log.debug(String.format("ApiEventProcessor seq = %d cleared events %s", sequenceId, claimedEvents.get(0).getId()));
+        return true;
     }
 
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/ApiEventProcessorBase.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/ApiEventProcessorBase.java
index cf20530..c4e01dd 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/ApiEventProcessorBase.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/ApiEventProcessorBase.java
@@ -166,5 +166,21 @@ public abstract class ApiEventProcessorBase implements IApiEventProcessor {
         }
     }
 
-    protected abstract void doProcessEvents(int sequenceId);
+
+    // Used for system test purpose only when event processing has been disabled.
+    @Override
+    public void processAllReadyEvents() {
+
+
+        boolean keepProcessing = false;
+        /*
+        do {
+         */
+        keepProcessing = doProcessEvents(sequenceId.incrementAndGet());
+        /*
+         } while (keepProcessing);
+         */
+    }
+
+    protected abstract boolean doProcessEvents(int sequenceId);
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
index dd33ae5..4f4d7e7 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
@@ -33,6 +33,8 @@ import com.ning.billing.entitlement.alignment.PlanAligner;
 import com.ning.billing.entitlement.api.IEntitlementService;
 import com.ning.billing.entitlement.api.billing.BillingApi;
 import com.ning.billing.entitlement.api.billing.IEntitlementBillingApi;
+import com.ning.billing.entitlement.api.test.EntitlementTestApi;
+import com.ning.billing.entitlement.api.test.IEntitlementTestApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.IApiListener;
 import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
@@ -43,6 +45,7 @@ import com.ning.billing.entitlement.events.IEvent.EventType;
 import com.ning.billing.entitlement.events.phase.IPhaseEvent;
 import com.ning.billing.entitlement.events.phase.PhaseEvent;
 import com.ning.billing.entitlement.events.user.IUserEvent;
+import com.ning.billing.lifecycle.IService;
 import com.ning.billing.lifecycle.LyfecycleHandlerType;
 import com.ning.billing.lifecycle.LyfecycleHandlerType.LyfecycleLevel;
 import com.ning.billing.util.clock.IClock;
@@ -59,6 +62,8 @@ public class Engine implements IEventListener, IEntitlementService {
     private final IPlanAligner planAligner;
     private final IEntitlementUserApi userApi;
     private final IEntitlementBillingApi billingApi;
+    private final IEntitlementTestApi testApi;
+    private final IEntitlementConfig config;
     private List<IApiListener> observers;
 
 
@@ -70,9 +75,12 @@ public class Engine implements IEventListener, IEntitlementService {
         this.dao = dao;
         this.apiEventProcessor = apiEventProcessor;
         this.planAligner = planAligner;
+        this.config = config;
         this.observers = null;
         this.userApi = new EntitlementUserApi(this, clock, planAligner, dao);
         this.billingApi = new BillingApi(this, clock, dao);
+        this.testApi = new EntitlementTestApi(apiEventProcessor, config);
+
     }
 
     @Override
@@ -87,6 +95,10 @@ public class Engine implements IEventListener, IEntitlementService {
 
     @LyfecycleHandlerType(LyfecycleLevel.START_SERVICE)
     public void start() {
+        if (config.isEventProcessingOff()) {
+            log.warn("KILLBILL ENTITLEMENT EVENT PROCESSING IS OFF !!!");
+            return;
+        }
         apiEventProcessor.startNotifications(this);
     }
 
@@ -107,6 +119,11 @@ public class Engine implements IEventListener, IEntitlementService {
     }
 
 
+    @Override
+    public IEntitlementTestApi getTestApi() {
+        return testApi;
+    }
+
     public void registerApiObservers(List<IApiListener> observers) {
         this.observers = observers;
     }
@@ -165,4 +182,5 @@ public class Engine implements IEventListener, IEntitlementService {
             dao.createNextPhaseEvent(subscription.getId(), nextPhaseEvent);
         }
     }
+
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/IApiEventProcessor.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/IApiEventProcessor.java
index 2f43320..f51ae7e 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/IApiEventProcessor.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/IApiEventProcessor.java
@@ -19,4 +19,6 @@ package com.ning.billing.entitlement.engine.core;
 
 public interface IApiEventProcessor extends IEventNotifier {
 
+    public void processAllReadyEvents();
+
 }
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
index 4c2ae2b..0ee8570 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
@@ -201,7 +201,7 @@ public abstract class TestUserApiBase {
 
     protected Subscription createSubscription(String productName, BillingPeriod term, String planSet) throws EntitlementUserApiException {
         testListener.pushExpectedEvent(NextEvent.CREATE);
-        Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSet);
+        Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSet, clock.getUTCNow());
         assertNotNull(subscription);
         assertTrue(testListener.isCompleted(5000));
         return subscription;
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancel.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancel.java
index 24468fe..c781fd7 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancel.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancel.java
@@ -67,7 +67,7 @@ public abstract class TestUserApiCancel extends TestUserApiBase {
             testListener.pushExpectedEvent(NextEvent.CANCEL);
 
             // CANCEL in trial period to get IMM policy
-            subscription.cancel();
+            subscription.cancel(clock.getUTCNow(), false);
             currentPhase = subscription.getCurrentPhase();
 
             testListener.isCompleted(1000);
@@ -118,7 +118,7 @@ public abstract class TestUserApiCancel extends TestUserApiBase {
             testListener.pushExpectedEvent(NextEvent.CANCEL);
 
             // CANCEL
-            subscription.cancel();
+            subscription.cancel(clock.getUTCNow(), false);
             assertFalse(testListener.isCompleted(2000));
 
             // MOVE TO EOT + RECHECK
@@ -165,7 +165,7 @@ public abstract class TestUserApiCancel extends TestUserApiBase {
             testListener.pushExpectedEvent(NextEvent.CANCEL);
 
             // CANCEL
-            subscription.cancel();
+            subscription.cancel(clock.getUTCNow(), false);
             assertTrue(testListener.isCompleted(2000));
 
             IPlanPhase currentPhase = subscription.getCurrentPhase();
@@ -215,7 +215,7 @@ public abstract class TestUserApiCancel extends TestUserApiBase {
             testListener.pushExpectedEvent(NextEvent.CANCEL);
 
             // CANCEL
-            subscription.cancel();
+            subscription.cancel(clock.getUTCNow(), false);
             assertFalse(testListener.isCompleted(2000));
 
             subscription.uncancel();
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
index f187d9f..670ac6d 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
@@ -92,7 +92,7 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
 
             // CHANGE PLAN
             testListener.pushExpectedEvent(NextEvent.CHANGE);
-            subscription.changePlan(toProd, toTerm, toPlanSet);
+            subscription.changePlan(toProd, toTerm, toPlanSet, clock.getUTCNow());
             assertTrue(testListener.isCompleted(2000));
 
             // CHECK CHANGE PLAN
@@ -138,7 +138,7 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
             // RE READ SUBSCRIPTION + CHANGE PLAN
             testListener.pushExpectedEvent(NextEvent.CHANGE);
             subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
-            subscription.changePlan(toProd, toTerm, toPlanSet);
+            subscription.changePlan(toProd, toTerm, toPlanSet, clock.getUTCNow());
             assertFalse(testListener.isCompleted(2000));
             testListener.reset();
 
@@ -190,7 +190,7 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
             clock.setDeltaFromReality(moveALittleInTime, 0);
 
             // CHANGE PLAN IMM
-            subscription.changePlan(toProd, toTerm, toPlanSet);
+            subscription.changePlan(toProd, toTerm, toPlanSet, clock.getUTCNow());
             checkChangePlan(subscription, toProd, ProductCategory.BASE, toTerm, PhaseType.TRIAL);
 
             assertTrue(testListener.isCompleted(2000));
@@ -252,7 +252,7 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
             currentTime = clock.getUTCNow();
 
             testListener.pushExpectedEvent(NextEvent.CHANGE);
-            subscription.changePlan(toProd, toTerm, toPlanSet);
+            subscription.changePlan(toProd, toTerm, toPlanSet, clock.getUTCNow());
 
             checkChangePlan(subscription, fromProd, ProductCategory.BASE, fromTerm, PhaseType.EVERGREEN);
 
@@ -317,12 +317,12 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
 
             // CHANGE EOT
             testListener.pushExpectedEvent(NextEvent.CHANGE);
-            subscription.changePlan("Pistol", BillingPeriod.MONTHLY, "gunclubDiscount");
+            subscription.changePlan("Pistol", BillingPeriod.MONTHLY, "gunclubDiscount", clock.getUTCNow());
             assertFalse(testListener.isCompleted(2000));
 
             // CHANGE
             testListener.pushExpectedEvent(NextEvent.CHANGE);
-            subscription.changePlan("Assault-Rifle", BillingPeriod.ANNUAL, "gunclubDiscount");
+            subscription.changePlan("Assault-Rifle", BillingPeriod.ANNUAL, "gunclubDiscount", clock.getUTCNow());
             assertFalse(testListener.isCompleted(2000));
 
             IPlan currentPlan = subscription.getCurrentPlan();
@@ -364,13 +364,13 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
 
             // CHANGE EOT
             testListener.pushExpectedEvent(NextEvent.CHANGE);
-            subscription.changePlan("Shotgun", BillingPeriod.MONTHLY, "gunclubDiscount");
+            subscription.changePlan("Shotgun", BillingPeriod.MONTHLY, "gunclubDiscount", clock.getUTCNow());
             assertFalse(testListener.isCompleted(2000));
             testListener.reset();
 
             // CHANGE EOT
             testListener.pushExpectedEvent(NextEvent.CHANGE);
-            subscription.changePlan("Pistol", BillingPeriod.ANNUAL, "gunclubDiscount");
+            subscription.changePlan("Pistol", BillingPeriod.ANNUAL, "gunclubDiscount", clock.getUTCNow());
             assertFalse(testListener.isCompleted(2000));
             testListener.reset();
 
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java
index c8eac1f..ade73dc 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java
@@ -56,7 +56,7 @@ public abstract class TestUserApiCreate extends TestUserApiBase {
 
             testListener.pushExpectedEvent(NextEvent.CREATE);
 
-            Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName);
+            Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName, clock.getUTCNow());
             assertNotNull(subscription);
 
             assertEquals(subscription.getActiveVersion(), SubscriptionEvents.INITIAL_VERSION);
@@ -121,7 +121,7 @@ public abstract class TestUserApiCreate extends TestUserApiBase {
             testListener.pushExpectedEvent(NextEvent.CREATE);
 
             // CREATE SUBSCRIPTION
-            Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName);
+            Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName, clock.getUTCNow());
             assertNotNull(subscription);
 
             IPlanPhase currentPhase = subscription.getCurrentPhase();
@@ -168,7 +168,7 @@ public abstract class TestUserApiCreate extends TestUserApiBase {
 
             testListener.pushExpectedEvent(NextEvent.CREATE);
 
-            Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName);
+            Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName, clock.getUTCNow());
             assertNotNull(subscription);
 
         } catch (EntitlementUserApiException e) {
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java
index 3fb58ee..90e7cde 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java
@@ -80,7 +80,7 @@ public class TestUserApiDemos extends TestUserApiBase {
 
             /* STEP 2. CHANGE PLAN WHILE IN TRIAL */
             testListener.pushExpectedEvent(NextEvent.CHANGE);
-            subscription.changePlan("Assault-Rifle", BillingPeriod.ANNUAL, "gunclubDiscount");
+            subscription.changePlan("Assault-Rifle", BillingPeriod.ANNUAL, "gunclubDiscount", clock.getUTCNow());
             assertTrue(testListener.isCompleted(3000));
 
             displayState(subscription.getId(), "STEP 2. CHANGED PLAN WHILE IN TRIAL");
@@ -103,7 +103,7 @@ public class TestUserApiDemos extends TestUserApiBase {
             subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
 
             testListener.pushExpectedEvent(NextEvent.CHANGE);
-            subscription.changePlan("Shotgun", BillingPeriod.ANNUAL, "gunclubDiscount");
+            subscription.changePlan("Shotgun", BillingPeriod.ANNUAL, "gunclubDiscount", clock.getUTCNow());
             assertFalse(testListener.isCompleted(2000));
             testListener.reset();
 
@@ -111,7 +111,7 @@ public class TestUserApiDemos extends TestUserApiBase {
 
             /* STEP 5. CHANGE AGAIN */
             testListener.pushExpectedEvent(NextEvent.CHANGE);
-            subscription.changePlan("Pistol", BillingPeriod.ANNUAL, "gunclubDiscount");
+            subscription.changePlan("Pistol", BillingPeriod.ANNUAL, "gunclubDiscount", clock.getUTCNow());
             assertFalse(testListener.isCompleted(2000));
             testListener.reset();
 
@@ -154,7 +154,7 @@ public class TestUserApiDemos extends TestUserApiBase {
 
             /* STEP 8. CANCEL IMM (NO CTD) */
             testListener.pushExpectedEvent(NextEvent.CANCEL);
-            subscription.cancel();
+            subscription.cancel(clock.getUTCNow(), false);
 
             displayState(subscription.getId(), "STEP 8.  CANCELLATION");
 
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiError.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiError.java
index 1e6f454..6599f57 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiError.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiError.java
@@ -92,7 +92,7 @@ public class TestUserApiError extends TestUserApiBase {
     private void tCreateSubscriptionInternal(UUID bundleId, String productName,
             BillingPeriod term, String planSet, ErrorCode expected)  {
         try {
-            entitlementApi.createSubscription(bundleId, productName, term, planSet);
+            entitlementApi.createSubscription(bundleId, productName, term, planSet,clock.getUTCNow());
             assertFalse(true);
         } catch (EntitlementUserApiException e) {
             assertEquals(e.getCode(), expected.getCode());
@@ -111,9 +111,9 @@ public class TestUserApiError extends TestUserApiBase {
             ISubscription subscription = createSubscription("Shotgun", BillingPeriod.ANNUAL, PriceListSet.DEFAULT_PRICELIST_NAME);
 
             testListener.pushExpectedEvent(NextEvent.CANCEL);
-            subscription.cancel();
+            subscription.cancel(clock.getUTCNow(), false);
             try {
-                subscription.changePlan("Pistol", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME);
+                subscription.changePlan("Pistol", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, clock.getUTCNow());
             } catch (EntitlementUserApiException e) {
                 assertEquals(e.getCode(), ErrorCode.ENT_CHANGE_NON_ACTIVE.getCode());
                 try {
@@ -142,9 +142,9 @@ public class TestUserApiError extends TestUserApiBase {
             billingApi.setChargedThroughDate(subscription.getId(), newChargedThroughDate);
             subscription = entitlementApi.getSubscriptionFromId(subscription.getId());
 
-            subscription.cancel();
+            subscription.cancel(clock.getUTCNow(), false);
             try {
-                subscription.changePlan("Pistol", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME);
+                subscription.changePlan("Pistol", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, clock.getUTCNow());
             } catch (EntitlementUserApiException e) {
                 assertEquals(e.getCode(), ErrorCode.ENT_CHANGE_FUTURE_CANCELLED.getCode());
                 try {
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiScenarios.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiScenarios.java
index 7f3dbba..78e7cb3 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiScenarios.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiScenarios.java
@@ -53,7 +53,7 @@ public class TestUserApiScenarios extends TestUserApiBase {
             assertEquals(trialPhase.getPhaseType(), PhaseType.TRIAL);
 
             testListener.pushExpectedEvent(NextEvent.CHANGE);
-            subscription.changePlan("Pistol", BillingPeriod.ANNUAL, "gunclubDiscount");
+            subscription.changePlan("Pistol", BillingPeriod.ANNUAL, "gunclubDiscount", clock.getUTCNow());
             testListener.isCompleted(3000);
 
             // MOVE TO NEXT PHASE
@@ -70,7 +70,7 @@ public class TestUserApiScenarios extends TestUserApiBase {
 
             // CANCEL EOT
             testListener.pushExpectedEvent(NextEvent.CANCEL);
-            subscription.cancel();
+            subscription.cancel(clock.getUTCNow(), false);
             assertFalse(testListener.isCompleted(2000));
             testListener.reset();
 
@@ -79,7 +79,7 @@ public class TestUserApiScenarios extends TestUserApiBase {
 
             // CHANGE EOT
             testListener.pushExpectedEvent(NextEvent.CHANGE);
-            subscription.changePlan("Pistol", BillingPeriod.MONTHLY, "gunclubDiscount");
+            subscription.changePlan("Pistol", BillingPeriod.MONTHLY, "gunclubDiscount", clock.getUTCNow());
             assertFalse(testListener.isCompleted(2000));
 
             clock.addDeltaFromReality(ctd);
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/engine/core/ApiEventProcessorMemoryMock.java b/entitlement/src/test/java/com/ning/billing/entitlement/engine/core/ApiEventProcessorMemoryMock.java
index 38aed83..79aef55 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/engine/core/ApiEventProcessorMemoryMock.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/engine/core/ApiEventProcessorMemoryMock.java
@@ -34,9 +34,12 @@ public class ApiEventProcessorMemoryMock extends ApiEventProcessorBase {
 
 
     @Override
-    protected void doProcessEvents(int sequenceId) {
+    protected boolean doProcessEvents(int sequenceId) {
 
         List<IEvent> events =  dao.getEventsReady(apiProcessorId, sequenceId);
+        if (events.size() == 0) {
+            return false;
+        }
         log.info(String.format("doProcessEvents : Got %d event(s)", events.size() ));
         for (IEvent cur : events) {
             log.info(String.format("doProcessEvents :  (clock = %s) CALLING Engine with event %s", clock.getUTCNow(), cur));
@@ -46,5 +49,6 @@ public class ApiEventProcessorMemoryMock extends ApiEventProcessorBase {
         }
         dao.clearEventsReady(apiProcessorId, events);
         log.info(String.format("doProcessEvents : clearEvents"));
+        return true;
     }
 }