Skip to content

Commit

Permalink
Added test for Furnace hotswap via AddonManager installation from a d…
Browse files Browse the repository at this point in the history
…etached instance
  • Loading branch information
lincolnthree committed Jan 9, 2014
1 parent b4a34cb commit 8578984
Show file tree
Hide file tree
Showing 2 changed files with 149 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -47,13 +48,14 @@ public class FurnaceImpl implements Furnace

private boolean serverMode = true;
private AddonLifecycleManager manager;
private final List<ContainerLifecycleListener> registeredListeners = new ArrayList<ContainerLifecycleListener>();
private final List<ListenerRegistration<ContainerLifecycleListener>> loadedListenerRegistrations = new ArrayList<ListenerRegistration<ContainerLifecycleListener>>();
private final List<ContainerLifecycleListener> registeredListeners = new ArrayList<>();
private final List<ListenerRegistration<ContainerLifecycleListener>> loadedListenerRegistrations = new ArrayList<>();

private ClassLoader loader;

private final List<AddonRepository> repositories = new ArrayList<AddonRepository>();
private final Map<AddonRepository, Integer> lastRepoVersionSeen = new HashMap<AddonRepository, Integer>();
private final List<AddonRepository> repositories = new ArrayList<>();
private final Map<AddonRepository, Integer> lastRepoVersionSeen = new HashMap<>();
private final Map<AddonRepository, Date> lastRepoUpdateSeen = new HashMap<>();

private final LockManager lock = new LockManagerImpl();

