Fix randomizer
Relying on the system randomizer for unit tests leads to cases where we
don't get deterministic results, which causes inconsistent results.
These random results don't need to be secure, so reimplement as a simple
linear feedback shift register[1]. This makes our unit tests now
produce the same output every time we call generate.
Note, this change showed a weakness in our testing, where timestamps
relied on different rules for ir->cper versus cper->ir. hour 24 should
be allowed.
[1] https://en.wikipedia.org/wiki/Linear-feedback_shift_register
Change-Id: I0756b086c8ea5fb934e450f5d33e3ae0036868b3
Signed-off-by: Ed Tanous <ed@tanous.net>
diff --git a/generator/sections/gen-section-arm.c b/generator/sections/gen-section-arm.c
index c181663..ded953d 100644
--- a/generator/sections/gen-section-arm.c
+++ b/generator/sections/gen-section-arm.c
@@ -21,8 +21,8 @@
GEN_VALID_BITS_TEST_TYPE validBitsType)
{
//Set up for generation of error/context structures.
- UINT16 error_structure_num = rand() % 4 + 1; //Must be at least 1.
- UINT16 context_structure_num = rand() % 3 + 1;
+ UINT16 error_structure_num = cper_rand() % 4 + 1; //Must be at least 1.
+ UINT16 context_structure_num = cper_rand() % 3 + 1;
void *error_structures[error_structure_num];
void *context_structures[context_structure_num];
size_t context_structure_lengths[context_structure_num];
@@ -37,7 +37,7 @@
}
//Determine a random amount of vendor specific info.
- size_t vendor_info_len = rand() % 16 + 4;
+ size_t vendor_info_len = cper_rand() % 16 + 4;
//Create the section as a whole.
size_t total_len = 40 + (error_structure_num * ARM_ERROR_INFO_SIZE);
@@ -55,7 +55,7 @@
*section_length = total_len;
//Error affinity.
- *(section + 12) = rand() % 4;
+ *(section + 12) = cper_rand() % 4;
//Reserved zero bytes.
UINT32 *validation = (UINT32 *)section;
@@ -87,7 +87,7 @@
for (size_t i = 0; i < vendor_info_len; i++) {
//Ensure only ascii is used so we don't
// fail base64E
- *cur_pos = rand() % 127 + 1;
+ *cur_pos = cper_rand() % 127 + 1;
cur_pos += 1;
}
@@ -106,7 +106,7 @@
*(error_info + 1) = ARM_ERROR_INFO_SIZE;
//Type of error.
- UINT8 error_type = rand() % 3;
+ UINT8 error_type = cper_rand() % 3;
*(error_info + 4) = error_type;
//Reserved bits for error information.
@@ -162,7 +162,7 @@
size_t generate_arm_context_info(void **location)
{
//Initial length is 8 bytes. Add extra based on type.
- UINT16 reg_type = rand() % 9;
+ UINT16 reg_type = cper_rand() % 9;
UINT32 reg_size = 0;
//Set register size.