blob: 21f9205d615067a9bdff27e765a4bc15d025f568 [file] [log] [blame]
// 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