/* * Copyright 2014 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.web.bindery.requestfactory.shared; import com.google.gwt.core.client.GWT; import com.google.gwt.junit.client.GWTTestCase; import com.google.web.bindery.event.shared.SimpleEventBus; /** * Tests advanced usage of RequestFactory where a ServiceLayerDecorator * provides a service method at runtime, skipping interface validation at * compile-time. */ public class MethodProvidedByServiceLayerTest extends GWTTestCase { /** The factory under test. */ public interface Factory extends RequestFactory { Context context(); } /** * RequestContext whose actual server-side methods will be provided * dynamically at runtime by a ServiceLayerDecorator. * <p> * Note: the {@link SkipInterfaceValidation} is put on each method to test * that it's actually looked up at that location (it was searched on the * RequestContext only at some point). */ @Service(ServiceImpl.class) public interface Context extends RequestContext { @SkipInterfaceValidation Request<String> missingDomainMethod(String string); // mapped to SimpleFoo#echo(SimpleFoo) @SkipInterfaceValidation Request<Proxy> missingDomainType(Proxy proxy); // mapped to SimpleFoo#persistAndReturnSelf @SkipInterfaceValidation InstanceRequest<Proxy, Proxy> missingDomainTypeInstanceMethod(); } /** Proxy for an inexistent domain class; mapped at runtime to SimpleFoo. */ @SkipInterfaceValidation @ProxyForName("does.not.exist") public interface Proxy extends EntityProxy { } /** * Dummy service for interface validation. * <p> * All actual service methods are provided at runtime by * MethodProvidedByServiceLayerJreTest.Decorator. */ public static class ServiceImpl { } private static final int TEST_DELAY = 5000; private Factory factory; @Override public String getModuleName() { return "com.google.web.bindery.requestfactory.gwt.RequestFactorySuite"; } protected Factory createFactory() { Factory toReturn = GWT.create(Factory.class); toReturn.initialize(new SimpleEventBus()); return toReturn; } public void testMissingDomainMethod() { delayTestFinish(TEST_DELAY); Context ctx = context(); ctx.missingDomainMethod("foo").fire(new Receiver<String>() { @Override public void onSuccess(String response) { assertEquals("foo", response); finishTest(); } }); } public void testMissingDomainType() { delayTestFinish(TEST_DELAY); Context ctx = context(); final Proxy proxy = ctx.create(Proxy.class); ctx.missingDomainType(proxy).fire(new Receiver<Proxy>() { @Override public void onSuccess(Proxy response) { // we only check that the call succeeds finishTest(); } }); } public void testMissingDomainTypeInstanceMethod() { delayTestFinish(TEST_DELAY); Context ctx = context(); final Proxy proxy = ctx.create(Proxy.class); ctx.missingDomainTypeInstanceMethod().using(proxy).fire(new Receiver<Proxy>() { @Override public void onSuccess(Proxy response) { // we only check that the call succeeds finishTest(); } }); } @Override protected void gwtSetUp() { factory = createFactory(); } private Context context() { return factory.context(); } }