| /* |
| * Copyright 2008 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.gwt.user.client.rpc; |
| |
| import com.google.gwt.core.client.GWT; |
| import com.google.gwt.http.client.Request; |
| import com.google.gwt.http.client.RequestBuilder; |
| import com.google.gwt.http.client.RequestCallback; |
| import com.google.gwt.http.client.RequestException; |
| import com.google.gwt.http.client.Response; |
| |
| /** |
| * This test case is used to check that the RemoteServiceServlet walks the class |
| * hierarchy looking for the service interface. Prior to this test the servlet |
| * would only look into the concrete class but not in any of its super classes. |
| * |
| * See <a href= |
| * "http://code.google.com/p/google-web-toolkit/issues/detail?id=50&can=3&q=" |
| * >Bug 50</a> for more details. |
| * <p> |
| * This test works in conjunction with |
| * {@link com.google.gwt.user.server.rpc.RemoteServiceServletTestServiceImpl}. |
| * </p> |
| */ |
| public class RemoteServiceServletTest extends RpcTestBase { |
| private static class MyRpcRequestBuilder extends RpcRequestBuilder { |
| private boolean doCreate; |
| private boolean doFinish; |
| private boolean doSetCallback; |
| private boolean doSetContentType; |
| private boolean doSetRequestData; |
| private boolean doSetRequestId; |
| |
| public void check() { |
| assertTrue("doCreate", doCreate); |
| assertTrue("doFinish", doFinish); |
| assertTrue("doSetCallback", doSetCallback); |
| assertTrue("doSetContentType", doSetContentType); |
| assertTrue("doSetRequestData", doSetRequestData); |
| assertTrue("doSetRequestId", doSetRequestId); |
| } |
| |
| @Override |
| protected RequestBuilder doCreate(String serviceEntryPoint) { |
| doCreate = true; |
| return super.doCreate(serviceEntryPoint); |
| } |
| |
| @Override |
| protected void doFinish(RequestBuilder rb) { |
| doFinish = true; |
| super.doFinish(rb); |
| } |
| |
| @Override |
| protected void doSetCallback(RequestBuilder rb, RequestCallback callback) { |
| doSetCallback = true; |
| super.doSetCallback(rb, callback); |
| } |
| |
| @Override |
| protected void doSetContentType(RequestBuilder rb, String contentType) { |
| doSetContentType = true; |
| super.doSetContentType(rb, contentType); |
| } |
| |
| @Override |
| protected void doSetRequestData(RequestBuilder rb, String data) { |
| doSetRequestData = true; |
| super.doSetRequestData(rb, data); |
| } |
| |
| @Override |
| protected void doSetRequestId(RequestBuilder rb, int id) { |
| doSetRequestId = true; |
| super.doSetRequestId(rb, id); |
| } |
| } |
| |
| protected static RemoteServiceServletTestServiceAsync getAsyncService() { |
| RemoteServiceServletTestServiceAsync service = (RemoteServiceServletTestServiceAsync) GWT.create(RemoteServiceServletTestService.class); |
| |
| ((ServiceDefTarget) service).setServiceEntryPoint(GWT.getModuleBaseURL() |
| + "servlettest"); |
| |
| return service; |
| } |
| |
| private Request req; |
| |
| public void testAlternateStatusCode() { |
| RemoteServiceServletTestServiceAsync service = getAsyncService(); |
| ((ServiceDefTarget) service).setServiceEntryPoint(GWT.getModuleBaseURL() |
| + "servlettest/404"); |
| |
| delayTestFinishForRpc(); |
| |
| service.test(new AsyncCallback<Void>() { |
| |
| public void onFailure(Throwable caught) { |
| if (caught instanceof StatusCodeException) { |
| assertEquals(Response.SC_NOT_FOUND, |
| ((StatusCodeException) caught).getStatusCode()); |
| finishTest(); |
| } else { |
| TestSetValidator.rethrowException(caught); |
| } |
| } |
| |
| public void onSuccess(Void result) { |
| fail("Should not have succeeded"); |
| } |
| }); |
| } |
| |
| /** |
| * Verify behavior when the RPC method throws a RuntimeException declared on |
| * the RemoteService interface. |
| */ |
| public void testDeclaredRuntimeException() { |
| RemoteServiceServletTestServiceAsync service = getAsyncService(); |
| |
| delayTestFinishForRpc(); |
| |
| service.throwDeclaredRuntimeException(new AsyncCallback<Void>() { |
| |
| public void onFailure(Throwable caught) { |
| assertTrue(caught instanceof NullPointerException); |
| assertEquals("expected", caught.getMessage()); |
| finishTest(); |
| } |
| |
| public void onSuccess(Void result) { |
| fail(); |
| } |
| }); |
| } |
| |
| public void testManualSend() throws RequestException { |
| RemoteServiceServletTestServiceAsync service = getAsyncService(); |
| |
| delayTestFinishForRpc(); |
| |
| RequestBuilder builder = service.testExpectCustomHeader(new AsyncCallback<Void>() { |
| |
| public void onFailure(Throwable caught) { |
| TestSetValidator.rethrowException(caught); |
| } |
| |
| public void onSuccess(Void result) { |
| assertTrue(!req.isPending()); |
| finishTest(); |
| } |
| }); |
| |
| builder.setHeader("X-Custom-Header", "true"); |
| req = builder.send(); |
| assertTrue(req.isPending()); |
| } |
| |
| public void testPermutationStrongName() { |
| RemoteServiceServletTestServiceAsync service = getAsyncService(); |
| |
| delayTestFinishForRpc(); |
| |
| assertNotNull(GWT.getPermutationStrongName()); |
| service.testExpectPermutationStrongName(GWT.getPermutationStrongName(), |
| new AsyncCallback<Void>() { |
| |
| public void onFailure(Throwable caught) { |
| TestSetValidator.rethrowException(caught); |
| } |
| |
| public void onSuccess(Void result) { |
| finishTest(); |
| } |
| }); |
| } |
| |
| /** |
| * Test that the policy strong name is available from browser-side Java code. |
| */ |
| public void testPolicyStrongName() { |
| String policy = ((ServiceDefTarget) getAsyncService()).getSerializationPolicyName(); |
| assertNotNull(policy); |
| assertTrue(policy.length() != 0); |
| } |
| |
| /** |
| * Send request without the permutation strong name and expect a |
| * SecurityException. This tests |
| * RemoteServiceServlet#checkPermutationStrongName. |
| */ |
| public void testRequestWithoutStrongNameHeader() { |
| RemoteServiceServletTestServiceAsync service = getAsyncService(); |
| ((ServiceDefTarget) service).setRpcRequestBuilder(new RpcRequestBuilder() { |
| /** |
| * Copied from base class. |
| */ |
| @Override |
| protected void doFinish(RequestBuilder rb) { |
| // Don't set permutation strong name |
| rb.setHeader(MODULE_BASE_HEADER, GWT.getModuleBaseURL()); |
| } |
| |
| }); |
| |
| delayTestFinishForRpc(); |
| service.test(new AsyncCallback<Void>() { |
| public void onFailure(Throwable caught) { |
| assertTrue(caught instanceof StatusCodeException); |
| assertEquals(500, ((StatusCodeException) caught).getStatusCode()); |
| finishTest(); |
| } |
| |
| public void onSuccess(Void result) { |
| fail(); |
| } |
| }); |
| } |
| |
| /** |
| * Ensure that each doFoo method is called. |
| */ |
| public void testRpcRequestBuilder() { |
| final MyRpcRequestBuilder builder = new MyRpcRequestBuilder(); |
| RemoteServiceServletTestServiceAsync service = getAsyncService(); |
| ((ServiceDefTarget) service).setRpcRequestBuilder(builder); |
| |
| delayTestFinishForRpc(); |
| service.test(new AsyncCallback<Void>() { |
| public void onFailure(Throwable caught) { |
| TestSetValidator.rethrowException(caught); |
| } |
| |
| public void onSuccess(Void result) { |
| builder.check(); |
| finishTest(); |
| } |
| }); |
| } |
| |
| public void testServiceInterfaceLocation() { |
| RemoteServiceServletTestServiceAsync service = getAsyncService(); |
| |
| delayTestFinishForRpc(); |
| |
| req = service.test(new AsyncCallback<Void>() { |
| |
| public void onFailure(Throwable caught) { |
| TestSetValidator.rethrowException(caught); |
| } |
| |
| public void onSuccess(Void result) { |
| assertTrue(!req.isPending()); |
| finishTest(); |
| } |
| }); |
| assertTrue(req.isPending()); |
| } |
| |
| /** |
| * Verify behavior when the RPC method throws an unknown RuntimeException |
| * (possibly one unknown to the client). |
| */ |
| public void testUnknownRuntimeException() { |
| RemoteServiceServletTestServiceAsync service = getAsyncService(); |
| |
| delayTestFinishForRpc(); |
| |
| service.throwUnknownRuntimeException(new AsyncCallback<Void>() { |
| |
| public void onFailure(Throwable caught) { |
| assertTrue(caught instanceof InvocationException); |
| finishTest(); |
| } |
| |
| public void onSuccess(Void result) { |
| fail(); |
| } |
| }); |
| } |
| } |