// Copyright 2006 Google Inc. All Rights Reserved. // // 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.servlet; import com.google.common.base.Strings; import com.google.enterprise.connector.instantiator.Configuration; import com.google.enterprise.connector.manager.Manager; import com.google.enterprise.connector.manager.MockManager; import com.google.enterprise.connector.persist.ConnectorNotFoundException; import com.google.enterprise.connector.persist.PersistentStoreException; import com.google.enterprise.connector.scheduler.HostLoadManager; import com.google.enterprise.connector.scheduler.Schedule; import com.google.enterprise.connector.spi.XmlUtils; import junit.framework.TestCase; import java.io.IOException; import java.util.HashMap; import java.util.logging.Logger; /** * Tests SetSchedule servlet. */ public class SetScheduleTest extends TestCase { private static final Logger LOGGER = Logger.getLogger(SetScheduleTest.class.getName()); public void testInvalidSchedule() { checkHandleDoPost("Invalid", false, null, null, null, ConnectorMessageCode.ERROR_PARSING_XML_REQUEST); } public void testEmptySchedule() { checkHandleDoPost(null, false, null, null, null, ConnectorMessageCode.RESPONSE_NULL_CONNECTOR); } public void testNoConnectorName() { checkHandleDoPost("", false, null, null, null, ConnectorMessageCode.RESPONSE_NULL_CONNECTOR); } public void testDisabled() { checkHandleDoPost("connector1", true, "6", "1000", "1-2:5-10:12-18", ConnectorMessageCode.SUCCESS); } public void testNoLoad() { checkHandleDoPost("connector1", false, null, "1000", "1-2:5-10:12-18", ConnectorMessageCode.SUCCESS); } public void testEmptyLoad() { checkHandleDoPost("connector1", false, "", "1000", "1-2:5-10:12-18", ConnectorMessageCode.SUCCESS); } public void testNoRetryDelay() { checkHandleDoPost("connector1", false, "6", null, "1-2:5-10:12-18", ConnectorMessageCode.SUCCESS); } public void testEmptyRetryDelay() { checkHandleDoPost("connector1", false, "6", "", "1-2:5-10:12-18", ConnectorMessageCode.SUCCESS); } public void testWithRetryDelay() { checkHandleDoPost("connector1", false, "6", "1000", "1-2:5-10:12-18", ConnectorMessageCode.SUCCESS); } public void testNoTimeIntervals() { checkHandleDoPost("connector1", false, "6", "1000", null, ConnectorMessageCode.SUCCESS); } public void testEmpyTimeIntervals() { checkHandleDoPost("connector1", false, "6", "1000", "", ConnectorMessageCode.SUCCESS); } public void testConnectorNotFoundException() { checkHandleDoPost("UnknownConnector", false, "6", "1000", "1-2:5-10:12-18", ConnectorMessageCode.EXCEPTION_CONNECTOR_NOT_FOUND); } public void testPersistenStoreException() { checkHandleDoPost("IntransigentConnector", false, "6", "1000", "1-2:5-10", ConnectorMessageCode.EXCEPTION_PERSISTENT_STORE); } /** * Test method for {@link com.google.enterprise.connector.servlet.SetSchedule# * handleDoPost(java.lang.String, com.google.enterprise.connector.manager.Manager)}. */ private void checkHandleDoPost(String connectorName, boolean isDisabled, String load, String retryDelay, String timeIntervals, int expectedResult) { LOGGER.info("\n==========================================================\n"); LOGGER.info("Test: " + getName()); String xmlBody = makeXmlBody(connectorName, isDisabled, load, retryDelay, timeIntervals); LOGGER.info("XmlBody:\n" + xmlBody); ScheduleManager manager = new ScheduleManager(); ConnectorMessageCode status = SetSchedule.handleDoPost(xmlBody, manager); LOGGER.info("Status Id: " + String.valueOf(status.getMessageId())); assertEquals(status.getMessageId(), expectedResult); Schedule schedule = manager.getSchedule(connectorName); LOGGER.info("Schedule: " + schedule); if (schedule == null) { if (status.getMessageId() == ConnectorMessageCode.SUCCESS) { fail("Null Schedule"); } else { return; } } assertEquals(connectorName.toLowerCase(), schedule.getConnectorName()); assertEquals(isDisabled, schedule.isDisabled()); assertEquals((Strings.isNullOrEmpty(load) ? HostLoadManager.DEFAULT_HOST_LOAD : Integer.parseInt(load)), schedule.getLoad()); if (Strings.isNullOrEmpty(retryDelay)) { assertEquals(Schedule.defaultRetryDelayMillis(), schedule.getRetryDelayMillis()); } else { assertEquals(Integer.parseInt(retryDelay), schedule.getRetryDelayMillis()); } assertEquals(((timeIntervals == null)? "" : timeIntervals), schedule.getTimeIntervals()); } private String makeXmlBody(String connectorName, boolean isDisabled, String load, String retryDelay, String timeIntervals) { StringBuilder b = new StringBuilder(); // Special trigger for invalid schedule body. if ("Invalid".equals(connectorName)) { return "<test></test>"; } try { XmlUtils.xmlAppendStartTag(ServletUtil.XMLTAG_CONNECTOR_SCHEDULES, b); if (connectorName != null) { // Null is trigger for empty schedule body. b.append("\n"); XmlUtils.xmlAppendStartTag(ServletUtil.XMLTAG_CONNECTOR_NAME, b); b.append(connectorName); XmlUtils.xmlAppendEndTag(ServletUtil.XMLTAG_CONNECTOR_NAME, b); if (isDisabled) { XmlUtils.xmlAppendStartTag(ServletUtil.XMLTAG_DISABLED, b); b.append("true"); XmlUtils.xmlAppendEndTag(ServletUtil.XMLTAG_DISABLED, b); } if (load != null) { XmlUtils.xmlAppendStartTag(ServletUtil.XMLTAG_LOAD, b); b.append(load); XmlUtils.xmlAppendEndTag(ServletUtil.XMLTAG_LOAD, b); } if (retryDelay != null) { XmlUtils.xmlAppendStartTag(ServletUtil.XMLTAG_DELAY, b); b.append(retryDelay); XmlUtils.xmlAppendEndTag(ServletUtil.XMLTAG_DELAY, b); } if (timeIntervals != null) { XmlUtils.xmlAppendStartTag(ServletUtil.XMLTAG_TIME_INTERVALS, b); b.append(timeIntervals); XmlUtils.xmlAppendEndTag(ServletUtil.XMLTAG_TIME_INTERVALS, b); } } XmlUtils.xmlAppendEndTag(ServletUtil.XMLTAG_CONNECTOR_SCHEDULES, b); } catch (IOException e) { fail(e.getMessage()); } return b.toString(); } /** A Manager that throws exceptions when setting the schedule. */ private static class ScheduleManager extends MockManager { private HashMap<String, String> schedules = new HashMap<String, String>(); @Override public Configuration getConnectorConfiguration(String connectorName) throws ConnectorNotFoundException { if ("UnknownConnector".equalsIgnoreCase(connectorName)) { throw new ConnectorNotFoundException(connectorName); } return new Configuration("Mock", new HashMap<String, String>(), null); } @Override public void setSchedule(String connectorName, String schedule) throws ConnectorNotFoundException, PersistentStoreException { if ("UnknownConnector".equalsIgnoreCase(connectorName)) { throw new ConnectorNotFoundException(connectorName); } if ("IntransigentConnector".equalsIgnoreCase(connectorName)) { throw new PersistentStoreException(connectorName); } schedules.put(connectorName.toLowerCase(), schedule); } /** Return the cached schedule for this connector. */ protected Schedule getSchedule(String connectorName) { if (Strings.isNullOrEmpty(connectorName)) { return null; } return Schedule.of(schedules.get(connectorName.toLowerCase())); } } }