// Copyright 2006 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.servlet;
import com.google.enterprise.connector.common.StringUtils;
import com.google.enterprise.connector.instantiator.ExtendedConfigureResponse;
import com.google.enterprise.connector.instantiator.Instantiator;
import com.google.enterprise.connector.instantiator.InstantiatorException;
import com.google.enterprise.connector.manager.Context;
import com.google.enterprise.connector.manager.Manager;
import com.google.enterprise.connector.manager.MockManager;
import com.google.enterprise.connector.spi.ConfigureResponse;
import junit.framework.TestCase;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.logging.Logger;
/**
* Tests {@link GetConfigForm} servlet class.
*/
public class GetConfigFormTest extends TestCase {
private static final Logger LOGGER =
Logger.getLogger(GetConfigFormTest.class.getName());
private Manager manager;
private Instantiator instantiator;
@Override
protected void setUp() {
// Create a stand alone context with real ProductionManager.
Context.refresh();
Context context = Context.getInstance();
context.setStandaloneContext(Context.DEFAULT_JUNIT_CONTEXT_LOCATION,
Context.DEFAULT_JUNIT_COMMON_DIR_PATH);
context.setFeeding(false);
context.start();
manager = context.getManager();
instantiator = context.getInstantiator();
}
/** Test null ConfigureResponse just returns status code. */
public void testNullConfigureResponse() {
String expectedResult =
"<CmResponse>\n" +
" <StatusId>0</StatusId>\n" +
"</CmResponse>\n";
ConfigureResponse configResponse = null;
doTest(configResponse, expectedResult);
}
/** Test ConfigureResponse with no message, form snippet, map, or xml. */
public void testEmptyConfigureResponse() {
String expectedResult =
"<CmResponse>\n" +
" <StatusId>0</StatusId>\n" +
" <ConfigureResponse>\n" +
" </ConfigureResponse>\n" +
"</CmResponse>\n";
String message = null;
String formSnippet = null;
ConfigureResponse configResponse = new ConfigureResponse(message, formSnippet);
doTest(configResponse, expectedResult);
}
/** Test ConfigureResponse with a message and form snippet. */
public void testMessageAndFormSnippet() {
String message = "Sample form";
String formSnippet =
" <tr><td>Repository</td>" +
" <td><input type=\"text\" name=\"repository\" value=\"\"/></td>" +
" </tr>" +
" <tr><td>Username</td>" +
" <td><input type=\"text\" name=\"username\" value=\"\"/>" +
" </td></tr>" +
" <tr><td>Password</td>" +
" <td><input type=\"password\" name=\"passwd\" value=\"\"/>" +
" </td></tr>" +
" <tr><td>Seed URIs</td>" +
" <td><textarea name=\"seedUris\"></textarea></td></tr>";
String expectedResult =
"<CmResponse>\n" +
" <StatusId>0</StatusId>\n" +
" <ConfigureResponse>\n" +
" <FormSnippet><![CDATA[" + formSnippet + "]]></FormSnippet>\n" +
" <message>" + message + "</message>\n" +
" </ConfigureResponse>\n" +
"</CmResponse>\n";
ConfigureResponse configResponse =
new ConfigureResponse(message, formSnippet);
doTest(configResponse, expectedResult);
}
/** Test ExtendedConfigureResponse with message, form snippet, configXml. */
public void testMessageAndFormSnippetAndXml() {
String message = "Sample form";
String formSnippet =
" <tr><td>Repository</td>" +
" <td><input type=\"text\" name=\"repository\" value=\"\"/></td>" +
" </tr>" +
" <tr><td>Username</td>" +
" <td><input type=\"text\" name=\"username\" value=\"\"/>" +
" </td></tr>" +
" <tr><td>Password</td>" +
" <td><input type=\"password\" name=\"passwd\" value=\"\"/>" +
" </td></tr>" +
" <tr><td>Seed URIs</td>" +
" <td><textarea name=\"seedUris\"></textarea></td></tr>";
// My XML has embedded CDATA to make sure it gets properly escaped.
String configXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<beans><bean id=\"MagicalFruit\" class=\"None\">" +
"<![CDATA[xyzzy]]></bean></beans>";
String expectedResult =
"<CmResponse>\n" +
" <StatusId>0</StatusId>\n" +
" <ConfigureResponse>\n" +
" <FormSnippet><![CDATA[" + formSnippet + "]]></FormSnippet>\n" +
" <ConnectorConfigXml><![CDATA[" + configXml.replace("]]>", "]]>") +
"]]></ConnectorConfigXml>\n" +
" <message>" + message + "</message>\n" +
" </ConfigureResponse>\n" +
"</CmResponse>\n";
ExtendedConfigureResponse configResponse = new ExtendedConfigureResponse(
new ConfigureResponse(message, formSnippet), configXml);
doTest(configResponse, expectedResult);
}
private void doTest(ConfigureResponse configResponse, String expectedResult) {
StringWriter writer = new StringWriter();
PrintWriter out = new PrintWriter(writer);
ConnectorManagerGetServlet.writeConfigureResponse(
out, new ConnectorMessageCode(), configResponse);
out.flush();
String result = writer.toString();
out.close();
LOGGER.info("Expected Response:\n" + expectedResult);
LOGGER.info("Actual Response:\n" + result);
assertEquals(StringUtils.normalizeNewlines(expectedResult),
StringUtils.normalizeNewlines(result));
}
/** Test null ConnectorType returns status code. */
public void testNullConnectorType() throws Exception {
String expectedResult =
"<CmResponse>\n" +
" <StatusId>5216</StatusId>\n" +
"</CmResponse>\n";
doTest((String) null, expectedResult);
}
/** Test empty ConnectorType returns status code. */
public void testEmptyConnectorType() throws Exception {
String expectedResult =
"<CmResponse>\n" +
" <StatusId>5216</StatusId>\n" +
"</CmResponse>\n";
doTest("", expectedResult);
}
/** Test ConnectorTypeNotFound returns status code. */
public void testConnectorTypeNotFound() throws Exception {
String connectorType = "UnknownConnectorType";
String expectedResult =
"<CmResponse>\n" +
" <StatusId>5304</StatusId>\n" +
" <CMParams Order=\"0\" CMParam=\""+ connectorType + "\"/>\n" +
"</CmResponse>\n";
doTest(connectorType, expectedResult);
}
/** Test InstantiatorException returns status code. */
public void testInstantiatorException() throws Exception {
manager = new ExceptionThrowingManager();
String connectorType = "UnknownConnectorType";
String expectedResult =
"<CmResponse>\n" +
" <StatusId>5305</StatusId>\n" +
"</CmResponse>\n";
doHandlerTest(connectorType, expectedResult);
}
/** A MockManager that throws exception when getting config form. */
private class ExceptionThrowingManager extends MockManager {
@Override
public ConfigureResponse getConfigForm(String connectorTypeName,
String language) throws InstantiatorException {
throw new InstantiatorException("getConfigForm: connectorType = "
+ connectorTypeName);
}
}
/** Test ProductionManager supplies connectorInstancePrototype in response. */
public void testProductionManagerGetConfigXml() throws Exception {
String connectorType = "TestConnectorA";
String expectedResult =
"<CmResponse>\n"
+ " <StatusId>0</StatusId>\n"
+ " <ConfigureResponse>\n"
+ " <FormSnippet><![CDATA[<tr>\n"
+ "<td>Username</td>\n"
+ "<td><input type=\"text\" name=\"Username\"/></td>\n"
+ "</tr>\n"
+ "<tr>\n"
+ "<td>Password</td>\n"
+ "<td><input type=\"password\" name=\"Password\"/></td>\n"
+ "</tr>\n"
+ "<tr>\n"
+ "<td>Color</td>\n"
+ "<td><input type=\"text\" name=\"Color\"/></td>\n"
+ "</tr>\n"
+ "<tr>\n"
+ "<td>RepositoryFile</td>\n"
+ "<td><input type=\"text\" name=\"RepositoryFile\"/></td>\n"
+ "</tr>\n"
+ "]]></FormSnippet>\n"
+ " <ConnectorConfigXml><![CDATA["
+ instantiator.getConnectorInstancePrototype(connectorType)
+ "]]></ConnectorConfigXml>\n"
+ " </ConfigureResponse>\n"
+ "</CmResponse>\n";
doTest(connectorType, expectedResult);
}
private void doTest(String connectorType, String expectedResult)
throws Exception {
doHandlerTest(connectorType, expectedResult);
doServletTest(connectorType, expectedResult);
}
private void doHandlerTest(String connectorType, String expectedResult) {
// Use the Servlet to get the unpopulated config form. Make sure it can be
// parsed and make sure the reserved XML properties are preserved.
StringWriter writer = new StringWriter();
PrintWriter out = new PrintWriter(writer);
GetConfigForm.handleDoGet(connectorType, "en", manager, out);
out.flush();
String result = writer.toString();
out.close();
LOGGER.info("Expected Response:\n" + expectedResult);
LOGGER.info("Actual Response:\n" + result);
assertEquals(StringUtils.normalizeNewlines(expectedResult),
StringUtils.normalizeNewlines(result));
}
private void doServletTest(String connectorType, String expectedResult)
throws Exception {
MockHttpServletRequest req = new MockHttpServletRequest("GET","");
req.setParameter(ServletUtil.XMLTAG_CONNECTOR_TYPE, connectorType);
MockHttpServletResponse res = new MockHttpServletResponse();
new GetConfigForm().doGet(req, res);
assertEquals(StringUtils.normalizeNewlines(expectedResult),
StringUtils.normalizeNewlines(res.getContentAsString()));
}
}