125 lines
4.5 KiB
C
125 lines
4.5 KiB
C
#pragma once
|
|
#include <time.h>
|
|
|
|
int one_percent_chance(){
|
|
static int initialized = 0;
|
|
if (!initialized) {
|
|
srand((unsigned int)time(NULL));
|
|
initialized = 1;
|
|
}
|
|
return (rand() % 1000000) == 0;
|
|
}
|
|
|
|
void error_simulet(size_t i, struct tred_pizdec* meta){
|
|
if (args.simulate_errors && i % 1000 == 0 && one_percent_chance()) {
|
|
meta->mem[i] = 45345345;
|
|
}
|
|
}
|
|
|
|
void* fill_pattern_multi_tred(void *arg) {
|
|
struct tred_pizdec* meta = (struct tred_pizdec*) arg;
|
|
DEBUG_PRINT("id: 0x%08X\n", test_patterns[meta->id]);
|
|
switch (meta->test_tip){
|
|
case 1:
|
|
for (size_t i = meta->words_start; i < meta->words_stop; i++){
|
|
meta->mem[i] = test_patterns[meta->id];
|
|
error_simulet(i, meta);
|
|
}
|
|
break;
|
|
case 2:
|
|
for (size_t i = meta->words_start; i < meta->words_stop; i++){
|
|
meta->mem[i] = (uint32_t)i;
|
|
error_simulet(i, meta);
|
|
}
|
|
break;
|
|
case 3:
|
|
for (size_t i = meta->words_start; i < meta->words_stop; i++){
|
|
meta->mem[i] = 1U << (i % 32);
|
|
error_simulet(i, meta);
|
|
}
|
|
break;
|
|
case 4:
|
|
for (size_t i = meta->words_start; i < meta->words_stop; i++){
|
|
meta->mem[i] = ~(1U << (i % 32));
|
|
error_simulet(i, meta);
|
|
}
|
|
break;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void error_write_info(size_t i, struct tred_pizdec* meta, uint32_t expected){
|
|
int id = meta->id;
|
|
if (meta->test_tip != 1){
|
|
id = 2 + meta->test_tip;
|
|
}
|
|
if (args.json){
|
|
struct error_info* error_str = malloc(sizeof(struct error_info));
|
|
error_str->expected = expected;
|
|
error_str->actual = meta->mem[i];
|
|
if (!meta->test_stats->test_local_stats[id]->error_int){
|
|
meta->test_stats->test_local_stats[id]->error_info = error_str;
|
|
}
|
|
else
|
|
meta->test_stats->test_local_stats[id]->error_info_end->error_info_next = error_str;
|
|
meta->test_stats->test_local_stats[id]->error_info_end = error_str;
|
|
}
|
|
else{
|
|
if (meta->test_tip == 1)
|
|
printf("\nОшибка в тесте 0x%08X: должен быть: 0x%08X, фактический: 0x%08X\n", test_patterns[id], expected, meta->mem[i]);
|
|
else
|
|
printf("\nОшибка в тесте %s: должен быть: 0x%08X, фактический: 0x%08X\n", test_name[meta->test_tip-2], expected, meta->mem[i]);
|
|
}
|
|
meta->test_stats->test_local_stats[id]->error_int++;
|
|
}
|
|
void* check_pattern_multi_tred(void *arg) {
|
|
struct tred_pizdec* meta = (struct tred_pizdec*) arg;
|
|
//meta->return_error = 0;
|
|
switch (meta->test_tip){
|
|
case 1:
|
|
for (size_t i = meta->words_start; i < meta->words_stop; i++){
|
|
if (meta->mem[i] != test_patterns[meta->id]){
|
|
error_write_info(i, meta, test_patterns[meta->id]);
|
|
meta->return_error++;
|
|
//if (meta->return_error > 10) break;
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
for (size_t i = meta->words_start; i < meta->words_stop; i++) {
|
|
if (meta->mem[i] != (uint32_t)i) {
|
|
error_write_info(i, meta, (uint32_t)i);
|
|
meta->return_error++;
|
|
//if (meta->return_error > 10) break;
|
|
}
|
|
//printf("Адрес памяти: %p\n", (void*)meta->mem[i]);
|
|
}
|
|
break;
|
|
case 3:
|
|
for (size_t i = meta->words_start; i < meta->words_stop; i++) {
|
|
if (meta->mem[i] != 1U << (i % 32)){
|
|
error_write_info(i, meta, 1U << (i % 32));
|
|
meta->return_error++;
|
|
//if (meta->return_error > 10) break;
|
|
}
|
|
}
|
|
break;
|
|
case 4:
|
|
for (size_t i = meta->words_start; i < meta->words_stop; i++) {
|
|
//printf("\rTEST: 0x%08X ", ~(1U << (i % 32)));
|
|
if (meta->mem[i] != ~(1U << (i % 32))){
|
|
DEBUG_PRINT("\n\nTEST: %p \n", (void*)&meta->mem[i]);
|
|
DEBUG_PRINT("TEST: 0x%08X \n", meta->mem[i]);
|
|
DEBUG_PRINT("TEST: 0x%08X \n\n", ~(1U << (i % 32)));
|
|
error_write_info(i, meta, ~(1U << (i % 32)));
|
|
meta->return_error++;
|
|
//if (meta->return_error > 10) break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
|