• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 protobuf_unittest.LazyFieldsLite.LazyExtension;
34 import protobuf_unittest.LazyFieldsLite.LazyInnerMessageLite;
35 import protobuf_unittest.LazyFieldsLite.LazyMessageLite;
36 import protobuf_unittest.LazyFieldsLite.LazyNestedInnerMessageLite;
37 import java.util.ArrayList;
38 import junit.framework.TestCase;
39 
40 /**
41  * Unit test for messages with lazy fields.
42  *
43  * @author niwasaki@google.com (Naoki Iwasaki)
44  */
45 public class LazyMessageLiteTest extends TestCase {
46 
47   @Override
setUp()48   protected void setUp() throws Exception {
49     super.setUp();
50   }
51 
52   @Override
tearDown()53   protected void tearDown() throws Exception {
54     super.tearDown();
55   }
56 
testSetValues()57   public void testSetValues() {
58     LazyNestedInnerMessageLite nested = LazyNestedInnerMessageLite.newBuilder().setNum(3).build();
59     LazyInnerMessageLite inner =
60         LazyInnerMessageLite.newBuilder().setNum(2).setNested(nested).build();
61     LazyMessageLite outer =
62         LazyMessageLite.newBuilder()
63             .setNum(1)
64             .setInner(inner)
65             .setOneofNum(123)
66             .setOneofInner(inner)
67             .build();
68 
69     assertEquals(1, outer.getNum());
70     assertEquals(421, outer.getNumWithDefault());
71 
72     assertEquals(2, outer.getInner().getNum());
73     assertEquals(42, outer.getInner().getNumWithDefault());
74 
75     assertEquals(3, outer.getInner().getNested().getNum());
76     assertEquals(4, outer.getInner().getNested().getNumWithDefault());
77 
78     assertFalse(outer.hasOneofNum());
79     assertTrue(outer.hasOneofInner());
80 
81     assertEquals(2, outer.getOneofInner().getNum());
82     assertEquals(42, outer.getOneofInner().getNumWithDefault());
83     assertEquals(3, outer.getOneofInner().getNested().getNum());
84     assertEquals(4, outer.getOneofInner().getNested().getNumWithDefault());
85   }
86 
testSetRepeatedValues()87   public void testSetRepeatedValues() {
88     LazyMessageLite outer =
89         LazyMessageLite.newBuilder()
90             .setNum(1)
91             .addRepeatedInner(LazyInnerMessageLite.newBuilder().setNum(119))
92             .addRepeatedInner(LazyInnerMessageLite.newBuilder().setNum(122))
93             .build();
94 
95     assertEquals(1, outer.getNum());
96     assertEquals(2, outer.getRepeatedInnerCount());
97     assertEquals(119, outer.getRepeatedInner(0).getNum());
98     assertEquals(122, outer.getRepeatedInner(1).getNum());
99   }
100 
testRepeatedMutability()101   public void testRepeatedMutability() throws Exception {
102     LazyMessageLite outer =
103         LazyMessageLite.newBuilder()
104             .addRepeatedInner(LazyInnerMessageLite.newBuilder().setNum(119))
105             .addRepeatedInner(LazyInnerMessageLite.newBuilder().setNum(122))
106             .build();
107 
108     outer = LazyMessageLite.parseFrom(outer.toByteArray());
109     try {
110       outer.getRepeatedInnerList().set(1, null);
111       fail();
112     } catch (UnsupportedOperationException expected) {
113     }
114   }
115 
testAddAll()116   public void testAddAll() {
117     ArrayList<LazyInnerMessageLite> inners = new ArrayList<>();
118     int count = 4;
119     for (int i = 0; i < count; i++) {
120       LazyInnerMessageLite inner = LazyInnerMessageLite.newBuilder().setNum(i).build();
121       inners.add(inner);
122     }
123 
124     LazyMessageLite outer = LazyMessageLite.newBuilder().addAllRepeatedInner(inners).build();
125     assertEquals(count, outer.getRepeatedInnerCount());
126     for (int i = 0; i < count; i++) {
127       assertEquals(i, outer.getRepeatedInner(i).getNum());
128     }
129   }
130 
testGetDefaultValues()131   public void testGetDefaultValues() {
132     LazyMessageLite outer = LazyMessageLite.getDefaultInstance();
133 
134     assertEquals(0, outer.getNum());
135     assertEquals(421, outer.getNumWithDefault());
136 
137     assertEquals(0, outer.getInner().getNum());
138     assertEquals(42, outer.getInner().getNumWithDefault());
139 
140     assertEquals(0, outer.getInner().getNested().getNum());
141     assertEquals(4, outer.getInner().getNested().getNumWithDefault());
142 
143     assertEquals(0, outer.getOneofNum());
144 
145     assertEquals(0, outer.getOneofInner().getNum());
146     assertEquals(42, outer.getOneofInner().getNumWithDefault());
147     assertEquals(0, outer.getOneofInner().getNested().getNum());
148     assertEquals(4, outer.getOneofInner().getNested().getNumWithDefault());
149   }
150 
testClearValues()151   public void testClearValues() {
152     LazyInnerMessageLite inner = LazyInnerMessageLite.newBuilder().setNum(115).build();
153 
154     LazyMessageLite.Builder outerBuilder = LazyMessageLite.newBuilder();
155 
156     assertEquals(0, outerBuilder.build().getNum());
157 
158     // Set/Clear num
159     outerBuilder.setNum(100);
160 
161     assertEquals(100, outerBuilder.build().getNum());
162     assertEquals(421, outerBuilder.build().getNumWithDefault());
163     assertFalse(outerBuilder.build().hasInner());
164 
165     outerBuilder.clearNum();
166 
167     assertEquals(0, outerBuilder.build().getNum());
168     assertEquals(421, outerBuilder.build().getNumWithDefault());
169     assertFalse(outerBuilder.build().hasInner());
170 
171     // Set/Clear all
172     outerBuilder
173         .setNum(100)
174         .setInner(inner)
175         .addRepeatedInner(LazyInnerMessageLite.newBuilder().setNum(119))
176         .addRepeatedInner(LazyInnerMessageLite.newBuilder().setNum(122))
177         .setOneofInner(LazyInnerMessageLite.newBuilder().setNum(123));
178 
179     LazyMessageLite outer = outerBuilder.build();
180     assertEquals(100, outer.getNum());
181     assertEquals(421, outer.getNumWithDefault());
182     assertTrue(outer.hasInner());
183     assertEquals(115, outer.getInner().getNum());
184     assertEquals(2, outer.getRepeatedInnerCount());
185     assertEquals(119, outer.getRepeatedInner(0).getNum());
186     assertEquals(122, outer.getRepeatedInner(1).getNum());
187     assertTrue(outer.hasOneofInner());
188     assertEquals(123, outer.getOneofInner().getNum());
189 
190     outerBuilder.clear();
191 
192     outer = outerBuilder.build();
193 
194     assertEquals(0, outer.getNum());
195     assertEquals(421, outer.getNumWithDefault());
196     assertFalse(outer.hasInner());
197     assertEquals(0, outer.getRepeatedInnerCount());
198     assertFalse(outer.hasOneofInner());
199     assertEquals(0, outer.getOneofInner().getNum());
200   }
201 
testMergeValues()202   public void testMergeValues() {
203     LazyMessageLite outerBase = LazyMessageLite.newBuilder().setNumWithDefault(122).build();
204 
205     LazyInnerMessageLite innerMerging = LazyInnerMessageLite.newBuilder().setNum(115).build();
206     LazyMessageLite outerMerging =
207         LazyMessageLite.newBuilder()
208             .setNum(119)
209             .setInner(innerMerging)
210             .setOneofInner(innerMerging)
211             .build();
212 
213     LazyMessageLite merged = LazyMessageLite.newBuilder(outerBase).mergeFrom(outerMerging).build();
214     assertEquals(119, merged.getNum());
215     assertEquals(122, merged.getNumWithDefault());
216     assertEquals(115, merged.getInner().getNum());
217     assertEquals(42, merged.getInner().getNumWithDefault());
218     assertEquals(115, merged.getOneofInner().getNum());
219     assertEquals(42, merged.getOneofInner().getNumWithDefault());
220   }
221 
testMergeDefaultValues()222   public void testMergeDefaultValues() {
223     LazyInnerMessageLite innerBase = LazyInnerMessageLite.newBuilder().setNum(115).build();
224     LazyMessageLite outerBase =
225         LazyMessageLite.newBuilder()
226             .setNum(119)
227             .setNumWithDefault(122)
228             .setInner(innerBase)
229             .setOneofInner(innerBase)
230             .build();
231 
232     LazyMessageLite outerMerging = LazyMessageLite.getDefaultInstance();
233 
234     LazyMessageLite merged = LazyMessageLite.newBuilder(outerBase).mergeFrom(outerMerging).build();
235     // Merging default-instance shouldn't overwrite values in the base message.
236     assertEquals(119, merged.getNum());
237     assertEquals(122, merged.getNumWithDefault());
238     assertEquals(115, merged.getInner().getNum());
239     assertEquals(42, merged.getInner().getNumWithDefault());
240     assertEquals(115, merged.getOneofInner().getNum());
241     assertEquals(42, merged.getOneofInner().getNumWithDefault());
242   }
243 
244   // Regression test for b/28198805.
testMergeOneofMessages()245   public void testMergeOneofMessages() throws Exception {
246     LazyInnerMessageLite inner = LazyInnerMessageLite.getDefaultInstance();
247     LazyMessageLite outer = LazyMessageLite.newBuilder().setOneofInner(inner).build();
248     ByteString data1 = outer.toByteString();
249 
250     // The following should not alter the content of the 'outer' message.
251     LazyMessageLite.Builder merged = LazyMessageLite.newBuilder().mergeFrom(outer);
252     LazyInnerMessageLite anotherInner = LazyInnerMessageLite.newBuilder().setNum(12345).build();
253     merged.setOneofInner(anotherInner);
254 
255     // Check that the 'outer' stays the same.
256     ByteString data2 = outer.toByteString();
257     assertEquals(data1, data2);
258     assertEquals(0, outer.getOneofInner().getNum());
259   }
260 
testSerialize()261   public void testSerialize() throws InvalidProtocolBufferException {
262     LazyNestedInnerMessageLite nested = LazyNestedInnerMessageLite.newBuilder().setNum(3).build();
263     LazyInnerMessageLite inner =
264         LazyInnerMessageLite.newBuilder().setNum(2).setNested(nested).build();
265     LazyMessageLite outer =
266         LazyMessageLite.newBuilder().setNum(1).setInner(inner).setOneofInner(inner).build();
267 
268     ByteString bytes = outer.toByteString();
269     assertEquals(bytes.size(), outer.getSerializedSize());
270 
271     LazyMessageLite deserialized = LazyMessageLite.parseFrom(bytes);
272 
273     assertEquals(1, deserialized.getNum());
274     assertEquals(421, deserialized.getNumWithDefault());
275 
276     assertEquals(2, deserialized.getInner().getNum());
277     assertEquals(42, deserialized.getInner().getNumWithDefault());
278 
279     assertEquals(3, deserialized.getInner().getNested().getNum());
280     assertEquals(4, deserialized.getInner().getNested().getNumWithDefault());
281 
282     assertEquals(2, deserialized.getOneofInner().getNum());
283     assertEquals(42, deserialized.getOneofInner().getNumWithDefault());
284     assertEquals(3, deserialized.getOneofInner().getNested().getNum());
285     assertEquals(4, deserialized.getOneofInner().getNested().getNumWithDefault());
286 
287     assertEquals(bytes, deserialized.toByteString());
288   }
289 
testExtensions()290   public void testExtensions() throws Exception {
291     LazyInnerMessageLite.Builder innerBuilder = LazyInnerMessageLite.newBuilder();
292     innerBuilder.setExtension(
293         LazyExtension.extension, LazyExtension.newBuilder().setName("name").build());
294     assertTrue(innerBuilder.hasExtension(LazyExtension.extension));
295     assertEquals("name", innerBuilder.getExtension(LazyExtension.extension).getName());
296 
297     LazyInnerMessageLite innerMessage = innerBuilder.build();
298     assertTrue(innerMessage.hasExtension(LazyExtension.extension));
299     assertEquals("name", innerMessage.getExtension(LazyExtension.extension).getName());
300 
301     LazyMessageLite lite = LazyMessageLite.newBuilder().setInner(innerMessage).build();
302     assertTrue(lite.getInner().hasExtension(LazyExtension.extension));
303     assertEquals("name", lite.getInner().getExtension(LazyExtension.extension).getName());
304   }
305 }
306