I fixed based on comments.

I'll send these two patches to this mailing list.

- Fix Handle -> Handle<'a>
- Add events

Regards,
Hiroyuki

2019年8月1日(木) 0:01 Pino Toscano <ptoscano@redhat.com>:
Hi Hiroyuki,

On Tuesday, 30 July 2019 07:51:37 CEST Hiroyuki Katsura wrote:
> This patch includes:
>
> - Event callback handlers
> - Tests related to events(410-430)
> ---

Would it be possible to split the Handle -> Handle<'a> change in an own
small patch? This way it can be documented why it was changed.

> +pub fn event_to_string(events: &[guestfs::Event]) -> Result<String, error::Error> {
> +    let bitmask = events_to_bitmask(events);
> +
> +    let r = unsafe { guestfs_event_to_string(bitmask) };
> +    if r.is_null() {
> +        Err(error::unix_error("event_to_string"))
> +    } else {
> +        let s = unsafe { ffi::CStr::from_ptr(r) };
> +        let s = s.to_str()?.to_string();

These two look like utils::char_ptr_to_string().

> diff --git a/rust/tests/410_close_event.rs b/rust/tests/410_close_event.rs
> new file mode 100644
> index 000000000..308471098
> --- /dev/null
> +++ b/rust/tests/410_close_event.rs
> @@ -0,0 +1,38 @@
> +/* libguestfs Rust bindings
> + * Copyright (C) 2019 Hiroyuki Katsura <hiroyuki.katsura.0513@gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +extern crate guestfs;
> +
> +use std::sync::{Arc, Mutex};
> +
> +#[test]
> +fn close_event() {
> +    let close_invoked = Arc::new(Mutex::new(0));

Maybe a thread-safe Arc is not needed for this test -- it's just a
single-threaded test with just one handle.

> +    {
> +        let mut g = guestfs::Handle::create().expect("create");
> +        g.set_event_callback(
> +            |_, _, _, _| {
> +                let mut data = (&close_invoked).lock().unwrap();
> +                *data += 1;
> +            },
> +            &[guestfs::Event::Close],
> +        )
> +        .unwrap();

Check that the close_invoked count is still 0 before the block ending.

> diff --git a/rust/tests/420_log_messages.rs b/rust/tests/420_log_messages.rs
> new file mode 100644
> index 000000000..1e9627ca7
> --- /dev/null
> +++ b/rust/tests/420_log_messages.rs
> @@ -0,0 +1,60 @@
> +/* libguestfs Rust bindings
> + * Copyright (C) 2019 Hiroyuki Katsura <hiroyuki.katsura.0513@gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +extern crate guestfs;
> +
> +use std::str;
> +use std::sync::{Arc, Mutex};
> +
> +#[test]
> +fn log_messages() {
> +    let close_invoked = Arc::new(Mutex::new(0));

Ditto as in 410_close_event.rs.

> diff --git a/rust/tests/430_progress_messages.rs b/rust/tests/430_progress_messages.rs
> new file mode 100644
> index 000000000..a1d33aff7
> --- /dev/null
> +++ b/rust/tests/430_progress_messages.rs
> @@ -0,0 +1,61 @@
> +/* libguestfs Rust bindings
> + * Copyright (C) 2019 Hiroyuki Katsura <hiroyuki.katsura.0513@gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +extern crate guestfs;
> +
> +use std::default::Default;
> +use std::sync::{Arc, Mutex};
> +
> +#[test]
> +fn progress_messages() {
> +    let callback_invoked = Arc::new(Mutex::new(0));

Ditto as in 410_close_event.rs.

> +    {
> +        let mut g = guestfs::Handle::create().expect("create");
> +        g.add_drive("/dev/null", Default::default()).unwrap();
> +        g.launch().unwrap();
> +
> +        let eh = g
> +            .set_event_callback(
> +                |_, _, _, _| {
> +                    let mut data = (&callback_invoked).lock().unwrap();
> +                    *data += 1;
> +                },
> +                &[guestfs::Event::Progress],
> +            )
> +            .unwrap();
> +        assert_eq!("ok", g.debug("progress", &["5"]).unwrap());
> +        assert!(*(&callback_invoked).lock().unwrap() > 0);
> +
> +        *(&callback_invoked).lock().unwrap() = 0;
> +        g.delete_event_callback(eh).unwrap();
> +        assert_eq!("ok", g.debug("progress", &["5"]).unwrap());
> +        assert_eq!(*(&callback_invoked).lock().unwrap(), 0);
> +
> +        g.set_event_callback(
> +            |_, _, _, _| {
> +                let mut data = (&callback_invoked).lock().unwrap();
> +                *data += 1;
> +            },
> +            &[guestfs::Event::Progress],
> +        )
> +        .unwrap();
> +        assert_eq!("ok", g.debug("progress", &["5"]).unwrap());
> +        assert!(*(&callback_invoked).lock().unwrap() > 0);
> +    }
> +    assert!(*(&callback_invoked).lock().unwrap() > 0);

This assert is not needed, and most probably the whole scope here can
be removed.

--
Pino Toscano