/*
* Copyright 2002-2007 the original author or authors.
*
* 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.baidu.bjf.remoting.protobuf.idlgenerate;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Test;
import com.baidu.bjf.remoting.protobuf.IDLProxyObject;
import com.baidu.bjf.remoting.protobuf.ProtobufIDLGenerator;
import com.baidu.bjf.remoting.protobuf.ProtobufIDLProxy;
import com.baidu.bjf.remoting.protobuf.complex.AddressBookProtosPOJO;
import com.baidu.bjf.remoting.protobuf.complex.AddressBookProtosPOJOWithDefault;
import com.baidu.bjf.remoting.protobuf.complex.PersonPOJO;
import com.baidu.bjf.remoting.protobuf.complex.PersonPOJOWithDefault;
import com.baidu.bjf.remoting.protobuf.enumeration.EnumPOJOClass;
import com.baidu.bjf.remoting.protobuf.simplerepeat.RequrieRepeatedNumberTypePOJOClass2;
import com.baidu.bjf.remoting.protobuf.simpletypes.AllTypesDojoClass;
import com.google.protobuf.InvalidProtocolBufferException;
import com.baidu.jprotobuf.com.squareup.protoparser.FieldElement;
import com.baidu.jprotobuf.com.squareup.protoparser.MessageElement;
import com.baidu.jprotobuf.com.squareup.protoparser.ProtoFile;
import com.baidu.jprotobuf.com.squareup.protoparser.ProtoParser;
import com.baidu.jprotobuf.com.squareup.protoparser.TypeElement;
import junit.framework.Assert;
/**
* Test IDL script generate tool
*
* @author xiemalin
* @since 1.0.1
*/
public class ComplexIDLGenerateTest {
protected TypeElement getByName(String name, List<TypeElement> types) {
for (TypeElement type : types) {
String typeName = type.name();
if (typeName.equals(name)) {
return type;
}
}
return null;
}
@Test
public void TestGenerateIDLComplexList() throws InvalidProtocolBufferException {
String code = ProtobufIDLGenerator.getIDL(AddressBookProtosPOJO.class);
Assert.assertNotNull(code);
ProtoFile protoFile = ProtoParser.parse("autogenerate", code);
Assert.assertNotNull(protoFile);
Assert.assertEquals(AddressBookProtosPOJO.class.getPackage().getName(),
protoFile.packageName());
Assert.assertEquals(2, protoFile.typeElements().size());
List<TypeElement> types = protoFile.typeElements();
TypeElement type = getByName(AddressBookProtosPOJO.class.getSimpleName(), types);
Assert.assertNotNull(type);
MessageElement messageType = (MessageElement) type;
System.out.println(messageType.extensions());
List<FieldElement> fields = messageType.fields();
Assert.assertEquals(2, fields.size());
Assert.assertEquals("list", fields.get(0).name());
Assert.assertEquals(PersonPOJO.class.getSimpleName(), fields.get(0).type().toString());
Assert.assertEquals(FieldElement.Label.OPTIONAL, fields.get(0).label());
type = getByName(PersonPOJO.class.getSimpleName(), types);
Assert.assertNotNull(type);
messageType = (MessageElement) type;
fields = messageType.fields();
Assert.assertEquals(7, fields.size());
for (FieldElement field : fields) {
System.out.println(field.tag());
}
}
@Test
public void TestGenerateIDLComplexListWithDefalut() throws InvalidProtocolBufferException {
String code = ProtobufIDLGenerator.getIDL(AddressBookProtosPOJOWithDefault.class);
Assert.assertNotNull(code);
ProtoFile protoFile = ProtoParser.parse("autogenerate", code);
Assert.assertNotNull(protoFile);
Assert.assertEquals(AddressBookProtosPOJOWithDefault.class.getPackage().getName(),
protoFile.packageName());
Assert.assertEquals(2, protoFile.typeElements().size());
List<TypeElement> types = protoFile.typeElements();
TypeElement type = getByName(AddressBookProtosPOJOWithDefault.class.getSimpleName(), types);
Assert.assertNotNull(type);
MessageElement messageType = (MessageElement) type;
System.out.println(messageType.extensions());
List<FieldElement> fields = messageType.fields();
Assert.assertEquals(2, fields.size());
Assert.assertEquals("list", fields.get(0).name());
Assert.assertEquals(PersonPOJOWithDefault.class.getSimpleName(), fields.get(0).type().toString());
Assert.assertEquals(FieldElement.Label.OPTIONAL, fields.get(0).label());
type = getByName(PersonPOJOWithDefault.class.getSimpleName(), types);
Assert.assertNotNull(type);
messageType = (MessageElement) type;
fields = messageType.fields();
Assert.assertEquals(7, fields.size());
for (FieldElement field : fields) {
System.out.println(field.tag());
}
}
@Test
public void testDefaultValue() {
String idl = "package tutorial;" +
"option java_package = \"com.example.tutorial\";" +
"option java_outer_classname = \"AddressBookProtos\";" +
"enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2;}" +
" message PhoneNumberAA {" +
"optional PhoneType type = 1 [default = HOME];" +
"optional int32 name = 2 [default = 10];" +
"optional string vName = 3 [default = \"hello world\"];" +
"}";
IDLProxyObject idlProxyObject = ProtobufIDLProxy.createSingle(idl);
Object type = idlProxyObject.get("type");
Assert.assertEquals(type + "", "HOME");
Assert.assertEquals(10, idlProxyObject.get("name"));
Assert.assertEquals("hello world", idlProxyObject.get("vName"));
}
@Test
public void testNoOptionalMark() {
String idl = "syntax = \"proto3\";package tutorial;" +
"option java_package = \"com.example.tutorial\";" +
"option java_outer_classname = \"AddressBookProtos\";" +
"enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2;}" +
" message PhoneNumber {" +
" int32 type = 1; " +
" int32 name = 2 [default = 10];" +
" string vName = 3 [default = \"hello world\"];" +
"}";
try {
ProtobufIDLProxy.createSingle(idl);
} catch (Exception e) {
Assert.fail(e.getMessage());
}
}
@Test
public void testGenerateIDLSimpleType() throws InvalidProtocolBufferException {
String code = ProtobufIDLGenerator.getIDL(AllTypesDojoClass.class);
Assert.assertNotNull(code);
}
@Test
public void testGenerateIDLEnumTypeAndTypesReturns() {
final Set<Class<?>> cachedTypes = new HashSet<Class<?>>();
final Set<Class<?>> cachedEnumTypes = new HashSet<Class<?>>();
String code = ProtobufIDLGenerator.getIDL(EnumPOJOClass.class, cachedTypes, cachedEnumTypes);
Assert.assertNotNull(code);
Assert.assertEquals(1, cachedTypes.size());
Assert.assertEquals(1, cachedEnumTypes.size());
}
@Test
public void testListIDLGenerate() {
String code = ProtobufIDLGenerator.getIDL(RequrieRepeatedNumberTypePOJOClass2.class);
Assert.assertTrue(code.indexOf("repeated int32") != -1);
}
@Test
public void testEmptyClass() {
String code = ProtobufIDLGenerator.getIDL(EmptyClass.class);
Assert.assertTrue(code.indexOf("message") != -1);
}
private static class EmptyClass {
}
@Test
public void testProtobufIDLGeneratorGetIDLTypesReturns() {
final Set<Class<?>> cachedTypes = new HashSet<Class<?>>();
final Set<Class<?>> cachedEnumTypes = new HashSet<Class<?>>();
String code = ProtobufIDLGenerator.getIDL(EmptyClass.class, cachedTypes, cachedEnumTypes);
Assert.assertTrue(code.indexOf("message") != -1);
Assert.assertEquals(1, cachedTypes.size());
Assert.assertEquals(0, cachedEnumTypes.size());
code = ProtobufIDLGenerator.getIDL(EmptyClass.class, cachedTypes, cachedEnumTypes);
Assert.assertNull(code);
}
}