On Tue, Jun 20, 2023 at 09:31:37AM +0000, Tage Johansson wrote: > From: Tage Johansson <frans.t...@gmail.com> > > --- > rust/Cargo.toml | 3 + > rust/tests/test_100_handle.rs | 25 ++++++++ > rust/tests/test_110_defaults.rs | 33 ++++++++++ > rust/tests/test_120_set_non_defaults.rs | 56 +++++++++++++++++ > rust/tests/test_130_private_data.rs | 28 +++++++++ > rust/tests/test_140_explicit_close.rs | 31 +++++++++ > rust/tests/test_log/mod.rs | 84 +++++++++++++++++++++++++ > 7 files changed, 260 insertions(+) > > diff --git a/rust/Cargo.toml b/rust/Cargo.toml > index f4fe8fb..d51c6cb 100644 > --- a/rust/Cargo.toml > +++ b/rust/Cargo.toml > @@ -46,3 +46,6 @@ log = { version = "0.4.19", optional = true } > > [features] > default = ["log"] > + > +[dev-dependencies] > +once_cell = "1.18.0" > diff --git a/rust/tests/test_100_handle.rs b/rust/tests/test_100_handle.rs > new file mode 100644 > index 0000000..d850466 > --- /dev/null > +++ b/rust/tests/test_100_handle.rs > @@ -0,0 +1,25 @@ > +// libnbd Rust test case > +// Copyright Red Hat > +// > +// This library is free software; you can redistribute it and/or > +// modify it under the terms of the GNU Lesser General Public > +// License as published by the Free Software Foundation; either > +// version 2 of the License, or (at your option) any later version. > +// > +// This library is distributed in the hope that it will be useful, > +// but WITHOUT ANY WARRANTY; without even the implied warranty of > +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > +// Lesser General Public License for more details. > +// > +// You should have received a copy of the GNU Lesser General Public > +// License along with this library; if not, write to the Free Software > +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA > + > +//! Just check that we can link with libnbd and create a handle. > + > +#![deny(warnings)] > + > +#[test] > +fn test_nbd_handle_new() { > + let _ = libnbd::NbdHandle::new().unwrap(); > +} > diff --git a/rust/tests/test_110_defaults.rs b/rust/tests/test_110_defaults.rs > new file mode 100644 > index 0000000..bcfab92 > --- /dev/null > +++ b/rust/tests/test_110_defaults.rs > @@ -0,0 +1,33 @@ > +// libnbd Rust test case > +// Copyright Red Hat > +// > +// This library is free software; you can redistribute it and/or > +// modify it under the terms of the GNU Lesser General Public > +// License as published by the Free Software Foundation; either > +// version 2 of the License, or (at your option) any later version. > +// > +// This library is distributed in the hope that it will be useful, > +// but WITHOUT ANY WARRANTY; without even the implied warranty of > +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > +// Lesser General Public License for more details. > +// > +// You should have received a copy of the GNU Lesser General Public > +// License along with this library; if not, write to the Free Software > +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA > + > +#![deny(warnings)] > + > +#[test] > +fn test_defaults() { > + let mut nbd = libnbd::NbdHandle::new().unwrap(); > + > + assert!(nbd.get_export_name().unwrap().to_str().unwrap().is_empty()); > + assert!(!nbd.get_full_info().unwrap()); > + assert_eq!(nbd.get_tls(), libnbd::Tls::Disable); > + assert!(nbd.get_request_structured_replies()); > + assert!(nbd.get_request_meta_context().unwrap()); > + assert!(nbd.get_request_block_size().unwrap()); > + assert!(nbd.get_pread_initialize()); > + assert!(nbd.get_handshake_flags().is_all()); > + assert!(!nbd.get_opt_mode()); > +} > diff --git a/rust/tests/test_120_set_non_defaults.rs > b/rust/tests/test_120_set_non_defaults.rs > new file mode 100644 > index 0000000..e46d088 > --- /dev/null > +++ b/rust/tests/test_120_set_non_defaults.rs > @@ -0,0 +1,56 @@ > +// libnbd Rust test case > +// Copyright Red Hat > +// > +// This library is free software; you can redistribute it and/or > +// modify it under the terms of the GNU Lesser General Public > +// License as published by the Free Software Foundation; either > +// version 2 of the License, or (at your option) any later version. > +// > +// This library is distributed in the hope that it will be useful, > +// but WITHOUT ANY WARRANTY; without even the implied warranty of > +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > +// Lesser General Public License for more details. > +// > +// You should have received a copy of the GNU Lesser General Public > +// License along with this library; if not, write to the Free Software > +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA > + > +#![deny(warnings)] > + > +use std::ffi::CString; > + > +#[test] > +fn test_set_non_defaults() { > + let mut nbd = libnbd::NbdHandle::new().unwrap(); > + > + let name = CString::new("name").unwrap(); > + nbd.set_export_name(&name).unwrap(); > + assert_eq!(nbd.get_export_name().unwrap(), name); > + > + nbd.set_full_info(true).unwrap(); > + assert!(nbd.get_full_info().unwrap()); > + > + if nbd.supports_tls() { > + nbd.set_tls(libnbd::Tls::Allow).unwrap(); > + assert_eq!(nbd.get_tls(), libnbd::Tls::Allow); > + } > + > + nbd.set_request_structured_replies(false).unwrap(); > + assert!(!nbd.get_request_structured_replies()); > + > + nbd.set_request_meta_context(false).unwrap(); > + assert!(!nbd.get_request_meta_context().unwrap()); > + > + nbd.set_request_block_size(false).unwrap(); > + assert!(!nbd.get_request_block_size().unwrap()); > + > + nbd.set_pread_initialize(false).unwrap(); > + assert!(!nbd.get_pread_initialize()); > + > + nbd.set_handshake_flags(libnbd::HandshakeFlag::empty()) > + .unwrap(); > + assert!(nbd.get_handshake_flags().is_empty()); > + > + nbd.set_opt_mode(true).unwrap(); > + assert!(nbd.get_opt_mode()); > +} > diff --git a/rust/tests/test_130_private_data.rs > b/rust/tests/test_130_private_data.rs > new file mode 100644 > index 0000000..719bdcc > --- /dev/null > +++ b/rust/tests/test_130_private_data.rs > @@ -0,0 +1,28 @@ > +// libnbd Rust test case > +// Copyright Red Hat > +// > +// This library is free software; you can redistribute it and/or > +// modify it under the terms of the GNU Lesser General Public > +// License as published by the Free Software Foundation; either > +// version 2 of the License, or (at your option) any later version. > +// > +// This library is distributed in the hope that it will be useful, > +// but WITHOUT ANY WARRANTY; without even the implied warranty of > +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > +// Lesser General Public License for more details. > +// > +// You should have received a copy of the GNU Lesser General Public > +// License along with this library; if not, write to the Free Software > +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA > + > +#![deny(warnings)] > + > +#[test] > +fn test_private_data() { > + let mut nbd = libnbd::NbdHandle::new().unwrap(); > + > + assert_eq!(nbd.get_private_data(), 0); > + assert_eq!(nbd.set_private_data(42), 0); > + assert_eq!(nbd.set_private_data(314), 42); > + assert_eq!(nbd.get_private_data(), 314); > +} > diff --git a/rust/tests/test_140_explicit_close.rs > b/rust/tests/test_140_explicit_close.rs > new file mode 100644 > index 0000000..cf5002a > --- /dev/null > +++ b/rust/tests/test_140_explicit_close.rs > @@ -0,0 +1,31 @@ > +// libnbd Rust test case > +// Copyright Red Hat > +// > +// This library is free software; you can redistribute it and/or > +// modify it under the terms of the GNU Lesser General Public > +// License as published by the Free Software Foundation; either > +// version 2 of the License, or (at your option) any later version. > +// > +// This library is distributed in the hope that it will be useful, > +// but WITHOUT ANY WARRANTY; without even the implied warranty of > +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > +// Lesser General Public License for more details. > +// > +// You should have received a copy of the GNU Lesser General Public > +// License along with this library; if not, write to the Free Software > +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA > + > +#![deny(warnings)] > + > +mod test_log; > + > +use test_log::DEBUG_LOGGER; > + > +#[test] > +fn test_private_data() { > + DEBUG_LOGGER.init(); > + > + let nbd = libnbd::NbdHandle::new().unwrap(); > + drop(nbd); > + assert!(DEBUG_LOGGER.contains("closing handle")); > +} > diff --git a/rust/tests/test_log/mod.rs b/rust/tests/test_log/mod.rs > new file mode 100644 > index 0000000..d34a149 > --- /dev/null > +++ b/rust/tests/test_log/mod.rs > @@ -0,0 +1,84 @@ > +// libnbd Rust test case > +// Copyright Red Hat > +// > +// This library is free software; you can redistribute it and/or > +// modify it under the terms of the GNU Lesser General Public > +// License as published by the Free Software Foundation; either > +// version 2 of the License, or (at your option) any later version. > +// > +// This library is distributed in the hope that it will be useful, > +// but WITHOUT ANY WARRANTY; without even the implied warranty of > +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > +// Lesser General Public License for more details. > +// > +// You should have received a copy of the GNU Lesser General Public > +// License along with this library; if not, write to the Free Software > +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA > + > +//! This module provides facilities for capturing log output and asserting > that it does or does not > +//! contain certain messages. The primary use of this module is to assert > that certain libnbd > +//! operations are or are not performed. > + > +#![allow(unused)] > + > +use once_cell::sync::Lazy; > +use std::collections::HashSet; > +use std::sync::Mutex; > + > +/// Logger that stores all debug messages in a list. > +pub struct DebugLogger { > + /// All messages logged. Wrapped in a mutex so that it can be updated > with an imutable > + /// reference to self. > + messages: Mutex<HashSet<String>>, > + is_initialized: Mutex<bool>, > +} > + > +impl DebugLogger { > + fn new() -> Self { > + Self { > + messages: Mutex::new(HashSet::new()), > + is_initialized: Mutex::new(false), > + } > + } > + > + /// Set this logger as the global logger. > + pub fn init(&'static self) { > + let mut is_initialized = self.is_initialized.lock().unwrap(); > + if !*is_initialized { > + log::set_logger(self).unwrap(); > + log::set_max_level(log::LevelFilter::Debug); > + *is_initialized = true; > + } > + } > + > + /// Check wether a specific message has been logged. > + pub fn contains(&self, msg: &str) -> bool { > + self.messages.lock().unwrap().contains(msg) > + } > + > + /// Print all logged messages, in no particular order. > + /// > + /// Only for debug purposes. Remember to run cargo test with the `-- > --nocapture` arguments. > + /// That is, from the rust directory run: `./../run cargo test -- > --nocapture` > + pub fn print_messages(&self) { > + dbg!(&*self.messages.lock().unwrap()); > + } > +} > + > +/// A static global `DebugLogger`. Just call `.init()` on this to set it as > the global logger. > +pub static DEBUG_LOGGER: Lazy<DebugLogger> = Lazy::new(DebugLogger::new); > + > +impl log::Log for DebugLogger { > + fn enabled(&self, metadata: &log::Metadata<'_>) -> bool { > + metadata.level() == log::Level::Debug > + } > + > + fn log(&self, record: &log::Record<'_>) { > + self.messages > + .lock() > + .unwrap() > + .insert(record.args().to_string()); > + } > + > + fn flush(&self) {} > +}
Acked-by: Richard W.M. Jones <rj...@redhat.com> ... but please fix the formatting to keep everything within 80 columns. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://libguestfs.org _______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://listman.redhat.com/mailman/listinfo/libguestfs