package com.googlecode.jsonrpc4j.server; import com.googlecode.jsonrpc4j.HttpStatusCodeProvider; import com.googlecode.jsonrpc4j.JsonRpcServer; 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 static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.BULK_ERROR; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.ERROR_NOT_HANDLED; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.INTERNAL_ERROR; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.INVALID_REQUEST; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.METHOD_NOT_FOUND; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.METHOD_PARAMS_INVALID; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.PARSE_ERROR; import static com.googlecode.jsonrpc4j.server.DefaultHttpStatusCodeProviderTest.assertHttpStatusCodeForJsonRpcRequest; import static com.googlecode.jsonrpc4j.util.Util.intParam1; import static com.googlecode.jsonrpc4j.util.Util.intParam2; import static com.googlecode.jsonrpc4j.util.Util.invalidJsonRpcRequestStream; import static com.googlecode.jsonrpc4j.util.Util.invalidJsonStream; import static com.googlecode.jsonrpc4j.util.Util.mapper; import static com.googlecode.jsonrpc4j.util.Util.messageWithListParams; import static com.googlecode.jsonrpc4j.util.Util.messageWithListParamsStream; import static com.googlecode.jsonrpc4j.util.Util.multiMessageOfStream; import static com.googlecode.jsonrpc4j.util.Util.param1; import static com.googlecode.jsonrpc4j.util.Util.param2; /** * These tests validate the functionality of a custom HttpStatusCodeProvider implementation. */ @RunWith(EasyMockRunner.class) public class HttpStatusCodeProviderTest { @Mock(type = MockType.NICE) private JsonRpcBasicServerTest.ServiceInterface mockService; private JsonRpcServer jsonRpcServer; private HttpStatusCodeProvider httpStatusCodeProvider; @Before public void setUp() throws Exception { jsonRpcServer = new JsonRpcServer(mapper, mockService, JsonRpcBasicServerTest.ServiceInterface.class); httpStatusCodeProvider = new HttpStatusCodeProvider() { @Override public int getHttpStatusCode(int resultCode) { if (resultCode == PARSE_ERROR.code) { return 1002; } else if (resultCode == INVALID_REQUEST.code) { return 1001; } else if (resultCode == METHOD_NOT_FOUND.code) { return 1003; } else if (resultCode == METHOD_PARAMS_INVALID.code) { return 1004; } else if (resultCode == INTERNAL_ERROR.code) { return 1007; } else if (resultCode == ERROR_NOT_HANDLED.code) { return 1006; } else if (resultCode == BULK_ERROR.code) { return 1005; } else { return 1000; } } @Override public Integer getJsonRpcCode(int httpStatusCode) { return null; } }; jsonRpcServer.setHttpStatusCodeProvider(httpStatusCodeProvider); } @Test public void http1001ForInvalidRequest() throws Exception { assertHttpStatusCodeForJsonRpcRequest(invalidJsonRpcRequestStream(), 1003, jsonRpcServer); } @Test public void http1002ForParseError() throws Exception { assertHttpStatusCodeForJsonRpcRequest(invalidJsonStream(), 1002, jsonRpcServer); } @Test public void http1000ForValidRequest() throws Exception { assertHttpStatusCodeForJsonRpcRequest(messageWithListParamsStream(1, "testMethod", param1), 1000, jsonRpcServer); } @Test public void http1003ForNonExistingMethod() throws Exception { assertHttpStatusCodeForJsonRpcRequest(messageWithListParamsStream(1, "nonExistingMethod", param1), 1003, jsonRpcServer); } @Test public void http1004ForInvalidMethodParameters() throws Exception { assertHttpStatusCodeForJsonRpcRequest(messageWithListParamsStream(1, "testMethod", param1, param2), 1004, jsonRpcServer); } @Test public void http1005ForBulkErrors() throws Exception { assertHttpStatusCodeForJsonRpcRequest( multiMessageOfStream( messageWithListParams(1, "testMethod", param1, param2), messageWithListParams(2, "overloadedMethod", intParam1, intParam2) ), 1005, jsonRpcServer); } @Test public void http1006ForErrorNotHandled() throws Exception { JsonRpcServer server = new JsonRpcServer(mapper, mockService, JsonRpcErrorsTest.ServiceInterfaceWithoutAnnotation.class); server.setHttpStatusCodeProvider(httpStatusCodeProvider); assertHttpStatusCodeForJsonRpcRequest(messageWithListParamsStream(1, "testMethod"), 1006, server); } }