/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.update.tests.core.boot;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import junit.framework.Assert;
import org.eclipse.update.configurator.*;
import org.eclipse.update.configurator.IPlatformConfiguration.*;

public class TestPlatCfgAPI extends PlatformConfigurationTestCase {
			
	public TestPlatCfgAPI(String arg0) {
		super(arg0);
	}
	
	public void testBasic() throws Exception {
		
		// get new config object
		IPlatformConfiguration cfig = null;
		try {
			cfig = ConfiguratorUtils.getPlatformConfiguration(null);
		} catch (IOException e) {
			Assert.fail("0.0.0 "+e.toString());
		}
		ISiteEntry[] dflt = cfig.getConfiguredSites();
		Assert.assertEquals("0.0.1",dflt.length,0);
		
		// policy tests
		ISitePolicy p1 = cfig.createSitePolicy(ISitePolicy.USER_INCLUDE, null);
		Assert.assertEquals("1.0.0",p1.getType(),ISitePolicy.USER_INCLUDE);
		Assert.assertEquals("1.0.1",p1.getList().length,0);
		p1.setList(new String[] {"first"});
		Assert.assertEquals("1.0.2",p1.getList().length,1);
		Assert.assertEquals("1.0.3",p1.getList()[0],"first");
		
		ISitePolicy p2 = cfig.createSitePolicy(ISitePolicy.USER_EXCLUDE, new String[0]);
		Assert.assertEquals("1.1.0",p2.getType(),ISitePolicy.USER_EXCLUDE);
		Assert.assertEquals("1.1.1",p2.getList().length,0);
		p2.setList(new String[] {"first", "second"});
		Assert.assertEquals("1.1.2",p2.getList().length,2);
		Assert.assertEquals("1.1.3",p2.getList()[1],"second");
		
		// create some urls
		URL u1 = null;
		URL u2 = null;

		URL u4 = null;
		try {
			u1 = new URL("file:/d:/temp");
//			u2 = new URL("file://localhost/temp");
			new URL("http://some.server/temp/");
			u4 = new URL("http://bad.url");
		} catch (MalformedURLException e) {
			Assert.fail("2.0.0 unable to create URL "+e);
		}
				
		// site creation tests
		ISiteEntry s1 = cfig.createSiteEntry(u1,p2);
		Assert.assertEquals("3.0.0",s1.getURL(),u1);
		Assert.assertEquals("3.0.1",s1.getSitePolicy(),p2);
		s1.setSitePolicy(p1);
		Assert.assertEquals("3.0.2",s1.getSitePolicy(),p1);
		
//		ISiteEntry s2 = cfig.createSiteEntry(u2,p1);
//		Assert.assertEquals("3.1.0",s2.getURL(),u2);
//		Assert.assertEquals("3.1.1",s2.getSitePolicy(),p1);
//		s2.setSitePolicy(p2);
//		Assert.assertEquals("3.1.2",s2.getSitePolicy(),p2);
		
		// configure site tests
		Assert.assertEquals("3.3.0",cfig.getConfiguredSites().length,0);
		cfig.configureSite(s1);
		Assert.assertEquals("3.3.1",cfig.getConfiguredSites().length,1);
//		cfig.configureSite(s2);
//		Assert.assertEquals("3.3.2",cfig.getConfiguredSites().length,2);
//		
		// lookup site tests
		Assert.assertEquals("3.4.0",cfig.findConfiguredSite(u1),s1);
//		Assert.assertEquals("3.4.1",cfig.findConfiguredSite(u2),s2);
		Assert.assertNull("3.4.3",cfig.findConfiguredSite(u4));
		
		// unconfigure site tests
		cfig.unconfigureSite(s1);
		Assert.assertEquals("3.5.0",cfig.getConfiguredSites().length,0);
		Assert.assertNull("3.5.1",cfig.findConfiguredSite(u1));		
//		cfig.unconfigureSite(s2);
//		Assert.assertEquals("3.5.2",cfig.getConfiguredSites().length,0);
//		Assert.assertNull("3.5.3",cfig.findConfiguredSite(u2));	
	}
	
