1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // https://developers.google.com/protocol-buffers/ 4 // 5 // Redistribution and use in source and binary forms, with or without 6 // modification, are permitted provided that the following conditions are 7 // met: 8 // 9 // * Redistributions of source code must retain the above copyright 10 // notice, this list of conditions and the following disclaimer. 11 // * Redistributions in binary form must reproduce the above 12 // copyright notice, this list of conditions and the following disclaimer 13 // in the documentation and/or other materials provided with the 14 // distribution. 15 // * Neither the name of Google Inc. nor the names of its 16 // contributors may be used to endorse or promote products derived from 17 // this software without specific prior written permission. 18 // 19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31 package com.google.protobuf; 32 33 import static org.junit.Assert.assertEquals; 34 35 import com.google.protobuf.testing.Proto2Testing.Proto2Message; 36 import com.google.protobuf.testing.Proto3Testing.Proto3Message; 37 import java.io.IOException; 38 import org.junit.Before; 39 import org.junit.Test; 40 import org.junit.runner.RunWith; 41 import org.junit.runners.JUnit4; 42 43 @RunWith(JUnit4.class) 44 public final class CodedAdapterTest { 45 @Before setup()46 public void setup() { 47 TestSchemas.registerGenericProto2Schemas(); 48 49 Protobuf.getInstance() 50 .registerSchemaOverride(Proto3Message.class, TestSchemas.genericProto3Schema); 51 } 52 53 @Test proto3Roundtrip()54 public void proto3Roundtrip() throws Exception { 55 Proto3Message expected = new Proto3MessageFactory(5, 10, 2, 2).newMessage(); 56 byte[] expectedBytes = expected.toByteArray(); 57 58 // Deserialize with BinaryReader and verify that the message matches the original. 59 Proto3Message result = fromByteArray(expectedBytes, Proto3Message.class); 60 assertEquals(expected, result); 61 62 // Now write it back out using BinaryWriter and verify the output length. 63 byte[] actualBytes = toByteArray(result, expectedBytes.length); 64 65 // Read back in the bytes and verify that it matches the original message. 66 Proto3Message actual = Proto3Message.parseFrom(actualBytes); 67 assertEquals(expected, actual); 68 } 69 70 @Test proto2Roundtrip()71 public void proto2Roundtrip() throws Exception { 72 Proto2Message expected = new Proto2MessageFactory(5, 10, 2, 2).newMessage(); 73 byte[] expectedBytes = expected.toByteArray(); 74 75 // Deserialize with BinaryReader and verify that the message matches the original. 76 Proto2Message result = fromByteArray(expectedBytes, Proto2Message.class); 77 assertEquals(expected, result); 78 79 // Now write it back out using BinaryWriter and verify the output length. 80 byte[] actualBytes = toByteArray(result, expectedBytes.length); 81 82 // Read back in the bytes and verify that it matches the original message. 83 Proto2Message actual = Proto2Message.parseFrom(actualBytes); 84 assertEquals(expected, actual); 85 } 86 toByteArray(T msg, int size)87 public static <T> byte[] toByteArray(T msg, int size) throws Exception { 88 Schema<T> schema = Protobuf.getInstance().schemaFor(msg); 89 byte[] out = new byte[size]; 90 CodedOutputStreamWriter writer = 91 CodedOutputStreamWriter.forCodedOutput(CodedOutputStream.newInstance(out)); 92 schema.writeTo(msg, writer); 93 assertEquals(out.length, writer.getTotalBytesWritten()); 94 return out; 95 } 96 fromByteArray(byte[] data, Class<T> messageType)97 public static <T> T fromByteArray(byte[] data, Class<T> messageType) { 98 Schema<T> schema = Protobuf.getInstance().schemaFor(messageType); 99 try { 100 T msg = schema.newInstance(); 101 schema.mergeFrom( 102 msg, 103 CodedInputStreamReader.forCodedInput(CodedInputStream.newInstance(data)), 104 ExtensionRegistryLite.EMPTY_REGISTRY_LITE); 105 return msg; 106 } catch (IOException e) { 107 throw new RuntimeException(e); 108 } 109 } 110 } 111