From 4c9df5a6661e12d6b3d11f69746ff256f0526653 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Fri, 6 Jul 2018 20:46:00 +0200 Subject: Add spec test support for target-scoped resume tokens (#1498) --- Firestore/Example/Tests/SpecTests/FSTSpecTests.mm | 63 +++++++++++++---------- 1 file changed, 36 insertions(+), 27 deletions(-) (limited to 'Firestore/Example/Tests/SpecTests/FSTSpecTests.mm') diff --git a/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm b/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm index c131f7e..7fe6434 100644 --- a/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm +++ b/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm @@ -194,25 +194,25 @@ static NSString *const kNoIOSTag = @"no-ios"; [self.driver writeUserMutation:FSTTestDeleteMutation(key)]; } -- (void)doWatchAck:(NSArray *)ackedTargets snapshot:(NSNumber *)watchSnapshot { +- (void)doWatchAck:(NSArray *)ackedTargets { FSTWatchTargetChange *change = [FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateAdded targetIDs:ackedTargets cause:nil]; - [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]]; + [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()]; } -- (void)doWatchCurrent:(NSArray *)currentSpec snapshot:(NSNumber *)watchSnapshot { +- (void)doWatchCurrent:(NSArray *)currentSpec { NSArray *currentTargets = currentSpec[0]; NSData *resumeToken = [currentSpec[1] dataUsingEncoding:NSUTF8StringEncoding]; FSTWatchTargetChange *change = [FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateCurrent targetIDs:currentTargets resumeToken:resumeToken]; - [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]]; + [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()]; } -- (void)doWatchRemove:(NSDictionary *)watchRemoveSpec snapshot:(NSNumber *)watchSnapshot { +- (void)doWatchRemove:(NSDictionary *)watchRemoveSpec { NSError *error = nil; NSDictionary *cause = watchRemoveSpec[@"cause"]; if (cause) { @@ -226,19 +226,16 @@ static NSString *const kNoIOSTag = @"no-ios"; [FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateRemoved targetIDs:watchRemoveSpec[@"targetIds"] cause:error]; - [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]]; + [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()]; // Unlike web, the FSTMockDatastore detects a watch removal with cause and will remove active // targets } -- (void)doWatchEntity:(NSDictionary *)watchEntity snapshot:(NSNumber *_Nullable)watchSnapshot { +- (void)doWatchEntity:(NSDictionary *)watchEntity { if (watchEntity[@"docs"]) { HARD_ASSERT(!watchEntity[@"doc"], "Exactly one of |doc| or |docs| needs to be set."); - int count = 0; NSArray *docs = watchEntity[@"docs"]; for (NSDictionary *doc in docs) { - count++; - bool isLast = (count == docs.count); NSMutableDictionary *watchSpec = [NSMutableDictionary dictionary]; watchSpec[@"doc"] = doc; if (watchEntity[@"targets"]) { @@ -247,11 +244,7 @@ static NSString *const kNoIOSTag = @"no-ios"; if (watchEntity[@"removedTargets"]) { watchSpec[@"removedTargets"] = watchEntity[@"removedTargets"]; } - NSNumber *_Nullable version = nil; - if (isLast) { - version = watchSnapshot; - } - [self doWatchEntity:watchSpec snapshot:version]; + [self doWatchEntity:watchSpec]; } } else if (watchEntity[@"doc"]) { NSArray *docSpec = watchEntity[@"doc"]; @@ -270,7 +263,7 @@ static NSString *const kNoIOSTag = @"no-ios"; removedTargetIDs:watchEntity[@"removedTargets"] documentKey:doc.key document:doc]; - [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]]; + [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()]; } else if (watchEntity[@"key"]) { FSTDocumentKey *docKey = FSTTestDocKey(watchEntity[@"key"]); FSTWatchChange *change = @@ -278,13 +271,13 @@ static NSString *const kNoIOSTag = @"no-ios"; removedTargetIDs:watchEntity[@"removedTargets"] documentKey:docKey document:nil]; - [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]]; + [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()]; } else { HARD_FAIL("Either key, doc or docs must be set."); } } -- (void)doWatchFilter:(NSArray *)watchFilter snapshot:(NSNumber *_Nullable)watchSnapshot { +- (void)doWatchFilter:(NSArray *)watchFilter { NSArray *targets = watchFilter[0]; HARD_ASSERT(targets.count == 1, "ExistenceFilters currently support exactly one target only."); @@ -294,15 +287,29 @@ static NSString *const kNoIOSTag = @"no-ios"; FSTExistenceFilter *filter = [FSTExistenceFilter filterWithCount:keyCount]; FSTExistenceFilterWatchChange *change = [FSTExistenceFilterWatchChange changeWithFilter:filter targetID:targets[0].intValue]; - [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]]; + [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()]; } -- (void)doWatchReset:(NSArray *)watchReset snapshot:(NSNumber *_Nullable)watchSnapshot { +- (void)doWatchReset:(NSArray *)watchReset { FSTWatchTargetChange *change = [FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateReset targetIDs:watchReset cause:nil]; - [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]]; + [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()]; +} + +- (void)doWatchSnapshot:(NSDictionary *)watchSnapshot { + // The client will only respond to watchSnapshots if they are on a target change with an empty + // set of target IDs. + NSArray *targetIDs = + watchSnapshot[@"targetIds"] ? watchSnapshot[@"targetIds"] : [NSArray array]; + NSData *resumeToken = [watchSnapshot[@"resumeToken"] dataUsingEncoding:NSUTF8StringEncoding]; + FSTWatchTargetChange *change = + [FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateNoChange + targetIDs:targetIDs + resumeToken:resumeToken]; + [self.driver receiveWatchChange:change + snapshotVersion:[self parseVersion:watchSnapshot[@"version"]]]; } - (void)doWatchStreamClose:(NSDictionary *)closeSpec { @@ -415,17 +422,19 @@ static NSString *const kNoIOSTag = @"no-ios"; } else if (step[@"userDelete"]) { [self doDelete:step[@"userDelete"]]; } else if (step[@"watchAck"]) { - [self doWatchAck:step[@"watchAck"] snapshot:step[@"watchSnapshot"]]; + [self doWatchAck:step[@"watchAck"]]; } else if (step[@"watchCurrent"]) { - [self doWatchCurrent:step[@"watchCurrent"] snapshot:step[@"watchSnapshot"]]; + [self doWatchCurrent:step[@"watchCurrent"]]; } else if (step[@"watchRemove"]) { - [self doWatchRemove:step[@"watchRemove"] snapshot:step[@"watchSnapshot"]]; + [self doWatchRemove:step[@"watchRemove"]]; } else if (step[@"watchEntity"]) { - [self doWatchEntity:step[@"watchEntity"] snapshot:step[@"watchSnapshot"]]; + [self doWatchEntity:step[@"watchEntity"]]; } else if (step[@"watchFilter"]) { - [self doWatchFilter:step[@"watchFilter"] snapshot:step[@"watchSnapshot"]]; + [self doWatchFilter:step[@"watchFilter"]]; } else if (step[@"watchReset"]) { - [self doWatchReset:step[@"watchReset"] snapshot:step[@"watchSnapshot"]]; + [self doWatchReset:step[@"watchReset"]]; + } else if (step[@"watchSnapshot"]) { + [self doWatchSnapshot:step[@"watchSnapshot"]]; } else if (step[@"watchStreamClose"]) { [self doWatchStreamClose:step[@"watchStreamClose"]]; } else if (step[@"watchProto"]) { -- cgit v1.2.3