diff --git a/Parse/Internal/Installation/InstallationIdentifierStore/PFInstallationIdentifierStore.m b/Parse/Internal/Installation/InstallationIdentifierStore/PFInstallationIdentifierStore.m index d435ecf99..f5c265ecc 100644 --- a/Parse/Internal/Installation/InstallationIdentifierStore/PFInstallationIdentifierStore.m +++ b/Parse/Internal/Installation/InstallationIdentifierStore/PFInstallationIdentifierStore.m @@ -65,9 +65,9 @@ - (BFTask *)clearInstallationIdentifierAsync { self.installationIdentifier = nil; return [[self _getPersistenceGroupAsync] continueWithSuccessBlock:^id(BFTask> *task) { id group = task.result; - return [[[group beginLockedContentAccessAsyncToDataForKey:PFInstallationIdentifierFileName] continueWithSuccessBlock:^id(BFTask *_) { + return [[[group beginLockedContentAccessAsyncToDataForKey:PFInstallationIdentifierFileName] continueWithSuccessBlock:^id(BFTask *t) { return [group removeDataAsyncForKey:PFInstallationIdentifierFileName]; - }] continueWithBlock:^id(BFTask *task) { + }] continueWithBlock:^id(BFTask *t) { return [group endLockedContentAccessAsyncToDataForKey:PFInstallationIdentifierFileName]; }]; }]; @@ -88,10 +88,10 @@ - (BFTask *)_clearCachedInstallationIdentifierAsync { - (BFTask *)_loadInstallationIdentifierAsync { return (BFTask *)[[self _getPersistenceGroupAsync] continueWithSuccessBlock:^id(BFTask> *task) { id group = task.result; - return [[[[group beginLockedContentAccessAsyncToDataForKey:PFInstallationIdentifierFileName] continueWithSuccessBlock:^id(BFTask *_) { + return [[[[[group beginLockedContentAccessAsyncToDataForKey:PFInstallationIdentifierFileName] continueWithSuccessBlock:^id(BFTask *_) { return [group getDataAsyncForKey:PFInstallationIdentifierFileName]; - }] continueWithSuccessBlock:^id(BFTask *task) { - NSData *data = task.result; + }] continueWithSuccessBlock:^id(BFTask *t) { + NSData *data = t.result; NSString *installationId = nil; if (data) { installationId = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; @@ -103,9 +103,11 @@ - (BFTask *)_clearCachedInstallationIdentifierAsync { installationId = [NSUUID UUID].UUIDString.lowercaseString; return [[group setDataAsync:[installationId dataUsingEncoding:NSUTF8StringEncoding] forKey:PFInstallationIdentifierFileName] continueWithSuccessResult:installationId]; - }] continueWithBlock:^id(BFTask *task) { + }] continueWithBlock:^id(BFTask *t) { [group endLockedContentAccessAsyncToDataForKey:PFInstallationIdentifierFileName]; - self.installationIdentifier = task.result; + return t; + }] continueWithSuccessBlock:^id _Nullable(BFTask * _Nonnull t) { + self.installationIdentifier = t.result; return self.installationIdentifier; }]; }]; diff --git a/Tests/Unit/InstallationIdentifierUnitTests.m b/Tests/Unit/InstallationIdentifierUnitTests.m index 517ac4616..d6660b2bf 100644 --- a/Tests/Unit/InstallationIdentifierUnitTests.m +++ b/Tests/Unit/InstallationIdentifierUnitTests.m @@ -7,10 +7,13 @@ * of patent rights can be found in the PATENTS file in the same directory. */ +#import + #import "PFInstallationIdentifierStore_Private.h" #import "PFUnitTestCase.h" #import "Parse_Private.h" #import "BFTask+Private.h" +#import "PFPersistenceController.h" @interface InstallationIdentifierUnitTests : PFUnitTestCase @@ -68,4 +71,28 @@ - (void)testInstallationIdentifierThreadSafe { }); } +- (void)testInstallationIdentifierPropagatesErrorOnPersistenceFailure { + id group = PFStrictProtocolMock(@protocol(PFPersistenceGroup)); + OCMStub([group beginLockedContentAccessAsyncToDataForKey:[OCMArg isNotNil]]).andReturn([BFTask taskWithResult:nil]); + OCMStub([group endLockedContentAccessAsyncToDataForKey:[OCMArg isNotNil]]).andReturn([BFTask taskWithResult:nil]); + OCMStub([group getDataAsyncForKey:[OCMArg isNotNil]]).andReturn([BFTask taskWithResult:nil]); + OCMStub([group setDataAsync:[OCMArg isNotNil] forKey:[OCMArg isNotNil]]).andReturn([BFTask taskWithError:[[NSError alloc] init]]); + + PFPersistenceController *persistenceController = PFStrictClassMock([PFPersistenceController class]); + OCMStub([persistenceController getPersistenceGroupAsync]).andReturn([BFTask taskWithResult:group]); + + id dataSource = PFStrictProtocolMock(@protocol(PFPersistenceControllerProvider)); + OCMStub([dataSource persistenceController]).andReturn(persistenceController); + + PFInstallationIdentifierStore *store = [[PFInstallationIdentifierStore alloc] initWithDataSource:dataSource]; + + XCTestExpectation *expectation = [self currentSelectorTestExpectation]; + [[store getInstallationIdentifierAsync] continueWithBlock:^id _Nullable(BFTask * _Nonnull t) { + XCTAssertTrue(t.faulted); + [expectation fulfill]; + return nil; + }]; + [self waitForTestExpectations]; +} + @end