Skip to content

Commit c5afe85

Browse files
paulb777mikehaney24
authored andcommitted
Build GDT for Catalyst (#3525)
* Build GDT for Catalyst * wip * Fix GDT tests for Catalyst * style
1 parent 935a515 commit c5afe85

File tree

6 files changed

+148
-27
lines changed

6 files changed

+148
-27
lines changed

GoogleDataTransport/GDTLibrary/GDTStorage.m

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,16 @@ - (void)storeEvent:(GDTEvent *)event {
111111

112112
// If running in the background, save state to disk and end the associated background task.
113113
if (bgID != GDTBackgroundIdentifierInvalid) {
114-
[NSKeyedArchiver archiveRootObject:self toFile:[GDTStorage archivePath]];
114+
if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
115+
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self
116+
requiringSecureCoding:YES
117+
error:nil];
118+
[data writeToFile:[GDTStorage archivePath] atomically:YES];
119+
} else {
120+
#if !defined(TARGET_OS_MACCATALYST)
121+
[NSKeyedArchiver archiveRootObject:self toFile:[GDTStorage archivePath]];
122+
#endif
123+
}
115124
[[GDTApplication sharedApplication] endBackgroundTask:bgID];
116125
}
117126
});
@@ -193,13 +202,29 @@ - (void)addEventToTrackingCollections:(GDTStoredEvent *)event {
193202
#pragma mark - GDTLifecycleProtocol
194203

195204
- (void)appWillForeground:(GDTApplication *)app {
196-
[NSKeyedUnarchiver unarchiveObjectWithFile:[GDTStorage archivePath]];
205+
if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
206+
NSData *data = [NSData dataWithContentsOfFile:[GDTStorage archivePath]];
207+
[NSKeyedUnarchiver unarchivedObjectOfClass:[GDTStorage class] fromData:data error:nil];
208+
} else {
209+
#if !defined(TARGET_OS_MACCATALYST)
210+
[NSKeyedUnarchiver unarchiveObjectWithFile:[GDTStorage archivePath]];
211+
#endif
212+
}
197213
self->_runningInBackground = NO;
198214
}
199215

200216
- (void)appWillBackground:(GDTApplication *)app {
201217
self->_runningInBackground = YES;
202-
[NSKeyedArchiver archiveRootObject:self toFile:[GDTStorage archivePath]];
218+
if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
219+
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self
220+
requiringSecureCoding:YES
221+
error:nil];
222+
[data writeToFile:[GDTStorage archivePath] atomically:YES];
223+
} else {
224+
#if !defined(TARGET_OS_MACCATALYST)
225+
[NSKeyedArchiver archiveRootObject:self toFile:[GDTStorage archivePath]];
226+
#endif
227+
}
203228
// Create an immediate background task to run until the end of the current queue of work.
204229
__block GDTBackgroundIdentifier bgID = [app beginBackgroundTaskWithExpirationHandler:^{
205230
[app endBackgroundTask:bgID];
@@ -210,7 +235,16 @@ - (void)appWillBackground:(GDTApplication *)app {
210235
}
211236

212237
- (void)appWillTerminate:(GDTApplication *)application {
213-
[NSKeyedArchiver archiveRootObject:self toFile:[GDTStorage archivePath]];
238+
if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
239+
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self
240+
requiringSecureCoding:YES
241+
error:nil];
242+
[data writeToFile:[GDTStorage archivePath] atomically:YES];
243+
} else {
244+
#if !defined(TARGET_OS_MACCATALYST)
245+
[NSKeyedArchiver archiveRootObject:self toFile:[GDTStorage archivePath]];
246+
#endif
247+
}
214248
}
215249

