1
2#ifndef __CMPTEST_H__
3#define __CMPTEST_H__
4
5#ifdef NDEBUG
6#/**/undef/**/ NDEBUG
7#endif
8
9#include <assert.h>
10#include <stdio.h>
11#include <stdint.h>
12#include <stdlib.h>
13#include <string.h>
14#include <errno.h>
15
16#include "sodium.h"
17#include "quirks.h"
18
19#ifdef __EMSCRIPTEN__
20# undef TEST_SRCDIR
21# define TEST_SRCDIR "/test-data"
22#endif
23#ifndef TEST_SRCDIR
24# define TEST_SRCDIR "."
25#endif
26
27#define TEST_NAME_RES TEST_NAME ".res"
28#define TEST_NAME_OUT TEST_SRCDIR "/" TEST_NAME ".exp"
29
30#ifdef HAVE_ARC4RANDOM
31# undef rand
32# define rand(X) arc4random(X)
33#endif
34
35int xmain(void);
36
37#ifdef BENCHMARKS
38
39# include <sys/time.h>
40
41# ifndef ITERATIONS
42#  define ITERATIONS 128
43# endif
44
45static unsigned long long now(void)
46{
47    struct             timeval tp;
48    unsigned long long now;
49
50    if (gettimeofday(&tp, NULL) != 0) {
51        abort();
52    }
53    now = ((unsigned long long) tp.tv_sec * 1000000ULL) +
54        (unsigned long long) tp.tv_usec;
55
56    return now;
57}
58
59int main(void)
60{
61    unsigned long long ts_start;
62    unsigned long long ts_end;
63    unsigned int       i;
64
65    if (sodium_init() != 0) {
66        return 99;
67    }
68    randombytes_set_implementation(&randombytes_salsa20_implementation);
69    ts_start = now();
70    for (i = 0; i < ITERATIONS; i++) {
71        if (xmain() != 0) {
72            abort();
73        }
74    }
75    ts_end = now();
76    printf("%llu\n", 1000000ULL * (ts_end - ts_start) / ITERATIONS);
77
78    return 0;
79}
80
81#define printf(...) do { } while(0)
82
83#elif !defined(BROWSER_TESTS)
84
85FILE *fp_res;
86
87int main(void)
88{
89    FILE *fp_out;
90    int   c;
91
92    if ((fp_res = fopen(TEST_NAME_RES, "w+")) == NULL) {
93        perror("fopen(" TEST_NAME_RES ")");
94        return 99;
95    }
96    if (sodium_init() != 0) {
97        return 99;
98    }
99    if (xmain() != 0) {
100        return 99;
101    }
102    rewind(fp_res);
103    if ((fp_out = fopen(TEST_NAME_OUT, "r")) == NULL) {
104        perror("fopen(" TEST_NAME_OUT ")");
105        return 99;
106    }
107    do {
108        if ((c = fgetc(fp_res)) != fgetc(fp_out)) {
109            return 99;
110        }
111    } while (c != EOF);
112
113    return 0;
114}
115
116#undef  printf
117#define printf(...) fprintf(fp_res, __VA_ARGS__)
118
119#else
120
121int main(void)
122{
123    if (sodium_init() != 0) {
124        return 99;
125    }
126    if (xmain() != 0) {
127        return 99;
128    }
129    printf("--- SUCCESS ---\n");
130
131    return 0;
132}
133
134#endif
135
136#define main xmain
137
138#endif
139