mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
unit: make multiaccel tests deterministic
Use a PRNG, not rand().
This commit is contained in:
parent
8e4c68e9df
commit
ea62ba107f
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015, Intel Corporation
|
* Copyright (c) 2015-2016, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -43,47 +43,16 @@ extern "C" {
|
|||||||
#include "util/alloc.h"
|
#include "util/alloc.h"
|
||||||
#include "util/charreach.h"
|
#include "util/charreach.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include <random>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <algorithm>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
using namespace ue2;
|
using namespace ue2;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace testing;
|
using namespace testing;
|
||||||
|
|
||||||
/*
|
|
||||||
* Static functions needed for this test's wellbeing
|
|
||||||
*/
|
|
||||||
|
|
||||||
// char generator
|
|
||||||
static inline
|
|
||||||
char getChar(const CharReach &cr, bool match) {
|
|
||||||
char result;
|
|
||||||
do {
|
|
||||||
result = rand() % CharReach::npos;
|
|
||||||
} while (cr.test(result) != match);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// appends a string with matches/unmatches according to input match pattern
|
|
||||||
static
|
|
||||||
void getMatch(u8 *result, u32 start, const string &pattern,
|
|
||||||
const CharReach &cr) {
|
|
||||||
for (const auto &c : pattern) {
|
|
||||||
result[start++] = getChar(cr, c == '1');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// appends non-matching noise of certain lengths
|
|
||||||
static
|
|
||||||
void getNoise(u8 *result, u32 start, u32 len, const CharReach &cr) {
|
|
||||||
for (unsigned i = 0; i < len; i++) {
|
|
||||||
result[start + i] = getChar(cr, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// test parameters structure
|
// test parameters structure
|
||||||
struct MultiaccelTestParam {
|
struct MultiaccelTestParam {
|
||||||
string match_pattern;
|
string match_pattern;
|
||||||
@ -126,6 +95,34 @@ protected:
|
|||||||
test_all_offsets = p.test_all_offsets;
|
test_all_offsets = p.test_all_offsets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char getChar(const CharReach &cr) {
|
||||||
|
assert(cr.count() > 0);
|
||||||
|
auto dist = uniform_int_distribution<size_t>(0, cr.count() - 1);
|
||||||
|
size_t result = cr.find_nth(dist(prng));
|
||||||
|
assert(result != CharReach::npos);
|
||||||
|
return (char)result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// char generator
|
||||||
|
char getChar(const CharReach &cr, bool match) {
|
||||||
|
return getChar(match ? cr : ~cr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// appends a string with matches/unmatches according to input match pattern
|
||||||
|
void getMatch(u8 *result, u32 start, const string &pattern,
|
||||||
|
const CharReach &cr) {
|
||||||
|
for (const auto &c : pattern) {
|
||||||
|
result[start++] = getChar(cr, c == '1');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// appends non-matching noise of certain lengths
|
||||||
|
void getNoise(u8 *result, u32 start, u32 len, const CharReach &cr) {
|
||||||
|
for (unsigned i = 0; i < len; i++) {
|
||||||
|
result[start + i] = getChar(cr, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// deferred buffer generation, as we don't know CharReach before we run the test
|
// deferred buffer generation, as we don't know CharReach before we run the test
|
||||||
void GenerateBuffer(const CharReach &cr) {
|
void GenerateBuffer(const CharReach &cr) {
|
||||||
const MultiaccelTestParam &p = GetParam();
|
const MultiaccelTestParam &p = GetParam();
|
||||||
@ -167,6 +164,10 @@ protected:
|
|||||||
aligned_free(buffer);
|
aligned_free(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We want our tests to be deterministic, so we use a PRNG in the test
|
||||||
|
// fixture.
|
||||||
|
mt19937 prng;
|
||||||
|
|
||||||
u32 match_idx;
|
u32 match_idx;
|
||||||
u8 *buffer;
|
u8 *buffer;
|
||||||
bool test_all_offsets;
|
bool test_all_offsets;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user