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

import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;

import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.debug.testplugin.JavaTestPlugin;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.internal.launching.MacInstalledJREs.JREDescriptor;
import org.eclipse.jdt.internal.launching.MacInstalledJREs;
import org.eclipse.jdt.internal.launching.PListParser;

/**
 * Tests the PList Parser.
 */
public class PListParserTests extends AbstractDebugTest {

	/**
	 * Constructs a test
	 * 
	 * @param name test name
	 */
	public PListParserTests(String name) {
		super(name);
	}
	
	/**
	 * Tests parsing of a sample installed JREs plist from the Mac.
	 * 
	 * @throws Exception
	 */
	public void testParseJREs() throws Exception {
		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/plist.xml"));
		assertNotNull(file);
		assertEquals(true, file.exists());
		Object obj = new PListParser().parse(new FileInputStream(file));
		if (obj instanceof Object[]) {
			Object[] jres = (Object[]) obj;
			assertEquals("Should be 3 entries in the array", 3, jres.length);
			// the first map
			HashMap<String, Comparable<?>> map = new HashMap<String, Comparable<?>>();
			map.put("JVMArch", "i386");
			map.put("JVMBundleID", "com.apple.javajdk15");
			map.put("JVMEnabled", Boolean.TRUE);
			map.put("JVMHomePath", "/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home");
			map.put("JVMIsBuiltIn", Boolean.TRUE);
			map.put("JVMName", "J2SE 5.0");
			map.put("JVMPlatformVersion", "1.5");
			map.put("JVMVersion", "1.5.0_24");
			map.put("test", Boolean.FALSE);
			map.put("testint", new Integer(42));
			assertEquals("Incorrect values parsed", map, jres[0]);
			
			map = new HashMap<String, Comparable<?>>();
			map.put("JVMArch", "x86_64");
			map.put("JVMBundleID", "com.apple.javajdk16");
			map.put("JVMEnabled", Boolean.TRUE);
			map.put("JVMHomePath", "/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home");
			map.put("JVMIsBuiltIn", Boolean.TRUE);
			map.put("JVMName", "Java SE 6");
			map.put("JVMPlatformVersion", "1.6");
			map.put("JVMVersion", "1.6.0_20");
			assertEquals("Incorrect values parsed", map, jres[1]);
			
			map = new HashMap<String, Comparable<?>>();
			map.put("JVMArch", "x86_64");
			map.put("JVMBundleID", "com.apple.javajdk15");
			map.put("JVMEnabled", Boolean.TRUE);
			map.put("JVMHomePath", "/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home");
			map.put("JVMIsBuiltIn", Boolean.TRUE);
			map.put("JVMName", "J2SE 5.0");
			map.put("JVMPlatformVersion", "1.5");
			map.put("JVMVersion", "1.5.0_24");
			assertEquals("Incorrect values parsed", map, jres[2]);
		} else {
			assertTrue("Top level object should be an array", false);
		}
	}

	/**
	 * Tests that we parse out the correct number of raw entries from the 'lion' plist output
	 * 
	 * @throws Exception
	 * @since 3.8
	 */
	public void testParseLionJREs() throws Exception {
		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/plist-lion.xml"));
		assertNotNull(file);
		assertEquals(true, file.exists());
		Object obj = new PListParser().parse(new FileInputStream(file));
		if (obj instanceof Object[]) {
			Object[] jres = (Object[]) obj;
			assertEquals("Should be 8 entries in the array", 8, jres.length);
			
		} else {
			assertTrue("Top level object should be an array", false);
		}
	}
	
	/**
	 * Tests that we parse out the correct number of raw entries from the 'now leopard' ploist output
	 * 
	 * @throws Exception
	 * @since 3.8
	 */
	public void testParseSnowLeopardJREs() throws Exception {
		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/plist-snowleopard.xml"));
		assertNotNull(file);
		assertEquals(true, file.exists());
		Object obj = new PListParser().parse(new FileInputStream(file));
		if (obj instanceof Object[]) {
			Object[] jres = (Object[]) obj;
			assertEquals("Should be 2 entries in the array", 2, jres.length);
			
		} else {
			assertTrue("Top level object should be an array", false);
		}
	}
	
