Skip to content

Commit

Permalink
update console output to include duration for exceptions, and verify …
Browse files Browse the repository at this point in the history
…exception printing in output tests
  • Loading branch information
heckj committed Dec 31, 2024
1 parent db789fe commit b4a5aeb
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 2 deletions.
5 changes: 5 additions & 0 deletions Sources/Formic/Engine/CommandExecutionResult.swift
Original file line number Diff line number Diff line change
Expand Up @@ -78,16 +78,19 @@ extension CommandExecutionResult {
if includeEmoji {
stringOutput.append(" ")
}
stringOutput.append("[\(formattedDuration)] ")
stringOutput.append("exception: \(exception)")
} else if output.returnCode != 0 {
stringOutput.append("command: \(command), rc=\(output.returnCode), retries=\(retries)")
stringOutput.append("[\(formattedDuration)] ")
if let errorOutput = output.stderrString {
stringOutput.append("\nSTDERR: \(errorOutput)")
} else {
stringOutput.append(" No STDERR output.")
}
} else {
stringOutput.append("command: \(command), rc=\(output.returnCode), retries=\(retries)")
stringOutput.append("[\(formattedDuration)] ")
}
case .verbose(emoji: let includeEmoji):
// Reports host, command, duration, the result code, and stdout on success, or stderr on failure.
Expand All @@ -98,6 +101,7 @@ extension CommandExecutionResult {
if includeEmoji {
stringOutput.append(" ")
}
stringOutput.append("[\(formattedDuration)] ")
stringOutput.append("exception: \(exception)")
} else if output.returnCode != 0 {
stringOutput.append("[\(formattedDuration)] ")
Expand Down Expand Up @@ -125,6 +129,7 @@ extension CommandExecutionResult {
if includeEmoji {
stringOutput.append(" ")
}
stringOutput.append("[\(formattedDuration)] ")
stringOutput.append("exception: \(exception)")
} else {
stringOutput.append("[\(formattedDuration)] ")
Expand Down
53 changes: 51 additions & 2 deletions Tests/formicTests/CommandExecutionOutputTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -89,117 +89,166 @@ func testConsoleOutputForExecutionOuput() async throws {
#expect(successResult.consoleOutput(verbosity: .normal(emoji: false)).contains("uname"))
#expect(successResult.consoleOutput(verbosity: .normal(emoji: false)).contains("rc=0"))
#expect(successResult.consoleOutput(verbosity: .normal(emoji: false)).contains("retries=0"))
#expect(successResult.consoleOutput(verbosity: .normal(emoji: false)).contains("[00:00"))
// duration marker

#expect(failureResult.consoleOutput(verbosity: .normal(emoji: true)).contains(""))
#expect(failureResult.consoleOutput(verbosity: .normal(emoji: true)).contains("uname"))
#expect(failureResult.consoleOutput(verbosity: .normal(emoji: true)).contains("rc=-1"))
#expect(failureResult.consoleOutput(verbosity: .normal(emoji: true)).contains("retries=0"))
#expect(failureResult.consoleOutput(verbosity: .normal(emoji: true)).contains("I'm not telling you!"))
#expect(successResult.consoleOutput(verbosity: .normal(emoji: true)).contains("[00:00"))
// duration marker

#expect(!failureResult.consoleOutput(verbosity: .normal(emoji: false)).contains(""))
#expect(failureResult.consoleOutput(verbosity: .normal(emoji: false)).contains("uname"))
#expect(failureResult.consoleOutput(verbosity: .normal(emoji: false)).contains("rc=-1"))
#expect(failureResult.consoleOutput(verbosity: .normal(emoji: false)).contains("retries=0"))
#expect(failureResult.consoleOutput(verbosity: .normal(emoji: false)).contains("I'm not telling you!"))
#expect(failureResult.consoleOutput(verbosity: .normal(emoji: false)).contains("[00:00"))
// duration marker

#expect(ignoreFailureResult.consoleOutput(verbosity: .normal(emoji: true)).contains("⚠️"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .normal(emoji: true)).contains("uname"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .normal(emoji: true)).contains("rc=-1"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .normal(emoji: true)).contains("retries=0"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .normal(emoji: true)).contains("I'm not telling you!"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .normal(emoji: true)).contains("[00:00"))
// duration marker

#expect(!ignoreFailureResult.consoleOutput(verbosity: .normal(emoji: false)).contains("⚠️"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .normal(emoji: false)).contains("uname"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .normal(emoji: false)).contains("rc=-1"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .normal(emoji: false)).contains("retries=0"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .normal(emoji: false)).contains("I'm not telling you!"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .normal(emoji: false)).contains("[00:00"))
// duration marker

#expect(exceptionResult.consoleOutput(verbosity: .normal(emoji: true)).contains("🚫"))
#expect(exceptionResult.consoleOutput(verbosity: .normal(emoji: true)).contains("exception reported"))
#expect(exceptionResult.consoleOutput(verbosity: .normal(emoji: true)).contains("[00:00"))
// duration marker

#expect(!exceptionResult.consoleOutput(verbosity: .normal(emoji: false)).contains("🚫"))
#expect(exceptionResult.consoleOutput(verbosity: .normal(emoji: false)).contains("exception reported"))
#expect(exceptionResult.consoleOutput(verbosity: .normal(emoji: false)).contains("[00:00"))
// duration marker

// .verbose
#expect(successResult.consoleOutput(verbosity: .verbose(emoji: true)).contains(""))
#expect(successResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("uname"))
#expect(successResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("rc=0"))
#expect(successResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("retries=0"))
#expect(successResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("Darwin"))
#expect(successResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("[00:00"))
// duration marker

#expect(!successResult.consoleOutput(verbosity: .verbose(emoji: false)).contains(""))
#expect(successResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("uname"))
#expect(successResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("rc=0"))
#expect(successResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("retries=0"))
#expect(successResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("Darwin"))
#expect(successResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("Darwin"))
#expect(successResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("[00:00"))
// duration marker

#expect(failureResult.consoleOutput(verbosity: .verbose(emoji: true)).contains(""))
#expect(failureResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("uname"))
#expect(failureResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("rc=-1"))
#expect(failureResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("retries=0"))
#expect(failureResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("I'm not telling you!"))
#expect(failureResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("[00:00"))
// duration marker

#expect(!failureResult.consoleOutput(verbosity: .verbose(emoji: false)).contains(""))
#expect(failureResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("uname"))
#expect(failureResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("rc=-1"))
#expect(failureResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("retries=0"))
#expect(failureResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("I'm not telling you!"))
#expect(failureResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("[00:00"))
// duration marker

#expect(ignoreFailureResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("⚠️"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("uname"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("rc=-1"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("retries=0"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("I'm not telling you!"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("[00:00"))
// duration marker

#expect(!ignoreFailureResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("⚠️"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("uname"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("rc=-1"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("retries=0"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("I'm not telling you!"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("[00:00"))
// duration marker

#expect(exceptionResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("🚫"))
#expect(exceptionResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("exception reported"))
#expect(exceptionResult.consoleOutput(verbosity: .verbose(emoji: true)).contains("[00:00"))
// duration marker

#expect(!exceptionResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("🚫"))
#expect(exceptionResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("exception reported"))
#expect(exceptionResult.consoleOutput(verbosity: .verbose(emoji: false)).contains("[00:00"))
// duration marker

// .debug
#expect(successResult.consoleOutput(verbosity: .debug(emoji: true)).contains(""))
#expect(successResult.consoleOutput(verbosity: .debug(emoji: true)).contains("uname"))
#expect(successResult.consoleOutput(verbosity: .debug(emoji: true)).contains("rc=0"))
#expect(successResult.consoleOutput(verbosity: .debug(emoji: true)).contains("retries=0"))
#expect(successResult.consoleOutput(verbosity: .debug(emoji: true)).contains("Darwin"))
#expect(successResult.consoleOutput(verbosity: .debug(emoji: true)).contains("[00:00"))
// duration marker

#expect(!successResult.consoleOutput(verbosity: .debug(emoji: false)).contains(""))
#expect(successResult.consoleOutput(verbosity: .debug(emoji: false)).contains("uname"))
#expect(successResult.consoleOutput(verbosity: .debug(emoji: false)).contains("rc=0"))
#expect(successResult.consoleOutput(verbosity: .debug(emoji: false)).contains("retries=0"))
#expect(successResult.consoleOutput(verbosity: .debug(emoji: true)).contains("Darwin"))
#expect(successResult.consoleOutput(verbosity: .debug(emoji: false)).contains("Darwin"))
#expect(successResult.consoleOutput(verbosity: .debug(emoji: false)).contains("[00:00"))
// duration marker

#expect(failureResult.consoleOutput(verbosity: .debug(emoji: true)).contains(""))
#expect(failureResult.consoleOutput(verbosity: .debug(emoji: true)).contains("uname"))
#expect(failureResult.consoleOutput(verbosity: .debug(emoji: true)).contains("rc=-1"))
#expect(failureResult.consoleOutput(verbosity: .debug(emoji: true)).contains("retries=0"))
#expect(failureResult.consoleOutput(verbosity: .debug(emoji: true)).contains("I'm not telling you!"))
#expect(failureResult.consoleOutput(verbosity: .debug(emoji: true)).contains("[00:00"))
// duration marker

#expect(!failureResult.consoleOutput(verbosity: .debug(emoji: false)).contains(""))
#expect(failureResult.consoleOutput(verbosity: .debug(emoji: false)).contains("uname"))
#expect(failureResult.consoleOutput(verbosity: .debug(emoji: false)).contains("rc=-1"))
#expect(failureResult.consoleOutput(verbosity: .debug(emoji: false)).contains("retries=0"))
#expect(failureResult.consoleOutput(verbosity: .debug(emoji: false)).contains("I'm not telling you!"))
#expect(failureResult.consoleOutput(verbosity: .debug(emoji: false)).contains("[00:00"))
// duration marker

#expect(ignoreFailureResult.consoleOutput(verbosity: .debug(emoji: true)).contains("⚠️"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .debug(emoji: true)).contains("uname"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .debug(emoji: true)).contains("rc=-1"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .debug(emoji: true)).contains("retries=0"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .debug(emoji: true)).contains("I'm not telling you!"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .debug(emoji: false)).contains("[00:00"))
// duration marker

#expect(!ignoreFailureResult.consoleOutput(verbosity: .debug(emoji: false)).contains("⚠️"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .debug(emoji: false)).contains("uname"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .debug(emoji: false)).contains("rc=-1"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .debug(emoji: false)).contains("retries=0"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .debug(emoji: false)).contains("I'm not telling you!"))
#expect(ignoreFailureResult.consoleOutput(verbosity: .debug(emoji: false)).contains("[00:00"))
// duration marker

#expect(exceptionResult.consoleOutput(verbosity: .debug(emoji: true)).contains("🚫"))
#expect(exceptionResult.consoleOutput(verbosity: .debug(emoji: true)).contains("exception reported"))
#expect(exceptionResult.consoleOutput(verbosity: .debug(emoji: true)).contains("[00:00"))
// duration marker

#expect(!exceptionResult.consoleOutput(verbosity: .debug(emoji: false)).contains("🚫"))
#expect(exceptionResult.consoleOutput(verbosity: .debug(emoji: false)).contains("exception reported"))
#expect(exceptionResult.consoleOutput(verbosity: .debug(emoji: false)).contains("[00:00"))
// duration marker
}
2 changes: 2 additions & 0 deletions Tests/formicTests/EngineTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@ func testCommandTimeout() async throws {
#expect(outputFromRun.representsFailure() == true)
#expect(outputFromRun.output.stderrString == nil)
#expect(outputFromRun.output.stdoutString == nil)
#expect(outputFromRun.duration > .seconds(1))
//print(outputFromRun.consoleOutput(verbosity: .debug(emoji: true)))
}

@Test("verify retry works as expected")
Expand Down

0 comments on commit b4a5aeb

Please sign in to comment.