[libvirt] [PATCH] tests: Set PATH in each test
Michal Privoznik
mprivozn at redhat.com
Fri Mar 18 10:44:51 UTC 2016
On 18.03.2016 10:42, Ján Tomko wrote:
> On Thu, Mar 17, 2016 at 02:31:49PM +0100, Michal Privoznik wrote:
>> Currently we spawn couple of binaries in our test suite.
>> Moreover, we provide some spoofed versions of system binaries
>> hoping that those will be executed instead of the system ones.
>> For instance, for testing SSH socket we have written our own ssh
>> binary for producing predictable results. We certainly don't want
>> to execute the system ssh binary.
>> However, in order to prefer our binaries over system ones, we
>> need to set PATH environment variable. But this is done only at
>> the Makefile level. So if anybody runs a test by hand that
>> expects our spoofed binary, the test ends up executing real
>> system binaries. This is not good. In fact, it's terribly wrong.
>
> What a tragedy!
>
>> The fix lies in a small trick - putting our build directory at
>> the beginning of the PATH environment variable in each test.
>> Hopefully, since every test has this VIRT_TEST_MAIN* wrapper, we
>> can fix this at a single place.
>> Moreover, while this removes setting PATH for our tests written
>> in bash, it's safe as we are not calling anything ours that would
>> require PATH change there.
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>> tests/Makefile.am | 3 ---
>> tests/testutils.c | 21 ++++++++++++++++++++-
>> 2 files changed, 20 insertions(+), 4 deletions(-)
>
> ACK
>
>> diff --git a/tests/Makefile.am b/tests/Makefile.am
>> index 90981dc..74f7f5a 100644
>> --- a/tests/Makefile.am
>> +++ b/tests/Makefile.am
>> @@ -462,8 +462,6 @@ TESTS = $(test_programs) \
>> # intermediate shell variable, but must do all the expansion in make
>>
>> lv_abs_top_builddir=$(shell cd '$(top_builddir)' && pwd)
>> -path_add = $(subst :,$(PATH_SEPARATOR),\
>> - $(subst !,$(lv_abs_top_builddir)/,!daemon:!tools:!tests))
>>
>> VIR_TEST_EXPENSIVE ?= $(VIR_TEST_EXPENSIVE_DEFAULT)
>> TESTS_ENVIRONMENT = \
>> @@ -472,7 +470,6 @@ TESTS_ENVIRONMENT = \
>> abs_builddir=$(abs_builddir) \
>> abs_srcdir=$(abs_srcdir) \
>> CONFIG_HEADER="$(lv_abs_top_builddir)/config.h" \
>> - PATH="$(path_add)$(PATH_SEPARATOR)$$PATH" \
>> SHELL="$(SHELL)" \
>> LIBVIRT_DRIVER_DIR="$(lv_abs_top_builddir)/src/.libs" \
>> LIBVIRT_AUTOSTART=0 \
>> diff --git a/tests/testutils.c b/tests/testutils.c
>> index 88c4d4b..9211b94 100644
>> --- a/tests/testutils.c
>> +++ b/tests/testutils.c
>> @@ -806,6 +806,24 @@ virTestGetRegenerate(void)
>> return testRegenerate;
>> }
>>
>> +static int
>> +virTestSetEnvPath(void)
>> +{
>> + int ret = -1;
>> + const char *path = getenv("PATH");
>> + char *new_path = NULL;
>> +
>> + if (strstr(path, abs_builddir) != path &&
>
> Is the strstr call really necessary?
>
> I would rather prepend it unconditionally.
Well, it's not necessary now, but it will be later. Thing is, if a
program would re-exec itself, the path would be there twice.
>
>> + (virAsprintf(&new_path, "%s:%s", abs_builddir, path) < 0 ||
>> + setenv("PATH", new_path, 1) < 0))
>> + goto cleanup;
>> +
>> + ret = 0;
>> + cleanup:
>> + VIR_FREE(new_path);
>> + return ret;
>> +}
>> +
>> int virtTestMain(int argc,
>> char **argv,
>> int (*func)(void))
>> @@ -818,7 +836,8 @@ int virtTestMain(int argc,
>>
>> virFileActivateDirOverride(argv[0]);
>>
>> - if (!virFileExists(abs_srcdir))
>> + if (virTestSetEnvPath() < 0 ||
>
> These are not related, both deserve their separate ifs.
>
Okay.
Pushed. Thanks.
Michal
More information about the libvir-list
mailing list