/**
* Copyright (c) 2009--2012 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package com.redhat.rhn.frontend.xmlrpc.test;
import com.redhat.rhn.common.hibernate.HibernateFactory;
import com.redhat.rhn.domain.common.LoggingFactory;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.frontend.xmlrpc.XmlRpcServlet;
import com.redhat.rhn.testing.TestCaseHelper;
import com.redhat.rhn.testing.UserTestUtils;
import com.mockobjects.servlet.MockServletInputStream;
import org.jmock.Expectations;
import org.jmock.integration.junit3.MockObjectTestCase;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class XmlRpcServletTest extends MockObjectTestCase {
protected void setUp() throws Exception {
super.setUp();
try {
LoggingFactory.clearLogId();
}
catch (Exception se) {
TestCaseHelper.tearDownHelper();
LoggingFactory.clearLogId();
}
}
protected void tearDown() throws Exception {
HibernateFactory.closeSession();
super.tearDown();
}
public void doTest(String request, String expectedResponse)
throws Exception {
StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw);
final MockServletInputStream input = new MockServletInputStream();
input.setupRead(request.getBytes());
final HttpServletRequest mockreq = this.mock(HttpServletRequest.class);
final HttpServletResponse mockresp = this.mock(HttpServletResponse.class);
context().checking(new Expectations() { {
atLeast(1).of(mockreq).getHeader("SOAPAction");
will(returnValue(null));
atLeast(1).of(mockreq).getInputStream();
will(returnValue(input));
atLeast(1).of(mockreq).getRemoteAddr();
will(returnValue("porsche.devel.redhat.com"));
atLeast(1).of(mockreq).getLocalName();
will(returnValue("foo.devel.redhat.com"));
atLeast(1).of(mockreq).getProtocol();
will(returnValue("http"));
atLeast(1).of(mockresp).getWriter();
will(returnValue(pw));
atLeast(1).of(mockresp).setContentType("text/xml");
} });
// ok run servlet
XmlRpcServlet xrs = new XmlRpcServlet(new MockHandlerFactory(), null);
xrs.init();
xrs.doPost(mockreq, mockresp);
assertEquals(expectedResponse, sw.toString());
}
public void testStringReturn() throws Exception {
doTest("<?xml version=\"1.0\"?> <methodCall> " +
"<methodName>registration.privacyStatement</methodName>" +
" <params> </params> </methodCall>",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<methodResponse><params><param><value><string>This is " +
"a privacy statement!</string></value></param></params>" +
"</methodResponse>");
}
public void testHashReturn() throws Exception {
doTest("<?xml version=\"1.0\"?> <methodCall> " +
"<methodName>unittest.login</methodName> <params> " +
"</params> </methodCall>",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<methodResponse><params><param><value><struct><member>" +
"<name>X-RHN-Server-Id</name><value><string>foo" +
"</string></value></member><member><name>" +
"X-RHN-Auth-Server-Time</name><value><string>foo" +
"</string></value></member><member><name>X-RHN-Auth" +
"</name><value><string>foo</string></value></member>" +
"<member><name>X-RHN-Auth-Channels</name><value><string>" +
"foo</string></value></member><member><name>" +
"X-RHN-Auth-Expire-Offset</name><value><string>foo" +
"</string></value></member><member><name>" +
"X-RHN-Auth-User-Id</name><value><string>foo</string>" +
"</value></member></struct></value></param></params>" +
"</methodResponse>");
}
public void testWrongNumParams() throws Exception {
Random rand = new Random();
int param1 = rand.nextInt();
doTest("<?xml version=\"1.0\"?> <methodCall> " +
"<methodName>unittest.add</methodName> <params> " +
"<param><value><i4>" + param1 + "</i4></value></param>" +
"</params>" +
"</methodCall>",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<methodResponse><fault><value><struct><member><name>" +
"faultCode</name><value><int>-1</int></value></member>" +
"<member><name>faultString</name><value><string>" +
"redstone.xmlrpc.XmlRpcFault: Could not find method: add in class: " +
"com.redhat.rhn.frontend.xmlrpc.test.UnitTestHandler with params: " +
"[java.lang.Integer]</string></value></member></struct></value></fault>" +
"</methodResponse>");
}
public void testWithParam() throws Exception {
Random rand = new Random();
int param1 = rand.nextInt();
int param2 = rand.nextInt();
doTest("<?xml version=\"1.0\"?> <methodCall> " +
"<methodName>unittest.add</methodName> <params> " +
"<param><value><i4>" + param1 + "</i4></value></param>" +
"<param><value><i4>" + param2 + "</i4></value></param>" +
"</params>" +
"</methodCall>",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<methodResponse><params><param><value><i4>" +
(param1 + param2) + "</i4>" +
"</value></param></params>" +
"</methodResponse>");
}
public void testFault() throws Exception {
doTest("<?xml version=\"1.0\"?> <methodCall> " +
"<methodName>unittest.throwFault</methodName> <params> " +
"</params> </methodCall>",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<methodResponse><fault><value><struct><member><name>" +
"faultCode</name><value><int>1</int></value></member>" +
"<member><name>faultString</name><value><string>" +
"redstone.xmlrpc.XmlRpcFault: " +
"This does not appear to be a valid username.</string>" +
"</value></member></struct></value></fault>" +
"</methodResponse>");
}
public void testTranslation() throws Exception {
User user = UserTestUtils.findNewUser("testuser", "testorg");
doTest("<?xml version=\"1.0\"?> <methodCall> " +
"<methodName>unittest.getUserLogin</methodName> <params> " +
"<param><value><i4>" + user.getId() + "</i4></value></param>" +
"</params>" +
"</methodCall>",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<methodResponse><params><param><value><string>" +
user.getLogin() +
"</string></value></param></params>" +
"</methodResponse>");
}
public void testCtor() {
// this test makes sure we always have a default ctor
XmlRpcServlet xrs = new XmlRpcServlet();
assertNotNull(xrs);
}
}