[FFmpeg-devel] [PATCH] avutil/tests: Improved code coverage for random_seed
Hendrik Leppkes
h.leppkes at gmail.com
Wed Dec 28 21:36:06 EET 2016
On Wed, Dec 28, 2016 at 8:05 PM, Hendrik Leppkes <h.leppkes at gmail.com> wrote:
> On Wed, Dec 28, 2016 at 7:57 PM, Michael Niedermayer
> <michael at niedermayer.cc> wrote:
>> On Wed, Dec 28, 2016 at 07:12:25PM +0100, Hendrik Leppkes wrote:
>>> On Wed, Dec 28, 2016 at 7:08 PM, Hendrik Leppkes <h.leppkes at gmail.com> wrote:
>>> > On Fri, Dec 23, 2016 at 1:12 AM, Thomas Turner <thomastdt at googlemail.com> wrote:
>>> >> Signed-off-by: Thomas Turner <thomastdt at googlemail.com>
>>> >> ---
>>> >> libavutil/tests/random_seed.c | 34 +++++++++++++++++++++-------------
>>> >> tests/ref/fate/random_seed | 1 +
>>> >> 2 files changed, 22 insertions(+), 13 deletions(-)
>>> >>
>>> >> diff --git a/libavutil/tests/random_seed.c b/libavutil/tests/random_seed.c
>>> >> index ebe9b3e..fcd68bc 100644
>>> >> --- a/libavutil/tests/random_seed.c
>>> >> +++ b/libavutil/tests/random_seed.c
>>> >> @@ -23,24 +23,32 @@
>>> >>
>>> >> #undef printf
>>> >> #define N 256
>>> >> +#define F 2
>>> >> #include <stdio.h>
>>> >>
>>> >> +typedef uint32_t (*random_seed_ptr_t)(void);
>>> >> +
>>> >> int main(void)
>>> >> {
>>> >> - int i, j, retry;
>>> >> + int i, j, rsf, retry;
>>> >> uint32_t seeds[N];
>>> >> + random_seed_ptr_t random_seed[F] = {av_get_random_seed, get_generic_seed};
>>> >>
>>> >> - for (retry=0; retry<3; retry++){
>>> >> - for (i=0; i<N; i++){
>>> >> - seeds[i] = av_get_random_seed();
>>> >> - for (j=0; j<i; j++)
>>> >> - if (seeds[j] == seeds[i])
>>> >> - goto retry;
>>> >> + for (rsf=0; rsf<F; ++rsf){
>>> >> + for (retry=0; retry<3; retry++){
>>> >> + for (i=0; i<N; i++){
>>> >> + seeds[i] = random_seed[rsf]();
>>> >> + for (j=0; j<i; j++)
>>> >> + if (seeds[j] == seeds[i])
>>> >> + goto retry;
>>> >> + }
>>> >> + printf("seeds OK\n");
>>> >> + goto next;
>>> >> + retry:;
>>> >> }
>>> >> - printf("seeds OK\n");
>>> >> - return 0;
>>> >> - retry:;
>>> >> + printf("rsf %d: FAIL at %d with %X\n", rsf, j, seeds[j]);
>>> >> + return 1;
>>> >> + next:;
>>> >> }
>>> >> - printf("FAIL at %d with %X\n", j, seeds[j]);
>>> >> - return 1;
>>> >> -}
>>> >> + return 0;
>>> >> + }
>>> >> \ No newline at end of file
>>> >> diff --git a/tests/ref/fate/random_seed b/tests/ref/fate/random_seed
>>> >> index 2b5b3af..ef0eef2 100644
>>> >> --- a/tests/ref/fate/random_seed
>>> >> +++ b/tests/ref/fate/random_seed
>>> >> @@ -1 +1,2 @@
>>> >> seeds OK
>>> >> +seeds OK
>>> >> --
>>> >> 1.9.1
>>> >
>>> > The new test sporadically fails on msvc x86_64 for some reason. What
>>> > does it actually mean when it fails, ie. what does this thing test?
>>> >
>>>
>>> Specifically, it always fails with rsf 1, which seems to be
>>> get_generic_seed - but windows has a special crypto seed provider,
>>> get_generic_seed is never used. Making fate fail for some inaccuracy
>>> in the clock in code thats never used is a bit annoying.
>>
>> Thats like saying that as long as asm works it doesnt matter if the C
>> code doesnt work.
>
> get_generic_seed is literally dead code in such a build, so its not
> the same thing. Which platforms do even realistically use it at all?
> On top of that, its behavior depends on platform specifics, ie. the
> behavior of the clock function.
>
>>
>> get_generic_seed() should work on any platform, ideally.
>> why does it fail on windows ?
>> can you take a look, its probably not very hard to improve it, the
>> function is also quite short.
>>
>
> I do not have the time right now to debug random sporadic failures,
> since I'm going out of country in a few days for a couple weeks.
> The MSDN documents the clock function as follows:
>
> The clock function tells how much wall-clock time the calling process
> has used. Note that this is not strictly conformant with ISO C99,
> which specifies net CPU time as the return value. To obtain CPU time,
> use the Win32 GetProcessTimes function.
>
> So if the function is super fast, its certainly possible the values
> just don't increment, since its wall-clock based. But its generally
> not a problem, since its just never used.
>
What I forgot to add, CLOCKS_PER_SEC is also only 1000, so only
millisecond precision, which probably plays into here.
- Hendrik
More information about the ffmpeg-devel
mailing list