package org.infinispan.marshall;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import java.net.URL;
import java.net.URLClassLoader;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.test.SingleCacheManagerTest;
import org.infinispan.test.data.Key;
import org.infinispan.test.data.Person;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.infinispan.util.concurrent.ReclosableLatch;
import org.testng.annotations.Test;
/**
* Tests defensive copy logic.
*
* @author Galder ZamarreƱo
* @since 5.3
*/
@Test(groups = "functional", testName = "marshall.DefensiveCopyTest")
public class DefensiveCopyTest extends SingleCacheManagerTest {
@Override
protected EmbeddedCacheManager createCacheManager() throws Exception {
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.storeAsBinary().enable();
return TestCacheManagerFactory.createCacheManager(builder);
}
public void testOriginalReferenceSafety() {
final Integer k = 1;
Person person = new Person("Mr Infinispan");
cache().put(k, person);
assertEquals(person, cache.get(k));
// Change referenced object
person.setName("Ms Hibernate");
// If defensive copies are working as expected,
// it should be same as before
assertEquals(new Person("Mr Infinispan"), cache.get(k));
}
public void testSafetyAfterRetrieving() {
final Integer k = 2;
Person person = new Person("Mr Coe");
cache().put(k, person);
Person cachedPerson = this.<Integer, Person>cache().get(k);
assertEquals(person, cachedPerson);
cachedPerson.setName("Mr Digweed");
assertEquals(new Person("Mr Coe"), cache.get(k));
}
public void testDiffClassloaders() throws Exception {
URL core = ReclosableLatch.class.getProtectionDomain().getCodeSource().getLocation();
URL tests = getClass().getResource("/");
ClassLoader cl1 = new URLClassLoader(new URL[]{core, tests}, null);
ClassLoader cl2 = new URLClassLoader(new URL[]{core, tests}, null);
Object key1 = cl1.loadClass(Key.class.getName()).getConstructor(String.class, Boolean.TYPE).newInstance("key1", false);
Object key2 = cl2.loadClass(Key.class.getName()).getConstructor(String.class, Boolean.TYPE).newInstance("key1", false);
String value = "tralala";
cache.put(key1, value);
Object result = cache.get(key2);
assertNotNull(result);
assertEquals(value, result);
}
}