216250
#pragma mark - NSSecureCoding
@@ -232,11 +266,14 @@ - (instancetype)initWithCoder:(NSCoder *)aDecoder {
232266
// Create the singleton and populate its ivars.
233267
GDTStorage *sharedInstance = [self.class sharedInstance];
234268
dispatch_sync(sharedInstance.storageQueue, ^{
235-
sharedInstance->_storedEvents = [aDecoder decodeObjectOfClass:[NSMutableOrderedSet class]
236-
forKey:kGDTStorageStoredEventsKey];
269+
NSSet *classes =
270+
[NSSet setWithObjects:[NSMutableOrderedSet class], [GDTStoredEvent class], nil];
271+
sharedInstance->_storedEvents = [aDecoder decodeObjectOfClasses:classes
272+
forKey:kGDTStorageStoredEventsKey];
273+
classes = [NSSet setWithObjects:[NSMutableDictionary class], [NSMutableSet class],
274+
[GDTStoredEvent class], nil];
237275
sharedInstance->_targetToEventSet =
238-
[aDecoder decodeObjectOfClass:[NSMutableDictionary class]
239-
forKey:kGDTStorageTargetToEventSetKey];
276+
[aDecoder decodeObjectOfClasses:classes forKey:kGDTStorageTargetToEventSetKey];
240277
sharedInstance->_uploadCoordinator =
241278
[aDecoder decodeObjectOfClass:[GDTUploadCoordinator class]
242279
forKey:kGDTStorageUploadCoordinatorKey];

GoogleDataTransport/GDTLibrary/GDTUploadPackage.m

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#import <GoogleDataTransport/GDTClock.h>
2020
#import <GoogleDataTransport/GDTConsoleLogger.h>
21+
#import <GoogleDataTransport/GDTStoredEvent.h>
2122

2223
#import "GDTLibrary/Private/GDTStorage_Private.h"
2324
#import "GDTLibrary/Private/GDTUploadCoordinator.h"
@@ -140,11 +141,12 @@ - (nullable instancetype)initWithCoder:(nonnull NSCoder *)aDecoder {
140141
GDTTarget target = [aDecoder decodeIntegerForKey:kTargetKey];
141142
self = [self initWithTarget:target];
142143
if (self) {
143-
_events = [aDecoder decodeObjectOfClass:[NSSet class] forKey:kEventsKey];
144+
NSSet *classes = [NSSet setWithObjects:[NSSet class], [GDTStoredEvent class], nil];
145+
_events = [aDecoder decodeObjectOfClasses:classes forKey:kEventsKey];
144146
_deliverByTime = [aDecoder decodeObjectOfClass:[GDTClock class] forKey:kDeliverByTimeKey];
145147
_isHandled = [aDecoder decodeBoolForKey:kIsHandledKey];
146-
// Isn't technically NSSecureCoding, because we don't know the class of this object.
147-
_handler = [aDecoder decodeObjectForKey:kHandlerKey];
148+
// _handler isn't technically NSSecureCoding, because we don't know the class of this object.
149+
// but it gets decoded anyway.
148150
}
149151
return self;
150152
}

GoogleDataTransport/GDTTests/Unit/GDTClockTest.m

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,20 @@ - (void)testSupportsSecureEncoding {
5151
/** Tests encoding and decoding a clock using a keyed archiver. */
5252
- (void)testEncoding {
5353
GDTClock *clock = [GDTClock snapshot];
54-
NSData *clockData = [NSKeyedArchiver archivedDataWithRootObject:clock];
55-
GDTClock *unarchivedClock = [NSKeyedUnarchiver unarchiveObjectWithData:clockData];
54+
GDTClock *unarchivedClock;
55+
if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
56+
NSData *clockData = [NSKeyedArchiver archivedDataWithRootObject:clock
57+
requiringSecureCoding:YES
58+
error:nil];
59+
unarchivedClock = [NSKeyedUnarchiver unarchivedObjectOfClass:[GDTClock class]
60+
fromData:clockData
61+
error:nil];
62+
} else {
63+
#if !defined(TARGET_OS_MACCATALYST)
64+
NSData *clockData = [NSKeyedArchiver archivedDataWithRootObject:clock];
65+
unarchivedClock = [NSKeyedUnarchiver unarchiveObjectWithData:clockData];
66+
#endif
67+
}
5668
XCTAssertEqual([clock hash], [unarchivedClock hash]);
5769
XCTAssertEqualObjects(clock, unarchivedClock);
5870
}

GoogleDataTransport/GDTTests/Unit/GDTEventTest.m

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,28 @@ - (void)testArchiving {
4343
event.qosTier = GDTEventQoSTelemetry;
4444
event.clockSnapshot = clockSnapshot;
4545

46-
NSData *archiveData = [NSKeyedArchiver archivedDataWithRootObject:event];
47-
46+
NSData *archiveData;
47+
if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
48+
archiveData = [NSKeyedArchiver archivedDataWithRootObject:event
49+
requiringSecureCoding:YES
50+
error:nil];
51+
} else {
52+
#if !defined(TARGET_OS_MACCATALYST)
53+
archiveData = [NSKeyedArchiver archivedDataWithRootObject:event];
54+
#endif
55+
}
4856
// To ensure that all the objects being retained by the original event are dealloc'd.
4957
event = nil;
50-
51-
GDTEvent *decodedEvent = [NSKeyedUnarchiver unarchiveObjectWithData:archiveData];
58+
GDTEvent *decodedEvent;
59+
if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
60+
decodedEvent = [NSKeyedUnarchiver unarchivedObjectOfClass:[GDTEvent class]
61+
fromData:archiveData
62+
error:nil];
63+
} else {
64+
#if !defined(TARGET_OS_MACCATALYST)
65+
decodedEvent = [NSKeyedUnarchiver unarchiveObjectWithData:archiveData];
66+
#endif
67+
}
5268
XCTAssertEqualObjects(decodedEvent.mappingID, @"testID");
5369
XCTAssertEqual(decodedEvent.target, 42);
5470
XCTAssertEqualObjects(decodedEvent.dataObjectTransportBytes,

GoogleDataTransport/GDTTests/Unit/GDTStorageTest.m

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ - (void)testStoreEvent {
8383
@autoreleasepool {
8484
GDTEvent *event = [[GDTEvent alloc] initWithMappingID:@"404" target:target];
8585
event.dataObjectTransportBytes = [@"testString" dataUsingEncoding:NSUTF8StringEncoding];
86+
event.clockSnapshot = [GDTClock snapshot];
8687
XCTAssertNoThrow([[GDTStorage sharedInstance] storeEvent:event]);
8788
}
8889
dispatch_sync([GDTStorage sharedInstance].storageQueue, ^{
@@ -103,6 +104,7 @@ - (void)testRemoveEvent {
103104
@autoreleasepool {
104105
GDTEvent *event = [[GDTEvent alloc] initWithMappingID:@"404" target:target];
105106
event.dataObjectTransportBytes = [@"testString" dataUsingEncoding:NSUTF8StringEncoding];
107+
event.clockSnapshot = [GDTClock snapshot];
106108
XCTAssertNoThrow([[GDTStorage sharedInstance] storeEvent:event]);
107109
}
108110
__block NSURL *eventFile;
@@ -223,7 +225,7 @@ - (void)testEventDeallocationIsEnforced {
223225
GDTEvent *event = [[GDTEvent alloc] initWithMappingID:@"404" target:target];
224226
weakEvent = event;
225227
event.dataObjectTransportBytes = [@"testString" dataUsingEncoding:NSUTF8StringEncoding];
226-
228+
event.clockSnapshot = [GDTClock snapshot];
227229
// Store the event and wait for the expectation.
228230
[[GDTStorage sharedInstance] storeEvent:event];
229231
GDTDataFuture *dataFuture =
@@ -256,38 +258,75 @@ - (void)testEventDeallocationIsEnforced {
256258
- (void)testNSSecureCoding {
257259
XCTAssertTrue([GDTStorage supportsSecureCoding]);
258260
GDTEvent *event = [[GDTEvent alloc] initWithMappingID:@"404" target:target];
261+
event.clockSnapshot = [GDTClock snapshot];
259262
event.dataObjectTransportBytes = [@"testString" dataUsingEncoding:NSUTF8StringEncoding];
260263
XCTAssertNoThrow([[GDTStorage sharedInstance] storeEvent:event]);
261264
event = nil;
262-
NSData *storageData = [NSKeyedArchiver archivedDataWithRootObject:[GDTStorage sharedInstance]];
265+
NSData *storageData;
266+
if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
267+
storageData = [NSKeyedArchiver archivedDataWithRootObject:[GDTStorage sharedInstance]
268+
requiringSecureCoding:YES
269+
error:nil];
270+
} else {
271+
#if !defined(TARGET_OS_MACCATALYST)
272+
storageData = [NSKeyedArchiver archivedDataWithRootObject:[GDTStorage sharedInstance]];
273+
#endif
274+
}
263275
dispatch_sync([GDTStorage sharedInstance].storageQueue, ^{
264276
XCTAssertNotNil([[GDTStorage sharedInstance].storedEvents lastObject]);
265277
});
266278
[[GDTStorage sharedInstance] removeEvents:[GDTStorage sharedInstance].storedEvents.set];
267279
dispatch_sync([GDTStorage sharedInstance].storageQueue, ^{
268280
XCTAssertNil([[GDTStorage sharedInstance].storedEvents lastObject]);
269281
});
270-
271-
GDTStorage *unarchivedStorage = [NSKeyedUnarchiver unarchiveObjectWithData:storageData];
282+
GDTStorage *unarchivedStorage;
283+
NSError *error;
284+
if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
285+
unarchivedStorage = [NSKeyedUnarchiver unarchivedObjectOfClass:[GDTStorage class]
286+
fromData:storageData
287+
error:&error];
288+
} else {
289+
#if !defined(TARGET_OS_MACCATALYST)
290+
unarchivedStorage = [NSKeyedUnarchiver unarchiveObjectWithData:storageData];
291+
#endif
292+
}
272293
XCTAssertNotNil([unarchivedStorage.storedEvents lastObject]);
273294
}
274295

275296
/** Tests encoding and decoding the storage singleton when calling -sharedInstance. */
276297
- (void)testNSSecureCodingWithSharedInstance {
277298
GDTEvent *event = [[GDTEvent alloc] initWithMappingID:@"404" target:target];
278299
event.dataObjectTransportBytes = [@"testString" dataUsingEncoding:NSUTF8StringEncoding];
300+
event.clockSnapshot = [GDTClock snapshot];
279301
XCTAssertNoThrow([[GDTStorage sharedInstance] storeEvent:event]);
280302
event = nil;
281-
NSData *storageData = [NSKeyedArchiver archivedDataWithRootObject:[GDTStorage sharedInstance]];
303+
NSData *storageData;
304+
if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
305+
storageData = [NSKeyedArchiver archivedDataWithRootObject:[GDTStorage sharedInstance]
306+
requiringSecureCoding:YES
307+
error:nil];
308+
} else {
309+
#if !defined(TARGET_OS_MACCATALYST)
310+
storageData = [NSKeyedArchiver archivedDataWithRootObject:[GDTStorage sharedInstance]];
311+
#endif
312+
}
282313
dispatch_sync([GDTStorage sharedInstance].storageQueue, ^{
283314
XCTAssertNotNil([[GDTStorage sharedInstance].storedEvents lastObject]);
284315
});
285316
[[GDTStorage sharedInstance] removeEvents:[GDTStorage sharedInstance].storedEvents.set];
286317
dispatch_sync([GDTStorage sharedInstance].storageQueue, ^{
287318
XCTAssertNil([[GDTStorage sharedInstance].storedEvents lastObject]);
288319
});
289-
290-
GDTStorage *unarchivedStorage = [NSKeyedUnarchiver unarchiveObjectWithData:storageData];
320+
GDTStorage *unarchivedStorage;
321+
if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
322+
unarchivedStorage = [NSKeyedUnarchiver unarchivedObjectOfClass:[GDTStorage class]
323+
fromData:storageData
324+
error:nil];
325+
} else {
326+
#if !defined(TARGET_OS_MACCATALYST)
327+
unarchivedStorage = [NSKeyedUnarchiver unarchiveObjectWithData:storageData];
328+
#endif
329+
}
291330
XCTAssertNotNil([unarchivedStorage.storedEvents lastObject]);
292331
}
293332

@@ -298,6 +337,7 @@ - (void)testQoSTierFast {
298337
GDTEvent *event = [[GDTEvent alloc] initWithMappingID:@"404" target:target];
299338
event.dataObjectTransportBytes = [@"testString" dataUsingEncoding:NSUTF8StringEncoding];
300339
event.qosTier = GDTEventQoSFast;
340+
event.clockSnapshot = [GDTClock snapshot];
301341
XCTAssertFalse(self.uploaderFake.forceUploadCalled);
302342
XCTAssertNoThrow([[GDTStorage sharedInstance] storeEvent:event]);
303343
}

GoogleDataTransport/GDTTests/Unit/GDTUploadPackageTest.m

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,23 @@ - (void)testEncoding {
110110
NSMutableSet<GDTStoredEvent *> *set = [GDTEventGenerator generate3StoredEvents];
111111
uploadPackage.events = set;
112112
uploadPackage.handler = self;
113-
114-
NSData *packageData = [NSKeyedArchiver archivedDataWithRootObject:uploadPackage];
115-
GDTUploadPackage *recreatedPackage = [NSKeyedUnarchiver unarchiveObjectWithData:packageData];
113+
GDTUploadPackage *recreatedPackage;
114+
NSError *error;
115+
116+
if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
117+
NSData *packageData = [NSKeyedArchiver archivedDataWithRootObject:uploadPackage
118+
requiringSecureCoding:YES
119+
error:&error];
120+
recreatedPackage = [NSKeyedUnarchiver unarchivedObjectOfClass:[GDTUploadPackage class]
121+
fromData:packageData
122+
error:&error];
123+
XCTAssertNil(error);
124+
} else {
125+
#if !defined(TARGET_OS_MACCATALYST)
126+
NSData *packageData = [NSKeyedArchiver archivedDataWithRootObject:uploadPackage];
127+
recreatedPackage = [NSKeyedUnarchiver unarchiveObjectWithData:packageData];
128+
#endif
129+
}
116130
XCTAssertEqualObjects(uploadPackage, recreatedPackage);
117131
}
118132

0 commit comments

Comments
 (0)