Skip to content

Commit 8fa313e

Browse files
committed
Fixes many tests (plus skips) to get more tests running on windows
#8606
1 parent a3cd491 commit 8fa313e

21 files changed

+224
-158
lines changed
Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,3 @@
1-
#if os(macOS) || os(iOS)
2-
import Darwin
3-
#elseif canImport(Glibc)
4-
import Glibc
5-
#elseif canImport(Musl)
6-
import Musl
7-
#elseif canImport(Bionic)
8-
import Bionic
9-
#endif
101

112
public extension Collection {
123
func shuffle() -> [Iterator.Element] {
@@ -24,15 +15,13 @@ public extension MutableCollection {
2415
guard c > 1 else { return }
2516

2617
for (firstUnshuffled, unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) {
27-
#if os(macOS) || os(iOS)
28-
let d = arc4random_uniform(numericCast(unshuffledCount))
29-
#else
30-
let d = numericCast(random()) % unshuffledCount
31-
#endif
32-
let i = index(firstUnshuffled, offsetBy: numericCast(d))
18+
var g = SystemRandomNumberGenerator()
19+
let d = Int.random(in: 1...unshuffledCount, using: &g)
20+
let i = index(firstUnshuffled, offsetBy: d)
3321
swapAt(firstUnshuffled, i)
3422
}
3523
}
3624
}
3725

26+
3827
public let shuffle = false

Fixtures/Miscellaneous/EchoExecutable/Sources/secho/main.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
import Musl
55
#elseif canImport(Android)
66
import Android
7-
#else
7+
#elseif canImport(Darwin.C)
88
import Darwin.C
9+
#elseif canImport(ucrt)
10+
import ucrt
11+
let PATH_MAX = MAX_PATH
912
#endif
1013

1114
let cwd = getcwd(nil, Int(PATH_MAX))

Package.swift

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,13 @@ let package = Package(
940940
dependencies: ["XCBuildSupport", "_InternalTestSupport", "_InternalBuildTestSupport"],
941941
exclude: ["Inputs/Foo.pc"]
942942
),
943+
.testTarget(
944+
name: "FunctionalPerformanceTests",
945+
dependencies: [
946+
"swift-package-manager",
947+
"_InternalTestSupport",
948+
]
949+
),
943950
// Examples (These are built to ensure they stay up to date with the API.)
944951
.executableTarget(
945952
name: "package-info",
@@ -958,19 +965,6 @@ package.targets.append(contentsOf: [
958965
])
959966
#endif
960967

961-
// Workaround SwiftPM's attempt to link in executables which does not work on all
962-
// platforms.
963-
#if !os(Windows)
964-
package.targets.append(contentsOf: [
965-
.testTarget(
966-
name: "FunctionalPerformanceTests",
967-
dependencies: [
968-
"swift-package-manager",
969-
"_InternalTestSupport",
970-
]
971-
),
972-
])
973-
974968
// rdar://101868275 "error: cannot find 'XCTAssertEqual' in scope" can affect almost any functional test, so we flat out
975969
// disable them all until we know what is going on
976970
if ProcessInfo.processInfo.environment["SWIFTCI_DISABLE_SDK_DEPENDENT_TESTS"] == nil {
@@ -983,7 +977,6 @@ if ProcessInfo.processInfo.environment["SWIFTCI_DISABLE_SDK_DEPENDENT_TESTS"] ==
983977
"_InternalTestSupport",
984978
]
985979
),
986-
987980
.executableTarget(
988981
name: "dummy-swiftc",
989982
dependencies: [
@@ -1014,7 +1007,6 @@ if ProcessInfo.processInfo.environment["SWIFTCI_DISABLE_SDK_DEPENDENT_TESTS"] ==
10141007
),
10151008
])
10161009
}
1017-
#endif
10181010

10191011

