Path: blob/main/sys/contrib/libsodium/test/default/cmptest.h
48375 views
1#ifndef __CMPTEST_H__2#define __CMPTEST_H__34#ifdef NDEBUG5#/**/undef/**/ NDEBUG6#endif78#include <assert.h>9#include <errno.h>10#include <limits.h>11#include <stdio.h>12#include <stdint.h>13#include <stdlib.h>14#include <string.h>1516#include "sodium.h"17#include "quirks.h"1819#ifdef __EMSCRIPTEN__20# undef TEST_SRCDIR21# define TEST_SRCDIR "/test-data"22#endif23#ifndef TEST_SRCDIR24# define TEST_SRCDIR "."25#endif2627#define TEST_NAME_RES TEST_NAME ".res"28#define TEST_NAME_OUT TEST_SRCDIR "/" TEST_NAME ".exp"2930#ifdef HAVE_ARC4RANDOM31# undef rand32# define rand(X) arc4random(X)33#endif3435int xmain(void);3637#ifdef BENCHMARKS3839# include <sys/time.h>4041# ifndef ITERATIONS42# define ITERATIONS 12843# endif4445struct {46void *pnt;47size_t size;48} mempool[1024];4950static size_t mempool_idx;5152static __attribute__((malloc)) void *mempool_alloc(size_t size)53{54size_t i;55if (size >= (size_t) 0x80000000 - (size_t) 0x00000fff) {56return NULL;57}58size = (size + (size_t) 0x00000fff) & ~ (size_t) 0x00000fff;59for (i = 0U; i < mempool_idx; i++) {60if (mempool[i].size >= (size | (size_t) 0x80000000)) {61mempool[i].size &= ~ (size_t) 0x80000000;62return mempool[i].pnt;63}64}65if (mempool_idx >= sizeof mempool / sizeof mempool[0]) {66return NULL;67}68mempool[mempool_idx].size = size;69return (mempool[mempool_idx++].pnt = (void *) malloc(size));70}7172static void mempool_free(void *pnt)73{74size_t i;75for (i = 0U; i < mempool_idx; i++) {76if (mempool[i].pnt == pnt) {77if ((mempool[i].size & (size_t) 0x80000000) != (size_t) 0x0) {78break;79}80mempool[i].size |= (size_t) 0x80000000;81return;82}83}84abort();85}8687static __attribute__((malloc)) void *mempool_allocarray(size_t count, size_t size)88{89if (count > (size_t) 0U && size >= (size_t) SIZE_MAX / count) {90return NULL;91}92return mempool_alloc(count * size);93}9495static int mempool_free_all(void)96{97size_t i;98int ret = 0;99100for (i = 0U; i < mempool_idx; i++) {101if ((mempool[i].size & (size_t) 0x80000000) == (size_t) 0x0) {102ret = -1;103}104free(mempool[i].pnt);105mempool[i].pnt = NULL;106}107mempool_idx = (size_t) 0U;108109return ret;110}111112#define sodium_malloc(X) mempool_alloc(X)113#define sodium_free(X) mempool_free(X)114#define sodium_allocarray(X, Y) mempool_allocarray((X), (Y))115116static unsigned long long now(void)117{118struct timeval tp;119unsigned long long now;120121if (gettimeofday(&tp, NULL) != 0) {122abort();123}124now = ((unsigned long long) tp.tv_sec * 1000000ULL) +125(unsigned long long) tp.tv_usec;126127return now;128}129130int main(void)131{132unsigned long long ts_start;133unsigned long long ts_end;134unsigned int i;135136if (sodium_init() != 0) {137return 99;138}139140#ifndef __EMSCRIPTEN__141randombytes_set_implementation(&randombytes_salsa20_implementation);142#endif143ts_start = now();144for (i = 0; i < ITERATIONS; i++) {145if (xmain() != 0) {146abort();147}148}149ts_end = now();150printf("%llu\n", 1000000ULL * (ts_end - ts_start) / ITERATIONS);151if (mempool_free_all() != 0) {152fprintf(stderr, "** memory leaks detected **\n");153return 99;154}155return 0;156}157158#undef printf159#define printf(...) do { } while(0)160161#elif !defined(BROWSER_TESTS)162163static FILE *fp_res;164165int main(void)166{167FILE *fp_out;168int c;169170if ((fp_res = fopen(TEST_NAME_RES, "w+")) == NULL) {171perror("fopen(" TEST_NAME_RES ")");172return 99;173}174if (sodium_init() != 0) {175return 99;176}177if (xmain() != 0) {178return 99;179}180rewind(fp_res);181if ((fp_out = fopen(TEST_NAME_OUT, "r")) == NULL) {182perror("fopen(" TEST_NAME_OUT ")");183return 99;184}185do {186if ((c = fgetc(fp_res)) != fgetc(fp_out)) {187return 99;188}189} while (c != EOF);190191return 0;192}193194#undef printf195#define printf(...) fprintf(fp_res, __VA_ARGS__)196197#else198199int main(void)200{201if (sodium_init() != 0) {202return 99;203}204if (xmain() != 0) {205return 99;206}207printf("--- SUCCESS ---\n");208209return 0;210}211212#endif213214#define main xmain215216#endif217218219