/*******************************************************************************
 * Copyright (c) 2000, 2013 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.jdt.debug.tests.core;

import java.io.File;
import java.net.URL;
import java.util.Map;

import org.eclipse.jdt.debug.testplugin.JavaTestPlugin;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.internal.launching.LaunchingPlugin;
import org.eclipse.jdt.launching.ILibraryLocationResolver;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.IVMInstall2;
import org.eclipse.jdt.launching.IVMInstall3;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.launching.LibraryLocation;
import org.eclipse.jdt.launching.VMStandin;

/**
 * Tests for installed VMs
 */
public class VMInstallTests extends AbstractDebugTest {

	public VMInstallTests() {
		super("VM Install tests");
	}
	
	/**
	 * Constructor
	 * @param name the name of the test
	 */
	public VMInstallTests(String name) {
		super(name);
	}

	/**
	 * Tests the java version from the VMInstall
	 */
	public void testJavaVersion() {
		IVMInstall def = JavaRuntime.getDefaultVMInstall();
		assertTrue("should be an IVMInstall2", def instanceof IVMInstall2);
		IVMInstall2 vm2 = (IVMInstall2)def;
        String javaVersion = vm2.getJavaVersion();
        assertNotNull("default VM is missing java.version", javaVersion);
	}
	
	/**
	 * Test acquiring the set of system properties
	 * @throws CoreException
	 */
	public void testSystemProperties() throws CoreException {
		IVMInstall def = JavaRuntime.getDefaultVMInstall();
		assertTrue("should be an IVMInstall3", def instanceof IVMInstall3);
		IVMInstall3 vm3 = (IVMInstall3)def;
		Map<String, String> map = vm3.evaluateSystemProperties(new String[]{"user.home"}, new NullProgressMonitor());
		assertNotNull("No system properties returned", map);
		assertEquals("Wrong number of properties", 1, map.size());
		String value = map.get("user.home");
		assertNotNull("missing user.home", value);
	}
	
	/**
	 * Test acquiring the set of system properties that have been asked for - they should be cached in JDT launching
	 * @throws CoreException
	 */
	public void testSystemPropertiesCaching() throws CoreException {
		IVMInstall def = JavaRuntime.getDefaultVMInstall();
		assertTrue("should be an IVMInstall3", def instanceof IVMInstall3);
		IVMInstall3 vm3 = (IVMInstall3)def;
		Map<String, String> map = vm3.evaluateSystemProperties(new String[]{"user.home"}, new NullProgressMonitor());
		assertNotNull("No system properties returned", map);
		assertEquals("Wrong number of properties", 1, map.size());
		String value = map.get("user.home");
		assertNotNull("missing user.home", value);
		//check the prefs
		String key = getSystemPropertyKey(def, "user.home");
		value = Platform.getPreferencesService().getString(
				LaunchingPlugin.ID_PLUGIN, 
				key, 
				null, 
				null);
		assertNotNull("'user.home' system property should be cached", value);
	}
	
	/**
	 * Tests the new support for {@link ILibraryLocationResolver}s asking for {@link LibraryLocation}s
	 * using the {@link JavaRuntime#getLibraryLocations(IVMInstall)}s API
	 * 
	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399798
	 * @throws Exception
	 */
	public void testLibraryResolver1() throws Exception {
		VMInstallTestsLibraryLocationResolver.isTesting = true;
		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
		assertNotNull("There must be a default VM", vm);
		
		//invalidate it, causing a reset, then collect it again
		vm.getVMInstallType().disposeVMInstall(vm.getId());
		vm = JavaRuntime.getDefaultVMInstall();
		assertNotNull("There must be a default VM after a reset", vm);
		try {
			LibraryLocation[] locs = JavaRuntime.getLibraryLocations(vm);
			assertNotNull("there must be some default library locations", locs);
			assertResolvedLibraryLocations(locs);
		}
		finally {
			VMInstallTestsLibraryLocationResolver.isTesting = false;
			//force a re-compute to remove the bogus paths
			vm.getVMInstallType().disposeVMInstall(vm.getId());
		}
	}
	
	/**
	 * Tests the {@link ILibraryLocationResolver} asking for libs using an EE description file
	 * 
	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399798
	 * @throws Exception
	 */
	public void testLibraryResolver2() throws Exception {
		VMInstallTestsLibraryLocationResolver.isTesting = true;
		try {
			String filename = "/testfiles/test-jre/bin/test-resolver.ee";
			if(Platform.OS_WIN32.equals(Platform.getOS())) {
				filename = "/testfiles/test-jre/bin/test-resolver-win32.ee";
			}
			VMStandin vm = getEEStandin(filename);
			IVMInstall install = vm.convertToRealVM();
			LibraryLocation[ ] locs = install.getLibraryLocations();
			assertResolvedLibraryLocations(locs);
		}
		finally {
			VMInstallTestsLibraryLocationResolver.isTesting = false;
		}
	}
	