	/**
	 * Tests that we can parse out certain {@link JREDescriptor}s from the 'old' style
	 * of plist output.
	 * 
	 * @throws Exception
	 * @since 3.8
	 */
	public void testParseJREDescriptors() throws Exception {
		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/plist.xml"));
		assertNotNull(file);
		assertEquals(true, file.exists());
		MacInstalledJREs mij = new MacInstalledJREs();
		JREDescriptor[] desc = mij.parseJREInfo(new FileInputStream(file));
		assertEquals("There should be 2 JRE descriptions", 2, desc.length);
	}
	
	/**
	 * Tests that we can parse out certain {@link JREDescriptor}s from the 'snow leopard' style
	 * of plist output.
	 * 
	 * @throws Exception
	 * @since 3.8
	 */
	public void testParseJREDescriptorsSnowLeopard() throws Exception {
		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/plist-snowleopard.xml"));
		assertNotNull(file);
		assertEquals(true, file.exists());
		MacInstalledJREs mij = new MacInstalledJREs();
		JREDescriptor[] desc = mij.parseJREInfo(new FileInputStream(file));
		assertEquals("There should be 1 JRE description", 1, desc.length);
	}
	
	/**
	 * Tests that we can parse out certain {@link JREDescriptor}s from the 'lion' style
	 * of plist output.
	 * 
	 * @throws Exception
	 * @since 3.8
	 */
	public void testParseJREDescriptorsLion() throws Exception {
		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/plist-lion.xml"));
		assertNotNull(file);
		assertEquals(true, file.exists());
		MacInstalledJREs mij = new MacInstalledJREs();
		JREDescriptor[] desc = mij.parseJREInfo(new FileInputStream(file));
		assertEquals("There should be 4 JRE descriptions", 4, desc.length);
	}
	
	/**
	 * Tests that we can parse out certain {@link JREDescriptor}s from the plist
	 * output known to be bad - wrong data types.
	 * <br><br>
	 * <code>plist-bad1.xml</code> has a boolean value in place of the VM name for the 1.6 VM, 
	 * but we should still recover the remainder of the VMs defined (3 of them)
	 * 
	 * @throws Exception
	 * @since 3.8
	 */
	public void testParseJREDescriptorsBad() throws Exception {
		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/plist-bad1.xml"));
		assertNotNull(file);
		assertEquals(true, file.exists());
		MacInstalledJREs mij = new MacInstalledJREs();
		System.out.println("*** EXPECTED SAX EXCEPTION testParseJREDescriptorsBad ***");
		JREDescriptor[] desc = mij.parseJREInfo(new FileInputStream(file));
		assertEquals("There should be 3 JRE descriptions", 3, desc.length);
	}
	
	/**
	 * Tests that we can parse out certain {@link JREDescriptor}s from the plist
	 * output known to be bad - missing element.
	 * <br><br>
	 * <code>plist-bad2.xml</code> is missing a key element - but still has the value for the key.
	 * 
	 * @throws Exception
	 * @since 3.8
	 */
	public void testParseJREDescriptorsBad2() throws Exception {
		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/plist-bad2.xml"));
		assertNotNull(file);
		assertEquals(true, file.exists());
		MacInstalledJREs mij = new MacInstalledJREs();
		System.out.println("*** EXPECTED SAX EXCEPTION testParseJREDescriptorsBad2 ***");
		JREDescriptor[] desc = mij.parseJREInfo(new FileInputStream(file));
		assertEquals("There should be 3 JRE descriptions", 3, desc.length);
	}
	
	/**
	 * Tests that we can parse out certain {@link JREDescriptor}s from the plist
	 * output known to be bad - corrupt XML syntax.
	 * <br><br>
	 * <code>plist-bad3.xml</code> has corrupt XML syntax
	 * 
	 * @throws Exception
	 * @since 3.8
	 */
	public void testParseJREDescriptorsBad3() throws Exception {
		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/plist-bad3.xml"));
		assertNotNull(file);
		assertEquals(true, file.exists());
		MacInstalledJREs mij = new MacInstalledJREs();
		System.out.println("*** EXPECTED SAX EXCEPTION testParseJREDescriptorsBad3 ***");
		JREDescriptor[] desc = mij.parseJREInfo(new FileInputStream(file));
		assertEquals("There should be 0 JRE descriptions", 0, desc.length);
	}
}
