/*******************************************************************************
 * Copyright (c) 2000, 2004 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.update.tests;


import java.io.File;
import java.io.IOException;
import java.net.*;
import java.util.*;

import junit.framework.TestCase;
import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.update.configuration.IConfiguredSite;
import org.eclipse.update.core.*;
import org.eclipse.update.core.IFeature;
import org.eclipse.update.core.IPluginEntry;
import org.eclipse.update.internal.core.*;
import org.eclipse.update.internal.core.UpdateManagerUtils;
/**
 * All Help System Test cases must subclass this base Testcase.
 * See SampleTestCase.java for a template.
 */

public abstract class UpdateManagerTestCase extends TestCase {

	protected static ResourceBundle bundle;
	protected static String dataPath;

	protected static URL SOURCE_FILE_SITE;
	protected static URL SOURCE_FILE_SITE_INSTALLED;
	protected static URL SOURCE_HTTP_SITE;
	protected static URL TARGET_FILE_SITE;

	private static final String DATA_PATH = "data/";

	/**
	 * Default Constructor
	 */
	public UpdateManagerTestCase(String name) {
		super(name);
		try {
			init();
		} catch (Exception e) {
			fail(e.toString());
			e.printStackTrace();
		}
	}

	protected static void init() throws MissingResourceException, IOException, MalformedURLException {

		IPluginDescriptor dataDesc = Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.update.tests.core");
		URL resolvedURL = Platform.asLocalURL(Platform.resolve(dataDesc.getInstallURL()));
		URL dataURL = new URL(resolvedURL, DATA_PATH);
		dataPath = dataURL.getFile();
		String homePath = (System.getProperty("java.io.tmpdir")).replace(File.separatorChar, '/');

		if (bundle == null) {
			ClassLoader l = new URLClassLoader(new URL[] { dataURL }, null);
			bundle = ResourceBundle.getBundle("resources", Locale.getDefault(), l);
		}

		try {
			SOURCE_FILE_SITE = new File(dataPath).toURL();
			SOURCE_FILE_SITE_INSTALLED = new File(dataPath + "testAPI/").toURL();
			SOURCE_HTTP_SITE = new URL("http", getHttpHost(), getHttpPort(), bundle.getString("HTTP_PATH_1"));
			TARGET_FILE_SITE = new URL("file", null, homePath + "/target/");
		} catch (Exception e) {
			fail(e.toString());
			e.printStackTrace();
		}

		//cleanup target 
		File target = new File(homePath + "/target/");
		UpdateManagerUtils.removeFromFileSystem(target);
		// cleanup info about just installed plugins
		InstallRegistry.cleanup();
		
		// setup cache site to false. 
		// Note: the standalone tests will set it back to true
		InternalSiteManager.globalUseCache = false;
	}

	/**
	 * Simple implementation of setUp. Subclasses are prevented 
	 * from overriding this method to maintain logging consistency.
	 * umSetUp() should be overriden instead.
	 */
	protected final void setUp() throws Exception {
		System.out.println("----- " + this.getName());
		System.out.println(this.getName() + ": setUp...");
		umSetUp();
	}

	/**
	 * Sets up the fixture, for example, open a network connection.
	 * This method is called before a test is executed.
	 */
	protected void umSetUp() throws Exception {
		// do nothing.
	}

	/**
	 * Simple implementation of tearDown.  Subclasses are prevented 
	 * from overriding this method to maintain logging consistency.
	 * umTearDown() should be overriden instead.
	 */
	protected final void tearDown() throws Exception {
		System.out.println(this.getName() + ": tearDown...\n");
		umTearDown();
	}

	/**
	 * Tears down the fixture, for example, close a network connection.
	 * This method is called after a test is executed.
	 */
	protected void umTearDown() throws Exception {
		// do nothing.
	}

	protected static String getHttpHost() {
		return UpdateTestsPlugin.getWebAppServerHost();
	}

	protected static int getHttpPort() {
		return UpdateTestsPlugin.getWebAppServerPort();
	}

	protected void remove(IFeature feature, IConfiguredSite configSite) throws CoreException {
		ISite site = configSite.getSite();
		remove(feature, site);
	}

	protected void remove(IFeature feature, ISite site) throws CoreException {
		site.getFeatureReference(feature);
		// remove the plugins and features dir
		String sitePath = site.getURL().getFile();
		File file = null;

		String featureName = feature.getVersionedIdentifier().getIdentifier().toString() + "_" + feature.getVersionedIdentifier().getVersion().toString();
		file = new File(sitePath, "features" + File.separator + featureName);
		System.out.println("****************************************Removing :" + file);
		UpdateManagerUtils.removeFromFileSystem(file);

		IPluginEntry[] entries = feature.getPluginEntries();
		for (int i = 0; i < entries.length; i++) {
			String name = entries[i].getVersionedIdentifier().getIdentifier().toString() + "_" + entries[i].getVersionedIdentifier().getVersion().toString() + File.separator;
			file = new File(sitePath, "plugins" + File.separator + name);
			System.out.println("****************************************Removing :" + file);
			UpdateManagerUtils.removeFromFileSystem(file);
			InstallRegistry.unregisterPlugin(entries[i]);
		}
	}
}