	/**
	 * Tests the {@link ILibraryLocationResolver} asking for libs directly from the backing type of the {@link IVMInstall}
	 * 
	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399798
	 * @throws Exception
	 */
	public void testLibraryResolver3() throws Exception {
		VMInstallTestsLibraryLocationResolver.isTesting = true;
		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
		assertNotNull("There must be a default VM", vm);
		try {
			//reset it
			vm.getVMInstallType().disposeVMInstall(vm.getId());
			vm = JavaRuntime.getDefaultVMInstall();
			assertNotNull("There must be a default VM", vm);
			
			LibraryLocation[] locs = vm.getVMInstallType().getDefaultLibraryLocations(vm.getInstallLocation());
			assertResolvedLibraryLocations(locs);
		}
		finally {
			VMInstallTestsLibraryLocationResolver.isTesting = false;
			vm.getVMInstallType().disposeVMInstall(vm.getId());
		}
	}
	
	/**
	 * Tests the {@link ILibraryLocationResolver} asking for libs using an EE description file that provides
	 * a source path for the ext dirs does *not* get overridden by the resolver
	 * 
	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399798
	 * @throws Exception
	 */
	public void testLibraryResolver4() throws Exception {
		VMInstallTestsLibraryLocationResolver.isTesting = true;
		try {
			String filename = "/testfiles/test-jre/bin/test-resolver2.ee";
			if(Platform.OS_WIN32.equals(Platform.getOS())) {
				filename = "/testfiles/test-jre/bin/test-resolver-win32-2.ee";
			}
			VMStandin vm = getEEStandin(filename);
			IVMInstall install = vm.convertToRealVM();
			LibraryLocation[ ] locs = install.getLibraryLocations();
			String locpath = null;
			for (int i = 0; i < locs.length; i++) {
				IPath path = locs[i].getSystemLibraryPath();
				if(VMInstallTestsLibraryLocationResolver.applies(path)) {
					locpath = path.toString();
					assertTrue("The original source path should be set on the ext lib [" + locpath + "]",
							locs[i].getSystemLibrarySourcePath().toString().indexOf("source.txt") > -1);
				}
			}
		}
		finally {
			VMInstallTestsLibraryLocationResolver.isTesting = false;
		}
	}
	
	/**
	 * Checks the given {@link LibraryLocation}s to ensure they reference the testing resolver paths
	 * 
	 * @param locs
	 */
	void assertResolvedLibraryLocations(LibraryLocation[] locs) {
		String locpath = null;
		for (int i = 0; i < locs.length; i++) {
			IPath path = locs[i].getSystemLibraryPath();
			if(VMInstallTestsLibraryLocationResolver.applies(path)) {
				locpath = path.toString();
				assertTrue("There should be a source path ending in test_resolver_src.zip on the ext lib [" + locpath + "]",
						locs[i].getSystemLibrarySourcePath().toString().indexOf("test_resolver_src.zip") > -1);
				IPath root = locs[i].getPackageRootPath();
				assertTrue("The source root path should be 'src' for ext lib ["+locpath+"]", root.toString().equals("src"));
				URL url = locs[i].getJavadocLocation();
				assertNotNull("There should be a Javadoc URL set for ext lib ["+locpath+"]", url);
				assertTrue("There should be a javadoc path of test_resolver_javadoc.zip on the ext lib ["+locpath+"]", 
						url.getPath().indexOf("test_resolver_javadoc.zip") > -1);
				url = locs[i].getIndexLocation();
				assertNotNull("There should be an index path of test_resolver_index.index on the ext lib ["+locpath+"]", url);
				assertTrue("There should be an index path of test_resolver_index.index on the ext lib ["+locpath+"]", 
						url.getPath().indexOf("test_resolver_index.index") > -1);
			}
		}
	}
	
	/**
	 * Creates a {@link VMStandin} for the given EE file. Does not return <code>null</code>
	 * @param filename
	 * @return the {@link VMStandin}
	 * @throws CoreException
	 */
	VMStandin getEEStandin(String filename) throws CoreException {
		File ee = JavaTestPlugin.getDefault().getFileInPlugin(new Path(filename));
		assertNotNull("The EE file "+filename+" was not found", ee);
		VMStandin vm = JavaRuntime.createVMFromDefinitionFile(ee, "resolver-ee", "resolver-ee-id");
		assertNotNull("the VM standin should exist for "+filename, vm);
		return vm;
	}
	
	/**
	 * Generates a key used to cache system property for this VM in this plug-ins
	 * preference store.
	 * 
	 * @param property system property name
	 * @return preference store key
	 */
	private String getSystemPropertyKey(IVMInstall vm, String property) {
		StringBuffer buffer = new StringBuffer();
		buffer.append("PREF_VM_INSTALL_SYSTEM_PROPERTY");
		buffer.append("."); //$NON-NLS-1$
		buffer.append(vm.getVMInstallType().getId());
		buffer.append("."); //$NON-NLS-1$
		buffer.append(vm.getId());
		buffer.append("."); //$NON-NLS-1$
		buffer.append(property);
		return buffer.toString();
	}
	
}