	public void testSaveRestore() throws Exception {
				
		Assert.assertNotNull("0.0 Unable to obtain temp directory",tempDir);
		
		// get new config object
		IPlatformConfiguration cfig = null;
		try {
			cfig = ConfiguratorUtils.getPlatformConfiguration(null);
		} catch (IOException e) {
			Assert.fail("0.0.0 "+e.toString());
		}
		ISiteEntry[] sites = cfig.getConfiguredSites();
		Assert.assertEquals("0.0.1",sites.length,0);
				
		// create policies
		ISitePolicy p1 = cfig.createSitePolicy(ISitePolicy.USER_INCLUDE, null);
		ISitePolicy p2 = cfig.createSitePolicy(ISitePolicy.USER_EXCLUDE, new String[0]);		
		ISitePolicy p3 = cfig.createSitePolicy(ISitePolicy.USER_INCLUDE, new String[] {"first"});
		ISitePolicy p4 = cfig.createSitePolicy(ISitePolicy.USER_EXCLUDE, new String[] {"first", "second"});
						
		// create some urls
		URL u1 = null;
		URL u2 = null;
		URL u3 = null;
		URL u4 = null;

		try {
			u1 = new URL("file:d:/temp/");
			u2 = new URL("file://localhost/temp/");
			u3 = new URL("http://some.server/temp/");
			u4 = new URL("http://another.server/temp/");
			new URL("http://one.more.server/temp/");
		} catch (MalformedURLException e) {
			Assert.fail("1.0 unable to create URL "+e);
		}
		
		// create and configure sites
		ISiteEntry s1 = cfig.createSiteEntry(u1,p1);
		cfig.configureSite(s1);
		ISiteEntry s2 = cfig.createSiteEntry(u2,p2);
		cfig.configureSite(s2);
		ISiteEntry s3 = cfig.createSiteEntry(u3,p3);
		cfig.configureSite(s3);
		ISiteEntry s4 = cfig.createSiteEntry(u4,p4);
		cfig.configureSite(s4);
		sites = cfig.getConfiguredSites();
		Assert.assertEquals("1.1",sites.length,4);
		
		// do save
		try {
			cfig.save();
			Assert.fail("2.0 was expecting IOException");
		} catch (IOException e) {
		}
		
		URL cfigURL = null;
		try {
			cfigURL = new URL("file:"+tempDir+ "platform.xml");
		} catch(MalformedURLException e) {
			Assert.fail("2.1 unable to create URL "+e);
		}
		
		try {
			cfig.save(cfigURL);
		} catch (IOException e) {
			Assert.fail("2.2 "+e);
		}
		
		// reload configuration	
		try {
			ConfiguratorUtils.getPlatformConfiguration(cfigURL);
		} catch (IOException e) {
			Assert.fail("2.3 "+e.toString());
		}
		ISiteEntry[] newSites = cfig.getConfiguredSites();
		Assert.assertEquals("2.4",newSites.length,4);
		
		// check what we've got
		Assert.assertEquals("3.0.1",sites[0].getURL(),newSites[0].getURL());
		Assert.assertEquals("3.0.2",sites[0].getSitePolicy().getType(),newSites[0].getSitePolicy().getType());
		Assert.assertEquals("3.0.3",sites[0].getSitePolicy().getList(),newSites[0].getSitePolicy().getList());
		
		Assert.assertEquals("3.1.1",sites[1].getURL(),newSites[1].getURL());
		Assert.assertEquals("3.1.2",sites[1].getSitePolicy().getType(),newSites[1].getSitePolicy().getType());
		Assert.assertEquals("3.1.3",sites[1].getSitePolicy().getList(),newSites[1].getSitePolicy().getList());
		
		Assert.assertEquals("3.2.1",sites[2].getURL(),newSites[2].getURL());
		Assert.assertEquals("3.2.2",sites[2].getSitePolicy().getType(),newSites[2].getSitePolicy().getType());
		Assert.assertEquals("3.2.3",sites[2].getSitePolicy().getList(),newSites[2].getSitePolicy().getList());
		
		Assert.assertEquals("3.3.1",sites[3].getURL(),newSites[3].getURL());
		Assert.assertEquals("3.3.2",sites[3].getSitePolicy().getType(),newSites[3].getSitePolicy().getType());
		Assert.assertEquals("3.3.3",sites[3].getSitePolicy().getList(),newSites[3].getSitePolicy().getList());
		
	}
	
	public void testCurrentConfiguration() throws Exception {
				
		Assert.assertNotNull("0.0 Unable to obtain temp directory",tempDir);
		
		// get new config object
		IPlatformConfiguration cfig = null;
		cfig = ConfiguratorUtils.getCurrentPlatformConfiguration();
		cfig.getPluginPath();
		cfig.save();
	}
}

