@Test
  public void TestUnregisterAndRegisterWhenUpdating()
      throws Node2BeanException, RepositoryException, RegistrationException {

    // GIVEN
    String appName = "app1";
    DefinitionProvider<AppDescriptor> appDescriptorProvider1 =
        createAppDescriptorProvider(appName, true);
    Set<DefinitionMetadata> registeredNames =
        appDescriptorRegistry.unregisterAndRegister(
            Arrays.<DefinitionMetadata>asList(), Arrays.asList(appDescriptorProvider1));

    // Change content of AppDescriptor info
    DefinitionProvider<AppDescriptor> appDescriptorProvider2 =
        createAppDescriptorProvider(appName, false);

    eventHandler.clear();

    // WHEN
    Set<DefinitionMetadata> registeredNames2 =
        appDescriptorRegistry.unregisterAndRegister(
            registeredNames, Arrays.asList(appDescriptorProvider2));

    // THEN
    // appDescriptorProvider1 should be registered.
    assertNotNull(registeredNames2);
    assertEquals(1, registeredNames2.size());
    assertEquals(appName, registeredNames2.iterator().next().getName());
    assertEquals(1, eventHandler.events.size());
    assertEquals(AppRegistryEventType.REREGISTERED, eventHandler.events.get(0).getEventType());
    assertEquals(
        appDescriptorRegistry.getProvider(appName).getMetadata(),
        eventHandler.events.get(0).getAppDescriptorMetadata());
  }
  @Test
  public void testUnregisterAndRegisterWhenAdding()
      throws Node2BeanException, RepositoryException, RegistrationException {

    // GIVEN
    final String appName1 = "app1";
    String appName2 = "app2";
    DefinitionProvider<AppDescriptor> appDescriptorProvider1 =
        createAppDescriptorProvider(appName1, true);
    DefinitionProvider<AppDescriptor> appDescriptorProvider2 =
        createAppDescriptorProvider(appName2, true);

    // Add app1
    Set<DefinitionMetadata> registeredMetadata =
        appDescriptorRegistry.unregisterAndRegister(
            Arrays.<DefinitionMetadata>asList(), Arrays.asList(appDescriptorProvider1));
    assertEquals(1, registeredMetadata.size());
    assertNotNull(appDescriptorRegistry.getProvider(appName1));

    eventHandler.clear();

    // WHEN
    Set<DefinitionMetadata> registeredNames2 =
        appDescriptorRegistry.unregisterAndRegister(
            registeredMetadata, Arrays.asList(appDescriptorProvider1, appDescriptorProvider2));

    // THEN
    assertNotNull(registeredNames2);
    assertEquals(2, registeredNames2.size());
    assertEquals(1, eventHandler.events.size());
    assertContainsEvent(AppRegistryEventType.REGISTERED, appName2);
  }
  @Test(expected = Registry.NoSuchDefinitionException.class)
  public void testGetAppDescriptorThrowsExceptionWhenAppNotFound()
      throws Node2BeanException, RepositoryException, RegistrationException {

    // GIVEN
    String addId = "app1";
    DefinitionProvider<AppDescriptor> appDescriptorProvider1 =
        createAppDescriptorProvider(addId, true);
    appDescriptorRegistry.unregisterAndRegister(
        Arrays.<DefinitionMetadata>asList(), Arrays.asList(appDescriptorProvider1));

    // WHEN
    appDescriptorRegistry.getProvider("xx");
  }
  @Test
  public void testGetAppDescriptor()
      throws Node2BeanException, RepositoryException, RegistrationException {

    // GIVEN
    String addId = "app1";
    DefinitionProvider<AppDescriptor> appDescriptorProvider1 =
        createAppDescriptorProvider(addId, true);
    appDescriptorRegistry.unregisterAndRegister(
        Arrays.<DefinitionMetadata>asList(), Arrays.asList(appDescriptorProvider1));

    // WHEN
    AppDescriptor appDescriptor = appDescriptorRegistry.getProvider(addId).get();

    // THEN
    assertNotNull(appDescriptor);
    assertEquals(addId, appDescriptor.getName());
  }