92 {
94
97 fstream input;
98 vector<char> data;
99 chash expected, actual;
100 size_t test = 0;
102 if (argc != 3) {
103 if ((argc == 2) && (strcmp(argv[1], "variant2_int_sqrt") == 0)) {
105 return 1;
106 }
107 const int round_modes[3] = { FE_DOWNWARD, FE_TONEAREST, FE_UPWARD };
108 for (int i = 0; i < 3; ++i) {
109 std::fesetround(round_modes[i]);
111 if (result != 0) {
112 cerr << "FPU round mode was set to ";
113 switch (round_modes[i]) {
114 case FE_DOWNWARD:
115 cerr << "FE_DOWNWARD";
116 break;
117 case FE_TONEAREST:
118 cerr << "FE_TONEAREST";
119 break;
120 case FE_UPWARD:
121 cerr << "FE_UPWARD";
122 break;
123 default:
124 cerr << "unknown";
125 break;
126 }
127 cerr << endl;
128 return result;
129 }
130 }
131 return 0;
132 }
133 cerr << "Wrong number of arguments" << endl;
134 return 1;
135 }
136 for (hf =
hashes;; hf++) {
138 cerr << "Unknown function" << endl;
139 return 1;
140 }
141 if (argv[1] == hf->
name) {
143 break;
144 }
145 }
146 input.open(argv[2], ios_base::in);
147 for (;;) {
148 ++test;
149 input.exceptions(ios_base::badbit);
150 get(input, expected);
151 if (input.rdstate() & ios_base::eofbit) {
152 break;
153 }
154 input.exceptions(ios_base::badbit | ios_base::failbit | ios_base::eofbit);
155 input.clear(input.rdstate());
157 if (f == cn_slow_hash_4) {
159 d.
data = data.data();
162 f(&d, 0, (char *) &actual);
163 } else {
164 f(data.data(), data.size(), (char *) &actual);
165 }
166 if (expected != actual) {
167 size_t i;
168 cerr << "Hash mismatch on test " << test << endl << "Input: ";
169 if (data.size() == 0) {
170 cerr << "empty";
171 } else {
172 for (i = 0; i < data.size(); i++) {
173 cerr << setbase(16) << setw(2) << setfill('0') << int(static_cast<unsigned char>(data[i]));
174 }
175 }
176 cerr << endl << "Expected hash: ";
177 for (i = 0; i < 32; i++) {
178 cerr << setbase(16) << setw(2) << setfill('0') << int(reinterpret_cast<unsigned char *>(&expected)[i]);
179 }
180 cerr << endl << "Actual hash: ";
181 for (i = 0; i < 32; i++) {
182 cerr << setbase(16) << setw(2) << setfill('0') << int(reinterpret_cast<unsigned char *>(&actual)[i]);
183 }
184 cerr << endl;
186 }
187 }
188 return error ? 1 : 0;
190}
void get(std::istream &input, bool &res)
#define CATCH_ENTRY_L0(lacation, return_val)
error
Tracks LMDB error codes.
struct hash_func hashes[]
int test_variant2_int_sqrt()
int test_variant2_int_sqrt_ref()
POP_WARNINGS typedef void hash_f(const void *, size_t, char *)