Skip to content

[Tests] - FIX - several tests to run on linux target. #41

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 18, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions Sources/SwiftDriver/Jobs/Toolchain+LinkerSupport.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,9 @@ extension Toolchain {
let resourceDirBase: AbsolutePath
if let resourceDir = parsedOptions.getLastArgument(.resourceDir) {
resourceDirBase = try AbsolutePath(validating: resourceDir.asSingle)
} else if let sdk = parsedOptions.getLastArgument(.sdk), !triple.isDarwin {
resourceDirBase = try AbsolutePath(validating: sdk.asSingle)
} else if let sdk = parsedOptions.getLastArgument(.sdk),
let sdkPath = try? AbsolutePath(validating: sdk.asSingle) {
resourceDirBase = sdkPath
.appending(components: "usr", "lib",
isShared ? "swift" : "swift_static")
} else {
Expand Down
13 changes: 11 additions & 2 deletions Sources/SwiftDriver/Toolchains/Toolchain.swift
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,14 @@ extension Toolchain {
return "SWIFT_DRIVER_\(toolName.uppercased())_EXEC"
}

/// Use this property only for testing purposes, for example,
/// to enable cross-compiling tests that depends on macOS tooling such as `dsymutil`.
///
/// Returns true if `SWIFT_DRIVER_TESTS_ENABLE_EXEC_PATH_FALLBACK` is set to `1`.
private var fallbackToExecutableDefaultPath: Bool {
env["SWIFT_DRIVER_TESTS_ENABLE_EXEC_PATH_FALLBACK"] == "1"
}
Comment on lines +114 to +116
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@DougGregor

  1. I would like to know your opinion about the naming here.

  2. Should we have all the environment variables listed in one place?
    I tried to look how other swift projects handles this but found nothing in particular. I think it would be nice to have a place where we define our environment variables, the naming convention and their purpose 🤔

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with the name as is; it clearly indicates that it's for testing purposes. It would certainly be good for us to document the environment variables we respond to... we don't really have user-level documentation yet, but we could create a docs/EnvironmentVariables.md for now and figure out how we want to evolve the docs over time.


/// Looks for the executable in the `SWIFT_DRIVER_TOOLNAME_EXEC` environment variable, if found nothing,
/// looks in the `executableDir`, `xcrunFind` or in the `searchPaths`.
/// - Parameter executable: executable to look for [i.e. `swift`].
Expand All @@ -119,9 +127,10 @@ extension Toolchain {
return path
} else if let path = lookupExecutablePath(filename: executable, searchPaths: searchPaths) {
return path
} else {
// This is a hack so our tests work on linux.
} else if fallbackToExecutableDefaultPath {
return AbsolutePath("/usr/bin/" + executable)
} else {
throw ToolchainError.unableToFind(tool: executable)
}
}

Expand Down
135 changes: 68 additions & 67 deletions Tests/SwiftDriverTests/SwiftDriverTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -211,13 +211,9 @@ final class SwiftDriverTests: XCTestCase {

XCTAssertNil(try Driver(args: ["swiftc", "-j", "0"]).numParallelJobs)

XCTAssertEqual(
try Driver(
args: ["swiftc", "-j", "4", "-target", "x86_64-apple-macosx10.15"],
env: ["SWIFTC_MAXIMUM_DETERMINISM": "1"]
).numParallelJobs,
1
)
var env = ProcessEnv.vars
env["SWIFTC_MAXIMUM_DETERMINISM"] = "1"
XCTAssertEqual(try Driver(args: ["swiftc", "-j", "4"], env: env).numParallelJobs, 1)
}

func testMultithreadingDiagnostics() throws {
Expand All @@ -234,10 +230,9 @@ final class SwiftDriverTests: XCTestCase {
$1.expect(.error("invalid value '0' in '-j'"))
}

try assertDriverDiagnostics(
args: "swiftc", "-j", "8", "-target", "x86_64-apple-macosx10.15",
env: ["SWIFTC_MAXIMUM_DETERMINISM": "1"]
) {
var env = ProcessEnv.vars
env["SWIFTC_MAXIMUM_DETERMINISM"] = "1"
try assertDriverDiagnostics(args: "swiftc", "-j", "8", env: env) {
$1.expect(.remark("SWIFTC_MAXIMUM_DETERMINISM overriding -j"))
}
}
Expand Down Expand Up @@ -323,27 +318,27 @@ final class SwiftDriverTests: XCTestCase {
}

func testStandardCompileJobs() throws {
var driver1 = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "-module-name", "Test", "-target", "x86_64-apple-macosx10.15"])
var driver1 = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "-module-name", "Test"])
let plannedJobs = try driver1.planBuild()
XCTAssertEqual(plannedJobs.count, 3)
XCTAssertEqual(plannedJobs[0].outputs.count, 1)
XCTAssertEqual(plannedJobs[0].outputs.first!.file, VirtualPath.temporary(RelativePath("foo.o")))
XCTAssertEqual(plannedJobs[1].outputs.count, 1)
XCTAssertEqual(plannedJobs[1].outputs.first!.file, VirtualPath.temporary(RelativePath("bar.o")))
XCTAssertTrue(plannedJobs[2].tool.name.contains("ld"))
XCTAssertTrue(plannedJobs[2].tool.name.contains(driver1.targetTriple.isDarwin ? "ld" : "clang"))
XCTAssertEqual(plannedJobs[2].outputs.count, 1)
XCTAssertEqual(plannedJobs[2].outputs.first!.file, VirtualPath.relative(RelativePath("Test")))

