Skip to content

Commit 2bacae1

Browse files
committed
Experiment: disable hanging tests
1 parent f49864e commit 2bacae1

File tree

13 files changed

+155
-25
lines changed

13 files changed

+155
-25
lines changed

.github/workflows/pull_request.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ jobs:
1313
name: Test
1414
uses: swiftlang/github-workflows/.github/workflows/swift_package_test.yml@main
1515
with:
16-
linux_os_versions: '["noble", "jammy", "focal", "rhel-ubi9"]'
16+
linux_os_versions: '["noble", "jammy", "rhel-ubi9"]'
1717
linux_pre_build_command: |
18-
if command -v apt-get >/dev/null 2>&1 ; then # bookworm, noble, jammy, focal
18+
if command -v apt-get >/dev/null 2>&1 ; then # bookworm, noble, jammy
1919
apt-get update -y
2020
2121
# Build dependencies
@@ -41,7 +41,7 @@ jobs:
4141
yum install -y yum-utils
4242
debuginfo-install -y glibc
4343
fi
44-
linux_build_command: 'swift test --no-parallel'
44+
linux_build_command: 'swift test --no-parallel --filter serviceShutdown'
4545
linux_swift_versions: '["nightly-main", "nightly-6.2"]'
4646
windows_swift_versions: '["nightly-main"]'
4747
windows_build_command: 'swift test --no-parallel'

Sources/SWBCSupport/CLibclang.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,39 @@
1212

1313
#include "CLibclang.h"
1414

15+
#define _GNU_SOURCE
16+
#include <unistd.h>
17+
#include <fcntl.h>
18+
19+
int swb_pipe2(int pipefd[2], int flags) {
20+
#if defined(_WIN32) || defined(__APPLE__)
21+
int ret = pipe(pipefd);
22+
#ifndef _WIN32
23+
if (ret != -1) {
24+
fcntl(pipefd[0], F_SETFD, FD_CLOEXEC);
25+
fcntl(pipefd[1], F_SETFD, FD_CLOEXEC);
26+
}
27+
#endif
28+
return ret;
29+
#else
30+
return pipe2(pipefd, flags);
31+
#endif
32+
}
33+
34+
int swb_dup3(int oldfd, int newfd, int flags) {
35+
#if defined(_WIN32) || defined(__APPLE__)
36+
int ret = dup2(oldfd, newfd);
37+
#ifndef _WIN32
38+
if (ret != -1) {
39+
fcntl(newfd, F_SETFD, FD_CLOEXEC);
40+
}
41+
#endif
42+
return ret;
43+
#else
44+
return dup3(oldfd, newfd, flags);
45+
#endif
46+
}
47+
1548
// FIXME: Horrible workaround for ::gets not being found by cstdio, on Ubuntu
1649
// 14.04 in C++14 mode.
1750
#if defined(__linux) && (defined __cplusplus && __cplusplus > 201103L)

