/**
* Copyright (C) 2011 Metamarkets http://metamx.com
*
* 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.metamx.milano.proto;
import com.google.protobuf.ByteString;
import com.google.protobuf.DescriptorProtos;
import com.google.protobuf.Descriptors;
import com.google.protobuf.DynamicMessage;
import com.metamx.milano.generated.io.MilanoTypeMetadata;
import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
/**
*
*/
public class MilanoToolTests
{
private static final Logger log = Logger.getLogger(MilanoToolTests.class);
private DescriptorProtos.DescriptorProto simpleDescriptorProto;
private Descriptors.FileDescriptor simpleFileDescriptor;
private DescriptorProtos.FileDescriptorProto simpleFileDescriptorProto;
private DescriptorProtos.FileDescriptorSet simpleFileDescriptorSet;
private MilanoTypeMetadata.TypeMetadata simpleTypeMetadata;
private String simpleB64Bytes;
private DescriptorProtos.DescriptorProto completeDescriptorProto;
private Descriptors.FileDescriptor completeFileDescriptor;
private DescriptorProtos.FileDescriptorProto completeFileDescriptorProto;
private DescriptorProtos.FileDescriptorSet completeFileDescriptorSet;
private MilanoTypeMetadata.TypeMetadata completeTypeMetadata;
private String completeB64Bytes;
@Before
public void setUp() throws Exception
{
Descriptors.Descriptor simpleDescriptor = Testing.TestItem.getDescriptor();
simpleDescriptorProto = simpleDescriptor.toProto();
simpleFileDescriptor = Testing.getDescriptor();
simpleFileDescriptorProto = simpleFileDescriptor.toProto();
DescriptorProtos.FileDescriptorSet.Builder simpleBuilder = DescriptorProtos.FileDescriptorSet.newBuilder();
for (Descriptors.FileDescriptor fileDescriptor : simpleFileDescriptor.getDependencies()) {
simpleBuilder.addFile(fileDescriptor.toProto());
}
simpleFileDescriptorSet = simpleBuilder.build();
simpleTypeMetadata = MilanoTypeMetadata.TypeMetadata
.newBuilder()
.setTypeName(simpleDescriptor.getName())
.setTypePackageName(simpleDescriptor.getFile().getPackage())
.setTypeFileDescriptor(simpleDescriptor.getFile().toProto())
.build();
simpleB64Bytes = Base64.encodeBase64String(simpleTypeMetadata.toByteArray());
Descriptors.Descriptor completeDescriptor = TestingComplete.CompleteTestItem.getDescriptor();
completeDescriptorProto = completeDescriptor.toProto();
completeFileDescriptor = TestingComplete.getDescriptor();
completeFileDescriptorProto = completeFileDescriptor.toProto();
DescriptorProtos.FileDescriptorSet.Builder completeBuilder = DescriptorProtos.FileDescriptorSet.newBuilder();
for (Descriptors.FileDescriptor fileDescriptor : completeFileDescriptor.getDependencies()) {
completeBuilder.addFile(fileDescriptor.toProto());
}
completeFileDescriptorSet = completeBuilder.build();
completeTypeMetadata = MilanoTypeMetadata.TypeMetadata
.newBuilder()
.setTypeName(completeDescriptor.getName())
.setTypePackageName(completeDescriptor.getFile().getPackage())
.setTypeFileDescriptor(completeDescriptor.getFile().toProto())
.build();
completeB64Bytes = Base64.encodeBase64String(completeTypeMetadata.toByteArray());
}
@Test
public void testSimpleTypeMetadataTranslation() throws Exception
{
log.debug("Testing TypeMetadata --> Simple");
MilanoTool milanoTool = MilanoTool.with(simpleTypeMetadata);
MilanoTypeMetadata.TypeMetadata metadata = milanoTool.getMetadata();
DescriptorProtos.DescriptorProto descriptorProto = milanoTool.getDescriptorProto();
Descriptors.Descriptor descriptor = milanoTool.getDescriptor();
String bytes = milanoTool.getBase64();
Assert.assertEquals(simpleDescriptorProto, descriptorProto);
Assert.assertEquals(simpleTypeMetadata, metadata);
Assert.assertEquals(simpleB64Bytes, bytes);
}
@Test
public void testSimpleB64Translation() throws Exception
{
log.debug("Testing B64 --> Simple");
MilanoTool milanoTool = MilanoTool.withBase64(simpleB64Bytes);
MilanoTypeMetadata.TypeMetadata metadata = milanoTool.getMetadata();
DescriptorProtos.DescriptorProto descriptorProto = milanoTool.getDescriptorProto();
Descriptors.Descriptor descriptor = milanoTool.getDescriptor();
String bytes = milanoTool.getBase64();
Assert.assertEquals(simpleTypeMetadata, metadata);
Assert.assertEquals(simpleDescriptorProto, descriptorProto);
Assert.assertEquals(simpleB64Bytes, bytes);
}
@Test
public void testSimpleDescriptorProtoTranslation() throws Exception
{
log.debug("Testing DescriptorProto --> Simple");
MilanoTool milanoTool = MilanoTool.with(
simpleDescriptorProto,
simpleFileDescriptorProto,
simpleFileDescriptorSet
);
MilanoTypeMetadata.TypeMetadata metadata = milanoTool.getMetadata();
DescriptorProtos.DescriptorProto descriptorProto = milanoTool.getDescriptorProto();
String bytes = milanoTool.getBase64();
Assert.assertEquals(simpleDescriptorProto, descriptorProto);
Assert.assertEquals(simpleTypeMetadata, metadata);
Assert.assertEquals(simpleB64Bytes, bytes);
}
@Test
public void testSimpleFileDescriptorTranslation() throws Exception
{
log.debug("Testing FileDescriptor --> Simple");
MilanoTool milanoTool = MilanoTool.with(
simpleDescriptorProto.getName(),
simpleFileDescriptor
);
MilanoTypeMetadata.TypeMetadata metadata = milanoTool.getMetadata();
DescriptorProtos.DescriptorProto descriptorProto = milanoTool.getDescriptorProto();
String bytes = milanoTool.getBase64();
Assert.assertEquals(simpleDescriptorProto, descriptorProto);
Assert.assertEquals(simpleTypeMetadata, metadata);
Assert.assertEquals(simpleB64Bytes, bytes);
}
@Test
public void testCompleteTypeMetadataTranslation() throws Exception
{
log.debug("Testing TypeMetadata --> Complete");
MilanoTool milanoTool = MilanoTool.with(completeTypeMetadata);
MilanoTypeMetadata.TypeMetadata metadata = milanoTool.getMetadata();
DescriptorProtos.DescriptorProto descriptorProto = milanoTool.getDescriptorProto();
String bytes = milanoTool.getBase64();
Assert.assertEquals(completeDescriptorProto, descriptorProto);
Assert.assertEquals(completeTypeMetadata, metadata);
Assert.assertEquals(completeB64Bytes, bytes);
}
@Ignore("Doesn't work due to option bug.")
@Test
public void testCompleteB64Translation() throws Exception
{
log.debug("Testing B64 --> Complete");
MilanoTool milanoTool = MilanoTool.withBase64(completeB64Bytes);
MilanoTypeMetadata.TypeMetadata metadata = milanoTool.getMetadata();
DescriptorProtos.DescriptorProto descriptorProto = milanoTool.getDescriptorProto();
String bytes = milanoTool.getBase64();
Assert.assertEquals(completeTypeMetadata, metadata);
Assert.assertEquals(completeDescriptorProto, descriptorProto);
Assert.assertEquals(completeB64Bytes, bytes);
}
@Test
public void testCompleteDescriptorProtoTranslation() throws Exception
{
log.debug("Testing DescriptorProto --> Complete");
MilanoTool milanoTool = MilanoTool.with(
completeDescriptorProto,
completeFileDescriptorProto,
completeFileDescriptorSet
);
MilanoTypeMetadata.TypeMetadata metadata = milanoTool.getMetadata();
DescriptorProtos.DescriptorProto descriptorProto = milanoTool.getDescriptorProto();
String bytes = milanoTool.getBase64();
Assert.assertEquals(completeDescriptorProto, descriptorProto);
Assert.assertEquals(completeTypeMetadata, metadata);
Assert.assertEquals(completeB64Bytes, bytes);
}
@Test
public void testCompleteFileDescriptorTranslation() throws Exception
{
log.debug("Testing FileDescriptor --> Complete");
MilanoTool milanoTool = MilanoTool.with(
completeDescriptorProto.getName(),
completeFileDescriptor
);
MilanoTypeMetadata.TypeMetadata metadata = milanoTool.getMetadata();
DescriptorProtos.DescriptorProto descriptorProto = milanoTool.getDescriptorProto();
String bytes = milanoTool.getBase64();
Assert.assertEquals(completeDescriptorProto, descriptorProto);
Assert.assertEquals(completeTypeMetadata, metadata);
Assert.assertEquals(completeB64Bytes, bytes);
}
// @Ignore("Complex, incomplete test")
@Test
public void testDynamicDescriptorProto() throws Exception
{
DescriptorProtos.DescriptorProto.Builder builder = DescriptorProtos.DescriptorProto.newBuilder();
builder.addFieldBuilder()
.setName("test")
.setNumber(1)
.setType(DescriptorProtos.FieldDescriptorProto.Type.TYPE_STRING)
.build();
builder.setName("descriptor");
DescriptorProtos.DescriptorProto descriptorProto = builder.build();
DescriptorProtos.FileDescriptorProto fileDescriptorProto = DescriptorProtos.FileDescriptorProto
.newBuilder()
.addMessageType(descriptorProto)
.setName("milano_dynamic_type.proto")
.setPackage("metamx.milano.dynamic")
.build();
MilanoTool milanoTool = MilanoTool.with(
descriptorProto,
fileDescriptorProto,
DescriptorProtos.FileDescriptorSet.getDefaultInstance()
);
MilanoTypeMetadata.TypeMetadata descriptorProtoMetadata = milanoTool.getMetadata();
String descriptorProtoBase64 = milanoTool.getBase64();
DynamicMessage originalMessage = milanoTool.newBuilder()
.setField(milanoTool.getDescriptor().findFieldByName("test"), "foo!")
.build();
ByteString byteString = originalMessage.toByteString();
MilanoTool b64MilanoTool = MilanoTool.withBase64(descriptorProtoBase64);
MilanoTypeMetadata.TypeMetadata b64Metadata = b64MilanoTool.getMetadata();
DescriptorProtos.DescriptorProto b64DescriptorProto = b64MilanoTool.getDescriptorProto();
String b64Base64 = b64MilanoTool.getBase64();
DynamicMessage dynamicMessage = b64MilanoTool.parseFrom(byteString);
Assert.assertEquals("foo!", dynamicMessage.getField(b64MilanoTool.getDescriptor().findFieldByName("test")));
Assert.assertEquals(originalMessage.toString(), dynamicMessage.toString());
Assert.assertEquals(descriptorProto, b64DescriptorProto);
Assert.assertEquals(descriptorProtoMetadata, b64Metadata);
Assert.assertEquals(descriptorProtoBase64, b64Base64);
}
}