Tor 0.4.9.2-alpha-dev
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
tests.c
1/* Copyright (c) 2020 tevador <tevador@gmail.com> */
2/* See LICENSE for licensing information */
3
4#ifdef NDEBUG
5#undef NDEBUG
6#endif
7
8#include <assert.h>
9#include <equix.h>
10#include <stdbool.h>
11#include <stdio.h>
12
13typedef bool test_func();
14
15static equix_ctx* ctx = NULL;
16static equix_solutions_buffer output;
17static int nonce;
18static int valid_count = 0;
19static int test_no = 0;
20
21#define SWAP_IDX(a, b) \
22 do { \
23 equix_idx temp = a; \
24 a = b; \
25 b = temp; \
26 } while(0)
27
28static bool test_alloc() {
29 ctx = equix_alloc(EQUIX_CTX_SOLVE | EQUIX_CTX_TRY_COMPILE);
30 assert(ctx != NULL);
31 return true;
32}
33
34static bool test_free() {
35 equix_free(ctx);
36 return true;
37}
38
39static bool test_solve() {
40 output.count = 0;
41 for (nonce = 0; output.count == 0 && nonce < 20; ++nonce) {
42 equix_result result = equix_solve(ctx, &nonce, sizeof(nonce), &output);
43 assert(result == EQUIX_OK);
44 }
45 --nonce;
46 assert(output.count > 0);
47 assert(output.flags == EQUIX_SOLVER_DID_USE_COMPILER || output.flags == 0);
48 printf("(using %s HashX) ",
49 (EQUIX_SOLVER_DID_USE_COMPILER & output.flags)
50 ? "compiled" : "interpreted");
51 return true;
52}
53
54static bool test_verify1() {
55 equix_result result = equix_verify(ctx, &nonce, sizeof(nonce), &output.sols[0]);
56 assert(result == EQUIX_OK);
57 return true;
58}
59
60static bool test_verify2() {
61 SWAP_IDX(output.sols[0].idx[0], output.sols[0].idx[1]);
62 equix_result result = equix_verify(ctx, &nonce, sizeof(nonce), &output.sols[0]);
63 assert(result == EQUIX_FAIL_ORDER);
64 return true;
65}
66
67static bool test_verify3() {
68 SWAP_IDX(output.sols[0].idx[0], output.sols[0].idx[4]);
69 SWAP_IDX(output.sols[0].idx[1], output.sols[0].idx[5]);
70 SWAP_IDX(output.sols[0].idx[2], output.sols[0].idx[6]);
71 SWAP_IDX(output.sols[0].idx[3], output.sols[0].idx[7]);
72 equix_result result = equix_verify(ctx, &nonce, sizeof(nonce), &output.sols[0]);
73 assert(result == EQUIX_FAIL_ORDER);
74 SWAP_IDX(output.sols[0].idx[0], output.sols[0].idx[4]);
75 SWAP_IDX(output.sols[0].idx[1], output.sols[0].idx[5]);
76 SWAP_IDX(output.sols[0].idx[2], output.sols[0].idx[6]);
77 SWAP_IDX(output.sols[0].idx[3], output.sols[0].idx[7]);
78 return true;
79}
80
81static bool test_verify4() {
82 SWAP_IDX(output.sols[0].idx[1], output.sols[0].idx[2]);
83 equix_result result = equix_verify(ctx, &nonce, sizeof(nonce), &output.sols[0]);
84 assert(result == EQUIX_FAIL_PARTIAL_SUM);
85 SWAP_IDX(output.sols[0].idx[1], output.sols[0].idx[2]);
86 return true;
87}
88
89static void permute_idx(int start) {
90 if (start == EQUIX_NUM_IDX - 1) {
91 equix_result result = equix_verify(ctx, &nonce, sizeof(nonce), &output.sols[0]);
92 valid_count += result == EQUIX_OK;
93 }
94 else {
95 for (int i = start; i < EQUIX_NUM_IDX; ++i) {
96 SWAP_IDX(output.sols[0].idx[start], output.sols[0].idx[i]);
97 permute_idx(start + 1);
98 SWAP_IDX(output.sols[0].idx[start], output.sols[0].idx[i]);
99 }
100 }
101}
102
103static bool test_permutations() {
104 permute_idx(0);
105 assert(valid_count == 1); /* check that only one of the 40320 possible
106 permutations of indices is a valid solution */
107 return true;
108}
109
110#define RUN_TEST(x) run_test(#x, &x)
111
112static void run_test(const char* name, test_func* func) {
113 printf("[%2i] %-40s ... ", ++test_no, name);
114 printf(func() ? "PASSED\n" : "SKIPPED\n");
115}
116
117int main() {
118 RUN_TEST(test_alloc);
119 RUN_TEST(test_solve);
120 RUN_TEST(test_verify1);
121 RUN_TEST(test_verify2);
122 RUN_TEST(test_verify3);
123 RUN_TEST(test_verify4);
124 RUN_TEST(test_permutations);
125 RUN_TEST(test_free);
126
127 printf("\nAll tests were successful\n");
128 return 0;
129}
const char * name
Definition: config.c:2471
int main(int argc, char *argv[])
Definition: tor_main.c:25