0
0
mirror of https://github.com/signalapp/Signal-Server.git synced 2024-09-20 12:02:18 +02:00

Use a static sequence of randomness in tests

The RemoteConfigControllerTest#testMath unit test would occassionally
fail because randomness doesn't necessarily group into expected ranges
over a finite trial count. This changes the test to use a predefined
PRNG sequence instead of one that varies with each test so that the
test will no long randomly fail.
This commit is contained in:
Ehren Kret 2020-04-29 17:31:43 -07:00
parent 0c495e7e72
commit 48c324fe86

View File

@ -22,6 +22,7 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
@ -263,12 +264,13 @@ public class RemoteConfigControllerTest {
Map<String, Integer> enabledMap = new HashMap<>();
MessageDigest digest = MessageDigest.getInstance("SHA1");
int iterations = 100000;
SecureRandom secureRandom = new SecureRandom(new byte[]{42}); // the seed value doesn't matter so much as it's constant to make the test not flaky
for (int i=0;i<iterations;i++) {
for (RemoteConfig config : remoteConfigList) {
int count = enabledMap.getOrDefault(config.getName(), 0);
if (RemoteConfigController.isInBucket(digest, UUID.randomUUID(), config.getName().getBytes(), config.getPercentage(), new HashSet<>())) {
if (RemoteConfigController.isInBucket(digest, getRandomUUID(secureRandom), config.getName().getBytes(), config.getPercentage(), new HashSet<>())) {
count++;
}
@ -285,5 +287,13 @@ public class RemoteConfigControllerTest {
}
private static UUID getRandomUUID(SecureRandom secureRandom) {
long mostSignificantBits = secureRandom.nextLong();
long leastSignificantBits = secureRandom.nextLong();
mostSignificantBits &= 0xffffffffffff0fffL;
mostSignificantBits |= 0x0000000000004000L;
leastSignificantBits &= 0x3fffffffffffffffL;
leastSignificantBits |= 0x8000000000000000L;
return new UUID(mostSignificantBits, leastSignificantBits);
}
}