@Test
  public void testNotificationsWhenUndeployingScopedInstances_changeInstanceState()
      throws Exception {

    // Prepare stuff
    final TestApplication app = new TestApplication();
    final Map<Instance, List<InstanceStatus>> instanceToStatusHistory = new HashMap<>();
    INotificationMngr notificationMngr =
        new NotificationMngrImpl() {
          @Override
          public void instance(Instance instance, Application application, EventType eventType) {

            Assert.assertEquals(EventType.CHANGED, eventType);
            Assert.assertEquals(app, application);

            List<InstanceStatus> status = instanceToStatusHistory.get(instance);
            if (status == null) {
              status = new ArrayList<>();
              instanceToStatusHistory.put(instance, status);
            }

            status.add(instance.getStatus());
          }
        };

    ITargetsMngr targetsMngr = Mockito.mock(ITargetsMngr.class);
    IRandomMngr randomMngr = Mockito.mock(IRandomMngr.class);
    ITargetConfigurator targetConfigurator = Mockito.mock(ITargetConfigurator.class);

    IMessagingMngr messagingMngr = Mockito.mock(IMessagingMngr.class);
    Mockito.when(messagingMngr.getMessagingClient()).thenReturn(Mockito.mock(IDmClient.class));

    IConfigurationMngr configurationMngr = new ConfigurationMngrImpl();
    configurationMngr.setWorkingDirectory(this.folder.newFolder());

    IInstancesMngr mngr =
        new InstancesMngrImpl(
            messagingMngr, notificationMngr, targetsMngr, randomMngr, targetConfigurator);
    ((InstancesMngrImpl) mngr).setTargetHandlerResolver(new TestTargetResolver());

    // Make one of our VM being fully deployed
    ManagedApplication ma = new ManagedApplication(app);
    app.getTomcatVm().setStatus(InstanceStatus.DEPLOYED_STARTED);
    app.getTomcat().setStatus(InstanceStatus.DEPLOYED_STARTED);
    app.getWar().setStatus(InstanceStatus.DEPLOYED_STARTED);

    // One scoped instance has a machine ID (considered as running somewhere)
    app.getTomcatVm().data.put(Instance.MACHINE_ID, "machine-id");

    // Stop everything
    mngr.changeInstanceState(ma, app.getTomcatVm(), InstanceStatus.NOT_DEPLOYED);

    // Check notifications
    Assert.assertEquals(3, instanceToStatusHistory.size());
    List<InstanceStatus> statusHistory = instanceToStatusHistory.get(app.getTomcatVm());
    Assert.assertNotNull(statusHistory);
    Assert.assertEquals(
        Arrays.asList(InstanceStatus.UNDEPLOYING, InstanceStatus.NOT_DEPLOYED), statusHistory);

    statusHistory = instanceToStatusHistory.get(app.getTomcat());
    Assert.assertNotNull(statusHistory);
    Assert.assertEquals(Arrays.asList(InstanceStatus.NOT_DEPLOYED), statusHistory);

    statusHistory = instanceToStatusHistory.get(app.getWar());
    Assert.assertNotNull(statusHistory);
    Assert.assertEquals(Arrays.asList(InstanceStatus.NOT_DEPLOYED), statusHistory);

    Mockito.verify(targetConfigurator, Mockito.only())
        .cancelCandidate(Mockito.any(TargetHandlerParameters.class), Mockito.eq(app.getTomcatVm()));
  }