From b99940f33a50cf2ed5eaa39ffcdb00950f15ad27 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 2 May 2022 19:20:25 +0200 Subject: [PATCH] [xxhash] For the streaming tests, randomly select the size to use. Randomize size used with `update`. It'll print "Using user-selected seed {18109872483301276539,2000259725719371} for update size randomness." If a streaming test then fails, you can repeat it using: `odin run . -define:RAND_STATE=18109872483301276539 -define:RAND_INC=2000259725719371` --- core/hash/xxhash/streaming.odin | 4 +++- tests/core/hash/test_core_hash.odin | 28 +++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/core/hash/xxhash/streaming.odin b/core/hash/xxhash/streaming.odin index 68a4920a5..6f630b042 100644 --- a/core/hash/xxhash/streaming.odin +++ b/core/hash/xxhash/streaming.odin @@ -211,7 +211,9 @@ XXH3_update :: #force_inline proc( length := len(input) secret := state.custom_secret[:] if len(state.external_secret) == 0 else state.external_secret[:] - assert(len(input) > 0) + if len(input) == 0 { + return + } state.total_length += u64(length) assert(state.buffered_size <= XXH3_INTERNAL_BUFFER_SIZE) diff --git a/tests/core/hash/test_core_hash.odin b/tests/core/hash/test_core_hash.odin index 86c05fd44..e69490143 100644 --- a/tests/core/hash/test_core_hash.odin +++ b/tests/core/hash/test_core_hash.odin @@ -6,6 +6,8 @@ import "core:time" import "core:testing" import "core:fmt" import "core:os" +import "core:math/rand" +import "core:intrinsics" TEST_count := 0 TEST_fail := 0 @@ -202,6 +204,8 @@ test_xxhash_large :: proc(t: ^testing.T) { for i, v in ZERO_VECTORS { b := many_zeroes[:i] + fmt.printf("[test_xxhash_large] All at once. Size: %v\n", i) + xxh32 := xxhash.XXH32(b) xxh64 := xxhash.XXH64(b) xxh3_64 := xxhash.XXH3_64(b) @@ -218,12 +222,25 @@ test_xxhash_large :: proc(t: ^testing.T) { expect(t, xxh3_128 == v.xxh3_128, xxh3_128_error) } + when #config(RAND_STATE, -1) >= 0 && #config(RAND_INC, -1) >= 0 { + random_seed := rand.Rand{ + state = u64(#config(RAND_STATE, -1)), + inc = u64(#config(RAND_INC, -1)), + } + fmt.printf("Using user-selected seed {{%v,%v}} for update size randomness.\n", random_seed.state, random_seed.inc) + } else { + random_seed := rand.create(u64(intrinsics.read_cycle_counter())) + fmt.printf("Randonly selected seed {{%v,%v}} for update size randomness.\n", random_seed.state, random_seed.inc) + } + // Streamed for i, v in ZERO_VECTORS { b := many_zeroes[:i] - bytes_per_update := []int{1, 42, 13, 7, 16, 5, 23, 74, 1024, 511, 1023, 47} - update_size_idx: int + fmt.printf("[test_xxhash_large] Streamed. Size: %v\n", i) + + // bytes_per_update := []int{1, 42, 13, 7, 16, 5, 23, 74, 1024, 511, 1023, 47} + // update_size_idx: int xxh_32_state, xxh_32_err := xxhash.XXH32_create_state() defer xxhash.XXH32_destroy_state(xxh_32_state) @@ -244,9 +261,10 @@ test_xxhash_large :: proc(t: ^testing.T) { // XXH3_128_update for len(b) > 0 { - update_size := min(len(b), bytes_per_update[update_size_idx % len(bytes_per_update)]) - update_size_idx += 1 - + update_size := min(len(b), rand.int_max(8192, &random_seed)) + if update_size > 4096 { + update_size %= 73 + } xxhash.XXH32_update (xxh_32_state, b[:update_size]) xxhash.XXH64_update (xxh_64_state, b[:update_size])