/*
* Copyright 2015 Collective, Inc.
*
* Licensed 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.collective.celos;
import org.junit.Assert;
import org.junit.Test;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class SlotStateTest {
private final SlotID id = new SlotID(new WorkflowID("foo"), new ScheduledTime("2013-12-04T19:18Z"));
@Test
public void transitionsWorkAsExpected() {
SlotState waiting = new SlotState(id, SlotState.Status.WAITING);
SlotState ready = new SlotState(id, SlotState.Status.READY);
Assert.assertEquals(ready, waiting.transitionToReady());
SlotState waitTimeout = new SlotState(id, SlotState.Status.WAIT_TIMEOUT);
Assert.assertEquals(waitTimeout, waiting.transitionToWaitTimeout());
SlotState running = new SlotState(id, SlotState.Status.RUNNING, "external", 0);
Assert.assertEquals(running, ready.transitionToRunning("external"));
SlotState success = new SlotState(id, SlotState.Status.SUCCESS, "external", 0);
Assert.assertEquals(success, running.transitionToSuccess());
SlotState failure = new SlotState(id, SlotState.Status.FAILURE, "external", 0);
Assert.assertEquals(failure, running.transitionToFailure());
SlotState retry = new SlotState(id, SlotState.Status.WAITING, null, 1);
Assert.assertEquals(retry, running.transitionToRetry());
}
@Test(expected = IllegalStateException.class)
public void rerunFailsAsExpectedForWaiting() {
new SlotState(id, SlotState.Status.WAITING).transitionToRerun();
}
@Test(expected = IllegalStateException.class)
public void rerunFailsAsExpectedForReady() {
new SlotState(id, SlotState.Status.READY).transitionToRerun();
}
@Test(expected = IllegalStateException.class)
public void rerunFailsAsExpectedForRunning() {
new SlotState(id, SlotState.Status.RUNNING).transitionToRerun();
}
@Test
public void rerunWorksAsExpectedForSuccess() {
SlotState success = new SlotState(id, SlotState.Status.SUCCESS, "external-ID", 14);
SlotState expected = new SlotState(id, SlotState.Status.WAITING);
Assert.assertEquals(expected, success.transitionToRerun());
}
@Test
public void rerunWorksAsExpectedForWaitTimeout() {
SlotState waitTimeout = new SlotState(id, SlotState.Status.WAIT_TIMEOUT, "external-ID", 14);
SlotState expected = new SlotState(id, SlotState.Status.WAITING);
Assert.assertEquals(expected, waitTimeout.transitionToRerun());
}
@Test
public void rerunWorksAsExpectedForFailure() {
SlotState failure = new SlotState(id, SlotState.Status.FAILURE, "external-ID", 14);
SlotState expected = new SlotState(id, SlotState.Status.WAITING);
Assert.assertEquals(expected, failure.transitionToRerun());
}
@Test
public void slotStateGetScheduledTimeWorks() {
ScheduledTime t = new ScheduledTime("2013-11-26T13:00Z");
SlotState slotState = new SlotState(new SlotID(new WorkflowID("foo"), t), SlotState.Status.READY);
Assert.assertEquals(t, slotState.getScheduledTime());
}
@Test
public void canRoundtripToJSON() throws Exception {
SlotState state1 = new SlotState(id, SlotState.Status.WAITING);
SlotState state2 = new SlotState(id, SlotState.Status.READY).transitionToRunning("foo-external-ID");
String json1 = "{\"time\":\"2013-12-04T19:18:00.000Z\",\"status\":\"WAITING\",\"externalID\":null,\"retryCount\":0}";
String json2 = "{\"time\":\"2013-12-04T19:18:00.000Z\",\"status\":\"RUNNING\",\"externalID\":\"foo-external-ID\",\"retryCount\":0}";
Assert.assertEquals(json1, Util.JSON_WRITER.writeValueAsString(state1.toJSONNode()));
Assert.assertEquals(json2, Util.JSON_WRITER.writeValueAsString(state2.toJSONNode()));
Assert.assertEquals(state1, SlotState.fromJSONNode(id.getWorkflowID(), Util.JSON_READER.readTree(json1)));
Assert.assertEquals(state2, SlotState.fromJSONNode(id.getWorkflowID(), Util.JSON_READER.readTree(json2)));
}
}