Expand Down Expand Up @@ -145,10 +147,13 @@ public Furnace start(ClassLoader loader)
for (AddonRepository repository : repositories)
{
int repoVersion = repository.getVersion();
if (repoVersion > lastRepoVersionSeen.get(repository))
Date lastRepoUpdate = repository.getLastModified();
if (repoVersion > lastRepoVersionSeen.get(repository)
|| lastRepoUpdate.after(lastRepoUpdateSeen.get(repository)))
{
logger.log(Level.INFO, "Detected changes in repository [" + repository + "].");
lastRepoVersionSeen.put(repository, repoVersion);
lastRepoUpdateSeen.put(repository, lastRepoUpdate);
dirty = true;
}
}
Expand Down Expand Up @@ -287,8 +292,7 @@ public AddonRegistry getAddonRegistry(AddonRepository... repositories)
{
if (repositories == null || repositories.length == 0)
{
result = new AddonRegistryImpl(lock, getLifecycleManager(), new ArrayList<AddonRepository>(
getRepositories()), "ROOT");
result = new AddonRegistryImpl(lock, getLifecycleManager(), new ArrayList<>(getRepositories()), "ROOT");
getLifecycleManager().addView(result);
}
else
Expand Down Expand Up @@ -372,6 +376,7 @@ public AddonRepository addRepository(AddonRepository repository)

this.repositories.add(repository);
lastRepoVersionSeen.put(repository, 0);
lastRepoUpdateSeen.put(repository, new Date());

return repository;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
/*
* Copyright 2012 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.furnace.manager.impl;

import static org.hamcrest.CoreMatchers.instanceOf;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.ServiceLoader;

import org.jboss.forge.furnace.Furnace;
import org.jboss.forge.furnace.addons.AddonId;
import org.jboss.forge.furnace.impl.util.Files;
import org.jboss.forge.furnace.manager.AddonManager;
import org.jboss.forge.furnace.manager.maven.MavenContainer;
import org.jboss.forge.furnace.manager.maven.addon.MavenAddonDependencyResolver;
import org.jboss.forge.furnace.manager.request.AddonActionRequest;
import org.jboss.forge.furnace.manager.request.DeployRequest;
import org.jboss.forge.furnace.manager.request.InstallRequest;
import org.jboss.forge.furnace.manager.spi.AddonDependencyResolver;
import org.jboss.forge.furnace.repositories.AddonRepositoryMode;
import org.jboss.forge.furnace.util.Addons;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class AddonManagerHotswapTest
{

@BeforeClass
public static void setRemoteRepository() throws IOException
{
System.setProperty(MavenContainer.ALT_USER_SETTINGS_XML_LOCATION, getAbsolutePath("profiles/settings.xml"));
System.setProperty(MavenContainer.ALT_LOCAL_REPOSITORY_LOCATION, "target/the-other-repository");
}

private static String getAbsolutePath(String path) throws FileNotFoundException
{
URL resource = Thread.currentThread().getContextClassLoader().getResource(path);
if (resource == null)
throw new FileNotFoundException(path);
return resource.getFile();
}

@AfterClass
public static void clearRemoteRepository()
{
System.clearProperty(MavenContainer.ALT_USER_SETTINGS_XML_LOCATION);
System.clearProperty(MavenContainer.ALT_LOCAL_REPOSITORY_LOCATION);
}

private Furnace furnace;
private AddonManager addonManager;
private AddonDependencyResolver resolver;
private File repository;

@Before
public void setUp() throws IOException, InterruptedException
{
furnace = ServiceLoader.load(Furnace.class).iterator().next();
resolver = new MavenAddonDependencyResolver();
repository = File.createTempFile("furnace-repo", ".tmp");
repository.delete();
repository.mkdir();
furnace.addRepository(AddonRepositoryMode.MUTABLE, repository);
furnace.startAsync();
while (!furnace.getStatus().isStarted())
{
Thread.sleep(100);
}
addonManager = new AddonManagerImpl(furnace, resolver);
}

@After
public void tearDown()
{
furnace.stop();
if (repository != null && !Files.delete(repository, true))
{
System.err.println("Could not delete " + repository);
}
}

@Test(timeout = 5000)
public void testFurnaceLoadsInstalledAddonFromSameInstance() throws IOException
{
Assert.assertEquals(1, furnace.getRepositories().size());
Assert.assertEquals(0, furnace.getAddonRegistry().getAddons().size());
Assert.assertEquals(0, furnace.getRepositories().get(0).listEnabled().size());
AddonId addon = AddonId.from("test:no_dep", "1.0.0.Final");
InstallRequest install = addonManager.install(addon);
List<? extends AddonActionRequest> actions = install.getActions();
Assert.assertEquals(1, actions.size());
Assert.assertThat(actions.get(0), instanceOf(DeployRequest.class));
install.perform();
Assert.assertEquals(1, furnace.getRepositories().get(0).listEnabled().size());
Assert.assertEquals(1, furnace.getAddonRegistry().getAddons().size());
}

@Test(timeout = 5000)
public void testFurnaceLoadsInstalledAddonFromSeparateInstance() throws IOException
{
Assert.assertEquals(1, furnace.getRepositories().size());
Assert.assertEquals(0, furnace.getAddonRegistry().getAddons().size());
Assert.assertEquals(0, furnace.getRepositories().get(0).listEnabled().size());

Furnace furnace2 = ServiceLoader.load(Furnace.class).iterator().next();
AddonDependencyResolver resolver = new MavenAddonDependencyResolver();
furnace2.addRepository(AddonRepositoryMode.MUTABLE, repository);
AddonManager addonManager = new AddonManagerImpl(furnace2, resolver);

AddonId addon = AddonId.from("test:no_dep", "1.1.2-SNAPSHOT");
InstallRequest install = addonManager.install(addon);
List<? extends AddonActionRequest> actions = install.getActions();
Assert.assertEquals(1, actions.size());
Assert.assertThat(actions.get(0), instanceOf(DeployRequest.class));
install.perform();

Addons.waitUntilStarted(furnace.getAddonRegistry().getAddon(addon));

Assert.assertEquals(1, furnace2.getRepositories().get(0).listEnabled().size());
Assert.assertEquals(1, furnace.getRepositories().get(0).listEnabled().size());
Assert.assertEquals(1, furnace.getAddonRegistry().getAddons().size());
}

}

0 comments on commit 8578984

Please sign in to comment.