Skip to content

Commit 5bde275

Browse files
committed
Add tests, bug: double free
1 parent 0e652a7 commit 5bde275

File tree

7 files changed

+54
-21
lines changed

7 files changed

+54
-21
lines changed

Firestore/Example/Firestore.xcodeproj/project.pbxproj

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,7 @@
882882
7A2D523AEF58B1413CC8D64F /* query_engine_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8A853940305237AFDA8050B /* query_engine_test.cc */; };
883883
7A3BE0ED54933C234FDE23D1 /* leveldb_util_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 332485C4DCC6BA0DBB5E31B7 /* leveldb_util_test.cc */; };
884884
7A66A2CB5CF33F0C28202596 /* status_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 54A0352C20A3B3D7003E0143 /* status_test.cc */; };
885+
7A7C3C9D9157BECA57BFA3BB /* PipelineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6090E5C6820BB78C1C548B /* PipelineTests.swift */; };
885886
7A7DB86955670B85B4514A1F /* Validation_BloomFilterTest_MD5_1_0001_bloom_filter_proto.json in Resources */ = {isa = PBXBuildFile; fileRef = 4B59C0A7B2A4548496ED4E7D /* Validation_BloomFilterTest_MD5_1_0001_bloom_filter_proto.json */; };
886887
7A7EC216A0015D7620B4FF3E /* string_format_apple_test.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9CFD366B783AE27B9E79EE7A /* string_format_apple_test.mm */; };
887888
7A8DF35E7DB4278E67E6BDB3 /* snapshot_version_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = ABA495B9202B7E79008A7851 /* snapshot_version_test.cc */; };
@@ -1584,10 +1585,12 @@
15841585
F481368DB694B3B4D0C8E4A2 /* query_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = B9C261C26C5D311E1E3C0CB9 /* query_test.cc */; };
15851586
F4F00BF4E87D7F0F0F8831DB /* FSTEventAccumulator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0392021401F00B64F25 /* FSTEventAccumulator.mm */; };
15861587
F4FAC5A7D40A0A9A3EA77998 /* FSTLevelDBSpecTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E02C20213FFB00B64F25 /* FSTLevelDBSpecTests.mm */; };
1588+
F55640F419C95EB73BA718D4 /* PipelineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6090E5C6820BB78C1C548B /* PipelineTests.swift */; };
15871589
F563446799EFCF4916758E6C /* Validation_BloomFilterTest_MD5_50000_01_bloom_filter_proto.json in Resources */ = {isa = PBXBuildFile; fileRef = 7B44DD11682C4803B73DCC34 /* Validation_BloomFilterTest_MD5_50000_01_bloom_filter_proto.json */; };
15881590
F56E9334642C207D7D85D428 /* pretty_printing_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB323F9553050F4F6490F9FF /* pretty_printing_test.cc */; };
15891591
F58A23FEF328EB74F681FE83 /* index_manager_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AE4A9E38D65688EE000EE2A1 /* index_manager_test.cc */; };
15901592
F5A654E92FF6F3FF16B93E6B /* mutation_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = C8522DE226C467C54E6788D8 /* mutation_test.cc */; };
1593+
F5A67E6FF3F630C9D4C2EE98 /* PipelineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6090E5C6820BB78C1C548B /* PipelineTests.swift */; };
15911594
F5B1F219E912F645FB79D08E /* firebase_app_check_credentials_provider_test.mm in Sources */ = {isa = PBXBuildFile; fileRef = F119BDDF2F06B3C0883B8297 /* firebase_app_check_credentials_provider_test.mm */; };
15921595
F5BDECEB3B43BD1591EEADBD /* FSTUserDataReaderTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8D9892F204959C50613F16C8 /* FSTUserDataReaderTests.mm */; };
15931596
F6079BFC9460B190DA85C2E6 /* pretty_printing_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB323F9553050F4F6490F9FF /* pretty_printing_test.cc */; };
@@ -1749,6 +1752,7 @@
17491752
3841925AA60E13A027F565E6 /* Validation_BloomFilterTest_MD5_50000_1_membership_test_result.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = Validation_BloomFilterTest_MD5_50000_1_membership_test_result.json; path = bloom_filter_golden_test_data/Validation_BloomFilterTest_MD5_50000_1_membership_test_result.json; sourceTree = "<group>"; };
17501753
395E8B07639E69290A929695 /* index.pb.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; name = index.pb.cc; path = admin/index.pb.cc; sourceTree = "<group>"; };
17511754
3B843E4A1F3930A400548890 /* remote_store_spec_test.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = remote_store_spec_test.json; sourceTree = "<group>"; };
1755+
3C6090E5C6820BB78C1C548B /* PipelineTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PipelineTests.swift; sourceTree = "<group>"; };
17521756
3CAA33F964042646FDDAF9F9 /* status_testing.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = status_testing.cc; sourceTree = "<group>"; };
17531757
3D050936A2D52257FD17FB6E /* md5_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = md5_test.cc; sourceTree = "<group>"; };
17541758
3E26017832D28D24F2E391C5 /* Pods-Firestore_Example_iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Firestore_Example_iOS.release.xcconfig"; path = "Target Support Files/Pods-Firestore_Example_iOS/Pods-Firestore_Example_iOS.release.xcconfig"; sourceTree = "<group>"; };
@@ -1761,7 +1765,7 @@
17611765
4334F87873015E3763954578 /* status_testing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = status_testing.h; sourceTree = "<group>"; };
17621766
4375BDCDBCA9938C7F086730 /* Validation_BloomFilterTest_MD5_5000_1_bloom_filter_proto.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = Validation_BloomFilterTest_MD5_5000_1_bloom_filter_proto.json; path = bloom_filter_golden_test_data/Validation_BloomFilterTest_MD5_5000_1_bloom_filter_proto.json; sourceTree = "<group>"; };
17631767
444B7AB3F5A2929070CB1363 /* hard_assert_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = hard_assert_test.cc; sourceTree = "<group>"; };
1764-
4564AD9C55EC39C080EB9476 /* globals_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; path = globals_cache_test.cc; sourceTree = "<group>"; };
1768+
4564AD9C55EC39C080EB9476 /* globals_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = globals_cache_test.cc; sourceTree = "<group>"; };
17651769
46E38E88A7A020F4E721E373 /* Pods_Firestore_Tests_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Firestore_Tests_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
17661770
478DC75A0DCA6249A616DD30 /* Validation_BloomFilterTest_MD5_500_0001_membership_test_result.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = Validation_BloomFilterTest_MD5_500_0001_membership_test_result.json; path = bloom_filter_golden_test_data/Validation_BloomFilterTest_MD5_500_0001_membership_test_result.json; sourceTree = "<group>"; };
17671771
48D0915834C3D234E5A875A9 /* grpc_stream_tester.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = grpc_stream_tester.h; sourceTree = "<group>"; };
@@ -1881,7 +1885,7 @@
18811885
5B5414D28802BC76FDADABD6 /* stream_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = stream_test.cc; sourceTree = "<group>"; };
18821886
5B96CC29E9946508F022859C /* Validation_BloomFilterTest_MD5_50000_0001_membership_test_result.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = Validation_BloomFilterTest_MD5_50000_0001_membership_test_result.json; path = bloom_filter_golden_test_data/Validation_BloomFilterTest_MD5_50000_0001_membership_test_result.json; sourceTree = "<group>"; };
18831887
5C68EE4CB94C0DD6E333F546 /* Validation_BloomFilterTest_MD5_1_01_membership_test_result.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = Validation_BloomFilterTest_MD5_1_01_membership_test_result.json; path = bloom_filter_golden_test_data/Validation_BloomFilterTest_MD5_1_01_membership_test_result.json; sourceTree = "<group>"; };
1884-
5C6DEA63FBDE19D841291723 /* memory_globals_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; path = memory_globals_cache_test.cc; sourceTree = "<group>"; };
1888+
5C6DEA63FBDE19D841291723 /* memory_globals_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = memory_globals_cache_test.cc; sourceTree = "<group>"; };
18851889
5C7942B6244F4C416B11B86C /* leveldb_mutation_queue_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = leveldb_mutation_queue_test.cc; sourceTree = "<group>"; };
18861890
5CAE131920FFFED600BE9A4A /* Firestore_Benchmarks_iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Firestore_Benchmarks_iOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
18871891
5CAE131D20FFFED600BE9A4A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -2124,7 +2128,7 @@
21242128
F8043813A5D16963EC02B182 /* local_serializer_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = local_serializer_test.cc; sourceTree = "<group>"; };
21252129
F848C41C03A25C42AD5A4BC2 /* target_cache_test.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = target_cache_test.h; sourceTree = "<group>"; };
21262130
F869D85E900E5AF6CD02E2FC /* firebase_auth_credentials_provider_test.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = firebase_auth_credentials_provider_test.mm; path = credentials/firebase_auth_credentials_provider_test.mm; sourceTree = "<group>"; };
2127-
FC44D934D4A52C790659C8D6 /* leveldb_globals_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; path = leveldb_globals_cache_test.cc; sourceTree = "<group>"; };
2131+
FC44D934D4A52C790659C8D6 /* leveldb_globals_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = leveldb_globals_cache_test.cc; sourceTree = "<group>"; };
21282132
FF73B39D04D1760190E6B84A /* FIRQueryUnitTests.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; path = FIRQueryUnitTests.mm; sourceTree = "<group>"; };
21292133
FFCA39825D9678A03D1845D0 /* document_overlay_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = document_overlay_cache_test.cc; sourceTree = "<group>"; };
21302134
/* End PBXFileReference section */
@@ -2254,6 +2258,7 @@
22542258
124C932B22C1642C00CA8C2D /* CodableIntegrationTests.swift */,
22552259
3355BE9391CC4857AF0BDAE3 /* DatabaseTests.swift */,
22562260
62E54B832A9E910A003347C8 /* IndexingTests.swift */,
2261+
3C6090E5C6820BB78C1C548B /* PipelineTests.swift */,
22572262
621D620928F9CE7400D2FA26 /* QueryIntegrationTests.swift */,
22582263
4D65F6E69993611D47DC8E7C /* SnapshotListenerSourceTests.swift */,
22592264
EFF22EA92C5060A4009A369B /* VectorIntegrationTests.swift */,
@@ -2911,7 +2916,6 @@
29112916
B73A76105FCE98FF8B521BA2 /* Pods-Firestore_Tests_tvOS.debug.xcconfig */,
29122917
4A67C88EC98B1BBD4615BB12 /* Pods-Firestore_Tests_tvOS.release.xcconfig */,
29132918
);
2914-
name = Pods;
29152919
path = Pods;
29162920
sourceTree = "<group>";
29172921
};
@@ -4646,6 +4650,7 @@
46464650
432056C4D1259F76C80FC2A8 /* FSTUserDataReaderTests.mm in Sources */,
46474651
3B1E27D951407FD237E64D07 /* FirestoreEncoderTests.swift in Sources */,
46484652
62E54B862A9E910B003347C8 /* IndexingTests.swift in Sources */,
4653+
7A7C3C9D9157BECA57BFA3BB /* PipelineTests.swift in Sources */,
46494654
621D620C28F9CE7400D2FA26 /* QueryIntegrationTests.swift in Sources */,
46504655
1CFBD4563960D8A20C4679A3 /* SnapshotListenerSourceTests.swift in Sources */,
46514656
EFF22EAC2C5060A4009A369B /* VectorIntegrationTests.swift in Sources */,
@@ -4891,6 +4896,7 @@
48914896
75A176239B37354588769206 /* FSTUserDataReaderTests.mm in Sources */,
48924897
5E89B1A5A5430713C79C4854 /* FirestoreEncoderTests.swift in Sources */,
48934898
62E54B852A9E910B003347C8 /* IndexingTests.swift in Sources */,
4899+
F55640F419C95EB73BA718D4 /* PipelineTests.swift in Sources */,
48944900
621D620B28F9CE7400D2FA26 /* QueryIntegrationTests.swift in Sources */,
48954901
A0BC30D482B0ABD1A3A24CDC /* SnapshotListenerSourceTests.swift in Sources */,
48964902
EFF22EAB2C5060A4009A369B /* VectorIntegrationTests.swift in Sources */,
@@ -5386,6 +5392,7 @@
53865392
F5BDECEB3B43BD1591EEADBD /* FSTUserDataReaderTests.mm in Sources */,
53875393
6F45846C159D3C063DBD3CBE /* FirestoreEncoderTests.swift in Sources */,
53885394
62E54B842A9E910B003347C8 /* IndexingTests.swift in Sources */,
5395+
F5A67E6FF3F630C9D4C2EE98 /* PipelineTests.swift in Sources */,
53895396
621D620A28F9CE7400D2FA26 /* QueryIntegrationTests.swift in Sources */,
53905397
B00F8D1819EE20C45B660940 /* SnapshotListenerSourceTests.swift in Sources */,
53915398
EFF22EAA2C5060A4009A369B /* VectorIntegrationTests.swift in Sources */,
@@ -5975,6 +5982,7 @@
59755982
ONLY_ACTIVE_ARCH = YES;
59765983
OTHER_CFLAGS = "";
59775984
SDKROOT = iphoneos;
5985+
SWIFT_OBJC_INTEROP_MODE = objcxx;
59785986
TARGETED_DEVICE_FAMILY = "1,2";
59795987
TVOS_DEPLOYMENT_TARGET = 13.0;
59805988
};
@@ -6024,6 +6032,7 @@
60246032
OTHER_CFLAGS = "";
60256033
SDKROOT = iphoneos;
60266034
SWIFT_COMPILATION_MODE = wholemodule;
6035+
SWIFT_OBJC_INTEROP_MODE = objcxx;
60276036
TARGETED_DEVICE_FAMILY = "1,2";
60286037
TVOS_DEPLOYMENT_TARGET = 13.0;
60296038
VALIDATE_PRODUCT = YES;

