package org.ebayopensource.turmeric.tools.codegen.proto; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; import static org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.tag.ProtobufTagConstants.S_PROTO_TAG_MAX_VALUE; import static org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.tag.ProtobufTagConstants.S_PROTO_TAG_MIN_VALUE; import static org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.tag.ProtobufTagConstants.S_PROTO_TAG_RESERVED_MAX_VALUE; import static org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.tag.ProtobufTagConstants.S_PROTO_TAG_RESERVED_MIN_VALUE; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.wsdl.Definition; import javax.wsdl.factory.WSDLFactory; import javax.wsdl.xml.WSDLReader; import javax.xml.namespace.QName; import org.ebayopensource.turmeric.tools.TestResourceUtil; import org.ebayopensource.turmeric.tools.codegen.AbstractServiceGeneratorTestCase; import org.ebayopensource.turmeric.tools.codegen.external.wsdl.parser.schema.SchemaType; import org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.tag.DefaultProtobufTagGenerator; import org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.tag.ProtobufMetadataFileWriter; import org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.tag.ProtobufMetadataWriter; import org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.tag.ProtobufTagGenerator; import org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.tag.QnameMapBuilder; import org.junit.Test; import org.xml.sax.InputSource; public class ProtobufTagGeneratorTest extends AbstractServiceGeneratorTestCase { private final File protoFile = getProtobufRelatedInput(".MasterProto"); private final File corruptedProtoFile = getProtobufRelatedInput(".CorruptedMasterProto"); private final File corruptedProtoWithSpaceFile = getProtobufRelatedInput(".CorruptedMasterProto_2.proto"); private final File wsdlFile = getProtobufRelatedInput("ProtoTagMaster.wsdl"); private final File junkProtoFile = new File("lib/JUNKPROTO"); private final File junkWsdlFile = new File("lib/JUNKWSDL"); public File getProtobufRelatedInput(String name) { return TestResourceUtil.getResource("org/ebayopensource/turmeric/test/tools/codegen/data/proto/" + name); } @Test public void testDefaultProtobufTagGenerator_positive() { ProtobufTagGenerator generator = new DefaultProtobufTagGenerator(wsdlFile,protoFile); assertNotNull(generator); } @Test public void testDefaultProtobufTagGenerator_negative() { ProtobufTagGenerator generator=null; boolean pass = false; try { generator = new DefaultProtobufTagGenerator(wsdlFile,corruptedProtoFile); } catch (Exception e) { pass = true; } if(!pass) { fail("Corrupted proto file instantiated as expected"); } pass = false; try { generator = new DefaultProtobufTagGenerator(null,null); } catch (Exception e) { pass = true; } if(!pass) { fail("Corrupted proto file instantiated as expected"); } pass = false; try { generator = new DefaultProtobufTagGenerator(junkWsdlFile,junkProtoFile); } catch (Exception e) { pass = true; } if(!pass) { fail("Corrupted proto file instantiated as expected"); } pass = false; try { generator = new DefaultProtobufTagGenerator(junkWsdlFile,corruptedProtoWithSpaceFile); } catch (Exception e) { pass = true; } if(!pass) { fail("Corrupted proto file instantiated as expected"); } assertNull(generator); } @Test public void testGetTagsForType_testGetTagsToPersist_positive() { try { ProtobufTagGenerator generator = new DefaultProtobufTagGenerator(wsdlFile,protoFile); WSDLReader reader = WSDLFactory.newInstance().newWSDLReader(); InputSource inputSource = new InputSource(new FileInputStream(wsdlFile)); Definition definition = reader.readWSDL(null, inputSource); QnameMapBuilder builder = new QnameMapBuilder(definition); Map<QName, SchemaType> elementMap = builder.getElementMap(); Map<QName, SchemaType> schemaMap = builder.getSchemaMap(); Map<QName, SchemaType> qnameMap = new HashMap<QName, SchemaType>(); qnameMap.putAll(schemaMap); qnameMap.putAll(elementMap); Set<Entry<QName, SchemaType>> entrySet = qnameMap.entrySet(); for(Entry<QName, SchemaType> entry : entrySet) { QName key = entry.getKey(); Map<String, Integer> tagsForType = generator.getTagsForType(key); Set<Entry<String, Integer>> entrySet2 = tagsForType.entrySet(); Set<String> valueSet = new HashSet<String>(); Set<Integer> numberSet = new HashSet<Integer>(); for(Entry<String, Integer> entry2 : entrySet2) { String key2 = entry2.getKey(); Integer value = entry2.getValue(); boolean add = valueSet.add(key2); if(!add) { fail("Duplicate tag ?" + key2); } boolean hasUniqueNumber = numberSet.add(value); if(!hasUniqueNumber) { fail("Duplicate number ?" + key2); } assertNotNull(key2); assertNotNull(value); assertTrue(value>=S_PROTO_TAG_MIN_VALUE && value<=S_PROTO_TAG_MAX_VALUE); assertFalse(value>=S_PROTO_TAG_RESERVED_MIN_VALUE && value<=S_PROTO_TAG_RESERVED_MAX_VALUE); } assertNotNull(tagsForType); } Map<String, Integer> tagsToPersist = generator.getTagsToPersist(); assertNotNull(tagsToPersist); ProtobufMetadataWriter metadataWriter = new ProtobufMetadataFileWriter(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); metadataWriter.write(tagsToPersist, byteArrayOutputStream); byte[] byteArray = byteArrayOutputStream.toByteArray(); assertNotNull(byteArray); String result = new String(byteArray); assertNotNull(result); assertNotNull(byteArray); assertTrue(result.length()>0); } catch (Exception e) { fail(e.getMessage()); } } public void testGetTagsForType_testGetTagsToPersist_negative() { ProtobufTagGenerator generator = new DefaultProtobufTagGenerator(wsdlFile,protoFile); QName fakeName = new QName("http://nowhere/", "courage"); Map<String, Integer> tagsForType = generator.getTagsForType(fakeName); assertTrue(tagsForType.size()==0); } }