Dear Community,
> This commit adds test to check if getrusage works correctly. As the
> first check - if the wrong 'who' parameter causes errno set to EINVAL.
>
> Next for the ru_{us}time.tv_usec fields it is checked if they are in
> microseconds range.
>
> The last check is to perform busy wait loop for 10ms and afterwards
> assess if ru_{us}time.tv_sec are not smaller than values read on the
> test start.
>
> Changes for v2:
> - Add check for EINVAL return value
> - Check if getrusage ru_{su}time.tv_usec are in correct microseconds
> range
> - Busy wait for 10ms and then compare getrusage system and user times
> (in seconds) if they are equal or larger than previous ones
Gentle ping on this patch. Are there any more comments?
> ---
> resource/Makefile | 2 +-
> resource/tst-getrusage.c | 67
> ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68
> insertions(+), 1 deletion(-) create mode 100644
> resource/tst-getrusage.c
>
> diff --git a/resource/Makefile b/resource/Makefile
> index bd9e716749..e236df3d7c 100644
> --- a/resource/Makefile
> +++ b/resource/Makefile
> @@ -25,6 +25,6 @@ headers := sys/resource.h bits/resource.h
> sys/vlimit.h \ routines := getrlimit setrlimit getrlimit64
> setrlimit64 getrusage ulimit \ vlimit vtimes getpriority
> setpriority nice
> -tests = tst-getrlimit bug-ulimit1
> +tests = tst-getrlimit bug-ulimit1 tst-getrusage
>
> include ../Rules
> diff --git a/resource/tst-getrusage.c b/resource/tst-getrusage.c
> new file mode 100644
> index 0000000000..da721b0613
> --- /dev/null
> +++ b/resource/tst-getrusage.c
> @@ -0,0 +1,67 @@
> +/* Test for getrusage.
> + Copyright (C) 2021 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C 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.1 of the License, or (at your option) any later version.
> +
> + The GNU C 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 the GNU C Library; if not, see
> + . */
> +
> +#include
> +#include
> +#include
> +#include
> +#include
> +
> +static int
> +do_test (void)
> +{
> + struct timespec tv_then, tv_now, r;
> + struct rusage ru, ru_then;
> + int ret;
> +
> + /* Check for invalid 'who' parameter. */
> + ret = getrusage (-100, &ru);
> + if (! (ret == -1 && errno == EINVAL))
> + FAIL_EXIT1 ("getrusage failed - EINVAL expected\n");
> +
> + /* Check if ru_stime.tv_usec and ru_utime.tv_usec are correct. */
> + ret = getrusage (RUSAGE_SELF, &ru_then);
> + if (ret == -1)
> + FAIL_EXIT1 ("getrusage failed: %m\n");
> +
> + TEST_VERIFY (ru_then.ru_utime.tv_usec >= 0);
> + TEST_VERIFY (ru_then.ru_utime.tv_usec < 1000000);
> +
> + TEST_VERIFY (ru_then.ru_stime.tv_usec >= 0);
> + TEST_VERIFY (ru_then.ru_stime.tv_usec < 1000000);
> +
> + tv_then = xclock_now (CLOCK_REALTIME);
> + /* Busy wait for 10 miliseconds. */
> + do
> + {
> + tv_now = xclock_now (CLOCK_REALTIME);
> + r = timespec_sub (tv_now, tv_then);
> + }
> + while (r.tv_nsec <= 10000000);
> +
> + ret = getrusage (RUSAGE_SELF, &ru);
> + if (ret == -1)
> + FAIL_EXIT1 ("getrusage failed: %m\n");
> +
> + TEST_VERIFY (ru.ru_utime.tv_sec >= ru_then.ru_utime.tv_sec);
> + TEST_VERIFY (ru.ru_stime.tv_sec >= ru_then.ru_stime.tv_sec);
> +
> + return 0;
> +}
> +
> +#include
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de