Skip to content

Commit ec748a5

Browse files
authored
Merge branch 'master' into release-5.11.0
2 parents 53a2ef3 + 1d1dd64 commit ec748a5

File tree

71 files changed

+2294
-791
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+2294
-791
lines changed

Example/Auth/Tests/FIRAuthDispatcherTests.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
/** @var kExpectationTimeout
3333
@brief The maximum time waiting for expectations to fulfill.
3434
*/
35-
static const NSTimeInterval kExpectationTimeout = 2;
35+
static const NSTimeInterval kExpectationTimeout = 3;
3636

3737
id<OS_dispatch_queue> testWorkQueue;
3838

Example/Core/Tests/FIRAppTest.m

Lines changed: 148 additions & 148 deletions
Large diffs are not rendered by default.

Example/Core/Tests/FIROptionsTest.m

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,25 @@ - (void)testAnalyticsCollectionExplicitlySet {
556556
XCTAssertTrue([options isAnalyticsCollectionExpicitlySet]);
557557
}
558558

559+
- (void)testModifyingOptionsThrows {
560+
FIROptions *options =
561+
[[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID];
562+
options.editingLocked = YES;
563+
564+
// Modification to every property should result in an exception.
565+
XCTAssertThrows(options.androidClientID = @"should_throw");
566+
XCTAssertThrows(options.APIKey = @"should_throw");
567+
XCTAssertThrows(options.bundleID = @"should_throw");
568+
XCTAssertThrows(options.clientID = @"should_throw");
569+
XCTAssertThrows(options.databaseURL = @"should_throw");
570+
XCTAssertThrows(options.deepLinkURLScheme = @"should_throw");
571+
XCTAssertThrows(options.GCMSenderID = @"should_throw");
572+
XCTAssertThrows(options.googleAppID = @"should_throw");
573+
XCTAssertThrows(options.projectID = @"should_throw");
574+
XCTAssertThrows(options.storageBucket = @"should_throw");
575+
XCTAssertThrows(options.trackingID = @"should_throw");
576+
}
577+
559578
- (void)testVersionFormat {
560579
NSRegularExpression *sLibraryVersionRegex =
561580
[NSRegularExpression regularExpressionWithPattern:@"^[0-9]{8,}$" options:0 error:NULL];

Example/Firebase.xcodeproj/project.pbxproj

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@
121121
7EE21F7C1FE8919E009B1370 /* FIREmailLinkSignInResponseTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EE21F7B1FE8919D009B1370 /* FIREmailLinkSignInResponseTests.m */; };
122122
7EFA2E041F71C93300DD354F /* FIRUserMetadataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EFA2E031F71C93300DD354F /* FIRUserMetadataTests.m */; };
123123
923F824C206C4D8000034974 /* SafariServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 923F824B206C4D8000034974 /* SafariServices.framework */; };
124-
923F824E206C4D8B00034974 /* SafariServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 923F824D206C4D8B00034974 /* SafariServices.framework */; };
125124
923F824F206C4DA500034974 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE45C6641E7DA8CB009E6ACD /* XCTest.framework */; };
126125
923F8251206C4DC600034974 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 923F8250206C4DC500034974 /* UserNotifications.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
127126
923F8252206C4DD500034974 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; };
@@ -185,8 +184,6 @@
185184
D064E6B51ED9B31C001956DF /* FIRTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = DEE14D7C1E844677006FA992 /* FIRTestCase.m */; };
186185
D067EF831ED9BDE00095C27F /* Shared.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AFAF36F41EC28C25004BDEE5 /* Shared.xcassets */; };
187186
D067EF841ED9BDFF0095C27F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = DEE14D711E844677006FA992 /* GoogleService-Info.plist */; };
188-
D09005371EDB331C00154410 /* OCMock-iOS/OCMock.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = D09005301EDB32D600154410 /* OCMock-iOS/OCMock.framework */; settings = {ATTRIBUTES = (); }; };
189-
D090053D1EDB334D00154410 /* OCMock-iOS/OCMock.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = D09005301EDB32D600154410 /* OCMock-iOS/OCMock.framework */; settings = {ATTRIBUTES = (); }; };
190187
D0EDB2C51EDA04F800B6C31B /* Shared.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AFAF36F41EC28C25004BDEE5 /* Shared.xcassets */; };
191188
D0EDB2D71EDA057800B6C31B /* FIRAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D0EDB2D21EDA056A00B6C31B /* FIRAppDelegate.m */; };
192189
D0EDB2D81EDA057800B6C31B /* FIRViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D0EDB2D41EDA056A00B6C31B /* FIRViewController.m */; };
@@ -877,7 +874,6 @@
877874
dstPath = "";
878875
dstSubfolderSpec = 16;
879876
files = (
880-
D09005371EDB331C00154410 /* OCMock-iOS/OCMock.framework in CopyFiles */,
881877
);
882878
runOnlyForDeploymentPostprocessing = 0;
883879
};
@@ -887,7 +883,6 @@
887883
dstPath = "";
888884
dstSubfolderSpec = 16;
889885
files = (
890-
D090053D1EDB334D00154410 /* OCMock-iOS/OCMock.framework in CopyFiles */,
891886
);
892887
runOnlyForDeploymentPostprocessing = 0;
893888
};
@@ -962,7 +957,6 @@
962957
7EFA2E031F71C93300DD354F /* FIRUserMetadataTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FIRUserMetadataTests.m; sourceTree = "<group>"; };
963958
8496034D8156555C5FCF8F14 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
964959
923F824B206C4D8000034974 /* SafariServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SafariServices.framework; path = System/Library/Frameworks/SafariServices.framework; sourceTree = SDKROOT; };
965-
923F824D206C4D8B00034974 /* SafariServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SafariServices.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/SafariServices.framework; sourceTree = DEVELOPER_DIR; };
966960
923F8250206C4DC500034974 /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; };
967961
AFAF36F41EC28C25004BDEE5 /* Shared.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Shared.xcassets; path = Shared/Shared.xcassets; sourceTree = "<group>"; };
968962
AFC8BAA11EC257D700B8EEAE /* Messaging_Example-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Messaging_Example-Bridging-Header.h"; sourceTree = "<group>"; };
@@ -987,7 +981,6 @@
987981
D064E6A41ED9B1BF001956DF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
988982
D064E6A61ED9B1BF001956DF /* Core-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Core-Info.plist"; sourceTree = "<group>"; };
989983
D064E6BF1ED9B31C001956DF /* Core_Tests_macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Core_Tests_macOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
990-
D09005301EDB32D600154410 /* OCMock-iOS/OCMock.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = "OCMock-iOS/OCMock.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
991984
D0EDB2CD1EDA04F800B6C31B /* Storage_Example_macOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Storage_Example_macOS.app; sourceTree = BUILT_PRODUCTS_DIR; };
992985
D0EDB2D01EDA056A00B6C31B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
993986
D0EDB2D11EDA056A00B6C31B /* FIRAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FIRAppDelegate.h; sourceTree = "<group>"; };
@@ -1386,7 +1379,6 @@
13861379
isa = PBXFrameworksBuildPhase;
13871380
buildActionMask = 2147483647;
13881381
files = (
1389-
923F824E206C4D8B00034974 /* SafariServices.framework in Frameworks */,
13901382
);
13911383
runOnlyForDeploymentPostprocessing = 0;
13921384
};
@@ -1766,8 +1758,6 @@
17661758
children = (
17671759
923F8250206C4DC500034974 /* UserNotifications.framework */,
17681760
923F824B206C4D8000034974 /* SafariServices.framework */,
1769-
923F824D206C4D8B00034974 /* SafariServices.framework */,
1770-
D09005301EDB32D600154410 /* OCMock-iOS/OCMock.framework */,
17711761
DE45C6641E7DA8CB009E6ACD /* XCTest.framework */,
17721762
DEB61E781E7C542600C04B96 /* libsqlite3.tbd */,
17731763
6003F58D195388D20070C39A /* Foundation.framework */,
@@ -5749,7 +5739,7 @@
57495739
DEBUG_INFORMATION_FORMAT = dwarf;
57505740
DEVELOPMENT_TEAM = 4ANB9W7R3P;
57515741
GCC_C_LANGUAGE_STANDARD = gnu11;
5752-
INFOPLIST_FILE = "$SRCROOT/DynamicLinks/FDLBuilderTestAppObjC/Info.plist";
5742+
INFOPLIST_FILE = $SRCROOT/DynamicLinks/FDLBuilderTestAppObjC/Info.plist;
57535743
IPHONEOS_DEPLOYMENT_TARGET = 11.4;
57545744
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
57555745
MTL_ENABLE_DEBUG_INFO = YES;
@@ -5783,7 +5773,7 @@
57835773
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
57845774
DEVELOPMENT_TEAM = 4ANB9W7R3P;
57855775
GCC_C_LANGUAGE_STANDARD = gnu11;
5786-
INFOPLIST_FILE = "$SRCROOT/DynamicLinks/FDLBuilderTestAppObjC/Info.plist";
5776+
INFOPLIST_FILE = $SRCROOT/DynamicLinks/FDLBuilderTestAppObjC/Info.plist;
57875777
IPHONEOS_DEPLOYMENT_TARGET = 11.4;
57885778
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
57895779
MTL_ENABLE_DEBUG_INFO = NO;

Example/Podfile

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,10 @@ target 'Database_Example_iOS' do
4141

4242
target 'Database_Tests_iOS' do
4343
inherit! :search_paths
44-
pod 'OCMock'
4544
end
4645

4746
target 'Database_IntegrationTests_iOS' do
4847
inherit! :search_paths
49-
pod 'OCMock'
5048
end
5149
end
5250

@@ -113,7 +111,6 @@ target 'Storage_Example_iOS' do
113111

114112
target 'Storage_IntegrationTests_iOS' do
115113
inherit! :search_paths
116-
pod 'OCMock'
117114
end
118115
end
119116

@@ -173,12 +170,10 @@ target 'Database_Example_macOS' do
173170

174171
target 'Database_Tests_macOS' do
175172
inherit! :search_paths
176-
pod 'OCMock'
177173
end
178174

179175
target 'Database_IntegrationTests_macOS' do
180176
inherit! :search_paths
181-
pod 'OCMock'
182177
end
183178
end
184179

@@ -194,7 +189,6 @@ target 'Storage_Example_macOS' do
194189

195190
target 'Storage_IntegrationTests_macOS' do
196191
inherit! :search_paths
197-
pod 'OCMock'
198192
end
199193
end
200194

@@ -225,13 +219,11 @@ target 'Database_Example_tvOS' do
225219

226220
target 'Database_Tests_tvOS' do
227221
inherit! :search_paths
228-
pod 'OCMock'
229222
end
230223

231224
# TODO
232225
# target 'Database_IntegrationTests_tvOS' do
233226
# inherit! :search_paths
234-
# pod 'OCMock'
235227
# end
236228
end
237229

@@ -248,6 +240,5 @@ target 'Storage_Example_tvOS' do
248240
#TODO Storage_IntegrationTests_tvOS
249241
# target 'Storage_IntegrationTests_tvOS' do
250242
# inherit! :search_paths
251-
# pod 'OCMock'
252243
# end
253244
end

Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,44 @@ - (void)testUnauthenticatedSimplePutData {
198198
[self waitForExpectations];
199199
}
200200

201+
- (void)testUnauthenticatedSimplePutSpecialCharacter {
202+
XCTestExpectation *expectation =
203+
[self expectationWithDescription:@"testUnauthenticatedSimplePutDataEscapedName"];
204+
FIRStorageReference *ref = [self.storage referenceWithPath:@"ios/public/-._~!$'()*,=:@&+;"];
205+
206+
NSData *data = [@"Hello World" dataUsingEncoding:NSUTF8StringEncoding];
207+
208+
[ref putData:data
209+
metadata:nil
210+
completion:^(FIRStorageMetadata *metadata, NSError *error) {
211+
XCTAssertNotNil(metadata, "Metadata should not be nil");
212+
XCTAssertNil(error, "Error should be nil");
213+
[expectation fulfill];
214+
}];
215+
216+
[self waitForExpectations];
217+
}
218+
219+
- (void)testUnauthenticatedSimplePutDataInBackgroundQueue {
220+
XCTestExpectation *expectation =
221+
[self expectationWithDescription:@"testUnauthenticatedSimplePutDataInBackgroundQueue"];
222+
FIRStorageReference *ref = [self.storage referenceWithPath:@"ios/public/testBytesUpload"];
223+
224+
NSData *data = [@"Hello World" dataUsingEncoding:NSUTF8StringEncoding];
225+
226+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
227+
[ref putData:data
228+
metadata:nil
229+
completion:^(FIRStorageMetadata *metadata, NSError *error) {
230+
XCTAssertNotNil(metadata, "Metadata should not be nil");
231+
XCTAssertNil(error, "Error should be nil");
232+
[expectation fulfill];
233+
}];
234+
});
235+
236+
[self waitForExpectations];
237+
}
238+
201239
- (void)testUnauthenticatedSimplePutEmptyData {
202240
XCTestExpectation *expectation =
203241
[self expectationWithDescription:@"testUnauthenticatedSimplePutEmptyData"];
@@ -369,6 +407,24 @@ - (void)testUnauthenticatedSimpleGetData {
369407
[self waitForExpectations];
370408
}
371409

410+
- (void)testUnauthenticatedSimpleGetDataInBackgroundQueue {
411+
XCTestExpectation *expectation =
412+
[self expectationWithDescription:@"testUnauthenticatedSimpleGetDataInBackgroundQueue"];
413+
414+
FIRStorageReference *ref = [self.storage referenceWithPath:@"ios/public/1mb"];
415+
416+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
417+
[ref dataWithMaxSize:1 * 1024 * 1024
418+
completion:^(NSData *data, NSError *error) {
419+
XCTAssertNotNil(data, "Data should not be nil");
420+
XCTAssertNil(error, "Error should be nil");
421+
[expectation fulfill];
422+
}];
423+
});
424+
425+
[self waitForExpectations];
426+
}
427+
372428
- (void)testUnauthenticatedSimpleGetDataTooSmall {
373429
XCTestExpectation *expectation =
374430
[self expectationWithDescription:@"testUnauthenticatedSimpleGetDataTooSmall"];
@@ -615,6 +671,56 @@ - (void)testUnauthenticatedResumeGetFile {
615671
XCTAssertEqualWithAccuracy(sqrt(INT_MAX - 499), computationResult, 0.1);
616672
}
617673

674+
- (void)testUnauthenticatedResumeGetFileInBackgroundQueue {
675+
XCTestExpectation *expectation =
676+
[self expectationWithDescription:@"testUnauthenticatedResumeGetFileInBackgroundQueue"];
677+
678+
FIRStorageReference *ref = [self.storage referenceWithPath:@"ios/public/1mb"];
679+
680+
NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory()];
681+
NSURL *fileURL =
682+
[[tmpDirURL URLByAppendingPathComponent:@"hello"] URLByAppendingPathExtension:@"txt"];
683+
684+
__block long resumeAtBytes = 256 * 1024;
685+
__block long downloadedBytes = 0;
686+
687+
FIRStorageDownloadTask *task = [ref writeToFile:fileURL];
688+
689+
[task observeStatus:FIRStorageTaskStatusSuccess
690+
handler:^(FIRStorageTaskSnapshot *snapshot) {
691+
XCTAssertEqualObjects([snapshot description], @"<State: Success>");
692+
[expectation fulfill];
693+
}];
694+
695+
[task observeStatus:FIRStorageTaskStatusProgress
696+
handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) {
697+
XCTAssertTrue([[snapshot description] containsString:@"State: Progress"] ||
698+
[[snapshot description] containsString:@"State: Resume"]);
699+
NSProgress *progress = snapshot.progress;
700+
XCTAssertGreaterThanOrEqual(progress.completedUnitCount, downloadedBytes);
701+
downloadedBytes = progress.completedUnitCount;
702+
if (progress.completedUnitCount > resumeAtBytes) {
703+
NSLog(@"Pausing");
704+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
705+
[task pause];
706+
});
707+
resumeAtBytes = INT_MAX;
708+
}
709+
}];
710+
711+
[task observeStatus:FIRStorageTaskStatusPause
712+
handler:^(FIRStorageTaskSnapshot *snapshot) {
713+
XCTAssertEqualObjects([snapshot description], @"<State: Paused>");
714+
NSLog(@"Resuming");
715+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
716+
[task resume];
717+
});
718+
}];
719+
720+
[self waitForExpectations];
721+
XCTAssertEqual(INT_MAX, resumeAtBytes);
722+
}
723+
618724
- (void)waitForExpectations {
619725
[self waitForExpectationsWithTimeout:kFIRStorageIntegrationTestTimeout
620726
handler:^(NSError *_Nullable error) {

Example/Storage/Tests/Unit/FIRStorageDeleteTests.m

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
@interface FIRStorageDeleteTests : XCTestCase
1919

2020
@property(strong, nonatomic) GTMSessionFetcherService *fetcherService;
21+
@property(nonatomic) dispatch_queue_t dispatchQueue;
2122
@property(strong, nonatomic) FIRStorageMetadata *metadata;
2223
@property(strong, nonatomic) FIRStorage *storage;
2324
@property(strong, nonatomic) id mockApp;
@@ -45,6 +46,8 @@ - (void)setUp {
4546
fetcherService:self.fetcherService
4647
authProvider:nil];
4748

49+
self.dispatchQueue = dispatch_queue_create("Test dispatch queue", DISPATCH_QUEUE_SERIAL);
50+
4851
self.storage = [FIRStorage storageForApp:self.mockApp];
4952
}
5053

@@ -76,6 +79,7 @@ - (void)testFetcherConfiguration {
7679
FIRStorageReference *ref = [[FIRStorageReference alloc] initWithStorage:self.storage path:path];
7780
FIRStorageDeleteTask *task = [[FIRStorageDeleteTask alloc] initWithReference:ref
7881
fetcherService:self.fetcherService
82+
dispatchQueue:self.dispatchQueue
7983
completion:^(NSError *error) {
8084
[expectation fulfill];
8185
}];
@@ -92,6 +96,7 @@ - (void)testSuccessfulFetch {
9296
FIRStorageReference *ref = [[FIRStorageReference alloc] initWithStorage:self.storage path:path];
9397
FIRStorageDeleteTask *task = [[FIRStorageDeleteTask alloc] initWithReference:ref
9498
fetcherService:self.fetcherService
99+
dispatchQueue:self.dispatchQueue
95100
completion:^(NSError *error) {
96101
XCTAssertEqual(error, nil);
97102
[expectation fulfill];
@@ -111,6 +116,7 @@ - (void)testUnsuccessfulFetchUnauthenticated {
111116
FIRStorageDeleteTask *task = [[FIRStorageDeleteTask alloc]
112117
initWithReference:ref
113118
fetcherService:self.fetcherService
119+
dispatchQueue:self.dispatchQueue
114120
completion:^(NSError *error) {
115121
XCTAssertEqual(error.code, FIRStorageErrorCodeUnauthenticated);
116122
[expectation fulfill];
@@ -130,6 +136,7 @@ - (void)testUnsuccessfulFetchUnauthorized {
130136
FIRStorageDeleteTask *task = [[FIRStorageDeleteTask alloc]
131137
initWithReference:ref
132138
fetcherService:self.fetcherService
139+
dispatchQueue:self.dispatchQueue
133140
completion:^(NSError *error) {
134141
XCTAssertEqual(error.code, FIRStorageErrorCodeUnauthorized);
135142
[expectation fulfill];
@@ -149,6 +156,7 @@ - (void)testUnsuccessfulFetchObjectDoesntExist {
149156
FIRStorageDeleteTask *task = [[FIRStorageDeleteTask alloc]
150157
initWithReference:ref
151158
fetcherService:self.fetcherService
159+
dispatchQueue:self.dispatchQueue
152160
completion:^(NSError *error) {
153161
XCTAssertEqual(error.code, FIRStorageErrorCodeObjectNotFound);
154162
[expectation fulfill];

0 commit comments

Comments
 (0)