blob: 2defaf15261b00a998a2dc8d620286314d6d0a1c [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.equinox;
import static org.junit.Assert.assertNotNull;
import java.io.File;
import org.junit.Ignore;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.eclipse.virgo.util.io.PathReference;
/**
*/
public class BundleUpdateTests extends AbstractOsgiFrameworkLaunchingTests {
@Override
protected String getRepositoryConfigDirectory() {
return new File("src/test/resources/config/BundleUpdateTests").getAbsolutePath();
}
/*
* This test checks the behaviour of class loading during a bundle update operation. The test passes on Mac OS X, but
* it seems unlikely to pass on some other operating systems. The basic question is how can classes be loaded from the
* old version of a bundle after the bundle has been updated if install by reference is used.
*
* The test installs two bundles but.B and but.C and starts but.C. but.C loads class but.A which is exported
* by but.B and listens synchronously for an update event for bundle but.B. This test method overwrites bundle but.B
* and issues an update for the bundle. The new version of but.B contains a new version of class but.A.
*
* The old version of bundle but.B also contains a class but.B which depends on the class but.A. The new version
* of bundle but.B contains a new version of class but.B which depends on the new version of but.A and which will fail
* if it is loaded with the old version of but.A.
*
* When the synchronous bundle listener in bundle but.C is notified of the update of bundle but.B, it loads the class
* but.B. This will succeed if it is loads the old version of the class but will fail if it loads the new version of the
* class.
*/
@Test
@Ignore("See DMS-2886")
public void testUpdate() throws Exception {
PathReference bBeforeSrc = new PathReference("src/test/resources/but/but.B.before.jar");
PathReference b = new PathReference("build/but.B.jar");
b.delete();
bBeforeSrc.copy(b);
Bundle bBundle = this.framework.getBundleContext().installBundle(b.toFile().toURI().toString());
assertNotNull(bBundle);
PathReference cSrc = new PathReference("src/test/resources/but/but.C.jar");
PathReference c = new PathReference("build/but.C.jar");
c.delete();
cSrc.copy(c);
Bundle cBundle = this.framework.getBundleContext().installBundle(c.toFile().toURI().toString());
assertNotNull(cBundle);
cBundle.start();
PathReference bAfterSrc = new PathReference("src/test/resources/but/but.B.after.jar");
b.delete();
bAfterSrc.copy(b);
bBundle.update();
}
}