Skip to content
This repository was archived by the owner on Aug 8, 2023. It is now read-only.

[ios] Set backup exclusion flag after initializing DefaultFileSource #5124

Merged
merged 3 commits into from
May 25, 2016
Merged
Changes from 1 commit
Commits
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
Next Next commit
[ios] Set backup exclusion flag after initializing DefaultFileSource
Speculative fix for App Store apps backing-up the offline/ambient cache.
  • Loading branch information
friedbunny committed May 24, 2016
commit 9b4324ce4d6ae59e4dd4ee118c06cbc909b7a1e9
14 changes: 7 additions & 7 deletions platform/darwin/src/MGLOfflineStorage.mm
Original file line number Diff line number Diff line change
@@ -64,12 +64,6 @@ - (instancetype)init {
NSURL *cacheURL = [cacheDirectoryURL URLByAppendingPathComponent:MGLOfflineStorageFileName];
NSString *cachePath = cacheURL ? cacheURL.path : @"";

// Avoid backing up the offline cache onto iCloud, because it can be
// redownloaded. Ideally, we’d even put the ambient cache in Caches, so
// it can be reclaimed by the system when disk space runs low. But
// unfortunately it has to live in the same file as offline resources.
[cacheURL setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:NULL];

// Move the offline cache from v3.2.0-beta.1 to a location that can also
// be used for ambient caching.
#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR
@@ -92,7 +86,13 @@ - (instancetype)init {
}

_mbglFileSource = new mbgl::DefaultFileSource(cachePath.UTF8String, [NSBundle mainBundle].resourceURL.path.UTF8String);


// Avoid backing up the offline cache onto iCloud, because it can be
// redownloaded. Ideally, we’d even put the ambient cache in Caches, so
// it can be reclaimed by the system when disk space runs low. But
// unfortunately it has to live in the same file as offline resources.
[cacheURL setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:NULL];

// Observe for changes to the global access token (and find out the current one).
[[MGLAccountManager sharedManager] addObserver:self
forKeyPath:@"accessToken"
23 changes: 23 additions & 0 deletions platform/darwin/test/MGLOfflineStorageTests.m
Original file line number Diff line number Diff line change
@@ -97,6 +97,29 @@ - (void)testAddPack {
[self waitForExpectationsWithTimeout:1 handler:nil];
}

- (void)testBackupExclusion {
NSURL *cacheDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory
inDomain:NSUserDomainMask
appropriateForURL:nil
create:NO
error:nil];
// Unit tests don't use the main bundle; use com.mapbox.ios.sdk instead.
NSString *bundleIdentifier = [NSBundle bundleForClass:[MGLMapView class]].bundleIdentifier;
cacheDirectoryURL = [cacheDirectoryURL URLByAppendingPathComponent:bundleIdentifier];
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:cacheDirectoryURL.path], @"Cache directory should exist.");

NSURL *cacheURL = [cacheDirectoryURL URLByAppendingPathComponent:@"cache.db"];
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:cacheURL.path], @"Cache database should exist.");

NSError *error = nil;
NSNumber *exclusionFlag = nil;
[cacheURL getResourceValue:&exclusionFlag
forKey:NSURLIsExcludedFromBackupKey
error:&error];
XCTAssertTrue([exclusionFlag boolValue], @"Backup exclusion flag should be set for cache database.");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: check for nil before downcasting to a BOOL. Either would be a failure in this case, but this is a reminder in case we’ve made a similar assumption elsewhere.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which would be the runtime behavior when exclusionFlag == nil?

(lldb) po [exclusionFlag boolValue]
<nil>

(lldb) p [exclusionFlag boolValue]
(BOOL) $2 = NO

nil, no?

Copy link
Contributor

@1ec5 1ec5 May 24, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When exclusionFlag is nil, [exclusionFlag boolValue] is NO, just as if exclusionFlag had been equal to @NO. By invoking the po command, you’re treating the BOOL as an object pointer and attempting to print its -description, which is nil. If we ever have to test that a boolValue is NO, either in tests or in production code, be sure to distinguish between nil and @NO.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added an extra check that exclusionFlag exists in 6becc07.

XCTAssertNil(error, @"No errors should be returned when checking backup exclusion flag.");
}

- (void)testRemovePack {
NSUInteger countOfPacks = [MGLOfflineStorage sharedOfflineStorage].packs.count;