package freenet.pluginmanager;
import java.util.Arrays;
import java.util.Random;
import freenet.node.FSParseException;
import freenet.support.IllegalBase64Exception;
import freenet.support.SimpleFieldSet;
import junit.framework.TestCase;
public class PluginStoreTest extends TestCase {
private void check(PluginStore store) throws IllegalBase64Exception, FSParseException {
SimpleFieldSet fs = store.exportStoreAsSFS();
PluginStore copyStore = new PluginStore(fs);
assertEquals(fs.toOrderedString(), copyStore.exportStoreAsSFS().toOrderedString());
}
/** These are not allowed in SFS except base64 encoded when the always allow base64 flag is on.
* So they ARE allowed in PluginStore's. */
private String invalidCharsForSFS = "\r\n"+SimpleFieldSet.KEYVALUE_SEPARATOR_CHAR+
SimpleFieldSet.MULTI_LEVEL_CHAR+SimpleFieldSet.MULTI_VALUE_CHAR;
public void testStringsWithInvalidChars() throws IllegalBase64Exception, FSParseException {
PluginStore store = new PluginStore();
for(int i=0;i<invalidCharsForSFS.length();i++) {
char c = invalidCharsForSFS.charAt(i);
store.strings.put(String.valueOf(c), String.valueOf(c));
}
check(store);
}
public void testRandom() throws IllegalBase64Exception, FSParseException {
Random r = new Random(1234);
PluginStore store = new PluginStore();
addRandomContent(store, r);
check(store);
}
private void addRandomContent(PluginStore store, Random r) {
for(int i=0;i<20;i++) {
store.booleans.put(randomKey(r), r.nextBoolean());
}
for(int i=0;i<20;i++) {
boolean[] list = new boolean[r.nextInt(10)];
for(int j=0;j<list.length;j++) list[j] = r.nextBoolean();
store.booleansArrays.put(randomKey(r), list);
}
for(int i=0;i<20;i++) {
store.integers.put(randomKey(r), r.nextInt());
}
for(int i=0;i<20;i++) {
int[] list = new int[r.nextInt(10)];
for(int j=0;j<list.length;j++) list[j] = r.nextInt();
store.integersArrays.put(randomKey(r), list);
}
for(int i=0;i<20;i++) {
store.longs.put(randomKey(r), r.nextLong());
}
for(int i=0;i<20;i++) {
long[] list = new long[r.nextInt(10)];
for(int j=0;j<list.length;j++) list[j] = r.nextLong();
store.longsArrays.put(randomKey(r), list);
}
for(int i=0;i<20;i++) {
store.shorts.put(randomKey(r), (short)r.nextInt());
}
for(int i=0;i<20;i++) {
short[] list = new short[r.nextInt(10)];
for(int j=0;j<list.length;j++) list[j] = (short)r.nextInt();
store.shortsArrays.put(randomKey(r), list);
}
for(int i=0;i<20;i++) {
store.bytes.put(randomKey(r), (byte)r.nextInt());
}
for(int i=0;i<20;i++) {
byte[] list = new byte[r.nextInt(10)];
r.nextBytes(list);
store.bytesArrays.put(randomKey(r), list);
}
for(int i=0;i<20;i++) {
store.strings.put(randomKey(r), randomKey(r));
}
for(int i=0;i<20;i++) {
String[] list = new String[r.nextInt(10)];
for(int j=0;j<list.length;j++) list[j] = randomKey(r);
store.stringsArrays.put(randomKey(r), list);
}
}
private String randomKey(Random r) {
int len = r.nextInt(20);
char[] c = new char[len];
for(int i=0;i<len;i++) {
c[i] = randomChar(r);
}
return new String(c);
}
private char randomChar(Random r) {
int mode = r.nextInt(3);
if(mode == 0)
return (char)(32 + r.nextInt(95));
else if(mode == 1)
return invalidCharsForSFS.charAt(r.nextInt(invalidCharsForSFS.length()));
else {
while(true) {
char ch = (char) (128+r.nextInt(0xF000-128));
if(Character.isDefined(ch) && (!Character.isHighSurrogate(ch)) &&
(!Character.isISOControl(ch)) && !Character.isSupplementaryCodePoint(ch)) {
return ch;
}
}
}
}
public void testWriteStringArrays() throws IllegalBase64Exception, FSParseException {
String key = "test";
String[] value = new String[] { "tag1", "tag2" };
PluginStore store = new PluginStore();
store.stringsArrays.put(key, value);
SimpleFieldSet fs = store.exportStoreAsSFS();
PluginStore copy = new PluginStore(fs);
assertTrue(Arrays.equals(copy.stringsArrays.get(key), value));
}
}