Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
969f2ed
add unchanged names to existence filter and modify spec test runner
milaGGL Feb 24, 2023
b66b02b
Merge branch 'mila/BloomFilter' into mila/BloomFilter-add--existence-…
milaGGL Feb 28, 2023
1df9410
use BloomFilter instead of proto
milaGGL Feb 28, 2023
1e67033
update serializer
milaGGL Feb 28, 2023
899e3cc
add bloomfilter equality test
milaGGL Mar 3, 2023
3faa3e8
Merge branch 'mila/BloomFilter' into mila/BloomFilter-add--existence-…
milaGGL Mar 6, 2023
468f967
make unchanged_names optional in proto
milaGGL Mar 7, 2023
23f0fb1
handle invalid unchanged-names input with BloomFilter::Create
milaGGL Mar 7, 2023
475fffb
format the comments
milaGGL Mar 7, 2023
5bda231
Merge branch 'mila/BloomFilter' into mila/BloomFilter-add--existence-…
milaGGL Mar 13, 2023
11158e5
port spec tests
milaGGL Mar 13, 2023
05caaeb
change unchanged_names to Bloom_filter
milaGGL Mar 13, 2023
b0bb8bf
add GetDatabaseId to the targetMetadataProvider
milaGGL Mar 14, 2023
d56f4df
remove the parsing unchanged_names to BloomFilter logic
milaGGL Mar 14, 2023
4158352
sort the actual and expected events in spec test before comparing them
milaGGL Mar 14, 2023
2b8533c
Merge branch 'mila/BloomFilter-add--existence-filter-class' into mila…
milaGGL Mar 14, 2023
ae930ef
Revert "Merge branch 'mila/BloomFilter-add--existence-filter-class' i…
milaGGL Mar 15, 2023
91a42e6
resolve comments
milaGGL Mar 16, 2023
e694551
Merge branch 'mila/BloomFilter' into mila/BloomFilter-add--existence-…
milaGGL Mar 16, 2023
db883fb
Merge branch 'mila/BloomFilter-add--existence-filter-class' into mila…
milaGGL Mar 16, 2023
a2b7408
format
milaGGL Mar 16, 2023
f6b062f
log error message
milaGGL Mar 17, 2023
0de7946
Merge branch 'mila/BloomFilter' into mila/BloomFilter-apply-bloom-fil…
milaGGL Mar 17, 2023
01c332b
merge queryPurpose spec test check
milaGGL Mar 17, 2023
4e1e489
add back the expectedCount check get deleted
milaGGL Mar 17, 2023
523fd6c
re-write CompareBits()
dconeybe Mar 17, 2023
6bbc6b2
fix typo
dconeybe Mar 17, 2023
2a71c20
resolve comments
milaGGL Mar 17, 2023
4a97630
resolve comments
milaGGL Mar 17, 2023
3eec288
Update bloom_filter.cc
milaGGL Mar 17, 2023
f28689c
Merge branch 'mila/BloomFilter-add--existence-filter-class' into mila…
milaGGL Mar 17, 2023
ffeac29
add test coverage for ExistenceFilter with not null BloomFilter
milaGGL Mar 17, 2023
1389257
Merge branch 'mila/BloomFilter' into mila/BloomFilter-apply-bloom-fil…
milaGGL Mar 20, 2023
dd0d0fd
nit
milaGGL Mar 20, 2023
f412d20
format
milaGGL Mar 20, 2023
4fa5029
Merge branch 'mila/BloomFilter' into mila/BloomFilter-apply-bloom-fil…
milaGGL Mar 21, 2023
8251955
resolve comments
milaGGL Mar 21, 2023
079f810
use BloomFilterParamater struct instead of BloomFilter
milaGGL Mar 21, 2023
f37a325
override default database_id in remote_event_test
milaGGL Mar 22, 2023
2762edf
resolve comments
milaGGL Mar 22, 2023
72595f9
resolve comments
milaGGL Mar 23, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 35 additions & 10 deletions Firestore/Example/Tests/SpecTests/FSTSpecTests.mm
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@
using firebase::firestore::nanopb::MakeByteString;
using firebase::firestore::nanopb::Message;
using firebase::firestore::remote::BloomFilter;
using firebase::firestore::remote::BloomFilterParameters;
using firebase::firestore::remote::DocumentWatchChange;
using firebase::firestore::remote::ExistenceFilter;
using firebase::firestore::remote::ExistenceFilterWatchChange;
Expand Down Expand Up @@ -329,11 +330,24 @@ - (SnapshotVersion)parseVersion:(NSNumber *_Nullable)version {
return Version(version.longLongValue);
}

