1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
/*
This source file is part of the Swift.org open source project
Copyright (c) 2021 Apple Inc. and the Swift project authors
Licensed under Apache License v2.0 with Runtime Library Exception
See https://swift.org/LICENSE.txt for license information
See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/
import XCTest
@testable import SwiftDocCUtilities
@testable import SwiftDocC
class LogHandleTests: XCTestCase {
/// Test that ``LogHandle`` doesn't append extra newlines to output
/// - Bug: rdar://73462272
func testWriteToStandardOutput() throws {
#if os(Windows)
throw XCTSkip("cannot reassign file handles on Windows")
#else
let pipe = Pipe()
// dup stdout to restore later
let stdoutCopy = dup(FileHandle.standardOutput.fileDescriptor)
// dup pipe's write handle to stdout. Now the file desc for stdout is the same as the pipe,
// so when LogHandle writes to stdout, it'll be writing to pipe's write handle as well.
dup2(pipe.fileHandleForWriting.fileDescriptor, FileHandle.standardOutput.fileDescriptor)
var handle = LogHandle.standardOutput
handle.write("""
========================================
Starting Local Preview Server
Address: http://localhost:8080/documentation/my-framework
========================================
"""
)
// restore stdout since pipe will be deallocated. If this wasn't
// called, any subsequent calls to `Swift.print` could cause
// the test runner to crash.
dup2(stdoutCopy, FileHandle.standardOutput.fileDescriptor)
let text = String(data: pipe.fileHandleForReading.availableData, encoding: .utf8)
XCTAssertEqual(text, """
========================================
Starting Local Preview Server
Address: http://localhost:8080/documentation/my-framework
========================================
"""
)
#endif
}
func testFlushesStandardOutput() throws {
#if os(Windows)
throw XCTSkip("cannot reassign file handles on Windows")
#else
let pipe = Pipe()
// dup stdout to restore later
let stdoutCopy = dup(FileHandle.standardOutput.fileDescriptor)
dup2(pipe.fileHandleForWriting.fileDescriptor, FileHandle.standardOutput.fileDescriptor)
var handle = LogHandle.standardOutput
handle.write("No newlines here")
dup2(stdoutCopy, FileHandle.standardOutput.fileDescriptor)
let data = pipe.fileHandleForReading.availableData
let text = String(data: data, encoding: .utf8)
XCTAssertEqual(text, "No newlines here", "\(LogHandle.self) didn't flush stdout")
#endif
}
func testFlushesStandardError() throws {
#if os(Windows)
throw XCTSkip("cannot reassign file handles on Windows")
#else
let pipe = Pipe()
// dup stdout to restore later
let stdoutCopy = dup(FileHandle.standardError.fileDescriptor)
dup2(pipe.fileHandleForWriting.fileDescriptor, FileHandle.standardError.fileDescriptor)
var handle = LogHandle.standardError
handle.write("No newlines here")
dup2(stdoutCopy, FileHandle.standardError.fileDescriptor)
let data = pipe.fileHandleForReading.availableData
let text = String(data: data, encoding: .utf8)
XCTAssertEqual(text, "No newlines here", "\(LogHandle.self) didn't flush stderr")
#endif
}
}
|