| /******************************************************************************* |
| * Copyright (c) 2006, 2012 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.core.tests.internal.runtime; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.URL; |
| import java.util.HashMap; |
| import java.util.Map; |
| import junit.framework.Test; |
| import junit.framework.TestSuite; |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.core.tests.harness.BundleTestingHelper; |
| import org.eclipse.core.tests.harness.CoreTest; |
| import org.eclipse.core.tests.runtime.RuntimeTestsPlugin; |
| import org.osgi.framework.*; |
| |
| public class FileLocatorTest extends CoreTest { |
| |
| private final static String searchLocation = "$nl$/intro/messages.properties"; |
| |
| private final static String nl = "aa_BB"; // make sure we have a stable NL value |
| |
| private final static String mostSpecificPath = "/nl/aa/BB/intro/messages.properties"; |
| private final static String lessSpecificPath = "/nl/aa/intro/messages.properties"; |
| private final static String nonSpecificPath = "/intro/messages.properties"; |
| |
| public FileLocatorTest(String name) { |
| super(name); |
| } |
| |
| public void testFileLocatorFind() throws IOException, BundleException { |
| Bundle bundle = BundleTestingHelper.installBundle("Plugin", RuntimeTestsPlugin.getContext(), RuntimeTestsPlugin.TEST_FILES_ROOT + "fileLocator/testFileLocator"); |
| BundleTestingHelper.refreshPackages(RuntimeTestsPlugin.getContext(), new Bundle[] {bundle}); |
| Bundle fragment = BundleTestingHelper.installBundle("Fragment", RuntimeTestsPlugin.getContext(), RuntimeTestsPlugin.TEST_FILES_ROOT + "fileLocator/testFileLocator.nl"); |
| BundleTestingHelper.refreshPackages(RuntimeTestsPlugin.getContext(), new Bundle[] {fragment}); |
| |
| IPath path = new Path(searchLocation); |
| Map map = new HashMap(1); |
| map.put("$nl$", nl); |
| |
| URL oneSolution = FileLocator.find(bundle, path, map); |
| assertNotNull(oneSolution); |
| assertTrue(oneSolution.getPath().equals(mostSpecificPath)); |
| assertBundleURL(oneSolution); |
| |
| URL[] solutions = FileLocator.findEntries(bundle, path, map); |
| |
| // expected: |
| // Bundle/nl/aa/BB/intro/messages.properties, |
| // Fragment/nl/aa/BB/intro/messages.properties, |
| // Bundle/nl/aa/intro/messages.properties, |
| // Fragment/nl/aa/intro/messages.properties, |
| // Bundle/121/intro/messages.properties |
| |
| assertTrue(solutions.length == 5); |
| |
| assertTrue(solutions[0].getPath().equals(mostSpecificPath)); |
| assertBundleURL(solutions[0]); |
| assertTrue(solutions[1].getPath().equals(mostSpecificPath)); |
| assertFragmentURL(solutions[1]); |
| |
| assertTrue(solutions[2].getPath().equals(lessSpecificPath)); |
| assertBundleURL(solutions[2]); |
| assertTrue(solutions[3].getPath().equals(lessSpecificPath)); |
| assertFragmentURL(solutions[3]); |
| |
| assertTrue(solutions[4].getPath().equals(nonSpecificPath)); |
| assertBundleURL(solutions[4]); |
| |
| // remove the first bundle |
| fragment.uninstall(); |
| BundleTestingHelper.refreshPackages(RuntimeTestsPlugin.getContext(), new Bundle[] {fragment}); |
| bundle.uninstall(); |
| BundleTestingHelper.refreshPackages(RuntimeTestsPlugin.getContext(), new Bundle[] {bundle}); |
| } |
| |
| public void testFileLocatorGetBundleFile01() throws BundleException, IOException { |
| // test for bug 198447 |
| // install the bundle via reference |
| BundleContext context = RuntimeTestsPlugin.getContext(); |
| URL url = context.getBundle().getEntry(RuntimeTestsPlugin.TEST_FILES_ROOT + "fileLocator/testFileLocatorGetRootFile"); |
| Bundle bundle = context.installBundle("reference:" + FileLocator.toFileURL(url).toExternalForm()); |
| BundleTestingHelper.refreshPackages(context, new Bundle[] {bundle}); |
| |
| File file1 = FileLocator.getBundleFile(bundle); |
| assertNotNull(file1); |
| |
| URL fileURL = FileLocator.toFileURL(context.getBundle().getEntry(RuntimeTestsPlugin.TEST_FILES_ROOT + "fileLocator/testFileLocatorGetRootFile")); |
| assertTrue(new File(fileURL.getFile()).equals(file1)); |
| |
| // remove the bundle |
| bundle.uninstall(); |
| BundleTestingHelper.refreshPackages(context, new Bundle[] {bundle}); |
| } |
| |
| public void testFileLocatorGetBundleFile02() throws BundleException, IOException { |
| // install the bundle via reference |
| BundleContext context = RuntimeTestsPlugin.getContext(); |
| URL url = context.getBundle().getEntry(RuntimeTestsPlugin.TEST_FILES_ROOT + "fileLocator/testFileLocatorGetRootFile.jar"); |
| Bundle bundle = context.installBundle("reference:" + FileLocator.toFileURL(url).toExternalForm()); |
| BundleTestingHelper.refreshPackages(context, new Bundle[] {bundle}); |
| |
| File file1 = FileLocator.getBundleFile(bundle); |
| assertNotNull(file1); |
| |
| URL fileURL = FileLocator.toFileURL(context.getBundle().getEntry(RuntimeTestsPlugin.TEST_FILES_ROOT + "fileLocator/testFileLocatorGetRootFile.jar")); |
| assertTrue(new File(fileURL.getFile()).equals(file1)); |
| |
| URL manifest = bundle.getEntry("META-INF/MANIFEST.MF"); |
| manifest = FileLocator.resolve(manifest); |
| assertEquals("Expection jar protocol: " + manifest.toExternalForm(), "jar", manifest.getProtocol()); |
| |
| String manifestExternal = manifest.toExternalForm(); |
| int index = manifestExternal.lastIndexOf('!'); |
| assertTrue("No ! found", index >= 0); |
| String fileExternal = manifestExternal.substring(4, index); |
| try { |
| URL fileExternalURL = new URL(fileExternal); |
| new File(fileExternalURL.toURI()); |
| } catch (Exception e) { |
| fail("Unexpected exception.", e); |
| } |
| |
| // remove the bundle |
| bundle.uninstall(); |
| BundleTestingHelper.refreshPackages(context, new Bundle[] {bundle}); |
| } |
| |
| private Bundle getHostBundle(URL url) { |
| String host = url.getHost(); |
| int dot = host.indexOf('.'); |
| Long hostId = Long.decode(dot < 0 ? host : host.substring(0, dot)); |
| assertNotNull(hostId); |
| return RuntimeTestsPlugin.getContext().getBundle(hostId.longValue()); |
| } |
| |
| private void assertBundleURL(URL url) { |
| Bundle hostBundle = getHostBundle(url); |
| assertNotNull(hostBundle); |
| assertTrue(hostBundle.getSymbolicName().equals("fileLocatorTest")); |
| } |
| |
| private void assertFragmentURL(URL url) { |
| Bundle hostBundle = getHostBundle(url); |
| assertNotNull(hostBundle); |
| assertTrue(hostBundle.getSymbolicName().equals("fileLocatorTest.nl")); |
| } |
| |
| public static Test suite() { |
| TestSuite sameSession = new TestSuite(FileLocatorTest.class.getName()); |
| sameSession.addTest(new FileLocatorTest("testFileLocatorFind")); |
| sameSession.addTest(new FileLocatorTest("testFileLocatorGetBundleFile01")); |
| sameSession.addTest(new FileLocatorTest("testFileLocatorGetBundleFile02")); |
| return sameSession; |
| } |
| } |