com.collective.celos.CelosClientServerTest.java Source code

Java tutorial

Introduction

Here is the source code for com.collective.celos.CelosClientServerTest.java

Source

/*
 * 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 com.collective.celos.database.FileSystemStateDatabase;
import com.collective.celos.server.CelosServer;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.apache.commons.io.FileUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.HttpHostConnectException;
import org.apache.http.impl.client.DefaultHttpClient;
import org.junit.*;
import org.junit.Assert;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;

/**
 * Created by akonopko on 22.12.14.
 */
public class CelosClientServerTest {

    public static final String WORKFLOWS_DIR = "workflows";
    public static final String DEFAULTS_DIR = "defaults";
    public static final String DB_DIR = "db";
    public static final int SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW = SchedulerConfiguration.SLIDING_WINDOW_DAYS * 24;

    @Rule
    public TemporaryFolder folder = new TemporaryFolder();

    private File workflowsDir;
    private File slotDbDir;
    private CelosServer celosServer;
    private CelosClient celosClient;

    @Before
    public void setup() throws Exception {
        File tmpDir = folder.newFolder();
        this.workflowsDir = new File(tmpDir, WORKFLOWS_DIR);
        File defaultsDir = new File(tmpDir, DEFAULTS_DIR);
        this.slotDbDir = new File(tmpDir, DB_DIR);
        this.workflowsDir.mkdirs();
        defaultsDir.mkdirs();
        this.slotDbDir.mkdirs();

        this.celosServer = new CelosServer();
        FileSystemStateDatabase db = new FileSystemStateDatabase(slotDbDir);
        int port = celosServer.startServer(ImmutableMap.<String, String>of(), workflowsDir, defaultsDir, db);
        this.celosClient = new CelosClient(URI.create("http://localhost:" + port));
    }

    @After
    public void tearDown() throws Exception {
        celosServer.stopServer();
    }

    @Test
    public void testCheckStatus() throws Exception {
        celosClient.checkStatus();
    }

    @Test
    public void testGetWorkflowListEmpty() throws Exception {
        Set<WorkflowID> workflowIDs = celosClient.getWorkflowList();
        Assert.assertTrue(workflowIDs.isEmpty());
    }

    @Test
    public void testGetWorkflowListEmptyBeforeClearCache() throws Exception {
        Set<WorkflowID> workflowIDs = celosClient.getWorkflowList();
        Assert.assertTrue(workflowIDs.isEmpty());

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        workflowIDs = celosClient.getWorkflowList();
        Assert.assertTrue(workflowIDs.isEmpty());

        celosClient.clearCache();

        workflowIDs = celosClient.getWorkflowList();
        Assert.assertEquals(Sets.newHashSet(workflowIDs),
                Sets.newHashSet(new WorkflowID("workflow-1"), new WorkflowID("workflow-2"),
                        new WorkflowID("workflow-Itrntinliztin"), new WorkflowID("workflow-4")));
    }

    @Test(expected = HttpHostConnectException.class)
    public void testServerStops() throws Exception {
        celosClient.getWorkflowList();
        celosServer.stopServer();
        celosClient.getWorkflowList();
    }

    @Test(expected = IOException.class)
    public void testGetWorkflowStatusFailsNoId() throws Exception {
        celosClient.getWorkflowStatus(new WorkflowID("noid"));
    }

    @Test(expected = IOException.class)
    public void testGetWorkflowStatusFailsNoIdWithSomeData() throws Exception {
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        celosClient.getWorkflowStatus(new WorkflowID("noid"));
    }

    @Test
    public void testGetWorkflowStatusWaiting() throws Exception {
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-2")).getSlotStates();
        Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW);

