1
// Protocol Buffers - Google's data interchange format
2
// Copyright 2008 Google Inc.
3
// http://code.google.com/p/protobuf/
5
// Licensed under the Apache License, Version 2.0 (the "License");
6
// you may not use this file except in compliance with the License.
7
// You may obtain a copy of the License at
9
// http://www.apache.org/licenses/LICENSE-2.0
11
// Unless required by applicable law or agreed to in writing, software
12
// distributed under the License is distributed on an "AS IS" BASIS,
13
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
// See the License for the specific language governing permissions and
15
// limitations under the License.
17
package com.google.protobuf;
19
import junit.framework.TestCase;
20
import protobuf_unittest.UnittestProto;
21
import protobuf_unittest.UnittestProto.TestAllTypes;
22
import protobuf_unittest.UnittestProto.TestAllExtensions;
23
import protobuf_unittest.UnittestProto.TestFieldOrderings;
24
import protobuf_unittest.UnittestMset.TestMessageSet;
25
import protobuf_unittest.UnittestMset.RawMessageSet;
26
import protobuf_unittest.UnittestMset.TestMessageSetExtension1;
27
import protobuf_unittest.UnittestMset.TestMessageSetExtension2;
30
* Tests related to parsing and serialization.
32
* @author kenton@google.com (Kenton Varda)
34
public class WireFormatTest extends TestCase {
35
public void testSerialization() throws Exception {
36
TestAllTypes message = TestUtil.getAllSet();
38
ByteString rawBytes = message.toByteString();
39
assertEquals(rawBytes.size(), message.getSerializedSize());
41
TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);
43
TestUtil.assertAllFieldsSet(message2);
46
public void testSerializeExtensions() throws Exception {
47
// TestAllTypes and TestAllExtensions should have compatible wire formats,
48
// so if we serealize a TestAllExtensions then parse it as TestAllTypes
51
TestAllExtensions message = TestUtil.getAllExtensionsSet();
52
ByteString rawBytes = message.toByteString();
53
assertEquals(rawBytes.size(), message.getSerializedSize());
55
TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);
57
TestUtil.assertAllFieldsSet(message2);
60
public void testParseExtensions() throws Exception {
61
// TestAllTypes and TestAllExtensions should have compatible wire formats,
62
// so if we serealize a TestAllTypes then parse it as TestAllExtensions
65
TestAllTypes message = TestUtil.getAllSet();
66
ByteString rawBytes = message.toByteString();
68
ExtensionRegistry registry = ExtensionRegistry.newInstance();
69
TestUtil.registerAllExtensions(registry);
70
registry = registry.getUnmodifiable();
72
TestAllExtensions message2 =
73
TestAllExtensions.parseFrom(rawBytes, registry);
75
TestUtil.assertAllExtensionsSet(message2);
78
public void testExtensionsSerializedSize() throws Exception {
79
assertEquals(TestUtil.getAllSet().getSerializedSize(),
80
TestUtil.getAllExtensionsSet().getSerializedSize());
83
private void assertFieldsInOrder(ByteString data) throws Exception {
84
CodedInputStream input = data.newCodedInput();
88
int tag = input.readTag();
93
assertTrue(tag > previousTag);
98
public void testInterleavedFieldsAndExtensions() throws Exception {
99
// Tests that fields are written in order even when extension ranges
100
// are interleaved with field numbers.
102
TestFieldOrderings.newBuilder()
106
.setExtension(UnittestProto.myExtensionInt, 23)
107
.setExtension(UnittestProto.myExtensionString, "bar")
108
.build().toByteString();
109
assertFieldsInOrder(data);
111
Descriptors.Descriptor descriptor = TestFieldOrderings.getDescriptor();
112
ByteString dynamic_data =
113
DynamicMessage.newBuilder(TestFieldOrderings.getDescriptor())
114
.setField(descriptor.findFieldByName("my_int"), 1L)
115
.setField(descriptor.findFieldByName("my_string"), "foo")
116
.setField(descriptor.findFieldByName("my_float"), 1.0F)
117
.setField(UnittestProto.myExtensionInt.getDescriptor(), 23)
118
.setField(UnittestProto.myExtensionString.getDescriptor(), "bar")
119
.build().toByteString();
120
assertFieldsInOrder(dynamic_data);
123
private static final int UNKNOWN_TYPE_ID = 1550055;
124
private static final int TYPE_ID_1 =
125
TestMessageSetExtension1.getDescriptor().getExtensions().get(0).getNumber();
126
private static final int TYPE_ID_2 =
127
TestMessageSetExtension2.getDescriptor().getExtensions().get(0).getNumber();
129
public void testSerializeMessageSet() throws Exception {
130
// Set up a TestMessageSet with two known messages and an unknown one.
131
TestMessageSet messageSet =
132
TestMessageSet.newBuilder()
134
TestMessageSetExtension1.messageSetExtension,
135
TestMessageSetExtension1.newBuilder().setI(123).build())
137
TestMessageSetExtension2.messageSetExtension,
138
TestMessageSetExtension2.newBuilder().setStr("foo").build())
140
UnknownFieldSet.newBuilder()
141
.addField(UNKNOWN_TYPE_ID,
142
UnknownFieldSet.Field.newBuilder()
143
.addLengthDelimited(ByteString.copyFromUtf8("bar"))
148
ByteString data = messageSet.toByteString();
150
// Parse back using RawMessageSet and check the contents.
151
RawMessageSet raw = RawMessageSet.parseFrom(data);
153
assertTrue(raw.getUnknownFields().asMap().isEmpty());
155
assertEquals(3, raw.getItemCount());
156
assertEquals(TYPE_ID_1, raw.getItem(0).getTypeId());
157
assertEquals(TYPE_ID_2, raw.getItem(1).getTypeId());
158
assertEquals(UNKNOWN_TYPE_ID, raw.getItem(2).getTypeId());
160
TestMessageSetExtension1 message1 =
161
TestMessageSetExtension1.parseFrom(
162
raw.getItem(0).getMessage().toByteArray());
163
assertEquals(123, message1.getI());
165
TestMessageSetExtension2 message2 =
166
TestMessageSetExtension2.parseFrom(
167
raw.getItem(1).getMessage().toByteArray());
168
assertEquals("foo", message2.getStr());
170
assertEquals("bar", raw.getItem(2).getMessage().toStringUtf8());
173
public void testParseMessageSet() throws Exception {
174
ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance();
175
extensionRegistry.add(TestMessageSetExtension1.messageSetExtension);
176
extensionRegistry.add(TestMessageSetExtension2.messageSetExtension);
178
// Set up a RawMessageSet with two known messages and an unknown one.
180
RawMessageSet.newBuilder()
182
RawMessageSet.Item.newBuilder()
183
.setTypeId(TYPE_ID_1)
185
TestMessageSetExtension1.newBuilder()
187
.build().toByteString())
190
RawMessageSet.Item.newBuilder()
191
.setTypeId(TYPE_ID_2)
193
TestMessageSetExtension2.newBuilder()
195
.build().toByteString())
198
RawMessageSet.Item.newBuilder()
199
.setTypeId(UNKNOWN_TYPE_ID)
200
.setMessage(ByteString.copyFromUtf8("bar"))
204
ByteString data = raw.toByteString();
206
// Parse as a TestMessageSet and check the contents.
207
TestMessageSet messageSet =
208
TestMessageSet.parseFrom(data, extensionRegistry);
210
assertEquals(123, messageSet.getExtension(
211
TestMessageSetExtension1.messageSetExtension).getI());
212
assertEquals("foo", messageSet.getExtension(
213
TestMessageSetExtension2.messageSetExtension).getStr());
215
// Check for unknown field with type LENGTH_DELIMITED,
216
// number UNKNOWN_TYPE_ID, and contents "bar".
217
UnknownFieldSet unknownFields = messageSet.getUnknownFields();
218
assertEquals(1, unknownFields.asMap().size());
219
assertTrue(unknownFields.hasField(UNKNOWN_TYPE_ID));
221
UnknownFieldSet.Field field = unknownFields.getField(UNKNOWN_TYPE_ID);
222
assertEquals(1, field.getLengthDelimitedList().size());
223
assertEquals("bar", field.getLengthDelimitedList().get(0).toStringUtf8());