Skip to content

Commit e9e43d2

Browse files
committed
Implement MultiDB Support and Tests
1 parent f7dea6e commit e9e43d2

File tree

6 files changed

+21185
-22766
lines changed

6 files changed

+21185
-22766
lines changed

Firestore/Example/Firestore.xcodeproj/project.pbxproj

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1457,7 +1457,7 @@
14571457
2220F583583EFC28DE792ABE /* Pods_Firestore_IntegrationTests_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Firestore_IntegrationTests_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
14581458
2286F308EFB0534B1BDE05B9 /* memory_target_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = memory_target_cache_test.cc; sourceTree = "<group>"; };
14591459
277EAACC4DD7C21332E8496A /* lru_garbage_collector_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = lru_garbage_collector_test.cc; sourceTree = "<group>"; };
1460-
28B45B2104E2DAFBBF86DBB7 /* logic_utils_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; path = logic_utils_test.cc; sourceTree = "<group>"; };
1460+
28B45B2104E2DAFBBF86DBB7 /* logic_utils_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = logic_utils_test.cc; sourceTree = "<group>"; };
14611461
29D9C76922DAC6F710BC1EF4 /* memory_document_overlay_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = memory_document_overlay_cache_test.cc; sourceTree = "<group>"; };
14621462
2A0CF41BA5AED6049B0BEB2C /* objc_type_traits_apple_test.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; path = objc_type_traits_apple_test.mm; sourceTree = "<group>"; };
14631463
2B50B3A0DF77100EEE887891 /* Pods_Firestore_Tests_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Firestore_Tests_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -1683,7 +1683,7 @@
16831683
8A41BBE832158C76BE901BC9 /* mutation_queue_test.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = mutation_queue_test.h; sourceTree = "<group>"; };
16841684
8ABAC2E0402213D837F73DC3 /* defer_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = defer_test.cc; sourceTree = "<group>"; };
16851685
8C058C8BE2723D9A53CCD64B /* persistence_testing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = persistence_testing.h; sourceTree = "<group>"; };
1686-
8C7278B604B8799F074F4E8C /* index_spec_test.json */ = {isa = PBXFileReference; includeInIndex = 1; path = index_spec_test.json; sourceTree = "<group>"; };
1686+
8C7278B604B8799F074F4E8C /* index_spec_test.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; path = index_spec_test.json; sourceTree = "<group>"; };
16871687
8D9892F204959C50613F16C8 /* FSTUserDataReaderTests.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTUserDataReaderTests.mm; sourceTree = "<group>"; };
16881688
8E002F4AD5D9B6197C940847 /* Firestore.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Firestore.podspec; path = ../Firestore.podspec; sourceTree = "<group>"; };
16891689
8E9CD82E60893DDD7757B798 /* leveldb_bundle_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = leveldb_bundle_cache_test.cc; sourceTree = "<group>"; };
@@ -2951,18 +2951,15 @@
29512951
};
29522952
5CAE131820FFFED600BE9A4A = {
29532953
CreatedOnToolsVersion = 9.3.1;
2954-
DevelopmentTeam = EQHXZ8M8AV;
29552954
ProvisioningStyle = Automatic;
29562955
TestTargetID = 6003F589195388D20070C39A;
29572956
};
29582957
6003F5AD195388D20070C39A = {
29592958
CreatedOnToolsVersion = 9.0;
2960-
DevelopmentTeam = EQHXZ8M8AV;
29612959
TestTargetID = 6003F589195388D20070C39A;
29622960
};
29632961
6EDD3AD120BF247500C33877 = {
29642962
CreatedOnToolsVersion = 9.0;
2965-
DevelopmentTeam = EQHXZ8M8AV;
29662963
};
29672964
DAFF0CF421E64AC30062958F = {
29682965
CreatedOnToolsVersion = 10.0;
@@ -2975,7 +2972,6 @@
29752972
};
29762973
DE03B2941F2149D600A30B9C = {
29772974
CreatedOnToolsVersion = 9.0;
2978-
DevelopmentTeam = EQHXZ8M8AV;
29792975
};
29802976
};
29812977
};
@@ -5239,7 +5235,7 @@
52395235
baseConfigurationReference = FA2E9952BA2B299C1156C43C /* Pods-Firestore_Benchmarks_iOS.debug.xcconfig */;
52405236
buildSettings = {
52415237
BUNDLE_LOADER = "$(TEST_HOST)";
5242-
DEVELOPMENT_TEAM = EQHXZ8M8AV;
5238+
DEVELOPMENT_TEAM = "";
52435239
GCC_PRECOMPILE_PREFIX_HEADER = YES;
52445240
GCC_PREFIX_HEADER = "";
52455241
PRODUCT_BUNDLE_IDENTIFIER = "Firebase.Firestore-Benchmarks-iOS";
@@ -5375,6 +5371,7 @@
53755371
buildSettings = {
53765372
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
53775373
CLANG_ENABLE_MODULES = YES;
5374+
DEVELOPMENT_TEAM = "";
53785375
GCC_PRECOMPILE_PREFIX_HEADER = YES;
53795376
GCC_PREFIX_HEADER = "";
53805377
HEADER_SEARCH_PATHS = (
@@ -5397,6 +5394,7 @@
53975394
buildSettings = {
53985395
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
53995396
CLANG_ENABLE_MODULES = YES;
5397+
DEVELOPMENT_TEAM = "";
54005398
GCC_PRECOMPILE_PREFIX_HEADER = YES;
54015399
GCC_PREFIX_HEADER = "";
54025400
HEADER_SEARCH_PATHS = (
@@ -5418,7 +5416,7 @@
54185416
baseConfigurationReference = E592181BFD7C53C305123739 /* Pods-Firestore_Tests_iOS.debug.xcconfig */;
54195417
buildSettings = {
54205418
BUNDLE_LOADER = "$(TEST_HOST)";
5421-
DEVELOPMENT_TEAM = EQHXZ8M8AV;
5419+
DEVELOPMENT_TEAM = "";
54225420
GCC_PRECOMPILE_PREFIX_HEADER = YES;
54235421
GCC_PREFIX_HEADER = "";
54245422
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -5479,7 +5477,7 @@
54795477
baseConfigurationReference = B3F5B3AAE791A5911B9EAA82 /* Pods-Firestore_Tests_iOS.release.xcconfig */;
54805478
buildSettings = {
54815479
BUNDLE_LOADER = "$(TEST_HOST)";
5482-
DEVELOPMENT_TEAM = EQHXZ8M8AV;
5480+
DEVELOPMENT_TEAM = "";
54835481
GCC_PRECOMPILE_PREFIX_HEADER = YES;
54845482
GCC_PREFIX_HEADER = "";
54855483
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -5540,7 +5538,7 @@
55405538
baseConfigurationReference = 84434E57CA72951015FC71BC /* Pods-Firestore_FuzzTests_iOS.debug.xcconfig */;
55415539
buildSettings = {
55425540
BUNDLE_LOADER = "$(TEST_HOST)";
5543-
DEVELOPMENT_TEAM = EQHXZ8M8AV;
5541+
DEVELOPMENT_TEAM = "";
55445542
GCC_PRECOMPILE_PREFIX_HEADER = YES;
55455543
GCC_PREFIX_HEADER = "";
55465544
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}";
@@ -5555,7 +5553,7 @@
55555553
baseConfigurationReference = 97C492D2524E92927C11F425 /* Pods-Firestore_FuzzTests_iOS.release.xcconfig */;
55565554
buildSettings = {
55575555
BUNDLE_LOADER = "$(TEST_HOST)";
5558-
DEVELOPMENT_TEAM = EQHXZ8M8AV;
5556+
DEVELOPMENT_TEAM = "";
55595557
GCC_PRECOMPILE_PREFIX_HEADER = YES;
55605558
GCC_PREFIX_HEADER = "";
55615559
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}";
@@ -5645,7 +5643,7 @@
56455643
baseConfigurationReference = 1277F98C20D2DF0867496976 /* Pods-Firestore_IntegrationTests_iOS.debug.xcconfig */;
56465644
buildSettings = {
56475645
BUNDLE_LOADER = "$(TEST_HOST)";
5648-
DEVELOPMENT_TEAM = EQHXZ8M8AV;
5646+
DEVELOPMENT_TEAM = "";
56495647
GCC_PRECOMPILE_PREFIX_HEADER = YES;
56505648
GCC_PREFIX_HEADER = "";
56515649
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -5670,7 +5668,7 @@
56705668
baseConfigurationReference = F354C0FE92645B56A6C6FD44 /* Pods-Firestore_IntegrationTests_iOS.release.xcconfig */;
56715669
buildSettings = {
56725670
BUNDLE_LOADER = "$(TEST_HOST)";
5673-
DEVELOPMENT_TEAM = EQHXZ8M8AV;
5671+
DEVELOPMENT_TEAM = "";
56745672
GCC_PRECOMPILE_PREFIX_HEADER = YES;
56755673
GCC_PREFIX_HEADER = "";
56765674
GCC_PREPROCESSOR_DEFINITIONS = (

Firestore/Example/Tests/Integration/API/FIRDatabaseTests.mm

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@
2626
#include "Firestore/core/src/api/query_snapshot.h"
2727
#include "Firestore/core/src/core/firestore_client.h"
2828
#include "Firestore/core/test/unit/testutil/app_testing.h"
29+
#include "Firestore/core/src/model/database_id.h"
30+
#include "Firestore/core/src/util/string_apple.h"
2931

32+
using firebase::firestore::model::DatabaseId;
3033
using firebase::firestore::testutil::AppForUnitTesting;
34+
using firebase::firestore::util::MakeNSString;
3135
using firebase::firestore::util::MakeString;
3236
using firebase::firestore::util::TimerId;
3337

@@ -36,6 +40,11 @@ @interface FIRDatabaseTests : FSTIntegrationTestCase
3640

3741
@implementation FIRDatabaseTests
3842

43+
- (void)tearDown {
44+
[FIRApp resetApps];
45+
[super tearDown];
46+
}
47+
3948
- (void)testCanUpdateAnExistingDocument {
4049
FIRDocumentReference *doc = [self.db documentWithPath:@"rooms/eros"];
4150
NSDictionary<NSString *, id> *initialData =
@@ -1744,4 +1753,37 @@ - (void)testWaitForPendingWritesCompletesWhenOfflineIfNoPending {
17441753
[self awaitExpectations];
17451754
}
17461755

1756+
- (void)testDefaultNamedDbIsSame {
1757+
[FIRApp configure];
1758+
FIRApp *app = [FIRApp defaultApp];
1759+
FIRFirestore *db1 = [FIRFirestore firestore];
1760+
FIRFirestore *db2 = [FIRFirestore firestoreForApp:app];
1761+
FIRFirestore *db3 = [FIRFirestore firestoreForApp:app database:@"(default)"];
1762+
FIRFirestore *db4 = [FIRFirestore firestoreForDatabase:@"(default)"];
1763+
1764+
XCTAssertIdentical(db1, db2);
1765+
XCTAssertIdentical(db1, db3);
1766+
XCTAssertIdentical(db1, db4);
1767+
}
1768+
1769+
- (void)testSameNamedDbIsSame {
1770+
[FIRApp configure];
1771+
FIRApp *app = [FIRApp defaultApp];
1772+
FIRFirestore *db1 = [FIRFirestore firestoreForApp:app database:@"myDb"];
1773+
FIRFirestore *db2 = [FIRFirestore firestoreForDatabase:@"myDb"];
1774+
1775+
XCTAssertIdentical(db1, db2);
1776+
}
1777+
1778+
- (void)testNamedDbHaveDifferentPersistence {
1779+
[FIRApp configure];
1780+
FIRFirestore *db1 = [FIRFirestore firestore];
1781+
FIRFirestore *db2 = [FIRFirestore firestoreForDatabase:@"db1"];
1782+
FIRFirestore *db3 = [FIRFirestore firestoreForDatabase:@"db2"];
1783+
1784+
XCTAssertNotIdentical(db1, db2);
1785+
XCTAssertNotIdentical(db1, db3);
1786+
XCTAssertNotIdentical(db2, db3);
1787+
}
1788+
17471789
@end

Firestore/Example/Tests/Integration/API/FIRValidationTests.mm

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#import <XCTest/XCTest.h>
2020
#include <limits>
2121

22+
#import "FirebaseCore/Extension/FIRAppInternal.h"
2223
#import "FirebaseCore/Extension/FIROptionsInternal.h"
2324
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
2425
#import "Firestore/Example/Tests/Util/FSTIntegrationTestCase.h"
@@ -74,6 +75,27 @@ - (void)testNilFIRAppFails {
7475
"default FirebaseApp instance.");
7576
}
7677

78+
- (void)testNilFIRAppDatabaseFails1 {
79+
FIRApp *app = AppForUnitTesting();
80+
FSTAssertThrows(
81+
[FIRFirestore firestoreForApp:app database:nil],
82+
@"Database identifier may not be nil. Use '(default)' if you want the default database");
83+
}
84+
85+
- (void)testNilFIRAppDatabaseFails2 {
86+
FSTAssertThrows(
87+
[FIRFirestore firestoreForApp:nil database:@"NotNil"],
88+
@"FirebaseApp instance may not be nil. Use FirebaseApp.app() if you'd like to use the "
89+
"default FirebaseApp instance.");
90+
}
91+
92+
- (void)testNilDatabaseFails {
93+
[FIRApp configure];
94+
FSTAssertThrows(
95+
[FIRFirestore firestoreForDatabase:nil],
96+
@"Database identifier may not be nil. Use '(default)' if you want the default database");
97+
}
98+
7799
- (void)testNilProjectIDFails {
78100
FIROptions *options = OptionsForUnitTesting("ignored");
79101
options.projectID = nil;
@@ -82,8 +104,6 @@ - (void)testNilProjectIDFails {
82104
@"FIROptions.projectID must be set to a valid project ID.");
83105
}
84106

85-
// TODO(b/62410906): Test for firestoreForApp:database: with nil DatabaseID.
86-
87107
- (void)testNilTransactionBlocksFail {
88108
FSTAssertThrows([self.db runTransactionWithBlock:nil
89109
completion:^(id, NSError *) {

Firestore/Source/API/FIRFirestore.mm

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ + (instancetype)firestoreForApp:(FIRApp *)app {
128128
return [self firestoreForApp:app database:MakeNSString(DatabaseId::kDefault)];
129129
}
130130

131-
// TODO(b/62410906): make this public
132131
+ (instancetype)firestoreForApp:(FIRApp *)app database:(NSString *)database {
133132
if (!app) {
134133
ThrowInvalidArgument("FirebaseApp instance may not be nil. Use FirebaseApp.app() if you'd like "
@@ -145,6 +144,15 @@ + (instancetype)firestoreForApp:(FIRApp *)app database:(NSString *)database {
145144
return [provider firestoreForDatabase:database];
146145
}
147146

147+
+ (instancetype)firestoreForDatabase:(NSString *)database {
148+
FIRApp *app = [FIRApp defaultApp];
149+
if (!app) {
150+
ThrowIllegalState("Failed to get FirebaseApp instance. Please call FirebaseApp.configure() "
151+
"before using Firestore");
152+
}
153+
return [self firestoreForApp:app database:database];
154+
}
155+
148156
- (instancetype)initWithDatabaseID:(model::DatabaseId)databaseID
149157
persistenceKey:(std::string)persistenceKey
150158
authCredentialsProvider:

Firestore/Source/Public/FirebaseFirestore/FIRFirestore.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,22 @@ NS_SWIFT_NAME(Firestore)
4343
- (instancetype)init __attribute__((unavailable("Use a static constructor method.")));
4444

4545
/**
46-
* Creates, caches, and returns a `Firestore` using the default `FirebaseApp`. Each subsequent
46+
* Creates, caches, and returns default `Firestore` using the default `FirebaseApp`. Each subsequent
4747
* invocation returns the same `Firestore` object.
4848
*
49-
* @return The `Firestore` instance.
49+
* @return The default `Firestore` instance.
5050
*/
5151
+ (instancetype)firestore NS_SWIFT_NAME(firestore());
5252

5353
/**
54-
* Creates, caches, and returns a `Firestore` object for the specified _app_. Each subsequent
54+
* Creates, caches, and returns default `Firestore` object for the specified _app_. Each subsequent
5555
* invocation returns the same `Firestore` object.
5656
*
5757
* @param app The `FirebaseApp` instance to use for authentication and as a source of the Google
5858
* Cloud Project ID for your Firestore Database. If you want the default instance, you should
5959
* explicitly set it to `FirebaseApp.app()`.
6060
*
61-
* @return The `Firestore` instance.
61+
* @return The default `Firestore` instance.
6262
*/
6363
+ (instancetype)firestoreForApp:(FIRApp *)app NS_SWIFT_NAME(firestore(app:));
6464

0 commit comments

Comments
 (0)