// Forwarding of arguments.
var driver2 = try Driver(args: ["swiftc", "-color-diagnostics", "foo.swift", "bar.swift", "-working-directory", "/tmp", "-api-diff-data-file", "diff.txt", "-Xfrontend", "-HI", "-no-color-diagnostics", "-target", "powerpc-apple-macosx10.4", "-g"])
var driver2 = try Driver(args: ["swiftc", "-color-diagnostics", "foo.swift", "bar.swift", "-working-directory", "/tmp", "-api-diff-data-file", "diff.txt", "-Xfrontend", "-HI", "-no-color-diagnostics", "-g"])
let plannedJobs2 = try driver2.planBuild()
XCTAssert(plannedJobs2[0].commandLine.contains(Job.ArgTemplate.path(.absolute(try AbsolutePath(validating: "/tmp/diff.txt")))))
XCTAssert(plannedJobs2[0].commandLine.contains(.flag("-HI")))
XCTAssert(!plannedJobs2[0].commandLine.contains(.flag("-Xfrontend")))
XCTAssert(plannedJobs2[0].commandLine.contains(.flag("-no-color-diagnostics")))
XCTAssert(!plannedJobs2[0].commandLine.contains(.flag("-color-diagnostics")))
XCTAssert(plannedJobs2[0].commandLine.contains(.flag("-target")))
XCTAssert(plannedJobs2[0].commandLine.contains(.flag("powerpc-apple-macosx10.4")))
XCTAssert(plannedJobs2[0].commandLine.contains(.flag(driver2.targetTriple.triple)))
XCTAssert(plannedJobs2[0].commandLine.contains(.flag("-enable-anonymous-context-mangled-names")))

var driver3 = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "-emit-library", "-module-name", "Test"])
Expand Down Expand Up @@ -474,10 +469,13 @@ final class SwiftDriverTests: XCTestCase {
}

