From d54ea70020a97e8253a249df78c5773283c578ea Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 29 May 2026 09:06:38 -0700 Subject: [PATCH 1/7] [bfops/ci-backtrace]: CI - `RUST_BACKTRACE=full` --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0d89a11ecf7..61f4f22dcaf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,6 +36,7 @@ jobs: timeout-minutes: 120 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target + RUST_BACKTRACE: full SPACETIMEDB_CPP_DIR: ${{ github.workspace }}/crates/bindings-cpp steps: - name: Find Git ref @@ -182,6 +183,7 @@ jobs: env: CARGO_TARGET_DIR: ${{ github.workspace }}/target + RUST_BACKTRACE: full steps: - name: Find Git ref env: From 62657201b9e8668591745ba7b674a6dda31366ae Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 29 May 2026 09:08:34 -0700 Subject: [PATCH 2/7] [bfops/ci-backtrace]: all the other jobs --- .github/workflows/ci.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 61f4f22dcaf..c2ab322b8e3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -274,6 +274,7 @@ jobs: timeout-minutes: 60 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target + RUST_BACKTRACE: full steps: - name: Find Git ref env: @@ -329,6 +330,7 @@ jobs: runs-on: spacetimedb-new-runner-2 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target + RUST_BACKTRACE: full steps: - name: Checkout sources uses: actions/checkout@v3 @@ -368,6 +370,7 @@ jobs: runs-on: spacetimedb-new-runner-2 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target + RUST_BACKTRACE: full steps: - uses: actions/checkout@v3 @@ -392,6 +395,8 @@ jobs: name: Check that packages are publishable runs-on: spacetimedb-new-runner-2 permissions: read-all + env: + RUST_BACKTRACE: full steps: - uses: actions/checkout@v3 - uses: dsherret/rust-toolchain-file@v1 @@ -411,6 +416,8 @@ jobs: - { target: aarch64-apple-darwin, runner: macos-latest } - { target: x86_64-pc-windows-msvc, runner: windows-latest } runs-on: ${{ matrix.runner }} + env: + RUST_BACKTRACE: full steps: - name: Checkout uses: actions/checkout@v3 @@ -455,6 +462,8 @@ jobs: # Run as root because otherwise we get permission denied for various directories inside the container. I tried doing dances to allow it to run # without this (reassigning env vars and stuff), but was unable to get it to work and it felt like an uphill battle. options: --user 0:0 + env: + RUST_BACKTRACE: full steps: # Uncomment this before merging so that it will run properly if run manually through the GH actions flow. It was playing weird with rolled back # commits though. @@ -527,6 +536,8 @@ jobs: ci_command_docs: name: Check CI command docs runs-on: spacetimedb-new-runner-2 + env: + RUST_BACKTRACE: full steps: - name: Find Git ref env: @@ -559,6 +570,7 @@ jobs: runs-on: spacetimedb-new-runner-2 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target + RUST_BACKTRACE: full steps: - name: Find Git ref env: @@ -629,6 +641,7 @@ jobs: timeout-minutes: 30 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target + RUST_BACKTRACE: full steps: - name: Checkout repository id: checkout-stdb @@ -768,6 +781,7 @@ jobs: timeout-minutes: 30 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target + RUST_BACKTRACE: full steps: - name: Checkout repository id: checkout-stdb @@ -891,6 +905,7 @@ jobs: contents: read runs-on: ubuntu-latest env: + RUST_BACKTRACE: full TARGET_OWNER: clockworklabs TARGET_REPO: SpacetimeDBPrivate steps: @@ -1016,6 +1031,8 @@ jobs: runs-on: ubuntu-latest permissions: contents: read + env: + RUST_BACKTRACE: full steps: - name: Find Git ref env: @@ -1055,6 +1072,7 @@ jobs: contents: read env: CARGO_TARGET_DIR: ${{ github.workspace }}/target + RUST_BACKTRACE: full steps: - name: Find Git ref env: @@ -1107,6 +1125,8 @@ jobs: docs-build: name: Docs build runs-on: spacetimedb-new-runner-2 + env: + RUST_BACKTRACE: full steps: - name: Checkout repository uses: actions/checkout@v3 @@ -1144,6 +1164,8 @@ jobs: typescript-test: name: TypeScript - Tests runs-on: spacetimedb-new-runner-2 + env: + RUST_BACKTRACE: full steps: - name: Checkout repository uses: actions/checkout@v4 @@ -1254,6 +1276,8 @@ jobs: version_upgrade_check: runs-on: spacetimedb-new-runner-2 + env: + RUST_BACKTRACE: full steps: - name: Checkout uses: actions/checkout@v3 From 189523e4ece40fe58a8c98767328cce75b925649 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Tue, 2 Jun 2026 10:26:28 -0700 Subject: [PATCH 3/7] [bfops/ci-backtrace]: fix flaked tests --- crates/smoketests/tests/smoketests/call.rs | 59 +++++++--------------- 1 file changed, 17 insertions(+), 42 deletions(-) diff --git a/crates/smoketests/tests/smoketests/call.rs b/crates/smoketests/tests/smoketests/call.rs index 9c033979bb7..4d06d5c918d 100644 --- a/crates/smoketests/tests/smoketests/call.rs +++ b/crates/smoketests/tests/smoketests/call.rs @@ -1,5 +1,16 @@ use spacetimedb_smoketests::Smoketest; +fn assert_stderr_starts_with(stderr: &[u8], expected: &str) { + let stderr = String::from_utf8_lossy(stderr); + let stderr = stderr.trim_end(); + assert!( + stderr.starts_with(expected), + "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", + expected, + stderr + ); +} + /// Check calling a reducer (no return) and procedure (return) #[test] fn test_call_reducer_procedure() { @@ -28,7 +39,6 @@ fn test_call_errors() { // Non-existent reducer let output = test.call_output("non_existent_reducer", &[]); assert!(!output.status.success()); - let stderr = String::from_utf8_lossy(&output.stderr); let expected = format!( "WARNING: This command is UNSTABLE and subject to breaking changes. @@ -40,17 +50,11 @@ Here are some existing reducers: Here are some existing procedures: - return_person" ); - assert!( - expected.contains(stderr.trim()), - "Expected stderr to be contained in expected message.\nExpected:\n{}\n\nActual stderr:\n{}", - expected, - stderr.trim() - ); + assert_stderr_starts_with(&output.stderr, &expected); // Non-existent procedure let output = test.call_output("non_existent_procedure", &[]); assert!(!output.status.success()); - let stderr = String::from_utf8_lossy(&output.stderr); let expected = format!( "WARNING: This command is UNSTABLE and subject to breaking changes. @@ -62,17 +66,11 @@ Here are some existing reducers: Here are some existing procedures: - return_person" ); - assert!( - expected.contains(stderr.trim()), - "Expected stderr to be contained in expected message.\nExpected:\n{}\n\nActual stderr:\n{}", - expected, - stderr.trim() - ); + assert_stderr_starts_with(&output.stderr, &expected); // Similar name to reducer - should suggest similar let output = test.call_output("say_hell", &[]); assert!(!output.status.success()); - let stderr = String::from_utf8_lossy(&output.stderr); let expected = format!( "WARNING: This command is UNSTABLE and subject to breaking changes. @@ -80,17 +78,11 @@ Error: No such reducer OR procedure `say_hell` for database `{identity}` resolvi A reducer with a similar name exists: `say_hello`" ); - assert!( - expected.contains(stderr.trim()), - "Expected stderr to be contained in expected message.\nExpected:\n{}\n\nActual stderr:\n{}", - expected, - stderr.trim() - ); + assert_stderr_starts_with(&output.stderr, &expected); // Similar name to procedure - should suggest similar let output = test.call_output("return_perso", &[]); assert!(!output.status.success()); - let stderr = String::from_utf8_lossy(&output.stderr); let expected = format!( "WARNING: This command is UNSTABLE and subject to breaking changes. @@ -98,12 +90,7 @@ Error: No such reducer OR procedure `return_perso` for database `{identity}` res A procedure with a similar name exists: `return_person`" ); - assert!( - expected.contains(stderr.trim()), - "Expected stderr to be contained in expected message.\nExpected:\n{}\n\nActual stderr:\n{}", - expected, - stderr.trim() - ); + assert_stderr_starts_with(&output.stderr, &expected); } /// Check calling into a database with no reducers/procedures raises error @@ -115,7 +102,6 @@ fn test_call_empty_errors() { let output = test.call_output("non_existent", &[]); assert!(!output.status.success()); - let stderr = String::from_utf8_lossy(&output.stderr); let expected = format!( "WARNING: This command is UNSTABLE and subject to breaking changes. @@ -125,12 +111,7 @@ The database has no reducers. The database has no procedures." ); - assert!( - expected.contains(stderr.trim()), - "Expected stderr to be contained in expected message.\nExpected:\n{}\n\nActual stderr:\n{}", - expected, - stderr.trim() - ); + assert_stderr_starts_with(&output.stderr, &expected); } /// Generate module code with many reducers and procedures @@ -170,7 +151,6 @@ fn test_call_many_errors() { let output = test.call_output("non_existent", &[]); assert!(!output.status.success()); - let stderr = String::from_utf8_lossy(&output.stderr); let expected = format!( "WARNING: This command is UNSTABLE and subject to breaking changes. @@ -203,10 +183,5 @@ Here are some existing procedures: - say_procedure_9 ... (1 procedure not shown)" ); - assert!( - expected.contains(stderr.trim()), - "Expected stderr to be contained in expected message.\nExpected:\n{}\n\nActual stderr:\n{}", - expected, - stderr.trim() - ); + assert_stderr_starts_with(&output.stderr, &expected); } From e2c6fe7788b72e2a9a1d51840cb0de4ca33be2f2 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Tue, 2 Jun 2026 10:33:06 -0700 Subject: [PATCH 4/7] [bfops/ci-backtrace]: review --- crates/smoketests/tests/smoketests/call.rs | 65 ++++++++++++++++------ 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/crates/smoketests/tests/smoketests/call.rs b/crates/smoketests/tests/smoketests/call.rs index 4d06d5c918d..8eb01e4d01e 100644 --- a/crates/smoketests/tests/smoketests/call.rs +++ b/crates/smoketests/tests/smoketests/call.rs @@ -1,16 +1,5 @@ use spacetimedb_smoketests::Smoketest; -fn assert_stderr_starts_with(stderr: &[u8], expected: &str) { - let stderr = String::from_utf8_lossy(stderr); - let stderr = stderr.trim_end(); - assert!( - stderr.starts_with(expected), - "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", - expected, - stderr - ); -} - /// Check calling a reducer (no return) and procedure (return) #[test] fn test_call_reducer_procedure() { @@ -50,7 +39,14 @@ Here are some existing reducers: Here are some existing procedures: - return_person" ); - assert_stderr_starts_with(&output.stderr, &expected); + let stderr = String::from_utf8_lossy(&output.stderr); + let stderr = stderr.trim_end(); + assert!( + stderr.starts_with(&expected), + "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", + expected, + stderr + ); // Non-existent procedure let output = test.call_output("non_existent_procedure", &[]); @@ -66,7 +62,14 @@ Here are some existing reducers: Here are some existing procedures: - return_person" ); - assert_stderr_starts_with(&output.stderr, &expected); + let stderr = String::from_utf8_lossy(&output.stderr); + let stderr = stderr.trim_end(); + assert!( + stderr.starts_with(&expected), + "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", + expected, + stderr + ); // Similar name to reducer - should suggest similar let output = test.call_output("say_hell", &[]); @@ -78,7 +81,14 @@ Error: No such reducer OR procedure `say_hell` for database `{identity}` resolvi A reducer with a similar name exists: `say_hello`" ); - assert_stderr_starts_with(&output.stderr, &expected); + let stderr = String::from_utf8_lossy(&output.stderr); + let stderr = stderr.trim_end(); + assert!( + stderr.starts_with(&expected), + "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", + expected, + stderr + ); // Similar name to procedure - should suggest similar let output = test.call_output("return_perso", &[]); @@ -90,7 +100,14 @@ Error: No such reducer OR procedure `return_perso` for database `{identity}` res A procedure with a similar name exists: `return_person`" ); - assert_stderr_starts_with(&output.stderr, &expected); + let stderr = String::from_utf8_lossy(&output.stderr); + let stderr = stderr.trim_end(); + assert!( + stderr.starts_with(&expected), + "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", + expected, + stderr + ); } /// Check calling into a database with no reducers/procedures raises error @@ -111,7 +128,14 @@ The database has no reducers. The database has no procedures." ); - assert_stderr_starts_with(&output.stderr, &expected); + let stderr = String::from_utf8_lossy(&output.stderr); + let stderr = stderr.trim_end(); + assert!( + stderr.starts_with(&expected), + "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", + expected, + stderr + ); } /// Generate module code with many reducers and procedures @@ -183,5 +207,12 @@ Here are some existing procedures: - say_procedure_9 ... (1 procedure not shown)" ); - assert_stderr_starts_with(&output.stderr, &expected); + let stderr = String::from_utf8_lossy(&output.stderr); + let stderr = stderr.trim_end(); + assert!( + stderr.starts_with(&expected), + "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", + expected, + stderr + ); } From 4fa311afdd13b17d5546d5b75a71ab020f631e68 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Tue, 2 Jun 2026 10:34:41 -0700 Subject: [PATCH 5/7] [bfops/ci-backtrace]: review --- crates/smoketests/tests/smoketests/call.rs | 30 +++++++++------------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/crates/smoketests/tests/smoketests/call.rs b/crates/smoketests/tests/smoketests/call.rs index 8eb01e4d01e..c7d1e7a7084 100644 --- a/crates/smoketests/tests/smoketests/call.rs +++ b/crates/smoketests/tests/smoketests/call.rs @@ -28,6 +28,7 @@ fn test_call_errors() { // Non-existent reducer let output = test.call_output("non_existent_reducer", &[]); assert!(!output.status.success()); + let stderr = String::from_utf8_lossy(&output.stderr); let expected = format!( "WARNING: This command is UNSTABLE and subject to breaking changes. @@ -39,10 +40,8 @@ Here are some existing reducers: Here are some existing procedures: - return_person" ); - let stderr = String::from_utf8_lossy(&output.stderr); - let stderr = stderr.trim_end(); assert!( - stderr.starts_with(&expected), + stderr.trim_end().starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, stderr @@ -51,6 +50,7 @@ Here are some existing procedures: // Non-existent procedure let output = test.call_output("non_existent_procedure", &[]); assert!(!output.status.success()); + let stderr = String::from_utf8_lossy(&output.stderr); let expected = format!( "WARNING: This command is UNSTABLE and subject to breaking changes. @@ -62,10 +62,8 @@ Here are some existing reducers: Here are some existing procedures: - return_person" ); - let stderr = String::from_utf8_lossy(&output.stderr); - let stderr = stderr.trim_end(); assert!( - stderr.starts_with(&expected), + stderr.trim_end().starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, stderr @@ -74,6 +72,7 @@ Here are some existing procedures: // Similar name to reducer - should suggest similar let output = test.call_output("say_hell", &[]); assert!(!output.status.success()); + let stderr = String::from_utf8_lossy(&output.stderr); let expected = format!( "WARNING: This command is UNSTABLE and subject to breaking changes. @@ -81,10 +80,8 @@ Error: No such reducer OR procedure `say_hell` for database `{identity}` resolvi A reducer with a similar name exists: `say_hello`" ); - let stderr = String::from_utf8_lossy(&output.stderr); - let stderr = stderr.trim_end(); assert!( - stderr.starts_with(&expected), + stderr.trim_end().starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, stderr @@ -93,6 +90,7 @@ A reducer with a similar name exists: `say_hello`" // Similar name to procedure - should suggest similar let output = test.call_output("return_perso", &[]); assert!(!output.status.success()); + let stderr = String::from_utf8_lossy(&output.stderr); let expected = format!( "WARNING: This command is UNSTABLE and subject to breaking changes. @@ -100,10 +98,8 @@ Error: No such reducer OR procedure `return_perso` for database `{identity}` res A procedure with a similar name exists: `return_person`" ); - let stderr = String::from_utf8_lossy(&output.stderr); - let stderr = stderr.trim_end(); assert!( - stderr.starts_with(&expected), + stderr.trim_end().starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, stderr @@ -119,6 +115,7 @@ fn test_call_empty_errors() { let output = test.call_output("non_existent", &[]); assert!(!output.status.success()); + let stderr = String::from_utf8_lossy(&output.stderr); let expected = format!( "WARNING: This command is UNSTABLE and subject to breaking changes. @@ -128,10 +125,8 @@ The database has no reducers. The database has no procedures." ); - let stderr = String::from_utf8_lossy(&output.stderr); - let stderr = stderr.trim_end(); assert!( - stderr.starts_with(&expected), + stderr.trim_end().starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, stderr @@ -175,6 +170,7 @@ fn test_call_many_errors() { let output = test.call_output("non_existent", &[]); assert!(!output.status.success()); + let stderr = String::from_utf8_lossy(&output.stderr); let expected = format!( "WARNING: This command is UNSTABLE and subject to breaking changes. @@ -207,10 +203,8 @@ Here are some existing procedures: - say_procedure_9 ... (1 procedure not shown)" ); - let stderr = String::from_utf8_lossy(&output.stderr); - let stderr = stderr.trim_end(); assert!( - stderr.starts_with(&expected), + stderr.trim_end().starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, stderr From 6d320b60f8f5af70d70d3a38c8c67a7aebf01c86 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Tue, 2 Jun 2026 10:35:44 -0700 Subject: [PATCH 6/7] [bfops/ci-backtrace]: review --- crates/smoketests/tests/smoketests/call.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/smoketests/tests/smoketests/call.rs b/crates/smoketests/tests/smoketests/call.rs index c7d1e7a7084..af360cf34e6 100644 --- a/crates/smoketests/tests/smoketests/call.rs +++ b/crates/smoketests/tests/smoketests/call.rs @@ -41,7 +41,7 @@ Here are some existing procedures: - return_person" ); assert!( - stderr.trim_end().starts_with(&expected), + stderr.starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, stderr @@ -63,7 +63,7 @@ Here are some existing procedures: - return_person" ); assert!( - stderr.trim_end().starts_with(&expected), + stderr.starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, stderr @@ -81,7 +81,7 @@ Error: No such reducer OR procedure `say_hell` for database `{identity}` resolvi A reducer with a similar name exists: `say_hello`" ); assert!( - stderr.trim_end().starts_with(&expected), + stderr.starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, stderr @@ -99,7 +99,7 @@ Error: No such reducer OR procedure `return_perso` for database `{identity}` res A procedure with a similar name exists: `return_person`" ); assert!( - stderr.trim_end().starts_with(&expected), + stderr.starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, stderr @@ -126,7 +126,7 @@ The database has no reducers. The database has no procedures." ); assert!( - stderr.trim_end().starts_with(&expected), + stderr.starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, stderr @@ -204,7 +204,7 @@ Here are some existing procedures: ... (1 procedure not shown)" ); assert!( - stderr.trim_end().starts_with(&expected), + stderr.starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, stderr From 0fe8a1dbe715f15613f6096550ced5fb607c9854 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Tue, 2 Jun 2026 10:36:42 -0700 Subject: [PATCH 7/7] [bfops/ci-backtrace]: review --- crates/smoketests/tests/smoketests/call.rs | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/crates/smoketests/tests/smoketests/call.rs b/crates/smoketests/tests/smoketests/call.rs index af360cf34e6..d9a064ee402 100644 --- a/crates/smoketests/tests/smoketests/call.rs +++ b/crates/smoketests/tests/smoketests/call.rs @@ -41,10 +41,10 @@ Here are some existing procedures: - return_person" ); assert!( - stderr.starts_with(&expected), + stderr.trim().starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, - stderr + stderr.trim() ); // Non-existent procedure @@ -63,10 +63,10 @@ Here are some existing procedures: - return_person" ); assert!( - stderr.starts_with(&expected), + stderr.trim().starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, - stderr + stderr.trim() ); // Similar name to reducer - should suggest similar @@ -81,10 +81,10 @@ Error: No such reducer OR procedure `say_hell` for database `{identity}` resolvi A reducer with a similar name exists: `say_hello`" ); assert!( - stderr.starts_with(&expected), + stderr.trim().starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, - stderr + stderr.trim() ); // Similar name to procedure - should suggest similar @@ -99,10 +99,10 @@ Error: No such reducer OR procedure `return_perso` for database `{identity}` res A procedure with a similar name exists: `return_person`" ); assert!( - stderr.starts_with(&expected), + stderr.trim().starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, - stderr + stderr.trim() ); } @@ -126,10 +126,10 @@ The database has no reducers. The database has no procedures." ); assert!( - stderr.starts_with(&expected), + stderr.trim().starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, - stderr + stderr.trim() ); } @@ -204,9 +204,9 @@ Here are some existing procedures: ... (1 procedure not shown)" ); assert!( - stderr.starts_with(&expected), + stderr.trim().starts_with(&expected), "Expected stderr to start with expected message.\nExpected:\n{}\n\nActual stderr:\n{}", expected, - stderr + stderr.trim() ); }