[Libguestfs] [PATCH libnbd v2] tests: Add a test of nbd_{set, get}_socket_activation_name

Laszlo Ersek lersek at redhat.com
Tue May 9 13:13:37 UTC 2023


On 5/9/23 11:48, Richard W.M. Jones wrote:
> Also test that the expected environment variable is set when
> connecting to nbdkit.
> 
> This test requires nbdkit >= 1.35.2 which added support for -D
> nbdkit.environ=1 to dump the environment, and will be skipped with
> other versions.
> ---
>  .gitignore                     |   1 +
>  tests/Makefile.am              |   8 +++
>  tests/socket-activation-name.c | 122 +++++++++++++++++++++++++++++++++
>  3 files changed, 131 insertions(+)
> 
> diff --git a/.gitignore b/.gitignore
> index df4b6ca249..fe7feffa5b 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -254,6 +254,7 @@ Makefile.in
>  /tests/read-write-flag
>  /tests/server-death
>  /tests/shutdown-flags
> +/tests/socket-activation-name
>  /tests/synch-parallel
>  /tests/synch-parallel-tls
>  /ublk/nbdublk
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index 81a7db38f6..3a93251efe 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -231,6 +231,7 @@ check_PROGRAMS += \
>  	meta-base-allocation \
>  	closure-lifetimes \
>  	pread-initialize \
> +	socket-activation-name \
>  	$(NULL)
>  
>  TESTS += \
> @@ -301,6 +302,7 @@ TESTS += \
>  	meta-base-allocation \
>  	closure-lifetimes \
>  	pread-initialize \
> +	socket-activation-name \
>  	$(NULL)
>  
>  # This test is compiled but not run because it requires a fixed port:
> @@ -642,6 +644,12 @@ closure_lifetimes_LDADD = $(top_builddir)/lib/libnbd.la
>  pread_initialize_SOURCES = pread-initialize.c
>  pread_initialize_LDADD = $(top_builddir)/lib/libnbd.la
>  
> +socket_activation_name_SOURCES = \
> +	socket-activation-name.c \
> +	requires.c \
> +	requires.h
> +socket_activation_name_LDADD = $(top_builddir)/lib/libnbd.la
> +
>  #----------------------------------------------------------------------
>  # Testing TLS support.
>  
> diff --git a/tests/socket-activation-name.c b/tests/socket-activation-name.c
> new file mode 100644
> index 0000000000..66da654f13
> --- /dev/null
> +++ b/tests/socket-activation-name.c
> @@ -0,0 +1,122 @@
> +/* NBD client library in userspace
> + * 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
> + */
> +
> +/* Test nbd_{set,get}_socket_activation_name API. */
> +
> +#undef NDEBUG
> +
> +#include <config.h>
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <errno.h>
> +#include <unistd.h>
> +#include <assert.h>
> +
> +#include <libnbd.h>
> +
> +#include "requires.h"
> +
> +#define DEBUG_FILE "socket-activation-name.out"
> +
> +int
> +main (int argc, char *argv[])
> +{
> +  struct nbd_handle *nbd;
> +  char *r;
> +
> +  /* Test that this version of nbdkit supports -D nbdkit.environ=1
> +   * added in nbdkit 1.35.2.
> +   *
> +   * As a side-effect, also checks we have nbdkit, the null plugin and
> +   * a working grep command, all needed below.
> +   */
> +  requires ("libnbd_sentinel=42 "
> +            "nbdkit -v -D nbdkit.environ=1 null --run true 2>&1 | "
> +            "grep -sq 'debug.*libnbd_sentinel=42'");
> +
> +  nbd = nbd_create ();
> +  if (nbd == NULL) {
> +    fprintf (stderr, "%s\n", nbd_get_error ());
> +    exit (EXIT_FAILURE);
> +  }
> +
> +  /* Check firstly that it defaults to empty string. */
> +  r = nbd_get_socket_activation_name (nbd);
> +  assert (r != NULL);
> +  assert (strcmp (r, "") == 0);
> +  free (r);
> +
> +  /* Run external nbdkit and check the LISTEN_FDNAMES environment
> +   * variable is set to "unknown".  We need to capture the debug
> +   * output of nbdkit, hence the journey through the shell.
> +   */
> +  unlink (DEBUG_FILE);
> +  char *cmd[] = {
> +    "sh", "-c",
> +    "exec 2> " DEBUG_FILE "\n"
> +    "exec nbdkit --exit-with-parent -v -D nbdkit.environ=1 null 1024\n",
> +    NULL
> +  };
> +  if (nbd_connect_systemd_socket_activation (nbd, cmd) == -1) {
> +    fprintf (stderr, "%s\n", nbd_get_error ());
> +    exit (EXIT_FAILURE);
> +  }
> +
> +  /* Check the size is expected so we know we managed to connect to nbdkit. */
> +  assert (nbd_get_size (nbd) == 1024);
> +
> +  nbd_close (nbd);
> +
> +  /* nbdkit doesn't know anything about socket activation names, but
> +   * the LISTEN_FDNAMES environment variable should appear in the
> +   * debug output.
> +   */
> +  assert (system ("grep 'debug.*LISTEN_FDNAMES=unknown' " DEBUG_FILE) == 0);
> +  unlink (DEBUG_FILE);
> +
> +  /* Test again with a specific name. */
> +  nbd = nbd_create ();
> +  if (nbd == NULL) {
> +    fprintf (stderr, "%s\n", nbd_get_error ());
> +    exit (EXIT_FAILURE);
> +  }
> +  /* Check we can set it to something and read that back. */
> +  assert (nbd_set_socket_activation_name (nbd, "hello") == 0);
> +  r = nbd_get_socket_activation_name (nbd);
> +  assert (r != NULL);
> +  assert (strcmp (r, "hello") == 0);
> +  free (r);
> +
> +  /* Run external nbdkit again (same command as above). */
> +  if (nbd_connect_systemd_socket_activation (nbd, cmd) == -1) {
> +    fprintf (stderr, "%s\n", nbd_get_error ());
> +    exit (EXIT_FAILURE);
> +  }
> +
> +  assert (nbd_get_size (nbd) == 1024);
> +
> +  nbd_close (nbd);
> +
> +  /* Check LISTEN_FDNAMES was set to the known value. */
> +  assert (system ("grep 'debug.*LISTEN_FDNAMES=hello' " DEBUG_FILE) == 0);
> +  unlink (DEBUG_FILE);
> +
> +  exit (EXIT_SUCCESS);
> +}

There are some paths on which we "leak" DEBUG_FILE in the filesystem --
namely when some of the assertions fail, or when one of the
nbd_connect_systemd_socket_activation() calls fail. However, in those
cases, we might actually want to preserve DEBUG_FILE.

Reviewed-by: Laszlo Ersek <lersek at redhat.com>

Thanks!
Laszlo


More information about the Libguestfs mailing list