@Test
  public void testAutomatic() throws Exception {
    final BatchBuilder batch = serviceContainer.batchBuilder();
    final TestServiceListener listener = new TestServiceListener();
    batch.addListener(listener);

    batch
        .addService(ServiceName.of("serviceOne"), Service.NULL)
        .setInitialMode(ServiceController.Mode.AUTOMATIC)
        .addDependencies(ServiceName.of("serviceTwo"));
    batch
        .addService(ServiceName.of("serviceTwo"), Service.NULL)
        .setInitialMode(ServiceController.Mode.NEVER);

    batch.install();

    assertState(serviceContainer, ServiceName.of("serviceOne"), ServiceController.State.DOWN);
    assertState(serviceContainer, ServiceName.of("serviceTwo"), ServiceController.State.DOWN);

    final Future<ServiceController<?>> serviceOneFuture =
        listener.expectServiceStart(ServiceName.of("serviceTwo"));

    serviceContainer
        .getService(ServiceName.of("serviceTwo"))
        .setMode(ServiceController.Mode.IMMEDIATE);

    assertEquals(ServiceController.State.UP, serviceOneFuture.get().getState());
    assertState(serviceContainer, ServiceName.of("serviceTwo"), ServiceController.State.UP);
  }
  @Test
  public void testRemove() throws Exception {
    final BatchBuilder batch = serviceContainer.batchBuilder();
    final TestServiceListener listener = new TestServiceListener();
    batch.addListener(listener);

    batch
        .addService(ServiceName.of("serviceOne"), Service.NULL)
        .addDependencies(ServiceName.of("serviceTwo"));
    batch.addService(ServiceName.of("serviceTwo"), Service.NULL);

    final Future<ServiceController<?>> startFuture =
        listener.expectServiceStart(ServiceName.of("serviceOne"));

    batch.install();

    assertEquals(ServiceController.State.UP, startFuture.get().getState());
    assertState(serviceContainer, ServiceName.of("serviceTwo"), ServiceController.State.UP);

    final Future<ServiceController<?>> removeFuture =
        listener.expectServiceRemoval(ServiceName.of("serviceOne"));

    serviceContainer
        .getService(ServiceName.of("serviceTwo"))
        .setMode(ServiceController.Mode.REMOVE);

    assertEquals(ServiceController.State.REMOVED, removeFuture.get().getState());

    assertNull(serviceContainer.getService(ServiceName.of("serviceTwo")));
    assertNull(serviceContainer.getService(ServiceName.of("serviceOne")));
  }
  @Test
  public void testFailedStart() throws Exception {
    final StartException startException = new StartException("Blahhhh");
    final BatchBuilder batch = serviceContainer.batchBuilder();
    final TestServiceListener listener = new TestServiceListener();
    batch.addListener(listener);

    batch.addService(
        ServiceName.of("serviceOne"),
        new Service<Void>() {
          @Override
          public void start(StartContext context) throws StartException {
            throw startException;
          }

          @Override
          public void stop(StopContext context) {}

          @Override
          public Void getValue() throws IllegalStateException {
            return null;
          }
        });

    final Future<StartException> exceptionFuture =
        listener.expectServiceFailure(ServiceName.of("serviceOne"));

    batch.install();

    assertEquals(startException, exceptionFuture.get());
    assertState(
        serviceContainer, ServiceName.of("serviceOne"), ServiceController.State.START_FAILED);
  }
  @Test
  public void testStartModes() throws Exception {
    final BatchBuilder batch = serviceContainer.batchBuilder();
    final TestServiceListener listener = new TestServiceListener();
    batch.addListener(listener);
    batch
        .addService(ServiceName.of("automatic"), Service.NULL)
        .setInitialMode(ServiceController.Mode.AUTOMATIC);
    batch
        .addService(ServiceName.of("never"), Service.NULL)
        .setInitialMode(ServiceController.Mode.NEVER);
    batch
        .addService(ServiceName.of("immediate"), Service.NULL)
        .setInitialMode(ServiceController.Mode.IMMEDIATE);
    batch
        .addService(ServiceName.of("on_demand"), Service.NULL)
        .setInitialMode(ServiceController.Mode.ON_DEMAND);

    final Future<ServiceController<?>> automaticServiceFuture =
        listener.expectServiceStart(ServiceName.of("automatic"));
    final Future<ServiceController<?>> immediateServiceFuture =
        listener.expectServiceStart(ServiceName.of("immediate"));

    batch.install();

    assertEquals(ServiceController.State.UP, automaticServiceFuture.get().getState());
    assertEquals(ServiceController.State.UP, immediateServiceFuture.get().getState());

    assertState(serviceContainer, ServiceName.of("never"), ServiceController.State.DOWN);
    assertState(serviceContainer, ServiceName.of("on_demand"), ServiceController.State.DOWN);
  }
  @Test
  public void testAnotherOnDemand() throws Exception {
    final BatchBuilder batch = serviceContainer.batchBuilder();
    final TestServiceListener listener = new TestServiceListener();
    batch.addListener(listener);

    batch
        .addService(ServiceName.of("sbm"), Service.NULL)
        .setInitialMode(ServiceController.Mode.ON_DEMAND);
    batch
        .addService(ServiceName.of("nic1"), Service.NULL)
        .setInitialMode(ServiceController.Mode.ON_DEMAND);

    batch
        .addService(ServiceName.of("sb1"), Service.NULL)
        .addDependencies(ServiceName.of("sbm"), ServiceName.of("nic1"))
        .setInitialMode(ServiceController.Mode.ON_DEMAND);

    batch
        .addService(ServiceName.of("server"), Service.NULL)
        .setInitialMode(ServiceController.Mode.ON_DEMAND);

    batch
        .addService(ServiceName.of("connector"), Service.NULL)
        .addDependencies(ServiceName.of("sb1"), ServiceName.of("server"))
        .setInitialMode(ServiceController.Mode.IMMEDIATE);

    final Future<ServiceController<?>> connectorFuture =
        listener.expectServiceStart(ServiceName.of("connector"));

    batch.install();

    assertEquals(ServiceController.State.UP, connectorFuture.get().getState());
    assertState(serviceContainer, ServiceName.of("sbm"), ServiceController.State.UP);
    assertState(serviceContainer, ServiceName.of("nic1"), ServiceController.State.UP);
    assertState(serviceContainer, ServiceName.of("sb1"), ServiceController.State.UP);
    assertState(serviceContainer, ServiceName.of("server"), ServiceController.State.UP);
  }