Files

91 lines
4.2 KiB
Swift

// Copyright (c) 2021 Spotify AB.
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
@testable import XCRemoteCache
import XCTest
class CacheInvalidatorTests: XCTestCase {
private var invalidator: LocalCacheInvalidator!
private var temporaryURL: URL!
override func setUpWithError() throws {
try super.setUpWithError()
temporaryURL = URL(fileURLWithPath: NSTemporaryDirectory())
// Set eviction policy to be at most 30 days
invalidator = LocalCacheInvalidator(localCacheURL: temporaryURL, maximumAgeInDays: 30)
}
func testLocalCacheInvalidatesOldFile() throws {
// Create the expected directory structure for an existing remote cache user
let metaDirURL = temporaryURL.appendingPathComponent("meta", isDirectory: true)
try FileManager.default.createDirectory(at: metaDirURL, withIntermediateDirectories: true)
let fileDirURL = temporaryURL.appendingPathComponent("file", isDirectory: true)
try FileManager.default.createDirectory(at: fileDirURL, withIntermediateDirectories: true)
// Create one file that is 60 days old and one that is 10 days old
let oldFileURL = metaDirURL.appendingPathComponent("old_file.json")
try Data().write(to: oldFileURL)
try FileManager.default.setAttributes(
[FileAttributeKey.creationDate: Date().daysAgo(days: 60)!],
ofItemAtPath: oldFileURL.path
)
let newFileURL = metaDirURL.appendingPathComponent("new_file.json")
try Data().write(to: newFileURL)
try FileManager.default.setAttributes(
[FileAttributeKey.creationDate: Date().daysAgo(days: 10)!],
ofItemAtPath: newFileURL.path
)
// We expect only the oldest to be evicted
XCTAssertTrue(FileManager.default.fileExists(atPath: newFileURL.path))
XCTAssertTrue(FileManager.default.fileExists(atPath: oldFileURL.path))
invalidator.invalidateArtifacts()
XCTAssertTrue(FileManager.default.fileExists(atPath: newFileURL.path))
XCTAssertFalse(FileManager.default.fileExists(atPath: oldFileURL.path))
}
func testLocalCacheInvalidatesEvenIfNoFilesDirectory() throws {
// Create only a meta directory structure for a first-time remote cache user
let metaDirURL = temporaryURL.appendingPathComponent("meta", isDirectory: true)
try FileManager.default.createDirectory(at: metaDirURL, withIntermediateDirectories: true)
// Create one file that is 60 days old and one that is 10 days old
let oldFileURL = metaDirURL.appendingPathComponent("old_file.json")
try Data().write(to: oldFileURL)
try FileManager.default.setAttributes(
[FileAttributeKey.creationDate: Date().daysAgo(days: 40)!],
ofItemAtPath: oldFileURL.path
)
let newFileURL = metaDirURL.appendingPathComponent("new_file.json")
try Data().write(to: newFileURL)
try FileManager.default.setAttributes(
[FileAttributeKey.creationDate: Date().daysAgo(days: 5)!],
ofItemAtPath: newFileURL.path
)
// We expect only the oldest to be evicted
XCTAssertTrue(FileManager.default.fileExists(atPath: newFileURL.path))
XCTAssertTrue(FileManager.default.fileExists(atPath: oldFileURL.path))
invalidator.invalidateArtifacts()
XCTAssertTrue(FileManager.default.fileExists(atPath: newFileURL.path))
XCTAssertFalse(FileManager.default.fileExists(atPath: oldFileURL.path))
}
}