/*
* Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"). You may not
* use this file except in compliance with the License. A copy of the License is
* located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file 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.amazonaws.services.simpleworkflow.flow.examples.periodicworkflow;
import junit.framework.Assert;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.amazonaws.services.simpleworkflow.flow.ActivityExecutionContext;
import com.amazonaws.services.simpleworkflow.flow.ActivityExecutionContextProvider;
import com.amazonaws.services.simpleworkflow.flow.ActivityExecutionContextProviderImpl;
import com.amazonaws.services.simpleworkflow.flow.core.TryFinally;
import com.amazonaws.services.simpleworkflow.flow.junit.FlowBlockJUnit4ClassRunner;
import com.amazonaws.services.simpleworkflow.flow.junit.WorkflowTest;
import com.amazonaws.services.simpleworkflow.model.ActivityType;
import com.amazonaws.services.simpleworkflow.model.WorkflowExecution;
// Have to use Flow JUnit runner if timeout is specified on any @Test
// annotation.
@RunWith(FlowBlockJUnit4ClassRunner.class)
public class PeriodicWorkflowTest {
private final class TestPeriodicWorkflowActivities implements PeriodicWorkflowActivities {
private final ActivityExecutionContextProvider contextProvider = new ActivityExecutionContextProviderImpl();
private int workCount;
private int currentRunWorkCount;
private String runId;
@Override
public void doSomeWork(String parameter) {
// Reset counter on the new run which changes when workflow continues as new
ActivityExecutionContext activityExecutionContext = contextProvider.getActivityExecutionContext();
WorkflowExecution workflowExecution = activityExecutionContext.getWorkflowExecution();
String runId = workflowExecution.getRunId();
if (this.runId != null && !runId.equals(this.runId)) {
currentRunWorkCount = 0;
}
this.runId = runId;
workCount++;
currentRunWorkCount++;
}
public int getWorkCount() {
return workCount;
}
public int getCurrentRunWorkCount() {
return currentRunWorkCount;
}
}
private final class TestErrorReportingActivities implements ErrorReportingActivities {
private Throwable failure;
@Override
public void reportFailure(Throwable e) {
failure = e;
}
public Throwable getFailure() {
return failure;
}
}
@Rule
public WorkflowTest workflowTest = new WorkflowTest();
private PeriodicWorkflowClientFactory workflowClientFactory = new PeriodicWorkflowClientFactoryImpl();
private TestPeriodicWorkflowActivities periodicActivitiesImplementation;
private TestErrorReportingActivities errorReportingActivitiesImplementation;
@Before
public void setUp() throws Exception {
periodicActivitiesImplementation = new TestPeriodicWorkflowActivities();
workflowTest.addActivitiesImplementation(periodicActivitiesImplementation);
errorReportingActivitiesImplementation = new TestErrorReportingActivities();
workflowTest.addActivitiesImplementation(errorReportingActivitiesImplementation);
workflowTest.addWorkflowImplementationType(PeriodicWorkflowImpl.class);
workflowTest.setDisableOutstandingTasksCheck(true);
}
@After
public void tearDown() throws Exception {
}
@Test(timeout = 2000)
public void testPeriodic() {
workflowTest.setClockAccelerationCoefficient(100);
workflowTest.setDisableOutstandingTasksCheck(true);
final PeriodicWorkflowClient workflow = workflowClientFactory.getClient();
final PeriodicWorkflowOptions options = new PeriodicWorkflowOptions();
options.setExecutionPeriodSeconds(10);
options.setContinueAsNewAfterSeconds(30);
options.setCompleteAfterSeconds(120);
options.setWaitForActivityCompletion(true);
final ActivityType activityType = new ActivityType();
activityType.setName("PeriodicWorkflowActivities.doSomeWork");
activityType.setVersion("1.0");
final Object[] parameters = new Object[] { "parameter1" };
new TryFinally() {
@Override
protected void doTry() throws Throwable {
workflow.startPeriodicWorkflow(activityType, parameters, options);
}
@Override
protected void doFinally() throws Throwable {
Assert.assertEquals(120 / 10, periodicActivitiesImplementation.getWorkCount());
Assert.assertEquals(30 / 10, periodicActivitiesImplementation.getCurrentRunWorkCount());
Assert.assertNull(errorReportingActivitiesImplementation.getFailure());
}
};
}
}