func testLinking() throws {
var env = ProcessEnv.vars
env["SWIFT_DRIVER_TESTS_ENABLE_EXEC_PATH_FALLBACK"] = "1"

let commonArgs = ["swiftc", "foo.swift", "bar.swift", "-module-name", "Test"]
do {
// macOS target
var driver = try Driver(args: commonArgs + ["-emit-library", "-target", "x86_64-apple-macosx10.15"])
var driver = try Driver(args: commonArgs + ["-emit-library", "-target", "x86_64-apple-macosx10.15"], env: env)
let plannedJobs = try driver.planBuild()

XCTAssertEqual(3, plannedJobs.count)
Expand All @@ -500,7 +498,7 @@ final class SwiftDriverTests: XCTestCase {

do {
// iOS target
var driver = try Driver(args: commonArgs + ["-emit-library", "-target", "arm64-apple-ios10.0"])
var driver = try Driver(args: commonArgs + ["-emit-library", "-target", "arm64-apple-ios10.0"], env: env)
let plannedJobs = try driver.planBuild()

XCTAssertEqual(3, plannedJobs.count)
Expand All @@ -523,7 +521,7 @@ final class SwiftDriverTests: XCTestCase {

do {
// Xlinker flags
var driver = try Driver(args: commonArgs + ["-emit-library", "-L", "/tmp", "-Xlinker", "-w", "-target", "x86_64-apple-macosx10.15"])
var driver = try Driver(args: commonArgs + ["-emit-library", "-L", "/tmp", "-Xlinker", "-w", "-target", "x86_64-apple-macosx10.15"], env: env)
let plannedJobs = try driver.planBuild()

XCTAssertEqual(3, plannedJobs.count)
Expand All @@ -545,7 +543,7 @@ final class SwiftDriverTests: XCTestCase {

do {
// static linking
var driver = try Driver(args: commonArgs + ["-emit-library", "-static", "-L", "/tmp", "-Xlinker", "-w", "-target", "x86_64-apple-macosx10.15"])
var driver = try Driver(args: commonArgs + ["-emit-library", "-static", "-L", "/tmp", "-Xlinker", "-w", "-target", "x86_64-apple-macosx10.15"], env: env)
let plannedJobs = try driver.planBuild()

XCTAssertEqual(plannedJobs.count, 3)
Expand Down Expand Up @@ -573,7 +571,7 @@ final class SwiftDriverTests: XCTestCase {

do {
// executable linking
var driver = try Driver(args: commonArgs + ["-emit-executable", "-target", "x86_64-apple-macosx10.15"])
var driver = try Driver(args: commonArgs + ["-emit-executable", "-target", "x86_64-apple-macosx10.15"], env: env)
let plannedJobs = try driver.planBuild()
XCTAssertEqual(3, plannedJobs.count)
XCTAssertFalse(plannedJobs.contains { $0.kind == .autolinkExtract })
Expand Down Expand Up @@ -752,7 +750,7 @@ final class SwiftDriverTests: XCTestCase {
}

func testBatchModeCompiles() throws {
var driver1 = try Driver(args: ["swiftc", "foo1.swift", "bar1.swift", "foo2.swift", "bar2.swift", "foo3.swift", "bar3.swift", "foo4.swift", "bar4.swift", "foo5.swift", "bar5.swift", "wibble.swift", "-module-name", "Test", "-target", "x86_64-apple-macosx10.15", "-enable-batch-mode", "-driver-batch-count", "3"])
var driver1 = try Driver(args: ["swiftc", "foo1.swift", "bar1.swift", "foo2.swift", "bar2.swift", "foo3.swift", "bar3.swift", "foo4.swift", "bar4.swift", "foo5.swift", "bar5.swift", "wibble.swift", "-module-name", "Test", "-enable-batch-mode", "-driver-batch-count", "3"])
let plannedJobs = try driver1.planBuild()
XCTAssertEqual(plannedJobs.count, 4)
XCTAssertEqual(plannedJobs[0].outputs.count, 4)
Expand All @@ -761,7 +759,7 @@ final class SwiftDriverTests: XCTestCase {
XCTAssertEqual(plannedJobs[1].outputs.first!.file, VirtualPath.temporary(RelativePath("foo3.o")))
XCTAssertEqual(plannedJobs[2].outputs.count, 3)
XCTAssertEqual(plannedJobs[2].outputs.first!.file, VirtualPath.temporary(RelativePath("foo5.o")))
XCTAssertTrue(plannedJobs[3].tool.name.contains("ld"))
XCTAssertTrue(plannedJobs[3].tool.name.contains(driver1.targetTriple.isDarwin ? "ld" : "clang"))
XCTAssertEqual(plannedJobs[3].outputs.count, 1)
XCTAssertEqual(plannedJobs[3].outputs.first!.file, VirtualPath.relative(RelativePath("Test")))
}
Expand All @@ -782,8 +780,10 @@ final class SwiftDriverTests: XCTestCase {
}

func testMultiThreadedWholeModuleOptimizationCompiles() throws {
var driver1 = try Driver(args: ["swiftc", "-whole-module-optimization", "foo.swift", "bar.swift", "wibble.swift", "-module-name", "Test",
"-num-threads", "4", "-target", "x86_64-apple-macosx10.15"])
var driver1 = try Driver(args: [
"swiftc", "-whole-module-optimization", "foo.swift", "bar.swift", "wibble.swift",
"-module-name", "Test", "-num-threads", "4"
])
let plannedJobs = try driver1.planBuild()
XCTAssertEqual(plannedJobs.count, 2)
XCTAssertEqual(plannedJobs[0].kind, .compile)
Expand All @@ -808,9 +808,10 @@ final class SwiftDriverTests: XCTestCase {
try withTemporaryFile { file in
try assertNoDiagnostics { diags in
try localFileSystem.writeFileContents(file.path) { $0 <<< contents }
var driver1 = try Driver(args: ["swiftc", "-whole-module-optimization", "foo.swift", "bar.swift", "wibble.swift", "-module-name", "Test",
"-num-threads", "4", "-target", "x86_64-apple-macosx10.15",
"-output-file-map", file.path.pathString, "-emit-module-interface"])
var driver1 = try Driver(args: [
"swiftc", "-whole-module-optimization", "foo.swift", "bar.swift", "wibble.swift", "-module-name", "Test",
"-num-threads", "4", "-output-file-map", file.path.pathString, "-emit-module-interface"
])
let plannedJobs = try driver1.planBuild()
XCTAssertEqual(plannedJobs.count, 2)
XCTAssertEqual(plannedJobs[0].kind, .compile)
Expand Down Expand Up @@ -899,12 +900,7 @@ final class SwiftDriverTests: XCTestCase {
XCTAssertTrue(job.commandLine.contains(.flag("foo")))

XCTAssertFalse(job.commandLine.contains(.flag("--")))

#if os(macOS)
XCTAssertTrue(job.extraEnvironment.keys.contains("DYLD_LIBRARY_PATH"))
#elseif os(Linux)
XCTAssertTrue(job.extraEnvironment.keys.contains("LD_LIBRARY_PATH"))
#endif
XCTAssertTrue(job.extraEnvironment.keys.contains("\(driver.targetTriple.isDarwin ? "DYLD" : "LD")_LIBRARY_PATH"))
}

do {
Expand All @@ -924,7 +920,7 @@ final class SwiftDriverTests: XCTestCase {
XCTAssertTrue(job.commandLine.contains(.flag("args")))
XCTAssertTrue(job.commandLine.contains(.flag("-for=foo")))
}
#if os(macOS)

do {
var driver = try Driver(args: ["swift", "-L/path/to/lib", "-F/path/to/framework", "foo.swift"])
let plannedJobs = try driver.planBuild()
Expand All @@ -933,21 +929,13 @@ final class SwiftDriverTests: XCTestCase {
XCTAssertEqual(job.inputs.count, 1)
XCTAssertEqual(job.inputs[0].file, .relative(RelativePath("foo.swift")))
XCTAssertEqual(job.outputs.count, 0)
XCTAssertTrue(job.extraEnvironment.contains { $0 == "DYLD_LIBRARY_PATH" && $1.contains("/path/to/lib") })
XCTAssertTrue(job.extraEnvironment.contains { $0 == "DYLD_FRAMEWORK_PATH" && $1.contains("/path/to/framework") })
}
#elseif os(Linux)
do {
var driver = try Driver(args: ["swift", "-L/path/to/lib", "foo.swift"])
let plannedJobs = try driver.planBuild()
XCTAssertEqual(plannedJobs.count, 1)
let job = plannedJobs[0]
XCTAssertEqual(job.inputs.count, 1)
XCTAssertEqual(job.inputs[0].file, .relative(RelativePath("foo.swift")))
XCTAssertEqual(job.outputs.count, 0)
XCTAssertTrue(job.extraEnvironment.contains { $0 == "LD_LIBRARY_PATH" && $1.contains("/path/to/lib") })
XCTAssertTrue(job.extraEnvironment.contains {
$0 == "\(driver.targetTriple.isDarwin ? "DYLD" : "LD")_LIBRARY_PATH" && $1.contains("/path/to/lib")
})
if driver.targetTriple.isDarwin {
XCTAssertTrue(job.extraEnvironment.contains { $0 == "DYLD_FRAMEWORK_PATH" && $1.contains("/path/to/framework") })
}
}
#endif
}

func testTargetTriple() throws {
Expand All @@ -974,9 +962,8 @@ final class SwiftDriverTests: XCTestCase {

func testDSYMGeneration() throws {
let commonArgs = [
"swiftc", "-target", "x86_64-apple-macosx",
"foo.swift", "bar.swift", "-emit-executable",
"-module-name", "Test"
"swiftc", "foo.swift", "bar.swift",
"-emit-executable", "-module-name", "Test"
]

do {
Expand All @@ -1001,29 +988,32 @@ final class SwiftDriverTests: XCTestCase {
// dSYM generation (-g)
var driver = try Driver(args: commonArgs + ["-g"])
let plannedJobs = try driver.planBuild()

XCTAssertEqual(plannedJobs.count, 5)

let generateDSYMJob = plannedJobs.last!
XCTAssertEqual(generateDSYMJob.kind, .generateDSYM)

XCTAssertEqual(generateDSYMJob.outputs.last?.file, try VirtualPath(path: "Test.dSYM"))

let cmd = generateDSYMJob.commandLine

if driver.targetTriple.isDarwin {
XCTAssertEqual(plannedJobs.count, 5)
XCTAssertEqual(generateDSYMJob.outputs.last?.file, try VirtualPath(path: "Test.dSYM"))
} else {
XCTAssertEqual(plannedJobs.count, 4)
}

XCTAssertTrue(cmd.contains(.path(try VirtualPath(path: "Test"))))
}
}

func testDOTFileEmission() throws {
var driver = try Driver(args: [
"swiftc", "-emit-executable", "test.swift", "-emit-module",
"-target", "x86_64-apple-macosx"
"swiftc", "-emit-executable", "test.swift", "-emit-module"
])
let plannedJobs = try driver.planBuild()

var serializer = DOTJobGraphSerializer(jobs: plannedJobs)
var output = ""
serializer.writeDOT(to: &output)

let dynamicLinker = driver.targetTriple.isDarwin ? "ld" : "clang"
XCTAssertEqual(output,
"""
digraph Jobs {
Expand All @@ -1040,26 +1030,25 @@ final class SwiftDriverTests: XCTestCase {
"test.swiftmodule" -> "mergeModule (swift)" [color=blue];
"mergeModule (swift)" -> "test.swiftmodule" [color=green];
"mergeModule (swift)" -> "test.swiftdoc" [color=green];
"link (ld)" [style=bold];
"test.o" -> "link (ld)" [color=blue];
"link (\(dynamicLinker))" [style=bold];
"test.o" -> "link (\(dynamicLinker))" [color=blue];
"test" [fontsize=12];
"link (ld)" -> "test" [color=green];
"link (\(dynamicLinker))" -> "test" [color=green];
}

""")
}

func testRegressions() throws {
// FIXME: This doesn't work on Linux.
#if os(macOS)
var driverWithEmptySDK = try Driver(args: ["swiftc", "-sdk", "", "file.swift"])
_ = try driverWithEmptySDK.planBuild()
#endif
}

func testToolchainUtilities() throws {
let swiftVersion = try DarwinToolchain(env: ProcessEnv.vars).swiftCompilerVersion()
assertString(swiftVersion, contains: "Swift version ")
let darwinSwiftVersion = try DarwinToolchain(env: ProcessEnv.vars).swiftCompilerVersion()
let unixSwiftVersion = try GenericUnixToolchain(env: ProcessEnv.vars).swiftCompilerVersion()
assertString(darwinSwiftVersion, contains: "Swift version ")
assertString(unixSwiftVersion, contains: "Swift version ")
}

func testToolchainClangPath() {
Expand All @@ -1076,6 +1065,18 @@ final class SwiftDriverTests: XCTestCase {
try? toolchain.getToolPath(.clang).parentDirectory
)
}

func testExecutableFallbackPath() throws {
let driver1 = try Driver(args: ["swift", "main.swift"])
if !driver1.targetTriple.isDarwin {
XCTAssertThrowsError(try driver1.toolchain.getToolPath(.dsymutil))
}

var env = ProcessEnv.vars
env["SWIFT_DRIVER_TESTS_ENABLE_EXEC_PATH_FALLBACK"] = "1"
let driver2 = try Driver(args: ["swift", "main.swift"], env: env)
XCTAssertNoThrow(try driver2.toolchain.getToolPath(.dsymutil))
}
}

func assertString(
Expand Down
Loading