You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myriad.apache.org by da...@apache.org on 2016/07/12 18:51:41 UTC

[1/2] incubator-myriad git commit: MYRIAD-200

Repository: incubator-myriad
Updated Branches:
  refs/heads/master 6354ce6ac -> 4a6e50c41


http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/fgs/OfferLifeCycleManagerTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/fgs/OfferLifeCycleManagerTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/fgs/OfferLifeCycleManagerTest.java
new file mode 100644
index 0000000..a16e8e6
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/fgs/OfferLifeCycleManagerTest.java
@@ -0,0 +1,54 @@
+package org.apache.myriad.scheduler.fgs;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.apache.hadoop.net.NodeBase;
+import org.apache.hadoop.yarn.api.records.impl.pb.NodeIdPBImpl;
+import org.apache.hadoop.yarn.api.records.impl.pb.ResourcePBImpl;
+import org.apache.hadoop.yarn.proto.YarnProtos.NodeIdProto;
+import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode;
+import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeImpl;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerNode;
+import org.apache.mesos.Protos.Offer;
+import org.apache.myriad.TestObjectFactory;
+import org.apache.myriad.scheduler.MockSchedulerDriver;
+import org.apache.myriad.scheduler.MyriadDriver;
+import org.apache.myriad.state.MockRMContext;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for OfferLifeCycleManager
+ */
+public class OfferLifeCycleManagerTest {
+  OfferLifecycleManager manager;
+
+  @Before
+  public void setUp() throws Exception {
+    NodeStore store = new NodeStore();
+    NodeIdProto nodeId = NodeIdProto.newBuilder().setHost("localhost").setPort(8000).build();
+    RMNode rmNode = new RMNodeImpl(new NodeIdPBImpl(nodeId), new MockRMContext(), "localhost", 8000, 8070, new NodeBase(),
+            new ResourcePBImpl(), "1.0");
+    SchedulerNode node = new FiCaSchedulerNode(rmNode, false);
+    store.add(node);
+    manager = new OfferLifecycleManager(store, new MyriadDriver(new MockSchedulerDriver()));
+  }
+  
+  @Test
+  public void testAddOffers() throws Exception {
+    manager.addOffers(TestObjectFactory.getOffer("localhost", "slave-1", "mock-framework", "offer-1"));
+    assertNotNull(manager.getOfferFeed("localhost").poll());
+  }
+
+  @Test
+  public void testMarkAsConsumed() throws Exception {
+    Offer offer = TestObjectFactory.getOffer("localhost-1", "slave-2", "mock-framework", "consumed-offer-1");
+    manager.addOffers(offer);
+    manager.markAsConsumed(offer);
+    ConsumedOffer cOffers = manager.getConsumedOffer("localhost-1");
+    Offer cOffer = cOffers.getOffers().get(0);
+    assertEquals(offer, cOffer);
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/fgs/OfferUtilsTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/fgs/OfferUtilsTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/fgs/OfferUtilsTest.java
new file mode 100644
index 0000000..915ac0b
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/fgs/OfferUtilsTest.java
@@ -0,0 +1,74 @@
+package org.apache.myriad.scheduler.fgs;
+
+import java.util.List;
+
+import org.apache.mesos.Protos;
+import org.apache.mesos.Protos.FrameworkID;
+import org.apache.mesos.Protos.Offer;
+import org.apache.mesos.Protos.OfferID;
+import org.apache.mesos.Protos.Resource;
+import org.apache.mesos.Protos.SlaveID;
+import org.apache.mesos.Protos.Value;
+import org.apache.mesos.Protos.Value.Scalar;
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Unit tests for OfferUtils
+ */
+public class OfferUtilsTest {
+
+  List<Offer> offers;
+
+  @Before
+  public void setUp() throws Exception {
+    offers = generateOffers(generateResources());
+  }
+
+  private List<Offer> generateOffers(List<Resource> resources) {
+    FrameworkID fidOne = Protos.FrameworkID.newBuilder().setValue("framework-1").build();
+    FrameworkID fidTwo = Protos.FrameworkID.newBuilder().setValue("framework-2").build();
+    FrameworkID fidThree = Protos.FrameworkID.newBuilder().setValue("framework-3").build();
+    FrameworkID fidFour = Protos.FrameworkID.newBuilder().setValue("framework-4").build();
+
+    OfferID oidOne = Protos.OfferID.newBuilder().setValue("offer-1").build();
+    OfferID oidTwo = Protos.OfferID.newBuilder().setValue("offer-2").build(); 
+    OfferID oidThree = Protos.OfferID.newBuilder().setValue("offer-3").build(); 
+    OfferID oidFour = Protos.OfferID.newBuilder().setValue("offer-4").build(); 
+
+    SlaveID sidOne = Protos.SlaveID.newBuilder().setValue("slave-1").build();
+    SlaveID sidTwo = Protos.SlaveID.newBuilder().setValue("slave-2").build();
+    SlaveID sidThree = Protos.SlaveID.newBuilder().setValue("slave-3").build();
+    SlaveID sidFour = Protos.SlaveID.newBuilder().setValue("slave-4").build();
+
+    Offer offerOne = Protos.Offer.newBuilder().setFrameworkId(fidOne).setHostname("10.0.0.1").setId(oidOne).setSlaveId(sidOne).
+        addResources(resources.get(0)).addResources(resources.get(1)).build();
+    Offer offerTwo = Protos.Offer.newBuilder().setFrameworkId(fidTwo).setHostname("10.0.0.2").setId(oidTwo).setSlaveId(sidTwo).
+        addResources(resources.get(2)).addResources(resources.get(3)).build();
+    Offer offerThree = Protos.Offer.newBuilder().setFrameworkId(fidThree).setHostname("10.0.0.3").setId(oidThree).setSlaveId(sidThree).
+        addResources(resources.get(0)).addResources(resources.get(3)).build();
+    Offer offerFour = Protos.Offer.newBuilder().setFrameworkId(fidFour).setHostname("10.0.0.4").setId(oidFour).setSlaveId(sidFour).
+        addResources(resources.get(2)).addResources(resources.get(1)).build();
+
+    return Lists.newArrayList(offerOne, offerTwo, offerThree, offerFour);
+  }
+  
+  private List<Resource> generateResources() {
+    Resource rOne = Protos.Resource.newBuilder().setName("cpus").setType(Value.Type.SCALAR).setScalar(Scalar.newBuilder().setValue(0.5)).build();
+    Resource rTwo = Protos.Resource.newBuilder().setName("mem").setType(Value.Type.SCALAR).setScalar(Scalar.newBuilder().setValue(1.0)).build();
+    Resource rThree = Protos.Resource.newBuilder().setName("cpus").setType(Value.Type.SCALAR).setScalar(Scalar.newBuilder().setValue(1.0)).build();
+    Resource rFour = Protos.Resource.newBuilder().setName("mem").setType(Value.Type.SCALAR).setScalar(Scalar.newBuilder().setValue(2.0)).build();
+    
+    return Lists.newArrayList(rOne, rTwo, rThree, rFour);
+  }
+  
+  @Test
+  public void testgetYarnResourcesFromMesosOffers() throws Exception {
+    org.apache.hadoop.yarn.api.records.Resource resource = OfferUtils.getYarnResourcesFromMesosOffers(offers);
+    assertEquals(6.0, resource.getMemory(), 1.0);
+    assertEquals(3.0, resource.getVirtualCores(), 1.0);
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/state/ClusterTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/state/ClusterTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/state/ClusterTest.java
new file mode 100644
index 0000000..69954b7
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/state/ClusterTest.java
@@ -0,0 +1,62 @@
+package org.apache.myriad.state;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.myriad.scheduler.ServiceResourceProfile;
+import org.apache.myriad.scheduler.constraints.LikeConstraint;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for Cluster
+ */
+public class ClusterTest {
+  Cluster cluster;
+  NodeTask task1, task2, task3;
+
+  @Before
+  public void setUp() throws Exception {
+    cluster = new Cluster();
+    cluster.setClusterName("test-cluster");
+    cluster.setMinQuota(5.0);
+    cluster.setResourceManagerHost("localhost");
+    cluster.setResourceManagerPort("8192");
+
+    task1 = new NodeTask(new ServiceResourceProfile("profile1", 0.1, 1024.0), new LikeConstraint("hostname1", "host-[0-9]*.example1.com"));
+    task2 = new NodeTask(new ServiceResourceProfile("profile2", 0.2, 1024.0), new LikeConstraint("hostname2", "host-[0-9]*.example2.com"));
+    task3 = new NodeTask(new ServiceResourceProfile("profile3", 0.3, 1024.0), new LikeConstraint("hostname3", "host-[0-9]*.example3.com"));
+  }
+
+  private void resetCluster() throws Exception {
+    cluster.removeAllNodes();
+  }
+
+  @Test
+  public void testCoreAttributes() throws Exception {
+    assertEquals("test-cluster", cluster.getClusterName());
+    assertEquals(5.0, cluster.getMinQuota(), 0.0001);
+    assertEquals("localhost", cluster.getResourceManagerHost());
+    assertEquals("8192", cluster.getResourceManagerPort());  
+  }
+
+  @Test
+  public void testAddNode() throws Exception {
+    resetCluster();
+    cluster.addNode(task1);
+    assertEquals(1, cluster.getNodes().size());
+    cluster.addNode(task2);
+    assertEquals(2, cluster.getNodes().size());
+  }
+
+  @Test
+  public void testRemoveNode() throws Exception {
+    resetCluster();
+    cluster.addNode(task1);
+    cluster.addNode(task2);
+    cluster.addNode(task3);
+    cluster.removeNode(task1);
+    assertEquals(2, cluster.getNodes().size());
+    cluster.removeNode(task2);
+    assertEquals(1, cluster.getNodes().size());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/state/MockDispatcher.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/state/MockDispatcher.java b/myriad-scheduler/src/test/java/org/apache/myriad/state/MockDispatcher.java
new file mode 100644
index 0000000..bc06441
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/state/MockDispatcher.java
@@ -0,0 +1,32 @@
+package org.apache.myriad.state;
+
+import org.apache.hadoop.yarn.event.Dispatcher;
+import org.apache.hadoop.yarn.event.EventHandler;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppEvent;
+
+/**
+ * Mock Dispatcher implementation for unit tests
+ */
+public class MockDispatcher implements Dispatcher {
+  EventHandler<RMAppEvent> handler = new MockEventHandler();
+
+  /**
+   * Mock EventHandler implementation for unit tests
+   */
+  public static class MockEventHandler implements EventHandler<RMAppEvent> {
+    @Override
+    public void handle(RMAppEvent event) {
+      //noop
+    }  
+  }
+
+  @Override
+  public EventHandler<RMAppEvent> getEventHandler() {
+    return handler;
+  }
+
+  @Override
+  public void register(Class<? extends Enum> eventType, EventHandler handler) {
+    //noop
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/state/MockFuture.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/state/MockFuture.java b/myriad-scheduler/src/test/java/org/apache/myriad/state/MockFuture.java
new file mode 100644
index 0000000..fa4628f
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/state/MockFuture.java
@@ -0,0 +1,44 @@
+package org.apache.myriad.state;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.apache.mesos.state.Variable;
+
+/**
+ * Stubbed-out implementation for unit tests
+ */
+public class MockFuture implements Future<Variable> {
+  private Variable value;
+
+  public MockFuture(Variable value) {
+    this.value = value;
+  }
+  @Override
+  public boolean cancel(boolean mayInterruptIfRunning) {
+    return false;
+  }
+
+  @Override
+  public boolean isCancelled() {
+    return false;
+  }
+
+  @Override
+  public boolean isDone() {
+    return false;
+  }
+
+  @Override
+  public Variable get() throws InterruptedException, ExecutionException {
+    return value;
+  }
+
+  @Override
+  public Variable get(long timeout, TimeUnit unit)
+        throws InterruptedException, ExecutionException, TimeoutException {
+    return value;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/state/MockRMApp.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/state/MockRMApp.java b/myriad-scheduler/src/test/java/org/apache/myriad/state/MockRMApp.java
new file mode 100644
index 0000000..822c08a
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/state/MockRMApp.java
@@ -0,0 +1,202 @@
+package org.apache.myriad.state;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
+import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
+import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
+import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
+import org.apache.hadoop.yarn.api.records.NodeId;
+import org.apache.hadoop.yarn.api.records.Priority;
+import org.apache.hadoop.yarn.api.records.ReservationId;
+import org.apache.hadoop.yarn.api.records.ResourceRequest;
+import org.apache.hadoop.yarn.api.records.YarnApplicationState;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppMetrics;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
+import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode;
+
+/**
+ * Mock RMApp for unit tests
+ */
+public class MockRMApp implements RMApp {
+  static final int DT = 1000000;
+  String user = "yarn";
+  String name = "mock-app";
+  String queue = "mock-queue";
+  long start = System.currentTimeMillis();
+  long submit = start - (5 * DT);
+  long finish = start + (15 * DT);
+  RMAppState state = RMAppState.NEW;
+  String applicationType = "mock";
+  ApplicationId id;
+  ApplicationSubmissionContext context;
+  String tUrl = "localhost:8080";
+  String oUrl = "localhost:8081";
+  int maxAppAttempts = 5;
+  
+  Map<ApplicationAttemptId, RMAppAttempt> attempts = new HashMap<ApplicationAttemptId, RMAppAttempt>();
+
+  public MockRMApp(int newId, long time, RMAppState state) {
+    finish = time;
+    id = ApplicationId.newInstance(System.currentTimeMillis(), newId);
+    context = ApplicationSubmissionContext.newInstance(id, name, queue, Priority.newInstance(0), null, false, false, newId, null, applicationType);
+    this.state = state;
+  }
+  
+  @Override
+  public void handle(RMAppEvent event) {
+
+  }
+
+  @Override
+  public ApplicationId getApplicationId() {
+    return id;
+  }
+
+  @Override
+  public ApplicationSubmissionContext getApplicationSubmissionContext() {
+    return context;
+  }
+
+  @Override
+  public RMAppState getState() {
+    return state;
+  }
+
+  @Override
+  public String getUser() {
+    return user;
+  }
+
+  @Override
+  public float getProgress() {
+    return 0;
+  }
+
+  @Override
+  public RMAppAttempt getRMAppAttempt(ApplicationAttemptId appAttemptId) {
+    return null;
+  }
+
+  @Override
+  public String getQueue() {
+    return queue;
+  }
+
+  @Override
+  public void setQueue(String queue) {
+    this.queue = queue;
+  }
+
+  @Override
+  public String getName() {
+    return name;
+  }
+
+  @Override
+  public RMAppAttempt getCurrentAppAttempt() {
+    return null;
+  }
+
+  @Override
+  public Map<ApplicationAttemptId, RMAppAttempt> getAppAttempts() {
+    return attempts;
+  }
+
+  @Override
+  public ApplicationReport createAndGetApplicationReport(String clientUserName, boolean allowAccess) {
+    return null;
+  }
+
+  @Override
+  public int pullRMNodeUpdates(Collection<RMNode> updatedNodes) {
+    return 0;
+  }
+
+  @Override
+  public long getFinishTime() {
+    return finish;
+  }
+
+  @Override
+  public long getStartTime() {
+    return start;
+  }
+
+  @Override
+  public long getSubmitTime() {
+    return submit;
+  }
+
+  @Override
+  public String getTrackingUrl() {
+    return this.tUrl;
+  }
+
+  @Override
+  public String getOriginalTrackingUrl() {
+    return this.oUrl;
+  }
+
+  @Override
+  public StringBuilder getDiagnostics() {
+    return null;
+  }
+
+  @Override
+  public FinalApplicationStatus getFinalApplicationStatus() {
+    return null;
+  }
+
+  @Override
+  public int getMaxAppAttempts() {
+    return this.maxAppAttempts;
+  }
+
+  @Override
+  public String getApplicationType() {
+    return this.applicationType;
+  }
+
+  @Override
+  public Set<String> getApplicationTags() {
+    return null;
+  }
+
+  @Override
+  public boolean isAppFinalStateStored() {
+    return false;
+  }
+
+  @Override
+  public Set<NodeId> getRanNodes() {
+    return null;
+  }
+
+  @Override
+  public YarnApplicationState createApplicationState() {
+    return null;
+  }
+
+  @Override
+  public RMAppMetrics getRMAppMetrics() {
+    return null;
+  }
+
+  @Override
+  public ReservationId getReservationId() {
+    return null;
+  }
+
+  @Override
+  public ResourceRequest getAMResourceRequest() {
+    return null;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/state/MockRMContext.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/state/MockRMContext.java b/myriad-scheduler/src/test/java/org/apache/myriad/state/MockRMContext.java
new file mode 100644
index 0000000..42fa045
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/state/MockRMContext.java
@@ -0,0 +1,339 @@
+package org.apache.myriad.state;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.ha.HAServiceProtocol;
+import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState;
+import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.api.records.NodeId;
+import org.apache.hadoop.yarn.conf.ConfigurationProvider;
+import org.apache.hadoop.yarn.event.Dispatcher;
+import org.apache.hadoop.yarn.server.resourcemanager.AdminService;
+import org.apache.hadoop.yarn.server.resourcemanager.ApplicationMasterService;
+import org.apache.hadoop.yarn.server.resourcemanager.ClientRMService;
+import org.apache.hadoop.yarn.server.resourcemanager.NodesListManager;
+import org.apache.hadoop.yarn.server.resourcemanager.RMActiveServiceContext;
+import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.ResourceTrackerService;
+import org.apache.hadoop.yarn.server.resourcemanager.ahs.RMApplicationHistoryWriter;
+import org.apache.hadoop.yarn.server.resourcemanager.metrics.SystemMetricsPublisher;
+import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
+import org.apache.hadoop.yarn.server.resourcemanager.recovery.RMStateStore;
+import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationSystem;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.AMLivelinessMonitor;
+import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.ContainerAllocationExpirer;
+import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
+import org.apache.hadoop.yarn.server.resourcemanager.security.AMRMTokenSecretManager;
+import org.apache.hadoop.yarn.server.resourcemanager.security.ClientToAMTokenSecretManagerInRM;
+import org.apache.hadoop.yarn.server.resourcemanager.security.DelegationTokenRenewer;
+import org.apache.hadoop.yarn.server.resourcemanager.security.NMTokenSecretManagerInRM;
+import org.apache.hadoop.yarn.server.resourcemanager.security.RMContainerTokenSecretManager;
+import org.apache.hadoop.yarn.server.resourcemanager.security.RMDelegationTokenSecretManager;
+
+/**
+ * Mock implementation of RMContext for the purposes of JUnit tests
+ */
+public class MockRMContext implements RMContext {
+  Dispatcher dispatcher;
+  boolean haEnabled = false;
+  RMStateStore stateStore;
+  AMLivelinessMonitor amLivelinessMonitor;
+  AMLivelinessMonitor amFinishingMonitor;
+  RMActiveServiceContext activeServiceContext;
+  HAServiceState haServiceState = HAServiceProtocol.HAServiceState.INITIALIZING;
+  Configuration yarnConfiguration;
+  RMNodeLabelsManager mgr;
+  ResourceScheduler resourceScheduler;
+  boolean workPreservingRecoveryEnabled;
+  NMTokenSecretManagerInRM nmTokenSecretManager;
+  RMApplicationHistoryWriter rmApplicationHistoryWriter = new RMApplicationHistoryWriter();
+  RMDelegationTokenSecretManager delegationTokenSecretManager;
+  RMContainerTokenSecretManager containerTokenSecretManager;
+  NodesListManager nodesListManager;
+  ContainerAllocationExpirer containerAllocationExpirer;
+  AMRMTokenSecretManager tokenSecretManager;
+  DelegationTokenRenewer delegationTokenRenewer;
+  ClientRMService clientRMService;
+  ApplicationMasterService applicationMasterService;
+  ResourceTrackerService resourceTrackerService;
+  SystemMetricsPublisher systemMetricsPublisher;
+  ConfigurationProvider configurationProvider;
+  AdminService adminService;
+  
+  public void setApplicationMasterService(ApplicationMasterService applicationMasterService) {
+    this.applicationMasterService = applicationMasterService;
+  }
+
+  public RMActiveServiceContext getActiveServiceContext() {
+    return activeServiceContext;
+  }
+
+  public void setActiveServiceContext(RMActiveServiceContext activeServiceContext) {
+    this.activeServiceContext = activeServiceContext;
+  }
+
+  public void setResourceTrackerService(ResourceTrackerService resourceTrackerService) {
+    this.resourceTrackerService = resourceTrackerService;
+  }
+
+  public void setContainerTokenSecretManager(RMContainerTokenSecretManager containerTokenSecretManager) {
+    this.containerTokenSecretManager = containerTokenSecretManager;
+  }
+
+  public void setDelegationTokenRenewer(DelegationTokenRenewer delegationTokenRenewer) {
+    this.delegationTokenRenewer = delegationTokenRenewer;
+  }
+
+  public void setAdminService(AdminService adminService) {
+    this.adminService = adminService;
+  }
+
+  public void setConfigurationProvider(ConfigurationProvider configurationProvider) {
+    this.configurationProvider = configurationProvider;
+  }
+
+  public void setDelegationTokenSecretManager(RMDelegationTokenSecretManager delegationTokenSecretManager) {
+    this.delegationTokenSecretManager = delegationTokenSecretManager;
+  }
+
+  public void setTokenSecretManager(AMRMTokenSecretManager tokenSecretManager) {
+    this.tokenSecretManager = tokenSecretManager;
+  }
+
+  public void setContainerAllocationExpirer(ContainerAllocationExpirer containerAllocationExpirer) {
+    this.containerAllocationExpirer = containerAllocationExpirer;
+  }
+
+  public void setNodesListManager(NodesListManager nodesListManager) {
+    this.nodesListManager = nodesListManager;
+  }
+
+  public void setNmTokenSecretManager(NMTokenSecretManagerInRM nmTokenSecretManager) {
+    this.nmTokenSecretManager = nmTokenSecretManager;
+  }
+
+  public void setWorkPreservingRecoveryEnabled(boolean workPreservingRecoveryEnabled) {
+    this.workPreservingRecoveryEnabled = workPreservingRecoveryEnabled;
+  }
+
+  public void setResourceScheduler(ResourceScheduler resourceScheduler) {
+    this.resourceScheduler = resourceScheduler;
+  }
+
+  public void setMgr(RMNodeLabelsManager mgr) {
+    this.mgr = mgr;
+  }
+
+  public void setYarnConfiguration(Configuration yarnConfiguration) {
+    this.yarnConfiguration = yarnConfiguration;
+  }
+  
+  public void setHaEnabled(boolean haEnabled) {
+    this.haEnabled = haEnabled;
+  }
+
+  public void setAmLivelinessMonitor(AMLivelinessMonitor amLivelinessMonitor) {
+    this.amLivelinessMonitor = amLivelinessMonitor;
+  }
+
+  public void setAmFinishingMonitor(AMLivelinessMonitor amFinishingMonitor) {
+    this.amFinishingMonitor = amFinishingMonitor;
+  }
+
+  public void setDispatcher(Dispatcher dispatcher) {
+    this.dispatcher = dispatcher;
+  }
+
+  public void setStateStore(RMStateStore stateStore) {
+    this.stateStore = stateStore;
+  }
+
+  @Override
+  public Dispatcher getDispatcher() {
+    return dispatcher;
+  }
+
+  @Override
+  public boolean isHAEnabled() {
+    return haEnabled;
+  }
+
+  @Override
+  public HAServiceState getHAServiceState() {
+    return haServiceState;
+  }
+
+  @Override
+  public RMStateStore getStateStore() {
+    return stateStore;
+  }
+
+  @Override
+  public ConcurrentMap<ApplicationId, RMApp> getRMApps() {
+    return null;
+  }
+
+  @Override
+  public ConcurrentMap<ApplicationId, ByteBuffer> getSystemCredentialsForApps() {
+    return null;
+  }
+
+  @Override
+  public ConcurrentMap<String, RMNode> getInactiveRMNodes() {
+    return null;
+  }
+
+  @Override
+  public ConcurrentMap<NodeId, RMNode> getRMNodes() {
+    return null;
+  }
+
+  @Override
+  public AMLivelinessMonitor getAMLivelinessMonitor() {
+    return amLivelinessMonitor;
+  }
+
+  @Override
+  public AMLivelinessMonitor getAMFinishingMonitor() {
+    return amFinishingMonitor;
+  }
+
+  @Override
+  public ContainerAllocationExpirer getContainerAllocationExpirer() {
+    return containerAllocationExpirer;
+  }
+
+  @Override
+  public DelegationTokenRenewer getDelegationTokenRenewer() {
+    return delegationTokenRenewer;
+  }
+
+  @Override
+  public AMRMTokenSecretManager getAMRMTokenSecretManager() {
+    return tokenSecretManager;
+  }
+
+  @Override
+  public RMContainerTokenSecretManager getContainerTokenSecretManager() {
+    return containerTokenSecretManager;
+  }
+
+  @Override
+  public NMTokenSecretManagerInRM getNMTokenSecretManager() {
+    return nmTokenSecretManager;
+  }
+
+  @Override
+  public ResourceScheduler getScheduler() {
+    return resourceScheduler;
+  }
+
+  @Override
+  public NodesListManager getNodesListManager() {
+    return nodesListManager;
+  }
+
+  @Override
+  public ClientToAMTokenSecretManagerInRM getClientToAMTokenSecretManager() {
+    return null;
+  }
+
+  @Override
+  public AdminService getRMAdminService() {
+    return adminService;
+  }
+
+  @Override
+  public ClientRMService getClientRMService() {
+    return clientRMService;
+  }
+
+  @Override
+  public ApplicationMasterService getApplicationMasterService() {
+    return applicationMasterService;
+  }
+
+  @Override
+  public ResourceTrackerService getResourceTrackerService() {
+    return resourceTrackerService;
+  }
+
+  @Override
+  public void setClientRMService(ClientRMService clientRMService) {
+    this.clientRMService = clientRMService;
+  }
+
+  @Override
+  public RMDelegationTokenSecretManager getRMDelegationTokenSecretManager() {
+    return delegationTokenSecretManager;
+  }
+
+  @Override
+  public void setRMDelegationTokenSecretManager(RMDelegationTokenSecretManager delegationTokenSecretManager) {
+    this.delegationTokenSecretManager = delegationTokenSecretManager;
+  }
+
+  @Override
+  public RMApplicationHistoryWriter getRMApplicationHistoryWriter() {
+    return rmApplicationHistoryWriter;
+  }
+
+  @Override
+  public void setRMApplicationHistoryWriter(RMApplicationHistoryWriter rmApplicationHistoryWriter) {
+    this.rmApplicationHistoryWriter = rmApplicationHistoryWriter;
+  }
+
+  @Override
+  public void setSystemMetricsPublisher(SystemMetricsPublisher systemMetricsPublisher) {
+    this.systemMetricsPublisher = systemMetricsPublisher;
+  }
+
+  @Override
+  public SystemMetricsPublisher getSystemMetricsPublisher() {
+    return systemMetricsPublisher;
+  }
+
+  @Override
+  public ConfigurationProvider getConfigurationProvider() {
+    return configurationProvider;
+  }
+
+  @Override
+  public boolean isWorkPreservingRecoveryEnabled() {
+    return workPreservingRecoveryEnabled;
+  }
+
+  @Override
+  public RMNodeLabelsManager getNodeLabelManager() {
+    return mgr;
+  }
+
+  @Override
+  public void setNodeLabelManager(RMNodeLabelsManager mgr) {
+    this.mgr = mgr;
+  }
+
+  @Override
+  public long getEpoch() {
+    return 0;
+  }
+
+  @Override
+  public ReservationSystem getReservationSystem() {
+    return null;
+  }
+
+  @Override
+  public boolean isSchedulerReadyForAllocatingContainers() {
+    return false;
+  }
+
+  @Override
+  public Configuration getYarnConfiguration() {
+    return this.yarnConfiguration;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/state/MockState.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/state/MockState.java b/myriad-scheduler/src/test/java/org/apache/myriad/state/MockState.java
new file mode 100644
index 0000000..ba29ff8
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/state/MockState.java
@@ -0,0 +1,45 @@
+package org.apache.myriad.state;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.concurrent.Future;
+
+import org.apache.mesos.state.State;
+import org.apache.mesos.state.Variable;
+
+/**
+ * Stubbed-out implementation for unit tests
+ */
+public class MockState implements State {
+  private Map<String, Future<Variable>> values = new HashMap<String, Future<Variable>>();
+
+  @Override
+  public Future<Variable> fetch(String name) {
+    return values.get(name);
+  }
+
+  @Override
+  public Future<Variable> store(Variable variable) {
+    MockFuture future = new MockFuture(variable);
+    
+    if (!(variable instanceof MockVariable)) {
+      throw new IllegalArgumentException("The Variable must be a MockVariable");
+    }
+    
+    MockVariable mVar = (MockVariable) variable;
+    values.put(mVar.name(), future);
+
+    return future;
+  }
+
+  @Override
+  public Future<Boolean> expunge(Variable variable) {
+    return null;
+  }
+
+  @Override
+  public Future<Iterator<String>> names() {
+    return null;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/state/MockVariable.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/state/MockVariable.java b/myriad-scheduler/src/test/java/org/apache/myriad/state/MockVariable.java
new file mode 100644
index 0000000..06655e3
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/state/MockVariable.java
@@ -0,0 +1,35 @@
+package org.apache.myriad.state;
+
+import org.apache.mesos.state.Variable;
+
+/**
+ * Simplified implementation for unit tests
+ */
+public class MockVariable extends Variable {
+  private byte[] value;
+  private String name;
+  public MockVariable(){}
+ 
+  public MockVariable setValue(byte[] value) {
+    this.value = value.clone();
+    return this;
+  }
+
+  public MockVariable setName(String name) {
+    this.name = name;
+    return this;
+  }
+
+  @Override
+  public byte[] value() {
+    return this.value.clone();
+  }
+
+  public String name() {
+    return this.name;
+  }
+  @Override
+  public Variable mutate(byte[] value) {
+    return new MockVariable();
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/state/MyriadStateTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/state/MyriadStateTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/state/MyriadStateTest.java
new file mode 100644
index 0000000..e5a378f
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/state/MyriadStateTest.java
@@ -0,0 +1,21 @@
+package org.apache.myriad.state;
+
+import org.apache.mesos.Protos.FrameworkID;
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit test for MyriadState
+ */
+public class MyriadStateTest {
+  @Test
+  public void testSetAndGetFrameworkITask() throws Exception {
+    MockState mState = new MockState();
+    mState.store(new MockVariable().setName("frameworkId").setValue(FrameworkID.newBuilder().setValue("mock-framework").build().toByteArray()));
+
+    MyriadState state = new MyriadState(mState);
+    state.setFrameworkId(FrameworkID.newBuilder().setValue("mock-framework").build());
+
+    assertEquals("mock-framework", state.getFrameworkID().getValue());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/state/NodeTaskTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/state/NodeTaskTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/state/NodeTaskTest.java
new file mode 100644
index 0000000..d3cf2fe
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/state/NodeTaskTest.java
@@ -0,0 +1,40 @@
+package org.apache.myriad.state;
+
+import org.apache.myriad.scheduler.ServiceResourceProfile;
+import org.apache.myriad.scheduler.constraints.LikeConstraint;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit test cases for NodeTask
+ */
+public class NodeTaskTest {
+  NodeTask task;
+
+  @Before
+  public void setUp() throws Exception {    
+    task = new NodeTask(new ServiceResourceProfile("profile", 0.1, 1024.0), new LikeConstraint("hostname", "host-[0-9]*.example.com"));
+    
+    task.setHostname("localhost");
+    task.setTaskPrefix("prefix");
+    task.setProfile(new ServiceResourceProfile("ServiceResourceProfile", 0.1, 1024.0, 0.1, 512.0));
+  }
+  
+  @Test
+  public void testCoreState() throws Exception {
+    Assert.assertEquals("prefix", task.getTaskPrefix());
+    Assert.assertEquals("localhost", task.getHostname());
+  }
+  
+  @Test
+  public void testConstraintState() throws Exception {
+    Assert.assertEquals("LIKE", task.getConstraint().getType().toString());
+  }
+  
+  @Test
+  public void testServiceResourceProfileState() throws Exception {
+    Assert.assertEquals(new Double(1024.0), task.getProfile().getMemory());
+    Assert.assertEquals(new Double(0.1), task.getProfile().getCpus());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/state/SchedulerStateTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/state/SchedulerStateTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/state/SchedulerStateTest.java
new file mode 100644
index 0000000..a3cdf4f
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/state/SchedulerStateTest.java
@@ -0,0 +1,65 @@
+package org.apache.myriad.state;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.util.Set;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.yarn.server.resourcemanager.recovery.MyriadFileSystemRMStateStore;
+import org.apache.mesos.Protos.FrameworkID;
+import org.apache.mesos.Protos.TaskID;
+import org.apache.myriad.TestObjectFactory;
+import org.apache.myriad.scheduler.ServiceResourceProfile;
+import org.apache.myriad.scheduler.constraints.LikeConstraint;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.Sets;
+
+/**
+ * Unit tests for SchedulerState
+ */
+public class SchedulerStateTest {
+  SchedulerState state;
+
+  @Before
+  public void setUp() throws Exception {
+    MyriadFileSystemRMStateStore store = TestObjectFactory.getStateStore(getConfiguration());
+    state = new SchedulerState(store);    
+  }
+
+  @Test
+  public void testSetFrameworkID() throws Exception {
+    state.setFrameworkId(FrameworkID.newBuilder().setValue("mock-framework").build());
+    assertEquals("mock-framework", state.getFrameworkID().get().getValue());
+  }
+  
+  @Test
+  public void testAddAndRemoveTask() throws Exception {
+    NodeTask task1 = new NodeTask(new ServiceResourceProfile("profile1", 0.1, 1024.0), new LikeConstraint("hostname", "host-[0-9]*.example.com"));
+    NodeTask task2 = new NodeTask(new ServiceResourceProfile("profile2", 0.1, 1024.0), new LikeConstraint("hostname", "host-[0-9]*.example.com"));
+    TaskID id1 = TaskID.newBuilder().setValue("mock-task-1").build();
+    TaskID id2 = TaskID.newBuilder().setValue("mock-task-2").build();
+    
+    Set<TaskID> taskIds = Sets.newHashSet(id1, id2);
+    state.addTask(id1, task1);
+    assertNotNull(state.getTask(id1));
+    state.addTask(id2, task2);
+    assertNotNull(state.getTask(id2));
+    assertEquals(2, state.getTasks(taskIds).size());
+    state.removeTask(id1);   
+    assertEquals(1, state.getTasks(taskIds).size());
+    assertNull(state.getTask(id1)); 
+    state.removeTask(id2);   
+    assertEquals(0, state.getTasks(taskIds).size());
+    assertNull(state.getTask(id2)); 
+  }
+
+  private Configuration getConfiguration() {
+    Configuration conf = new Configuration();
+    conf.set("yarn.resourcemanager.fs.state-store.uri", "file:///tmp/");
+    return conf;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/state/utils/ByteBufferSupportTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/state/utils/ByteBufferSupportTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/state/utils/ByteBufferSupportTest.java
new file mode 100644
index 0000000..6794ec2
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/state/utils/ByteBufferSupportTest.java
@@ -0,0 +1,184 @@
+package org.apache.myriad.state.utils;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayOutputStream;
+import java.nio.ByteBuffer;
+import java.util.List;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.mesos.Protos;
+import org.apache.mesos.Protos.CommandInfo;
+import org.apache.mesos.Protos.ExecutorID;
+import org.apache.mesos.Protos.ExecutorInfo;
+import org.apache.mesos.Protos.FrameworkID;
+import org.apache.myriad.scheduler.ServiceResourceProfile;
+import org.apache.myriad.scheduler.constraints.LikeConstraint;
+import org.apache.myriad.state.NodeTask;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Unit tests for ByteBufferSupport class
+ *
+ */
+public class ByteBufferSupportTest {
+
+  private static final byte[] BYTE_ARRAY = getByteArray("e04fd020ea3a6910a2d808002b30309d");
+
+  private NodeTask task;
+
+  @Before
+  public void setUp() throws Exception {
+    task = new NodeTask(new ServiceResourceProfile("profile", 0.1, 1024.0), new LikeConstraint("hostname", "host-[0-9]*.example.com"));    
+    task.setHostname("localhost");
+    task.setTaskPrefix("prefix"); 
+    task.setExecutorInfo(getExecutorInfo());
+  }
+
+  private ExecutorInfo getExecutorInfo() {
+    FrameworkID id = Protos.FrameworkID.newBuilder().setValue("framework1").build();
+    ExecutorID eid = Protos.ExecutorID.newBuilder().setValue("executor1").build();
+    CommandInfo cm = Protos.CommandInfo.newBuilder().setValue("command").build();
+    return ExecutorInfo.newBuilder().setFrameworkId(id).setExecutorId(eid).setCommand(cm).build();
+  }
+
+  private ByteBuffer getByteBuffer(byte[] bytes) {
+    ByteBuffer bb = ByteBuffer.allocate(bytes.length);
+    bb.put(bytes);
+    bb.rewind();  
+    return bb;
+  }
+
+  private static byte[] getByteArray(String s) {
+    int len = s.length();
+    byte[] data = new byte[len / 2];
+    for (int i = 0; i < len; i += 2) {
+      data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 
+        + Character.digit(s.charAt(i + 1), 16));
+    }
+    return data;
+  }
+
+  @Test
+  public void testGetBytes() throws Exception {
+    ByteBuffer bb = getByteBuffer(BYTE_ARRAY);
+    
+    byte[] bytes = ByteBufferSupport.getBytes(bb, bb.capacity());
+    
+    assertEquals(BYTE_ARRAY.length, bytes.length);
+    
+    for (int i = 0, j = bytes.length; i < j; i++) {
+      assertEquals(bytes[i], BYTE_ARRAY[i]);
+    }
+  }
+  
+  @Test
+  public void testFillBuffer() throws Exception {
+    ByteBuffer bb = ByteBufferSupport.fillBuffer(BYTE_ARRAY);
+    ByteBuffer bbCompare = getByteBuffer(BYTE_ARRAY);
+
+    assertEquals(bb, bbCompare); 
+  }
+  
+  @Test
+  public void testNonEmptyAddByteBuffer() throws Exception {
+    ByteBuffer bb = getByteBuffer(BYTE_ARRAY);
+    ByteArrayOutputStream stream = new ByteArrayOutputStream();
+
+    ByteBufferSupport.addByteBuffer(bb, stream);
+    assertEquals(20, stream.size());
+    ByteBufferSupport.addByteBuffer(bb, stream);
+    assertEquals(40, stream.size());
+  }
+  
+  @Test
+  public void testEmptyAddByteBuffer() throws Exception {
+    ByteArrayOutputStream stream = new ByteArrayOutputStream();
+    ByteBuffer bb = getByteBuffer(ArrayUtils.EMPTY_BYTE_ARRAY);
+    ByteBufferSupport.addByteBuffer(bb, stream);
+    assertEquals(0, stream.size());
+  }  
+  
+  @Test
+  public void testNullAddByteBuffer() throws Exception {
+    ByteArrayOutputStream stream = new ByteArrayOutputStream();
+
+    ByteBufferSupport.addByteBuffer(null, stream);
+    assertEquals(0, stream.size());
+  }
+  
+  @Test
+  public void testNonEmptyAddByteBufferList() throws Exception {
+    ByteBuffer bb = getByteBuffer(BYTE_ARRAY);
+    ByteBuffer bbTwo = getByteBuffer(BYTE_ARRAY);
+    ByteArrayOutputStream stream = new ByteArrayOutputStream();
+
+    List<ByteBuffer> bList = Lists.newArrayList(bb, bbTwo);
+    
+    ByteBufferSupport.addByteBuffers(bList, stream);
+    assertEquals(44, stream.size());
+  }
+
+  @Test
+  public void testToIntBuffer() throws Exception {
+    byte[] bytes = ByteBufferSupport.toIntBytes(10);
+    assertEquals(4, bytes.length);
+    assertEquals(10, bytes[0]);
+    assertEquals(0, bytes[1]);
+    assertEquals(0, bytes[2]);
+    assertEquals(0, bytes[3]);
+  }
+
+  @Test
+  public void testNodeTaskToFromByteBuffer() throws Exception {
+    ByteBuffer bb = ByteBufferSupport.toByteBuffer(task);
+    NodeTask sTask = ByteBufferSupport.toNodeTask(bb);
+
+    assertEquals(task.getClass().getName(), sTask.getClass().getName());
+    assertEquals(task.getHostname(), sTask.getHostname());
+    assertEquals(task.getSlaveId(), sTask.getSlaveId());
+    assertEquals(task.getTaskPrefix(), sTask.getTaskPrefix());
+    assertEquals(task.getProfile(), sTask.getProfile());
+    assertEquals(task.getSlaveAttributes(), sTask.getSlaveAttributes());
+    assertEquals(task.getConstraint(), sTask.getConstraint());
+    assertEquals(task.getExecutorInfo(), sTask.getExecutorInfo());
+  }
+
+  @Test
+  public void testFrameworkIDToFromByteBuffer() throws Exception {
+    ByteBuffer bb = ByteBufferSupport.toByteBuffer(getExecutorInfo().getFrameworkId());
+    FrameworkID id = ByteBufferSupport.toFrameworkID(bb);
+
+    assertEquals(getExecutorInfo().getFrameworkId(), id);
+  }
+
+  @Test
+  public void testToString() throws Exception {
+    String output = ByteBufferSupport.toString(ByteBufferSupport.toByteBuffer(task));
+
+    assertTrue(output.contains("\"name\":\"profile\""));
+    assertTrue(output.contains("\"cpus\":0.1"));
+    assertTrue(output.contains("\"memory\":1024.0"));
+    assertTrue(output.contains("\"executorCpu\":0.0"));
+    assertTrue(output.contains("\"executorMemory\":0.0"));
+    assertTrue(output.contains("\"className\":\"org.apache.myriad.scheduler.ServiceResourceProfile\""));
+  }
+
+  public void testExecutorInfoToFromByteBuffer() throws Exception {
+    ExecutorInfo info = getExecutorInfo();   
+    ByteBuffer bb = ByteBufferSupport.toByteBuffer(task);
+    ExecutorInfo bInfo = ByteBufferSupport.toExecutorInfo(bb);
+
+    assertEquals(info.getClass().getName(), bInfo.getClass().getName());
+  }
+
+  public void testGetConstraint() throws Exception {
+    ByteBuffer bb = ByteBufferSupport.toByteBuffer(task);
+
+    assertEquals(task.getConstraint(), ByteBufferSupport.getConstraint(bb));
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/webapp/HttpConnectorProviderTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/webapp/HttpConnectorProviderTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/webapp/HttpConnectorProviderTest.java
new file mode 100644
index 0000000..5c4dd7d
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/webapp/HttpConnectorProviderTest.java
@@ -0,0 +1,22 @@
+package org.apache.myriad.webapp;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.myriad.BaseConfigurableTest;
+import org.junit.Test;
+import org.mortbay.jetty.Connector;
+
+/**
+ * Unit tests for HttpConnectionProvider
+ */
+public class HttpConnectorProviderTest extends BaseConfigurableTest {
+
+  @Test
+  public void testConnector() throws Exception {
+    HttpConnectorProvider provider = new HttpConnectorProvider(cfg);
+    Connector connector = provider.get();
+    assertEquals(8192, connector.getPort());
+    assertEquals("0.0.0.0", connector.getHost());
+    assertEquals("Myriad", connector.getName());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/webapp/MyriadWebServerTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/webapp/MyriadWebServerTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/webapp/MyriadWebServerTest.java
new file mode 100644
index 0000000..31c7119
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/webapp/MyriadWebServerTest.java
@@ -0,0 +1,29 @@
+package org.apache.myriad.webapp;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.myriad.BaseConfigurableTest;
+import org.apache.myriad.TestObjectFactory;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit test cases for MyriadWebServer class
+ */
+public class MyriadWebServerTest extends BaseConfigurableTest {
+  MyriadWebServer webServer;
+
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+    webServer = TestObjectFactory.getMyriadWebServer(cfg);
+  }
+
+  @Test
+  public void testStartStopMyriadWebServer() throws Exception {
+    webServer.start();
+    assertEquals(MyriadWebServer.Status.STARTED, webServer.getStatus());
+    webServer.stop();
+    assertEquals(MyriadWebServer.Status.STOPPED, webServer.getStatus());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/resources/myriad-config-test-default.yml
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/resources/myriad-config-test-default.yml b/myriad-scheduler/src/test/resources/myriad-config-test-default.yml
index 2945bcd..f6f6b58 100644
--- a/myriad-scheduler/src/test/resources/myriad-config-test-default.yml
+++ b/myriad-scheduler/src/test/resources/myriad-config-test-default.yml
@@ -15,8 +15,10 @@
 # specific language governing permissions and limitations
 # under the License.
 
+servedConfigPath: /tmp/myriadEtc
+servedBinaryPath: /tmp/myriadBinary
 mesosMaster: 10.0.2.15:5050
-haEnabled:  true
+haEnabled:  false
 checkpoint: false
 frameworkFailoverTimeout: 44200000
 frameworkName: MyriadTest
@@ -58,7 +60,8 @@ yarnEnvironment:
 mesosAuthenticationPrincipal:
 mesosAuthenticationSecretFilename:
 services:
-   jobhistory:
+   jobhistory:  
+     maxInstances: 1
      jvmMaxMemoryMB: 1024
      cpus: 1
      ports:


[2/2] incubator-myriad git commit: MYRIAD-200

Posted by da...@apache.org.
MYRIAD-200

Increase JUnit Test Coverage

JIRA:
  [MYRIAD-200] https://issues.apache.org/jira/browse/MYRIAD-200

Pull Request:
  Closes #78

Author:    hokiegeek2 <ho...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/incubator-myriad/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-myriad/commit/4a6e50c4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-myriad/tree/4a6e50c4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-myriad/diff/4a6e50c4

Branch: refs/heads/master
Commit: 4a6e50c41ce3098a393c96ff8f55f9d4eb78b390
Parents: 6354ce6
Author: hokiegeek2 <ho...@gmail.com>
Authored: Thu Jun 9 15:03:24 2016 -0400
Committer: darinj <da...@apache.org>
Committed: Tue Jul 12 14:48:32 2016 -0400

----------------------------------------------------------------------
 .../myriad/executor/MyriadExecutorDefaults.java |   6 +-
 .../apache/myriad/executor/NMTaskConfig.java    |   2 +-
 .../recovery/MyriadFileSystemRMStateStore.java  |   5 +-
 .../src/main/java/org/apache/myriad/Main.java   |  30 +-
 .../java/org/apache/myriad/MyriadModule.java    |  22 +-
 .../apache/myriad/health/HealthCheckUtils.java  |  39 ++-
 .../scheduler/ExtendedResourceProfile.java      |  47 ++-
 .../org/apache/myriad/scheduler/NMProfile.java  |  47 ++-
 .../myriad/scheduler/NMProfileManager.java      |  25 +-
 .../scheduler/ServiceResourceProfile.java       |  96 +++++-
 .../scheduler/event/OfferRescindedEvent.java    |   6 +-
 .../handlers/OfferRescindedEventHandler.java    |   5 +-
 .../event/handlers/SlaveLostEventHandler.java   |   1 +
 .../scheduler/fgs/OfferLifecycleManager.java    |   9 +
 .../java/org/apache/myriad/state/Cluster.java   |   4 +
 .../java/org/apache/myriad/state/NodeTask.java  |  15 +-
 .../myriad/state/utils/ByteBufferSupport.java   |  27 +-
 .../apache/myriad/webapp/MyriadWebServer.java   |  21 +-
 .../MyriadFileSystemRMStateStoreTest.java       |  69 ++++
 .../org/apache/myriad/BaseConfigurableTest.java |  35 ++
 .../org/apache/myriad/MultiBindingsTest.java    |  33 +-
 .../org/apache/myriad/TestObjectFactory.java    |  90 +++++
 .../myriad/api/ArtifactsResourceTest.java       |  51 +++
 .../myriad/api/SchedulerStateResourceTest.java  |  58 ++++
 .../configuration/MyriadConfigurationTest.java  |  95 +++---
 .../myriad/health/HealthCheckUtilsTest.java     |  27 ++
 .../health/MesosDriverHealthCheckTest.java      |  69 ++++
 .../myriad/scheduler/MockSchedulerDriver.java   | 124 +++++++
 .../myriad/scheduler/MyriadDriverTest.java      |  43 +++
 .../myriad/scheduler/MyriadOperationsTest.java  | 112 ++++++
 .../myriad/scheduler/NMProfileManagerTest.java  |  63 ++++
 .../scheduler/ServiceResourceProfileTest.java   |  31 ++
 .../scheduler/TaskConstraintsManagerTest.java   |  32 ++
 .../scheduler/TestServiceCommandLine.java       |  27 +-
 .../apache/myriad/scheduler/TestTaskUtils.java  |  41 +--
 .../fgs/OfferLifeCycleManagerTest.java          |  54 +++
 .../myriad/scheduler/fgs/OfferUtilsTest.java    |  74 ++++
 .../org/apache/myriad/state/ClusterTest.java    |  62 ++++
 .../org/apache/myriad/state/MockDispatcher.java |  32 ++
 .../org/apache/myriad/state/MockFuture.java     |  44 +++
 .../java/org/apache/myriad/state/MockRMApp.java | 202 +++++++++++
 .../org/apache/myriad/state/MockRMContext.java  | 339 +++++++++++++++++++
 .../java/org/apache/myriad/state/MockState.java |  45 +++
 .../org/apache/myriad/state/MockVariable.java   |  35 ++
 .../apache/myriad/state/MyriadStateTest.java    |  21 ++
 .../org/apache/myriad/state/NodeTaskTest.java   |  40 +++
 .../apache/myriad/state/SchedulerStateTest.java |  65 ++++
 .../state/utils/ByteBufferSupportTest.java      | 184 ++++++++++
 .../webapp/HttpConnectorProviderTest.java       |  22 ++
 .../myriad/webapp/MyriadWebServerTest.java      |  29 ++
 .../resources/myriad-config-test-default.yml    |   7 +-
 51 files changed, 2455 insertions(+), 207 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-commons/src/main/java/org/apache/myriad/executor/MyriadExecutorDefaults.java
----------------------------------------------------------------------
diff --git a/myriad-commons/src/main/java/org/apache/myriad/executor/MyriadExecutorDefaults.java b/myriad-commons/src/main/java/org/apache/myriad/executor/MyriadExecutorDefaults.java
index bda7ff0..c7e4515 100644
--- a/myriad-commons/src/main/java/org/apache/myriad/executor/MyriadExecutorDefaults.java
+++ b/myriad-commons/src/main/java/org/apache/myriad/executor/MyriadExecutorDefaults.java
@@ -69,9 +69,7 @@ public class MyriadExecutorDefaults {
 
   public static final double DEFAULT_JVM_MAX_MEMORY_MB = 256;
   /**
-   * Default cpus for executor JVM.
+   * Default CPU cores for executor JVM.
    */
   public static final double DEFAULT_CPUS = 0.2;
-
-
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-commons/src/main/java/org/apache/myriad/executor/NMTaskConfig.java
----------------------------------------------------------------------
diff --git a/myriad-commons/src/main/java/org/apache/myriad/executor/NMTaskConfig.java b/myriad-commons/src/main/java/org/apache/myriad/executor/NMTaskConfig.java
index 21d2420..1b250ec 100644
--- a/myriad-commons/src/main/java/org/apache/myriad/executor/NMTaskConfig.java
+++ b/myriad-commons/src/main/java/org/apache/myriad/executor/NMTaskConfig.java
@@ -21,7 +21,7 @@ package org.apache.myriad.executor;
 import java.util.Map;
 
 /**
- * Node Manger Task Configuraiton
+ * Node Manger Task Configuration
  */
 public class NMTaskConfig {
   private String yarnHome;

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStore.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStore.java b/myriad-scheduler/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStore.java
index 923e29d..6257ffc 100644
--- a/myriad-scheduler/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStore.java
+++ b/myriad-scheduler/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStore.java
@@ -32,6 +32,8 @@ import org.apache.myriad.state.utils.StoreContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.annotations.VisibleForTesting;
+
 /**
  * StateStore that stores Myriad state in addition to RM state to DFS.
  */
@@ -70,6 +72,7 @@ public class MyriadFileSystemRMStateStore extends FileSystemRMStateStore impleme
     return null;
   }
 
+  @VisibleForTesting
   @Override
   protected synchronized void startInternal() throws Exception {
     super.startInternal();
@@ -120,7 +123,7 @@ public class MyriadFileSystemRMStateStore extends FileSystemRMStateStore impleme
 
 
   protected void reflectedUpdateFile(Path outputPath, byte[] data) throws InvocationTargetException, IllegalAccessException {
-    Class [] parameters = updateFileMethod.getParameterTypes();
+    Class<?> [] parameters = updateFileMethod.getParameterTypes();
     if (parameters.length == 2 && parameters[0].equals(Path.class) && parameters[1].isArray()) {
       updateFileMethod.invoke(this, outputPath, data);
     } else if (parameters.length == 3 && parameters[0].equals(Path.class) && parameters[1].isArray() && parameters[2].isPrimitive()) {

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/Main.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/Main.java b/myriad-scheduler/src/main/java/org/apache/myriad/Main.java
index e825256..14ab806 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/Main.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/Main.java
@@ -18,19 +18,13 @@
  */
 package org.apache.myriad;
 
-import com.codahale.metrics.JmxReporter;
-import com.codahale.metrics.MetricRegistry;
-import com.codahale.metrics.health.HealthCheckRegistry;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
+
 import org.apache.commons.collections.MapUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
@@ -61,6 +55,12 @@ import org.apache.myriad.webapp.WebAppGuiceModule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.codahale.metrics.JmxReporter;
+import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.health.HealthCheckRegistry;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
 /**
  * Main entry point for myriad scheduler
  */
@@ -76,18 +76,14 @@ public class Main {
   private static Injector injector;
 
   public static void initialize(Configuration hadoopConf, AbstractYarnScheduler yarnScheduler, RMContext rmContext,
-                                InterceptorRegistry registry) throws Exception {
-    ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
-    MyriadConfiguration cfg = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource(
-        "myriad-config-default.yml"), MyriadConfiguration.class);
-
-    MyriadModule myriadModule = new MyriadModule(cfg, hadoopConf, yarnScheduler, rmContext, registry);
+                                InterceptorRegistry registry) throws Exception {       
+    MyriadModule myriadModule = new MyriadModule("myriad-config-default.yml", hadoopConf, yarnScheduler, rmContext, registry);
     MesosModule mesosModule = new MesosModule();
     injector = Guice.createInjector(myriadModule, mesosModule, new WebAppGuiceModule());
 
-    new Main().run(cfg);
+    new Main().run(injector.getInstance(MyriadConfiguration.class));
   }
-
+  
   // TODO (Kannan Rajah) Hack to get injector in unit test.
   public static Injector getInjector() {
     return injector;
@@ -158,10 +154,8 @@ public class Main {
           Long cpu = Long.parseLong(profileResourceMap.get("cpu"));
           Long mem = Long.parseLong(profileResourceMap.get("mem"));
 
-          ServiceResourceProfile serviceProfile = new ExtendedResourceProfile(new NMProfile(profile.getKey(), cpu, mem),
+          ServiceResourceProfile serviceProfile = new ExtendedResourceProfile(new NMProfile(profile.getKey(), cpu, mem), taskUtils.getExecutorCpus(), taskUtils.getExecutorMemory(),
               taskUtils.getNodeManagerCpus(), taskUtils.getNodeManagerMemory());
-          serviceProfile.setExecutorCpu(taskUtils.getExecutorCpus());
-          serviceProfile.setExecutorMemory(taskUtils.getExecutorMemory());
 
           profileManager.add(serviceProfile);
         } else {

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/MyriadModule.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/MyriadModule.java b/myriad-scheduler/src/main/java/org/apache/myriad/MyriadModule.java
index 92add9a..8748dcb 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/MyriadModule.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/MyriadModule.java
@@ -18,11 +18,15 @@
  */
 package org.apache.myriad;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
 import com.google.inject.Scopes;
 import com.google.inject.Singleton;
 import com.google.inject.multibindings.MapBinder;
+
+import java.io.IOException;
 import java.util.Map;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
@@ -68,15 +72,15 @@ public class MyriadModule extends AbstractModule {
   private final RMContext rmContext;
   private InterceptorRegistry interceptorRegistry;
 
-  public MyriadModule(MyriadConfiguration cfg, Configuration hadoopConf, AbstractYarnScheduler yarnScheduler, RMContext rmContext,
+  public MyriadModule(String configFile, Configuration hadoopConf, AbstractYarnScheduler yarnScheduler, RMContext rmContext,
                       InterceptorRegistry interceptorRegistry) {
-    this.cfg = cfg;
+    this.cfg = this.generateMyriadConfiguration(configFile);
     this.hadoopConf = hadoopConf;
     this.yarnScheduler = yarnScheduler;
     this.rmContext = rmContext;
     this.interceptorRegistry = interceptorRegistry;
   }
-
+  
   @Override
   protected void configure() {
     LOGGER.debug("Configuring guice");
@@ -168,4 +172,16 @@ public class MyriadModule extends AbstractModule {
     }
     return cliGenerator;
   }
+  
+  protected MyriadConfiguration generateMyriadConfiguration(String configFile) {
+    ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+
+    try {
+      return mapper.readValue(Thread.currentThread().getContextClassLoader().getResource(
+      configFile), MyriadConfiguration.class);
+    } catch (IOException e) {
+      LOGGER.error("The configFile {} could not be found", configFile);
+      throw new IllegalArgumentException("The configFile cannot be found", e);
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/health/HealthCheckUtils.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/health/HealthCheckUtils.java b/myriad-scheduler/src/main/java/org/apache/myriad/health/HealthCheckUtils.java
index 8abbb57..75ac1f6 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/health/HealthCheckUtils.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/health/HealthCheckUtils.java
@@ -20,6 +20,8 @@ package org.apache.myriad.health;
 
 import java.io.IOException;
 import java.net.Socket;
+
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,15 +32,34 @@ public class HealthCheckUtils {
   private static final Logger LOGGER = LoggerFactory.getLogger(HealthCheckUtils.class);
 
   public static boolean checkHostPort(String connectionString) {
-    String[] split = connectionString.split(":");
-    String serverAddress = split[0];
-    Integer serverPort = Integer.valueOf(split[1]);
-    try (Socket s = new Socket(serverAddress, serverPort)) {
+    String[] hostPort = generateHostPortArray(connectionString);
+    
+    try {
+      createSocket(hostPort);
       return true;
-    } catch (IOException ex) {
-      LOGGER.error("parsing host port", ex);
-    }
-
+    } catch (IOException e) {
+      LOGGER.error("error in connecting to " + hostPort[0] + ":" + hostPort[1], e);
+    } 
+    
     return false;
   }
-}
+
+  private static void createSocket(String[] hostPort) throws IOException {
+    String address = hostPort[0];
+    Integer port = Integer.valueOf(hostPort[1]); 
+
+    Socket s = new Socket(address, port);
+    s.close();
+  }
+
+  private static String[] generateHostPortArray(String connectionString) {
+    String[] split = connectionString.split(":");   
+    if (split.length != 2) {
+      throw new IllegalArgumentException("The Connection String " + connectionString + " is invalid. It must be in <host>:<port> format");
+    } else if (!StringUtils.isNumeric(split[1])) {
+      throw new IllegalArgumentException("The Connection String " + connectionString + " is invalid. The port must be an integer");
+    } else {
+      return split;
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ExtendedResourceProfile.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ExtendedResourceProfile.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ExtendedResourceProfile.java
index 8119360..6232258 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ExtendedResourceProfile.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ExtendedResourceProfile.java
@@ -33,8 +33,21 @@ public class ExtendedResourceProfile extends ServiceResourceProfile {
    * @param cpu
    * @param mem          will throw NullPoiterException if childProfile is null
    */
+  public ExtendedResourceProfile(NMProfile childProfile, Double cpu, Double mem, Double execCpu, Double execMemory) {
+    super(childProfile.getName(), cpu, mem, execCpu, execMemory);
+
+    this.childProfile = childProfile;
+    this.className = ExtendedResourceProfile.class.getName();
+  }
+
+ /**
+  * @param childProfile - should be null
+  * @param cpu
+  * @param mem          will throw NullPoiterException if childProfile is null
+  */
   public ExtendedResourceProfile(NMProfile childProfile, Double cpu, Double mem) {
     super(childProfile.getName(), cpu, mem);
+
     this.childProfile = childProfile;
     this.className = ExtendedResourceProfile.class.getName();
   }
@@ -77,4 +90,36 @@ public class ExtendedResourceProfile extends ServiceResourceProfile {
     Gson gson = new Gson();
     return gson.toJson(this);
   }
-}
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = super.hashCode();
+    result = prime * result + ((childProfile == null) ? 0 : childProfile.hashCode());
+    return result;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (!super.equals(obj)) {
+      return false;
+    }
+    if (getClass() != obj.getClass()) {
+      return false;
+    }
+
+    ExtendedResourceProfile other = (ExtendedResourceProfile) obj;
+
+    if (childProfile == null) {
+      if (other.childProfile != null) {
+        return false;
+      }
+    } else if (!childProfile.equals(other.childProfile)) {
+      return false;
+    }
+    return true;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfile.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfile.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfile.java
index 3de82a5..2215835 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfile.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfile.java
@@ -60,4 +60,49 @@ public class NMProfile {
     return gson.toJson(this);
   }
 
-}
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((cpus == null) ? 0 : cpus.hashCode());
+    result = prime * result + ((memory == null) ? 0 : memory.hashCode());
+    result = prime * result + ((name == null) ? 0 : name.hashCode());
+    return result;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (obj == null) {
+      return false;
+    }
+    if (getClass() != obj.getClass()) {
+      return false;
+    }
+    NMProfile other = (NMProfile) obj;
+    if (cpus == null) {
+      if (other.cpus != null) {
+        return false;
+      }
+    } else if (!cpus.equals(other.cpus)) {
+      return false;
+    }
+    if (memory == null) {
+      if (other.memory != null) {
+        return false;
+      }
+    } else if (!memory.equals(other.memory)) {
+      return false;
+    }
+    if (name == null) {
+      if (other.name != null) {
+        return false;
+      }
+    } else if (!name.equals(other.name)) {
+      return false;
+    }
+    return true;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfileManager.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfileManager.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfileManager.java
index 4256f40..285de5d 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfileManager.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfileManager.java
@@ -18,14 +18,16 @@
  */
 package org.apache.myriad.scheduler;
 
-import com.google.gson.Gson;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Node Manager Profile Manager
+ * NMProfile Manager
  */
 public class NMProfileManager {
   private static final Logger LOGGER = LoggerFactory.getLogger(NMProfileManager.class);
@@ -46,8 +48,21 @@ public class NMProfileManager {
     return this.profiles.containsKey(name);
   }
 
+  public int numberOfProfiles() {
+    return profiles.size();
+  }
+  
+  @Override
   public String toString() {
-    Gson gson = new Gson();
-    return gson.toJson(this);
+    ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE);
+
+    for (Map.Entry<String, NMProfile> profile : profiles.entrySet()) {
+      NMProfile value = profile.getValue();
+      builder.append("name", value.getName());
+      builder.append("cpus", value.getCpus());
+      builder.append("memory", value.getMemory());
+    }
+
+    return builder.toString();
   }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ServiceResourceProfile.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ServiceResourceProfile.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ServiceResourceProfile.java
index 4c033c9..146a80c 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ServiceResourceProfile.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ServiceResourceProfile.java
@@ -28,7 +28,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Resource Profile for any service
+ * Resource Profile for any service 
  */
 public class ServiceResourceProfile {
 
@@ -48,15 +48,21 @@ public class ServiceResourceProfile {
 
   protected Double executorMemory = 0.0;
 
-  protected String className;
+  protected String className = ServiceResourceProfile.class.getName();
 
-  public ServiceResourceProfile(String name, Double cpu, Double mem) {
+  public ServiceResourceProfile(String name, Double cpus, Double mem) {
     this.name = name;
-    this.cpus = cpu;
+    this.cpus = cpus;
     this.memory = mem;
-    this.className = ServiceResourceProfile.class.getName();
   }
 
+  public ServiceResourceProfile(String name, Double cpus, Double mem, Double execCpus, Double execMemory) {
+    this.name = name;
+    this.cpus = cpus;
+    this.memory = mem;
+    this.executorCpu = execCpus;
+    this.executorMemory = execMemory;
+  }
 
   public String getName() {
     return name;
@@ -82,19 +88,10 @@ public class ServiceResourceProfile {
     return executorCpu;
   }
 
-  public void setExecutorCpu(Double executorCpu) {
-    this.executorCpu = executorCpu;
-  }
-
   public Double getExecutorMemory() {
     return executorMemory;
   }
 
-  public void setExecutorMemory(Double executorMemory) {
-    this.executorMemory = executorMemory;
-  }
-
-
   @Override
   public String toString() {
     Gson gson = new Gson();
@@ -125,6 +122,75 @@ public class ServiceResourceProfile {
       }
       return null;
     }
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((className == null) ? 0 : className.hashCode());
+    result = prime * result + ((cpus == null) ? 0 : cpus.hashCode());
+    result = prime * result + ((executorCpu == null) ? 0 : executorCpu.hashCode());
+    result = prime * result + ((executorMemory == null) ? 0 : executorMemory.hashCode());
+    result = prime * result + ((memory == null) ? 0 : memory.hashCode());
+    result = prime * result + ((name == null) ? 0 : name.hashCode());
+    return result;
+  }
 
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (obj == null) {
+      return false;
+    }      
+    if (getClass() != obj.getClass()) {
+      return false;
+    } 
+    ServiceResourceProfile other = (ServiceResourceProfile) obj;
+    if (className == null) {
+      if (other.className != null) {
+        return false;
+      }
+    } else if (!className.equals(other.className)) {
+      return false;
+    }
+    if (cpus == null) {
+      if (other.cpus != null) {
+        return false;
+      }
+    } else if (!cpus.equals(other.cpus)) {
+      return false;
+    }
+    if (executorCpu == null) {
+      if (other.executorCpu != null) {
+        return false;
+      }
+    } else if (!executorCpu.equals(other.executorCpu)) {
+      return false;
+    }
+    if (executorMemory == null) {
+      if (other.executorMemory != null) {
+        return false;
+      }
+    } else if (!executorMemory.equals(other.executorMemory)) {
+      return false;
+    }
+    if (memory == null) {
+      if (other.memory != null) {
+        return false;
+      }
+    } else if (!memory.equals(other.memory)) {
+      return false;
+    }
+    if (name == null) {
+      if (other.name != null) {
+        return false;
+      }
+    } else if (!name.equals(other.name)) {
+      return false;
+    }  
+    return true;
   }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/OfferRescindedEvent.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/OfferRescindedEvent.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/OfferRescindedEvent.java
index 180655c..126cfb8 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/OfferRescindedEvent.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/OfferRescindedEvent.java
@@ -44,4 +44,8 @@ public class OfferRescindedEvent {
     this.offerId = offerId;
   }
 
-}
+  @Override
+  public String toString() {
+    return "OfferRescindedEvent [driver=" + driver + ", offerId=" + offerId + "]";
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/OfferRescindedEventHandler.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/OfferRescindedEventHandler.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/OfferRescindedEventHandler.java
index 85e8043..e49d2b9 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/OfferRescindedEventHandler.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/OfferRescindedEventHandler.java
@@ -31,7 +31,6 @@ public class OfferRescindedEventHandler implements EventHandler<OfferRescindedEv
 
   @Override
   public void onEvent(OfferRescindedEvent event, long sequence, boolean endOfBatch) throws Exception {
-    LOGGER.info("OfferRescinded event: {}", event);
+    LOGGER.info("OfferRescindedEvent for offer id: {} for scheuler {}", event.getOfferId().toString(), event.getDriver().getClass().getName());
   }
-
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/SlaveLostEventHandler.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/SlaveLostEventHandler.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/SlaveLostEventHandler.java
index b1f37bb..9e17f6c 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/SlaveLostEventHandler.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/SlaveLostEventHandler.java
@@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory;
 public class SlaveLostEventHandler implements EventHandler<SlaveLostEvent> {
   private static final Logger LOGGER = LoggerFactory.getLogger(SlaveLostEventHandler.class);
 
+  //TODO (hokiegeek2) Research how else Myriad should respond to this event
   @Override
   public void onEvent(SlaveLostEvent event, long sequence, boolean endOfBatch) throws Exception {
     SlaveID slaveId = event.getSlaveId();

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/fgs/OfferLifecycleManager.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/fgs/OfferLifecycleManager.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/fgs/OfferLifecycleManager.java
index 135158f..e4cec83 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/fgs/OfferLifecycleManager.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/fgs/OfferLifecycleManager.java
@@ -21,13 +21,17 @@ package org.apache.myriad.scheduler.fgs;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+
 import javax.inject.Inject;
+
 import org.apache.mesos.Protos;
 import org.apache.mesos.Protos.Offer;
 import org.apache.myriad.scheduler.MyriadDriver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.annotations.VisibleForTesting;
+
 /**
  * Manages the Mesos offers tracked by Myriad.
  */
@@ -110,4 +114,9 @@ public class OfferLifecycleManager {
       LOGGER.info("Declined {} outstanding offers for host {}", numOutStandingOffers, hostname);
     }
   }
+  
+  @VisibleForTesting
+  public ConsumedOffer getConsumedOffer(String hostname) {
+    return consumedOfferMap.get(hostname);
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/state/Cluster.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/state/Cluster.java b/myriad-scheduler/src/main/java/org/apache/myriad/state/Cluster.java
index a5ccca7..2586720 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/state/Cluster.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/state/Cluster.java
@@ -66,6 +66,10 @@ public class Cluster {
   public void removeNode(NodeTask task) {
     this.nodes.remove(task);
   }
+  
+  public void removeAllNodes() {
+    this.nodes.clear();
+  }
 
   public String getResourceManagerHost() {
     return resourceManagerHost;

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/state/NodeTask.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/state/NodeTask.java b/myriad-scheduler/src/main/java/org/apache/myriad/state/NodeTask.java
index 3a4ee56..5acd7cb 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/state/NodeTask.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/state/NodeTask.java
@@ -21,6 +21,8 @@ package org.apache.myriad.state;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.inject.Inject;
 import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
 import org.apache.mesos.Protos;
 import org.apache.mesos.Protos.Attribute;
 import org.apache.myriad.scheduler.ServiceResourceProfile;
@@ -32,7 +34,7 @@ import org.apache.myriad.scheduler.constraints.Constraint;
  */
 public class NodeTask {
   @JsonProperty
-  private String hostname;
+  private String hostname = StringUtils.EMPTY;
   @JsonProperty
   private Protos.SlaveID slaveId;
   @JsonProperty
@@ -40,21 +42,22 @@ public class NodeTask {
   @JsonProperty
   private String taskPrefix;
   @JsonProperty
-  private ServiceResourceProfile serviceresourceProfile;
+  private ServiceResourceProfile profile;
 
   @Inject
   TaskUtils taskUtils;
+
   /**
    * Mesos executor for this node.
    */
   private Protos.ExecutorInfo executorInfo;
 
   private Constraint constraint;
+  
   private List<Attribute> slaveAttributes;
 
   public NodeTask(ServiceResourceProfile profile, Constraint constraint) {
-    this.serviceresourceProfile = profile;
-    this.hostname = "";
+    this.profile    = profile;
     this.constraint = constraint;
   }
 
@@ -111,10 +114,10 @@ public class NodeTask {
   }
 
   public ServiceResourceProfile getProfile() {
-    return serviceresourceProfile;
+    return profile;
   }
 
   public void setProfile(ServiceResourceProfile serviceresourceProfile) {
-    this.serviceresourceProfile = serviceresourceProfile;
+    this.profile = serviceresourceProfile;
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/state/utils/ByteBufferSupport.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/state/utils/ByteBufferSupport.java b/myriad-scheduler/src/main/java/org/apache/myriad/state/utils/ByteBufferSupport.java
index b473b9e..9b0e643 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/state/utils/ByteBufferSupport.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/state/utils/ByteBufferSupport.java
@@ -28,6 +28,9 @@ import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.ArrayList;
 import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.mesos.Protos;
 import org.apache.myriad.scheduler.ServiceResourceProfile;
@@ -50,7 +53,7 @@ public class ByteBufferSupport {
 
   public static void addByteBuffers(List<ByteBuffer> list, ByteArrayOutputStream bytes) throws IOException {
     // If list, add the list size, then the size of each buffer followed by the buffer.
-    if (list != null) {
+    if (CollectionUtils.isNotEmpty(list)) {
       bytes.write(toIntBytes(list.size()));
       for (ByteBuffer bb : list) {
         addByteBuffer(bb, bytes);
@@ -61,7 +64,7 @@ public class ByteBufferSupport {
   }
 
   public static void addByteBuffer(ByteBuffer bb, ByteArrayOutputStream bytes) throws IOException {
-    if (bb != null && bytes != null) {
+    if (byteBufferNotEmpty(bb)) {
       bytes.write(toIntBytes(bb.array().length));
       bytes.write(bb.array());
     }
@@ -199,16 +202,21 @@ public class ByteBufferSupport {
    */
   public static NodeTask toNodeTask(ByteBuffer bb) {
     NodeTask nt = null;
-    if (bb != null && bb.array().length > 0) {
+    if (byteBufferNotEmpty(bb)) {
       nt = new NodeTask(getServiceResourceProfile(bb), getConstraint(bb));
       nt.setHostname(toString(bb));
       nt.setSlaveId(toSlaveId(bb));
       nt.setTaskStatus(toTaskStatus(bb));
       nt.setExecutorInfo(toExecutorInfo(bb));
+      nt.setTaskPrefix(toString(bb));
     }
     return nt;
   }
 
+  private static boolean byteBufferNotEmpty(ByteBuffer bb) {
+    return bb != null && bb.array().length > 0;
+  }
+  
   public static byte[] getTaskBytes(NodeTask nt) {
     if (nt.getTaskStatus() != null) {
       return nt.getTaskStatus().toByteArray();
@@ -234,7 +242,7 @@ public class ByteBufferSupport {
   }
 
   public static void putBytes(ByteBuffer bb, byte bytes[]) {
-    if (bytes != null && bytes.length > 0) {
+    if (ArrayUtils.isNotEmpty(bytes)) {
       bb.putInt(bytes.length);
       bb.put(bytes);
     } else {
@@ -250,7 +258,7 @@ public class ByteBufferSupport {
 
   /**
    * This assumes the next position is the size as an int, and the following is a string
-   * iff the size is not zero.
+   * if the size is not zero.
    *
    * @param bb ByteBuffer to extract string from
    * @return string from the next position, or "" if the size is zero
@@ -259,7 +267,7 @@ public class ByteBufferSupport {
     byte[] bytes = new byte[bb.getInt()];
     String s = "";
     try {
-      if (bytes.length > 0) {
+      if (ArrayUtils.isNotEmpty(bytes)) {
         bb.get(bytes);
         s = new String(bytes, UTF8);
       }
@@ -279,7 +287,7 @@ public class ByteBufferSupport {
 
   public static ServiceResourceProfile getServiceResourceProfile(ByteBuffer bb) {
     String p = toString(bb);
-    if (!StringUtils.isEmpty(p)) {
+    if (StringUtils.isNotEmpty(p)) {
       return gsonCustom.fromJson(p, ServiceResourceProfile.class);
     } else {
       return null;
@@ -295,7 +303,7 @@ public class ByteBufferSupport {
 
       case LIKE:
 
-        if (!StringUtils.isEmpty(p)) {
+        if (StringUtils.isNotEmpty(p)) {
           return gson.fromJson(p, LikeConstraint.class);
         }
     }
@@ -363,5 +371,4 @@ public class ByteBufferSupport {
   public static ByteBuffer createBuffer(ByteBuffer bb) {
     return fillBuffer(getBytes(bb, bb.getInt()));
   }
-
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/webapp/MyriadWebServer.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/webapp/MyriadWebServer.java b/myriad-scheduler/src/main/java/org/apache/myriad/webapp/MyriadWebServer.java
index 126febc..60ef87d 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/webapp/MyriadWebServer.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/webapp/MyriadWebServer.java
@@ -37,6 +37,11 @@ public class MyriadWebServer {
   private final Connector connector;
   private final GuiceFilter filter;
 
+  /**
+   * Status codes for MyriadWebServer
+   */
+  public enum Status {STARTED, RUNNING, STOPPED, FAILED, UNKNOWN}
+  
   @Inject
   public MyriadWebServer(Server jetty, Connector connector, GuiceFilter filter) {
     this.jetty = jetty;
@@ -71,8 +76,22 @@ public class MyriadWebServer {
     this.jetty.start();
   }
 
+  public Status getStatus() {
+    if (jetty.isFailed()) { 
+      return Status.FAILED;
+    } else if (jetty.isStarted()) {
+      return Status.STARTED;
+    } else if (jetty.isRunning()) {
+      return Status.RUNNING;
+    } else if (jetty.isStopped()) {
+      return Status.STOPPED;
+    } else {
+      return Status.UNKNOWN;
+    }
+  }
+
   public void stop() throws Exception {
     this.jetty.stop();
     this.connector.close();
   }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStoreTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStoreTest.java b/myriad-scheduler/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStoreTest.java
new file mode 100644
index 0000000..a0a9ed1
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStoreTest.java
@@ -0,0 +1,69 @@
+package org.apache.hadoop.yarn.server.resourcemanager.recovery;
+
+import static org.junit.Assert.assertTrue;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.service.Service.STATE;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState;
+import org.apache.myriad.state.MockDispatcher;
+import org.apache.myriad.state.MockRMApp;
+import org.junit.Test;
+
+/**
+ * Unit tests for MyriadFileSystemRMStateStore
+ */
+public class MyriadFileSystemRMStateStoreTest {
+
+  @Test
+  public void testInit() throws Exception {
+    Configuration conf = getConfiguration();
+    MyriadFileSystemRMStateStore store = new MyriadFileSystemRMStateStore();
+    assertTrue(store.isInState(STATE.NOTINITED));
+    store.init(conf);
+    assertTrue(store.isInState(STATE.INITED));
+    store.startInternal();
+    store.close();
+  }
+
+  @Test
+  public void testStartStop() throws Exception {
+    MyriadFileSystemRMStateStore store = getInitializedStore();
+    store.start();    
+    assertTrue(store.isInState(STATE.STARTED));
+    store.stop();
+    assertTrue(store.isInState(STATE.STOPPED));
+    store.close();
+  }
+
+  @Test
+  public void testStoreAndRemoveApplication() throws Exception {
+    MyriadFileSystemRMStateStore store = getInitializedStore();
+    store.start();
+    RMApp appOne = new MockRMApp(0, 0, RMAppState.NEW);
+    RMApp appTwo = new MockRMApp(0, 0, RMAppState.NEW);
+  
+    store.storeNewApplication(appOne);
+    store.storeNewApplication(appTwo);
+    store.removeApplication(appOne);
+    store.removeApplication(appTwo);
+    store.close();
+  }
+
+  private MyriadFileSystemRMStateStore getInitializedStore() throws Exception {
+    Configuration conf = getConfiguration();
+    MyriadFileSystemRMStateStore store = new MyriadFileSystemRMStateStore();  
+    store.init(conf);
+    store.startInternal();
+    store.loadState();   
+    store.loadMyriadState();
+    store.setRMDispatcher(new MockDispatcher());
+    return store;
+  }
+  
+  private Configuration getConfiguration() {
+    Configuration conf = new Configuration();
+    conf.set("yarn.resourcemanager.fs.state-store.uri", "file:///tmp/");
+    return conf;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/BaseConfigurableTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/BaseConfigurableTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/BaseConfigurableTest.java
new file mode 100644
index 0000000..45443fe
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/BaseConfigurableTest.java
@@ -0,0 +1,35 @@
+package org.apache.myriad;
+
+import org.apache.myriad.configuration.MyriadConfiguration;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+
+/**
+ * Base class for all JUnit tests that require a MyriadConfiguration object. This class encapsulates the
+ * logic instantiate and configure a MyriadConfiguration object using all yml config files.
+ * 
+ */
+public class BaseConfigurableTest {
+  protected MyriadConfiguration cfg;
+  protected MyriadConfiguration cfgWithRole;
+  protected MyriadConfiguration cfgWithDocker;
+
+  @Before
+  public void setUp() throws Exception {
+    ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+    cfg = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default.yml"),
+    MyriadConfiguration.class);
+    cfgWithRole = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default-with-framework-role.yml"),
+            MyriadConfiguration.class);
+    cfgWithDocker = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default-with-docker-info.yml"),
+                MyriadConfiguration.class);
+  } 
+
+  @Test
+  public void testMyriadConfiguration() throws Exception {
+    cfg.getFrameworkName();
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/MultiBindingsTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/MultiBindingsTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/MultiBindingsTest.java
index b36f32e..e8cb8b0 100644
--- a/myriad-scheduler/src/test/java/org/apache/myriad/MultiBindingsTest.java
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/MultiBindingsTest.java
@@ -18,15 +18,20 @@
 
 package org.apache.myriad;
 
-import com.google.inject.Guice;
-import com.google.inject.Injector;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
 import java.util.Map;
+
 import org.apache.myriad.scheduler.TaskFactory;
-import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
 
 /**
  * Test for Multibindings
@@ -34,22 +39,17 @@ import static org.junit.Assert.assertNotNull;
 public class MultiBindingsTest {
 
   private static Injector injector;
+  
+  private List<String> keyNames = Lists.newArrayList("nm", "jobhistory", "timelineserver");
 
   @BeforeClass
   public static void setUpBeforeClass() throws Exception {
     MyriadTestModule myriadModule = new MyriadTestModule();
     injector = Guice.createInjector(myriadModule);
-
-  }
-
-  @AfterClass
-  public static void tearDownAfterClass() throws Exception {
   }
 
   @Test
   public void multiBindingsTest() {
-
-
     MultiBindingsUsage myinstance = injector.getInstance(MultiBindingsUsage.class);
 
     Map<String, TaskFactory> taskMap = myinstance.getMap();
@@ -58,12 +58,7 @@ public class MultiBindingsTest {
 
     taskMap = myinstance.getMap();
     for (Map.Entry<String, TaskFactory> entry : taskMap.entrySet()) {
-      String keyName = entry.getKey();
-      TaskFactory taskFactory = entry.getValue();
-      System.out.println(taskFactory);
+      assertTrue(keyNames.contains(entry.getKey()));
     }
-
-
   }
-
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/TestObjectFactory.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/TestObjectFactory.java b/myriad-scheduler/src/test/java/org/apache/myriad/TestObjectFactory.java
new file mode 100644
index 0000000..c0cf187
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/TestObjectFactory.java
@@ -0,0 +1,90 @@
+package org.apache.myriad;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.yarn.server.resourcemanager.recovery.MyriadFileSystemRMStateStore;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerApp;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerNode;
+import org.apache.mesos.Protos;
+import org.apache.mesos.Protos.FrameworkID;
+import org.apache.mesos.Protos.Offer;
+import org.apache.mesos.Protos.OfferID;
+import org.apache.mesos.Protos.SlaveID;
+import org.apache.myriad.configuration.MyriadConfiguration;
+import org.apache.myriad.scheduler.MockSchedulerDriver;
+import org.apache.myriad.scheduler.MyriadDriver;
+import org.apache.myriad.scheduler.MyriadDriverManager;
+import org.apache.myriad.scheduler.yarn.MyriadCapacityScheduler;
+import org.apache.myriad.scheduler.yarn.interceptor.CompositeInterceptor;
+import org.apache.myriad.scheduler.yarn.interceptor.InterceptorRegistry;
+import org.apache.myriad.state.MockDispatcher;
+import org.apache.myriad.state.SchedulerState;
+import org.apache.myriad.webapp.HttpConnectorProvider;
+import org.apache.myriad.webapp.MyriadWebServer;
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.servlet.DefaultServlet;
+import org.mortbay.jetty.servlet.ServletHandler;
+import org.mortbay.jetty.servlet.ServletHolder;
+
+import com.google.inject.servlet.GuiceFilter;
+
+/**
+ * Factory for common objects utilized over 1..n Junit tests
+ */
+public class TestObjectFactory {
+  public static SchedulerState getSchedulerState(MyriadConfiguration cfg) {
+    SchedulerState state = new SchedulerState(new MyriadFileSystemRMStateStore());
+    state.setFrameworkId(FrameworkID.newBuilder().setValue("mock-framework").build());
+    return state;  
+  }
+
+  public static MyriadDriverManager getMyriadDriverManager() {
+    return new MyriadDriverManager(new MyriadDriver(new MockSchedulerDriver()));
+  }
+
+  public static InterceptorRegistry getInterceptorRegistry() {
+    return new CompositeInterceptor();
+  }
+
+  public static AbstractYarnScheduler<FiCaSchedulerApp, FiCaSchedulerNode> getYarnScheduler() {
+    MyriadCapacityScheduler scheduler = new MyriadCapacityScheduler();
+    return scheduler;
+  }
+
+  public static Server getJettyServer() {
+    Server server = new Server();
+    ServletHandler context = new ServletHandler();
+    ServletHolder holder = new ServletHolder(DefaultServlet.class);
+    holder.setInitParameter("resourceBase", System.getProperty("user.dir"));
+    holder.setInitParameter("dirAllowed", "true");
+    context.setServer(server);
+    context.addServlet(holder);
+    server.setHandler(context);    
+
+    return server;
+  }
+
+  public static MyriadWebServer getMyriadWebServer(MyriadConfiguration cfg) {
+    Server server = TestObjectFactory.getJettyServer();
+    HttpConnectorProvider provider = new HttpConnectorProvider(cfg);
+    Connector connector = provider.get();
+    return new MyriadWebServer(server, connector, new GuiceFilter());
+  }
+  
+  public static MyriadFileSystemRMStateStore getStateStore(Configuration conf) throws Exception {
+    conf.set("yarn.resourcemanager.fs.state-store.uri", "file:///tmp/");
+    MyriadFileSystemRMStateStore store = new MyriadFileSystemRMStateStore();
+    store.init(conf);
+    store.start();
+    store.loadState();   
+    store.setRMDispatcher(new MockDispatcher());
+    return store;
+  }
+
+  public static Offer getOffer(String host, String slaveId, String frameworkId, String offerId) {
+    Protos.SlaveID sid = SlaveID.newBuilder().setValue(slaveId).build();
+    Protos.FrameworkID fid = FrameworkID.newBuilder().setValue(frameworkId).build();
+    return Protos.Offer.newBuilder().setHostname(host).setId(OfferID.newBuilder().setValue(offerId)).setSlaveId(sid).setFrameworkId(fid).build();  
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/api/ArtifactsResourceTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/api/ArtifactsResourceTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/api/ArtifactsResourceTest.java
new file mode 100644
index 0000000..5d7bb75
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/api/ArtifactsResourceTest.java
@@ -0,0 +1,51 @@
+package org.apache.myriad.api;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import javax.ws.rs.core.Response;
+
+import org.apache.myriad.BaseConfigurableTest;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for ArtifactsResource
+ */
+public class ArtifactsResourceTest extends BaseConfigurableTest {
+  ArtifactsResource resource;
+  File configFile;
+  File binaryFile;
+   
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+    configFile = new File("/tmp/myriadEtc");
+    binaryFile = new File("/tmp/myriadBinary");
+    assertTrue(configFile.createNewFile());
+    assertTrue(binaryFile.createNewFile());
+    resource = new ArtifactsResource(cfg);   
+  }
+
+  @Test
+  public void testGetConfig() throws Exception {
+    Response res = resource.getConfig();
+    assertEquals(configFile, res.getEntity());
+    assertEquals(200, res.getStatus());
+  }
+
+  @Test
+  public void testGetBinary() throws Exception {
+    Response res = resource.getBinary();
+    assertEquals(binaryFile, res.getEntity());
+    assertEquals(200, res.getStatus());
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    assertTrue(new File("/tmp/myriadEtc").delete());
+    assertTrue(new File("/tmp/myriadBinary").delete());    
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/api/SchedulerStateResourceTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/api/SchedulerStateResourceTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/api/SchedulerStateResourceTest.java
new file mode 100644
index 0000000..e57b128
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/api/SchedulerStateResourceTest.java
@@ -0,0 +1,58 @@
+package org.apache.myriad.api;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+
+import org.apache.hadoop.yarn.server.resourcemanager.recovery.MyriadFileSystemRMStateStore;
+import org.apache.mesos.Protos;
+import org.apache.mesos.Protos.FrameworkID;
+import org.apache.mesos.Protos.TaskID;
+import org.apache.myriad.BaseConfigurableTest;
+import org.apache.myriad.api.model.GetSchedulerStateResponse;
+import org.apache.myriad.scheduler.ServiceResourceProfile;
+import org.apache.myriad.scheduler.constraints.LikeConstraint;
+import org.apache.myriad.state.NodeTask;
+import org.apache.myriad.state.SchedulerState;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for SchedulerStateResource
+ */
+public class SchedulerStateResourceTest extends BaseConfigurableTest {
+  SchedulerStateResource resource;
+  TaskID idOne, idTwo, idThree;
+
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+    resource = new SchedulerStateResource(cfg, getSchedulerState());
+  }
+
+  private SchedulerState getSchedulerState() throws Exception {
+    SchedulerState state = new SchedulerState(new MyriadFileSystemRMStateStore());
+    idOne = Protos.TaskID.newBuilder().setValue("nt-1").build();
+    idTwo = Protos.TaskID.newBuilder().setValue("nt-2").build();
+    idThree = Protos.TaskID.newBuilder().setValue("nt-3").build();
+
+    state.addTask(idOne, new NodeTask(new ServiceResourceProfile("profile1", 0.2, 1024.0), new LikeConstraint("localhost", "host-[0-9]*.example.com")));
+    state.addTask(idTwo, new NodeTask(new ServiceResourceProfile("profile2", 0.4, 2048.0), new LikeConstraint("localhost", "host-[0-9]*.example.com")));
+    state.addTask(idThree, new NodeTask(new ServiceResourceProfile("profile3", 0.6, 3072.0), new LikeConstraint("localhost", "host-[0-9]*.example.com")));
+
+    state.setFrameworkId(FrameworkID.newBuilder().setValue("mock-framework").build());
+    state.makeTaskActive(idOne);
+    state.makeTaskPending(idTwo);
+    state.makeTaskStaging(idThree);
+
+    return state;
+  }
+  
+  @Test
+  public void test() throws Exception {
+    GetSchedulerStateResponse response = resource.getState();
+    assertNotNull(response);
+    assertEquals(1, response.getActiveTasks().size());
+    assertEquals(1, response.getPendingTasks().size());
+    assertEquals(1, response.getStagingTasks().size());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/configuration/MyriadConfigurationTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/configuration/MyriadConfigurationTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/configuration/MyriadConfigurationTest.java
index 22df23d..562d128 100644
--- a/myriad-scheduler/src/test/java/org/apache/myriad/configuration/MyriadConfigurationTest.java
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/configuration/MyriadConfigurationTest.java
@@ -21,71 +21,51 @@ package org.apache.myriad.configuration;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNotNull;
 
+import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 
-import org.junit.BeforeClass;
+import org.apache.myriad.BaseConfigurableTest;
 import org.junit.Test;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.google.common.collect.Sets;
 
 /**
- * AuxServices/tasks test
+ * Unit tests for MyriadConfiguration
  */
-public class MyriadConfigurationTest {
+public class MyriadConfigurationTest extends BaseConfigurableTest {
 
-  static MyriadConfiguration cfg;
+  public void testMyriadContainerConfiguration() throws Exception {
+    MyriadContainerConfiguration conf = cfgWithDocker.getContainerInfo().get();
+    assertTrue(conf.getDockerInfo().isPresent());
 
-  @BeforeClass
-  public static void setUpBeforeClass() throws Exception {
-    ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
-    cfg = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default.yml"),
-        MyriadConfiguration.class);
+    MyriadDockerConfiguration dConf = conf.getDockerInfo().get();
+    assertEquals(false, dConf.getForcePullImage());
+    assertEquals("mesos/myriad", dConf.getImage());
 
-  }
-
-  @Test
-  public void serviceConfigurationTest() throws Exception {  
-    Map<String, ServiceConfiguration> auxConfigs = cfg.getServiceConfigurations();
-
-    assertEquals(auxConfigs.size(), 2);
-
-    for (Map.Entry<String, ServiceConfiguration> entry : auxConfigs.entrySet()) {
-      String taskName = entry.getKey();
-      ServiceConfiguration config = entry.getValue();
-      String outTaskname = config.getTaskName();
-      assertEquals(taskName, outTaskname);
+    assertNotNull(conf.getVolumes());
+    
+    Set<String> keys = Sets.newHashSet("hostPath", "containerPath", "mode");
+    Set<String> modes = Sets.newHashSet("RO", "RW");
+    Iterator<Map<String, String>> iter = conf.getVolumes().iterator();
+    
+    while (iter.hasNext()) {
+      Map<String, String> mcConf = iter.next();
+      assertEquals(keys, mcConf.keySet());
+      assertTrue(modes.contains(mcConf.get("mode")));
     }
   }
-
+  
   @Test
-  public void coreConfigurationTest() throws Exception {
-    assertEquals("MyriadTest", cfg.getFrameworkName());
-
-    //authorization parameters
+  public void testRoles() throws Exception {
+    assertEquals("test", cfgWithRole.getFrameworkRole());
     assertEquals("*", cfg.getFrameworkRole());
-    assertEquals("hduser", cfg.getFrameworkUser().get());
-    assertEquals("root", cfg.getFrameworkSuperUser().get());
-
-    //ports and directory paths
-    assertEquals("10.0.2.15:5050", cfg.getMesosMaster());
-    assertEquals("/usr/local/lib/libmesos.so", cfg.getNativeLibrary());
-    assertEquals(new Integer(8192), cfg.getRestApiPort());
-    assertEquals("10.0.2.15:2181", cfg.getZkServers());
-  
-    //timeouts
-    assertEquals(new Double(44200000), cfg.getFrameworkFailoverTimeout());
-    assertEquals(new Integer(25000), cfg.getZkTimeout());
-  
-    //checkpoints
-    assertEquals(false, cfg.isCheckpoint());
-    assertEquals(true, cfg.isHAEnabled());
-    assertEquals(false, cfg.isRebalancerEnabled());
   }
-  
+
   @Test
-  public void executorConfigurationTest() throws Exception {
+  public void testExecutorConfiguration() throws Exception {
     MyriadExecutorConfiguration conf = cfg.getMyriadExecutorConfiguration();
 
     assertEquals(new Double(256), conf.getJvmMaxMemoryMB());
@@ -94,7 +74,18 @@ public class MyriadConfigurationTest {
   }
 
   @Test
-  public void nodeManagerConfigurationTest() throws Exception {
+  public void testServiceConfigurations() throws Exception {
+    Map<String, ServiceConfiguration> confs = cfg.getServiceConfigurations();
+    Set<String> configKeys = Sets.newHashSet("jobhistory", "timelineserver");
+
+    assertEquals(configKeys, confs.keySet());
+    ServiceConfiguration sConfig = confs.get("jobhistory");
+    assertEquals(new Double(1.0), sConfig.getCpus());
+    assertEquals("jobhistory", sConfig.getTaskName());
+  }
+
+  @Test
+  public void testNodeManagerConfiguration() throws Exception {
     NodeManagerConfiguration config = cfg.getNodeManagerConfiguration();
 
     assertFalse(config.getCgroups());
@@ -103,7 +94,7 @@ public class MyriadConfigurationTest {
   }
   
   @Test
-  public void profilesConfigurationTest() throws Exception {
+  public void testProfilesConfiguration() throws Exception {
     Map<String, Map<String, String>> profiles = cfg.getProfiles();
 
     for (Map.Entry<String, Map<String, String>> profile : profiles.entrySet()) {
@@ -112,9 +103,9 @@ public class MyriadConfigurationTest {
   }
   
   private boolean validateProfile(Map.Entry<String, Map<String, String>> entry) {
-    String key                 = entry.getKey();
+    String key = entry.getKey();
     Map<String, String> value = entry.getValue();
-    
+
     switch (key) {
       case "small" : {
         return value.get("cpu").equals("1") && value.get("mem").equals("1100");

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/health/HealthCheckUtilsTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/health/HealthCheckUtilsTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/health/HealthCheckUtilsTest.java
new file mode 100644
index 0000000..e403f90
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/health/HealthCheckUtilsTest.java
@@ -0,0 +1,27 @@
+package org.apache.myriad.health;
+
+import java.net.ServerSocket;
+
+import org.junit.Test;
+
+/**
+ * Unit tests for HealthCheckUtils class
+ */
+public class HealthCheckUtilsTest {
+  @Test(expected = IllegalArgumentException.class)
+  public void testInvalidHost() throws Exception {
+    HealthCheckUtils.checkHostPort("localhost-8000");
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void testInvalidPort() throws Exception {
+    HealthCheckUtils.checkHostPort("localhost:ab12");
+  }
+
+  @Test
+  public void testValidHostPortString() throws Exception {
+    ServerSocket socket = new ServerSocket(8000);
+    HealthCheckUtils.checkHostPort("localhost:8000");
+    socket.close();
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/health/MesosDriverHealthCheckTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/health/MesosDriverHealthCheckTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/health/MesosDriverHealthCheckTest.java
new file mode 100644
index 0000000..cebf2c7
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/health/MesosDriverHealthCheckTest.java
@@ -0,0 +1,69 @@
+package org.apache.myriad.health;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.myriad.scheduler.MockSchedulerDriver;
+import org.apache.myriad.scheduler.MyriadDriver;
+import org.apache.myriad.scheduler.MyriadDriverManager;
+import org.junit.Test;
+
+import com.codahale.metrics.health.HealthCheck.Result;
+
+/**
+ * Unit tests for MesosDriverHealthCheck
+ */
+public class MesosDriverHealthCheckTest {
+  
+  private static class HealthCheckTestTuple {
+    MyriadDriverManager manager;
+    MesosDriverHealthCheck checker;
+
+    private HealthCheckTestTuple(MyriadDriverManager manager) {
+      this.manager = manager;
+      this.checker = new MesosDriverHealthCheck(manager);
+    }
+
+    public MyriadDriverManager getManager() {
+      return manager;
+    }
+
+    public MesosDriverHealthCheck getChecker() {
+      return checker;
+    }
+  }
+
+  private HealthCheckTestTuple getTestStack() {
+    MyriadDriver driver = new MyriadDriver(new MockSchedulerDriver());
+    return new HealthCheckTestTuple(new MyriadDriverManager(driver));
+  }
+
+  @Test
+  public void testCheckHealthyResult() throws Exception {
+    HealthCheckTestTuple tuple = getTestStack();
+    MyriadDriverManager manager = tuple.getManager();
+    MesosDriverHealthCheck checker = tuple.getChecker();
+    manager.startDriver(); 
+    assertEquals(Result.healthy(), checker.check());
+    manager.stopDriver(false);
+  }
+
+  @Test
+  public void testCheckStoppedDriverUnhealthyResult() throws Exception {
+    HealthCheckTestTuple tuple = getTestStack();
+    MyriadDriverManager manager = tuple.getManager();
+    MesosDriverHealthCheck checker = tuple.getChecker();
+    manager.startDriver(); 
+    manager.stopDriver(false);
+    assertEquals(Result.unhealthy("Driver status: DRIVER_STOPPED"), checker.check());
+  }
+
+  @Test
+  public void testCheckAbortedDriverUnhealthyResult() throws Exception {
+    HealthCheckTestTuple tuple = getTestStack();
+    MyriadDriverManager manager = tuple.getManager();
+    MesosDriverHealthCheck checker = tuple.getChecker();
+    manager.startDriver(); 
+    manager.abortDriver();
+    assertEquals(Result.unhealthy("Driver status: DRIVER_ABORTED"), checker.check());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MockSchedulerDriver.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MockSchedulerDriver.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MockSchedulerDriver.java
new file mode 100644
index 0000000..2a60e58
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MockSchedulerDriver.java
@@ -0,0 +1,124 @@
+package org.apache.myriad.scheduler;
+
+import java.util.Collection;
+
+import org.apache.mesos.Protos;
+import org.apache.mesos.Protos.ExecutorID;
+import org.apache.mesos.Protos.Filters;
+import org.apache.mesos.Protos.Offer.Operation;
+import org.apache.mesos.Protos.OfferID;
+import org.apache.mesos.Protos.Request;
+import org.apache.mesos.Protos.SlaveID;
+import org.apache.mesos.Protos.Status;
+import org.apache.mesos.Protos.TaskID;
+import org.apache.mesos.Protos.TaskInfo;
+import org.apache.mesos.Protos.TaskStatus;
+import org.apache.mesos.SchedulerDriver;
+
+/**
+ * Mock SchedulerDriver implementation for JUnit tests
+ */
+public class MockSchedulerDriver implements SchedulerDriver {
+
+  @Override
+  public Status start() {
+    return Protos.Status.DRIVER_RUNNING;
+  }
+
+  @Override
+  public Status stop(boolean failover) {
+    return Protos.Status.DRIVER_STOPPED;
+  }
+
+  @Override
+  public Status stop() {
+    return Protos.Status.DRIVER_STOPPED;
+  }
+
+  @Override
+  public Status abort() {
+    return Protos.Status.DRIVER_ABORTED;
+  }
+
+  @Override
+  public Status join() {
+    return Protos.Status.DRIVER_RUNNING;
+  }
+
+  @Override
+  public Status run() {
+    return Protos.Status.DRIVER_RUNNING;
+  }
+
+  @Override
+  public Status requestResources(Collection<Request> requests) {
+    return null;
+  }
+
+  @Override
+  public Status launchTasks(Collection<OfferID> offerIds, Collection<TaskInfo> tasks, Filters filters) {
+    return null;
+  }
+
+  @Override 
+  public Status launchTasks(Collection<OfferID> offerIds, Collection<TaskInfo> tasks) {
+    return null;
+  }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public Status launchTasks(OfferID offerId, Collection<TaskInfo> tasks, Filters filters) {
+    return null;
+  }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public Status launchTasks(OfferID offerId, Collection<TaskInfo> tasks) {
+    return null;
+  }
+
+  @Override
+  public Status killTask(TaskID taskId) {
+    return null;
+  }
+
+  @Override
+  public Status acceptOffers(Collection<OfferID> offerIds, Collection<Operation> operations, Filters filters) {
+    return null;
+  }
+
+  @Override
+  public Status declineOffer(OfferID offerId, Filters filters) {
+    return null;
+  }
+
+  @Override
+  public Status declineOffer(OfferID offerId) {
+    return null;
+  }
+
+  @Override
+  public Status reviveOffers() {
+    return null;
+  }
+
+  @Override
+  public Status suppressOffers() {
+    return null;
+  }
+
+  @Override
+  public Status acknowledgeStatusUpdate(TaskStatus status) {
+    return null;
+  }
+
+  @Override
+  public Status sendFrameworkMessage(ExecutorID executorId, SlaveID slaveId, byte[] data) {
+    return null;
+  }
+
+  @Override
+  public Status reconcileTasks(Collection<TaskStatus> statuses) {
+    return null;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadDriverTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadDriverTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadDriverTest.java
new file mode 100644
index 0000000..d384150
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadDriverTest.java
@@ -0,0 +1,43 @@
+package org.apache.myriad.scheduler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.mesos.Protos;
+import org.apache.mesos.Protos.Status;
+import org.apache.mesos.SchedulerDriver;
+import org.junit.Test;
+
+/**
+ * Unit test for MyriadDriver class
+ */
+public class MyriadDriverTest {
+  @Test
+  public void testStart() throws Exception {
+    MyriadDriver driver = new MyriadDriver(new MockSchedulerDriver());
+    Status status = driver.start();
+    assertEquals(Protos.Status.DRIVER_RUNNING_VALUE, status.getNumber());
+  }
+
+  @Test
+  public void testAbort() throws Exception {
+    MyriadDriver driver = new MyriadDriver(new MockSchedulerDriver());
+    Status status = driver.abort();
+    assertEquals(Protos.Status.DRIVER_ABORTED_VALUE, status.getNumber());
+  }
+  
+  @Test
+  public void testStop() throws Exception {
+    MyriadDriver driver = new MyriadDriver(new MockSchedulerDriver());
+    Status status = driver.stop(true);
+    assertEquals(Protos.Status.DRIVER_STOPPED_VALUE, status.getNumber());
+  }
+
+  @Test
+  public void testGetDriver() throws Exception {
+    MyriadDriver driver = new MyriadDriver(new MockSchedulerDriver());
+    SchedulerDriver sDriver = driver.getDriver();
+    
+    assertTrue(sDriver instanceof MockSchedulerDriver);
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadOperationsTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadOperationsTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadOperationsTest.java
new file mode 100644
index 0000000..6c039dd
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadOperationsTest.java
@@ -0,0 +1,112 @@
+package org.apache.myriad.scheduler;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.yarn.event.Dispatcher;
+import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.ahs.RMApplicationHistoryWriter;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.AMLivelinessMonitor;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerApp;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerNode;
+import org.apache.hadoop.yarn.server.resourcemanager.security.RMDelegationTokenSecretManager;
+import org.apache.mesos.Protos.FrameworkID;
+import org.apache.myriad.BaseConfigurableTest;
+import org.apache.myriad.TestObjectFactory;
+import org.apache.myriad.configuration.MyriadBadConfigurationException;
+import org.apache.myriad.policy.LeastAMNodesFirstPolicy;
+import org.apache.myriad.scheduler.constraints.Constraint;
+import org.apache.myriad.scheduler.constraints.LikeConstraint;
+import org.apache.myriad.scheduler.yarn.interceptor.CompositeInterceptor;
+import org.apache.myriad.state.MockDispatcher;
+import org.apache.myriad.state.MockRMContext;
+import org.apache.myriad.state.SchedulerState;
+import org.apache.myriad.webapp.MyriadWebServer;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for MyriadOperations class
+ */
+public class MyriadOperationsTest extends BaseConfigurableTest {
+  MyriadOperations ops;
+  ServiceResourceProfile small;
+  Constraint constraint = new LikeConstraint("localhost", "host-[0-9]*.example.com");
+  SchedulerState sState;
+
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+    AbstractYarnScheduler<FiCaSchedulerApp, FiCaSchedulerNode> scheduler = TestObjectFactory.getYarnScheduler();
+    //sState = new SchedulerState(new MyriadFileSystemRMStateStore());
+    sState = TestObjectFactory.getSchedulerState(cfg);
+    sState.setFrameworkId(FrameworkID.newBuilder().setValue("mock-framework").build());
+
+    MyriadDriverManager manager = TestObjectFactory.getMyriadDriverManager();
+    MyriadWebServer webServer = TestObjectFactory.getMyriadWebServer(cfg);
+    CompositeInterceptor registry = new CompositeInterceptor();
+    LeastAMNodesFirstPolicy policy = new LeastAMNodesFirstPolicy(registry, scheduler, sState);
+
+    manager.startDriver();
+
+    ops = new MyriadOperations(cfg, sState, policy, manager, webServer, generateRMContext(scheduler));
+    generateProfiles();
+  }
+
+  private void generateProfiles() {
+    small = new ServiceResourceProfile("small", 0.1, 512.0);
+  }
+
+  private RMContext generateRMContext(AbstractYarnScheduler<FiCaSchedulerApp, FiCaSchedulerNode> scheduler) throws Exception {
+    Configuration conf = new Configuration();
+    MockRMContext context = null;
+    Dispatcher dispatcher = new MockDispatcher();
+
+    RMApplicationHistoryWriter rmApplicationHistoryWriter = new RMApplicationHistoryWriter(); 
+    AMLivelinessMonitor amLivelinessMonitor = new AMLivelinessMonitor(dispatcher);
+    AMLivelinessMonitor amFinishingMonitor = new AMLivelinessMonitor(dispatcher);    
+    RMDelegationTokenSecretManager delegationTokenSecretManager = new RMDelegationTokenSecretManager(1, 1, 1, 1, context);
+
+    context = new MockRMContext();
+    context.setStateStore(TestObjectFactory.getStateStore(conf));
+    context.setAmLivelinessMonitor(amLivelinessMonitor);
+    context.setAmFinishingMonitor(amFinishingMonitor);
+    context.setRMApplicationHistoryWriter(rmApplicationHistoryWriter);
+    context.setRMDelegationTokenSecretManager(delegationTokenSecretManager);
+    return context;
+  }
+
+  @Test 
+  public void testFlexUpAndFlexDownCluster() throws Exception {
+    assertEquals(0, sState.getPendingTaskIds().size());
+    ops.flexUpCluster(small, 1, constraint);
+    assertEquals(1, sState.getPendingTaskIds().size());
+    ops.flexDownCluster(small, constraint, 1);
+    assertEquals(0, sState.getPendingTaskIds().size());
+  }
+
+  @Test
+  public void testFlexUpAndFlexDownService() throws Exception {
+    ops.flexUpAService(1, "jobhistory");
+    assertEquals(1, sState.getPendingTasksByType("jobhistory").size());
+    ops.flexDownAService(1, "jobhistory");
+    assertEquals(0, sState.getPendingTasksByType("jobhistory").size());
+  }
+
+  @Test(expected = MyriadBadConfigurationException.class)
+  public void testFlexUpAServiceOverMaxInstances() throws Exception {
+    ops.flexUpAService(2, "jobhistory");
+  }
+
+  @Test
+  public void testGetFlexibleInstances() throws Exception {
+    ops.flexUpAService(1, "jobhistory");
+    assertEquals(1, ops.getFlexibleInstances("jobhistory").intValue());
+  }
+
+  @Test
+  public void testShutdownCluster() throws Exception {
+    ops.shutdownFramework();
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/NMProfileManagerTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/NMProfileManagerTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/NMProfileManagerTest.java
new file mode 100644
index 0000000..a0aab74
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/NMProfileManagerTest.java
@@ -0,0 +1,63 @@
+package org.apache.myriad.scheduler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+/**
+ * Unit test cases for NMProfileManager
+ */
+public class NMProfileManagerTest { 
+  private NMProfileManager getNMProfileManager() {
+    NMProfileManager manager = new NMProfileManager();
+    NMProfile profile1 = new NMProfile("profile1", 1L, 512L);
+    NMProfile profile2 = new NMProfile("profile2", 2L, 1024L);
+    NMProfile profile3 = new NMProfile("profile3", 3L, 2048L);
+    NMProfile profile4 = new NMProfile("profile4", 4L, 3072L);
+    NMProfile profile5 = new NMProfile("profile5", 5L, 4096L);
+
+    manager.add(profile1);
+    manager.add(profile2);
+    manager.add(profile3);
+    manager.add(profile4);
+    manager.add(profile5);
+
+    return manager;
+  }
+
+  @Test
+  public void testAdd() throws Exception {
+    NMProfileManager manager = this.getNMProfileManager();
+    assertEquals(5, manager.numberOfProfiles());
+  }
+  
+  @Test 
+  public void testRetrieval() throws Exception {
+    NMProfileManager manager = this.getNMProfileManager();   
+    assertEquals("profile1", manager.get("profile1").getName());
+    assertEquals("profile2", manager.get("profile2").getName());
+    assertEquals("profile3", manager.get("profile3").getName());
+    assertEquals("profile4", manager.get("profile4").getName());
+    assertEquals("profile5", manager.get("profile5").getName());
+  }
+
+  @Test
+  public void testExists() throws Exception {
+    NMProfileManager manager = this.getNMProfileManager();
+    assertTrue(manager.exists("profile1"));
+    assertTrue(manager.exists("profile2"));
+    assertTrue(manager.exists("profile3"));
+    assertTrue(manager.exists("profile4"));
+    assertTrue(manager.exists("profile5"));
+  }
+  @Test
+  public void testToString() throws Exception {
+    NMProfileManager manager = this.getNMProfileManager();
+    String toString = manager.toString();
+    assertTrue(toString.contains("\"name\":\"profile1\",\"cpus\":1,\"memory\":512"));
+    assertTrue(toString.contains("\"name\":\"profile2\",\"cpus\":2,\"memory\":1024"));
+    assertTrue(toString.contains("\"name\":\"profile3\",\"cpus\":3,\"memory\":2048"));
+    assertTrue(toString.contains("\"name\":\"profile4\",\"cpus\":4,\"memory\":3072"));
+    assertTrue(toString.contains("\"name\":\"profile5\",\"cpus\":5,\"memory\":4096"));
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/ServiceResourceProfileTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/ServiceResourceProfileTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/ServiceResourceProfileTest.java
new file mode 100644
index 0000000..72e0092
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/ServiceResourceProfileTest.java
@@ -0,0 +1,31 @@
+package org.apache.myriad.scheduler;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit test cases for ServiceResourceProfile
+ *
+ */
+public class ServiceResourceProfileTest {
+  ServiceResourceProfile profile;
+
+  @Before
+  public void setUp() throws Exception {
+    profile = new ServiceResourceProfile("ServiceResourceProfile", 0.1, 1024.0, 0.1, 512.0);
+  }
+
+  @Test
+  public void testRequestedResources() throws Exception {
+    Assert.assertEquals(new Double(0.1), profile.getCpus());
+    Assert.assertEquals(new Double(1024.0), profile.getMemory());
+    Assert.assertEquals(new Double(0.1), profile.getExecutorCpu());
+    Assert.assertEquals(new Double(512.0), profile.getExecutorMemory());
+  }
+  
+  @Test
+  public void testName() throws Exception {
+    Assert.assertEquals("ServiceResourceProfile", profile.getName());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TaskConstraintsManagerTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TaskConstraintsManagerTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TaskConstraintsManagerTest.java
new file mode 100644
index 0000000..94946ce
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TaskConstraintsManagerTest.java
@@ -0,0 +1,32 @@
+package org.apache.myriad.scheduler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.myriad.BaseConfigurableTest;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for TaskConstraintsManager
+ */
+public class TaskConstraintsManagerTest extends BaseConfigurableTest {
+  TaskConstraintsManager manager = new TaskConstraintsManager();
+  
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+    manager.addTaskConstraints("jobhistory", new ServiceTaskConstraints(cfg, "jobhistory"));
+  }
+
+  @Test
+  public void testAddConstraints() throws Exception {
+    assertTrue(manager.exists("jobhistory"));
+  }
+
+  @Test
+  public void testGetConstraints() throws Exception {
+    TaskConstraints tCon = manager.getConstraints("jobhistory");
+    assertEquals(3, tCon.portsCount());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceCommandLine.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceCommandLine.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceCommandLine.java
index e49c19c..87aee56 100644
--- a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceCommandLine.java
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceCommandLine.java
@@ -18,24 +18,17 @@
  */
 package org.apache.myriad.scheduler;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import static org.junit.Assert.assertTrue;
+
 import org.apache.mesos.Protos.CommandInfo;
-import org.apache.myriad.configuration.MyriadConfiguration;
+import org.apache.myriad.BaseConfigurableTest;
 import org.apache.myriad.scheduler.TaskFactory.NMTaskFactoryImpl;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  * Class to test CommandLine generation
  */
-public class TestServiceCommandLine {
-
-  static MyriadConfiguration cfg;
-
+public class TestServiceCommandLine extends BaseConfigurableTest {
   static String toJHSCompare =
       "echo \" sudo tar -zxpf hadoop-2.7.0.tar.gz &&  sudo  cp conf /usr/local/hadoop/etc/hadoop/yarn-site.xml; " +
       "export TASK_DIR=`basename $PWD`; sudo  chmod +wx /sys/fs/cgroup/cpu/mesos/$TASK_DIR;" +
@@ -44,18 +37,6 @@ public class TestServiceCommandLine {
   static String toCompare =
       "echo \" sudo tar -zxpf hadoop-2.7.0.tar.gz &&  sudo  cp conf /usr/local/hadoop/etc/hadoop/yarn-site.xml;";
 
-  @BeforeClass
-  public static void setUpBeforeClass() throws Exception {
-    ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
-    cfg = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default.yml"),
-        MyriadConfiguration.class);
-
-  }
-
-  @AfterClass
-  public static void tearDownAfterClass() throws Exception {
-  }
-
   @Test
   public void testJHSCommandLineGeneration() throws Exception {
     ServiceTaskFactoryImpl jhs = new ServiceTaskFactoryImpl(cfg, null);

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestTaskUtils.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestTaskUtils.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestTaskUtils.java
index 06fa698..29d7691 100644
--- a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestTaskUtils.java
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestTaskUtils.java
@@ -17,48 +17,25 @@
  */
 package org.apache.myriad.scheduler;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.google.common.collect.Range;
-import com.google.common.collect.Ranges;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 import org.apache.mesos.Protos;
+import org.apache.myriad.BaseConfigurableTest;
 import org.apache.myriad.configuration.MyriadBadConfigurationException;
-import org.apache.myriad.configuration.MyriadConfiguration;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import com.google.common.collect.Range;
+import com.google.common.collect.Ranges;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 
 /**
  * Tests for TaskUtils
  */
-public class TestTaskUtils {
-
-  static MyriadConfiguration cfg;
-  static MyriadConfiguration cfgWithRole;
-  static MyriadConfiguration cfgWithDocker;
+public class TestTaskUtils extends BaseConfigurableTest {
   static double epsilon = .0001;
 
-  @BeforeClass
-  public static void setUpBeforeClass() throws Exception {
-    ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
-    cfg = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default.yml"),
-        MyriadConfiguration.class);
-    cfgWithRole = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default-with-framework-role.yml"),
-        MyriadConfiguration.class);
-    cfgWithDocker = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default-with-docker-info.yml"),
-            MyriadConfiguration.class);
-
-  }
-
-  @AfterClass
-  public static void tearDownAfterClass() throws Exception {
-  }
-
   @Test
   public void testGetResource() {
     TaskUtils taskUtils = new TaskUtils(cfg);