package com.limegroup.gnutella.settings;
import java.util.Properties;
import com.limegroup.gnutella.util.BaseTestCase;
import junit.framework.Test;
import junit.framework.TestSuite;
public class PowerOfTwoSettingTest extends BaseTestCase {
private static final long BIG_POWER_OF_TWO = 1L << 62;
public PowerOfTwoSettingTest(String name) {
super(name);
}
public static void main(java.lang.String[] args) {
junit.textui.TestRunner.run(suite());
}
public static Test suite() {
TestSuite suite = new TestSuite(PowerOfTwoSettingTest.class);
return suite;
}
public void setUp() throws Exception {
}
public void tearDown() {
}
public void testConstructors() throws Exception {
// As of early 2006, {64, 128, 256} are the only legal values we use
PowerOfTwoSetting set64 = new PowerOfTwoSetting(new Properties(), new Properties(),
"", 64, "", 1, BIG_POWER_OF_TWO);
assertEquals("Created setting has unexpected value", 64, set64.getValue());
PowerOfTwoSetting set128 = new PowerOfTwoSetting(new Properties(), new Properties(),
"", 128, "", 1, BIG_POWER_OF_TWO);
assertEquals("Created setting has unexpected value", 128, set128.getValue());
PowerOfTwoSetting set256 = new PowerOfTwoSetting(new Properties(), new Properties(),
"", 256, "", 1, BIG_POWER_OF_TWO);
assertEquals("Created setting has unexpected value", 256, set256.getValue());
// Now test with the real max and min from QRT_TABLE_SIZE_IN_KILOBYTES
set64 = new PowerOfTwoSetting(new Properties(), new Properties(),
"", 64, "", 64, 256);
assertEquals("Created setting has unexpected value", 64, set64.getValue());
set128 = new PowerOfTwoSetting(new Properties(), new Properties(),
"", 128, "", 64, 256);
assertEquals("Created setting has unexpected value", 128, set128.getValue());
set256 = new PowerOfTwoSetting(new Properties(), new Properties(),
"", 256, "", 64, 256);
assertEquals("Created setting has unexpected value", 256, set256.getValue());
}
public void testDefaultValueChecks() throws Exception {
PowerOfTwoSetting setting = null;
try {
setting = new PowerOfTwoSetting(new Properties(), new Properties(),
"", 65, "", 1, BIG_POWER_OF_TWO);
fail("PowerOfTwoSetting has a default value that isn't a power of two.");
} catch (IllegalArgumentException expectedException) {;}
try {
setting = new PowerOfTwoSetting(new Properties(), new Properties(),
"", 192, "", 1, BIG_POWER_OF_TWO);
fail("PowerOfTwoSetting has a default value that isn't a power of two.");
} catch (IllegalArgumentException expectedException) {;}
try {
setting = new PowerOfTwoSetting(new Properties(), new Properties(),
"", 0, "", 1, BIG_POWER_OF_TWO);
fail("PowerOfTwoSetting has a default value that isn't a power of two.");
} catch (IllegalArgumentException expectedException) {;}
try {
setting = new PowerOfTwoSetting(new Properties(), new Properties(),
"", -2, "", 1, BIG_POWER_OF_TWO);
fail("PowerOfTwoSetting has a default value that isn't a power of two.");
} catch (IllegalArgumentException expectedException) {;}
}
public void testSetValue() throws Exception {
long min = 64;
long max = 256;
long defaultValue = 64;
PowerOfTwoSetting setting = new PowerOfTwoSetting(new Properties(), new Properties(),
"", defaultValue, "", min, max);
assertEquals("Created setting has unexpected value", defaultValue, setting.getValue());
setting.setValue(128);
assertEquals("Setting did not accept a legal value.", 128, setting.getValue());
setting.setValue(256);
assertEquals("Setting did not accept a legal value.", 256, setting.getValue());
// Set value from String
setting.setValue("64");
assertEquals("Setting did not accept a legal value.", 64, setting.getValue());
// Test powers of two that are too big or too small
setting.setValue(2*max);
assertEquals("Setting not clipped to max value.", max, setting.getValue());
setting.setValue(min/2);
assertEquals("Setting not clipped to min value.", min, setting.getValue());
// Test values likely to fool naive implementations of power-of-two checking
setting.setValue(192);
assertEquals("Setting didn't properly round value.", 128, setting.getValue());
setting.setValue(96);
assertEquals("Setting didn't prorely round value.", 64, setting.getValue());
setting.setValue(127);
assertEquals("Setting didn't properly round value.", 64, setting.getValue());
setting.setValue(129);
assertEquals("Setting didn't properly round value.", 128, setting.getValue());
setting.setValue(0);
assertEquals("Setting accepted an illegal value.", min, setting.getValue());
setting.setValue(-2);
assertEquals("Setting accepted an illegal value.", min, setting.getValue());
}
public void testNormalizeValue() {
long testValue = BIG_POWER_OF_TWO;
PowerOfTwoSetting setting = new PowerOfTwoSetting(new Properties(), new Properties(),
"", 8, "", 1, BIG_POWER_OF_TWO);
while (testValue > 1) {
setting.setValue(testValue-1);
testValue >>= 1;
assertEquals("Setting failed to properly round "+ ((testValue<<1)-1), testValue, setting.getValue());
}
}
}