// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // // RUN: %target-run-simple-swift // REQUIRES: executable_test // REQUIRES: objc_interop import Foundation #if FOUNDATION_XCTEST import XCTest class TestURLSuper : XCTestCase { } #else import StdlibUnittest class TestURLSuper { } #endif class TestURL : TestURLSuper { func testBasics() { let url = URL(fileURLWithPath: NSTemporaryDirectory()) expectTrue(url.pathComponents.count > 0) } func testProperties() { let url = URL(fileURLWithPath: "/") do { let resourceValues = try url.resourceValues(forKeys: [.isVolumeKey, .nameKey]) if let isVolume = resourceValues.isVolume { expectTrue(isVolume) } expectNotNil(resourceValues.name) } catch { expectTrue(false, "Should not have thrown") } } func testSetProperties() { // Create a temporary file var file = URL(fileURLWithPath: NSTemporaryDirectory()) let name = "my_great_file" + UUID().uuidString file.appendPathComponent(name) let data = Data(bytes: [1, 2, 3, 4, 5]) do { try data.write(to: file) } catch { expectTrue(false, "Unable to write data") } // Modify an existing resource value do { var resourceValues = try file.resourceValues(forKeys: [.nameKey]) expectNotNil(resourceValues.name) expectEqual(resourceValues.name!, name) let newName = "goodbye cruel " + UUID().uuidString resourceValues.name = newName try file.setResourceValues(resourceValues) } catch { expectTrue(false, "Unable to set resources") } } #if os(macOS) func testQuarantineProperties() { // Test the quarantine stuff; it has special logic if #available(OSX 10.11, iOS 9.0, *) { // Create a temporary file var file = URL(fileURLWithPath: NSTemporaryDirectory()) let name = "my_great_file" + UUID().uuidString file.appendPathComponent(name) let data = Data(bytes: [1, 2, 3, 4, 5]) do { try data.write(to: file) } catch { expectTrue(false, "Unable to write data") } // Set the quarantine info on a file do { var resourceValues = URLResourceValues() resourceValues.quarantineProperties = ["LSQuarantineAgentName" : "TestURL"] try file.setResourceValues(resourceValues) } catch { expectTrue(false, "Unable to set quarantine info") } // Get the quarantine info back do { var resourceValues = try file.resourceValues(forKeys: [.quarantinePropertiesKey]) expectEqual(resourceValues.quarantineProperties?["LSQuarantineAgentName"] as? String, "TestURL") } catch { expectTrue(false, "Unable to get quarantine info") } // Clear the quarantine info do { var resourceValues = URLResourceValues() resourceValues.quarantineProperties = nil // this effectively sets a flag try file.setResourceValues(resourceValues) // Make sure that the resourceValues property returns nil expectNil(resourceValues.quarantineProperties) } catch { expectTrue(false, "Unable to clear quarantine info") } // Get the quarantine info back again do { var resourceValues = try file.resourceValues(forKeys: [.quarantinePropertiesKey]) expectNil(resourceValues.quarantineProperties) } catch { expectTrue(false, "Unable to get quarantine info after clearing") } } } #endif func testMoreSetProperties() { // Create a temporary file var file = URL(fileURLWithPath: NSTemporaryDirectory()) let name = "my_great_file" + UUID().uuidString file.appendPathComponent(name) let data = Data(bytes: [1, 2, 3, 4, 5]) do { try data.write(to: file) } catch { expectTrue(false, "Unable to write data") } do { var resourceValues = try file.resourceValues(forKeys: [.labelNumberKey]) expectNotNil(resourceValues.labelNumber) // set label number resourceValues.labelNumber = 1 try file.setResourceValues(resourceValues) // get label number let _ = try file.resourceValues(forKeys: [.labelNumberKey]) expectNotNil(resourceValues.labelNumber) expectEqual(resourceValues.labelNumber!, 1) } catch (let e as NSError) { expectTrue(false, "Unable to load or set resources \(e)") } catch { expectTrue(false, "Unable to load or set resources (mysterious error)") } // Construct values from scratch do { var resourceValues = URLResourceValues() resourceValues.labelNumber = 2 try file.setResourceValues(resourceValues) let resourceValues2 = try file.resourceValues(forKeys: [.labelNumberKey]) expectNotNil(resourceValues2.labelNumber) expectEqual(resourceValues2.labelNumber!, 2) } catch (let e as NSError) { expectTrue(false, "Unable to load or set resources \(e)") } catch { expectTrue(false, "Unable to load or set resources (mysterious error)") } do { try FileManager.default.removeItem(at: file) } catch { expectTrue(false, "Unable to remove file") } } func testURLComponents() { // Not meant to be a test of all URL components functionality, just some basic bridging stuff let s = "http://www.apple.com/us/search/ipad?src=global%7Cnav" var components = URLComponents(string: s)! expectNotNil(components) expectNotNil(components.host) expectEqual("www.apple.com", components.host) if #available(OSX 10.11, iOS 9.0, *) { let rangeOfHost = components.rangeOfHost! expectNotNil(rangeOfHost) expectEqual(s[rangeOfHost], "www.apple.com") } if #available(OSX 10.10, iOS 8.0, *) { let qi = components.queryItems! expectNotNil(qi) expectEqual(1, qi.count) let first = qi[0] expectEqual("src", first.name) expectNotNil(first.value) expectEqual("global|nav", first.value) } if #available(OSX 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) { components.percentEncodedQuery = "name1%E2%80%A2=value1%E2%80%A2&name2%E2%80%A2=value2%E2%80%A2" var qi = components.queryItems! expectNotNil(qi) expectEqual(2, qi.count) expectEqual("name1•", qi[0].name) expectNotNil(qi[0].value) expectEqual("value1•", qi[0].value) expectEqual("name2•", qi[1].name) expectNotNil(qi[1].value) expectEqual("value2•", qi[1].value) qi = components.percentEncodedQueryItems! expectNotNil(qi) expectEqual(2, qi.count) expectEqual("name1%E2%80%A2", qi[0].name) expectNotNil(qi[0].value) expectEqual("value1%E2%80%A2", qi[0].value) expectEqual("name2%E2%80%A2", qi[1].name) expectNotNil(qi[0].value) expectEqual("value2%E2%80%A2", qi[1].value) qi[0].name = "%E2%80%A2name1" qi[0].value = "%E2%80%A2value1" qi[1].name = "%E2%80%A2name2" qi[1].value = "%E2%80%A2value2" components.percentEncodedQueryItems = qi expectEqual("%E2%80%A2name1=%E2%80%A2value1&%E2%80%A2name2=%E2%80%A2value2", components.percentEncodedQuery) } } func testURLResourceValues() { let fileName = "temp_file" var dir = URL(fileURLWithPath: NSTemporaryDirectory()) dir.appendPathComponent(UUID().uuidString) try! FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true, attributes: nil) dir.appendPathComponent(fileName) try! Data(bytes: [1,2,3,4]).write(to: dir) defer { do { try FileManager.default.removeItem(at: dir) } catch { // Oh well } } do { let values = try dir.resourceValues(forKeys: [.nameKey, .isDirectoryKey]) expectEqual(values.name, fileName) expectFalse(values.isDirectory!) expectEqual(nil, values.creationDate) // Didn't ask for this } catch { expectTrue(false, "Unable to get resource value") } let originalDate : Date do { var values = try dir.resourceValues(forKeys: [.creationDateKey]) expectNotEqual(nil, values.creationDate) originalDate = values.creationDate! } catch { originalDate = Date() expectTrue(false, "Unable to get creation date") } let newDate = originalDate + 100 do { var values = URLResourceValues() values.creationDate = newDate try dir.setResourceValues(values) } catch { expectTrue(false, "Unable to set resource value") } do { let values = try dir.resourceValues(forKeys: [.creationDateKey]) expectEqual(newDate, values.creationDate) } catch { expectTrue(false, "Unable to get values") } } func test_AnyHashableContainingURL() { let values: [URL] = [ URL(string: "https://example.com/")!, URL(string: "https://example.org/")!, URL(string: "https://example.org/")!, ] let anyHashables = values.map(AnyHashable.init) expectEqual(URL.self, type(of: anyHashables[0].base)) expectEqual(URL.self, type(of: anyHashables[1].base)) expectEqual(URL.self, type(of: anyHashables[2].base)) expectNotEqual(anyHashables[0], anyHashables[1]) expectEqual(anyHashables[1], anyHashables[2]) } func test_AnyHashableCreatedFromNSURL() { let values: [NSURL] = [ NSURL(string: "https://example.com/")!, NSURL(string: "https://example.org/")!, NSURL(string: "https://example.org/")!, ] let anyHashables = values.map(AnyHashable.init) expectEqual(URL.self, type(of: anyHashables[0].base)) expectEqual(URL.self, type(of: anyHashables[1].base)) expectEqual(URL.self, type(of: anyHashables[2].base)) expectNotEqual(anyHashables[0], anyHashables[1]) expectEqual(anyHashables[1], anyHashables[2]) } func test_AnyHashableContainingURLComponents() { let values: [URLComponents] = [ URLComponents(string: "https://example.com/")!, URLComponents(string: "https://example.org/")!, URLComponents(string: "https://example.org/")!, ] let anyHashables = values.map(AnyHashable.init) expectEqual(URLComponents.self, type(of: anyHashables[0].base)) expectEqual(URLComponents.self, type(of: anyHashables[1].base)) expectEqual(URLComponents.self, type(of: anyHashables[2].base)) expectNotEqual(anyHashables[0], anyHashables[1]) expectEqual(anyHashables[1], anyHashables[2]) } func test_AnyHashableCreatedFromNSURLComponents() { let values: [NSURLComponents] = [ NSURLComponents(string: "https://example.com/")!, NSURLComponents(string: "https://example.org/")!, NSURLComponents(string: "https://example.org/")!, ] let anyHashables = values.map(AnyHashable.init) expectEqual(URLComponents.self, type(of: anyHashables[0].base)) expectEqual(URLComponents.self, type(of: anyHashables[1].base)) expectEqual(URLComponents.self, type(of: anyHashables[2].base)) expectNotEqual(anyHashables[0], anyHashables[1]) expectEqual(anyHashables[1], anyHashables[2]) } func test_AnyHashableContainingURLQueryItem() { if #available(OSX 10.10, iOS 8.0, *) { let values: [URLQueryItem] = [ URLQueryItem(name: "foo", value: nil), URLQueryItem(name: "bar", value: nil), URLQueryItem(name: "bar", value: nil), ] let anyHashables = values.map(AnyHashable.init) expectEqual(URLQueryItem.self, type(of: anyHashables[0].base)) expectEqual(URLQueryItem.self, type(of: anyHashables[1].base)) expectEqual(URLQueryItem.self, type(of: anyHashables[2].base)) expectNotEqual(anyHashables[0], anyHashables[1]) expectEqual(anyHashables[1], anyHashables[2]) } } func test_AnyHashableCreatedFromNSURLQueryItem() { if #available(OSX 10.10, iOS 8.0, *) { let values: [NSURLQueryItem] = [ NSURLQueryItem(name: "foo", value: nil), NSURLQueryItem(name: "bar", value: nil), NSURLQueryItem(name: "bar", value: nil), ] let anyHashables = values.map(AnyHashable.init) expectEqual(URLQueryItem.self, type(of: anyHashables[0].base)) expectEqual(URLQueryItem.self, type(of: anyHashables[1].base)) expectEqual(URLQueryItem.self, type(of: anyHashables[2].base)) expectNotEqual(anyHashables[0], anyHashables[1]) expectEqual(anyHashables[1], anyHashables[2]) } } func test_AnyHashableContainingURLRequest() { let values: [URLRequest] = [ URLRequest(url: URL(string: "https://example.com/")!), URLRequest(url: URL(string: "https://example.org/")!), URLRequest(url: URL(string: "https://example.org/")!), ] let anyHashables = values.map(AnyHashable.init) expectEqual(URLRequest.self, type(of: anyHashables[0].base)) expectEqual(URLRequest.self, type(of: anyHashables[1].base)) expectEqual(URLRequest.self, type(of: anyHashables[2].base)) expectNotEqual(anyHashables[0], anyHashables[1]) expectEqual(anyHashables[1], anyHashables[2]) } func test_AnyHashableCreatedFromNSURLRequest() { let values: [NSURLRequest] = [ NSURLRequest(url: URL(string: "https://example.com/")!), NSURLRequest(url: URL(string: "https://example.org/")!), NSURLRequest(url: URL(string: "https://example.org/")!), ] let anyHashables = values.map(AnyHashable.init) expectEqual(URLRequest.self, type(of: anyHashables[0].base)) expectEqual(URLRequest.self, type(of: anyHashables[1].base)) expectEqual(URLRequest.self, type(of: anyHashables[2].base)) expectNotEqual(anyHashables[0], anyHashables[1]) expectEqual(anyHashables[1], anyHashables[2]) } } #if !FOUNDATION_XCTEST var URLTests = TestSuite("TestURL") URLTests.test("testBasics") { TestURL().testBasics() } URLTests.test("testProperties") { TestURL().testProperties() } URLTests.test("testSetProperties") { TestURL().testSetProperties() } #if os(macOS) URLTests.test("testQuarantineProperties") { TestURL().testQuarantineProperties() } #endif URLTests.test("testMoreSetProperties") { TestURL().testMoreSetProperties() } URLTests.test("testURLComponents") { TestURL().testURLComponents() } URLTests.test("testURLResourceValues") { TestURL().testURLResourceValues() } URLTests.test("test_AnyHashableContainingURL") { TestURL().test_AnyHashableContainingURL() } URLTests.test("test_AnyHashableCreatedFromNSURL") { TestURL().test_AnyHashableCreatedFromNSURL() } URLTests.test("test_AnyHashableContainingURLComponents") { TestURL().test_AnyHashableContainingURLComponents() } URLTests.test("test_AnyHashableCreatedFromNSURLComponents") { TestURL().test_AnyHashableCreatedFromNSURLComponents() } URLTests.test("test_AnyHashableContainingURLQueryItem") { TestURL().test_AnyHashableContainingURLQueryItem() } URLTests.test("test_AnyHashableCreatedFromNSURLQueryItem") { TestURL().test_AnyHashableCreatedFromNSURLQueryItem() } URLTests.test("test_AnyHashableContainingURLRequest") { TestURL().test_AnyHashableContainingURLRequest() } URLTests.test("test_AnyHashableCreatedFromNSURLRequest") { TestURL().test_AnyHashableCreatedFromNSURLRequest() } runAllTests() #endif