t_randomid.c revision 313498
1/* $NetBSD: t_randomid.c,v 1.5 2015/03/07 09:59:15 isaki Exp $ */
2
3/*-
4 * Copyright (c) 2010 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <atf-c.h>
30
31#include <sys/types.h>
32
33#include <assert.h>
34#include <inttypes.h>
35#include <randomid.h>
36#include <stdio.h>
37#include <string.h>
38
39#define	PERIOD		30000
40
41uint32_t last[65536];
42
43ATF_TC(randomid_basic);
44ATF_TC_HEAD(randomid_basic, tc)
45{
46
47	atf_tc_set_md_var(tc, "descr", "Check randomid(3)");
48}
49
50ATF_TC_BODY(randomid_basic, tc)
51{
52	static randomid_t ctx = NULL;
53	uint32_t lowest, n, diff;
54	uint16_t id;
55
56	memset(last, 0, sizeof(last));
57	ctx = randomid_new(16, (long)3600);
58
59	lowest = UINT32_MAX;
60
61	for (n = 0; n < 100000; n++) {
62		id = randomid(ctx);
63
64		if (last[id] > 0) {
65			diff = n - last[id];
66
67			if (diff <= lowest) {
68				if (lowest != UINT32_MAX)
69					printf("id %5d: last call at %9"PRIu32
70					    ", current call %9"PRIu32
71					    " (diff %5"PRIu32"), "
72					    "lowest %"PRIu32"\n",
73					    id, last[id], n, diff, lowest);
74
75				ATF_REQUIRE_MSG(diff >= PERIOD,
76				    "diff (%"PRIu32") less than minimum "
77				    "period (%d)", diff, PERIOD);
78
79				lowest = diff;
80			}
81		}
82
83		last[id] = n;
84	}
85}
86
87ATF_TP_ADD_TCS(tp)
88{
89
90	ATF_TP_ADD_TC(tp, randomid_basic);
91
92	return atf_no_error();
93}
94