blob: 71bf3178c2dd6220eaf44823e09dbe093008c2ff [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMware Inc. - initial contribution
*******************************************************************************/
package org.eclipse.virgo.kernel.userregion.internal;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.reset;
import static org.easymock.EasyMock.verify;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
import org.eclipse.virgo.nano.core.Shutdown;
import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
import org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser;
import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
import org.eclipse.virgo.kernel.userregion.internal.InitialArtifactDeployer;
import org.eclipse.virgo.kernel.userregion.internal.KernelStartedAwaiter;
import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
public class InitialArtifactDeployerTests {
private static final Map<String, ?> NULL_PROPERTIES = (Map<String, ?>)null;
private ApplicationDeployer deployer = createMock(ApplicationDeployer.class);
private KernelStartedAwaiter startedAwaiter = new KernelStartedAwaiter();
private StubEventAdmin eventAdmin = new StubEventAdmin();
private MockEventLogger eventLogger = new MockEventLogger();
private Shutdown shutdown = createMock(Shutdown.class);
@Test
public void basicEventingWithNoArtifactDeployment() throws InterruptedException {
replay(this.deployer);
InitialArtifactDeployer initialArtifactDeployer = new InitialArtifactDeployer(this.startedAwaiter, this.deployer, "", "", new StubDeployUriNormaliser(), this.eventAdmin, this.eventLogger, this.shutdown);
this.startedAwaiter.handleEvent(new Event("org/eclipse/virgo/kernel/STARTED", NULL_PROPERTIES));
initialArtifactDeployer.deployArtifacts();
Event eventSystemArtifactsDeployed = new Event("org/eclipse/virgo/kernel/userregion/systemartifacts/DEPLOYED", NULL_PROPERTIES);
this.eventAdmin.awaitPostingOfEvent(eventSystemArtifactsDeployed);
initialArtifactDeployer.handleEvent(eventSystemArtifactsDeployed);
this.eventAdmin.awaitPostingOfEvent(new Event("org/eclipse/virgo/kernel/userregion/userartifacts/DEPLOYED", NULL_PROPERTIES));
verify(this.deployer);
}
@Test
public void artifactDeployment() throws DeploymentException, InterruptedException {
InitialArtifactDeployer initialArtifactDeployer = new InitialArtifactDeployer(this.startedAwaiter, this.deployer, "repository:alpha/bravo/1, repository:alpha/bravo/2", "repository:charlie/delta,repository:echo/foxtrot/2", new StubDeployUriNormaliser(), this.eventAdmin, this.eventLogger, this.shutdown);
expect(this.deployer.deploy(URI.create("repository:alpha/bravo/1"), new DeploymentOptions(false, false, true))).andReturn(null);
expect(this.deployer.deploy(URI.create("repository:alpha/bravo/2"), new DeploymentOptions(false, false, true))).andReturn(null);
replay(this.deployer);
this.startedAwaiter.handleEvent(new Event("org/eclipse/virgo/kernel/STARTED", NULL_PROPERTIES));
initialArtifactDeployer.deployArtifacts();
Event eventSystemArtifactsDeployed = new Event("org/eclipse/virgo/kernel/userregion/systemartifacts/DEPLOYED", NULL_PROPERTIES);
this.eventAdmin.awaitPostingOfEvent(eventSystemArtifactsDeployed);
verify(this.deployer);
reset(this.deployer);
expect(this.deployer.deploy(URI.create("repository:charlie/delta"), new DeploymentOptions(false, false, true))).andReturn(null);
expect(this.deployer.deploy(URI.create("repository:echo/foxtrot/2"), new DeploymentOptions(false, false, true))).andReturn(null);
replay(this.deployer);
initialArtifactDeployer.handleEvent(eventSystemArtifactsDeployed);
this.eventAdmin.awaitPostingOfEvent(new Event("org/eclipse/virgo/kernel/userregion/userartifacts/DEPLOYED", NULL_PROPERTIES));
verify(this.deployer);
}
@Test
public void failedDeploymentLogsMessageAndTriggersShutdown() throws DeploymentException, InterruptedException {
InitialArtifactDeployer initialArtifactDeployer = new InitialArtifactDeployer(this.startedAwaiter, this.deployer, "repository:alpha/bravo/1", null, new StubDeployUriNormaliser(), this.eventAdmin, this.eventLogger, this.shutdown);
expect(this.deployer.deploy(URI.create("repository:alpha/bravo/1"), new DeploymentOptions(false, false, true))).andThrow(new DeploymentException("Deployment failed"));
replay(this.deployer);
this.shutdown.shutdown();
replay(this.shutdown);
this.startedAwaiter.handleEvent(new Event("org/eclipse/virgo/kernel/STARTED", NULL_PROPERTIES));
initialArtifactDeployer.deployArtifacts();
while (!this.eventLogger.isLogged("UR0002E")) {
Thread.sleep(100);
}
Thread.sleep(100);
verify(this.deployer, this.shutdown);
}
private final class StubEventAdmin implements EventAdmin {
private final List<Event> postedEvents = new ArrayList<Event>();
private final List<Event> sentEvents = new ArrayList<Event>();
private final Object monitor = new Object();
public void postEvent(Event event) {
synchronized (this.monitor) {
this.postedEvents.add(event);
}
}
public void sendEvent(Event event) {
synchronized (this.monitor) {
this.sentEvents.add(event);
}
}
public void awaitPostingOfEvent(Event event) {
boolean eventSent = false;
while (!eventSent) {
synchronized (this.monitor) {
eventSent = this.postedEvents.contains(event);
}
}
}
}
private static final class StubDeployUriNormaliser implements DeployUriNormaliser {
public URI normalise(URI uri) throws DeploymentException {
return uri;
}
}
}