10201012
func swiftSyntaxDependencies(_ names: [String]) -> [Target.Dependency] {

Sources/Build/LLBuildProgressTracker.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,9 +559,14 @@ private struct CommandTaskTracker {
559559
}
560560

561561
private func progressText(of command: SPMLLBuild.Command, targetName: String?) -> String {
562+
#if os(Windows)
563+
let pathSep: Character = "\\"
564+
#else
565+
let pathSep: Character = "/"
566+
#endif
562567
// Transforms descriptions like "Linking ./.build/x86_64-apple-macosx/debug/foo" into "Linking foo".
563568
if let firstSpaceIndex = command.description.firstIndex(of: " "),
564-
let lastDirectorySeparatorIndex = command.description.lastIndex(of: "/")
569+
let lastDirectorySeparatorIndex = command.description.lastIndex(of: pathSep)
565570
{
566571
let action = command.description[..<firstSpaceIndex]
567572
let fileNameStartIndex = command.description.index(after: lastDirectorySeparatorIndex)

Sources/_InternalTestSupport/SwiftPMProduct.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ extension SwiftPM {
9292
env: env
9393
)
9494

95-
let stdout = try result.utf8Output()
96-
let stderr = try result.utf8stderrOutput()
95+
let stdout = try result.utf8Output().withSwiftLineEnding
96+
let stderr = try result.utf8stderrOutput().withSwiftLineEnding
9797

9898
let returnValue = (stdout: stdout, stderr: stderr)
9999
if (!throwIfCommandFails) { return returnValue }

Sources/_InternalTestSupport/misc.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,3 +559,20 @@ public func getNumberOfMatches(of match: String, in value: String) -> Int {
559559
guard match.count != 0 else { return 0 }
560560
return value.ranges(of: match).count
561561
}
562+
563+
public extension String {
564+
var withSwiftLineEnding: String {
565+
return replacingOccurrences(of: "\r\n", with: "\n")
566+
}
567+
}
568+
569+
public func executableName(_ name: String) -> String {
570+
#if os(Windows)
571+
if name.count > 4, name.suffix(from: name.index(name.endIndex, offsetBy: -4)) == ProcessInfo.exeSuffix {
572+
return name
573+
}
574+
return "\(name)\(ProcessInfo.exeSuffix)"
575+
#else
576+
return name
577+
#endif
578+
}

Tests/CommandsTests/BuildCommandTests.swift

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class BuildCommandTestCases: CommandsBuildProviderTestCase {
8585

8686

8787
if cleanAfterward {
88-
try! await executeSwiftPackage(
88+
try await executeSwiftPackage(
8989
packagePath,
9090
extraArgs: ["clean"],
9191
buildSystem: buildSystemProvider
@@ -100,7 +100,7 @@ class BuildCommandTestCases: CommandsBuildProviderTestCase {
100100
)
101101
} catch {
102102
if cleanAfterward {
103-
try! await executeSwiftPackage(
103+
try await executeSwiftPackage(
104104
packagePath,
105105
extraArgs: ["clean"],
106106
buildSystem: buildSystemProvider
@@ -233,7 +233,7 @@ class BuildCommandTestCases: CommandsBuildProviderTestCase {
233233

234234
do {
235235
let result = try await build(["--product", "exec1"], packagePath: fullPath)
236-
XCTAssertMatch(result.binContents, ["exec1"])
236+
XCTAssertMatch(result.binContents, [.equal(executableName("exec1"))])
237237
XCTAssertNoMatch(result.binContents, ["exec2.build"])
238238
}
239239

@@ -306,6 +306,8 @@ class BuildCommandTestCases: CommandsBuildProviderTestCase {
306306
}
307307

308308
func testAtMainSupport() async throws {
309+
try XCTSkipOnWindows(because: "lld-link: error: undefined symbol: __declspec(dllimport) swift_addNewDSOImage, needs investigation")
310+
309311
try await fixture(name: "Miscellaneous/AtMainSupport") { fixturePath in
310312
let fullPath = try resolveSymlinks(fixturePath)
311313

@@ -316,12 +318,12 @@ class BuildCommandTestCases: CommandsBuildProviderTestCase {
316318

317319
do {
318320
let result = try await build(["--product", "SwiftExecSingleFile"], packagePath: fullPath)
319-
XCTAssertMatch(result.binContents, ["SwiftExecSingleFile"])
321+
XCTAssertMatch(result.binContents, [.equal(executableName("SwiftExecSingleFile"))])
320322
}
321323

322324
do {
323325
let result = try await build(["--product", "SwiftExecMultiFile"], packagePath: fullPath)
324-
XCTAssertMatch(result.binContents, ["SwiftExecMultiFile"])
326+
XCTAssertMatch(result.binContents, [.equal(executableName("SwiftExecMultiFile"))])
325327
}
326328
}
327329
}
@@ -343,8 +345,8 @@ class BuildCommandTestCases: CommandsBuildProviderTestCase {
343345
do {
344346
let result = try await build(["--product", "bexec"], packagePath: aPath)
345347
XCTAssertMatch(result.binContents, ["BTarget2.build"])
346-
XCTAssertMatch(result.binContents, ["bexec"])
347-
XCTAssertNoMatch(result.binContents, ["aexec"])
348+
XCTAssertMatch(result.binContents, [.equal(executableName("bexec"))])
349+
XCTAssertNoMatch(result.binContents, [.equal(executableName("aexec"))])
348350
XCTAssertNoMatch(result.binContents, ["ATarget.build"])
349351
XCTAssertNoMatch(result.binContents, ["BLibrary.a"])
350352

@@ -380,6 +382,8 @@ class BuildCommandTestCases: CommandsBuildProviderTestCase {
380382
}
381383

382384
func testAutomaticParseableInterfacesWithLibraryEvolution() async throws {
385+
try XCTSkipOnWindows(because: "swift-package-manager hangs, needs investigation")
386+
383387
try await fixture(name: "Miscellaneous/LibraryEvolution") { fixturePath in
384388
do {
385389
let result = try await build([], packagePath: fixturePath)
@@ -541,6 +545,8 @@ class BuildCommandTestCases: CommandsBuildProviderTestCase {
541545
}
542546

543547
func testSwiftGetVersion() async throws {
548+
try XCTSkipOnWindows(because: "SWIFT_EXEC override is not working, needs investigation")
549+
544550
try await fixture(name: "Miscellaneous/Simple") { fixturePath in
545551
func findSwiftGetVersionFile() throws -> AbsolutePath {
546552
let buildArenaPath = fixturePath.appending(components: ".build", "debug")
@@ -678,7 +684,7 @@ class BuildCommandTestCases: CommandsBuildProviderTestCase {
678684
}
679685
}
680686

681-
#if !canImport(Darwin)
687+
#if os(Linux)
682688
func testIgnoresLinuxMain() async throws {
683689
try await fixture(name: "Miscellaneous/TestDiscovery/IgnoresLinuxMain") { fixturePath in
684690
let buildResult = try await self.build(["-v", "--build-tests", "--enable-test-discovery"], packagePath: fixturePath, cleanAfterward: false)
@@ -774,15 +780,10 @@ class BuildCommandNativeTests: BuildCommandTestCases {
774780
components: ".build",
775781
UserToolchain.default.targetTriple.platformBuildPathComponent
776782
)
777-
try await XCTAssertAsyncEqual(
778-
try await self.execute(["--show-bin-path"], packagePath: fullPath).stdout,
779-
"\(targetPath.appending("debug").pathString)\n"
780-
)
781-
try await XCTAssertAsyncEqual(
782-
try await self.execute(["-c", "release", "--show-bin-path"], packagePath: fullPath)
783-
.stdout,
784-
"\(targetPath.appending("release").pathString)\n"
785-
)
783+
let debugPath = try await self.execute(["--show-bin-path"], packagePath: fullPath).stdout.trimmingCharacters(in: .whitespacesAndNewlines)
784+
XCTAssertEqual(AbsolutePath(debugPath).pathString, targetPath.appending("debug").pathString)
785+
let releasePath = try await self.execute(["-c", "release", "--show-bin-path"], packagePath: fullPath).stdout.trimmingCharacters(in: .whitespacesAndNewlines)
786+
XCTAssertEqual(AbsolutePath(releasePath).pathString, targetPath.appending("release").pathString)
786787
}
787788
}
788789
}
@@ -861,6 +862,7 @@ class BuildCommandSwiftBuildTests: BuildCommandTestCases {
861862
override func testParseableInterfaces() async throws {
862863
try XCTSkipIfWorkingDirectoryUnsupported()
863864

865+
try XCTSkipOnWindows(because: "build errors, needs investigation")
864866
try await fixture(name: "Miscellaneous/ParseableInterfaces") { fixturePath in
865867
do {
866868
let result = try await build(["--enable-parseable-module-interfaces"], packagePath: fixturePath)
@@ -885,9 +887,9 @@ class BuildCommandSwiftBuildTests: BuildCommandTestCases {
885887
UserToolchain.default.targetTriple.platformBuildPathComponent
886888
)
887889
let debugPath = try await self.execute(["--show-bin-path"], packagePath: fullPath).stdout
888-
XCTAssertMatch(debugPath, .regex(targetPath.appending(components: "Products", "Debug").pathString + "(\\-linux|\\-Windows)?\\n"))
890+
XCTAssertMatch(AbsolutePath(debugPath).pathString, .regex(targetPath.appending(components: "Products", "Debug").escapedPathString + "(\\-linux|\\-Windows)?"))
889891
let releasePath = try await self.execute(["-c", "release", "--show-bin-path"], packagePath: fullPath).stdout
890-
XCTAssertMatch(releasePath, .regex(targetPath.appending(components: "Products", "Release").pathString + "(\\-linux|\\-Windows)?\\n"))
892+
XCTAssertMatch(AbsolutePath(releasePath).pathString, .regex(targetPath.appending(components: "Products", "Release").escapedPathString + "(\\-linux|\\-Windows)?"))
891893
}
892894
}
893895

@@ -942,6 +944,7 @@ class BuildCommandSwiftBuildTests: BuildCommandTestCases {
942944
override func testBuildSystemDefaultSettings() async throws {
943945
try XCTSkipIfWorkingDirectoryUnsupported()
944946

947+
try XCTSkipOnWindows(because: "build errors, needs investigation")
945948
if ProcessInfo.processInfo.environment["SWIFTPM_NO_SWBUILD_DEPENDENCY"] != nil {
946949
throw XCTSkip("SWIFTPM_NO_SWBUILD_DEPENDENCY is set so skipping because SwiftPM doesn't have the swift-build capability built inside.")
947950
}
@@ -952,6 +955,7 @@ class BuildCommandSwiftBuildTests: BuildCommandTestCases {
952955
override func testBuildCompleteMessage() async throws {
953956
try XCTSkipIfWorkingDirectoryUnsupported()
954957

958+
try XCTSkipOnWindows(because: "Build fails on windows, needs investigation")
955959
try await super.testBuildCompleteMessage()
956960
}
957961

Tests/CommandsTests/MultiRootSupportTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,6 @@ final class MultiRootSupportTests: CommandsTestCase {
4242
let result = try XcodeWorkspaceLoader(fileSystem: fs, observabilityScope: observability.topScope).load(workspace: path)
4343

4444
XCTAssertNoDiagnostics(observability.diagnostics)
45-
XCTAssertEqual(result.map{ $0.pathString }.sorted(), ["/tmp/test/dep", "/tmp/test/local"])
45+
XCTAssertEqual(result.map{ $0.pathString }.sorted(), [AbsolutePath("/tmp/test/dep").pathString, AbsolutePath("/tmp/test/local").pathString])
4646
}
4747
}

0 commit comments

Comments
 (0)