54 lines
1.8 KiB
Swift
54 lines
1.8 KiB
Swift
// SPDX-FileCopyrightText: 2026 Kaede Akino
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
import Darwin
|
|
import Foundation
|
|
import Testing
|
|
|
|
@testable import TermindRemoteInfrastructure
|
|
|
|
@Suite
|
|
struct SFTPSocketRelayTests {
|
|
@Test
|
|
func successfulSourceCompletionMarksEOFAfterBytes() throws {
|
|
let relay = try SFTPSocketRelay()
|
|
defer { relay.close() }
|
|
var sent: UInt8 = 255
|
|
#expect(Darwin.send(relay.writer, &sent, 1, 0) == 1)
|
|
#expect(!relay.sourceSucceeded)
|
|
relay.finishWriting()
|
|
var received: UInt8 = 0
|
|
#expect(Darwin.recv(relay.reader, &received, 1, 0) == 1)
|
|
#expect(received == sent)
|
|
#expect(Darwin.recv(relay.reader, &received, 1, 0) == 0)
|
|
#expect(relay.sourceSucceeded)
|
|
}
|
|
|
|
/// A token that was already cancelled stops the relay as soon as the
|
|
/// observer is installed, and that EOF never authorizes a commit.
|
|
@Test
|
|
func alreadyCancelledTokensImmediatelyStopNewRelays() throws {
|
|
let cancellation = TransferCancellationToken()
|
|
cancellation.cancel()
|
|
let relay = try SFTPSocketRelay()
|
|
defer { relay.close() }
|
|
let observer = cancellation.observeCancellation { relay.stop() }
|
|
defer { cancellation.removeObserver(observer) }
|
|
var byte: UInt8 = 0
|
|
#expect(Darwin.recv(relay.reader, &byte, 1, 0) == 0)
|
|
#expect(!relay.sourceSucceeded)
|
|
}
|
|
|
|
@Test
|
|
func cancellationAfterBytesStillDoesNotMarkSuccessfulSourceEOF() throws {
|
|
let relay = try SFTPSocketRelay()
|
|
defer { relay.close() }
|
|
var byte: UInt8 = 1
|
|
#expect(Darwin.send(relay.writer, &byte, 1, 0) == 1)
|
|
#expect(Darwin.recv(relay.reader, &byte, 1, 0) == 1)
|
|
relay.stop()
|
|
#expect(!relay.sourceSucceeded)
|
|
#expect(Darwin.recv(relay.reader, &byte, 1, 0) == 0)
|
|
}
|
|
}
|