/*******************************************************************************
 * Copyright (c) 2006, 2022 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Hannes Wellmann - Bug 578702 - Move FileLocatorTest to rt.equinox.bundles repository
 *******************************************************************************/
package org.eclipse.core.runtime.tests;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.tests.harness.BundleTestingHelper;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.FrameworkUtil;

public class FileLocatorTest {

	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";

	@Test
	public void testFileLocatorFind() throws IOException, BundleException {
		Bundle bundle = BundleTestingHelper.installBundle("Plugin", getContext(),
				"Plugin_Testing/fileLocator/testFileLocator");
		BundleTestingHelper.refreshPackages(getContext(), new Bundle[] { bundle });
		Bundle fragment = BundleTestingHelper.installBundle("Fragment", getContext(),
				"Plugin_Testing/fileLocator/testFileLocator.nl");
		BundleTestingHelper.refreshPackages(getContext(), new Bundle[] { fragment });

		IPath path = new Path(searchLocation);
		Map<String, String> map = new HashMap<>(1);
		map.put("$nl$", nl);

		URL oneSolution = FileLocator.find(bundle, path, map);
		assertNotNull(oneSolution);
		assertEquals(mostSpecificPath, oneSolution.getPath());
		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

		assertEquals(5, solutions.length);

		assertEquals(mostSpecificPath, solutions[0].getPath());
		assertBundleURL(solutions[0]);
		assertEquals(mostSpecificPath, solutions[1].getPath());
		assertFragmentURL(solutions[1]);

		assertEquals(lessSpecificPath, solutions[2].getPath());
		assertBundleURL(solutions[2]);
		assertEquals(lessSpecificPath, solutions[3].getPath());
		assertFragmentURL(solutions[3]);

		assertEquals(nonSpecificPath, solutions[4].getPath());
		assertBundleURL(solutions[4]);

		// remove the first bundle
		fragment.uninstall();
		BundleTestingHelper.refreshPackages(getContext(), new Bundle[] { fragment });
		bundle.uninstall();
		BundleTestingHelper.refreshPackages(getContext(), new Bundle[] { bundle });
	}

	@Test
	public void testFileLocatorGetBundleFile01() throws BundleException, IOException {
		// test for bug 198447
		// install the bundle via reference
		BundleContext context = getContext();
		URL url = context.getBundle().getEntry("Plugin_Testing/fileLocator/testFileLocatorGetRootFile");
		Bundle bundle = context.installBundle("reference:" + FileLocator.toFileURL(url).toExternalForm());
		BundleTestingHelper.refreshPackages(context, new Bundle[] { bundle });

		File file1 = FileLocator.getBundleFileLocation(bundle).get();
		assertNotNull(file1);
		assertSame(file1, FileLocator.getBundleFile(bundle));

		URL fileURL = FileLocator
				.toFileURL(context.getBundle().getEntry("Plugin_Testing/fileLocator/testFileLocatorGetRootFile"));
		assertEquals(file1, new File(fileURL.getFile()));

		// remove the bundle
		bundle.uninstall();
		BundleTestingHelper.refreshPackages(context, new Bundle[] { bundle });
	}

	@Test
	public void testFileLocatorGetBundleFile02() throws BundleException, IOException, URISyntaxException {
		// install the bundle via reference
		BundleContext context = getContext();
		URL url = context.getBundle().getEntry("Plugin_Testing/fileLocator/testFileLocatorGetRootFile.jar");
		Bundle bundle = context.installBundle("reference:" + FileLocator.toFileURL(url).toExternalForm());
		BundleTestingHelper.refreshPackages(context, new Bundle[] { bundle });

		File file1 = FileLocator.getBundleFileLocation(bundle).get();
		assertNotNull(file1);
		assertSame(file1, FileLocator.getBundleFile(bundle));

		URL fileURL = FileLocator
				.toFileURL(context.getBundle().getEntry("Plugin_Testing/fileLocator/testFileLocatorGetRootFile.jar"));
		assertEquals(file1, new File(fileURL.getFile()));

		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);

		URL fileExternalURL = new URL(fileExternal);
		new File(fileExternalURL.toURI());

		// remove the bundle
		bundle.uninstall();
		BundleTestingHelper.refreshPackages(context, new Bundle[] { bundle });
	}

	private BundleContext getContext() {
		return FrameworkUtil.getBundle(FileLocatorTest.class).getBundleContext();
	}

	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 getContext().getBundle(hostId.longValue());
	}

	private void assertBundleURL(URL url) {
		Bundle hostBundle = getHostBundle(url);
		assertNotNull(hostBundle);
		assertEquals("fileLocatorTest", hostBundle.getSymbolicName());
	}

	private void assertFragmentURL(URL url) {
		Bundle hostBundle = getHostBundle(url);
		assertNotNull(hostBundle);
		assertEquals("fileLocatorTest.nl", hostBundle.getSymbolicName());
	}
}
