blob: 00bf6da17e721073a206c052fe8c73ad9d08a707 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.osgi.tests.services.datalocation;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import junit.framework.*;
import org.eclipse.core.runtime.internal.adaptor.BasicLocation;
import org.eclipse.core.tests.session.ConfigurationSessionTestSuite;
import org.eclipse.core.tests.session.SetupManager.SetupException;
import org.eclipse.osgi.service.datalocation.Location;
import org.eclipse.osgi.service.environment.Constants;
import org.eclipse.osgi.tests.OSGiTest;
import org.eclipse.osgi.tests.OSGiTestsActivator;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
public class LocationAreaSessionTest extends OSGiTest {
private static final String JAVA_NIO = "java.nio"; //$NON-NLS-1$
private static final String JAVA_IO = "java.io"; //$NON-NLS-1$
private static final String TEST_LOCATION_DIR = "osgi.test.location.dir"; //$NON-NLS-1$
private static Location lockedTestLocation;
static String testLocationLockDir = OSGiTestsActivator.getContext().getDataFile("testLocation").getAbsolutePath();
public static Test suite() {
TestSuite suite = new TestSuite(LocationAreaSessionTest.class.getName());
// first lock with java.nio
suite.addTest(new TestCase("testLockJavaNIO") {
public void runBare() throws Throwable {
doLock(testLocationLockDir, JAVA_NIO, false, true);
}
});
// attempt to lock same location with a session
ConfigurationSessionTestSuite sessionLock = new ConfigurationSessionTestSuite(PI_OSGI_TESTS, LocationAreaSessionTest.class.getName());
String[] ids = ConfigurationSessionTestSuite.MINIMAL_BUNDLE_SET;
for (int i = 0; i < ids.length; i++)
sessionLock.addBundle(ids[i]);
sessionLock.addBundle(PI_OSGI_TESTS);
try {
sessionLock.getSetup().setSystemProperty(TEST_LOCATION_DIR, testLocationLockDir);
} catch (SetupException e) {
// what can we do; just fail the testcase later when the prop is not set.
e.printStackTrace();
}
sessionLock.addTest(new LocationAreaSessionTest("testSessionFailLockJavaNIO"));
suite.addTest(sessionLock);
// now release lock
suite.addTest(new TestCase("testReleaseJavaNIO") {
public void runBare() throws Throwable {
doRelease();
}
});
// attempt to lock the location with a session
sessionLock = new ConfigurationSessionTestSuite(PI_OSGI_TESTS, LocationAreaSessionTest.class.getName());
for (int i = 0; i < ids.length; i++)
sessionLock.addBundle(ids[i]);
sessionLock.addBundle(PI_OSGI_TESTS);
try {
sessionLock.getSetup().setSystemProperty(TEST_LOCATION_DIR, testLocationLockDir);
} catch (SetupException e) {
// what can we do; just fail the testcase later when the prop is not set.
e.printStackTrace();
}
sessionLock.addTest(new LocationAreaSessionTest("testSessionSuccessLockJavaNIO"));
suite.addTest(sessionLock);
// now test with java.io
suite.addTest(new TestCase("testLockJavaIO") {
public void runBare() throws Throwable {
// Note that java.io locking only seems to work reliably on windows
if (!Constants.OS_WIN32.equals(System.getProperty("osgi.os")))
return;
doLock(testLocationLockDir, JAVA_IO, false, true);
}
});
// attempt to lock same location with a session
sessionLock = new ConfigurationSessionTestSuite(PI_OSGI_TESTS, LocationAreaSessionTest.class.getName());
ids = ConfigurationSessionTestSuite.MINIMAL_BUNDLE_SET;
for (int i = 0; i < ids.length; i++)
sessionLock.addBundle(ids[i]);
sessionLock.addBundle(PI_OSGI_TESTS);
try {
sessionLock.getSetup().setSystemProperty(TEST_LOCATION_DIR, testLocationLockDir);
} catch (SetupException e) {
// what can we do; just fail the testcase later when the prop is not set.
e.printStackTrace();
}
sessionLock.addTest(new LocationAreaSessionTest("testSessionFailLockJavaIO"));
suite.addTest(sessionLock);
// now release lock
suite.addTest(new TestCase("testReleaseJavaIO") {
public void runBare() throws Throwable {
if (!Constants.OS_WIN32.equals(System.getProperty("osgi.os")))
return;
doRelease();
}
});
// attempt to lock the location with a session
sessionLock = new ConfigurationSessionTestSuite(PI_OSGI_TESTS, LocationAreaSessionTest.class.getName());
for (int i = 0; i < ids.length; i++)
sessionLock.addBundle(ids[i]);
sessionLock.addBundle(PI_OSGI_TESTS);
try {
sessionLock.getSetup().setSystemProperty(TEST_LOCATION_DIR, testLocationLockDir);
} catch (SetupException e) {
// what can we do; just fail the testcase later when the prop is not set.
e.printStackTrace();
}
sessionLock.addTest(new LocationAreaSessionTest("testSessionSuccessLockJavaIO"));
suite.addTest(sessionLock);
return suite;
}
public LocationAreaSessionTest(String name) {
super(name);
}
static void doLock(String testLocationDir, String type, boolean release, boolean succeed) {
String oldLockingValue = System.setProperty(BasicLocation.PROP_OSGI_LOCKING, type);
try {
doLock(testLocationDir, release, succeed);
} finally {
if (oldLockingValue == null)
System.getProperties().remove(BasicLocation.PROP_OSGI_LOCKING);
else
System.setProperty(BasicLocation.PROP_OSGI_LOCKING, oldLockingValue);
}
}
static void doLock(String testLocationDir, boolean release, boolean succeed) {
if (testLocationDir == null)
fail("The testLocationDir is not set");
ServiceReference[] refs = null;
try {
refs = OSGiTestsActivator.getContext().getServiceReferences(Location.class.getName(), "(type=osgi.configuration.area)");
} catch (InvalidSyntaxException e) {
fail("failed to create filter", e);
}
// this is test code so we are not very careful; just assume there is at lease one service. Do not copy and paste this code!!!
Location configLocation = (Location) OSGiTestsActivator.getContext().getService(refs[0]);
Location testLocation = null;
try {
testLocation = configLocation.createLocation(null, new File(testLocationDir).toURL(), false);
testLocation.setURL(testLocation.getDefault(), false);
// try locking location
if (succeed ? testLocation.isLocked() : !testLocation.isLocked())
fail("location should " + (succeed ? "not " : "") + "be locked");
if (succeed ? !testLocation.lock() : testLocation.lock())
fail((succeed ? "Could not" : "Could") + " lock location");
if (!testLocation.isLocked())
fail("location should be locked");
} catch (MalformedURLException e) {
fail("failed to create the location URL", e);
} catch (IOException e) {
fail("failed to lock with IOExcetpion", e);
} finally {
if (release && testLocation != null)
testLocation.release();
if (!release)
lockedTestLocation = testLocation;
OSGiTestsActivator.getContext().ungetService(refs[0]);
}
}
static void doRelease() {
try {
if (lockedTestLocation == null)
fail("lockedTestLocation == null !!");
if (!lockedTestLocation.isLocked())
fail("lockedTestLocation is not locked!!");
lockedTestLocation.release();
if (lockedTestLocation.isLocked())
fail("lockedTestLocation is still locked!!");
} catch (IOException e) {
fail("failed to unlock lockedTestLocation", e);
} finally {
lockedTestLocation = null;
}
}
public void testSessionFailLockJavaNIO() {
doLock(System.getProperty(TEST_LOCATION_DIR), JAVA_NIO, true, false);
}
public void testSessionSuccessLockJavaNIO() {
doLock(System.getProperty(TEST_LOCATION_DIR), JAVA_NIO, true, true);
}
public void testSessionFailLockJavaIO() {
if (!Constants.OS_WIN32.equals(System.getProperty("osgi.os")))
return;
doLock(System.getProperty(TEST_LOCATION_DIR), JAVA_IO, true, false);
}
public void testSessionSuccessLockJavaIO() {
if (!Constants.OS_WIN32.equals(System.getProperty("osgi.os")))
return;
doLock(System.getProperty(TEST_LOCATION_DIR), JAVA_IO, true, true);
}
}