From ab367ad49b0723eee06e4b04d297accf56e6bae3 Mon Sep 17 00:00:00 2001 From: Robert Zieba Date: Thu, 15 May 2025 15:03:24 -0600 Subject: [PATCH] ipc/deferred: Add tests --- Cargo.lock | 159 +++++++++++++++++++++++++++ Cargo.toml | 1 + embedded-service/Cargo.toml | 3 +- embedded-service/src/ipc/deferred.rs | 122 ++++++++++++++++++++ supply-chain/audits.toml | 95 ++++++++++++++++ supply-chain/imports.lock | 32 ++++++ 6 files changed, 411 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index aa4bbe76..306fec00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "ahash" version = "0.8.11" @@ -47,6 +62,21 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + [[package]] name = "bare-metal" version = "0.2.5" @@ -684,6 +714,7 @@ dependencies = [ "postcard", "rand_core", "serde", + "tokio", ] [[package]] @@ -822,6 +853,12 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + [[package]] name = "half" version = "2.6.0" @@ -929,6 +966,12 @@ dependencies = [ "either", ] +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + [[package]] name = "litrs" version = "0.4.1" @@ -951,6 +994,12 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + [[package]] name = "mimxrt600-fcb" version = "0.2.2" @@ -986,6 +1035,15 @@ dependencies = [ "vcell", ] +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + [[package]] name = "nb" version = "0.1.3" @@ -1010,6 +1068,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -1138,6 +1205,12 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + [[package]] name = "rustc_version" version = "0.2.3" @@ -1284,6 +1357,28 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio" +version = "1.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +dependencies = [ + "backtrace", + "pin-project-lite", + "tokio-macros", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tps6699x" version = "0.1.0" @@ -1379,6 +1474,70 @@ dependencies = [ "vcell", ] +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "wyz" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index 02094aeb..7e135d86 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,3 +55,4 @@ postcard = "1.*" rand_core = "0.6.4" serde = { version = "1.0.*", default-features = false } tps6699x = { git = "https://github.com/OpenDevicePartnership/tps6699x" } +tokio = { version = "1.42.0" } diff --git a/embedded-service/Cargo.toml b/embedded-service/Cargo.toml index b803025d..6240b715 100644 --- a/embedded-service/Cargo.toml +++ b/embedded-service/Cargo.toml @@ -43,13 +43,14 @@ cortex-m.workspace = true [dev-dependencies] embassy-sync = { workspace = true, features = ["std"] } critical-section = { workspace = true, features = ["std"] } -embassy-futures.workspace = true +tokio = { workspace = true, features = ["rt", "macros", "time"] } embassy-time = { workspace = true, features = ["std"] } embassy-time-driver = { workspace = true } embassy-executor = { workspace = true, features = [ "arch-std", "executor-thread", ] } +embassy-futures.workspace = true [features] default = [] diff --git a/embedded-service/src/ipc/deferred.rs b/embedded-service/src/ipc/deferred.rs index 4351d321..894097ad 100644 --- a/embedded-service/src/ipc/deferred.rs +++ b/embedded-service/src/ipc/deferred.rs @@ -97,3 +97,125 @@ impl Request<'_, M, C, R> { self.channel.response.signal((response, self.request_id)); } } + +#[cfg(test)] +mod tests { + use super::*; + use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; + use embassy_sync::once_lock::OnceLock; + use tokio::time::Duration; + + #[test] + fn test_autoincrement() { + let channel = Channel::::new(); + for i in 0..100 { + let id = channel.get_next_request_id(); + assert_eq!(id.0, i); + } + } + + /// Mock commands + #[derive(Debug)] + enum Command { + A, + B, + C, + } + + /// Mock responses + #[derive(Debug, PartialEq)] + enum Response { + A, + B, + C, + } + + /// Mock command handler + struct Handler { + channel: Channel, + } + + impl Handler { + /// Create a new handler + fn new() -> Self { + Self { + channel: Channel::new(), + } + } + + /// Process a command and return a response + async fn process_request(&self, request: &Command) -> Response { + match request { + Command::A => Response::A, + Command::B => Response::B, + Command::C => { + // Request that takes a while to finish + tokio::time::sleep(Duration::from_millis(1000)).await; + Response::C + } + } + } + + /// Send command A + async fn send_a(&self) -> Response { + self.channel.execute(Command::A).await + } + + /// Invoke command B + async fn send_b(&self) -> Response { + self.channel.execute(Command::B).await + } + + /// Invoke command C + async fn send_c(&self) -> Response { + self.channel.execute(Command::C).await + } + + /// Main processing task + async fn process(&self) { + loop { + let request = self.channel.receive().await; + let response = self.process_request(&request.command).await; + request.respond(response); + } + } + } + + /// Task that executes command C followed by command A + async fn task_0(handler: &'static Handler) { + let response = tokio::time::timeout(Duration::from_millis(250), handler.send_c()).await; + // Tokio's timeout error value has a private constructor so is_err is the best we can do + assert!(response.is_err()); + + let response = handler.send_a().await; + assert_eq!(response, Response::A); + } + + /// Task that executes command B + async fn task_1(handler: &'static Handler) { + let response = handler.send_b().await; + assert_eq!(response, Response::B); + } + + /// Task that handles device commands + async fn handler_task(handler: &'static Handler) { + loop { + handler.process().await; + } + } + + /// Test the command execution and response handling + #[tokio::test] + async fn test_send_receive() { + static DEVICE: OnceLock = OnceLock::new(); + + let device = DEVICE.get_or_init(Handler::new); + let _handler = tokio::spawn(handler_task(device)); + let handle_0 = tokio::spawn(task_0(device)); + let handle_1 = tokio::spawn(task_1(device)); + + // Wait for invokers to finish + handle_0.await.unwrap(); + handle_1.await.unwrap(); + } +} diff --git a/supply-chain/audits.toml b/supply-chain/audits.toml index 371a4e64..336daa5c 100644 --- a/supply-chain/audits.toml +++ b/supply-chain/audits.toml @@ -1,6 +1,16 @@ # cargo-vet audits file +[[audits.addr2line]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.24.2" + +[[audits.backtrace]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.3.75" + [[audits.embedded-batteries]] who = "Felipe Balbi " criteria = "safe-to-deploy" @@ -27,6 +37,11 @@ version = "0.1.0@git:410e2482d54b58c205a425c70d2ccf062e3ee3f3" importable = false notes = "ODP crates are always trusted." +[[audits.gimli]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.31.1" + [[audits.half]] who = "Robert Zieba " criteria = "safe-to-deploy" @@ -39,6 +54,16 @@ criteria = "safe-to-deploy" version = "0.11.0" notes = "Used as a dependency for embassy-imxrt." +[[audits.libc]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.2.172" + +[[audits.memchr]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "2.7.4" + [[audits.mimxrt633s-pac]] who = "Robert Zieba " criteria = "safe-to-deploy" @@ -49,6 +74,76 @@ who = "Robert Zieba " criteria = "safe-to-deploy" version = "0.4.1" +[[audits.miniz_oxide]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.8.8" + +[[audits.object]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.36.7" + +[[audits.tokio]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "1.45.0" + +[[audits.tokio-macros]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "2.5.0" + +[[audits.windows-targets]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.52.6" + +[[audits.windows_aarch64_gnullvm]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.52.6" + +[[audits.windows_aarch64_msvc]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.52.6" + +[[audits.windows_i686_gnu]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.52.0" + +[[audits.windows_i686_gnu]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.52.6" + +[[audits.windows_i686_gnullvm]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.52.6" + +[[audits.windows_i686_msvc]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.52.6" + +[[audits.windows_x86_64_gnu]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.52.6" + +[[audits.windows_x86_64_gnullvm]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.52.6" + +[[audits.windows_x86_64_msvc]] +who = "Robert Zieba " +criteria = "safe-to-run" +version = "0.52.6" + [[trusted.anyhow]] criteria = "safe-to-deploy" user-id = 3618 # David Tolnay (dtolnay) diff --git a/supply-chain/imports.lock b/supply-chain/imports.lock index a142f993..e4794f24 100644 --- a/supply-chain/imports.lock +++ b/supply-chain/imports.lock @@ -24,6 +24,21 @@ user-name = "Manish Goregaokar" [audits.OpenDevicePartnership.audits] +[[audits.google.audits.adler2]] +who = "Lukasz Anforowicz " +criteria = "safe-to-deploy" +version = "2.0.0" +notes = ''' +This audit has been reviewed in https://crrev.com/c/5811890 + +The crate is fairly easy to read thanks to its small size and rich comments. + +I've grepped for `-i cipher`, `-i crypto`, `\bfs\b`, `\bnet\b`, and +`\bunsafe\b`. There were no hits (except for a comment in `README.md` +and `lib.rs` pointing out "Zero `unsafe`"). +''' +aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT" + [[audits.google.audits.autocfg]] who = "Manish Goregaokar " criteria = "safe-to-deploy" @@ -277,6 +292,23 @@ For more detailed unsafe review notes please see https://crrev.com/c/6362797 """ aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT" +[[audits.google.audits.rustc-demangle]] +who = "danakj@chromium.org" +criteria = "safe-to-run" +version = "0.1.23" +notes = """ +Reviewed in https://crrev.com/c/5171063 + +Previously reviewed during security review and the audit is grandparented in. +""" +aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT" + +[[audits.google.audits.rustc-demangle]] +who = "danakj " +criteria = "safe-to-run" +delta = "0.1.23 -> 0.1.24" +aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT" + [[audits.google.audits.serde]] who = "Lukasz Anforowicz " criteria = "safe-to-deploy"