blob: 1e444e916eea8fb840cda17fcdcee9e51d138b12 [file] [log] [blame]
/*
* Copyright 2013 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.gwt.rebind;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.dev.javac.StandardGeneratorContext;
import com.google.gwt.dev.javac.testing.GeneratorContextBuilder;
import com.google.gwt.dev.javac.testing.JavaSource;
import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
import junit.framework.TestCase;
import java.io.PrintWriter;
import java.io.StringWriter;
/**
* Tests for {@link RequestFactoryGenerator}.
*/
public class RequestFactoryGeneratorTest extends TestCase {
// Common imports for generated clients.
private static final String COMMON_IMPORTS = "import com.google.api.gwt.shared.AuthScope;\n"
+ "import com.google.web.bindery.autobean.shared.AutoBean.PropertyName;\n"
+ "import com.google.web.bindery.requestfactory.shared.JsonRpcService;\n"
+ "import com.google.web.bindery.requestfactory.shared.Request;\n"
+ "import com.google.web.bindery.requestfactory.shared.RequestContext;\n"
+ "import com.google.web.bindery.requestfactory.shared.RequestFactory;\n";
// Classes needed by by RequestFactoryModel
private static final JavaSource SET = createMockJavaSource(
"java.util.Set",
"package java.util;",
"public interface Set<V> {}");
private static final JavaSource AUTH_SCOPE = createMockJavaSource(
"com.google.api.gwt.shared.AuthScope",
"package com.google.api.gwt.shared;",
"public @interface AuthScope {}");
private static final JavaSource SPLITTABLE = createMockJavaSource(
"com.google.web.bindery.autobean.shared.Splittable",
"package com.google.web.bindery.autobean.shared;",
"public interface Splittable {}");
private static final JavaSource PROPERTY_NAME = createMockJavaSource(
"com.google.web.bindery.autobean.shared.AutoBean.PropertyName",
"package com.google.web.bindery.autobean.shared.AutoBean;",
"public @interface PropertyName {}");
private static final JavaSource ENTITY_PROXY = createMockJavaSource(
"com.google.web.bindery.requestfactory.shared.EntityProxy",
"package com.google.web.bindery.requestfactory.shared;",
"public interface EntityProxy {}");
private static final JavaSource INSTANCE_REQUEST = createMockJavaSource(
"com.google.web.bindery.requestfactory.shared.InstanceRequest",
"package com.google.web.bindery.requestfactory.shared;",
"public interface InstanceRequest {}");
private static final JavaSource JSON_RPC_SERVICE = createMockJavaSource(
"com.google.web.bindery.requestfactory.shared.JsonRpcService",
"package com.google.web.bindery.requestfactory.shared;",
"public @interface JsonRpcService {}");
private static final JavaSource REQUEST = createMockJavaSource(
"com.google.web.bindery.requestfactory.shared.Request",
"package com.google.web.bindery.requestfactory.shared;",
"public interface Request<T> {}");
private static final JavaSource REQUEST_CONTEXT = createMockJavaSource(
"com.google.web.bindery.requestfactory.shared.RequestContext",
"package com.google.web.bindery.requestfactory.shared;",
"public interface RequestContext {}");
private static final JavaSource REQUEST_FACTORY = createMockJavaSource(
"com.google.web.bindery.requestfactory.shared.RequestFactory",
"package com.google.web.bindery.requestfactory.shared;",
"public interface RequestFactory {}");
private static final JavaSource VALUE_PROXY = createMockJavaSource(
"com.google.web.bindery.requestfactory.shared.ValueProxy",
"package com.google.web.bindery.requestfactory.shared;",
"public interface ValueProxy {}");
private TreeLogger logger;
private StringWriter writer;
private GeneratorContextBuilder contextBuilder;
private RequestFactoryGenerator generator;
@Override
public void setUp() throws Exception {
super.setUp();
writer = new StringWriter();
logger = createTreeLogger(new PrintWriter(writer));
generator = new RequestFactoryGenerator();
contextBuilder = GeneratorContextBuilder.newCoreBasedBuilder();
contextBuilder.add(SET);
contextBuilder.add(AUTH_SCOPE);
contextBuilder.add(SPLITTABLE);
contextBuilder.add(PROPERTY_NAME);
contextBuilder.add(ENTITY_PROXY);
contextBuilder.add(INSTANCE_REQUEST);
contextBuilder.add(JSON_RPC_SERVICE);
contextBuilder.add(REQUEST);
contextBuilder.add(REQUEST_CONTEXT);
contextBuilder.add(REQUEST_FACTORY);
contextBuilder.add(VALUE_PROXY);
}
private static TreeLogger createTreeLogger(PrintWriter writer) {
PrintWriterTreeLogger logger = new PrintWriterTreeLogger(writer);
logger.setMaxDetail(TreeLogger.ERROR);
return logger;
}
public void testContextIsNotAService() throws Exception {
JavaSource simpleEnumTest = createMockJavaSource("test.Simple",
"package test;",
COMMON_IMPORTS,
"public interface Simple extends RequestFactory {",
" SimpleContext simple();",
" public interface SimpleContext extends RequestContext {",
" GetByIdRequest getById(Long id);",
" public interface GetByIdRequest extends Request<String> {",
" GetByIdRequest setId(Long id);",
" }",
" }",
"}");
contextBuilder.add(simpleEnumTest);
StandardGeneratorContext ctx =
(StandardGeneratorContext) contextBuilder.buildGeneratorContext();
assertNotNull(ctx.getTypeOracle().findType("test.Simple"));
try {
assertEquals("test.SimpleImpl",
generator.generate(logger, contextBuilder.buildGeneratorContext(), "test.Simple"));
fail("RequestContext is not annotated as a service");
} catch (UnableToCompleteException expected) {
assertTrue(writer.toString().contains("RequestContext subtype test.Simple.SimpleContext "
+ "is missing a @Service or @JsonRpcService annotation"));
}
}
public void testExtraEnumsPulledFromParameterizedParameters() throws Exception {
JavaSource simpleEnumTest = createMockJavaSource("test.Simple",
"package test;",
COMMON_IMPORTS,
"public interface Simple extends RequestFactory {",
" SimpleContext simple();",
" @JsonRpcService",
" public interface SimpleContext extends RequestContext {",
" GetByIdRequest getById(Long id);",
" public interface GetByIdRequest extends Request<String> {",
" public enum GetByIdEnum {}",
" GetByIdRequest setId(Long id);",
" GetByIdRequest setEnums(java.util.List<GetByIdEnum> enums);",
" }",
" }",
"}");
contextBuilder.add(simpleEnumTest);
StandardGeneratorContext ctx =
(StandardGeneratorContext) contextBuilder.buildGeneratorContext();
assertNotNull(ctx.getTypeOracle().findType("test.Simple"));
try {
assertEquals("test.SimpleImpl", generator.generate(logger, ctx, "test.Simple"));
} catch (UnableToCompleteException e) {
throw new RuntimeException("Could not complete with errors:\n" + writer.toString());
}
assertNotNull(ctx.getGeneratedUnitMap().get("test.SimpleImpl"));
String source = ctx.getGeneratedUnitMap().get("test.SimpleImpl").getSource();
assertTrue(source.contains("@com.google.web.bindery.autobean.shared.impl.EnumMap.ExtraEnums("
+ "{test.Simple.SimpleContext.GetByIdRequest.GetByIdEnum.class})"));
}
private static JavaSource createMockJavaSource(String typeName, final String... lines) {
return new JavaSource(typeName) {
@Override
public String getSource() {
StringBuilder code = new StringBuilder();
for (String line : lines) {
code.append(line + "\n");
}
return code.toString();
}
};
}
}