Sources/SWBCSupport/CLibclang.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
extern "C" {
2626
#endif
2727

28+
int swb_pipe2(int pipefd[2], int flags);
29+
int swb_dup3(int oldfd, int newfd, int flags);
30+
2831
typedef struct libclang_source_range_t_* libclang_source_range_t;
2932
typedef struct libclang_diagnostic_set_t_* libclang_diagnostic_set_t;
3033
typedef struct libclang_diagnostic_t_* libclang_diagnostic_t;

Sources/SWBServiceCore/ServiceEntryPoint.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,22 +60,22 @@ extension Service {
6060
let nullPath = Path.null
6161
let nullFd: FileDescriptor
6262
do {
63-
nullFd = try FileDescriptor.open(FilePath(nullPath.str), .readOnly)
63+
nullFd = try FileDescriptor.open(FilePath(nullPath.str), .readOnly, options: .closeOnExec)
6464
} catch {
6565
throw StubError.error("unable to open \(nullPath.str): \(error)")
6666
}
6767

6868
// (dup2 closes its 2nd parameter)
6969
do {
70-
_ = try nullFd.duplicate(as: .standardInput)
70+
_ = try nullFd._duplicate3(as: .standardInput, options: .closeOnExec)
7171
} catch {
7272
throw StubError.error("unable to dup \(nullPath.str) to stdin: \(error)")
7373
}
7474

7575
// Now remap stdout to stderr, so normal print statements go to the console output stream.
7676
// (dup2 closes its 2nd parameter)
7777
do {
78-
_ = try FileDescriptor.standardError.duplicate(as: .standardOutput)
78+
_ = try FileDescriptor.standardError._duplicate3(as: .standardOutput, options: .closeOnExec)
7979
} catch {
8080
throw StubError.error("unable to dup stderr to stdout: \(error)")
8181
}

Sources/SWBTestSupport/SkippedTestSupport.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ extension Trait where Self == Testing.ConditionTrait {
172172
}
173173

174174
package static func skipInGitHubActions(_ comment: Comment? = nil) -> Self {
175+
return disabled("its broke")
175176
return .skipIfEnvironmentVariableSet(key: "GITHUB_ACTIONS")
176177
}
177178

Sources/SWBUtil/IO.swift

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,37 @@ public import System
1818
public import SystemPackage
1919
#endif
2020

21+
private import SWBCSupport
22+
2123
public struct IOPipe: Sendable {
2224
public let readEnd: FileDescriptor
2325
public let writeEnd: FileDescriptor
2426

2527
public init() throws {
26-
let (readEnd, writeEnd) = try FileDescriptor.pipe()
28+
let (readEnd, writeEnd) = try FileDescriptor._pipe2(options: .closeOnExec)
2729
self.readEnd = readEnd
2830
self.writeEnd = writeEnd
2931
}
3032
}
3133

3234
extension FileDescriptor {
35+
public static func _pipe2(options: _PipeOptions) throws -> (readEnd: FileDescriptor, writeEnd: FileDescriptor) {
36+
var fds: (Int32, Int32) = (-1, -1)
37+
return try withUnsafeMutablePointer(to: &fds) { pointer in
38+
pointer.withMemoryRebound(to: Int32.self, capacity: 2) { fds in
39+
valueOrErrno(retryOnInterrupt: false) {
40+
swb_pipe2(fds, options.rawValue)
41+
}.map { _ in (FileDescriptor(rawValue: fds[0]), FileDescriptor(rawValue: fds[1])) }
42+
}
43+
}.get()
44+
}
45+
46+
public func _duplicate3(as target: FileDescriptor, retryOnInterrupt: Bool = true, options: _DuplicateOptions) throws -> FileDescriptor {
47+
try valueOrErrno(retryOnInterrupt: retryOnInterrupt) {
48+
return swb_dup3(self.rawValue, target.rawValue, options.rawValue)
49+
}.map(FileDescriptor.init(rawValue:)).get()
50+
}
51+
3352
public func setBinaryMode() throws {
3453
#if os(Windows)
3554
if _setmode(rawValue, _O_BINARY) == -1 {
@@ -38,3 +57,52 @@ extension FileDescriptor {
3857
#endif
3958
}
4059
}
60+
61+
#if os(Windows)
62+
fileprivate let O_CLOEXEC: CInt = 0
63+
64+
extension FileDescriptor.OpenOptions {
65+
public static var closeOnExec: FileDescriptor.OpenOptions { .init(rawValue: O_CLOEXEC) }
66+
}
67+
#endif
68+
69+
extension FileDescriptor {
70+
public struct _PipeOptions: OptionSet, Sendable, Hashable, Codable {
71+
public var rawValue: CInt
72+
73+
public init(rawValue: CInt) {
74+
self.rawValue = rawValue
75+
}
76+
77+
public static var closeOnExec: Self { .init(rawValue: O_CLOEXEC) }
78+
}
79+
80+
public struct _DuplicateOptions: OptionSet, Sendable, Hashable, Codable {
81+
public var rawValue: CInt
82+
83+
public init(rawValue: CInt) {
84+
self.rawValue = rawValue
85+
}
86+
87+
public static var closeOnExec: Self { .init(rawValue: O_CLOEXEC) }
88+
}
89+
}
90+
91+
fileprivate func valueOrErrno<I: FixedWidthInteger>(
92+
_ i: I
93+
) -> Result<I, Errno> {
94+
i == -1 ? .failure(Errno(rawValue: errno)) : .success(i)
95+
}
96+
97+
fileprivate func valueOrErrno<I: FixedWidthInteger>(
98+
retryOnInterrupt: Bool, _ f: () -> I
99+
) -> Result<I, Errno> {
100+
repeat {
101+
switch valueOrErrno(f()) {
102+
case .success(let r): return .success(r)
103+
case .failure(let err):
104+
guard retryOnInterrupt && err == .interrupted else { return .failure(err) }
105+
break
106+
}
107+
} while true
108+
}

Tests/SWBTaskExecutionTests/PBXCpTests.swift

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -442,21 +442,32 @@ fileprivate struct PBXCpTests: CoreBasedTests {
442442
fileprivate let buffer0 = [UInt8](repeating: 0xAA, count: 1024 * 513)
443443
fileprivate let buffer1 = [UInt8](repeating: 0x55, count: 1024 * 513)
444444

445-
@Test(.skipHostOS(.windows, "LocalFS needs to use stat64 on windows...."),
446-
.skipInGitHubActions("GitHub action runners do not have enough storage space for this test"))
445+
@Test
447446
func largerFile() async throws {
448-
try await withTemporaryDirectory { tmp in
447+
let iterationCount = 4096
448+
let buffers = buffer0 + buffer1
449+
let requiredSpace = ByteCount(Int64(buffers.count * (iterationCount + 1) * 2 * 2))
450+
let fs = localFS
451+
try await withTemporaryDirectory(fs: fs) { tmp in
452+
// If the available free disk space on this filesystem is less than twice the amount of data the test is expected to write (2 copies of the file times 2), skip it
453+
if let freeSpace = try fs.getFreeDiskSpace(tmp), freeSpace < requiredSpace {
454+
withKnownIssue {
455+
Issue.record("There is not enough free disk space to run this test (required: \(requiredSpace), free: \(freeSpace))")
456+
return
457+
}
458+
}
459+
449460
// Test copying a large file.
450461
let src = tmp.join("src")
451462
let sName = src.join("file")
452463
let dst = tmp.join("dst")
453464
let dName = dst.join("file")
454-
let fs = localFS
465+
455466

456467
try fs.createDirectory(src, recursive: true)
457468
var size = 0
458469
try await fs.write(sName) { fd in
459-
for _ in 0...4096 {
470+
for _ in 0...iterationCount {
460471
size += try fd.writeAll(buffer0)
461472
size += try fd.writeAll(buffer1)
462473
}
@@ -470,8 +481,10 @@ fileprivate struct PBXCpTests: CoreBasedTests {
470481
"copying src/...\n copying file...\n \(size) bytes\n"
471482
))
472483
// Check permissions
473-
let dstPerm = try fs.getFilePermissions(dName)
474-
#expect(dstPerm == 0o644) // files are created with u+rw, g+wr, o+rw (and +x if src is executable) permissions and umask will adjust
484+
if try ProcessInfo.processInfo.hostOperatingSystem() != .windows {
485+
let dstPerm = try fs.getFilePermissions(dName)
486+
#expect(dstPerm == 0o644) // files are created with u+rw, g+wr, o+rw (and +x if src is executable) permissions and umask will adjust
487+
}
475488
#expect(FileManager.default.contentsEqual(atPath: sName.str, andPath: dName.str))
476489
}
477490
}

Tests/SwiftBuildTests/ConsoleCommands/BuildCommandTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import SWBUtil
1717
import Testing
1818
import SwiftBuildTestSupport
1919

20-
@Suite(.skipHostOS(.windows), .skipInGitHubActions("failing in the GitHub actions runner environment"))
20+
@Suite(.skipHostOS(.windows))
2121
fileprivate struct BuildCommandTests {
2222
private let commandSequenceCodec: any CommandSequenceEncodable = LLVMStyleCommandCodec()
2323

Tests/SwiftBuildTests/ConsoleCommands/CreateXCFrameworkCommandTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import SWBTestSupport
1717

1818
// Note: The functionality of this class is heavily unit tested in `XCFrameworkTests.swift`. These tests are only to ensure that the command is indeed hooked up and registered properly.
1919

20-
@Suite(.skipInGitHubActions("failing in the GitHub actions runner environment"), .skipHostOS(.windows))
20+
@Suite(.skipHostOS(.windows))
2121
fileprivate struct CreateXCFrameworkCommandTests {
2222
@Test
2323
func commandInvocation() async throws {

Tests/SwiftBuildTests/ConsoleCommands/GeneralCommandsTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import SwiftBuild
1515
import SWBTestSupport
1616
import SWBUtil
1717

18-
@Suite(.skipInGitHubActions("failing in the GitHub actions runner environment"), .skipHostOS(.windows))
18+
@Suite(.skipHostOS(.windows))
1919
fileprivate struct GeneralCommandsTests {
2020
@Test(.skipHostOS(.windows), // PTY not supported on Windows
2121
.requireHostOS(.macOS)) // something with terminal echo is different on macOS vs Linux

0 commit comments

Comments
 (0)