package org.infinispan.query.backend;
import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
import java.util.Base64;
import java.util.UUID;
import org.infinispan.commons.CacheException;
import org.infinispan.query.Transformer;
import org.infinispan.query.test.CustomKey;
import org.infinispan.query.test.CustomKey2;
import org.infinispan.query.test.CustomKey3;
import org.infinispan.query.test.CustomKey3Transformer;
import org.infinispan.query.test.NonSerializableKey;
import org.infinispan.util.logging.Log;
import org.infinispan.util.logging.LogFactory;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* This is the test class for {@link org.infinispan.query.backend.KeyTransformationHandler}
*
* @author Navin Surtani
* @author Marko Luksa
*/
@Test(groups = "functional", testName = "query.backend.KeyTransformationHandlerTest")
public class KeyTransformationHandlerTest {
String s = null;
Object key = null;
private KeyTransformationHandler keyTransformationHandler;
private static final UUID randomUUID = UUID.randomUUID();
private static final Log log = LogFactory.getLog(KeyTransformationHandlerTest.class);
@BeforeMethod
public void beforeMethod() {
keyTransformationHandler = new KeyTransformationHandler();
}
public void testKeyToStringWithStringAndPrimitives() {
s = keyTransformationHandler.keyToString("key");
assert s.equals("S:key");
s = keyTransformationHandler.keyToString(1);
assert s.equals("I:1");
s = keyTransformationHandler.keyToString(true);
assert s.equals("B:true");
s = keyTransformationHandler.keyToString((short) 1);
assert s.equals("X:1");
s = keyTransformationHandler.keyToString((long) 1);
assert s.equals("L:1");
s = keyTransformationHandler.keyToString((byte) 1);
assert s.equals("Y:1");
s = keyTransformationHandler.keyToString((float) 1);
assert s.equals("F:1.0");
s = keyTransformationHandler.keyToString('A');
assert s.equals("C:A");
s = keyTransformationHandler.keyToString(1.0);
assert s.equals("D:1.0");
s = keyTransformationHandler.keyToString(randomUUID);
assert s.equals("U:"+randomUUID);
byte[] arr = new byte[]{1, 2, 3, 4, 5, 6};
s = keyTransformationHandler.keyToString(arr);
assert s.equals("A:"+ Base64.getEncoder().encodeToString(arr));
}
public void testStringToKeyWithStringAndPrimitives() {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
key = keyTransformationHandler.stringToKey("S:key1", contextClassLoader);
assert key.getClass().equals(String.class);
assert key.equals("key1");
key = keyTransformationHandler.stringToKey("I:2", contextClassLoader);
assert key.getClass().equals(Integer.class);
assert key.equals(2);
key = keyTransformationHandler.stringToKey("Y:3", contextClassLoader);
assert key.getClass().equals(Byte.class);
assert key.equals((byte) 3);
key = keyTransformationHandler.stringToKey("F:4.0", contextClassLoader);
assert key.getClass().equals(Float.class);
assert key.equals((float) 4.0);
key = keyTransformationHandler.stringToKey("L:5", contextClassLoader);
assert key.getClass().equals(Long.class);
assert key.equals((long) 5);
key = keyTransformationHandler.stringToKey("X:6", contextClassLoader);
assert key.getClass().equals(Short.class);
assert key.equals((short) 6);
key = keyTransformationHandler.stringToKey("B:true", contextClassLoader);
assert key.getClass().equals(Boolean.class);
assert key.equals(true);
key = keyTransformationHandler.stringToKey("D:8.0", contextClassLoader);
assert key.getClass().equals(Double.class);
assert key.equals(8.0);
key = keyTransformationHandler.stringToKey("C:9", contextClassLoader);
assert key.getClass().equals(Character.class);
assert key.equals('9');
key = keyTransformationHandler.stringToKey("U:"+randomUUID.toString(), contextClassLoader);
assert key.getClass().equals(UUID.class);
assert key.equals(randomUUID);
byte[] arr = new byte[]{1, 2, 3, 4, 5, 6};
key = keyTransformationHandler.stringToKey("A:" + Base64.getEncoder().encodeToString(arr), contextClassLoader);
assertArrayEquals(arr, (byte[]) key);
}
@Test(expectedExceptions = CacheException.class)
public void testStringToUnknownKey() {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
key = keyTransformationHandler.stringToKey("Z:someKey", contextClassLoader);
}
@Test(expectedExceptions = CacheException.class)
public void testStringToKeyWithInvalidTransformer() {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
key = keyTransformationHandler.stringToKey("T:org.infinispan.InexistentTransformer:key1", contextClassLoader);
}
public void testStringToKeyWithCustomTransformable() {
CustomKey customKey = new CustomKey(88, 8800, 12889976);
String strRep = keyTransformationHandler.keyToString(customKey);
assert customKey.equals(keyTransformationHandler.stringToKey(strRep, Thread.currentThread().getContextClassLoader()));
}
public void testStringToKeyWithDefaultTransformer() {
CustomKey2 ck2 = new CustomKey2(Integer.MAX_VALUE, Integer.MIN_VALUE, 0);
String strRep = keyTransformationHandler.keyToString(ck2);
assert ck2.equals(keyTransformationHandler.stringToKey(strRep, Thread.currentThread().getContextClassLoader()));
}
public void testStringToKeyWithRegisteredTransformer() {
keyTransformationHandler.registerTransformer(CustomKey3.class, CustomKey3Transformer.class);
CustomKey3 key = new CustomKey3("str");
String string = keyTransformationHandler.keyToString(key);
assert key.equals(keyTransformationHandler.stringToKey(string, Thread.currentThread().getContextClassLoader()));
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testStringToKeyWithNoAvailableTransformer() {
CustomKey3 key = new CustomKey3("str");
String string = keyTransformationHandler.keyToString(key);
key.equals(keyTransformationHandler.stringToKey(string, Thread.currentThread().getContextClassLoader()));
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testKeyToStringWithExceptionalTransformer() {
keyTransformationHandler.registerTransformer(CustomKey2.class, ExceptionThrowingTransformer.class);
CustomKey2 key = new CustomKey2(1, 2, 3);
String val = keyTransformationHandler.keyToString(key);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testKeyToStringWithDefaultTransformerForNonSerializableObject() {
NonSerializableKey key = new NonSerializableKey("test");
String val = keyTransformationHandler.keyToString(key);
}
public class ExceptionThrowingTransformer implements Transformer {
public ExceptionThrowingTransformer() {
log.info("Exception Throwing Transformer Constructor");
//simulating exception
int a = 4 / 0;
}
@Override
public Object fromString(String s) {
return null;
}
@Override
public String toString(Object customType) {
return null;
}
}
}