testUtil.c revision a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7d
187dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller/*
287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller * Copyright (C) 2010 The Android Open Source Project
387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller *
487dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller * Licensed under the Apache License, Version 2.0 (the "License");
587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller * you may not use this file except in compliance with the License.
687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller * You may obtain a copy of the License at
787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller *
887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller *      http://www.apache.org/licenses/LICENSE-2.0
987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller *
1087dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller * Unless required by applicable law or agreed to in writing, software
1187dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller * distributed under the License is distributed on an "AS IS" BASIS,
1287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller * See the License for the specific language governing permissions and
1487dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller * limitations under the License.
1587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller *
1687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller */
1787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
1887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#include <testUtil.h>
1987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
2087dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#include <assert.h>
2187dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#include <math.h>
2287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#include <stdarg.h>
2387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#include <stdint.h>
2487dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#include <stdio.h>
2587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#include <stdlib.h>
2687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#include <time.h>
2787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#include <sys/time.h>
2887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#include <cutils/log.h>
2987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
3087dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#define ALEN(a) (sizeof(a) / sizeof(a [0]))  // Array length
3187dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemillertypedef unsigned int bool_t;
3287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#define true (0 == 0)
3387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#define false (!true)
3487dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
3587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller#define MAXSTR 200
36d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller
3787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemillerstatic const char *logCatTag;
38d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemillerstatic const unsigned int uSecsPerSec = 1000000;
39d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemillerstatic const unsigned int nSecsPerSec = 1000000000;
40d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller
41d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller// struct timespec to double
42d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemillerdouble ts2double(const struct timespec *val)
43d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller{
44d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    double rv;
45d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller
46d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    rv = val->tv_sec;
47d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    rv += (double) val->tv_nsec / nSecsPerSec;
48d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller
49d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    return rv;
50d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller}
5187dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
5287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller// struct timeval to double
53d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemillerdouble tv2double(const struct timeval *val)
5487dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller{
5587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    double rv;
5687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
5787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    rv = val->tv_sec;
5887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    rv += (double) val->tv_usec / uSecsPerSec;
5987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
6087dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    return rv;
6187dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller}
6287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
6387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller// double to struct timespec
64d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemillerstruct timespec double2ts(double amt)
6587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller{
6687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    struct timespec rv;
6787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
6887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    rv.tv_sec = floor(amt);
6987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    rv.tv_nsec = (amt - rv.tv_sec) * nSecsPerSec;
7087dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    // TODO: Handle cases where amt is negative
7187dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    while ((unsigned) rv.tv_nsec >= nSecsPerSec) {
7287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller        rv.tv_nsec -= nSecsPerSec;
7387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller        rv.tv_sec++;
7487dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    }
7587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
7687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    return rv;
7787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller}
7887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
79d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller// double to struct timeval
80d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemillerstruct timeval double2tv(double amt)
81d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller{
82d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    struct timeval rv;
83d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller
84d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    rv.tv_sec = floor(amt);
85d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    rv.tv_usec = (amt - rv.tv_sec) * uSecsPerSec;
86d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    // TODO: Handle cases where amt is negative
87d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    while ((unsigned) rv.tv_usec >= uSecsPerSec) {
88d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller        rv.tv_usec -= uSecsPerSec;
89d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller        rv.tv_sec++;
90d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    }
91d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller
92d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    return rv;
93d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller}
94d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller
95d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller// Delta (difference) between two struct timespec.
96d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller// It is expected that the time given by the structure pointed to by
97d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller// second, is later than the time pointed to by first.
98d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemillerstruct timespec tsDelta(const struct timespec *first,
99d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller                        const struct timespec *second)
100d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller{
101d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    struct timespec rv;
102d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller
103d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    assert(first != NULL);
104d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    assert(second != NULL);
105d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    assert(first->tv_nsec >= 0 && first->tv_nsec < nSecsPerSec);
106d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    assert(second->tv_nsec >= 0 && second->tv_nsec < nSecsPerSec);
107d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    rv.tv_sec = second->tv_sec - first->tv_sec;
108d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    if (second->tv_nsec >= first->tv_nsec) {
109d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller        rv.tv_nsec = second->tv_nsec - first->tv_nsec;
110d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    } else {
111d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller        rv.tv_nsec = (second->tv_nsec + nSecsPerSec) - first->tv_nsec;
112d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller        rv.tv_sec--;
113d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    }
114d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller
115d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    return rv;
116d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller}
117d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller
11887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller// Delta (difference) between two struct timeval.
11987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller// It is expected that the time given by the structure pointed to by
12087dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller// second, is later than the time pointed to by first.
121d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemillerstruct timeval tvDelta(const struct timeval *first,
122d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller                       const struct timeval *second)
12387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller{
12487dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    struct timeval rv;
12587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
12687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    assert(first != NULL);
12787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    assert(second != NULL);
12887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    assert(first->tv_usec >= 0 && first->tv_usec < uSecsPerSec);
12987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    assert(second->tv_usec >= 0 && second->tv_usec < uSecsPerSec);
13087dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    rv.tv_sec = second->tv_sec - first->tv_sec;
13187dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    if (second->tv_usec >= first->tv_usec) {
13287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller        rv.tv_usec = second->tv_usec - first->tv_usec;
13387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    } else {
13487dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller        rv.tv_usec = (second->tv_usec + uSecsPerSec) - first->tv_usec;
13587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller        rv.tv_sec--;
13687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    }
13787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
13887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    return rv;
13987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller}
14087dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
141d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemillervoid testPrint(FILE *stream, const char *fmt, ...)
14287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller{
14387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    char line[MAXSTR];
14487dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    va_list args;
14587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
14687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    va_start(args, fmt);
14787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    vsnprintf(line, sizeof(line), fmt, args);
14887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    if (stream == stderr) {
14987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller        LOG(LOG_ERROR, logCatTag, "%s", line);
15087dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    } else {
15187dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller        LOG(LOG_INFO, logCatTag, "%s", line);
15287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    }
15387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    vfprintf(stream, fmt, args);
15487dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    fputc('\n', stream);
15587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller}
15687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
15787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller// Set tag used while logging to the logcat error interface
158d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemillervoid testSetLogCatTag(const char *tag)
15987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller{
16087dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    logCatTag = tag;
16187dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller}
16287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
16387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller// Obtain pointer to current log to logcat error interface tag
164d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemillerconst char * testGetLogCatTag(void)
16587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller{
16687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    return logCatTag;
16787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller}
16887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
16987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller/*
170a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller * Random Modulus
171a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller *
172a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller * Pseudo randomly returns unsigned integer in the range [0, mod).
173a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller *
174a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller * Precondition: srand48() called to set the seed of
175a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller *   the pseudo random number generator.
176a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller */
177a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemillerunsigned int testRandMod(unsigned int mod)
178a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller{
179a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    // Obtain the random value
180a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    uint32_t val = lrand48();
181a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller
182a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    /*
183a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller     * The contents of individual bytes tend to be less than random
184a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller     * across different seeds.  For example, srand48(x) and
185a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller     * srand48(x + n * 4) cause lrand48() to return the same sequence of
186a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller     * least significant bits.  For small mod values this can produce
187a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller     * noticably non-random sequnces.  For mod values of less than 2
188a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller     * byte, will use the randomness from all the bytes.
189a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller     */
190a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    if (mod <= 0x10000) {
191a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        val = (val & 0xffff) ^ (val >> 16);
192a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller
193a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        // If mod less than a byte, can further combine down to
194a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        // a single byte.
195a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        if (mod <= 0x100) {
196a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller            val = (val & 0xff) ^ (val >> 8);
197a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        }
198a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    }
199a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller
200a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    return val % mod;
201a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller}
202a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller
203a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller/*
20487dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller * Random Boolean
20587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller *
20687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller * Pseudo randomly returns 0 (false) or 1 (true).
20787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller *
20887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller * Precondition: srand48() called to set the seed of
20987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller *   the pseudo random number generator.
21087dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller */
211d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemillerint testRandBool(void)
21287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller{
213a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    return (testRandMod(2));
214a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller}
215a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller
216a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller/*
217a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller * Random Fraction
218a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller *
219a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller * Pseudo randomly return a value in the range [0.0, 1.0).
220a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller *
221a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller * Precondition: srand48() called to set the seed of
222a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller *   the pseudo random number generator.
223a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller */
224a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemillerdouble testRandFract(void)
225a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller{
226a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    // TODO: use drand48(), after issue 2838717 has been fixed
227a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    return (double) lrand48() / (double) (1UL << 31);
22887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller}
22987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
23087dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller// Delays for the number of seconds specified by amt or a greater amount.
23187dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller// The amt variable is of type float and thus non-integer amounts
23287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller// of time can be specified.  This function automatically handles cases
23387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller// where nanosleep(2) returns early due to reception of a signal.
234a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemillervoid testDelay(float amt)
23587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller{
236d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    struct timespec   start, current, delta;
23787dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    struct timespec   remaining;
23887dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
23987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    // Get the time at which we started
240d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller    clock_gettime(CLOCK_MONOTONIC, &start);
24187dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
24287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    do {
24387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller        // Get current time
244d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller        clock_gettime(CLOCK_MONOTONIC, &current);
24587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
24687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller        // How much time is left
247d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller        delta = tsDelta(&start, &current);
248d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller        if (ts2double(&delta) > amt) { break; }
24987dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller
25087dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller        // Request to sleep for the remaining time
251d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller        remaining = double2ts(amt - ts2double(&delta));
25287dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller        (void) nanosleep(&remaining, NULL);
25387dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller    } while (true);
25487dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller}
255a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller
256a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller/*
257a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller * Hex Dump
258a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller *
259a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller * Displays in hex the contents of the memory starting at the location
260a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller * pointed to by buf, for the number of bytes given by size.
261a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller * Each line of output is indented by a number of spaces that
262a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller * can be set by calling xDumpSetIndent().  It is also possible
263a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller * to offset the displayed address by an amount set by calling
264a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller * xDumpSetOffset.
265a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller */
266a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemillerstatic uint8_t     xDumpIndent;
267a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemillerstatic uint64_t    xDumpOffset;
268a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemillervoid
269a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis HuemillertestXDump(const void *buf, size_t size)
270a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller{
271a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    const unsigned int bytesPerLine = 16;
272a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    int rv;
273a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    char line[MAXSTR];
274a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    const unsigned char *ptr = buf, *start = buf;
275a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    size_t num = size;
276a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    char *linep = line;
277a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller
278a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    while (num) {
279a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        if (((ptr - start) % bytesPerLine) == 0) {
280a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller            if (linep != line) {
281a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller                testPrintE("%s", line);
282a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller            }
283a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller            linep = line;
284a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller            rv = snprintf(linep, ALEN(line) - (linep - line),
285a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller                "%*s%06llx:", xDumpIndent, "",
286a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller                (long long) (ptr - start) + xDumpOffset);
287a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller            linep += rv;
288a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        }
289a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller
290a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        // Check that there is at least room for 4
291a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        // more characters.  The 4 characters being
292a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        // a space, 2 hex digits and the terminating
293a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        // '\0'.
294a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        assert((ALEN(line) - 4) >= (linep - line));
295a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        rv = snprintf(linep, ALEN(line) - (linep - line),
296a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller            " %02x", *ptr++);
297a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        linep += rv;
298a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        num--;
299a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    }
300a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    if (linep != line) {
301a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller        testPrintE("%s", line);
302a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    }
303a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller}
304a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller
305a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller// Set an indent of spaces for each line of hex dump output
306a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemillervoid
307a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis HuemillertestXDumpSetIndent(uint8_t indent)
308a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller{
309a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    xDumpIndent = indent;
310a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller}
311a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller
312a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller// Obtain the current hex dump indent amount
313a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemilleruint8_t
314a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis HuemillertestXDumpGetIndent(void)
315a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller{
316a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    return xDumpIndent;
317a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller}
318a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller
319a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller// Set the hex dump address offset amount
320a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemillervoid
321a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis HuemillertestXDumpSetOffset(uint64_t offset)
322a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller{
323a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    xDumpOffset = offset;
324a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller}
325a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller
326a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller// Get the current hex dump address offset amount
327a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemilleruint64_t
328a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis HuemillertestXDumpGetOffset(void)
329a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller{
330a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller    return xDumpOffset;
331a31faf1b7edb5c20d3a8949ba3ca767b4f0a4a7dLouis Huemiller}
332