Skip to content

Commit 6dc7357

Browse files
committed
Actually return the base storage directory for NSFileProviderItemIdentifier.rootContainer
1 parent 5a8baba commit 6dc7357

File tree

5 files changed

+95
-18
lines changed

5 files changed

+95
-18
lines changed

Cryptomator.xcodeproj/project.pbxproj

+8
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@
231231
4AB1C33C265E9DBC00DC7A49 /* CloudTaskExecutorTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AB1C33B265E9DBC00DC7A49 /* CloudTaskExecutorTestCase.swift */; };
232232
4AB1D4EC27D0E027009060AB /* LocalURLProviderType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AB1D4EB27D0E027009060AB /* LocalURLProviderType.swift */; };
233233
4AB1D4EE27D0E9EA009060AB /* LocalURLProviderMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AB1D4ED27D0E9EA009060AB /* LocalURLProviderMock.swift */; };
234+
4AB1D4F027D20420009060AB /* LocalURLProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AB1D4EF27D20420009060AB /* LocalURLProviderTests.swift */; };
235+
4AB1D4F227D20510009060AB /* DocumentStorageURLProviderMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AB1D4F127D20510009060AB /* DocumentStorageURLProviderMock.swift */; };
234236
4AB2E7ED2791A97B00BDBB18 /* CheckMarkCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AB2E7EC2791A97B00BDBB18 /* CheckMarkCell.swift */; };
235237
4AB2E7EF2791B98A00BDBB18 /* KeepUnlockedSectionFooterViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AB2E7EE2791B98A00BDBB18 /* KeepUnlockedSectionFooterViewModel.swift */; };
236238
4AB52338275F7AB0009B8D99 /* LoadingButtonCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AB52337275F7AB0009B8D99 /* LoadingButtonCellViewModel.swift */; };
@@ -705,6 +707,8 @@
705707
4AB1C33B265E9DBC00DC7A49 /* CloudTaskExecutorTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTaskExecutorTestCase.swift; sourceTree = "<group>"; };
706708
4AB1D4EB27D0E027009060AB /* LocalURLProviderType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalURLProviderType.swift; sourceTree = "<group>"; };
707709
4AB1D4ED27D0E9EA009060AB /* LocalURLProviderMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalURLProviderMock.swift; sourceTree = "<group>"; };
710+
4AB1D4EF27D20420009060AB /* LocalURLProviderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalURLProviderTests.swift; sourceTree = "<group>"; };
711+
4AB1D4F127D20510009060AB /* DocumentStorageURLProviderMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentStorageURLProviderMock.swift; sourceTree = "<group>"; };
708712
4AB2E7EC2791A97B00BDBB18 /* CheckMarkCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckMarkCell.swift; sourceTree = "<group>"; };
709713
4AB2E7EE2791B98A00BDBB18 /* KeepUnlockedSectionFooterViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeepUnlockedSectionFooterViewModel.swift; sourceTree = "<group>"; };
710714
4AB52337275F7AB0009B8D99 /* LoadingButtonCellViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingButtonCellViewModel.swift; sourceTree = "<group>"; };
@@ -1019,6 +1023,7 @@
10191023
4AEECD38279EB1EB00C6E2B5 /* FileProviderEnumeratorTests.swift */,
10201024
4A797F8E24AC6731007DDBE1 /* FileProviderItemTests.swift */,
10211025
4A9C8DFC27A007C2000063E4 /* FileProviderNotificatorTests.swift */,
1026+
4AB1D4EF27D20420009060AB /* LocalURLProviderTests.swift */,
10221027
4AEFF7F327145CB400D6CB99 /* LogLevelUpdatingServiceSourceTests.swift */,
10231028
4ADC66C427A7F6D6002E6CC7 /* UnlockMonitorTests.swift */,
10241029
4A4F47F224B875070033328B /* URL+NameCollisionExtensionTests.swift */,
@@ -1485,6 +1490,7 @@
14851490
4AB6A891278EFC730016B01E /* VaultManagerMock.swift */,
14861491
4ADC66C827A962C2002E6CC7 /* VaultPasswordManagerMock.swift */,
14871492
4AEECD30279EA50D00C6E2B5 /* WorkingSetObservingMock.swift */,
1493+
4AB1D4F127D20510009060AB /* DocumentStorageURLProviderMock.swift */,
14881494
);
14891495
path = Mocks;
14901496
sourceTree = "<group>";
@@ -2225,6 +2231,7 @@
22252231
4AEECD3B279EB24300C6E2B5 /* NSFileProviderEnumerationObserverMock.swift in Sources */,
22262232
4A8F149C266A29E400ADBCE4 /* OnlineItemNameCollisionHandlerTests.swift in Sources */,
22272233
4A8F14A2266A302A00ADBCE4 /* FileProviderAdapterTestCase.swift in Sources */,
2234+
4AB1D4F027D20420009060AB /* LocalURLProviderTests.swift in Sources */,
22282235
4A3E2FEC271DC9670090BD44 /* MaintenanceManagerTests.swift in Sources */,
22292236
4A717CD924C835740048E08F /* ReparentTaskManagerTests.swift in Sources */,
22302237
4A9C8E0327A016CF000063E4 /* WorkingSetObserverTests.swift in Sources */,
@@ -2233,6 +2240,7 @@
22332240
4AB6A896278F07B20016B01E /* FileProviderAdapterTypeMock.swift in Sources */,
22342241
4AEECD39279EB1EB00C6E2B5 /* FileProviderEnumeratorTests.swift in Sources */,
22352242
4ADC66BF27A44558002E6CC7 /* XCTestCase+Promises.swift in Sources */,
2243+
4AB1D4F227D20510009060AB /* DocumentStorageURLProviderMock.swift in Sources */,
22362244
4A797F8F24AC6731007DDBE1 /* FileProviderItemTests.swift in Sources */,
22372245
4A5AC4392758EC9400342AA7 /* FullVersionCheckerMock.swift in Sources */,
22382246
4A9C8E0127A0104E000063E4 /* EnumerationSignalingMock.swift in Sources */,

