// Copyright 2010 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.enterprise.connector.importexport; import com.google.enterprise.connector.common.StringUtils; import com.google.enterprise.connector.instantiator.Configuration; import com.google.enterprise.connector.scheduler.Schedule; import com.google.enterprise.connector.util.SAXParseErrorHandler; import com.google.enterprise.connector.util.XmlParseUtil; import junit.framework.TestCase; import org.w3c.dom.Document; import java.io.PrintWriter; import java.io.StringWriter; import java.util.HashMap; import java.util.Map; public class ImportExportConnectorListTest extends TestCase { private static final String SINGLE_CONNECTOR = "<ConnectorInstances>\n" + " <ConnectorInstance>\n" + " <ConnectorName>connector-02</ConnectorName>\n" + " <ConnectorCheckpoint>checkpoint</ConnectorCheckpoint>\n" + " <ConnectorSchedules version=\"3\">\n" + " <disabled>true</disabled>\n" + " <load>100</load>\n" + " <RetryDelayMillis>300000</RetryDelayMillis>\n" + " <TimeIntervals>0-0</TimeIntervals>\n" + " </ConnectorSchedules>\n" + " <ConnectorType>TestConnector</ConnectorType>\n" + " <ConnectorConfig>\n" + " <Param name=\"color\" value=\"red\"/>\n" + " <Param name=\"password\" value=\"pwd\"/>\n" + " <Param name=\"username\" value=\"name\"/>\n" + " </ConnectorConfig>\n" + " <ConnectorConfigXml>\n<![CDATA[" + ImportExportConnectorTest.CONFIG_XML + "]]>\n" + " </ConnectorConfigXml>\n" + " </ConnectorInstance>\n" + "</ConnectorInstances>\n"; private static final String MULTIPLE_CONNECTORS = "<ConnectorInstances>\n" + " <ConnectorInstance>\n" + " <ConnectorName>connector-01</ConnectorName>\n" + " <ConnectorType>TestConnector</ConnectorType>\n" + " <ConnectorConfig>\n" + " <Param name=\"color\" value=\"red\"/>\n" + " <Param name=\"password\" value=\"pwd\"/>\n" + " <Param name=\"username\" value=\"name\"/>\n" + " </ConnectorConfig>\n" + " </ConnectorInstance>\n" + " <ConnectorInstance>\n" + " <ConnectorName>connector-02</ConnectorName>\n" + " <ConnectorSchedules version=\"3\">\n" + " <load>100</load>\n" + " <RetryDelayMillis>300000</RetryDelayMillis>\n" + " <TimeIntervals>0-0</TimeIntervals>\n" + " </ConnectorSchedules>\n" + " <ConnectorType>TestConnector</ConnectorType>\n" + " <ConnectorConfig>\n" + " <Param name=\"color\" value=\"blue\"/>\n" + " <Param name=\"password\" value=\"pwd\"/>\n" + " <Param name=\"username\" value=\"name\"/>\n" + " </ConnectorConfig>\n" + " </ConnectorInstance>\n" + "</ConnectorInstances>\n"; // Test reading a list containing a single connector. public final void testReadSingleConnector() { ImportExportConnectorList connectors = fromXmlString(SINGLE_CONNECTOR); assertTrue(connectors.size() == 1); ImportExportConnector connector = connectors.remove(0); assertEquals("name", "connector-02", connector.getName()); assertEquals("checkpoint", "checkpoint", connector.getCheckpoint()); assertEquals("schedule", "#connector-02:100:300000:0-0", connector.getScheduleString()); assertEquals("type", "TestConnector", connector.getTypeName()); Map<String, String> config = connector.getConfigMap(); ImportExportConnectorTest.assertContains(config, "username", "name"); ImportExportConnectorTest.assertContains(config, "password", "pwd"); ImportExportConnectorTest.assertContains(config, "color", "red"); assertTrue(config.size() == 0); assertEquals("configXml", ImportExportConnectorTest.CONFIG_XML, connector.getConfigXml()); } // Test Multiple Connector Instances public final void testReadMultipleConnectors() { ImportExportConnectorList connectors = fromXmlString(MULTIPLE_CONNECTORS); checkMultipleConnectors(connectors); } private final void checkMultipleConnectors( ImportExportConnectorList connectors) { assertTrue(connectors.size() == 2); ImportExportConnector connector = connectors.remove(0); assertEquals("name", "connector-01", connector.getName()); assertEquals("type", "TestConnector", connector.getTypeName()); Map<String, String> config = connector.getConfigMap(); ImportExportConnectorTest.assertContains(config, "username", "name"); ImportExportConnectorTest.assertContains(config, "password", "pwd"); ImportExportConnectorTest.assertContains(config, "color", "red"); assertTrue(config.size() == 0); assertNull("schedule", connector.getSchedule()); assertNull("configXml", connector.getConfigXml()); assertNull("checkpoint", connector.getCheckpoint()); connector = connectors.remove(0); assertEquals("name", "connector-02", connector.getName()); assertEquals("type", "TestConnector", connector.getTypeName()); assertEquals("schedule", "connector-02:100:300000:0-0", connector.getScheduleString()); config = connector.getConfigMap(); ImportExportConnectorTest.assertContains(config, "username", "name"); ImportExportConnectorTest.assertContains(config, "password", "pwd"); ImportExportConnectorTest.assertContains(config, "color", "blue"); assertTrue(config.size() == 0); assertNull("configXml", connector.getConfigXml()); assertNull("checkpoint", connector.getCheckpoint()); } // Test that schedules are written in exploded format. public final void testWriteSingleConnector() { Schedule schedule = new Schedule("connector-02", true, 100, 300000, "0-0"); ImportExportConnector connector = new ImportExportConnector("connector-02", new Configuration("TestConnector", ImportExportConnectorTest.CONFIG_MAP, ImportExportConnectorTest.CONFIG_XML), schedule, "checkpoint"); ImportExportConnectorList connectors = new ImportExportConnectorList(); connectors.add(connector); String xmlResult = asXmlString(connectors); assertEquals(SINGLE_CONNECTOR, StringUtils.normalizeNewlines(xmlResult)); } // Test Write Multiple Connector Instances public final void testWriteMultipleConnectors() { ImportExportConnectorList connectors = buildMultipleConnectors(); String xmlResult = asXmlString(connectors); assertEquals(MULTIPLE_CONNECTORS, StringUtils.normalizeNewlines(xmlResult)); } private final ImportExportConnectorList buildMultipleConnectors() { ImportExportConnector connector = new ImportExportConnector("connector-01", new Configuration("TestConnector", ImportExportConnectorTest.CONFIG_MAP, null), null, null); ImportExportConnectorList connectors = new ImportExportConnectorList(); connectors.add(connector); Schedule schedule = new Schedule("connector-02", false, 100, 300000, "0-0"); Map<String, String> config = new HashMap<String, String>(ImportExportConnectorTest.CONFIG_MAP); config.put("color", "blue"); connector = new ImportExportConnector("connector-02", new Configuration("TestConnector", config, null), schedule, null); connectors.add(connector); return connectors; } static String asXmlString(ImportExportConnectorList connectors) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); connectors.toXml(pw, 0); return sw.toString(); } private static ImportExportConnectorList fromXmlString(String xmlString) { Document document = XmlParseUtil.parse(xmlString, new SAXParseErrorHandler(), XmlParseUtil.nonEntityResolver); ImportExportConnector connector = new LegacyImportExportConnector(); ImportExportConnectorList connectors = new ImportExportConnectorList(); connectors.fromXml(document.getDocumentElement(), ImportExportConnector.class); return connectors; } }