Skip to content

Commit 7f1050a

Browse files
authored
Use C++ Timestamp internally instead of FIRTimestamp (#3156)
This is yet another preparatory step to migrating FIRTimetsampValue to C++.
1 parent 6943b18 commit 7f1050a

27 files changed

+165
-115
lines changed

Firestore/Example/Tests/Integration/FSTDatastoreTests.mm

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include "absl/memory/memory.h"
5050

5151
namespace util = firebase::firestore::util;
52+
using firebase::Timestamp;
5253
using firebase::firestore::auth::EmptyCredentialsProvider;
5354
using firebase::firestore::core::DatabaseInfo;
5455
using firebase::firestore::model::BatchId;
@@ -221,7 +222,7 @@ - (void)testStreamingWrite {
221222

222223
FSTSetMutation *mutation = [self setMutation];
223224
FSTMutationBatch *batch = [[FSTMutationBatch alloc] initWithBatchID:23
224-
localWriteTime:[FIRTimestamp timestamp]
225+
localWriteTime:Timestamp::Now()
225226
baseMutations:{}
226227
mutations:{mutation}];
227228
_testWorkerQueue->Enqueue([=] {

Firestore/Example/Tests/Local/FSTLRUGarbageCollectorTests.mm

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@
2323
#include <utility>
2424
#include <vector>
2525

26-
#import "FIRTimestamp.h"
2726
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
2827
#import "Firestore/Source/Local/FSTLRUGarbageCollector.h"
2928
#import "Firestore/Source/Local/FSTPersistence.h"
3029
#import "Firestore/Source/Model/FSTDocument.h"
3130
#import "Firestore/Source/Model/FSTFieldValue.h"
3231
#import "Firestore/Source/Model/FSTMutation.h"
3332
#import "Firestore/Source/Util/FSTClasses.h"
33+
34+
#include "Firestore/core/include/firebase/firestore/timestamp.h"
3435
#include "Firestore/core/src/firebase/firestore/auth/user.h"
3536
#include "Firestore/core/src/firebase/firestore/local/mutation_queue.h"
3637
#include "Firestore/core/src/firebase/firestore/local/query_cache.h"
@@ -43,6 +44,7 @@
4344
#include "absl/strings/str_cat.h"
4445

4546
namespace testutil = firebase::firestore::testutil;
47+
using firebase::Timestamp;
4648
using firebase::firestore::auth::User;
4749
using firebase::firestore::local::LruParams;
4850
using firebase::firestore::local::LruResults;
@@ -449,7 +451,7 @@ - (void)testRemoveOrphanedDocuments {
449451
// Insert the mutations. These operations don't have a sequence number, they just
450452
// serve to keep the mutated documents from being GC'd while the mutations are outstanding.
451453
_persistence.run("actually register the mutations", [&]() {
452-
FIRTimestamp *writeTime = [FIRTimestamp timestamp];
454+
Timestamp writeTime = Timestamp::Now();
453455
_mutationQueue->AddMutationBatch(writeTime, {}, std::move(mutations));
454456
});
455457

Firestore/Example/Tests/Local/FSTLocalSerializerTests.mm

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,15 @@
4141

4242
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
4343

44+
#include "Firestore/core/include/firebase/firestore/timestamp.h"
4445
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
4546
#include "Firestore/core/src/firebase/firestore/model/field_mask.h"
4647
#include "Firestore/core/src/firebase/firestore/model/precondition.h"
4748
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
4849
#include "Firestore/core/test/firebase/firestore/testutil/testutil.h"
4950

5051
namespace testutil = firebase::firestore::testutil;
52+
using firebase::Timestamp;
5153
using firebase::firestore::model::DatabaseId;
5254
using firebase::firestore::model::FieldMask;
5355
using firebase::firestore::model::Precondition;
@@ -90,7 +92,7 @@ - (void)testEncodesMutationBatch {
9092
value:FSTTestObjectValue(@{@"a" : @"b", @"num" : @1})
9193
precondition:Precondition::Exists(true)];
9294
FSTMutation *del = FSTTestDeleteMutation(@"baz/quux");
93-
FIRTimestamp *writeTime = [FIRTimestamp timestamp];
95+
Timestamp writeTime = Timestamp::Now();
9496
FSTMutationBatch *model = [[FSTMutationBatch alloc] initWithBatchID:42
9597
localWriteTime:writeTime
9698
baseMutations:{base}
@@ -124,8 +126,8 @@ - (void)testEncodesMutationBatch {
124126
delProto.delete_p = @"projects/p/databases/d/documents/baz/quux";
125127

126128
GPBTimestamp *writeTimeProto = [GPBTimestamp message];
127-
writeTimeProto.seconds = writeTime.seconds;
128-
writeTimeProto.nanos = writeTime.nanoseconds;
129+
writeTimeProto.seconds = writeTime.seconds();
130+
writeTimeProto.nanos = writeTime.nanoseconds();
129131

130132
FSTPBWriteBatch *batchProto = [FSTPBWriteBatch message];
131133
batchProto.batchId = 42;
@@ -136,7 +138,7 @@ - (void)testEncodesMutationBatch {
136138
XCTAssertEqualObjects([self.serializer encodedMutationBatch:model], batchProto);
137139
FSTMutationBatch *decoded = [self.serializer decodedMutationBatch:batchProto];
138140
XCTAssertEqual(decoded.batchID, model.batchID);
139-
XCTAssertEqualObjects(decoded.localWriteTime, model.localWriteTime);
141+
XCTAssertEqual(decoded.localWriteTime, model.localWriteTime);
140142
FSTAssertEqualVectors(decoded.baseMutations, model.baseMutations);
141143
FSTAssertEqualVectors(decoded.mutations, model.mutations);
142144
XCTAssertEqual([decoded keys], [model keys]);

Firestore/Example/Tests/Local/FSTLocalStoreTests.mm

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#import "Firestore/third_party/Immutable/Tests/FSTImmutableSortedDictionary+Testing.h"
3838
#import "Firestore/third_party/Immutable/Tests/FSTImmutableSortedSet+Testing.h"
3939

40+
#include "Firestore/core/include/firebase/firestore/timestamp.h"
4041
#include "Firestore/core/src/firebase/firestore/auth/user.h"
4142
#include "Firestore/core/src/firebase/firestore/model/document_map.h"
4243
#include "Firestore/core/src/firebase/firestore/model/document_set.h"
@@ -46,6 +47,7 @@
4647
#include "Firestore/core/test/firebase/firestore/testutil/testutil.h"
4748

4849
namespace testutil = firebase::firestore::testutil;
50+
using firebase::Timestamp;
4951
using firebase::firestore::auth::User;
5052
using firebase::firestore::model::DocumentKey;
5153
using firebase::firestore::model::DocumentKeySet;
@@ -134,7 +136,7 @@ - (void)writeMutations:(std::vector<FSTMutation *> &&)mutations {
134136
FSTLocalWriteResult *result = [self.localStore locallyWriteMutations:std::move(mutationsCopy)];
135137
XCTAssertNotNil(result);
136138
[self.batches addObject:[[FSTMutationBatch alloc] initWithBatchID:result.batchID
137-
localWriteTime:[FIRTimestamp timestamp]
139+
localWriteTime:Timestamp::Now()
138140
baseMutations:{}
139141
mutations:std::move(mutations)]];
140142
_lastChanges = result.changes;
@@ -237,7 +239,7 @@ - (void)testMutationBatchKeys {
237239
FSTMutation *set1 = FSTTestSetMutation(@"foo/bar", @{@"foo" : @"bar"});
238240
FSTMutation *set2 = FSTTestSetMutation(@"bar/baz", @{@"bar" : @"baz"});
239241
FSTMutationBatch *batch = [[FSTMutationBatch alloc] initWithBatchID:1
240-
localWriteTime:[FIRTimestamp timestamp]
242+
localWriteTime:Timestamp::Now()
241243
baseMutations:{base}
242244
mutations:{set1, set2}];
243245
DocumentKeySet keys = [batch keys];

Firestore/Example/Tests/Local/FSTMutationQueueTests.mm

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "Firestore/core/test/firebase/firestore/testutil/testutil.h"
3737

3838
namespace testutil = firebase::firestore::testutil;
39+
using firebase::Timestamp;
3940
using firebase::firestore::auth::User;
4041
using firebase::firestore::model::DocumentKey;
4142
using firebase::firestore::model::DocumentKeySet;
@@ -201,7 +202,7 @@ - (void)testAllMutationBatchesAffectingDocumentKey {
201202
NSMutableArray<FSTMutationBatch *> *batches = [NSMutableArray array];
202203
for (FSTMutation *mutation in mutations) {
203204
FSTMutationBatch *batch =
204-
self.mutationQueue->AddMutationBatch([FIRTimestamp timestamp], {}, {mutation});
205+
self.mutationQueue->AddMutationBatch(Timestamp::Now(), {}, {mutation});
205206
[batches addObject:batch];
206207
}
207208

@@ -228,7 +229,7 @@ - (void)testAllMutationBatchesAffectingDocumentKeys {
228229
NSMutableArray<FSTMutationBatch *> *batches = [NSMutableArray array];
229230
for (FSTMutation *mutation in mutations) {
230231
FSTMutationBatch *batch =
231-
self.mutationQueue->AddMutationBatch([FIRTimestamp timestamp], {}, {mutation});
232+
self.mutationQueue->AddMutationBatch(Timestamp::Now(), {}, {mutation});
232233
[batches addObject:batch];
233234
}
234235

@@ -254,16 +255,16 @@ - (void)testAllMutationBatchesAffectingDocumentKeys_handlesOverlap {
254255
FSTTestSetMutation(@"foo/baz", @{@"a" : @1}),
255256
};
256257
FSTMutationBatch *batch1 =
257-
self.mutationQueue->AddMutationBatch([FIRTimestamp timestamp], {}, std::move(group1));
258+
self.mutationQueue->AddMutationBatch(Timestamp::Now(), {}, std::move(group1));
258259

259260
std::vector<FSTMutation *> group2 = {FSTTestSetMutation(@"food/bar", @{@"a" : @1})};
260-
self.mutationQueue->AddMutationBatch([FIRTimestamp timestamp], {}, std::move(group2));
261+
self.mutationQueue->AddMutationBatch(Timestamp::Now(), {}, std::move(group2));
261262

262263
std::vector<FSTMutation *> group3 = {
263264
FSTTestSetMutation(@"foo/bar", @{@"b" : @1}),
264265
};
265266
FSTMutationBatch *batch3 =
266-
self.mutationQueue->AddMutationBatch([FIRTimestamp timestamp], {}, std::move(group3));
267+
self.mutationQueue->AddMutationBatch(Timestamp::Now(), {}, std::move(group3));
267268

268269
DocumentKeySet keys{
269270
Key("foo/bar"),
@@ -293,7 +294,7 @@ - (void)testAllMutationBatchesAffectingQuery {
293294
NSMutableArray<FSTMutationBatch *> *batches = [NSMutableArray array];
294295
for (FSTMutation *mutation in mutations) {
295296
FSTMutationBatch *batch =
296-
self.mutationQueue->AddMutationBatch([FIRTimestamp timestamp], {}, {mutation});
297+
self.mutationQueue->AddMutationBatch(Timestamp::Now(), {}, {mutation});
297298
[batches addObject:batch];
298299
}
299300

@@ -396,8 +397,7 @@ - (FSTMutationBatch *)addMutationBatch {
396397
- (FSTMutationBatch *)addMutationBatchWithKey:(NSString *)key {
397398
FSTSetMutation *mutation = FSTTestSetMutation(key, @{@"a" : @1});
398399

399-
FSTMutationBatch *batch =
400-
self.mutationQueue->AddMutationBatch([FIRTimestamp timestamp], {}, {mutation});
400+
FSTMutationBatch *batch = self.mutationQueue->AddMutationBatch(Timestamp::Now(), {}, {mutation});
401401
return batch;
402402
}
403403

Firestore/Example/Tests/Model/FSTFieldValueTests.mm

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#import "Firestore/Source/API/FIRFirestore+Internal.h"
2424
#import "Firestore/Source/API/FSTUserDataConverter.h"
25+
#import "Firestore/Source/API/converters.h"
2526

2627
#import "Firestore/Example/Tests/API/FSTAPIHelpers.h"
2728
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
@@ -31,10 +32,12 @@
3132
#include "Firestore/core/src/firebase/firestore/model/field_value.h"
3233
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
3334
#include "Firestore/core/test/firebase/firestore/testutil/testutil.h"
35+
#include "Firestore/core/test/firebase/firestore/testutil/time_testing.h"
3436

3537
namespace testutil = firebase::firestore::testutil;
3638
namespace util = firebase::firestore::util;
3739
using firebase::firestore::GeoPoint;
40+
using firebase::firestore::api::MakeTimestamp;
3841
using firebase::firestore::model::DatabaseId;
3942
using firebase::firestore::model::FieldValue;
4043

@@ -49,11 +52,11 @@
4952
// strings that can be used instead.
5053
if ([value isEqual:@"server-timestamp-1"]) {
5154
wrappedValue = [FSTServerTimestampValue
52-
serverTimestampValueWithLocalWriteTime:FSTTestTimestamp(2016, 5, 20, 10, 20, 0)
55+
serverTimestampValueWithLocalWriteTime:testutil::MakeTimestamp(2016, 5, 20, 10, 20, 0)
5356
previousValue:nil];
5457
} else if ([value isEqual:@"server-timestamp-2"]) {
5558
wrappedValue = [FSTServerTimestampValue
56-
serverTimestampValueWithLocalWriteTime:FSTTestTimestamp(2016, 10, 21, 15, 32, 0)
59+
serverTimestampValueWithLocalWriteTime:testutil::MakeTimestamp(2016, 10, 21, 15, 32, 0)
5760
previousValue:nil];
5861
} else if ([value isKindOfClass:[FSTDocumentKeyReference class]]) {
5962
// We directly convert these here so that the databaseIDs can be different.
@@ -304,23 +307,17 @@ - (void)testValueEquality {
304307
@[ FSTTestFieldValue(@"strin") ],
305308
@[ FSTTestFieldValue(@"e\u0301b") ], // latin small letter e + combining acute accent
306309
@[ FSTTestFieldValue(@"\u00e9a") ], // latin small letter e with acute accent
307-
@[
308-
FSTTestFieldValue(date1),
309-
[FSTTimestampValue timestampValue:[FIRTimestamp timestampWithDate:date1]]
310-
],
310+
@[ FSTTestFieldValue(date1), [FSTTimestampValue timestampValue:MakeTimestamp(date1)] ],
311311
@[ FSTTestFieldValue(date2) ],
312312
@[
313313
// NOTE: ServerTimestampValues can't be parsed via FSTTestFieldValue().
314-
[FSTServerTimestampValue
315-
serverTimestampValueWithLocalWriteTime:[FIRTimestamp timestampWithDate:date1]
316-
previousValue:nil],
317-
[FSTServerTimestampValue
318-
serverTimestampValueWithLocalWriteTime:[FIRTimestamp timestampWithDate:date1]
319-
previousValue:nil]
314+
[FSTServerTimestampValue serverTimestampValueWithLocalWriteTime:MakeTimestamp(date1)
315+
previousValue:nil],
316+
[FSTServerTimestampValue serverTimestampValueWithLocalWriteTime:MakeTimestamp(date1)
317+
previousValue:nil]
320318
],
321-
@[ [FSTServerTimestampValue
322-
serverTimestampValueWithLocalWriteTime:[FIRTimestamp timestampWithDate:date2]
323-
previousValue:nil] ],
319+
@[ [FSTServerTimestampValue serverTimestampValueWithLocalWriteTime:MakeTimestamp(date2)
320+
previousValue:nil] ],
324321
@[ FSTTestFieldValue(FSTTestGeoPoint(0, 1)), FieldValue::FromGeoPoint(GeoPoint(0, 1)).Wrap() ],
325322
@[ FSTTestFieldValue(FSTTestGeoPoint(1, 0)) ],
326323
@[

Firestore/Example/Tests/Model/FSTMutationTests.mm

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@
2323
#include <vector>
2424

2525
#import "Firestore/Source/API/FIRFieldValue+Internal.h"
26+
#import "Firestore/Source/API/converters.h"
2627
#import "Firestore/Source/Model/FSTDocument.h"
2728
#import "Firestore/Source/Model/FSTFieldValue.h"
2829

2930
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
3031

32+
#include "Firestore/core/include/firebase/firestore/timestamp.h"
3133
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
3234
#include "Firestore/core/src/firebase/firestore/model/field_mask.h"
3335
#include "Firestore/core/src/firebase/firestore/model/field_transform.h"
@@ -36,7 +38,9 @@
3638
#include "Firestore/core/src/firebase/firestore/model/transform_operations.h"
3739
#include "Firestore/core/test/firebase/firestore/testutil/testutil.h"
3840

41+
namespace api = firebase::firestore::api;
3942
namespace testutil = firebase::firestore::testutil;
43+
using firebase::Timestamp;
4044
using firebase::firestore::model::ArrayTransform;
4145
using firebase::firestore::model::DocumentKey;
4246
using firebase::firestore::model::FieldMask;
@@ -50,11 +54,11 @@ @interface FSTMutationTests : XCTestCase
5054
@end
5155

5256
@implementation FSTMutationTests {
53-
FIRTimestamp *_timestamp;
57+
Timestamp _timestamp;
5458
}
5559

5660
- (void)setUp {
57-
_timestamp = [FIRTimestamp timestamp];
61+
_timestamp = Timestamp::Now();
5862
}
5963

6064
- (void)testAppliesSetsToDocuments {
@@ -443,12 +447,15 @@ - (void)testAppliesServerAckedServerTimestampTransformToDocuments {
443447
initWithVersion:testutil::Version(1)
444448
transformResults:@[ [FSTTimestampValue timestampValue:_timestamp] ]];
445449

450+
FIRTimestamp *publicTimestamp = api::MakeFIRTimestamp(_timestamp);
446451
FSTMaybeDocument *transformedDoc = [transform applyToRemoteDocument:baseDoc
447452
mutationResult:mutationResult];
448453

449-
NSDictionary *expectedData = @{@"foo" : @{@"bar" : _timestamp.dateValue}, @"baz" : @"baz-value"};
450-
XCTAssertEqualObjects(transformedDoc, FSTTestDoc("collection/key", 1, expectedData,
451-
FSTDocumentStateCommittedMutations));
454+
NSDictionary *expectedData =
455+
@{@"foo" : @{@"bar" : publicTimestamp.dateValue}, @"baz" : @"baz-value"};
456+
FSTDocument *expectedDoc =
457+
FSTTestDoc("collection/key", 1, expectedData, FSTDocumentStateCommittedMutations);
458+
XCTAssertEqualObjects(transformedDoc, expectedDoc);
452459
}
453460

454461
- (void)testAppliesServerAckedArrayTransformsToDocuments {

Firestore/Example/Tests/Model/transform_operations_test.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Type type() const override {
3232
}
3333

3434
FSTFieldValue* ApplyToLocalView(FSTFieldValue* /* previousValue */,
35-
FIRTimestamp* /* localWriteTime */) const override {
35+
const Timestamp& /* localWriteTime */) const override {
3636
return nil;
3737
}
3838

Firestore/Source/API/FSTUserDataConverter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include <vector>
2020

21+
#include "Firestore/core/include/firebase/firestore/timestamp.h"
2122
#include "Firestore/core/src/firebase/firestore/core/user_data.h"
2223
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
2324
#include "Firestore/core/src/firebase/firestore/model/document_key.h"

Firestore/Source/API/FSTUserDataConverter.mm

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,15 @@
4444
#include "Firestore/core/src/firebase/firestore/model/precondition.h"
4545
#include "Firestore/core/src/firebase/firestore/model/transform_operations.h"
4646
#include "Firestore/core/src/firebase/firestore/nanopb/nanopb_util.h"
47+
#include "Firestore/core/src/firebase/firestore/timestamp_internal.h"
4748
#include "Firestore/core/src/firebase/firestore/util/hard_assert.h"
4849
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
4950
#include "absl/memory/memory.h"
5051
#include "absl/strings/match.h"
5152

5253
namespace util = firebase::firestore::util;
54+
using firebase::Timestamp;
55+
using firebase::TimestampInternal;
5356
using firebase::firestore::GeoPoint;
5457
using firebase::firestore::api::ThrowInvalidArgument;
5558
using firebase::firestore::core::ParsedSetData;
@@ -98,6 +101,8 @@ - (instancetype)initWithKey:(DocumentKey)key databaseID:(DatabaseId)databaseID {
98101

99102
@end
100103

104+
#pragma mark - Conversion helpers
105+
101106
#pragma mark - FSTUserDataConverter
102107

103108
@interface FSTUserDataConverter ()
@@ -447,14 +452,13 @@ - (nullable FSTFieldValue *)parseScalarValue:(nullable id)input context:(ParseCo
447452
return FieldValue::FromString(util::MakeString(input)).Wrap();
448453

449454
} else if ([input isKindOfClass:[NSDate class]]) {
450-
return [FSTTimestampValue timestampValue:[FIRTimestamp timestampWithDate:input]];
455+
NSDate *inputDate = input;
456+
return [FSTTimestampValue timestampValue:api::MakeTimestamp(inputDate)];
451457

452458
} else if ([input isKindOfClass:[FIRTimestamp class]]) {
453-
FIRTimestamp *originalTimestamp = (FIRTimestamp *)input;
454-
FIRTimestamp *truncatedTimestamp =
455-
[FIRTimestamp timestampWithSeconds:originalTimestamp.seconds
456-
nanoseconds:originalTimestamp.nanoseconds / 1000 * 1000];
457-
return [FSTTimestampValue timestampValue:truncatedTimestamp];
459+
FIRTimestamp *inputTimestamp = input;
460+
Timestamp timestamp = TimestampInternal::Truncate(api::MakeTimestamp(inputTimestamp));
461+
return [FSTTimestampValue timestampValue:timestamp];
458462

459463
} else if ([input isKindOfClass:[FIRGeoPoint class]]) {
460464
return FieldValue::FromGeoPoint(api::MakeGeoPoint(input)).Wrap();

0 commit comments

Comments
 (0)