Firestore/Example/Firestore.xcodeproj/xcshareddata/xcschemes/Firestore_IntegrationTests_iOS.xcscheme

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
buildConfiguration = "Debug"
5555
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
5656
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
57+
enableAddressSanitizer = "YES"
5758
launchStyle = "0"
5859
useCustomWorkingDirectory = "NO"
5960
ignoresPersistentStateOnLaunch = "NO"

Firestore/Source/API/FIRCallbackWrapper.mm

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,9 @@
3434

3535
@implementation FIRCallbackWrapper
3636

37-
+ (PipelineSnapshotListener)
38-
wrapPipelineCallback:(std::shared_ptr<api::Firestore>)firestore
39-
completion:(void (^)(std::shared_ptr<std::vector<PipelineResult>> result,
40-
NSError *_Nullable error))completion {
37+
+ (PipelineSnapshotListener)wrapPipelineCallback:(std::shared_ptr<api::Firestore>)firestore
38+
completion:(void (^)(PipelineResultVector result,
39+
NSError *_Nullable error))completion {
4140
class Converter : public EventListener<std::vector<PipelineResult>> {
4241
public:
4342
explicit Converter(std::shared_ptr<api::Firestore> firestore, PipelineBlock completion)
@@ -47,11 +46,10 @@ explicit Converter(std::shared_ptr<api::Firestore> firestore, PipelineBlock comp
4746
void OnEvent(StatusOr<std::vector<PipelineResult>> maybe_snapshot) override {
4847
if (maybe_snapshot.ok()) {
4948
completion_(
50-
std::make_shared<std::vector<PipelineResult>>(
51-
std::initializer_list<PipelineResult>{PipelineResult::GetTestResult(firestore_)}),
49+
std::initializer_list<PipelineResult>{PipelineResult::GetTestResult(firestore_)},
5250
nullptr);
5351
} else {
54-
completion_(nullptr, MakeNSError(maybe_snapshot.status()));
52+
completion_(std::initializer_list<PipelineResult>{}, MakeNSError(maybe_snapshot.status()));
5553
}
5654
}
5755

Firestore/Source/Public/FirebaseFirestore/FIRCallbackWrapper.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,10 @@ namespace core = firebase::firestore::core;
3838

3939
NS_ASSUME_NONNULL_BEGIN
4040

41-
typedef void (^PipelineBlock)(std::shared_ptr<std::vector<api::PipelineResult>> result,
42-
NSError *_Nullable error)
41+
typedef void (^PipelineBlock)(std::vector<api::PipelineResult> result, NSError *_Nullable error)
4342
NS_SWIFT_UNAVAILABLE("Use Swift's closure syntax instead.");
4443

45-
typedef std::shared_ptr<std::vector<api::PipelineResult>> PipelineResultVectorPtr;
44+
typedef std::vector<api::PipelineResult> PipelineResultVector;
4645

4746
NS_SWIFT_SENDABLE
4847
NS_SWIFT_NAME(CallbackWrapper)
@@ -54,9 +53,8 @@ NS_SWIFT_NAME(CallbackWrapper)
5453
// thread safety.
5554
+ (std::unique_ptr<core::EventListener<std::vector<api::PipelineResult>>>)
5655
wrapPipelineCallback:(std::shared_ptr<api::Firestore>)firestore
57-
completion:(void (^NS_SWIFT_SENDABLE)(
58-
std::shared_ptr<std::vector<api::PipelineResult>> result,
59-
NSError *_Nullable error))completion
56+
completion:(void (^NS_SWIFT_SENDABLE)(PipelineResultVector result,
57+
NSError *_Nullable error))completion
6058
NS_SWIFT_NAME(wrapPipelineCallback(firestore:completion:));
6159

6260
@end

Firestore/Swift/Source/SwiftAPI/PipelineResult.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ public struct PipelineResult {
2424
cppObj = cppSource
2525
}
2626

27-
static func convertToArrayFromCppVector(_ vectorPtr: PipelineResultVectorPtr)
27+
static func convertToArrayFromCppVector(_ vector: PipelineResultVector)
2828
-> [PipelineResult] {
2929
// Create a Swift array and populate it by iterating over the C++ vector
3030
var swiftArray: [PipelineResult] = []
3131

32-
for index in vectorPtr.pointee.indices {
33-
let cppResult = vectorPtr.pointee[index]
32+
for index in vector.indices {
33+
let cppResult = vector[index]
3434
swiftArray.append(PipelineResult(cppResult))
3535
}
3636

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright 2025 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
import Foundation
16+
import XCTest
17+
18+
import FirebaseFirestore
19+
20+
final class PipelineTests: FSTIntegrationTestCase {
21+
func testCreatePipeline() async throws {
22+
let pipelineSource: PipelineSource = db.pipeline()
23+
let pipeline: Pipeline = pipelineSource.GetCollection("path")
24+
let _: [PipelineResult] = try await pipeline.GetPipelineResult()
25+
}
26+
}

Firestore/core/src/api/firestore.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,8 @@ void Firestore::SetClientLanguage(std::string language_token) {
228228
}
229229

230230
PipelineSource Firestore::pipeline() {
231-
return {shared_from_this()};
231+
EnsureClientConfigured();
232+
return PipelineSource(shared_from_this());
232233
}
233234

234235
std::unique_ptr<ListenerRegistration> Firestore::AddSnapshotsInSyncListener(

0 commit comments

Comments
 (0)