[ovs-dev] [random 2/2] random: Add entropy test.

Ben Pfaff blp at nicira.com
Mon Nov 15 17:34:49 UTC 2010


Thanks, I pushed this out.

On Fri, Nov 12, 2010 at 06:31:13PM -0800, Justin Pettit wrote:
> Nice catch.  The series looks good to me.
> 
> --Justin
> 
> 
> On Nov 12, 2010, at 5:06 PM, Ben Pfaff wrote:
> 
> > This test would have made the bug fixed in the previous commit obvious.  It
> > would printed the following:
> > 
> > average=0007c220
> > 
> > bit      0     1
> >  0  5012  4988
> >  1  5019  4981
> >  2  5154  4846
> >  3  4909  5091
> >  4  5011  4989
> >  5  5021  4979
> >  6  4911  5089
> >  7  4910  5090
> >  8  5011  4989
> >  9  5020  4980
> > 10  5154  4846
> > 11  5021  4979
> > 12  5155  4845
> > 13  5019  4981
> > 14  5153  4847
> > 15  5153  4847
> > 16  5153  4847
> > 17  5153  4847
> > 18  5153  4847
> > 19  5152  4848
> > 20 10000     0
> > 21 10000     0
> > 22 10000     0
> > 23 10000     0
> > 24 10000     0
> > 25 10000     0
> > 26 10000     0
> > 27 10000     0
> > 28 10000     0
> > 29 10000     0
> > 30 10000     0
> > 31 10000     0
> > (expected values are 5000)
> > 
> > nibble   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
> >     0 696 646 564 693 542 545 612 611 687 663 645 560 674 566 592 704
> >     1 625 589 597 571 638 623 604 663 670 652 650 557 541 683 686 651
> >     2 628 644 659 672 648 569 585 616 623 647 681 600 586 675 601 566
> >     3 683 665 717 549 633 613 701 592 663 531 545 800 623 608 590 487
> >     4 622 657 777 557 720 608 613 598 657 678 551 654 615 596 598 499
> >     5 10000   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
> >     6 10000   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
> >     7 10000   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
> > (expected values are 625)
> > ---
> > lib/random.c        |    8 +++++
> > lib/random.h        |    4 ++-
> > tests/automake.mk   |    6 ++++
> > tests/library.at    |   52 +++++++++++++++++++++++++++++++++
> > tests/test-random.c |   79 +++++++++++++++++++++++++++++++++++++++++++++++++++
> > 5 files changed, 148 insertions(+), 1 deletions(-)
> > create mode 100644 tests/test-random.c
> > 
> > diff --git a/lib/random.c b/lib/random.c
> > index 7f89251..6b02446 100644
> > --- a/lib/random.c
> > +++ b/lib/random.c
> > @@ -17,6 +17,7 @@
> > #include <config.h>
> > #include "random.h"
> > 
> > +#include <assert.h>
> > #include <errno.h>
> > #include <stdlib.h>
> > #include <sys/time.h>
> > @@ -57,6 +58,13 @@ random_init(void)
> > }
> > 
> > void
> > +random_set_seed(uint32_t seed_)
> > +{
> > +    assert(seed_);
> > +    seed = seed_;
> > +}
> > +
> > +void
> > random_bytes(void *p_, size_t n)
> > {
> >     uint8_t *p = p_;
> > diff --git a/lib/random.h b/lib/random.h
> > index 198adea..c698638 100644
> > --- a/lib/random.h
> > +++ b/lib/random.h
> > @@ -1,5 +1,5 @@
> > /*
> > - * Copyright (c) 2008, 2009 Nicira Networks.
> > + * Copyright (c) 2008, 2009, 2010 Nicira Networks.
> >  *
> >  * Licensed under the Apache License, Version 2.0 (the "License");
> >  * you may not use this file except in compliance with the License.
> > @@ -21,6 +21,8 @@
> > #include <stdint.h>
> > 
> > void random_init(void);
> > +void random_set_seed(uint32_t);
> > +
> > void random_bytes(void *, size_t);
> > uint8_t random_uint8(void);
> > uint16_t random_uint16(void);
> > diff --git a/tests/automake.mk b/tests/automake.mk
> > index 0bac351..8503b6c 100644
> > --- a/tests/automake.mk
> > +++ b/tests/automake.mk
> > @@ -74,6 +74,7 @@ lcov_wrappers = \
> > 	tests/lcov/test-list \
> > 	tests/lcov/test-lockfile \
> > 	tests/lcov/test-ovsdb \
> > +	tests/lcov/test-random \
> > 	tests/lcov/test-reconnect \
> > 	tests/lcov/test-sha1 \
> > 	tests/lcov/test-timeval \
> > @@ -124,6 +125,7 @@ valgrind_wrappers = \
> > 	tests/valgrind/test-list \
> > 	tests/valgrind/test-lockfile \
> > 	tests/valgrind/test-ovsdb \
> > +	tests/valgrind/test-random \
> > 	tests/valgrind/test-reconnect \
> > 	tests/valgrind/test-sha1 \
> > 	tests/valgrind/test-timeval \
> > @@ -216,6 +218,10 @@ noinst_PROGRAMS += tests/test-lockfile
> > tests_test_lockfile_SOURCES = tests/test-lockfile.c
> > tests_test_lockfile_LDADD = lib/libopenvswitch.a
> > 
> > +noinst_PROGRAMS += tests/test-random
> > +tests_test_random_SOURCES = tests/test-random.c
> > +tests_test_random_LDADD = lib/libopenvswitch.a
> > +
> > noinst_PROGRAMS += tests/test-unix-socket
> > tests_test_unix_socket_SOURCES = tests/test-unix-socket.c
> > tests_test_unix_socket_LDADD = lib/libopenvswitch.a
> > diff --git a/tests/library.at b/tests/library.at
> > index cab8e2c..418b279 100644
> > --- a/tests/library.at
> > +++ b/tests/library.at
> > @@ -39,6 +39,58 @@ AT_KEYWORDS([byte order])
> > AT_CHECK([test-byte-order], [0], [ignore])
> > AT_CLEANUP
> > 
> > +AT_SETUP([test random number generator])
> > +AT_CHECK([test-random], [0], [dnl
> > +average=7fa2014f
> > +
> > +bit      0     1
> > +  0  4946  5054
> > +  1  4939  5061
> > +  2  4947  5053
> > +  3  4935  5065
> > +  4  5004  4996
> > +  5  4998  5002
> > +  6  5062  4938
> > +  7  5009  4991
> > +  8  5001  4999
> > +  9  5022  4978
> > + 10  5006  4994
> > + 11  5039  4961
> > + 12  4940  5060
> > + 13  5048  4952
> > + 14  4930  5070
> > + 15  4973  5027
> > + 16  4954  5046
> > + 17  5043  4957
> > + 18  5020  4980
> > + 19  5104  4896
> > + 20  5051  4949
> > + 21  5003  4997
> > + 22  5110  4890
> > + 23  4950  5050
> > + 24  5016  4984
> > + 25  5019  4981
> > + 26  4948  5052
> > + 27  4995  5005
> > + 28  4995  5005
> > + 29  4969  5031
> > + 30  5109  4891
> > + 31  4984  5016
> > +(expected values are 5000)
> > +
> > +nibble   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
> > +     0 640 589 610 613 588 632 650 613 582 646 627 640 612 650 637 671
> > +     1 626 642 663 620 630 609 617 602 615 638 614 644 641 597 598 644
> > +     2 667 611 617 613 609 629 642 651 604 641 594 659 651 610 617 585
> > +     3 621 662 594 605 618 644 616 613 613 616 611 608 614 660 653 652
> > +     4 641 668 621 664 619 624 625 642 624 629 607 566 599 639 618 614
> > +     5 666 629 620 621 581 615 598 620 630 651 671 622 628 603 657 588
> > +     6 620 640 621 606 603 644 628 633 620 597 653 591 637 658 634 615
> > +     7 636 645 679 593 598 609 612 612 623 626 638 669 603 629 606 622
> > +(expected values are 625)
> > +])
> > +AT_CLEANUP
> > +
> > AT_SETUP([test unix socket -- short pathname])
> > AT_CHECK([test-unix-socket x])
> > AT_CLEANUP
> > diff --git a/tests/test-random.c b/tests/test-random.c
> > new file mode 100644
> > index 0000000..9fcc632
> > --- /dev/null
> > +++ b/tests/test-random.c
> > @@ -0,0 +1,79 @@
> > +/*
> > + * Copyright (c) 2008, 2009, 2010 Nicira Networks.
> > + *
> > + * Licensed under the Apache License, Version 2.0 (the "License");
> > + * you may not use this file except in compliance with the License.
> > + * You may obtain a copy of the License at:
> > + *
> > + *     http://www.apache.org/licenses/LICENSE-2.0
> > + *
> > + * Unless required by applicable law or agreed to in writing, software
> > + * distributed under the License is distributed on an "AS IS" BASIS,
> > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> > + * See the License for the specific language governing permissions and
> > + * limitations under the License.
> > + */
> > +
> > +#include <config.h>
> > +
> > +#include "random.h"
> > +
> > +#include <stdio.h>
> > +#include <string.h>
> > +
> > +int
> > +main(void)
> > +{
> > +    enum { N_ROUNDS = 10000 };
> > +    unsigned long long int total;
> > +    int hist16[8][16];
> > +    int hist2[32];
> > +    int i;
> > +
> > +    random_set_seed(1);
> > +
> > +    total = 0;
> > +    memset(hist2, 0, sizeof hist2);
> > +    memset(hist16, 0, sizeof hist16);
> > +    for (i = 0; i < N_ROUNDS; i++) {
> > +        uint32_t x;
> > +        int j;
> > +
> > +        x = random_uint32();
> > +
> > +        total += x;
> > +
> > +        for (j = 0; j < 32; j++) {
> > +            if (x & (1u << j)) {
> > +                hist2[j]++;
> > +            }
> > +        }
> > +
> > +        for (j = 0; j < 8; j++) {
> > +            hist16[j][(x >> (j * 4)) & 15]++;
> > +        }
> > +    }
> > +
> > +    printf("average=%08llx\n", total / N_ROUNDS);
> > +
> > +    printf("\nbit      0     1\n");
> > +    for (i = 0; i < 32; i++) {
> > +        printf("%3d %5d %5d\n", i, N_ROUNDS - hist2[i], hist2[i]);
> > +    }
> > +    printf("(expected values are %d)\n", N_ROUNDS / 2);
> > +
> > +    printf("\nnibble   0   1   2   3   4   5   6   7   8   9  10  11  12  "
> > +           "13  14  15\n");
> > +    for (i = 0; i < 8; i++) {
> > +        int j;
> > +
> > +        printf("%6d", i);
> > +        for (j = 0; j < 16; j++) {
> > +            printf(" %3d", hist16[i][j]);
> > +        }
> > +        printf("\n");
> > +    }
> > +    printf("(expected values are %d)\n", N_ROUNDS / 16);
> > +
> > +    return 0;
> > +}
> > -- 
> > 1.7.1
> > 
> > 
> > _______________________________________________
> > dev mailing list
> > dev at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
> 




More information about the dev mailing list