Re: [libgpiod][PATCH v2 2/2] tests: look for gpio-tools in more places

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2019-03-18 17:10, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bgolaszewski@xxxxxxxxxxxx>
> 
> Currently we only support running the test cases for gpio-tools from
> the top-level source directory. Some users want to install the test
> executable and run the tests from other locations (/bin, /usr/bin or
> custom path).
> 
> This patch makes the test suite look in the source tree path first,
> then check the directory in which the program resides and last iterate
> over all directories in $PATH.
> 
> We only do that once at the beginning and then reuse the path later.
> 
> Cc: Anders Roxell <anders.roxell@xxxxxxxxxx>
> Signed-off-by: Bartosz Golaszewski <bgolaszewski@xxxxxxxxxxxx>
> ---
>  tests/gpiod-test.c | 75 ++++++++++++++++++++++++++++++++++++++--------
>  1 file changed, 62 insertions(+), 13 deletions(-)
> 
> diff --git a/tests/gpiod-test.c b/tests/gpiod-test.c
> index 4c51f4a..9cb9072 100644
> --- a/tests/gpiod-test.c
> +++ b/tests/gpiod-test.c
> @@ -86,6 +86,7 @@ static struct {
>  	pid_t main_pid;
>  	int pipesize;
>  	char *pipebuf;
> +	char *toolpath;
>  } globals;
>  
>  enum {
> @@ -447,18 +448,6 @@ static void gpiotool_proc_dup_fds(int in_fd, int out_fd, int err_fd)
>  	}
>  }
>  
> -static char *gpiotool_proc_get_path(const char *tool)
> -{
> -	char *path, *progpath, *progdir;
> -
> -	progpath = xstrdup(program_invocation_name);
> -	progdir = dirname(progpath);
> -	path = xappend(NULL, "%s/../../tools/%s", progdir, tool);
> -	free(progpath);
> -
> -	return path;
> -}
> -
>  static NORETURN void gpiotool_proc_exec(const char *path, va_list va)
>  {
>  	size_t num_args;
> @@ -545,10 +534,12 @@ void test_tool_run(char *tool, ...)
>  	event_lock();
>  	if (globals.test_ctx.event.running)
>  		die("refusing to fork when the event thread is running");
> +	if (!globals.toolpath)
> +		die("asked to run tests for gpio-tools, but the executables were not found");
>  
>  	gpiotool_proc_make_pipes(in_fds, out_fds, err_fds);
> -	path = gpiotool_proc_get_path(tool);
>  
> +	path = xappend(NULL, "%s/%s", globals.toolpath, tool);
>  	rv = access(path, R_OK | X_OK);
>  	if (rv)
>  		die_perr("unable to execute '%s'", path);
> @@ -768,6 +759,63 @@ static void check_gpio_mockup(void)
>  	msg("gpio-mockup ok");
>  }
>  
> +static void check_tool_path(void)
> +{
> +	/*
> +	 * Let's check gpiodetect only and assume all the other tools are in
> +	 * the same directory.
> +	 */
> +	static const char *const tool = "gpiodetect";
> +
> +	char *progpath, *progdir, *toolpath, *pathenv, *tok;
> +
> +	/* First check if we're running the from the top source directory. */

Nit: Remove the first "the".

> +	progpath = xstrdup(program_invocation_name);
> +	progdir = dirname(progpath);
> +
> +	toolpath = xappend(NULL, "%s/../../tools/%s", progdir, tool);

Shouldn't this be "%s/../tools/%s" instead now when the directory
structure changed ?

I retested it with these two patches and it still works.

Feel free to add my
Reviewed-and-Tested-by: Anders Roxell <anders.roxell@xxxxxxxxxx>

Cheers,
Anders

> +	if (access(toolpath, R_OK | X_OK) == 0) {
> +		free(progpath);
> +		goto out;
> +	}
> +	free(toolpath);
> +
> +	/* Is the tool in the same directory maybe? */
> +	toolpath = xappend(NULL, "%s/%s", progdir, tool);
> +	free(progpath);
> +	if (access(toolpath, R_OK | X_OK) == 0)
> +		goto out;
> +	free(toolpath);
> +
> +	/* Next iterate over directories in $PATH. */
> +	pathenv = getenv("PATH");
> +	if (!pathenv)
> +		return;
> +
> +	progpath = xstrdup(pathenv);
> +	tok = strtok(progpath, ":");
> +	while (tok) {
> +		toolpath = xappend(NULL, "%s/%s", tok, tool);
> +		if (access(toolpath, R_OK) == 0) {
> +			free(progpath);
> +			goto out;
> +		}
> +
> +		free(toolpath);
> +		tok = strtok(NULL, ":");
> +	}
> +
> +	free(progpath);
> +	toolpath = NULL;
> +
> +out:
> +	if (toolpath) {
> +		toolpath = dirname(toolpath);
> +		msg("using gpio-tools from '%s'", toolpath);
> +		globals.toolpath = toolpath;
> +	}
> +}
> +
>  static void load_module(struct _test_chip_descr *descr)
>  {
>  	unsigned int i;
> @@ -1001,6 +1049,7 @@ int main(int argc TEST_UNUSED, char **argv TEST_UNUSED)
>  
>  	check_kernel();
>  	check_gpio_mockup();
> +	check_tool_path();
>  
>  	msg("running tests");
>  
> -- 
> 2.20.1
> 



[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux