[ovs-dev] [random 2/2] random: Add entropy test.
Justin Pettit
jpettit at nicira.com
Sat Nov 13 02:31:13 UTC 2010
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