CryptomatorFileProvider/LocalURLProviderType.swift

+11-6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ public extension LocalURLProviderType {
3030
- Note: The path for the `NSFileProviderItemIdentifier.rootContainer` is `<base storage directory>`
3131
*/
3232
func urlForItem(withPersistentIdentifier identifier: NSFileProviderItemIdentifier, itemName: String) -> URL? {
33+
let itemIdentifierDirectory = itemIdentifierDirectoryURLForItem(withPersistentIdentifier: identifier)
34+
if identifier == .rootContainer {
35+
return itemIdentifierDirectory
36+
}
3337
return itemIdentifierDirectoryURLForItem(withPersistentIdentifier: identifier)?.appendingPathComponent(itemName, isDirectory: false)
3438
}
3539

@@ -48,35 +52,36 @@ public extension LocalURLProviderType {
4852

4953
public class LocalURLProvider: LocalURLProviderType {
5054
private let domain: NSFileProviderDomain
55+
private let documentStorageURLProvider: DocumentStorageURLProvider
5156

52-
public init(domain: NSFileProviderDomain) {
57+
public init(domain: NSFileProviderDomain, documentStorageURLProvider: DocumentStorageURLProvider = NSFileProviderManager.default) {
5358
self.domain = domain
59+
self.documentStorageURLProvider = documentStorageURLProvider
5460
}
5561

5662
public func itemIdentifierDirectoryURLForItem(withPersistentIdentifier identifier: NSFileProviderItemIdentifier) -> URL? {
63+
let baseStorageDirectoryURL = getBaseStorageDirectory()
5764
if identifier == .rootContainer {
58-
return getBaseStorageDirectory()
65+
return baseStorageDirectoryURL
5966
}
60-
let baseStorageDirectoryURL = getBaseStorageDirectory()
6167
return baseStorageDirectoryURL?.appendingPathComponent(identifier.rawValue, isDirectory: true)
6268
}
6369

6470
private func getBaseStorageDirectory() -> URL? {
6571
let domainDocumentStorage = domain.pathRelativeToDocumentStorage
66-
let manager = NSFileProviderManager.default
6772
do {
6873
try excludeFileProviderDocumentStorageFromiCloudBackup()
6974
} catch {
7075
DDLogError("Exclude FileProviderDocumentStorage from iCloud backup failed with error: \(error)")
7176
return nil
7277
}
73-
return manager.documentStorageURL.appendingPathComponent(domainDocumentStorage)
78+
return documentStorageURLProvider.documentStorageURL.appendingPathComponent(domainDocumentStorage)
7479
}
7580

7681
private func excludeFileProviderDocumentStorageFromiCloudBackup() throws {
7782
var values = URLResourceValues()
7883
values.isExcludedFromBackup = true
79-
var documentStorageURL = NSFileProviderManager.default.documentStorageURL
84+
var documentStorageURL = documentStorageURLProvider.documentStorageURL
8085
try documentStorageURL.setResourceValues(values)
8186
}
8287
}

CryptomatorFileProviderTests/FileProviderCacheManagerTests.swift

-12
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,3 @@ class FileProviderCacheManagerTests: CacheTestCase {
104104
XCTAssertNil(try cacheManager.getLocalCachedFileInfo(for: 1))
105105
}
106106
}
107-
108-
private class DocumentStorageURLProviderMock: DocumentStorageURLProvider {
109-
private let tmpDirURL: URL
110-
111-
init(tmpDirURL: URL) {
112-
self.tmpDirURL = tmpDirURL
113-
}
114-
115-
var documentStorageURL: URL {
116-
return tmpDirURL
117-
}
118-
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//
2+
// LocalURLProviderTests.swift
3+
// CryptomatorFileProviderTests
4+
//
5+
// Created by Philipp Schmid on 04.03.22.
6+
// Copyright © 2022 Skymatic GmbH. All rights reserved.
7+
//
8+
9+
import CryptomatorFileProvider
10+
import FileProvider
11+
import XCTest
12+
13+
class LocalURLProviderTests: XCTestCase {
14+
let domain = NSFileProviderDomain(vaultUID: "12345", displayName: "TestDomain")
15+
var localURLProvider: LocalURLProvider!
16+
var documentStorageURLProviderMock: DocumentStorageURLProviderMock!
17+
var documentStorageURL: URL!
18+
var baseStorageDirectoryURL: URL {
19+
documentStorageURL.appendingPathComponent(domain.pathRelativeToDocumentStorage, isDirectory: true)
20+
}
21+
22+
override func setUpWithError() throws {
23+
documentStorageURL = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString, isDirectory: true)
24+
try FileManager.default.createDirectory(at: documentStorageURL, withIntermediateDirectories: false)
25+
documentStorageURLProviderMock = DocumentStorageURLProviderMock(tmpDirURL: documentStorageURL)
26+
localURLProvider = LocalURLProvider(domain: domain, documentStorageURLProvider: documentStorageURLProviderMock)
27+
}
28+
29+
override func tearDownWithError() throws {
30+
try FileManager.default.removeItem(at: documentStorageURL)
31+
}
32+
33+
// MARK: URL For Item
34+
35+
func testURLForItemForRootContainer() throws {
36+
XCTAssertEqual(baseStorageDirectoryURL.path, localURLProvider.urlForItem(withPersistentIdentifier: .rootContainer, itemName: "Home")?.path)
37+
try assertDocumentStorageURLExcludedFromiCloudBackup()
38+
}
39+
40+
func testURLForItemForNormalIdentifier() throws {
41+
let identifier = NSFileProviderItemIdentifier("2")
42+
let itemName = "test.txt"
43+
let itemIdentifierDirectory = baseStorageDirectoryURL.appendingPathComponent("2", isDirectory: true)
44+
let expectedItemURL = itemIdentifierDirectory.appendingPathComponent(itemName, isDirectory: false)
45+
XCTAssertEqual(expectedItemURL, localURLProvider.urlForItem(withPersistentIdentifier: identifier, itemName: itemName))
46+
try assertDocumentStorageURLExcludedFromiCloudBackup()
47+
}
48+
49+
private func assertDocumentStorageURLExcludedFromiCloudBackup() throws {
50+
let resourceValues = try documentStorageURL.resourceValues(forKeys: [.isExcludedFromBackupKey])
51+
let documentStorageIsExcludedFromBackup = try XCTUnwrap(resourceValues.isExcludedFromBackup)
52+
XCTAssert(documentStorageIsExcludedFromBackup)
53+
}
54+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//
2+
// DocumentStorageURLProviderMock.swift
3+
// CryptomatorFileProviderTests
4+
//
5+
// Created by Philipp Schmid on 04.03.22.
6+
// Copyright © 2022 Skymatic GmbH. All rights reserved.
7+
//
8+
9+
import CryptomatorFileProvider
10+
import Foundation
11+
12+
class DocumentStorageURLProviderMock: DocumentStorageURLProvider {
13+
private let tmpDirURL: URL
14+
15+
init(tmpDirURL: URL) {
16+
self.tmpDirURL = tmpDirURL
17+
}
18+
19+
var documentStorageURL: URL {
20+
return tmpDirURL
21+
}
22+
}

0 commit comments

Comments
 (0)