xref: /aosp_15_r20/external/protobuf/objectivec/Tests/GPBPerfTests.m (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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