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, ¤t); 24587dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller 24687dd9e92610d5e7552f5cdb6ab2578035e2210f5Louis Huemiller // How much time is left 247d2447fd2505466a8c30cdca247325f79ba95be34Louis Huemiller delta = tsDelta(&start, ¤t); 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