From 0a2f81db09f278ac58c99d5baed6731b4b67feee Mon Sep 17 00:00:00 2001 From: Mateusz Charytoniuk Date: Fri, 22 May 2026 16:51:02 +0200 Subject: [PATCH 1/2] bump @intentee/rust-coverage-check to 0.3.1 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index cdd7d3f..4a6c50f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,13 +6,13 @@ "": { "name": "trzcina", "devDependencies": { - "@intentee/rust-coverage-check": "0.2.0" + "@intentee/rust-coverage-check": "0.3.1" } }, "node_modules/@intentee/rust-coverage-check": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@intentee/rust-coverage-check/-/rust-coverage-check-0.2.0.tgz", - "integrity": "sha512-RRCHxYdYLk5SjmBw4YAOsaE3GwjJYuzhpY/Gaz8frW0dLqXZNBz5Xtd2k79dI8januHjLDjH12/vYNHOoHNsSw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@intentee/rust-coverage-check/-/rust-coverage-check-0.3.1.tgz", + "integrity": "sha512-Ep4kv95XYjNESk1LYmhs+KPuzaQQ1fGq3ZSwB/Knwu5aZj23ICY7hLQDdU//BEQMZU0hwrhmv2gtQ8Z1bPcNrQ==", "dev": true, "license": "MIT", "bin": { diff --git a/package.json b/package.json index 87c53cf..61b306b 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,6 @@ "private": true, "type": "module", "devDependencies": { - "@intentee/rust-coverage-check": "0.2.0" + "@intentee/rust-coverage-check": "0.3.1" } } From fd751259fe313dc7c0230b18e5f5a3347691e8a8 Mon Sep 17 00:00:00 2001 From: Mateusz Charytoniuk Date: Fri, 22 May 2026 16:55:32 +0200 Subject: [PATCH 2/2] convert isolated tests to unit tests --- trzcina/src/service_shutdown_error.rs | 98 +++++++++++++++++++ trzcina/src/service_shutdown_options.rs | 30 ++++++ ...or_display_formats_all_failure_variants.rs | 36 ------- ..._display_propagates_header_writer_error.rs | 27 ----- ...display_propagates_outcome_writer_error.rs | 37 ------- .../service_shutdown_options_can_be_cloned.rs | 14 --- ...tions_default_uses_ten_second_deadlines.rs | 14 --- 7 files changed, 128 insertions(+), 128 deletions(-) delete mode 100644 trzcina/tests/service_shutdown_error_display_formats_all_failure_variants.rs delete mode 100644 trzcina/tests/service_shutdown_error_display_propagates_header_writer_error.rs delete mode 100644 trzcina/tests/service_shutdown_error_display_propagates_outcome_writer_error.rs delete mode 100644 trzcina/tests/service_shutdown_options_can_be_cloned.rs delete mode 100644 trzcina/tests/service_shutdown_options_default_uses_ten_second_deadlines.rs diff --git a/trzcina/src/service_shutdown_error.rs b/trzcina/src/service_shutdown_error.rs index 696068a..f196394 100644 --- a/trzcina/src/service_shutdown_error.rs +++ b/trzcina/src/service_shutdown_error.rs @@ -48,3 +48,101 @@ impl fmt::Display for ServiceShutdownError { } impl Error for ServiceShutdownError {} + +#[cfg(test)] +mod tests { + use std::fmt; + use std::fmt::Write; + + use anyhow::anyhow; + + use super::ServiceShutdownError; + use super::ServiceShutdownOutcome; + use super::ServiceShutdownOutcomeWithServiceName; + + struct AlwaysFailingWriter; + + impl fmt::Write for AlwaysFailingWriter { + fn write_str(&mut self, _written: &str) -> fmt::Result { + Err(fmt::Error) + } + } + + struct WriterThatFailsOnSecondWrite { + has_been_called: bool, + } + + impl fmt::Write for WriterThatFailsOnSecondWrite { + fn write_str(&mut self, _written: &str) -> fmt::Result { + if self.has_been_called { + return Err(fmt::Error); + } + + self.has_been_called = true; + + Ok(()) + } + } + + #[test] + fn display_formats_all_failure_variants() { + let outcomes = vec![ + ServiceShutdownOutcomeWithServiceName { + name: "completed_service", + outcome: ServiceShutdownOutcome::Completed, + }, + ServiceShutdownOutcomeWithServiceName { + name: "errored_service", + outcome: ServiceShutdownOutcome::Errored(anyhow!("service failed")), + }, + ServiceShutdownOutcomeWithServiceName { + name: "panicked_service", + outcome: ServiceShutdownOutcome::Panicked("service panicked".to_owned()), + }, + ServiceShutdownOutcomeWithServiceName { + name: "aborted_service", + outcome: ServiceShutdownOutcome::AbortedByShutdownDeadline, + }, + ServiceShutdownOutcomeWithServiceName { + name: "leaked_service", + outcome: ServiceShutdownOutcome::LeakedBeyondShutdownDeadline, + }, + ]; + + let error = ServiceShutdownError::new(outcomes); + let formatted = format!("{error}"); + + assert!(!formatted.is_empty()); + assert_eq!(error.failed_outcomes().len(), 5); + } + + #[test] + fn display_propagates_writer_error_from_header_line() { + let shutdown_error = + ServiceShutdownError::new(vec![ServiceShutdownOutcomeWithServiceName { + name: "test_service", + outcome: ServiceShutdownOutcome::AbortedByShutdownDeadline, + }]); + + let mut writer = AlwaysFailingWriter; + let write_result = write!(writer, "{shutdown_error}"); + + assert!(write_result.is_err()); + } + + #[test] + fn display_propagates_writer_error_from_outcome_line() { + let shutdown_error = + ServiceShutdownError::new(vec![ServiceShutdownOutcomeWithServiceName { + name: "test_service", + outcome: ServiceShutdownOutcome::AbortedByShutdownDeadline, + }]); + + let mut writer = WriterThatFailsOnSecondWrite { + has_been_called: false, + }; + let write_result = write!(writer, "{shutdown_error}"); + + assert!(write_result.is_err()); + } +} diff --git a/trzcina/src/service_shutdown_options.rs b/trzcina/src/service_shutdown_options.rs index 9f4257f..fc6bdb0 100644 --- a/trzcina/src/service_shutdown_options.rs +++ b/trzcina/src/service_shutdown_options.rs @@ -14,3 +14,33 @@ impl Default for ServiceShutdownOptions { } } } + +#[cfg(test)] +mod tests { + use std::time::Duration; + + use super::ServiceShutdownOptions; + + #[test] + fn default_uses_ten_second_deadlines_for_both_phases() { + let ServiceShutdownOptions { + cooperative_deadline, + abort_deadline, + } = ServiceShutdownOptions::default(); + + assert_eq!(cooperative_deadline, Duration::from_secs(10)); + assert_eq!(abort_deadline, Duration::from_secs(10)); + } + + #[test] + fn can_be_cloned() { + let original = ServiceShutdownOptions { + cooperative_deadline: Duration::from_millis(7), + abort_deadline: Duration::from_millis(11), + }; + let cloned = original.clone(); + + assert_eq!(original.cooperative_deadline, cloned.cooperative_deadline); + assert_eq!(original.abort_deadline, cloned.abort_deadline); + } +} diff --git a/trzcina/tests/service_shutdown_error_display_formats_all_failure_variants.rs b/trzcina/tests/service_shutdown_error_display_formats_all_failure_variants.rs deleted file mode 100644 index 68d89cc..0000000 --- a/trzcina/tests/service_shutdown_error_display_formats_all_failure_variants.rs +++ /dev/null @@ -1,36 +0,0 @@ -use anyhow::anyhow; -use trzcina::ServiceShutdownError; -use trzcina::ServiceShutdownOutcome; -use trzcina::ServiceShutdownOutcomeWithServiceName; - -#[test] -fn display_formats_all_failure_variants() { - let outcomes = vec![ - ServiceShutdownOutcomeWithServiceName { - name: "completed_service", - outcome: ServiceShutdownOutcome::Completed, - }, - ServiceShutdownOutcomeWithServiceName { - name: "errored_service", - outcome: ServiceShutdownOutcome::Errored(anyhow!("service failed")), - }, - ServiceShutdownOutcomeWithServiceName { - name: "panicked_service", - outcome: ServiceShutdownOutcome::Panicked("service panicked".to_owned()), - }, - ServiceShutdownOutcomeWithServiceName { - name: "aborted_service", - outcome: ServiceShutdownOutcome::AbortedByShutdownDeadline, - }, - ServiceShutdownOutcomeWithServiceName { - name: "leaked_service", - outcome: ServiceShutdownOutcome::LeakedBeyondShutdownDeadline, - }, - ]; - - let error = ServiceShutdownError::new(outcomes); - let formatted = format!("{error}"); - - assert!(!formatted.is_empty()); - assert_eq!(error.failed_outcomes().len(), 5); -} diff --git a/trzcina/tests/service_shutdown_error_display_propagates_header_writer_error.rs b/trzcina/tests/service_shutdown_error_display_propagates_header_writer_error.rs deleted file mode 100644 index 2fcf7b9..0000000 --- a/trzcina/tests/service_shutdown_error_display_propagates_header_writer_error.rs +++ /dev/null @@ -1,27 +0,0 @@ -use std::fmt; -use std::fmt::Write; - -use trzcina::ServiceShutdownError; -use trzcina::ServiceShutdownOutcome; -use trzcina::ServiceShutdownOutcomeWithServiceName; - -struct AlwaysFailingWriter; - -impl fmt::Write for AlwaysFailingWriter { - fn write_str(&mut self, _written: &str) -> fmt::Result { - Err(fmt::Error) - } -} - -#[test] -fn display_propagates_writer_error_from_header_line() { - let shutdown_error = ServiceShutdownError::new(vec![ServiceShutdownOutcomeWithServiceName { - name: "test_service", - outcome: ServiceShutdownOutcome::AbortedByShutdownDeadline, - }]); - - let mut writer = AlwaysFailingWriter; - let write_result = write!(writer, "{shutdown_error}"); - - assert!(write_result.is_err()); -} diff --git a/trzcina/tests/service_shutdown_error_display_propagates_outcome_writer_error.rs b/trzcina/tests/service_shutdown_error_display_propagates_outcome_writer_error.rs deleted file mode 100644 index c66fd87..0000000 --- a/trzcina/tests/service_shutdown_error_display_propagates_outcome_writer_error.rs +++ /dev/null @@ -1,37 +0,0 @@ -use std::fmt; -use std::fmt::Write; - -use trzcina::ServiceShutdownError; -use trzcina::ServiceShutdownOutcome; -use trzcina::ServiceShutdownOutcomeWithServiceName; - -struct WriterThatFailsAfterFirstLine { - saw_newline: bool, -} - -impl fmt::Write for WriterThatFailsAfterFirstLine { - fn write_str(&mut self, written: &str) -> fmt::Result { - if self.saw_newline { - return Err(fmt::Error); - } - - if written.contains('\n') { - self.saw_newline = true; - } - - Ok(()) - } -} - -#[test] -fn display_propagates_writer_error_from_outcome_line() { - let shutdown_error = ServiceShutdownError::new(vec![ServiceShutdownOutcomeWithServiceName { - name: "test_service", - outcome: ServiceShutdownOutcome::AbortedByShutdownDeadline, - }]); - - let mut writer = WriterThatFailsAfterFirstLine { saw_newline: false }; - let write_result = write!(writer, "{shutdown_error}"); - - assert!(write_result.is_err()); -} diff --git a/trzcina/tests/service_shutdown_options_can_be_cloned.rs b/trzcina/tests/service_shutdown_options_can_be_cloned.rs deleted file mode 100644 index e5c3238..0000000 --- a/trzcina/tests/service_shutdown_options_can_be_cloned.rs +++ /dev/null @@ -1,14 +0,0 @@ -use std::time::Duration; - -use trzcina::ServiceShutdownOptions; - -#[test] -fn can_be_cloned() { - let original = ServiceShutdownOptions { - cooperative_deadline: Duration::from_millis(7), - abort_deadline: Duration::from_millis(11), - }; - let cloned = original.clone(); - assert_eq!(original.cooperative_deadline, cloned.cooperative_deadline); - assert_eq!(original.abort_deadline, cloned.abort_deadline); -} diff --git a/trzcina/tests/service_shutdown_options_default_uses_ten_second_deadlines.rs b/trzcina/tests/service_shutdown_options_default_uses_ten_second_deadlines.rs deleted file mode 100644 index 6202df3..0000000 --- a/trzcina/tests/service_shutdown_options_default_uses_ten_second_deadlines.rs +++ /dev/null @@ -1,14 +0,0 @@ -use std::time::Duration; - -use trzcina::ServiceShutdownOptions; - -#[test] -fn default_uses_ten_second_deadlines_for_both_phases() { - let ServiceShutdownOptions { - cooperative_deadline, - abort_deadline, - } = ServiceShutdownOptions::default(); - - assert_eq!(cooperative_deadline, Duration::from_secs(10)); - assert_eq!(abort_deadline, Duration::from_secs(10)); -}