1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2019 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
//
//===----------------------------------------------------------------------===//
import BuildServerProtocol
import Foundation
import ISDBTestSupport
import LSPTestSupport
import LanguageServerProtocol
import SKCore
import SKTestSupport
import TSCBasic
import XCTest
/// The path to the INPUTS directory of shared test projects.
private let skTestSupportInputsDirectory: URL = {
#if os(macOS)
// FIXME: Use Bundle.module.resourceURL once the fix for SR-12912 is released.
var resources =
productsDirectory
.appendingPathComponent("SourceKitLSP_SKTestSupport.bundle")
.appendingPathComponent("Contents")
.appendingPathComponent("Resources")
if !FileManager.default.fileExists(atPath: resources.path) {
// Xcode and command-line swiftpm differ about the path.
resources.deleteLastPathComponent()
resources.deleteLastPathComponent()
}
#else
let resources = XCTestCase.productsDirectory
.appendingPathComponent("SourceKitLSP_SKTestSupport.resources")
#endif
guard FileManager.default.fileExists(atPath: resources.path) else {
fatalError("missing resources \(resources.path)")
}
return resources.appendingPathComponent("INPUTS", isDirectory: true).standardizedFileURL
}()
final class BuildServerBuildSystemTests: XCTestCase {
private var root: AbsolutePath {
try! AbsolutePath(
validating:
skTestSupportInputsDirectory
.appendingPathComponent(testDirectoryName, isDirectory: true).path
)
}
let buildFolder = try! AbsolutePath(validating: NSTemporaryDirectory())
func testServerInitialize() async throws {
let buildSystem = try await BuildServerBuildSystem(projectRoot: root)
assertEqual(
await buildSystem.indexDatabasePath,
try AbsolutePath(validating: "some/index/db/path", relativeTo: root)
)
assertEqual(
await buildSystem.indexStorePath,
try AbsolutePath(validating: "some/index/store/path", relativeTo: root)
)
}
func testFileRegistration() async throws {
let buildSystem = try await BuildServerBuildSystem(projectRoot: root)
let fileUrl = URL(fileURLWithPath: "/some/file/path")
let expectation = XCTestExpectation(description: "\(fileUrl) settings updated")
let buildSystemDelegate = TestDelegate(settingsExpectations: [DocumentURI(fileUrl): expectation])
defer {
// BuildSystemManager has a weak reference to delegate. Keep it alive.
_fixLifetime(buildSystemDelegate)
}
await buildSystem.setDelegate(buildSystemDelegate)
await buildSystem.registerForChangeNotifications(for: DocumentURI(fileUrl))
XCTAssertEqual(XCTWaiter.wait(for: [expectation], timeout: defaultTimeout), .completed)
}
func testBuildTargetsChanged() async throws {
let buildSystem = try await BuildServerBuildSystem(projectRoot: root)
let fileUrl = URL(fileURLWithPath: "/some/file/path")
let expectation = XCTestExpectation(description: "target changed")
let targetIdentifier = BuildTargetIdentifier(uri: try DocumentURI(string: "build://target/a"))
let buildSystemDelegate = TestDelegate(targetExpectations: [
BuildTargetEvent(
target: targetIdentifier,
kind: .created,
data: .dictionary(["key": "value"])
): expectation
])
defer {
// BuildSystemManager has a weak reference to delegate. Keep it alive.
_fixLifetime(buildSystemDelegate)
}
await buildSystem.setDelegate(buildSystemDelegate)
await buildSystem.registerForChangeNotifications(for: DocumentURI(fileUrl))
try await fulfillmentOfOrThrow([expectation])
}
}
final class TestDelegate: BuildSystemDelegate {
let settingsExpectations: [DocumentURI: XCTestExpectation]
let targetExpectations: [BuildTargetEvent: XCTestExpectation]
let dependenciesUpdatedExpectations: [DocumentURI: XCTestExpectation]
public init(
settingsExpectations: [DocumentURI: XCTestExpectation] = [:],
targetExpectations: [BuildTargetEvent: XCTestExpectation] = [:],
dependenciesUpdatedExpectations: [DocumentURI: XCTestExpectation] = [:]
) {
self.settingsExpectations = settingsExpectations
self.targetExpectations = targetExpectations
self.dependenciesUpdatedExpectations = dependenciesUpdatedExpectations
}
func buildTargetsChanged(_ changes: [BuildTargetEvent]) {
for event in changes {
targetExpectations[event]?.fulfill()
}
}
func fileBuildSettingsChanged(_ changedFiles: Set<DocumentURI>) {
for uri in changedFiles {
settingsExpectations[uri]?.fulfill()
}
}
public func filesDependenciesUpdated(_ changedFiles: Set<DocumentURI>) {
for uri in changedFiles {
dependenciesUpdatedExpectations[uri]?.fulfill()
}
}
func fileHandlingCapabilityChanged() {}
}
|