Files
Termind/TFMTests/SFTPSocketRelayTests.swift
T

61 lines
2.0 KiB
Swift

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)
}
@Test
func failedOrCancelledSourceEOFDoesNotAuthorizeCommit() throws {
let relay = try SFTPSocketRelay()
defer { relay.close() }
let cancellation = TransferCancellationToken()
let observer = cancellation.observeCancellation { relay.stop() }
defer { cancellation.removeObserver(observer) }
cancellation.cancel()
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)
}
@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)
}
}