From 8f99bfa26d0bd99089f0f38af3666a89e8432265 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Mon, 15 Jun 2020 13:18:56 +0900 Subject: [PATCH] tool/lib/minitest/unit.rb: Reproducible shuffle of test suites ... based on CRC32 of names of the test suites. Formerly, `make test-all` randomized the order of the test suites by using `Array#shuffle`. It also shows `--seed N` to reproduce the order, but it was not reproducible when a suite set is different. This change sorts the suites by CRC32 hash of the suite names with a salt generated by the seed. --- tool/lib/minitest/unit.rb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tool/lib/minitest/unit.rb b/tool/lib/minitest/unit.rb index 707dcfbf4f..8c2a970349 100644 --- a/tool/lib/minitest/unit.rb +++ b/tool/lib/minitest/unit.rb @@ -1407,7 +1407,18 @@ module MiniTest suites = @@test_suites.keys case self.test_order when :random - suites.shuffle + # shuffle test suites based on CRC32 of their names + salt = "\n" + rand(1 << 32).to_s + crc_tbl = (0..255).map do |i| + (0..7).inject(i) {|c,| (c & 1 == 1) ? (0xEDB88320 ^ (c >> 1)) : (c >> 1) } + end + suites = suites.sort_by do |suite| + crc32 = 0xffffffff + (suite.name + salt).bytes do |data| + crc32 = crc_tbl[(crc32 ^ data) & 0xff] ^ (crc32 >> 8) + end + crc32 ^ 0xffffffff + end when :nosort suites else