1*1b3f573fSAndroid Build Coastguard Worker// Protocol Buffers - Google's data interchange format 2*1b3f573fSAndroid Build Coastguard Worker// Copyright 2013 Google Inc. All rights reserved. 3*1b3f573fSAndroid Build Coastguard Worker// https://developers.google.com/protocol-buffers/ 4*1b3f573fSAndroid Build Coastguard Worker// 5*1b3f573fSAndroid Build Coastguard Worker// Redistribution and use in source and binary forms, with or without 6*1b3f573fSAndroid Build Coastguard Worker// modification, are permitted provided that the following conditions are 7*1b3f573fSAndroid Build Coastguard Worker// met: 8*1b3f573fSAndroid Build Coastguard Worker// 9*1b3f573fSAndroid Build Coastguard Worker// * Redistributions of source code must retain the above copyright 10*1b3f573fSAndroid Build Coastguard Worker// notice, this list of conditions and the following disclaimer. 11*1b3f573fSAndroid Build Coastguard Worker// * Redistributions in binary form must reproduce the above 12*1b3f573fSAndroid Build Coastguard Worker// copyright notice, this list of conditions and the following disclaimer 13*1b3f573fSAndroid Build Coastguard Worker// in the documentation and/or other materials provided with the 14*1b3f573fSAndroid Build Coastguard Worker// distribution. 15*1b3f573fSAndroid Build Coastguard Worker// * Neither the name of Google Inc. nor the names of its 16*1b3f573fSAndroid Build Coastguard Worker// contributors may be used to endorse or promote products derived from 17*1b3f573fSAndroid Build Coastguard Worker// this software without specific prior written permission. 18*1b3f573fSAndroid Build Coastguard Worker// 19*1b3f573fSAndroid Build Coastguard Worker// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20*1b3f573fSAndroid Build Coastguard Worker// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22*1b3f573fSAndroid Build Coastguard Worker// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23*1b3f573fSAndroid Build Coastguard Worker// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24*1b3f573fSAndroid Build Coastguard Worker// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26*1b3f573fSAndroid Build Coastguard Worker// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27*1b3f573fSAndroid Build Coastguard Worker// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28*1b3f573fSAndroid Build Coastguard Worker// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29*1b3f573fSAndroid Build Coastguard Worker// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30*1b3f573fSAndroid Build Coastguard Worker 31*1b3f573fSAndroid Build Coastguard Worker#import "GPBTestUtilities.h" 32*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/Unittest.pbobjc.h" 33*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestImport.pbobjc.h" 34*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestObjc.pbobjc.h" 35*1b3f573fSAndroid Build Coastguard Worker 36*1b3f573fSAndroid Build Coastguard Worker// 37*1b3f573fSAndroid Build Coastguard Worker// This file really just uses the unittests framework as a testbed to 38*1b3f573fSAndroid Build Coastguard Worker// run some simple performance tests. The data can then be used to help 39*1b3f573fSAndroid Build Coastguard Worker// evaluate changes to the runtime. 40*1b3f573fSAndroid Build Coastguard Worker// 41*1b3f573fSAndroid Build Coastguard Worker 42*1b3f573fSAndroid Build Coastguard Workerstatic const uint32_t kRepeatedCount = 100; 43*1b3f573fSAndroid Build Coastguard Worker 44*1b3f573fSAndroid Build Coastguard Worker@interface PerfTests : GPBTestCase 45*1b3f573fSAndroid Build Coastguard Worker@end 46*1b3f573fSAndroid Build Coastguard Worker 47*1b3f573fSAndroid Build Coastguard Worker@implementation PerfTests 48*1b3f573fSAndroid Build Coastguard Worker 49*1b3f573fSAndroid Build Coastguard Worker- (void)setUp { 50*1b3f573fSAndroid Build Coastguard Worker // A convenient place to put a break point if you want to connect instruments. 51*1b3f573fSAndroid Build Coastguard Worker [super setUp]; 52*1b3f573fSAndroid Build Coastguard Worker} 53*1b3f573fSAndroid Build Coastguard Worker 54*1b3f573fSAndroid Build Coastguard Worker- (void)testMessagePerformance { 55*1b3f573fSAndroid Build Coastguard Worker [self measureBlock:^{ 56*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 200; ++i) { 57*1b3f573fSAndroid Build Coastguard Worker TestAllTypes* message = [[TestAllTypes alloc] init]; 58*1b3f573fSAndroid Build Coastguard Worker [self setAllFields:message repeatedCount:kRepeatedCount]; 59*1b3f573fSAndroid Build Coastguard Worker NSData* rawBytes = [message data]; 60*1b3f573fSAndroid Build Coastguard Worker [message release]; 61*1b3f573fSAndroid Build Coastguard Worker message = [[TestAllTypes alloc] initWithData:rawBytes error:NULL]; 62*1b3f573fSAndroid Build Coastguard Worker [message release]; 63*1b3f573fSAndroid Build Coastguard Worker } 64*1b3f573fSAndroid Build Coastguard Worker }]; 65*1b3f573fSAndroid Build Coastguard Worker} 66*1b3f573fSAndroid Build Coastguard Worker 67*1b3f573fSAndroid Build Coastguard Worker- (void)testMessageSerialParsingPerformance { 68*1b3f573fSAndroid Build Coastguard Worker // This and the next test are meant to monitor that the parsing functionality of protos does not 69*1b3f573fSAndroid Build Coastguard Worker // lock across threads when parsing different instances. The Serial version of the test should run 70*1b3f573fSAndroid Build Coastguard Worker // around ~2 times slower than the Parallel version since it's parsing the protos in the same 71*1b3f573fSAndroid Build Coastguard Worker // thread. 72*1b3f573fSAndroid Build Coastguard Worker TestAllTypes *allTypesMessage = [TestAllTypes message]; 73*1b3f573fSAndroid Build Coastguard Worker [self setAllFields:allTypesMessage repeatedCount:2]; 74*1b3f573fSAndroid Build Coastguard Worker NSData *allTypesData = allTypesMessage.data; 75*1b3f573fSAndroid Build Coastguard Worker 76*1b3f573fSAndroid Build Coastguard Worker [self measureBlock:^{ 77*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 500; ++i) { 78*1b3f573fSAndroid Build Coastguard Worker [TestAllTypes parseFromData:allTypesData error:NULL]; 79*1b3f573fSAndroid Build Coastguard Worker [TestAllTypes parseFromData:allTypesData error:NULL]; 80*1b3f573fSAndroid Build Coastguard Worker } 81*1b3f573fSAndroid Build Coastguard Worker }]; 82*1b3f573fSAndroid Build Coastguard Worker} 83*1b3f573fSAndroid Build Coastguard Worker 84*1b3f573fSAndroid Build Coastguard Worker- (void)testMessageParallelParsingPerformance { 85*1b3f573fSAndroid Build Coastguard Worker // This and the previous test are meant to monitor that the parsing functionality of protos does 86*1b3f573fSAndroid Build Coastguard Worker // not lock across threads when parsing different instances. The Serial version of the test should 87*1b3f573fSAndroid Build Coastguard Worker // run around ~2 times slower than the Parallel version since it's parsing the protos in the same 88*1b3f573fSAndroid Build Coastguard Worker // thread. 89*1b3f573fSAndroid Build Coastguard Worker TestAllTypes *allTypesMessage = [TestAllTypes message]; 90*1b3f573fSAndroid Build Coastguard Worker [self setAllFields:allTypesMessage repeatedCount:2]; 91*1b3f573fSAndroid Build Coastguard Worker NSData *allTypesData = allTypesMessage.data; 92*1b3f573fSAndroid Build Coastguard Worker 93*1b3f573fSAndroid Build Coastguard Worker dispatch_queue_t concurrentQueue = dispatch_queue_create("perfQueue", DISPATCH_QUEUE_CONCURRENT); 94*1b3f573fSAndroid Build Coastguard Worker 95*1b3f573fSAndroid Build Coastguard Worker [self measureBlock:^{ 96*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 500; ++i) { 97*1b3f573fSAndroid Build Coastguard Worker dispatch_group_t group = dispatch_group_create(); 98*1b3f573fSAndroid Build Coastguard Worker 99*1b3f573fSAndroid Build Coastguard Worker dispatch_group_async(group, concurrentQueue, ^{ 100*1b3f573fSAndroid Build Coastguard Worker [TestAllTypes parseFromData:allTypesData error:NULL]; 101*1b3f573fSAndroid Build Coastguard Worker }); 102*1b3f573fSAndroid Build Coastguard Worker 103*1b3f573fSAndroid Build Coastguard Worker dispatch_group_async(group, concurrentQueue, ^{ 104*1b3f573fSAndroid Build Coastguard Worker [TestAllTypes parseFromData:allTypesData error:NULL]; 105*1b3f573fSAndroid Build Coastguard Worker }); 106*1b3f573fSAndroid Build Coastguard Worker 107*1b3f573fSAndroid Build Coastguard Worker dispatch_group_notify(group, concurrentQueue, ^{}); 108*1b3f573fSAndroid Build Coastguard Worker 109*1b3f573fSAndroid Build Coastguard Worker dispatch_release(group); 110*1b3f573fSAndroid Build Coastguard Worker } 111*1b3f573fSAndroid Build Coastguard Worker }]; 112*1b3f573fSAndroid Build Coastguard Worker 113*1b3f573fSAndroid Build Coastguard Worker dispatch_release(concurrentQueue); 114*1b3f573fSAndroid Build Coastguard Worker} 115*1b3f573fSAndroid Build Coastguard Worker 116*1b3f573fSAndroid Build Coastguard Worker- (void)testMessageSerialExtensionsParsingPerformance { 117*1b3f573fSAndroid Build Coastguard Worker // This and the next test are meant to monitor that the parsing functionality of protos does not 118*1b3f573fSAndroid Build Coastguard Worker // lock across threads when parsing different instances when using extensions. The Serial version 119*1b3f573fSAndroid Build Coastguard Worker // of the test should run around ~2 times slower than the Parallel version since it's parsing the 120*1b3f573fSAndroid Build Coastguard Worker // protos in the same thread. 121*1b3f573fSAndroid Build Coastguard Worker TestAllExtensions *allExtensionsMessage = [TestAllExtensions message]; 122*1b3f573fSAndroid Build Coastguard Worker [self setAllExtensions:allExtensionsMessage repeatedCount:2]; 123*1b3f573fSAndroid Build Coastguard Worker NSData *allExtensionsData = allExtensionsMessage.data; 124*1b3f573fSAndroid Build Coastguard Worker 125*1b3f573fSAndroid Build Coastguard Worker [self measureBlock:^{ 126*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 500; ++i) { 127*1b3f573fSAndroid Build Coastguard Worker [TestAllExtensions parseFromData:allExtensionsData 128*1b3f573fSAndroid Build Coastguard Worker extensionRegistry:[self extensionRegistry] 129*1b3f573fSAndroid Build Coastguard Worker error:NULL]; 130*1b3f573fSAndroid Build Coastguard Worker [TestAllExtensions parseFromData:allExtensionsData 131*1b3f573fSAndroid Build Coastguard Worker extensionRegistry:[self extensionRegistry] 132*1b3f573fSAndroid Build Coastguard Worker error:NULL]; 133*1b3f573fSAndroid Build Coastguard Worker } 134*1b3f573fSAndroid Build Coastguard Worker }]; 135*1b3f573fSAndroid Build Coastguard Worker} 136*1b3f573fSAndroid Build Coastguard Worker 137*1b3f573fSAndroid Build Coastguard Worker- (void)testMessageParallelExtensionsParsingPerformance { 138*1b3f573fSAndroid Build Coastguard Worker // This and the previous test are meant to monitor that the parsing functionality of protos does 139*1b3f573fSAndroid Build Coastguard Worker // not lock across threads when parsing different instances when using extensions. The Serial 140*1b3f573fSAndroid Build Coastguard Worker // version of the test should run around ~2 times slower than the Parallel version since it's 141*1b3f573fSAndroid Build Coastguard Worker // parsing the protos in the same thread. 142*1b3f573fSAndroid Build Coastguard Worker TestAllExtensions *allExtensionsMessage = [TestAllExtensions message]; 143*1b3f573fSAndroid Build Coastguard Worker [self setAllExtensions:allExtensionsMessage repeatedCount:2]; 144*1b3f573fSAndroid Build Coastguard Worker NSData *allExtensionsData = allExtensionsMessage.data; 145*1b3f573fSAndroid Build Coastguard Worker 146*1b3f573fSAndroid Build Coastguard Worker dispatch_queue_t concurrentQueue = dispatch_queue_create("perfQueue", DISPATCH_QUEUE_CONCURRENT); 147*1b3f573fSAndroid Build Coastguard Worker 148*1b3f573fSAndroid Build Coastguard Worker [self measureBlock:^{ 149*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 500; ++i) { 150*1b3f573fSAndroid Build Coastguard Worker dispatch_group_t group = dispatch_group_create(); 151*1b3f573fSAndroid Build Coastguard Worker 152*1b3f573fSAndroid Build Coastguard Worker dispatch_group_async(group, concurrentQueue, ^{ 153*1b3f573fSAndroid Build Coastguard Worker [TestAllExtensions parseFromData:allExtensionsData 154*1b3f573fSAndroid Build Coastguard Worker extensionRegistry:[UnittestRoot extensionRegistry] 155*1b3f573fSAndroid Build Coastguard Worker error:NULL]; 156*1b3f573fSAndroid Build Coastguard Worker }); 157*1b3f573fSAndroid Build Coastguard Worker 158*1b3f573fSAndroid Build Coastguard Worker dispatch_group_async(group, concurrentQueue, ^{ 159*1b3f573fSAndroid Build Coastguard Worker [TestAllExtensions parseFromData:allExtensionsData 160*1b3f573fSAndroid Build Coastguard Worker extensionRegistry:[UnittestRoot extensionRegistry] 161*1b3f573fSAndroid Build Coastguard Worker error:NULL]; 162*1b3f573fSAndroid Build Coastguard Worker }); 163*1b3f573fSAndroid Build Coastguard Worker 164*1b3f573fSAndroid Build Coastguard Worker dispatch_group_notify(group, concurrentQueue, ^{}); 165*1b3f573fSAndroid Build Coastguard Worker 166*1b3f573fSAndroid Build Coastguard Worker dispatch_release(group); 167*1b3f573fSAndroid Build Coastguard Worker } 168*1b3f573fSAndroid Build Coastguard Worker }]; 169*1b3f573fSAndroid Build Coastguard Worker 170*1b3f573fSAndroid Build Coastguard Worker dispatch_release(concurrentQueue); 171*1b3f573fSAndroid Build Coastguard Worker} 172*1b3f573fSAndroid Build Coastguard Worker 173*1b3f573fSAndroid Build Coastguard Worker- (void)testExtensionsPerformance { 174*1b3f573fSAndroid Build Coastguard Worker [self measureBlock:^{ 175*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 200; ++i) { 176*1b3f573fSAndroid Build Coastguard Worker TestAllExtensions* message = [[TestAllExtensions alloc] init]; 177*1b3f573fSAndroid Build Coastguard Worker [self setAllExtensions:message repeatedCount:kRepeatedCount]; 178*1b3f573fSAndroid Build Coastguard Worker NSData* rawBytes = [message data]; 179*1b3f573fSAndroid Build Coastguard Worker [message release]; 180*1b3f573fSAndroid Build Coastguard Worker TestAllExtensions* message2 = 181*1b3f573fSAndroid Build Coastguard Worker [[TestAllExtensions alloc] initWithData:rawBytes error:NULL]; 182*1b3f573fSAndroid Build Coastguard Worker [message2 release]; 183*1b3f573fSAndroid Build Coastguard Worker } 184*1b3f573fSAndroid Build Coastguard Worker }]; 185*1b3f573fSAndroid Build Coastguard Worker} 186*1b3f573fSAndroid Build Coastguard Worker 187*1b3f573fSAndroid Build Coastguard Worker- (void)testPackedTypesPerformance { 188*1b3f573fSAndroid Build Coastguard Worker [self measureBlock:^{ 189*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 1000; ++i) { 190*1b3f573fSAndroid Build Coastguard Worker TestPackedTypes* message = [[TestPackedTypes alloc] init]; 191*1b3f573fSAndroid Build Coastguard Worker [self setPackedFields:message repeatedCount:kRepeatedCount]; 192*1b3f573fSAndroid Build Coastguard Worker NSData* rawBytes = [message data]; 193*1b3f573fSAndroid Build Coastguard Worker [message release]; 194*1b3f573fSAndroid Build Coastguard Worker message = [[TestPackedTypes alloc] initWithData:rawBytes error:NULL]; 195*1b3f573fSAndroid Build Coastguard Worker [message release]; 196*1b3f573fSAndroid Build Coastguard Worker } 197*1b3f573fSAndroid Build Coastguard Worker }]; 198*1b3f573fSAndroid Build Coastguard Worker} 199*1b3f573fSAndroid Build Coastguard Worker 200*1b3f573fSAndroid Build Coastguard Worker- (void)testPackedExtensionsPerformance { 201*1b3f573fSAndroid Build Coastguard Worker [self measureBlock:^{ 202*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 1000; ++i) { 203*1b3f573fSAndroid Build Coastguard Worker TestPackedExtensions* message = [[TestPackedExtensions alloc] init]; 204*1b3f573fSAndroid Build Coastguard Worker [self setPackedExtensions:message repeatedCount:kRepeatedCount]; 205*1b3f573fSAndroid Build Coastguard Worker NSData* rawBytes = [message data]; 206*1b3f573fSAndroid Build Coastguard Worker [message release]; 207*1b3f573fSAndroid Build Coastguard Worker TestPackedExtensions* message2 = 208*1b3f573fSAndroid Build Coastguard Worker [[TestPackedExtensions alloc] initWithData:rawBytes error:NULL]; 209*1b3f573fSAndroid Build Coastguard Worker [message2 release]; 210*1b3f573fSAndroid Build Coastguard Worker } 211*1b3f573fSAndroid Build Coastguard Worker }]; 212*1b3f573fSAndroid Build Coastguard Worker} 213*1b3f573fSAndroid Build Coastguard Worker 214*1b3f573fSAndroid Build Coastguard Worker- (void)testHas { 215*1b3f573fSAndroid Build Coastguard Worker TestAllTypes* message = [self allSetRepeatedCount:1]; 216*1b3f573fSAndroid Build Coastguard Worker [self measureBlock:^{ 217*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 10000; ++i) { 218*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalInt32]; 219*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalInt32 = NO; 220*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalInt32]; 221*1b3f573fSAndroid Build Coastguard Worker 222*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalInt64]; 223*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalInt64 = NO; 224*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalInt64]; 225*1b3f573fSAndroid Build Coastguard Worker 226*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalUint32]; 227*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalUint32 = NO; 228*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalUint32]; 229*1b3f573fSAndroid Build Coastguard Worker 230*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalUint64]; 231*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalUint64 = NO; 232*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalUint64]; 233*1b3f573fSAndroid Build Coastguard Worker 234*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalSint32]; 235*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalSint32 = NO; 236*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalSint32]; 237*1b3f573fSAndroid Build Coastguard Worker 238*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalSint64]; 239*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalSint64 = NO; 240*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalSint64]; 241*1b3f573fSAndroid Build Coastguard Worker 242*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalFixed32]; 243*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalFixed32 = NO; 244*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalFixed32]; 245*1b3f573fSAndroid Build Coastguard Worker 246*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalFixed64]; 247*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalFixed64 = NO; 248*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalFixed64]; 249*1b3f573fSAndroid Build Coastguard Worker 250*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalSfixed32]; 251*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalSfixed32 = NO; 252*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalSfixed32]; 253*1b3f573fSAndroid Build Coastguard Worker 254*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalSfixed64]; 255*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalSfixed64 = NO; 256*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalSfixed64]; 257*1b3f573fSAndroid Build Coastguard Worker 258*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalFloat]; 259*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalFloat = NO; 260*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalFloat]; 261*1b3f573fSAndroid Build Coastguard Worker 262*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalDouble]; 263*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalDouble = NO; 264*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalDouble]; 265*1b3f573fSAndroid Build Coastguard Worker 266*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalBool]; 267*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalBool = NO; 268*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalBool]; 269*1b3f573fSAndroid Build Coastguard Worker 270*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalString]; 271*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalString = NO; 272*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalString]; 273*1b3f573fSAndroid Build Coastguard Worker 274*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalBytes]; 275*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalBytes = NO; 276*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalBytes]; 277*1b3f573fSAndroid Build Coastguard Worker 278*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalGroup]; 279*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalGroup = NO; 280*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalGroup]; 281*1b3f573fSAndroid Build Coastguard Worker 282*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalNestedMessage]; 283*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalNestedMessage = NO; 284*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalNestedMessage]; 285*1b3f573fSAndroid Build Coastguard Worker 286*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalForeignMessage]; 287*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalForeignMessage = NO; 288*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalForeignMessage]; 289*1b3f573fSAndroid Build Coastguard Worker 290*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalImportMessage]; 291*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalImportMessage = NO; 292*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalImportMessage]; 293*1b3f573fSAndroid Build Coastguard Worker 294*1b3f573fSAndroid Build Coastguard Worker [message.optionalGroup hasA]; 295*1b3f573fSAndroid Build Coastguard Worker message.optionalGroup.hasA = NO; 296*1b3f573fSAndroid Build Coastguard Worker [message.optionalGroup hasA]; 297*1b3f573fSAndroid Build Coastguard Worker 298*1b3f573fSAndroid Build Coastguard Worker [message.optionalNestedMessage hasBb]; 299*1b3f573fSAndroid Build Coastguard Worker message.optionalNestedMessage.hasBb = NO; 300*1b3f573fSAndroid Build Coastguard Worker [message.optionalNestedMessage hasBb]; 301*1b3f573fSAndroid Build Coastguard Worker 302*1b3f573fSAndroid Build Coastguard Worker [message.optionalForeignMessage hasC]; 303*1b3f573fSAndroid Build Coastguard Worker message.optionalForeignMessage.hasC = NO; 304*1b3f573fSAndroid Build Coastguard Worker [message.optionalForeignMessage hasC]; 305*1b3f573fSAndroid Build Coastguard Worker 306*1b3f573fSAndroid Build Coastguard Worker [message.optionalImportMessage hasD]; 307*1b3f573fSAndroid Build Coastguard Worker message.optionalImportMessage.hasD = NO; 308*1b3f573fSAndroid Build Coastguard Worker [message.optionalImportMessage hasD]; 309*1b3f573fSAndroid Build Coastguard Worker 310*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalNestedEnum]; 311*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalNestedEnum = NO; 312*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalNestedEnum]; 313*1b3f573fSAndroid Build Coastguard Worker 314*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalForeignEnum]; 315*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalForeignEnum = NO; 316*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalForeignEnum]; 317*1b3f573fSAndroid Build Coastguard Worker 318*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalImportEnum]; 319*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalImportEnum = NO; 320*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalImportEnum]; 321*1b3f573fSAndroid Build Coastguard Worker 322*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalStringPiece]; 323*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalStringPiece = NO; 324*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalStringPiece]; 325*1b3f573fSAndroid Build Coastguard Worker 326*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalCord]; 327*1b3f573fSAndroid Build Coastguard Worker message.hasOptionalCord = NO; 328*1b3f573fSAndroid Build Coastguard Worker [message hasOptionalCord]; 329*1b3f573fSAndroid Build Coastguard Worker 330*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultInt32]; 331*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultInt32 = NO; 332*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultInt32]; 333*1b3f573fSAndroid Build Coastguard Worker 334*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultInt64]; 335*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultInt64 = NO; 336*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultInt64]; 337*1b3f573fSAndroid Build Coastguard Worker 338*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultUint32]; 339*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultUint32 = NO; 340*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultUint32]; 341*1b3f573fSAndroid Build Coastguard Worker 342*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultUint64]; 343*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultUint64 = NO; 344*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultUint64]; 345*1b3f573fSAndroid Build Coastguard Worker 346*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultSint32]; 347*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultSint32 = NO; 348*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultSint32]; 349*1b3f573fSAndroid Build Coastguard Worker 350*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultSint64]; 351*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultSint64 = NO; 352*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultSint64]; 353*1b3f573fSAndroid Build Coastguard Worker 354*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultFixed32]; 355*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultFixed32 = NO; 356*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultFixed32]; 357*1b3f573fSAndroid Build Coastguard Worker 358*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultFixed64]; 359*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultFixed64 = NO; 360*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultFixed64]; 361*1b3f573fSAndroid Build Coastguard Worker 362*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultSfixed32]; 363*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultSfixed32 = NO; 364*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultSfixed32]; 365*1b3f573fSAndroid Build Coastguard Worker 366*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultSfixed64]; 367*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultSfixed64 = NO; 368*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultSfixed64]; 369*1b3f573fSAndroid Build Coastguard Worker 370*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultFloat]; 371*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultFloat = NO; 372*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultFloat]; 373*1b3f573fSAndroid Build Coastguard Worker 374*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultDouble]; 375*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultDouble = NO; 376*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultDouble]; 377*1b3f573fSAndroid Build Coastguard Worker 378*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultBool]; 379*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultBool = NO; 380*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultBool]; 381*1b3f573fSAndroid Build Coastguard Worker 382*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultString]; 383*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultString = NO; 384*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultString]; 385*1b3f573fSAndroid Build Coastguard Worker 386*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultBytes]; 387*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultBytes = NO; 388*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultBytes]; 389*1b3f573fSAndroid Build Coastguard Worker 390*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultNestedEnum]; 391*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultNestedEnum = NO; 392*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultNestedEnum]; 393*1b3f573fSAndroid Build Coastguard Worker 394*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultForeignEnum]; 395*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultForeignEnum = NO; 396*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultForeignEnum]; 397*1b3f573fSAndroid Build Coastguard Worker 398*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultImportEnum]; 399*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultImportEnum = NO; 400*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultImportEnum]; 401*1b3f573fSAndroid Build Coastguard Worker 402*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultStringPiece]; 403*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultStringPiece = NO; 404*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultStringPiece]; 405*1b3f573fSAndroid Build Coastguard Worker 406*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultCord]; 407*1b3f573fSAndroid Build Coastguard Worker message.hasDefaultCord = NO; 408*1b3f573fSAndroid Build Coastguard Worker [message hasDefaultCord]; 409*1b3f573fSAndroid Build Coastguard Worker } 410*1b3f573fSAndroid Build Coastguard Worker }]; 411*1b3f573fSAndroid Build Coastguard Worker} 412*1b3f573fSAndroid Build Coastguard Worker 413*1b3f573fSAndroid Build Coastguard Worker@end 414