/*******************************************************************************
 * Copyright (c) 2005, 2018 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
 *     Alexander Kurtakov <akurtako@redhat.com> - bug 458490
 *******************************************************************************/
package org.eclipse.core.tests.internal.runtime;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.tests.harness.BundleTestingHelper;
import org.eclipse.core.tests.runtime.RuntimeTest;
import org.eclipse.core.tests.runtime.RuntimeTestsPlugin;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;

public class PlatformURLLocalTest extends RuntimeTest {

	public static void assertEquals(String tag, URL expected, URL actual, boolean external) {
		if (external) {
			assertEquals(tag, expected, actual);
			return;
		}
		try {
			assertEquals(tag + ".1", new URL(expected.getProtocol(), expected.getHost(), expected.getPort(), expected.getFile()), new URL(actual.getProtocol(), actual.getHost(), actual.getPort(), actual.getFile()));
		} catch (MalformedURLException e) {
			fail(tag + ".2", e);
		}
	}

	public PlatformURLLocalTest(String name) {
		super(name);
	}

	public void testPlatformURLConfigResolution() {
		URL platformURL = null;
		try {
			// 	create a fake URL
			platformURL = new URL("platform:/config/x");
		} catch (MalformedURLException e) {
			fail("1.0", e);
		}
		URL resolvedURL = null;
		try {
			resolvedURL = FileLocator.resolve(platformURL);
		} catch (IOException e) {
			fail("2.0", e);
		}
		assertFalse("3.0", platformURL.equals(resolvedURL));
		URL expected = null;
		try {
			expected = new URL(Platform.getConfigurationLocation().getURL(), "x");
		} catch (MalformedURLException e) {
			fail("4.0", e);
		}
		assertEquals("5.0", expected, resolvedURL, false);
	}

	public void testPlatformURLMetaResolution() {
		URL platformURL = null;
		try {
			// 	create a fake URL
			platformURL = new URL("platform:/meta/" + PI_RUNTIME_TESTS + "/x");
		} catch (MalformedURLException e) {
			fail("1.0", e);
		}
		URL resolvedURL = null;
		try {
			resolvedURL = FileLocator.resolve(platformURL);
		} catch (IOException e) {
			fail("2.0", e);
		}
		assertFalse("3.0", platformURL.equals(resolvedURL));
		URL expected = null;
		try {
			expected = new URL(RuntimeTestsPlugin.getPlugin().getStateLocation().toFile().toURL(), "x");
		} catch (MalformedURLException e) {
			fail("4.0", e);
		}
		assertEquals("5.0", expected, resolvedURL, false);
	}

	public void testBug155081() throws IOException, BundleException {
		Bundle bundle = null;
		try {
			bundle = BundleTestingHelper.installBundle("0.1", RuntimeTestsPlugin.getContext(), RuntimeTestsPlugin.TEST_FILES_ROOT + "platformURL/platform.test.underscore");
			BundleTestingHelper.refreshPackages(RuntimeTestsPlugin.getContext(), new Bundle[] {bundle});
			URL test = new URL("platform:/plugin/platform.test.underscore_1.1.0.r321_v20060816/test.txt");
			InputStream in = test.openStream();
			in.close();
		} finally {
			if (bundle != null) {
				bundle.uninstall();
			}
		}
	}

	public void testBug300197_01() throws IOException, BundleException {
		Bundle bundle = null;
		try {
			bundle = BundleTestingHelper.installBundle("0.1", RuntimeTestsPlugin.getContext(), RuntimeTestsPlugin.TEST_FILES_ROOT + "platformURL/platform_test_underscore");
			BundleTestingHelper.refreshPackages(RuntimeTestsPlugin.getContext(), new Bundle[] {bundle});
			URL test = new URL("platform:/plugin/platform_test_underscore/test.txt");
			InputStream in = test.openStream();
			in.close();
		} finally {
			if (bundle != null) {
				bundle.uninstall();
			}
		}
	}

	public void testBug300197_02() throws IOException, BundleException {
		Bundle bundle = null;
		try {
			bundle = BundleTestingHelper.installBundle("0.1", RuntimeTestsPlugin.getContext(), RuntimeTestsPlugin.TEST_FILES_ROOT + "platformURL/platform_test_underscore_2.0.0");
			BundleTestingHelper.refreshPackages(RuntimeTestsPlugin.getContext(), new Bundle[] {bundle});
			URL test = new URL("platform:/plugin/platform_test_underscore_2.0.0/test.txt");
			InputStream in = test.openStream();
			in.close();
		} finally {
			if (bundle != null) {
				bundle.uninstall();
			}
		}
	}
}
