package com.googlecode.jsonrpc4j.server; import com.fasterxml.jackson.databind.JsonNode; import com.googlecode.jsonrpc4j.JsonRpcBasicServer; import com.googlecode.jsonrpc4j.JsonRpcParam; import com.googlecode.jsonrpc4j.util.Util; import org.easymock.EasyMock; import org.easymock.EasyMockRunner; import org.easymock.Mock; import org.easymock.MockType; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.io.ByteArrayOutputStream; import java.io.IOException; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.METHOD_PARAMS_INVALID; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.PARSE_ERROR; import static com.googlecode.jsonrpc4j.JsonRpcBasicServer.RESULT; import static com.googlecode.jsonrpc4j.util.Util.decodeAnswer; import static com.googlecode.jsonrpc4j.util.Util.error; import static com.googlecode.jsonrpc4j.util.Util.errorCode; import static com.googlecode.jsonrpc4j.util.Util.intParam1; import static com.googlecode.jsonrpc4j.util.Util.intParam2; import static com.googlecode.jsonrpc4j.util.Util.mapper; import static com.googlecode.jsonrpc4j.util.Util.messageWithMapParamsStream; import static com.googlecode.jsonrpc4j.util.Util.param1; import static com.googlecode.jsonrpc4j.util.Util.param2; import static com.googlecode.jsonrpc4j.util.Util.param3; import static com.googlecode.jsonrpc4j.util.Util.param4; import static org.junit.Assert.assertEquals; @RunWith(EasyMockRunner.class) public class JsonRpcServerAnnotatedParamTest { @Mock(type = MockType.NICE) private ServiceInterfaceWithParamNameAnnotation mockService; private ByteArrayOutputStream byteArrayOutputStream; private JsonRpcBasicServer jsonRpcServerAnnotatedParam; @Before public void setup() { byteArrayOutputStream = new ByteArrayOutputStream(); jsonRpcServerAnnotatedParam = new JsonRpcBasicServer(mapper, mockService, ServiceInterfaceWithParamNameAnnotation.class); } @Test public void callMethodWithTooFewParametersNamed() throws Exception { EasyMock.expect(mockService.testMethod(EasyMock.anyObject(String.class))).andReturn("success"); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("testMethod"), byteArrayOutputStream); assertEquals(METHOD_PARAMS_INVALID.code, errorCode(error(byteArrayOutputStream)).intValue()); } @Test public void callMethodExactNumberOfParametersNamed() throws Exception { EasyMock.expect(mockService.testMethod(EasyMock.anyObject(String.class))).andReturn("success"); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("testMethod", param1, param2), byteArrayOutputStream); assertEquals("success", result().textValue()); } private JsonNode result() throws IOException { return decodeAnswer(byteArrayOutputStream).get(RESULT); } @Test public void callMethodWithExtraParameterNamed() throws Exception { EasyMock.expect(mockService.testMethod(EasyMock.anyObject(String.class))).andReturn("success"); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("testMethod", param1, param2, param3, intParam1), byteArrayOutputStream); assertEquals(METHOD_PARAMS_INVALID.code, errorCode(error(byteArrayOutputStream)).intValue()); } @Test public void callMethodWithTooFewParametersNamedAllowOn() throws Exception { EasyMock.expect(mockService.testMethod(EasyMock.anyObject(String.class))).andReturn("success"); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.setAllowExtraParams(true); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("testMethod"), byteArrayOutputStream); assertEquals(METHOD_PARAMS_INVALID.code, errorCode(error(byteArrayOutputStream)).intValue()); } @Test public void callMethodExactNumberOfParametersNamedAllowOn() throws Exception { EasyMock.expect(mockService.testMethod(EasyMock.anyObject(String.class))).andReturn("success"); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.setAllowExtraParams(true); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("testMethod", param1, param2), byteArrayOutputStream); assertEquals("success", result().textValue()); } @Test public void callMethodWithExtraParameterNamedAllowOn() throws Exception { EasyMock.expect(mockService.testMethod(EasyMock.anyObject(String.class))).andReturn("success"); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.setAllowExtraParams(true); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("testMethod", param1, param2, param3, intParam1), byteArrayOutputStream); assertEquals("success", result().textValue()); } @Test public void callOverloadedMethodNoNamedParams() throws Exception { EasyMock.expect(mockService.overloadedMethod()).andReturn(param1); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("overloadedMethod"), byteArrayOutputStream); assertEquals(param1, result().textValue()); } @Test public void callOverloadedMethodOneNamedStringParam() throws Exception { EasyMock.expect(mockService.overloadedMethod(EasyMock.anyString())).andReturn(param3); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("overloadedMethod", param1, param2), byteArrayOutputStream); assertEquals(param3, result().textValue()); } @Test public void callOverloadedMethodOneNamedIntParam() throws Exception { EasyMock.expect(mockService.overloadedMethod(intParam1)).andReturn(param2); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("overloadedMethod", param1, intParam1), byteArrayOutputStream); assertEquals(param2, result().textValue()); } @Test public void callOverloadedMethodTwoNamedStringParams() throws Exception { EasyMock.expect(mockService.overloadedMethod(param3, param4)).andReturn(param1 + param2); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("overloadedMethod", param1, param3, param2, param4), byteArrayOutputStream); assertEquals(param1 + param2, result().textValue()); } @Test public void callOverloadedMethodTwoNamedIntParams() throws Exception { EasyMock.expect(mockService.overloadedMethod(intParam1, intParam2)).andReturn((intParam1 + intParam2) + ""); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("overloadedMethod", param1, intParam1, param2, intParam2), byteArrayOutputStream); assertEquals((intParam1 + intParam2) + "", result().textValue()); } @Test public void callOverloadedMethodNamedExtraParams() throws Exception { EasyMock.expect(mockService.overloadedMethod(intParam1, intParam2)).andReturn((intParam1 + intParam2) + ""); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("overloadedMethod", param1, intParam1, param2, intParam2, param3, param4), byteArrayOutputStream); assertEquals(METHOD_PARAMS_INVALID.code, errorCode(error(byteArrayOutputStream)).intValue()); } @Test public void callOverloadedMethodNamedExtraParamsAllowOn() throws Exception { EasyMock.expect(mockService.overloadedMethod(intParam1, intParam2)).andReturn((intParam1 + intParam2) + ""); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.setAllowExtraParams(true); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("overloadedMethod", param1, intParam1, param2, intParam2, param3, param4), byteArrayOutputStream); assertEquals((intParam1 + intParam2) + "", result().textValue()); } @Test public void callMethodWithoutRequiredParam() throws Exception { EasyMock.expect(mockService.methodWithoutRequiredParam(param2, param4)).andReturn(param2 + param4); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("methodWithoutRequiredParam", param1, param3), byteArrayOutputStream); assertEquals(METHOD_PARAMS_INVALID.code, errorCode(error(byteArrayOutputStream)).intValue()); } @Test public void callMethodWithoutRequiredParamAllowOn() throws Exception { EasyMock.expect(mockService.methodWithoutRequiredParam(EasyMock.eq(param3), EasyMock.anyString())).andReturn(param3); EasyMock.replay(mockService); jsonRpcServerAnnotatedParam.setAllowLessParams(true); jsonRpcServerAnnotatedParam.handleRequest(messageWithMapParamsStream("methodWithoutRequiredParam", param1, param3), byteArrayOutputStream); assertEquals(param3, result().textValue()); } @Test public void callParseErrorJson() throws Exception { jsonRpcServerAnnotatedParam.handleRequest(Util.invalidJsonStream(), byteArrayOutputStream); assertEquals(PARSE_ERROR.code, errorCode(error(byteArrayOutputStream)).asInt()); } public interface ServiceInterfaceWithParamNameAnnotation { String testMethod(@JsonRpcParam("param1") String param1); String overloadedMethod(); String overloadedMethod(@JsonRpcParam("param1") String stringParam1); String overloadedMethod(@JsonRpcParam("param1") String stringParam1, @JsonRpcParam("param2") String stringParam2); String overloadedMethod(@JsonRpcParam("param1") int intParam1); String overloadedMethod(@JsonRpcParam("param1") int intParam1, @JsonRpcParam("param2") int intParam2); String methodWithoutRequiredParam(@JsonRpcParam("param1") String stringParam1, @JsonRpcParam(value = "param2") String stringParam2); } }