/*******************************************************************************
 * Copyright (c) 2004, 2013 Tasktop Technologies 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:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.bugzilla.tests.core;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;

import junit.framework.TestCase;

import org.eclipse.mylyn.bugzilla.tests.support.BugzillaFixture;
import org.eclipse.mylyn.commons.core.CoreUtil;
import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
import org.eclipse.mylyn.internal.bugzilla.core.SaxConfigurationContentHandler;
import org.eclipse.mylyn.internal.bugzilla.core.XmlCleaner;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;

/**
 * @author Robert Elves
 */
public class BugzillaConfigurationTest extends TestCase {

	public void testRepositoryConfigurationCachePersistance() throws Exception {
		File file = File.createTempFile("bugzilla", null);
		file.deleteOnExit();

		BugzillaRepositoryConnector connector = new BugzillaRepositoryConnector(file);
		RepositoryConfiguration configuration1 = new RepositoryConfiguration();
		configuration1.setRepositoryUrl("url1");
		configuration1.addProduct("Test Product 1");
		assertEquals(1, configuration1.getOptionValues(BugzillaAttribute.PRODUCT).size());

		RepositoryConfiguration configuration2 = new RepositoryConfiguration();
		configuration1.setRepositoryUrl("url2");
		configuration2.addProduct("Test Product 2");
		assertEquals(1, configuration2.getOptionValues(BugzillaAttribute.PRODUCT).size());

		connector.addRepositoryConfiguration(configuration1);
		connector.addRepositoryConfiguration(configuration2);
		connector.writeRepositoryConfigFile();
		assertNotNull(connector.getRepositoryConfiguration(configuration1.getRepositoryUrl()));
		assertNotNull(connector.getRepositoryConfiguration(configuration2.getRepositoryUrl()));

		connector.removeConfiguration(configuration1);
		connector.removeConfiguration(configuration2);
		assertNull(connector.getRepositoryConfiguration(configuration1.getRepositoryUrl()));
		assertNull(connector.getRepositoryConfiguration(configuration2.getRepositoryUrl()));

		connector = new BugzillaRepositoryConnector(file);
		connector.readRepositoryConfigurationFile();
		assertNotNull(connector.getRepositoryConfiguration(configuration1.getRepositoryUrl()));
		assertNotNull(connector.getRepositoryConfiguration(configuration2.getRepositoryUrl()));
		RepositoryConfiguration testLoadedConfig = connector.getRepositoryConfiguration(configuration1.getRepositoryUrl());
		assertEquals(1, testLoadedConfig.getOptionValues(BugzillaAttribute.PRODUCT).size());
		assertEquals(configuration1.getOptionValues(BugzillaAttribute.PRODUCT).get(0),
				testLoadedConfig.getOptionValues(BugzillaAttribute.PRODUCT).get(0));
	}

	public void testNullCacheFile() {
		BugzillaRepositoryConnector connector = new BugzillaRepositoryConnector();
		connector.readRepositoryConfigurationFile();
		RepositoryConfiguration configuration1 = new RepositoryConfiguration();
		configuration1.setRepositoryUrl("url1");
		configuration1.addProduct("Test Product 1");
		assertNull(connector.getRepositoryConfiguration(configuration1.getRepositoryUrl()));

		connector.addRepositoryConfiguration(configuration1);
		assertNotNull(connector.getRepositoryConfiguration(configuration1.getRepositoryUrl()));

		connector = new BugzillaRepositoryConnector();
		connector.readRepositoryConfigurationFile();
		assertNull(connector.getRepositoryConfiguration(configuration1.getRepositoryUrl()));
	}

	// FIXME re-enable?
//	@SuppressWarnings("deprecation")
//	public void testHtmlCleaner() throws IOException, BugzillaException, GeneralSecurityException {
//		StringBuffer incoming = new StringBuffer();
//		incoming.append("<RDF xmlns=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#");
//		incoming.append("xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#");
//		incoming.append("xmlns:bz=\"http://www.bugzilla.org/rdf#\">");
//		incoming.append("<li>");
//        incoming.append("<bz:product
//        incoming.append("</bz:product>");
//        incoming.append("</li>");
//        incoming.append("</RDF>");
//
//        StringBuffer result = XmlCleaner.clean(new StringReader(incoming.toString()));
//	}

	/**
	 * Can use this to test config data submitted by users. Be sure not to commit user's config file though. The file
	 * included (rdfconfig218.txt) is from mylyn.eclipse.org/bugs218
	 */
	public void testRepositoryConfigurationFromFile() throws Exception {
		BufferedReader inCleaned = null;
		try {
			File tempFile = File.createTempFile("XmlCleaner-", "tmp");
			tempFile.deleteOnExit();

			InputStream stream = BugzillaFixture.getResource("testdata/configuration/rdfconfig218.txt");
			BufferedReader in = new BufferedReader(new InputStreamReader(stream));
			try {
				inCleaned = XmlCleaner.clean(in, tempFile);
				if (tempFile != null) {
					tempFile.delete();
				}
			} finally {
				in.close();
			}

			SaxConfigurationContentHandler contentHandler = new SaxConfigurationContentHandler();
			final XMLReader reader = CoreUtil.newXmlReader();
			reader.setContentHandler(contentHandler);
			reader.setErrorHandler(new ErrorHandler() {
				public void error(SAXParseException exception) throws SAXException {
					throw exception;
				}

				public void fatalError(SAXParseException exception) throws SAXException {
					throw exception;
				}

				public void warning(SAXParseException exception) throws SAXException {
					throw exception;
				}
			});
			reader.parse(new InputSource(inCleaned));

			RepositoryConfiguration config = contentHandler.getConfiguration();
			assertNotNull(config);

			assertTrue(config.getOptionValues(BugzillaAttribute.PRODUCT).contains(
					"Test-Long-Named-Product-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"));
		} finally {
			if (inCleaned != null) {
				inCleaned.close();
			}
		}
	}
}
