/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use
* this file except in compliance with the License. You may obtain a copy of the License at the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apereo.portal.utils;
import static junit.framework.Assert.assertEquals;
import java.util.Random;
import org.junit.Test;
/**
* Test generation of random tokens
*
*/
public class RandomTokenGeneratorTest {
@Test
public void testTokenGeneration() {
final RandomTokenGenerator randomTokenGenerator = new RandomTokenGenerator(new Random(0));
int length = 0;
String token = randomTokenGenerator.generateRandomToken(++length);
double bits = randomTokenGenerator.getNumberOfRandomBits(length);
int reqLength = randomTokenGenerator.getLengthRequiredForBits((int) Math.floor(bits));
assertEquals("4", token);
assertEquals(
"4.954196310386876",
Double.toString(
bits)); //easier to copy/paste from junit if comparing doubles as strings
assertEquals(length, reqLength);
token = randomTokenGenerator.generateRandomToken(++length);
bits = randomTokenGenerator.getNumberOfRandomBits(length);
reqLength = randomTokenGenerator.getLengthRequiredForBits((int) Math.floor(bits));
assertEquals("4p", token);
assertEquals("9.908392620773752", Double.toString(bits));
assertEquals(length, reqLength);
token = randomTokenGenerator.generateRandomToken(++length);
bits = randomTokenGenerator.getNumberOfRandomBits(length);
reqLength = randomTokenGenerator.getLengthRequiredForBits((int) Math.floor(bits));
assertEquals("df9", token);
assertEquals("14.862588931160627", Double.toString(bits));
assertEquals(length, reqLength);
token = randomTokenGenerator.generateRandomToken(++length);
bits = randomTokenGenerator.getNumberOfRandomBits(length);
reqLength = randomTokenGenerator.getLengthRequiredForBits((int) Math.floor(bits));
assertEquals("379h", token);
assertEquals("19.816785241547503", Double.toString(bits));
assertEquals(length, reqLength);
token = randomTokenGenerator.generateRandomToken(++length);
bits = randomTokenGenerator.getNumberOfRandomBits(length);
reqLength = randomTokenGenerator.getLengthRequiredForBits((int) Math.floor(bits));
assertEquals("kjwar", token);
assertEquals("24.77098155193438", Double.toString(bits));
assertEquals(length, reqLength);
token = randomTokenGenerator.generateRandomToken(++length);
bits = randomTokenGenerator.getNumberOfRandomBits(length);
reqLength = randomTokenGenerator.getLengthRequiredForBits((int) Math.floor(bits));
assertEquals("5arzr6", token);
assertEquals("29.725177862321253", Double.toString(bits));
assertEquals(length, reqLength);
token = randomTokenGenerator.generateRandomToken(++length);
bits = randomTokenGenerator.getNumberOfRandomBits(length);
reqLength = randomTokenGenerator.getLengthRequiredForBits((int) Math.floor(bits));
assertEquals("88kypfr", token);
assertEquals("34.67937417270813", Double.toString(bits));
assertEquals(length, reqLength);
assertEquals(length, reqLength);
token = randomTokenGenerator.generateRandomToken(++length);
bits = randomTokenGenerator.getNumberOfRandomBits(length);
reqLength = randomTokenGenerator.getLengthRequiredForBits((int) Math.floor(bits));
assertEquals("hg7kujrz", token);
assertEquals("39.633570483095006", Double.toString(bits));
assertEquals(length, reqLength);
}
@Test
public void testTokenLengthMath31() {
final RandomTokenGenerator randomTokenGenerator = new RandomTokenGenerator(new Random(0));
for (int length = 0; length < 10000; length++) {
final String token = randomTokenGenerator.generateRandomToken(++length);
final double bits = randomTokenGenerator.getNumberOfRandomBits(length);
final int reqLengthMin =
randomTokenGenerator.getLengthRequiredForBits((int) Math.floor(bits));
final int reqLengthMax =
randomTokenGenerator.getLengthRequiredForBits((int) Math.ceil(bits));
assertEquals(length, token.length());
assertEquals(length, reqLengthMin);
assertEquals(length + 1, reqLengthMax);
}
}
@Test
public void testTokenLengthMath32() {
final RandomTokenGenerator randomTokenGenerator =
new RandomTokenGenerator(
new Random(0),
new char[] {
'2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b',
'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
'z', '_'
});
for (int length = 0; length < 10000; length++) {
final String token = randomTokenGenerator.generateRandomToken(++length);
final double bits = randomTokenGenerator.getNumberOfRandomBits(length);
final int reqLengthMin =
randomTokenGenerator.getLengthRequiredForBits((int) Math.floor(bits));
final int reqLengthMax =
randomTokenGenerator.getLengthRequiredForBits((int) Math.ceil(bits));
assertEquals(length, token.length());
assertEquals(length, reqLengthMin);
assertEquals(length, reqLengthMax);
}
}
}