- (absl::optional<BloomFilter>)parseBloomFilter:(NSDictionary *_Nullable)bloomFilterProto {
// TODO(Mila): None of the ported spec tests actually has the bloom filter json string, so hard
// code a null value for now. Actual parsing code will be written in the next PR, where we can
// validate the parsing result.
return absl::nullopt;
- (absl::optional<BloomFilterParameters>)parseBloomFilterParameter:
(NSDictionary *_Nullable)bloomFilterProto {
if (bloomFilterProto == nil) {
return absl::nullopt;
}
NSDictionary *bitsData = bloomFilterProto[@"bits"];

// Decode base64 string into uint8_t vector. If bitmap is not specified in proto, use default
// empty string.
NSString *bitmapEncoded = bitsData[@"bitmap"];
std::string bitmapDecoded;
absl::Base64Unescape([bitmapEncoded cStringUsingEncoding:NSASCIIStringEncoding], &bitmapDecoded);
std::vector<uint8_t> bitmap(bitmapDecoded.begin(), bitmapDecoded.end());

// If not specified in proto, default padding and hashCount to 0.
int32_t padding = [bitsData[@"padding"] intValue];
int32_t hashCount = [bloomFilterProto[@"hashCount"] intValue];
return BloomFilterParameters{std::move(bitmap), padding, hashCount};
}

- (DocumentViewChange)parseChange:(NSDictionary *)jsonDoc ofType:(DocumentViewChange::Type)type {
Expand Down Expand Up @@ -481,9 +495,10 @@ - (void)doWatchFilter:(NSDictionary *)watchFilter {
NSArray<NSNumber *> *keys = watchFilter[@"keys"];
int keyCount = keys ? (int)keys.count : 0;

absl::optional<BloomFilter> bloomFilter = [self parseBloomFilter:watchFilter[@"bloomFilter"]];
absl::optional<BloomFilterParameters> bloomFilterParameters =
[self parseBloomFilterParameter:watchFilter[@"bloomFilter"]];

ExistenceFilter filter{keyCount, std::move(bloomFilter)};
ExistenceFilter filter{keyCount, std::move(bloomFilterParameters)};
ExistenceFilterWatchChange change{std::move(filter), targets[0].intValue};
[self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()];
}
Expand Down Expand Up @@ -693,8 +708,18 @@ - (void)validateEvent:(FSTQueryEvent *)actual matches:(NSDictionary *)expected {
}

XCTAssertEqual(actual.viewSnapshot.value().document_changes().size(), expectedChanges.size());
for (size_t i = 0; i != expectedChanges.size(); ++i) {
XCTAssertTrue((actual.viewSnapshot.value().document_changes()[i] == expectedChanges[i]));

auto comparator = [](const DocumentViewChange &lhs, const DocumentViewChange &rhs) {
return lhs.document()->key() < rhs.document()->key();
};

std::vector<DocumentViewChange> expectedChangesSorted = expectedChanges;
std::sort(expectedChangesSorted.begin(), expectedChangesSorted.end(), comparator);
std::vector<DocumentViewChange> actualChangesSorted =
actual.viewSnapshot.value().document_changes();
std::sort(actualChangesSorted.begin(), actualChangesSorted.end(), comparator);
for (size_t i = 0; i != expectedChangesSorted.size(); ++i) {
XCTAssertTrue((actualChangesSorted[i] == expectedChangesSorted[i]));
}

BOOL expectedHasPendingWrites =
Expand Down Expand Up @@ -921,7 +946,7 @@ - (void)validateActiveTargets {
XCTAssertEqual(actual.resume_token(), targetData.resume_token());
if (targetData.expected_count().has_value()) {
if (!actual.expected_count().has_value()) {
XCTFail("Actual target data doesn't have an expected_count.");
XCTFail(@"Actual target data doesn't have an expected_count.");
} else {
XCTAssertEqual(actual.expected_count().value(), targetData.expected_count().value());
}
Expand Down
Loading