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