From 91cf20430ac23554b6d78fc83915c85f06885d78 Mon Sep 17 00:00:00 2001 From: Michael Haney Date: Fri, 15 Feb 2019 10:46:52 -0800 Subject: [PATCH 1/6] Update some comments and move the event clock snapshot to the public header --- .../Classes/Private/GDTEvent_Private.h | 3 - .../Classes/Public/GDTEvent.h | 5 + .../Classes/Public/GDTUploader.h | 7 +- .../Classes/Protos/cct.nanopb.c | 129 ++++++++++++++++++ 4 files changed, 138 insertions(+), 6 deletions(-) create mode 100644 GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/Classes/Protos/cct.nanopb.c diff --git a/GoogleDataTransport/GoogleDataTransport/Classes/Private/GDTEvent_Private.h b/GoogleDataTransport/GoogleDataTransport/Classes/Private/GDTEvent_Private.h index 67914e7b91a..5c10c472033 100644 --- a/GoogleDataTransport/GoogleDataTransport/Classes/Private/GDTEvent_Private.h +++ b/GoogleDataTransport/GoogleDataTransport/Classes/Private/GDTEvent_Private.h @@ -25,9 +25,6 @@ NS_ASSUME_NONNULL_BEGIN /** The serialized bytes of the event data object. */ @property(nonatomic) NSData *dataObjectTransportBytes; -/** The clock snapshot at the time of the event. */ -@property(nonatomic) GDTClock *clockSnapshot; - @end NS_ASSUME_NONNULL_END diff --git a/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTEvent.h b/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTEvent.h index 13edfe10705..6f0a8b77e21 100644 --- a/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTEvent.h +++ b/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTEvent.h @@ -18,6 +18,8 @@ #import "GDTEventDataObject.h" +@class GDTClock; + NS_ASSUME_NONNULL_BEGIN /** The different possible quality of service specifiers. High values indicate high priority. */ @@ -56,6 +58,9 @@ typedef NS_ENUM(NSInteger, GDTEventQoS) { /** The quality of service tier this event belongs to. */ @property(nonatomic) GDTEventQoS qosTier; +/** The clock snapshot at the time of the event. */ +@property(nonatomic) GDTClock *clockSnapshot; + /** A dictionary provided to aid prioritizers by allowing the passing of arbitrary data. It will be * retained by a copy in -copy, but not used for -hash. */ diff --git a/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTUploader.h b/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTUploader.h index a7f5216d7b8..fd6db4a54c8 100644 --- a/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTUploader.h +++ b/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTUploader.h @@ -40,9 +40,10 @@ typedef void (^GDTUploaderCompletionBlock)(GDTTarget target, /** Uploads events to the backend using this specific backend's chosen format. * * @param eventFiles The set of event files to upload. - * @param onComplete A block to invoke upon completing the upload. Has two arguments: - * - successfulUploads: The set of filenames uploaded successfully. - * - unsuccessfulUploads: The set of filenames not uploaded successfully. + * @param onComplete A block to invoke upon completing the upload. Has three arguments: + * - target: The GDTTarget that just uploaded. + * - nextUploadAttemptUTC: A clock representing the next upload attempt. + * - uploadError: An error object describing the upload error, or nil if upload was successful. */ - (void)uploadEvents:(NSSet *)eventFiles onComplete:(GDTUploaderCompletionBlock)onComplete; diff --git a/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/Classes/Protos/cct.nanopb.c b/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/Classes/Protos/cct.nanopb.c new file mode 100644 index 00000000000..3e4a04bd651 --- /dev/null +++ b/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/Classes/Protos/cct.nanopb.c @@ -0,0 +1,129 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.9.2 */ + +#include "cct.nanopb.h" + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + +const firebase_firelog_cct_NetworkConnectionInfo_NetworkType firebase_firelog_cct_NetworkConnectionInfo_network_type_default = firebase_firelog_cct_NetworkConnectionInfo_NetworkType_NONE; +const firebase_firelog_cct_NetworkConnectionInfo_MobileSubtype firebase_firelog_cct_NetworkConnectionInfo_mobile_subtype_default = firebase_firelog_cct_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE; +const firebase_firelog_cct_QosTierConfiguration_QosTier firebase_firelog_cct_LogRequest_qos_tier_default = firebase_firelog_cct_QosTierConfiguration_QosTier_DEFAULT; +const int32_t firebase_firelog_cct_QosTierConfiguration_log_source_default = 0; + + +const pb_field_t firebase_firelog_cct_LogEvent_fields[6] = { + PB_FIELD( 1, INT64 , OPTIONAL, STATIC , FIRST, firebase_firelog_cct_LogEvent, event_time_ms, event_time_ms, 0), + PB_FIELD( 6, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_LogEvent, source_extension, event_time_ms, 0), + PB_FIELD( 15, SINT64 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogEvent, timezone_offset_seconds, source_extension, 0), + PB_FIELD( 17, INT64 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogEvent, event_uptime_ms, timezone_offset_seconds, 0), + PB_FIELD( 23, MESSAGE , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogEvent, network_connection_info, event_uptime_ms, &firebase_firelog_cct_NetworkConnectionInfo_fields), + PB_LAST_FIELD +}; + +const pb_field_t firebase_firelog_cct_NetworkConnectionInfo_fields[3] = { + PB_FIELD( 1, ENUM , OPTIONAL, STATIC , FIRST, firebase_firelog_cct_NetworkConnectionInfo, network_type, network_type, &firebase_firelog_cct_NetworkConnectionInfo_network_type_default), + PB_FIELD( 2, UENUM , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_NetworkConnectionInfo, mobile_subtype, network_type, &firebase_firelog_cct_NetworkConnectionInfo_mobile_subtype_default), + PB_LAST_FIELD +}; + +const pb_field_t firebase_firelog_cct_IosClientInfo_fields[9] = { + PB_FIELD( 3, BYTES , OPTIONAL, POINTER , FIRST, firebase_firelog_cct_IosClientInfo, os_major_version, os_major_version, 0), + PB_FIELD( 4, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, os_full_version, os_major_version, 0), + PB_FIELD( 5, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, application_build, os_full_version, 0), + PB_FIELD( 6, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, country, application_build, 0), + PB_FIELD( 7, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, model, country, 0), + PB_FIELD( 8, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, language_code, model, 0), + PB_FIELD( 11, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, application_bundle_id, language_code, 0), + PB_FIELD( 12, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, application_version, application_bundle_id, 0), + PB_LAST_FIELD +}; + +const pb_field_t firebase_firelog_cct_ClientInfo_fields[3] = { + PB_FIELD( 1, UENUM , OPTIONAL, STATIC , FIRST, firebase_firelog_cct_ClientInfo, client_type, client_type, 0), + PB_FIELD( 4, MESSAGE , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_ClientInfo, ios_client_info, client_type, &firebase_firelog_cct_IosClientInfo_fields), + PB_LAST_FIELD +}; + +const pb_field_t firebase_firelog_cct_BatchedLogRequest_fields[2] = { + PB_FIELD( 1, MESSAGE , REPEATED, POINTER , FIRST, firebase_firelog_cct_BatchedLogRequest, log_request, log_request, &firebase_firelog_cct_LogRequest_fields), + PB_LAST_FIELD +}; + +const pb_field_t firebase_firelog_cct_LogRequest_fields[8] = { + PB_FIELD( 1, MESSAGE , OPTIONAL, STATIC , FIRST, firebase_firelog_cct_LogRequest, client_info, client_info, &firebase_firelog_cct_ClientInfo_fields), + PB_FIELD( 2, INT32 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogRequest, log_source, client_info, 0), + PB_FIELD( 3, MESSAGE , REPEATED, POINTER , OTHER, firebase_firelog_cct_LogRequest, log_event, log_source, &firebase_firelog_cct_LogEvent_fields), + PB_FIELD( 4, INT64 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogRequest, request_time_ms, log_event, 0), + PB_FIELD( 5, BYTES , REPEATED, POINTER , OTHER, firebase_firelog_cct_LogRequest, serialized_log_events, request_time_ms, 0), + PB_FIELD( 8, INT64 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogRequest, request_uptime_ms, serialized_log_events, 0), + PB_FIELD( 9, UENUM , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogRequest, qos_tier, request_uptime_ms, &firebase_firelog_cct_LogRequest_qos_tier_default), + PB_LAST_FIELD +}; + +const pb_field_t firebase_firelog_cct_QosTierConfiguration_fields[4] = { + PB_FIELD( 1, BYTES , OPTIONAL, POINTER , FIRST, firebase_firelog_cct_QosTierConfiguration, log_source_name, log_source_name, 0), + PB_FIELD( 2, UENUM , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_QosTierConfiguration, qos_tier, log_source_name, 0), + PB_FIELD( 3, INT32 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_QosTierConfiguration, log_source, qos_tier, &firebase_firelog_cct_QosTierConfiguration_log_source_default), + PB_LAST_FIELD +}; + +const pb_field_t firebase_firelog_cct_QosTiersOverride_fields[3] = { + PB_FIELD( 1, MESSAGE , REPEATED, POINTER , FIRST, firebase_firelog_cct_QosTiersOverride, qos_tier_configuration, qos_tier_configuration, &firebase_firelog_cct_QosTierConfiguration_fields), + PB_FIELD( 2, INT64 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_QosTiersOverride, qos_tier_fingerprint, qos_tier_configuration, 0), + PB_LAST_FIELD +}; + +const pb_field_t firebase_firelog_cct_LogResponse_fields[3] = { + PB_FIELD( 1, INT64 , OPTIONAL, STATIC , FIRST, firebase_firelog_cct_LogResponse, next_request_wait_millis, next_request_wait_millis, 0), + PB_FIELD( 3, MESSAGE , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogResponse, qos_tier, next_request_wait_millis, &firebase_firelog_cct_QosTiersOverride_fields), + PB_LAST_FIELD +}; + + + + + + +/* Check that field information fits in pb_field_t */ +#if !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_32BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in 8 or 16 bit + * field descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(firebase_firelog_cct_LogEvent, network_connection_info) < 65536 && pb_membersize(firebase_firelog_cct_ClientInfo, ios_client_info) < 65536 && pb_membersize(firebase_firelog_cct_LogRequest, client_info) < 65536 && pb_membersize(firebase_firelog_cct_LogResponse, qos_tier) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_firebase_firelog_cct_LogEvent_firebase_firelog_cct_NetworkConnectionInfo_firebase_firelog_cct_IosClientInfo_firebase_firelog_cct_ClientInfo_firebase_firelog_cct_BatchedLogRequest_firebase_firelog_cct_LogRequest_firebase_firelog_cct_QosTierConfiguration_firebase_firelog_cct_QosTiersOverride_firebase_firelog_cct_LogResponse) +#endif + +#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_16BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in the default + * 8 bit descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(firebase_firelog_cct_LogEvent, network_connection_info) < 256 && pb_membersize(firebase_firelog_cct_ClientInfo, ios_client_info) < 256 && pb_membersize(firebase_firelog_cct_LogRequest, client_info) < 256 && pb_membersize(firebase_firelog_cct_LogResponse, qos_tier) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_firebase_firelog_cct_LogEvent_firebase_firelog_cct_NetworkConnectionInfo_firebase_firelog_cct_IosClientInfo_firebase_firelog_cct_ClientInfo_firebase_firelog_cct_BatchedLogRequest_firebase_firelog_cct_LogRequest_firebase_firelog_cct_QosTierConfiguration_firebase_firelog_cct_QosTiersOverride_firebase_firelog_cct_LogResponse) +#endif + +/* @@protoc_insertion_point(eof) */ From a11ece3b352c87e891fe38033e93c110cb8b6a2b Mon Sep 17 00:00:00 2001 From: Michael Haney Date: Mon, 4 Mar 2019 14:25:14 -0800 Subject: [PATCH 2/6] Create the notion of an 'upload package' This will allow prioritizers to pass arbitrary data to the uploader that might be needed at upload time. --- .../Classes/GDTUploadPackage.m | 62 +++++++++++++++++++ .../Private/GDTUploadPackage_Private.h | 26 ++++++++ .../Classes/Public/GDTUploadPackage.h | 28 +++++++++ .../Helpers/GDTIntegrationTestUploadPackage.h | 22 +++++++ .../Helpers/GDTIntegrationTestUploadPackage.m | 21 +++++++ .../Tests/Unit/GDTUploadPackageTest.m | 59 ++++++++++++++++++ .../Tests/Unit/Helpers/GDTTestUploadPackage.h | 22 +++++++ .../Tests/Unit/Helpers/GDTTestUploadPackage.m | 21 +++++++ 8 files changed, 261 insertions(+) create mode 100644 GoogleDataTransport/GoogleDataTransport/Classes/GDTUploadPackage.m create mode 100644 GoogleDataTransport/GoogleDataTransport/Classes/Private/GDTUploadPackage_Private.h create mode 100644 GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTUploadPackage.h create mode 100644 GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploadPackage.h create mode 100644 GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploadPackage.m create mode 100644 GoogleDataTransport/Tests/Unit/GDTUploadPackageTest.m create mode 100644 GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploadPackage.h create mode 100644 GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploadPackage.m diff --git a/GoogleDataTransport/GoogleDataTransport/Classes/GDTUploadPackage.m b/GoogleDataTransport/GoogleDataTransport/Classes/GDTUploadPackage.m new file mode 100644 index 00000000000..0867cf0a1fe --- /dev/null +++ b/GoogleDataTransport/GoogleDataTransport/Classes/GDTUploadPackage.m @@ -0,0 +1,62 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GDTUploadPackage_Private.h" +#import "GDTStorage_Private.h" + +@implementation GDTUploadPackage + +- (instancetype)init { + self = [super init]; + if (self) { + _storage = [GDTStorage sharedInstance]; + } + return self; +} + +- (instancetype)copy { + GDTUploadPackage *newPackage = [[GDTUploadPackage alloc] init]; + newPackage->_eventHashes = _eventHashes; + return newPackage; +} + +- (NSUInteger)hash { + return [_eventHashes hash]; +} + +- (BOOL)isEqual:(id)object { + return [self hash] == [object hash]; +} + +- (void)setEventHashes:(NSSet *)eventHashes { + if (eventHashes != _eventHashes) { + _eventHashes = [eventHashes copy]; + } +} + +- (NSDictionary *)eventHashesToFiles { + return [_storage eventHashesToFiles:_eventHashes]; +} + +- (void)setStorage:(GDTStorage *)storage { + if (storage != _storage) { + _storage = storage; + } +} + +@end diff --git a/GoogleDataTransport/GoogleDataTransport/Classes/Private/GDTUploadPackage_Private.h b/GoogleDataTransport/GoogleDataTransport/Classes/Private/GDTUploadPackage_Private.h new file mode 100644 index 00000000000..2dc6b0a0440 --- /dev/null +++ b/GoogleDataTransport/GoogleDataTransport/Classes/Private/GDTUploadPackage_Private.h @@ -0,0 +1,26 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class GDTStorage; + +@interface GDTUploadPackage () + +/** The storage object this upload package will use to resolve event hashes to files. */ +@property(nonatomic) GDTStorage *storage; + +@end diff --git a/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTUploadPackage.h b/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTUploadPackage.h new file mode 100644 index 00000000000..08dc4d01321 --- /dev/null +++ b/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTUploadPackage.h @@ -0,0 +1,28 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/** This class is a container that's handed off to uploaders. */ +@interface GDTUploadPackage : NSObject + +/** The set of event hashes in this upload package. */ +@property(nonatomic) NSSet *eventHashes; + +/** A lazily-determined map of event hashes to their files. */ +@property(nonatomic, readonly) NSDictionary *eventHashesToFiles; + +@end diff --git a/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploadPackage.h b/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploadPackage.h new file mode 100644 index 00000000000..ebe5bdfa6bf --- /dev/null +++ b/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploadPackage.h @@ -0,0 +1,22 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GDTTestPrioritizer.h" + +/** An upload package used in testing. */ +@interface GDTIntegrationTestUploadPackage : GDTUploadPackage + +@end diff --git a/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploadPackage.m b/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploadPackage.m new file mode 100644 index 00000000000..d1b834f6798 --- /dev/null +++ b/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploadPackage.m @@ -0,0 +1,21 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GDTIntegrationTestUploadPackage.h" + +@implementation GDTIntegrationTestUploadPackage + +@end diff --git a/GoogleDataTransport/Tests/Unit/GDTUploadPackageTest.m b/GoogleDataTransport/Tests/Unit/GDTUploadPackageTest.m new file mode 100644 index 00000000000..22cf65cbaa1 --- /dev/null +++ b/GoogleDataTransport/Tests/Unit/GDTUploadPackageTest.m @@ -0,0 +1,59 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GDTTestCase.h" + +#import + +#import "GDTUploadPackage_Private.h" + +@interface GDTUploadPackageTest : GDTTestCase + +@end + +@implementation GDTUploadPackageTest + +/** Tests the default initializer. */ +- (void)testInit { + XCTAssertNotNil([[GDTUploadPackage alloc] init]); +} + +/** Tests copying indicates that the underlying sets of events can't be changed from underneath. */ +- (void)testRegisterUpload { + GDTUploadPackage *uploadPackage = [[GDTUploadPackage alloc] init]; + GDTUploadPackage *uploadPackageCopy = [uploadPackage copy]; + XCTAssertNotEqual(uploadPackage, uploadPackageCopy); + XCTAssertEqualObjects(uploadPackage.eventHashes, uploadPackageCopy.eventHashes); + XCTAssertEqualObjects(uploadPackage, uploadPackageCopy); + + uploadPackage.eventHashes = [NSSet set]; + uploadPackageCopy = [uploadPackage copy]; + XCTAssertNotEqual(uploadPackage, uploadPackageCopy); + XCTAssertEqualObjects(uploadPackage.eventHashes, uploadPackageCopy.eventHashes); + XCTAssertEqualObjects(uploadPackage, uploadPackageCopy); + + NSMutableSet *set = [[NSMutableSet alloc] initWithObjects:@1, @2, @3, nil]; + [set addObject:@4]; + uploadPackage.eventHashes = set; + uploadPackageCopy = [uploadPackage copy]; + XCTAssertNotEqual(uploadPackage, uploadPackageCopy); + [set addObject:@5]; + XCTAssertFalse([uploadPackageCopy.eventHashes containsObject:@5]); + XCTAssertEqualObjects(uploadPackage.eventHashes, uploadPackageCopy.eventHashes); + XCTAssertEqualObjects(uploadPackage, uploadPackageCopy); +} + +@end diff --git a/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploadPackage.h b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploadPackage.h new file mode 100644 index 00000000000..28a85bcb21e --- /dev/null +++ b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploadPackage.h @@ -0,0 +1,22 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GDTTestPrioritizer.h" + +/** An upload package used in testing. */ +@interface GDTTestUploadPackage : GDTUploadPackage + +@end diff --git a/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploadPackage.m b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploadPackage.m new file mode 100644 index 00000000000..b7d7894a33f --- /dev/null +++ b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploadPackage.m @@ -0,0 +1,21 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GDTTestUploadPackage.h" + +@implementation GDTTestUploadPackage + +@end From 0d81bd2bdb3160a5ce8fc8d2555c188ca2340ff7 Mon Sep 17 00:00:00 2001 From: Michael Haney Date: Mon, 4 Mar 2019 14:25:41 -0800 Subject: [PATCH 3/6] Make the -transportBytes protocol method required. --- .../GoogleDataTransport/Classes/Public/GDTEventDataObject.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTEventDataObject.h b/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTEventDataObject.h index 2cb0ccc649e..f9031cbe835 100644 --- a/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTEventDataObject.h +++ b/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTEventDataObject.h @@ -23,6 +23,8 @@ NS_ASSUME_NONNULL_BEGIN */ @protocol GDTEventDataObject +@required + /** Returns the serialized proto bytes of the implementing event proto. * * @return the serialized proto bytes of the implementing event proto. From fef4d92db5a1b66e2895c817d08fedad3a10ebf2 Mon Sep 17 00:00:00 2001 From: Michael Haney Date: Mon, 4 Mar 2019 14:26:35 -0800 Subject: [PATCH 4/6] Make the rest of the framework use the upload package --- .../GoogleDataTransport/Classes/GDTStorage.h | 2 +- .../GoogleDataTransport/Classes/GDTStorage.m | 8 +++---- .../Classes/GDTUploadCoordinator.m | 21 ++++++++-------- .../Classes/Public/GDTPrioritizer.h | 9 ++++--- .../Classes/Public/GDTUploader.h | 4 ++-- .../Helpers/GDTIntegrationTestPrioritizer.m | 24 +++++++++++-------- .../Helpers/GDTIntegrationTestUploader.m | 6 ++--- .../Tests/Unit/GDTStorageTest.m | 12 +++++----- .../Tests/Unit/GDTUploadCoordinatorTest.m | 19 +++++++++------ .../Tests/Unit/Helpers/GDTTestPrioritizer.h | 8 +++---- .../Tests/Unit/Helpers/GDTTestPrioritizer.m | 12 ++++++---- .../Tests/Unit/Helpers/GDTTestUploader.h | 6 +++-- .../Tests/Unit/Helpers/GDTTestUploader.m | 4 ++-- 13 files changed, 75 insertions(+), 60 deletions(-) diff --git a/GoogleDataTransport/GoogleDataTransport/Classes/GDTStorage.h b/GoogleDataTransport/GoogleDataTransport/Classes/GDTStorage.h index 5b82c46c1db..cd7e27b0d9c 100644 --- a/GoogleDataTransport/GoogleDataTransport/Classes/GDTStorage.h +++ b/GoogleDataTransport/GoogleDataTransport/Classes/GDTStorage.h @@ -50,7 +50,7 @@ NS_ASSUME_NONNULL_BEGIN * @param eventHashes A set of event hashes to get the files of. * @return A set of equivalent length, containing all the filenames corresponding to the hashes. */ -- (NSSet *)eventHashesToFiles:(NSSet *)eventHashes; +- (NSDictionary *)eventHashesToFiles:(NSSet *)eventHashes; @end diff --git a/GoogleDataTransport/GoogleDataTransport/Classes/GDTStorage.m b/GoogleDataTransport/GoogleDataTransport/Classes/GDTStorage.m index 566d8664011..1ab827dbf7e 100644 --- a/GoogleDataTransport/GoogleDataTransport/Classes/GDTStorage.m +++ b/GoogleDataTransport/GoogleDataTransport/Classes/GDTStorage.m @@ -113,16 +113,16 @@ - (void)removeEvents:(NSSet *)eventHashes target:(NSNumber *)target }); } -- (NSSet *)eventHashesToFiles:(NSSet *)eventHashes { - NSMutableSet *eventFiles = [[NSMutableSet alloc] init]; +- (NSDictionary *)eventHashesToFiles:(NSSet *)eventHashes { + NSMutableDictionary *eventHashesToFiles = [[NSMutableDictionary alloc] init]; dispatch_sync(_storageQueue, ^{ for (NSNumber *hashNumber in eventHashes) { NSURL *eventURL = self.eventHashToFile[hashNumber]; GDTAssert(eventURL, @"An event file URL couldn't be found for the given hash"); - [eventFiles addObject:eventURL]; + eventHashesToFiles[hashNumber] = eventURL; } }); - return eventFiles; + return eventHashesToFiles; } #pragma mark - Private helper methods diff --git a/GoogleDataTransport/GoogleDataTransport/Classes/GDTUploadCoordinator.m b/GoogleDataTransport/GoogleDataTransport/Classes/GDTUploadCoordinator.m index 0819ac8fa05..eb582381d98 100644 --- a/GoogleDataTransport/GoogleDataTransport/Classes/GDTUploadCoordinator.m +++ b/GoogleDataTransport/GoogleDataTransport/Classes/GDTUploadCoordinator.m @@ -22,6 +22,7 @@ #import "GDTConsoleLogger.h" #import "GDTRegistrar_Private.h" #import "GDTStorage.h" +#import "GDTUploadPackage_Private.h" @implementation GDTUploadCoordinator @@ -57,9 +58,10 @@ - (void)forceUploadEvents:(NSSet *)eventHashes target:(GDTTarget)tar GDTUploadCoordinatorForceUploadBlock forceUploadBlock = ^{ GDTAssert(eventHashes.count, @"It doesn't make sense to force upload of 0 events"); id uploader = registrar.targetToUploader[targetNumber]; - NSSet *eventFiles = [self.storage eventHashesToFiles:eventHashes]; + GDTUploadPackage *package = [[GDTUploadPackage alloc] init]; + package.eventHashes = [eventHashes copy]; GDTAssert(uploader, @"Target '%@' is missing an implementation", targetNumber); - [uploader uploadEvents:eventFiles onComplete:self.onCompleteBlock]; + [uploader uploadPackage:package onComplete:self.onCompleteBlock]; self->_targetToInFlightEventSet[targetNumber] = eventHashes; }; @@ -157,16 +159,13 @@ - (void)checkPrioritizersAndUploadEvents { id uploader = strongSelf->_registrar.targetToUploader[target]; GDTAssert(prioritizer && uploader, @"Target '%@' is missing an implementation", target); GDTUploadConditions conds = [self uploadConditions]; - NSSet *eventHashesToUpload = - [[prioritizer eventsToUploadGivenConditions:conds] copy]; - if (eventHashesToUpload && eventHashesToUpload.count > 0) { - NSAssert(eventHashesToUpload.count > 0, @""); - NSSet *eventFilesToUpload = - [strongSelf.storage eventHashesToFiles:eventHashesToUpload]; - NSAssert(eventFilesToUpload.count == eventHashesToUpload.count, + GDTUploadPackage *package = [[prioritizer uploadPackageWithConditions:conds] copy]; + package.storage = strongSelf.storage; + if (package.eventHashes && package.eventHashes.count > 0) { + NSAssert(package.eventHashesToFiles.count == package.eventHashes.count, @"There should be the same number of files to events"); - strongSelf->_targetToInFlightEventSet[target] = eventHashesToUpload; - [uploader uploadEvents:eventFilesToUpload onComplete:self.onCompleteBlock]; + strongSelf->_targetToInFlightEventSet[target] = package.eventHashes; + [uploader uploadPackage:package onComplete:self.onCompleteBlock]; } } } diff --git a/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTPrioritizer.h b/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTPrioritizer.h index 0fb001f6fb7..526b6f750dc 100644 --- a/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTPrioritizer.h +++ b/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTPrioritizer.h @@ -16,6 +16,8 @@ #import +#import + @class GDTEvent; NS_ASSUME_NONNULL_BEGIN @@ -46,7 +48,7 @@ typedef NS_OPTIONS(NSInteger, GDTUploadConditions) { * * @note A couple of things: 1. The event cannot be retained for longer than the execution time of * this method. 2. You should retain the event hashes, because those are returned in - * -eventsForNextUpload. + * -uploadPackageWithConditions. * * @param event The event to prioritize. */ @@ -60,9 +62,10 @@ typedef NS_OPTIONS(NSInteger, GDTUploadConditions) { /** Returns a set of events to upload given a set of conditions. * * @param conditions A bit mask specifying the current upload conditions. - * @return A set of events to upload with respect to the current conditions. + * @return An object to be used by the uploader to determine file URLs to upload with respect to the + * current conditions. */ -- (NSSet *)eventsToUploadGivenConditions:(GDTUploadConditions)conditions; +- (GDTUploadPackage *)uploadPackageWithConditions:(GDTUploadConditions)conditions; @end diff --git a/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTUploader.h b/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTUploader.h index fd6db4a54c8..e9e1a36d266 100644 --- a/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTUploader.h +++ b/GoogleDataTransport/GoogleDataTransport/Classes/Public/GDTUploader.h @@ -39,13 +39,13 @@ typedef void (^GDTUploaderCompletionBlock)(GDTTarget target, /** Uploads events to the backend using this specific backend's chosen format. * - * @param eventFiles The set of event files to upload. + * @param package The event package to upload. * @param onComplete A block to invoke upon completing the upload. Has three arguments: * - target: The GDTTarget that just uploaded. * - nextUploadAttemptUTC: A clock representing the next upload attempt. * - uploadError: An error object describing the upload error, or nil if upload was successful. */ -- (void)uploadEvents:(NSSet *)eventFiles onComplete:(GDTUploaderCompletionBlock)onComplete; +- (void)uploadPackage:(GDTUploadPackage *)package onComplete:(GDTUploaderCompletionBlock)onComplete; @end diff --git a/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestPrioritizer.m b/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestPrioritizer.m index 07a937cccb1..1ef15f0a067 100644 --- a/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestPrioritizer.m +++ b/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestPrioritizer.m @@ -16,6 +16,8 @@ #import "GDTIntegrationTestPrioritizer.h" +#import "GDTIntegrationTestUploadPackage.h" + @interface GDTIntegrationTestPrioritizer () /** Events that are only supposed to be uploaded whilst on wifi. */ @@ -44,32 +46,34 @@ - (instancetype)init { } - (void)prioritizeEvent:(GDTEvent *)event { - dispatch_sync(_queue, ^{ - if (event.qosTier == GDTEventQoSWifiOnly) { - [self.wifiOnlyEvents addObject:@(event.hash)]; + NSUInteger eventHash = event.hash; + NSInteger qosTier = event.qosTier; + dispatch_async(_queue, ^{ + if (qosTier == GDTEventQoSWifiOnly) { + [self.wifiOnlyEvents addObject:@(eventHash)]; } else { - [self.nonWifiEvents addObject:@(event.hash)]; + [self.nonWifiEvents addObject:@(eventHash)]; } }); } - (void)unprioritizeEvent:(NSNumber *)eventHash { - dispatch_sync(_queue, ^{ + dispatch_async(_queue, ^{ [self.wifiOnlyEvents removeObject:eventHash]; [self.nonWifiEvents removeObject:eventHash]; }); } -- (nonnull NSSet *)eventsToUploadGivenConditions:(GDTUploadConditions)conditions { - __block NSSet *events; +- (GDTUploadPackage *)uploadPackageWithConditions:(GDTUploadConditions)conditions { + __block GDTIntegrationTestUploadPackage *uploadPackage = [[GDTIntegrationTestUploadPackage alloc] init]; dispatch_sync(_queue, ^{ if ((conditions & GDTUploadConditionWifiData) == GDTUploadConditionWifiData) { - events = self.wifiOnlyEvents; + uploadPackage.eventHashes = self.wifiOnlyEvents; } else { - events = self.nonWifiEvents; + uploadPackage.eventHashes = self.nonWifiEvents; } }); - return events; + return uploadPackage; } @end diff --git a/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploader.m b/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploader.m index 1a47e89fd78..e172193438f 100644 --- a/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploader.m +++ b/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploader.m @@ -37,7 +37,7 @@ - (instancetype)initWithServerURL:(NSURL *)serverURL { return self; } -- (void)uploadEvents:(NSSet *)eventFiles +- (void)uploadPackage:(GDTUploadPackage *)package onComplete:(GDTUploaderCompletionBlock)onComplete { NSAssert(!_currentUploadTask, @"An upload shouldn't be initiated with another in progress."); NSURL *serverURL = arc4random_uniform(2) ? [_serverURL URLByAppendingPathComponent:@"log"] @@ -47,10 +47,10 @@ - (void)uploadEvents:(NSSet *)eventFiles request.HTTPMethod = @"POST"; NSMutableData *uploadData = [[NSMutableData alloc] init]; - NSLog(@"Uploading batch of %lu events: ", (unsigned long)eventFiles.count); + NSLog(@"Uploading batch of %lu events: ", (unsigned long)[package eventHashes].count); // In real usage, you'd create an instance of whatever request proto your server needs. - for (NSURL *eventFile in eventFiles) { + for (NSURL *eventFile in [package.eventHashesToFiles allValues]) { NSData *fileData = [NSData dataWithContentsOfURL:eventFile]; NSAssert(fileData, @"A event file shouldn't be empty"); [uploadData appendData:fileData]; diff --git a/GoogleDataTransport/Tests/Unit/GDTStorageTest.m b/GoogleDataTransport/Tests/Unit/GDTStorageTest.m index 021c280ba29..e16185f983a 100644 --- a/GoogleDataTransport/Tests/Unit/GDTStorageTest.m +++ b/GoogleDataTransport/Tests/Unit/GDTStorageTest.m @@ -144,14 +144,14 @@ - (void)testRemoveEvents { } NSSet *eventHashSet = [NSSet setWithObjects:@(event1Hash), @(event2Hash), @(event3Hash), nil]; - NSSet *eventFiles = [storage eventHashesToFiles:eventHashSet]; + NSDictionary *eventFiles = [storage eventHashesToFiles:eventHashSet]; [storage removeEvents:eventHashSet target:@(target)]; dispatch_sync(storage.storageQueue, ^{ XCTAssertNil(storage.eventHashToFile[@(event1Hash)]); XCTAssertNil(storage.eventHashToFile[@(event2Hash)]); XCTAssertNil(storage.eventHashToFile[@(event3Hash)]); XCTAssertEqual(storage.targetToEventHashSet[@(target)].count, 0); - for (NSURL *eventFile in eventFiles) { + for (NSURL *eventFile in [eventFiles allValues]) { XCTAssertFalse([[NSFileManager defaultManager] fileExistsAtPath:eventFile.path]); } }); @@ -309,12 +309,12 @@ - (void)testEventHashesToFiles { } NSSet *eventHashSet = [NSSet setWithObjects:@(event1Hash), @(event2Hash), @(event3Hash), nil]; - NSSet *eventFiles = [storage eventHashesToFiles:eventHashSet]; + NSDictionary *eventFiles = [storage eventHashesToFiles:eventHashSet]; dispatch_sync(storage.storageQueue, ^{ XCTAssertEqual(eventFiles.count, 3); - XCTAssertTrue([eventFiles containsObject:storage.eventHashToFile[@(event1Hash)]]); - XCTAssertTrue([eventFiles containsObject:storage.eventHashToFile[@(event2Hash)]]); - XCTAssertTrue([eventFiles containsObject:storage.eventHashToFile[@(event3Hash)]]); + XCTAssertEqualObjects(eventFiles[@(event1Hash)], storage.eventHashToFile[@(event1Hash)]); + XCTAssertEqualObjects(eventFiles[@(event2Hash)], storage.eventHashToFile[@(event2Hash)]); + XCTAssertEqualObjects(eventFiles[@(event3Hash)], storage.eventHashToFile[@(event3Hash)]); }); } diff --git a/GoogleDataTransport/Tests/Unit/GDTUploadCoordinatorTest.m b/GoogleDataTransport/Tests/Unit/GDTUploadCoordinatorTest.m index 24df204a17b..c15615929a5 100644 --- a/GoogleDataTransport/Tests/Unit/GDTUploadCoordinatorTest.m +++ b/GoogleDataTransport/Tests/Unit/GDTUploadCoordinatorTest.m @@ -24,6 +24,7 @@ #import "GDTTestPrioritizer.h" #import "GDTTestUploader.h" #import "GDTUploadCoordinator+Testing.h" +#import "GDTTestUploadPackage.h" @interface GDTUploadCoordinatorTest : GDTTestCase @@ -79,7 +80,7 @@ - (void)testSharedInstance { - (void)testForceUploadEvents { XCTestExpectation *expectation = [self expectationWithDescription:@"uploader will upload"]; self.uploader.uploadEventsBlock = - ^(NSSet *_Nonnull eventFiles, GDTUploaderCompletionBlock _Nonnull completionBlock) { + ^(GDTUploadPackage * _Nonnull package, GDTUploaderCompletionBlock _Nonnull completionBlock) { [expectation fulfill]; }; NSSet *fakeEventSet = [NSSet setWithObjects:[NSURL URLWithString:@"file:///fake"], nil]; @@ -98,7 +99,7 @@ - (void)testForceUploadEventsEnqueuesIftargetAlreadyHasEventsInFlight { [GDTUploadCoordinator sharedInstance].timerLeeway = NSEC_PER_SEC / 1000; XCTestExpectation *expectation = [self expectationWithDescription:@"uploader will upload"]; self.uploader.uploadEventsBlock = - ^(NSSet *_Nonnull eventFiles, GDTUploaderCompletionBlock _Nonnull completionBlock) { + ^(GDTUploadPackage * _Nonnull package, GDTUploaderCompletionBlock _Nonnull completionBlock) { [expectation fulfill]; }; NSSet *fakeEventSet = [NSSet setWithObjects:[NSURL URLWithString:@"file:///fake"], nil]; @@ -123,7 +124,7 @@ - (void)testForceUploadEventsEnqueuesIftargetAlreadyHasEventsInFlight { /** Tests the timer is running at the desired frequency. */ - (void)testTimerIsRunningAtDesiredFrequency { __block int numberOfTimesCalled = 0; - self.prioritizer.eventsForNextUploadBlock = ^{ + self.prioritizer.uploadPackageWithConditionsBlock = ^{ numberOfTimesCalled++; }; dispatch_sync([GDTUploadCoordinator sharedInstance].coordinationQueue, ^{ @@ -149,9 +150,11 @@ - (void)testUploadingEventsViaTimer { self.storageFake.eventsToReturnFromEventHashesToFiles = fakeEventSet; __block int uploadAttempts = 0; __weak GDTUploadCoordinatorTest *weakSelf = self; - self.prioritizer.eventsForNextUploadFake = [NSSet setWithObjects:@(1234), nil]; + GDTTestUploadPackage *uploadPackage = [[GDTTestUploadPackage alloc] init]; + uploadPackage.eventHashes = [NSSet setWithObjects:@(1234), nil]; + self.prioritizer.uploadPackage = uploadPackage; self.uploader.uploadEventsBlock = - ^(NSSet *_Nonnull eventFiles, GDTUploaderCompletionBlock _Nonnull completionBlock) { + ^(GDTUploadPackage * _Nonnull package, GDTUploaderCompletionBlock _Nonnull completionBlock) { GDTUploadCoordinatorTest *strongSelf = weakSelf; completionBlock(strongSelf->_target, [GDTClock clockSnapshotInTheFuture:100], nil); uploadAttempts++; @@ -174,9 +177,11 @@ - (void)testThatAFailedUploadResultsInAnEventualRetry { self.storageFake.eventsToReturnFromEventHashesToFiles = fakeEventSet; __block int uploadAttempts = 0; __weak GDTUploadCoordinatorTest *weakSelf = self; - self.prioritizer.eventsForNextUploadFake = [NSSet setWithObjects:@(1234), nil]; + GDTTestUploadPackage *uploadPackage = [[GDTTestUploadPackage alloc] init]; + uploadPackage.eventHashes = [NSSet setWithObjects:@(1234), nil]; + self.prioritizer.uploadPackage = uploadPackage; self.uploader.uploadEventsBlock = - ^(NSSet *_Nonnull eventFiles, GDTUploaderCompletionBlock _Nonnull completionBlock) { + ^(GDTUploadPackage * _Nonnull package, GDTUploaderCompletionBlock _Nonnull completionBlock) { GDTUploadCoordinatorTest *strongSelf = weakSelf; NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:1337 userInfo:nil]; completionBlock(strongSelf->_target, [GDTClock clockSnapshotInTheFuture:100], error); diff --git a/GoogleDataTransport/Tests/Unit/Helpers/GDTTestPrioritizer.h b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestPrioritizer.h index 5fa5716efe5..7b061148c21 100644 --- a/GoogleDataTransport/Tests/Unit/Helpers/GDTTestPrioritizer.h +++ b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestPrioritizer.h @@ -25,14 +25,14 @@ NS_ASSUME_NONNULL_BEGIN */ @interface GDTTestPrioritizer : NSObject -/** The return value of -eventsForNextUpload. */ -@property(nullable, nonatomic) NSSet *eventsForNextUploadFake; +/** The return value of -uploadPackageWithConditions. */ +@property(nullable, nonatomic) GDTUploadPackage *uploadPackage; /** Allows the running of a block of code during -prioritizeEvent. */ @property(nullable, nonatomic) void (^prioritizeEventBlock)(GDTEvent *event); -/** A block that can run before -eventsForNextUpload completes. */ -@property(nullable, nonatomic) void (^eventsForNextUploadBlock)(void); +/** A block that can run before -uploadPackageWithConditions completes. */ +@property(nullable, nonatomic) void (^uploadPackageWithConditionsBlock)(void); @end diff --git a/GoogleDataTransport/Tests/Unit/Helpers/GDTTestPrioritizer.m b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestPrioritizer.m index 0c48ed875a7..99da6d99947 100644 --- a/GoogleDataTransport/Tests/Unit/Helpers/GDTTestPrioritizer.m +++ b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestPrioritizer.m @@ -16,21 +16,23 @@ #import "GDTTestPrioritizer.h" +#import "GDTTestUploadPackage.h" + @implementation GDTTestPrioritizer - (instancetype)init { self = [super init]; if (self) { - _eventsForNextUploadFake = [[NSSet alloc] init]; + _uploadPackage = [[GDTTestUploadPackage alloc] init]; } return self; } -- (NSSet *)eventsToUploadGivenConditions:(GDTUploadConditions)conditions { - if (_eventsForNextUploadBlock) { - _eventsForNextUploadBlock(); +- (GDTUploadPackage *)uploadPackageWithConditions:(GDTUploadConditions)conditions { + if (_uploadPackageWithConditionsBlock) { + _uploadPackageWithConditionsBlock(); } - return _eventsForNextUploadFake; + return _uploadPackage; } - (void)prioritizeEvent:(GDTEvent *)event { diff --git a/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploader.h b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploader.h index 8995f789c19..56f6d6388a0 100644 --- a/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploader.h +++ b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploader.h @@ -18,6 +18,8 @@ #import "GDTUploader.h" +@class GDTUploadPackage; + NS_ASSUME_NONNULL_BEGIN /** This class implements a backend uploader protocol for testing purposes, providing APIs to allow @@ -25,9 +27,9 @@ NS_ASSUME_NONNULL_BEGIN */ @interface GDTTestUploader : NSObject -/** A block that can be ran in -uploadEvents:onComplete:. */ +/** A block that can be ran in -uploadPackage:onComplete:. */ @property(nullable, nonatomic) void (^uploadEventsBlock) - (NSSet *eventFiles, GDTUploaderCompletionBlock completionBlock); + (GDTUploadPackage *package, GDTUploaderCompletionBlock completionBlock); @end diff --git a/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploader.m b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploader.m index 74a84b78efa..3285f0c632b 100644 --- a/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploader.m +++ b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploader.m @@ -18,10 +18,10 @@ @implementation GDTTestUploader -- (void)uploadEvents:(NSSet *)eventFiles +- (void)uploadPackage:(GDTUploadPackage *)package onComplete:(GDTUploaderCompletionBlock)onComplete { if (_uploadEventsBlock) { - _uploadEventsBlock(eventFiles, onComplete); + _uploadEventsBlock(package, onComplete); } else if (onComplete) { onComplete(kGDTTargetCCT, [GDTClock snapshot], nil); } From 906bf3ee59c56e1dc9468ac63eb2f108979b34ab Mon Sep 17 00:00:00 2001 From: Michael Haney Date: Mon, 4 Mar 2019 14:27:18 -0800 Subject: [PATCH 5/6] Style --- .../GoogleDataTransport/Classes/GDTUploadPackage.m | 2 +- .../Helpers/GDTIntegrationTestPrioritizer.m | 3 ++- .../Integration/Helpers/GDTIntegrationTestUploader.m | 2 +- .../Tests/Unit/GDTUploadCoordinatorTest.m | 10 +++++----- .../Tests/Unit/Helpers/GDTTestUploader.m | 2 +- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/GoogleDataTransport/GoogleDataTransport/Classes/GDTUploadPackage.m b/GoogleDataTransport/GoogleDataTransport/Classes/GDTUploadPackage.m index 0867cf0a1fe..6994adb3e1a 100644 --- a/GoogleDataTransport/GoogleDataTransport/Classes/GDTUploadPackage.m +++ b/GoogleDataTransport/GoogleDataTransport/Classes/GDTUploadPackage.m @@ -16,8 +16,8 @@ #import -#import "GDTUploadPackage_Private.h" #import "GDTStorage_Private.h" +#import "GDTUploadPackage_Private.h" @implementation GDTUploadPackage diff --git a/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestPrioritizer.m b/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestPrioritizer.m index 1ef15f0a067..0e55b2905d8 100644 --- a/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestPrioritizer.m +++ b/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestPrioritizer.m @@ -65,7 +65,8 @@ - (void)unprioritizeEvent:(NSNumber *)eventHash { } - (GDTUploadPackage *)uploadPackageWithConditions:(GDTUploadConditions)conditions { - __block GDTIntegrationTestUploadPackage *uploadPackage = [[GDTIntegrationTestUploadPackage alloc] init]; + __block GDTIntegrationTestUploadPackage *uploadPackage = + [[GDTIntegrationTestUploadPackage alloc] init]; dispatch_sync(_queue, ^{ if ((conditions & GDTUploadConditionWifiData) == GDTUploadConditionWifiData) { uploadPackage.eventHashes = self.wifiOnlyEvents; diff --git a/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploader.m b/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploader.m index e172193438f..77f306d1a82 100644 --- a/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploader.m +++ b/GoogleDataTransport/Tests/Integration/Helpers/GDTIntegrationTestUploader.m @@ -38,7 +38,7 @@ - (instancetype)initWithServerURL:(NSURL *)serverURL { } - (void)uploadPackage:(GDTUploadPackage *)package - onComplete:(GDTUploaderCompletionBlock)onComplete { + onComplete:(GDTUploaderCompletionBlock)onComplete { NSAssert(!_currentUploadTask, @"An upload shouldn't be initiated with another in progress."); NSURL *serverURL = arc4random_uniform(2) ? [_serverURL URLByAppendingPathComponent:@"log"] : [_serverURL URLByAppendingPathComponent:@"logBatch"]; diff --git a/GoogleDataTransport/Tests/Unit/GDTUploadCoordinatorTest.m b/GoogleDataTransport/Tests/Unit/GDTUploadCoordinatorTest.m index c15615929a5..e5955f1e90b 100644 --- a/GoogleDataTransport/Tests/Unit/GDTUploadCoordinatorTest.m +++ b/GoogleDataTransport/Tests/Unit/GDTUploadCoordinatorTest.m @@ -22,9 +22,9 @@ #import "GDTRegistrar+Testing.h" #import "GDTStorageFake.h" #import "GDTTestPrioritizer.h" +#import "GDTTestUploadPackage.h" #import "GDTTestUploader.h" #import "GDTUploadCoordinator+Testing.h" -#import "GDTTestUploadPackage.h" @interface GDTUploadCoordinatorTest : GDTTestCase @@ -80,7 +80,7 @@ - (void)testSharedInstance { - (void)testForceUploadEvents { XCTestExpectation *expectation = [self expectationWithDescription:@"uploader will upload"]; self.uploader.uploadEventsBlock = - ^(GDTUploadPackage * _Nonnull package, GDTUploaderCompletionBlock _Nonnull completionBlock) { + ^(GDTUploadPackage *_Nonnull package, GDTUploaderCompletionBlock _Nonnull completionBlock) { [expectation fulfill]; }; NSSet *fakeEventSet = [NSSet setWithObjects:[NSURL URLWithString:@"file:///fake"], nil]; @@ -99,7 +99,7 @@ - (void)testForceUploadEventsEnqueuesIftargetAlreadyHasEventsInFlight { [GDTUploadCoordinator sharedInstance].timerLeeway = NSEC_PER_SEC / 1000; XCTestExpectation *expectation = [self expectationWithDescription:@"uploader will upload"]; self.uploader.uploadEventsBlock = - ^(GDTUploadPackage * _Nonnull package, GDTUploaderCompletionBlock _Nonnull completionBlock) { + ^(GDTUploadPackage *_Nonnull package, GDTUploaderCompletionBlock _Nonnull completionBlock) { [expectation fulfill]; }; NSSet *fakeEventSet = [NSSet setWithObjects:[NSURL URLWithString:@"file:///fake"], nil]; @@ -154,7 +154,7 @@ - (void)testUploadingEventsViaTimer { uploadPackage.eventHashes = [NSSet setWithObjects:@(1234), nil]; self.prioritizer.uploadPackage = uploadPackage; self.uploader.uploadEventsBlock = - ^(GDTUploadPackage * _Nonnull package, GDTUploaderCompletionBlock _Nonnull completionBlock) { + ^(GDTUploadPackage *_Nonnull package, GDTUploaderCompletionBlock _Nonnull completionBlock) { GDTUploadCoordinatorTest *strongSelf = weakSelf; completionBlock(strongSelf->_target, [GDTClock clockSnapshotInTheFuture:100], nil); uploadAttempts++; @@ -181,7 +181,7 @@ - (void)testThatAFailedUploadResultsInAnEventualRetry { uploadPackage.eventHashes = [NSSet setWithObjects:@(1234), nil]; self.prioritizer.uploadPackage = uploadPackage; self.uploader.uploadEventsBlock = - ^(GDTUploadPackage * _Nonnull package, GDTUploaderCompletionBlock _Nonnull completionBlock) { + ^(GDTUploadPackage *_Nonnull package, GDTUploaderCompletionBlock _Nonnull completionBlock) { GDTUploadCoordinatorTest *strongSelf = weakSelf; NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:1337 userInfo:nil]; completionBlock(strongSelf->_target, [GDTClock clockSnapshotInTheFuture:100], error); diff --git a/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploader.m b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploader.m index 3285f0c632b..dcc90ed1d5c 100644 --- a/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploader.m +++ b/GoogleDataTransport/Tests/Unit/Helpers/GDTTestUploader.m @@ -19,7 +19,7 @@ @implementation GDTTestUploader - (void)uploadPackage:(GDTUploadPackage *)package - onComplete:(GDTUploaderCompletionBlock)onComplete { + onComplete:(GDTUploaderCompletionBlock)onComplete { if (_uploadEventsBlock) { _uploadEventsBlock(package, onComplete); } else if (onComplete) { From 2f653fa43182bc0cb95130173379f899108812a3 Mon Sep 17 00:00:00 2001 From: Michael Haney Date: Mon, 4 Mar 2019 17:42:23 -0800 Subject: [PATCH 6/6] Remove cct.nanopb.c It was accidentally added. --- .../Classes/Protos/cct.nanopb.c | 129 ------------------ 1 file changed, 129 deletions(-) delete mode 100644 GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/Classes/Protos/cct.nanopb.c diff --git a/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/Classes/Protos/cct.nanopb.c b/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/Classes/Protos/cct.nanopb.c deleted file mode 100644 index 3e4a04bd651..00000000000 --- a/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/Classes/Protos/cct.nanopb.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright 2018 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* Automatically generated nanopb constant definitions */ -/* Generated by nanopb-0.3.9.2 */ - -#include "cct.nanopb.h" - -/* @@protoc_insertion_point(includes) */ -#if PB_PROTO_HEADER_VERSION != 30 -#error Regenerate this file with the current version of nanopb generator. -#endif - -const firebase_firelog_cct_NetworkConnectionInfo_NetworkType firebase_firelog_cct_NetworkConnectionInfo_network_type_default = firebase_firelog_cct_NetworkConnectionInfo_NetworkType_NONE; -const firebase_firelog_cct_NetworkConnectionInfo_MobileSubtype firebase_firelog_cct_NetworkConnectionInfo_mobile_subtype_default = firebase_firelog_cct_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE; -const firebase_firelog_cct_QosTierConfiguration_QosTier firebase_firelog_cct_LogRequest_qos_tier_default = firebase_firelog_cct_QosTierConfiguration_QosTier_DEFAULT; -const int32_t firebase_firelog_cct_QosTierConfiguration_log_source_default = 0; - - -const pb_field_t firebase_firelog_cct_LogEvent_fields[6] = { - PB_FIELD( 1, INT64 , OPTIONAL, STATIC , FIRST, firebase_firelog_cct_LogEvent, event_time_ms, event_time_ms, 0), - PB_FIELD( 6, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_LogEvent, source_extension, event_time_ms, 0), - PB_FIELD( 15, SINT64 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogEvent, timezone_offset_seconds, source_extension, 0), - PB_FIELD( 17, INT64 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogEvent, event_uptime_ms, timezone_offset_seconds, 0), - PB_FIELD( 23, MESSAGE , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogEvent, network_connection_info, event_uptime_ms, &firebase_firelog_cct_NetworkConnectionInfo_fields), - PB_LAST_FIELD -}; - -const pb_field_t firebase_firelog_cct_NetworkConnectionInfo_fields[3] = { - PB_FIELD( 1, ENUM , OPTIONAL, STATIC , FIRST, firebase_firelog_cct_NetworkConnectionInfo, network_type, network_type, &firebase_firelog_cct_NetworkConnectionInfo_network_type_default), - PB_FIELD( 2, UENUM , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_NetworkConnectionInfo, mobile_subtype, network_type, &firebase_firelog_cct_NetworkConnectionInfo_mobile_subtype_default), - PB_LAST_FIELD -}; - -const pb_field_t firebase_firelog_cct_IosClientInfo_fields[9] = { - PB_FIELD( 3, BYTES , OPTIONAL, POINTER , FIRST, firebase_firelog_cct_IosClientInfo, os_major_version, os_major_version, 0), - PB_FIELD( 4, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, os_full_version, os_major_version, 0), - PB_FIELD( 5, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, application_build, os_full_version, 0), - PB_FIELD( 6, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, country, application_build, 0), - PB_FIELD( 7, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, model, country, 0), - PB_FIELD( 8, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, language_code, model, 0), - PB_FIELD( 11, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, application_bundle_id, language_code, 0), - PB_FIELD( 12, BYTES , OPTIONAL, POINTER , OTHER, firebase_firelog_cct_IosClientInfo, application_version, application_bundle_id, 0), - PB_LAST_FIELD -}; - -const pb_field_t firebase_firelog_cct_ClientInfo_fields[3] = { - PB_FIELD( 1, UENUM , OPTIONAL, STATIC , FIRST, firebase_firelog_cct_ClientInfo, client_type, client_type, 0), - PB_FIELD( 4, MESSAGE , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_ClientInfo, ios_client_info, client_type, &firebase_firelog_cct_IosClientInfo_fields), - PB_LAST_FIELD -}; - -const pb_field_t firebase_firelog_cct_BatchedLogRequest_fields[2] = { - PB_FIELD( 1, MESSAGE , REPEATED, POINTER , FIRST, firebase_firelog_cct_BatchedLogRequest, log_request, log_request, &firebase_firelog_cct_LogRequest_fields), - PB_LAST_FIELD -}; - -const pb_field_t firebase_firelog_cct_LogRequest_fields[8] = { - PB_FIELD( 1, MESSAGE , OPTIONAL, STATIC , FIRST, firebase_firelog_cct_LogRequest, client_info, client_info, &firebase_firelog_cct_ClientInfo_fields), - PB_FIELD( 2, INT32 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogRequest, log_source, client_info, 0), - PB_FIELD( 3, MESSAGE , REPEATED, POINTER , OTHER, firebase_firelog_cct_LogRequest, log_event, log_source, &firebase_firelog_cct_LogEvent_fields), - PB_FIELD( 4, INT64 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogRequest, request_time_ms, log_event, 0), - PB_FIELD( 5, BYTES , REPEATED, POINTER , OTHER, firebase_firelog_cct_LogRequest, serialized_log_events, request_time_ms, 0), - PB_FIELD( 8, INT64 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogRequest, request_uptime_ms, serialized_log_events, 0), - PB_FIELD( 9, UENUM , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogRequest, qos_tier, request_uptime_ms, &firebase_firelog_cct_LogRequest_qos_tier_default), - PB_LAST_FIELD -}; - -const pb_field_t firebase_firelog_cct_QosTierConfiguration_fields[4] = { - PB_FIELD( 1, BYTES , OPTIONAL, POINTER , FIRST, firebase_firelog_cct_QosTierConfiguration, log_source_name, log_source_name, 0), - PB_FIELD( 2, UENUM , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_QosTierConfiguration, qos_tier, log_source_name, 0), - PB_FIELD( 3, INT32 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_QosTierConfiguration, log_source, qos_tier, &firebase_firelog_cct_QosTierConfiguration_log_source_default), - PB_LAST_FIELD -}; - -const pb_field_t firebase_firelog_cct_QosTiersOverride_fields[3] = { - PB_FIELD( 1, MESSAGE , REPEATED, POINTER , FIRST, firebase_firelog_cct_QosTiersOverride, qos_tier_configuration, qos_tier_configuration, &firebase_firelog_cct_QosTierConfiguration_fields), - PB_FIELD( 2, INT64 , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_QosTiersOverride, qos_tier_fingerprint, qos_tier_configuration, 0), - PB_LAST_FIELD -}; - -const pb_field_t firebase_firelog_cct_LogResponse_fields[3] = { - PB_FIELD( 1, INT64 , OPTIONAL, STATIC , FIRST, firebase_firelog_cct_LogResponse, next_request_wait_millis, next_request_wait_millis, 0), - PB_FIELD( 3, MESSAGE , OPTIONAL, STATIC , OTHER, firebase_firelog_cct_LogResponse, qos_tier, next_request_wait_millis, &firebase_firelog_cct_QosTiersOverride_fields), - PB_LAST_FIELD -}; - - - - - - -/* Check that field information fits in pb_field_t */ -#if !defined(PB_FIELD_32BIT) -/* If you get an error here, it means that you need to define PB_FIELD_32BIT - * compile-time option. You can do that in pb.h or on compiler command line. - * - * The reason you need to do this is that some of your messages contain tag - * numbers or field sizes that are larger than what can fit in 8 or 16 bit - * field descriptors. - */ -PB_STATIC_ASSERT((pb_membersize(firebase_firelog_cct_LogEvent, network_connection_info) < 65536 && pb_membersize(firebase_firelog_cct_ClientInfo, ios_client_info) < 65536 && pb_membersize(firebase_firelog_cct_LogRequest, client_info) < 65536 && pb_membersize(firebase_firelog_cct_LogResponse, qos_tier) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_firebase_firelog_cct_LogEvent_firebase_firelog_cct_NetworkConnectionInfo_firebase_firelog_cct_IosClientInfo_firebase_firelog_cct_ClientInfo_firebase_firelog_cct_BatchedLogRequest_firebase_firelog_cct_LogRequest_firebase_firelog_cct_QosTierConfiguration_firebase_firelog_cct_QosTiersOverride_firebase_firelog_cct_LogResponse) -#endif - -#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) -/* If you get an error here, it means that you need to define PB_FIELD_16BIT - * compile-time option. You can do that in pb.h or on compiler command line. - * - * The reason you need to do this is that some of your messages contain tag - * numbers or field sizes that are larger than what can fit in the default - * 8 bit descriptors. - */ -PB_STATIC_ASSERT((pb_membersize(firebase_firelog_cct_LogEvent, network_connection_info) < 256 && pb_membersize(firebase_firelog_cct_ClientInfo, ios_client_info) < 256 && pb_membersize(firebase_firelog_cct_LogRequest, client_info) < 256 && pb_membersize(firebase_firelog_cct_LogResponse, qos_tier) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_firebase_firelog_cct_LogEvent_firebase_firelog_cct_NetworkConnectionInfo_firebase_firelog_cct_IosClientInfo_firebase_firelog_cct_ClientInfo_firebase_firelog_cct_BatchedLogRequest_firebase_firelog_cct_LogRequest_firebase_firelog_cct_QosTierConfiguration_firebase_firelog_cct_QosTiersOverride_firebase_firelog_cct_LogResponse) -#endif - -/* @@protoc_insertion_point(eof) */