        for (SlotState slotState : slotStates) {
            Assert.assertEquals(slotState.getStatus(), SlotState.Status.WAITING);
            Assert.assertEquals(slotState.getExternalID(), null);
            Assert.assertEquals(slotState.getRetryCount(), 0);
        }
    }

    @Test
    public void testGetWorkflowStatusCorrectOrder() throws Exception {
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-2")).getSlotStates();
        Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW);

        for (int i = 0; i < slotStates.size() - 1; i++) {
            SlotState slotState = slotStates.get(i);
            SlotState nextSlotState = slotStates.get(i + 1);
            Assert.assertTrue(!slotState.getScheduledTime().getDateTime()
                    .isBefore(nextSlotState.getScheduledTime().getDateTime()));
        }
    }

    @Test
    public void testGetWorkflowStatusTransitionToReady() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        celosClient.iterateScheduler();
        List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-2")).getSlotStates();
        Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW);

        for (SlotState slotState : slotStates) {
            Assert.assertEquals(slotState.getStatus(), SlotState.Status.READY);
            Assert.assertEquals(slotState.getExternalID(), null);
            Assert.assertEquals(slotState.getRetryCount(), 0);
        }
    }

    @Test
    public void testGetWorkflowStatusNoInfo() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        celosClient.iterateScheduler();
        WorkflowStatus status = celosClient.getWorkflowStatus(new WorkflowID("workflow-1"));
        Assert.assertNull(status.getInfo().getUrl());
        Assert.assertTrue(status.getInfo().getContacts().isEmpty());
    }

    @Test
    public void testGetWorkflowStatusWithInfo() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        celosClient.iterateScheduler();
        WorkflowStatus status = celosClient.getWorkflowStatus(new WorkflowID("workflow-2"));

        Assert.assertEquals(new URL("http://collective.com"), status.getInfo().getUrl());
        Assert.assertEquals(1, status.getInfo().getContacts().size());
        Assert.assertEquals("John Doe", status.getInfo().getContacts().get(0).getName());
        Assert.assertEquals(URI.create("john.doe@collective.com"),
                status.getInfo().getContacts().get(0).getEmail());
    }

    @Test
    public void testGetWorkflowStatusTransitionToRunningFailsWrongOozieService() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        celosClient.iterateScheduler();
        celosClient.iterateScheduler();
        List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-1")).getSlotStates();
        Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW);

        for (SlotState slotState : slotStates) {
            Assert.assertEquals(slotState.getStatus(), SlotState.Status.READY);
            Assert.assertNull(slotState.getExternalID());
            Assert.assertEquals(slotState.getRetryCount(), 0);
        }
    }

    @Test
    public void testGetWorkflowStatusTransitionToRunning() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        celosClient.iterateScheduler();
        celosClient.iterateScheduler();
        List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-2")).getSlotStates();
        Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW);

        List<SlotState> slotStatesOther = slotStates.subList(0, slotStates.size() - 1);
        SlotState slotStateLst = slotStates.get(slotStates.size() - 1);
        Assert.assertEquals(slotStateLst.getStatus(), SlotState.Status.RUNNING);
        Assert.assertNotNull(slotStateLst.getExternalID());
        Assert.assertEquals(slotStateLst.getRetryCount(), 0);

        for (SlotState slotState : slotStatesOther) {
            Assert.assertEquals(slotState.getStatus(), SlotState.Status.READY);
            Assert.assertNull(slotState.getExternalID());
            Assert.assertEquals(slotState.getRetryCount(), 0);
        }
    }

    @Test
    public void testGetWorkflowStatusTransitionToSuccess() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        celosClient.iterateScheduler();
        celosClient.iterateScheduler();
        celosClient.iterateScheduler();

        List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-2")).getSlotStates();
        Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW);

        SlotState slotStateLst = slotStates.get(slotStates.size() - 1);
        Assert.assertEquals(slotStateLst.getStatus(), SlotState.Status.SUCCESS);
        Assert.assertNotNull(slotStateLst.getExternalID());
        Assert.assertEquals(slotStateLst.getRetryCount(), 0);

        slotStates = slotStates.subList(0, slotStates.size() - 1);
        for (SlotState slotState : slotStates) {
            Assert.assertEquals(slotState.getStatus(), SlotState.Status.READY);
            Assert.assertNull(slotState.getExternalID());
            Assert.assertEquals(slotState.getRetryCount(), 0);
        }
    }

    @Test
    public void testGetWorkflowStatusTransitionToSuccessRunning() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        celosClient.iterateScheduler();
        celosClient.iterateScheduler();
        celosClient.iterateScheduler();
        celosClient.iterateScheduler();

        List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-2")).getSlotStates();
        Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW);

        SlotState slotStateLst = slotStates.get(slotStates.size() - 1);
        Assert.assertEquals(slotStateLst.getStatus(), SlotState.Status.SUCCESS);
        Assert.assertNotNull(slotStateLst.getExternalID());
        Assert.assertEquals(slotStateLst.getRetryCount(), 0);

        SlotState slotStatePreLst = slotStates.get(slotStates.size() - 2);
        Assert.assertEquals(slotStatePreLst.getStatus(), SlotState.Status.RUNNING);
        Assert.assertNotNull(slotStatePreLst.getExternalID());
        Assert.assertEquals(slotStatePreLst.getRetryCount(), 0);

        slotStates = slotStates.subList(0, slotStates.size() - 2);
        for (SlotState slotState : slotStates) {
            Assert.assertEquals(slotState.getStatus(), SlotState.Status.READY);
            Assert.assertNull(slotState.getExternalID());
            Assert.assertEquals(slotState.getRetryCount(), 0);
        }
    }

    @Test
    public void testGetWorkflowStatusTransitionToSuccessFailure() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        celosClient.iterateScheduler();
        celosClient.iterateScheduler();
        celosClient.iterateScheduler();

        List<SlotState> slotStates = celosClient
                .getWorkflowStatus(new WorkflowID("workflow-Itrntinliztin")).getSlotStates();
        Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW);

        SlotState slotStateFst = slotStates.get(slotStates.size() - 1);
        Assert.assertEquals(slotStateFst.getStatus(), SlotState.Status.FAILURE);
        Assert.assertNotNull(slotStateFst.getExternalID());
        Assert.assertEquals(slotStateFst.getRetryCount(), 0);
    }

    @Test
    public void testGetWorkflowStatusInPast() throws Exception {

        ScheduledTime timeInPast = new ScheduledTime("2000-12-01T00:00Z");
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4")).getSlotStates();
        Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW);
        Assert.assertTrue(slotStates.get(slotStates.size() - 1).getScheduledTime().getDateTime()
                .isAfter(timeInPast.getDateTime().plusYears(1)));

        slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4"), timeInPast).getSlotStates();
        Assert.assertEquals(slotStates.get(slotStates.size() - 1).getScheduledTime(),
                timeInPast.minusDays(SchedulerConfiguration.SLIDING_WINDOW_DAYS));
        Assert.assertEquals(slotStates.get(0).getScheduledTime(), timeInPast.minusHours(1));

        slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4"), timeInPast.plusSeconds(1))
                .getSlotStates();
        Assert.assertEquals(slotStates.get(0).getScheduledTime(), timeInPast);
    }

    @Test
    public void testSchedulerIteratorPast() throws Exception {

        ScheduledTime timeInPast = new ScheduledTime("2000-12-01T00:00Z");
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4")).getSlotStates();
        Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW);

        celosClient.iterateScheduler(timeInPast);

        ScheduledTime inclusivePeriod = timeInPast.plusSeconds(1);
        slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4"), inclusivePeriod).getSlotStates();

        for (SlotState slotState : slotStates) {
            Assert.assertEquals(slotState.getStatus(), SlotState.Status.WAITING);
            Assert.assertEquals(slotState.getExternalID(), null);
            Assert.assertEquals(slotState.getRetryCount(), 0);
        }

        celosClient.iterateScheduler(timeInPast);
        slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4"), inclusivePeriod).getSlotStates();

        for (SlotState slotState : slotStates) {
            Assert.assertEquals(slotState.getStatus(), SlotState.Status.WAITING);
            Assert.assertEquals(slotState.getExternalID(), null);
            Assert.assertEquals(slotState.getRetryCount(), 0);
        }

        celosClient.iterateScheduler(inclusivePeriod);
        slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4"), inclusivePeriod).getSlotStates();
        Assert.assertEquals(slotStates.get(0).getStatus(), SlotState.Status.READY);
        for (SlotState slotState : slotStates.subList(1, slotStates.size())) {
            Assert.assertEquals(slotState.getStatus(), SlotState.Status.WAITING);
            Assert.assertEquals(slotState.getExternalID(), null);
            Assert.assertEquals(slotState.getRetryCount(), 0);
        }
    }

    @Test
    public void testServerRespondsToScheduler() throws Exception {
        celosClient.iterateScheduler();
    }

    @Test
    public void testServerRespondsToSchedulerPOST() throws IOException {
        HttpPost request = new HttpPost(celosClient.getAddress() + "/scheduler");
        HttpResponse response = new DefaultHttpClient().execute(request);
        Assert.assertEquals(response.getStatusLine().getStatusCode(), 200);
    }

    @Test
    public void testSchedulerNoRespondToGet() throws IOException {
        HttpGet request = new HttpGet(celosClient.getAddress() + "/scheduler");
        HttpResponse response = new DefaultHttpClient().execute(request);
        Assert.assertEquals(response.getStatusLine().getStatusCode(), 405);
        Assert.assertEquals(response.getStatusLine().getReasonPhrase(),
                "HTTP method GET is not supported by this URL");
    }

    @Test
    public void testGetWorkflowFailsWithNoIdParameter() throws Exception {
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        HttpGet request = new HttpGet(celosClient.getAddress() + "/workflow");
        HttpResponse response = new DefaultHttpClient().execute(request);
        Assert.assertEquals(response.getStatusLine().getStatusCode(), 400);
        Assert.assertEquals(response.getStatusLine().getReasonPhrase(), "id parameter missing.");
    }

    @Test(expected = IOException.class)
    public void testCantGetStatusFromDBOnly() throws Exception {

        File src2 = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/server/slot-db-1").toURI());
        FileUtils.copyDirectory(src2, slotDbDir);

        celosClient.getWorkflowStatus(new WorkflowID("workflow-1"), new ScheduledTime("2013-12-02T20:00Z"));
    }

    @Test
    public void testCorrectWorkflowStatesFromDbWf1() throws Exception {
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        File src2 = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/server/slot-db-1").toURI());
        FileUtils.copyDirectory(src2, slotDbDir);

        ScheduledTime timeStart = new ScheduledTime("2013-11-25T20:00:00.000Z");
        ScheduledTime waitingSlotsTimeEnd = new ScheduledTime("2013-12-02T19:00:00.000Z");

        ScheduledTime time = waitingSlotsTimeEnd;

        List<SlotState> expectedSlotStates = Lists.newArrayList();
        SlotState slotStateRunning = new SlotState(new SlotID(new WorkflowID("workflow-1"), time),
                SlotState.Status.RUNNING, "foo-bar", 0);
        time = time.minusHours(1);
        SlotState slotStateReady = new SlotState(new SlotID(new WorkflowID("workflow-1"), time),
                SlotState.Status.READY, null, 14);
        time = time.minusHours(1);

        expectedSlotStates.add(slotStateRunning);
        expectedSlotStates.add(slotStateReady);

        while (!time.getDateTime().isBefore(timeStart.getDateTime())) {
            SlotState slotState = new SlotState(new SlotID(new WorkflowID("workflow-1"), time),
                    SlotState.Status.WAITING);
            expectedSlotStates.add(slotState);
            time = time.minusHours(1);
        }

        List<SlotState> resultSlotStates = celosClient
                .getWorkflowStatus(new WorkflowID("workflow-1"), new ScheduledTime("2013-12-02T20:00Z"))
                .getSlotStates();

        Assert.assertEquals(expectedSlotStates, resultSlotStates);
    }

    @Test
    public void testCorrectWorkflowStatesFromDbWf1Only10Hours() throws Exception {
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        File src2 = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/server/slot-db-1").toURI());
        FileUtils.copyDirectory(src2, slotDbDir);

        ScheduledTime timeStart = new ScheduledTime("2013-12-02T10:00:00.000Z");
        ScheduledTime waitingSlotsTimeEnd = new ScheduledTime("2013-12-02T19:00:00.000Z");

        ScheduledTime time = waitingSlotsTimeEnd;

        List<SlotState> expectedSlotStates = Lists.newArrayList();
        SlotState slotStateRunning = new SlotState(new SlotID(new WorkflowID("workflow-1"), time),
                SlotState.Status.RUNNING, "foo-bar", 0);
        time = time.minusHours(1);
        SlotState slotStateReady = new SlotState(new SlotID(new WorkflowID("workflow-1"), time),
                SlotState.Status.READY, null, 14);
        time = time.minusHours(1);

        expectedSlotStates.add(slotStateRunning);
        expectedSlotStates.add(slotStateReady);

        while (!time.getDateTime().isBefore(timeStart.getDateTime())) {
            SlotState slotState = new SlotState(new SlotID(new WorkflowID("workflow-1"), time),
                    SlotState.Status.WAITING);
            expectedSlotStates.add(slotState);
            time = time.minusHours(1);
        }

        ScheduledTime reqTimeEnd = new ScheduledTime("2013-12-02T20:00Z");
        ScheduledTime reqTimeStart = new ScheduledTime("2013-12-02T10:00Z");
        List<SlotState> resultSlotStates = celosClient
                .getWorkflowStatus(new WorkflowID("workflow-1"), reqTimeStart, reqTimeEnd).getSlotStates();

        Assert.assertEquals(expectedSlotStates, resultSlotStates);
    }

    @Test
    public void testWorksfor5Days() throws Exception {
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        ScheduledTime reqTimeEnd = new ScheduledTime("2013-12-07T20:00Z");
        ScheduledTime reqTimeStart = new ScheduledTime("2013-12-02T10:00Z");
        celosClient.getWorkflowStatus(new WorkflowID("workflow-1"), reqTimeStart, reqTimeEnd);
    }

    @Test(expected = IOException.class)
    public void testNotWorksfor25Days() throws Exception {
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        ScheduledTime reqTimeEnd = new ScheduledTime("2013-12-27T20:00Z");
        ScheduledTime reqTimeStart = new ScheduledTime("2013-12-02T10:00Z");
        celosClient.getWorkflowStatus(new WorkflowID("workflow-1"), reqTimeStart, reqTimeEnd);
    }

    @Test
    public void testCorrectWorkflowStatesFromDbWf1StartTimeIsAfterEndTime() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        ScheduledTime reqTimeEnd = new ScheduledTime("2013-12-02T20:00Z");
        ScheduledTime reqTimeStart = new ScheduledTime("2013-12-02T21:00Z");
        WorkflowStatus workflowStatus = celosClient.getWorkflowStatus(new WorkflowID("workflow-1"), reqTimeStart,
                reqTimeEnd);
        Assert.assertEquals(workflowStatus.getSlotStates().size(), 0);
    }

    @Test
    public void testLeavesClientOKAfterException() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        File src2 = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/server/slot-db-1").toURI());
        FileUtils.copyDirectory(src2, slotDbDir);

        try {
            celosClient.getSlotState(new WorkflowID("workflow-1"), ScheduledTime.now());
        } catch (Exception e) {

        }
        ScheduledTime existingSlotTime = new ScheduledTime("2013-12-02T19:00:00.000Z");
        celosClient.getSlotState(new WorkflowID("workflow-1"), existingSlotTime);
    }

    @Test
    public void testCorrectWorkflowStatesFromDbWf2() throws Exception {
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        File src2 = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/server/slot-db-1").toURI());
        FileUtils.copyDirectory(src2, slotDbDir);

        ScheduledTime timeStart = new ScheduledTime("2013-11-25T20:00:00.000Z");
        ScheduledTime waitingSlotsTimeEnd = new ScheduledTime("2013-12-02T19:00:00.000Z");

        ScheduledTime time = waitingSlotsTimeEnd;

        List<SlotState> expectedSlotStates = Lists.newArrayList();
        SlotState slotStateRunning = new SlotState(new SlotID(new WorkflowID("workflow-2"), time),
                SlotState.Status.RUNNING, "quux", 2);
        time = time.minusHours(1);
        SlotState slotStateReady = new SlotState(new SlotID(new WorkflowID("workflow-2"), time),
                SlotState.Status.READY);
        time = time.minusHours(1);

        expectedSlotStates.add(slotStateRunning);
        expectedSlotStates.add(slotStateReady);

        while (!time.getDateTime().isBefore(timeStart.getDateTime())) {
            SlotState slotState = new SlotState(new SlotID(new WorkflowID("workflow-2"), time),
                    SlotState.Status.WAITING);
            expectedSlotStates.add(slotState);
            time = time.minusHours(1);
        }

        List<SlotState> resultSlotStates = celosClient
                .getWorkflowStatus(new WorkflowID("workflow-2"), new ScheduledTime("2013-12-02T20:00Z"))
                .getSlotStates();

        Assert.assertEquals(expectedSlotStates, resultSlotStates);
    }

    @Test
    public void testGetSlotState() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        File src2 = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/server/slot-db-1").toURI());
        FileUtils.copyDirectory(src2, slotDbDir);

        WorkflowID workflowID = new WorkflowID("workflow-1");

        ScheduledTime scheduledTime1 = new ScheduledTime("2013-12-02T19:00Z");
        ScheduledTime scheduledTime2 = new ScheduledTime("2013-12-02T18:00Z");

        SlotState slotState1 = celosClient.getSlotState(workflowID, scheduledTime1);
        SlotState slotState2 = celosClient.getSlotState(workflowID, scheduledTime2);

        SlotState expectedSlotState1 = new SlotState(new SlotID(workflowID, scheduledTime1),
                SlotState.Status.RUNNING, "foo-bar", 0);
        SlotState expectedSlotState2 = new SlotState(new SlotID(workflowID, scheduledTime2), SlotState.Status.READY,
                null, 14);

        Assert.assertEquals(expectedSlotState1, slotState1);
        Assert.assertEquals(expectedSlotState2, slotState2);
    }

    @Test(expected = IOException.class)
    public void testGetSlotStateNotFound() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        File src2 = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/server/slot-db-1").toURI());
        FileUtils.copyDirectory(src2, slotDbDir);

        WorkflowID workflowID = new WorkflowID("workflow-1");
        ScheduledTime scheduledTime1 = new ScheduledTime("2000-12-02T19:00Z");

        celosClient.getSlotState(workflowID, scheduledTime1);
    }

    @Test(expected = IOException.class)
    public void testGetSlotStateNotFoundNotExistingWF() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        File src2 = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/server/slot-db-1").toURI());
        FileUtils.copyDirectory(src2, slotDbDir);

        WorkflowID workflowID = new WorkflowID("workflow-doesnt-exist");
        ScheduledTime scheduledTime1 = new ScheduledTime("2000-12-02T19:00Z");

        celosClient.getSlotState(workflowID, scheduledTime1);
    }

    @Test
    public void testRerunSlot() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        celosClient.iterateScheduler();
        celosClient.iterateScheduler();
        celosClient.iterateScheduler();

        WorkflowID workflowID = new WorkflowID("workflow-Itrntinliztin");

        List<SlotState> slotStates = celosClient.getWorkflowStatus(workflowID).getSlotStates();
        Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW);

        SlotState slotStateLst = slotStates.get(slotStates.size() - 1);
        Assert.assertEquals(slotStateLst.getStatus(), SlotState.Status.FAILURE);
        ScheduledTime scheduledTime = slotStateLst.getScheduledTime();

        celosClient.rerunSlot(workflowID, scheduledTime);
        SlotState slotStateUpdated = celosClient.getSlotState(workflowID, scheduledTime);

        Assert.assertEquals(slotStateUpdated.getStatus(), SlotState.Status.WAITING);
    }

    @Test
    public void testRerunSlotWorksNoError() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        WorkflowID workflowID = new WorkflowID("workflow-2");
        celosClient.rerunSlot(workflowID, new ScheduledTime("2013-11-20T12:00Z"));
    }

    @Test(expected = IOException.class)
    public void testRerunSlotFailsNoWorkflow() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        WorkflowID workflowID = new WorkflowID("unknown-workflow");
        celosClient.rerunSlot(workflowID, ScheduledTime.now());
    }

    @Test(expected = IOException.class)
    public void testRerunSlotFailsNoSlot() throws Exception {

        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        WorkflowID workflowID = new WorkflowID("workflow-2");
        celosClient.rerunSlot(workflowID, new ScheduledTime("2013-11-20T12:34Z"));
    }

    @Test
    public void testPauseWorkflow() throws Exception {
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        WorkflowID workflowID = new WorkflowID("workflow-2");

        WorkflowStatus workflowStatus = celosClient.getWorkflowStatus(workflowID);
        List<SlotState> slotStates = workflowStatus.getSlotStates();
        SlotState slotStateLast = slotStates.get(slotStates.size() - 1);
        Assert.assertEquals(slotStateLast.getStatus(), SlotState.Status.WAITING);
        Assert.assertFalse(workflowStatus.isPaused());

        celosClient.setWorkflowPaused(workflowID, true);

        celosClient.iterateScheduler();
        celosClient.iterateScheduler();

        WorkflowStatus workflowStatus2 = celosClient.getWorkflowStatus(workflowID);
        List<SlotState> slotStates2 = workflowStatus2.getSlotStates();
        SlotState slotStateLast2 = workflowStatus2.getSlotStates().get(slotStates2.size() - 1);
        Assert.assertEquals(slotStateLast2.getStatus(), SlotState.Status.WAITING);
        Assert.assertTrue(workflowStatus2.isPaused());

        celosClient.setWorkflowPaused(workflowID, false);

        celosClient.iterateScheduler();
        celosClient.iterateScheduler();

        WorkflowStatus workflowStatus3 = celosClient.getWorkflowStatus(workflowID);
        List<SlotState> slotStates3 = workflowStatus3.getSlotStates();
        SlotState slotStateLast3 = workflowStatus3.getSlotStates().get(slotStates3.size() - 1);
        Assert.assertEquals(slotStateLast3.getStatus(), SlotState.Status.RUNNING);
        Assert.assertFalse(workflowStatus3.isPaused());
    }

    @Test
    public void testKill() throws Exception {
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        ScheduledTime endTime = ScheduledTime.now();

        WorkflowID workflowID = new WorkflowID("workflow-2");

        WorkflowStatus workflowStatus = celosClient.getWorkflowStatus(workflowID, endTime);
        List<SlotState> slotStates = workflowStatus.getSlotStates();
        SlotState slotStateLast = workflowStatus.getSlotStates().get(slotStates.size() - 1);
        Assert.assertEquals(slotStateLast.getStatus(), SlotState.Status.WAITING);

        celosClient.kill(workflowID, slotStateLast.getScheduledTime());

        WorkflowStatus workflowStatus2 = celosClient.getWorkflowStatus(workflowID, endTime);
        List<SlotState> slotStates2 = workflowStatus2.getSlotStates();
        SlotState slotStateLast2 = workflowStatus2.getSlotStates().get(slotStates2.size() - 1);
        Assert.assertEquals(slotStateLast2.getStatus(), SlotState.Status.KILLED);

        celosClient.rerunSlot(workflowID, slotStateLast.getScheduledTime());

        celosClient.iterateScheduler();
        celosClient.iterateScheduler();

        WorkflowStatus workflowStatus3 = celosClient.getWorkflowStatus(workflowID, endTime);
        List<SlotState> slotStates3 = workflowStatus3.getSlotStates();
        SlotState slotStateLast3 = workflowStatus3.getSlotStates().get(slotStates3.size() - 1);
        Assert.assertEquals(slotStateLast3.getStatus(), SlotState.Status.RUNNING);

        celosClient.kill(workflowID, slotStateLast3.getScheduledTime());

        WorkflowStatus workflowStatus4 = celosClient.getWorkflowStatus(workflowID, endTime);
        List<SlotState> slotStates4 = workflowStatus4.getSlotStates();
        SlotState slotStateLast4 = workflowStatus4.getSlotStates().get(slotStates4.size() - 1);
        Assert.assertEquals(slotStateLast4.getStatus(), SlotState.Status.KILLED);
    }

    @Test(expected = IOException.class)
    public void testDoesntKillSuccess() throws Exception {
        File src = new File(Thread.currentThread().getContextClassLoader()
                .getResource("com/collective/celos/client/wf-list").toURI());
        FileUtils.copyDirectory(src, workflowsDir);

        ScheduledTime endTime = ScheduledTime.now();

        WorkflowID workflowID = new WorkflowID("workflow-2");

        celosClient.iterateScheduler();
        celosClient.iterateScheduler();
        celosClient.iterateScheduler();

        WorkflowStatus workflowStatus = celosClient.getWorkflowStatus(workflowID, endTime);
        List<SlotState> slotStates = workflowStatus.getSlotStates();
        SlotState slotStateLast = workflowStatus.getSlotStates().get(slotStates.size() - 1);
        Assert.assertEquals(slotStateLast.getStatus(), SlotState.Status.SUCCESS);

        celosClient.kill(workflowID, slotStateLast.getScheduledTime());
    }

    @Test()
    public void testRegisters() throws Exception {
        BucketID bucket1 = new BucketID("foo-bucket-Itrntinliztin");
        BucketID bucket2 = new BucketID("another-bucket-Itrntinliztin");
        RegisterKey key1 = new RegisterKey("bar-key-Itrntinliztin");
        RegisterKey key2 = new RegisterKey("quux-key-Itrntinliztin");
        RegisterKey key3 = new RegisterKey("quux2-key-Itrntinliztin");
        Assert.assertNull(celosClient.getRegister(bucket1, key1));
        Assert.assertNull(celosClient.getRegister(bucket2, key2));
        ObjectNode value1 = Util.MAPPER.createObjectNode();
        value1.put("foo", "Itrntinliztin");
        ObjectNode value2 = Util.MAPPER.createObjectNode();
        value2.put("bar", "Itrntinliztin");
        celosClient.putRegister(bucket1, key1, value1);
        Assert.assertEquals(value1, celosClient.getRegister(bucket1, key1));
        Assert.assertNull(celosClient.getRegister(bucket2, key2));
        celosClient.putRegister(bucket2, key2, value2);
        Assert.assertEquals(value1, celosClient.getRegister(bucket1, key1));
        Assert.assertEquals(value2, celosClient.getRegister(bucket2, key2));
        celosClient.deleteRegister(bucket1, key1);
        Assert.assertNull(celosClient.getRegister(bucket1, key1));
        Assert.assertEquals(value2, celosClient.getRegister(bucket2, key2));
        celosClient.deleteRegister(bucket2, key2);
        Assert.assertNull(celosClient.getRegister(bucket1, key1));
        Assert.assertNull(celosClient.getRegister(bucket2, key2));

        celosClient.putRegister(bucket1, key1, value1);
        celosClient.putRegister(bucket1, key2, value2);
        celosClient.putRegister(bucket1, key3, value1);
        celosClient.deleteRegistersWithPrefix(bucket1, "quux");
        Assert.assertEquals(Arrays.asList(key1), celosClient.getRegisterKeys(bucket1));
    }

    @Test()
    public void testRegisterKeys() throws Exception {
        BucketID bucket1 = new BucketID("foo-bucket-Itrntinliztin");
        BucketID bucket2 = new BucketID("another-bucket-Itrntinliztin");
        RegisterKey key1 = new RegisterKey("bar-key-Itrntinliztin");
        RegisterKey key2 = new RegisterKey("quux-key-Itrntinliztin");
        RegisterKey key3 = new RegisterKey("quux2-key-Itrntinliztin");
        String key1Prefix = "bar";
        String key23Prefix = "quux";
        String prefixDoesntExist = "zxc";

        ObjectNode value1 = Util.MAPPER.createObjectNode();
        value1.put("foo", "Itrntinliztin");

        ObjectNode value3 = Util.MAPPER.createObjectNode();
        value3.put("bar", "Itrntinliztin");

        ObjectNode value2 = Util.MAPPER.createObjectNode();
        value2.put("bar", "Internatiolization");
        celosClient.putRegister(bucket1, key1, value1);
        celosClient.putRegister(bucket1, key2, value2);
        celosClient.putRegister(bucket1, key3, value3);
        celosClient.putRegister(bucket2, key1, value1);
        celosClient.putRegister(bucket2, key2, value2);

        Assert.assertEquals(Lists.newArrayList(key1, key2, key3), celosClient.getRegisterKeys(bucket1));
        Assert.assertEquals(Lists.newArrayList(key1, key2), celosClient.getRegisterKeys(bucket2));
        Assert.assertEquals(Lists.newArrayList(key2, key3), celosClient.getRegisterKeys(bucket1, key23Prefix));
        Assert.assertEquals(Lists.newArrayList(key1), celosClient.getRegisterKeys(bucket1, key1Prefix));
        Assert.assertEquals(Lists.newArrayList(key2), celosClient.getRegisterKeys(bucket2, key23Prefix));
        Assert.assertEquals(Lists.newArrayList(key1), celosClient.getRegisterKeys(bucket2, key1Prefix));
        Assert.assertEquals(Collections.emptyList(), celosClient.getRegisterKeys(bucket1, prefixDoesntExist));
        Assert.assertEquals(Collections.emptyList(), celosClient.getRegisterKeys(bucket2, prefixDoesntExist));
    }

    @Test
    public void testRegisterDeleteFailsNoKeyOrPrefix() throws IOException {
        HttpDelete request = new HttpDelete(celosClient.getAddress() + "/register");
        HttpResponse response = new DefaultHttpClient().execute(request);
        Assert.assertEquals(response.getStatusLine().getStatusCode(), 400);
    }

}