package org.infinispan.server.test.cs.jdbc.multinode;
import static org.infinispan.server.test.util.ITestUtils.createMemcachedClient;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import org.infinispan.arquillian.core.RunningServer;
import org.infinispan.arquillian.core.WithRunningServer;
import org.infinispan.server.test.category.CacheStore;
import org.infinispan.server.test.cs.jdbc.AbstractJdbcStoreMultinodeIT;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* Tests cache operations in Invalidation mode. There's a cluster of 2 nodes
* backed by a common database (shared) accessed via jdbc string-based cache store.
*
* @author Martin Gencur
*/
@Category(CacheStore.class)
@WithRunningServer({
@RunningServer(name = "jdbc-cachestore-1", config = "testsuite/jdbc-string-invalidation.xml"),
@RunningServer(name = "jdbc-cachestore-2", config = "testsuite/jdbc-string-invalidation.xml")
})
public class StringBasedStoreInvalidationCacheSyncIT extends AbstractJdbcStoreMultinodeIT {
private final String TABLE_NAME_PREFIX = "STRING_INVALIDATION";
private final String CACHE_NAME = "memcachedCache";
private final String MANAGER_NAME = "clustered";
@Override
@Before
public void setUp() throws Exception {
super.setUp();
mc1 = createMemcachedClient(server1);
mc2 = createMemcachedClient(server2);
assertCleanCache();
}
@Test
public void testResurrectEntry() throws Exception {
mc1.set("key", "value");
assertEquals("value", mc1.get("key"));
assertNotNull(dbServer1.stringTable.getValueByKey("key")); //stored in DB
assertEquals(0, server2.getCacheManager(MANAGER_NAME).getCache(CACHE_NAME).getNumberOfEntriesInMemory()); //not replicated
assertEquals("value", mc2.get("key")); //load from DB
mc1.set("key", "newValue1");
assertEquals("newValue1", mc1.get("key"));
assertEquals(0, server2.getCacheManager(MANAGER_NAME).getCache(CACHE_NAME).getNumberOfEntriesInMemory()); //invalidated/removed
assertEquals("newValue1", mc2.get("key")); //load from DB
mc2.set("key", "newValue2");
assertEquals("newValue2", mc2.get("key"));
assertEquals(0, server1.getCacheManager(MANAGER_NAME).getCache(CACHE_NAME).getNumberOfEntriesInMemory()); //invalidated/removed
assertEquals("newValue2", mc1.get("key")); //load from DB
}
@Test
public void testRemoveEntry() throws Exception {
mc1.set("key", "value");
assertEquals("value", mc1.get("key"));
assertEquals("value", mc2.get("key")); //load via DB
mc2.delete("key");
assertEquals(null, mc1.get("key"));
assertEquals(null, mc2.get("key"));
assertEquals(null, dbServer1.stringTable.getValueByKey("key"));
}
@Test
public void testRemoveNonExistentEntry() throws Exception {
mc1.set("key", "value");
assertEquals("value", mc1.get("key"));
assertEquals(1, server1.getCacheManager(MANAGER_NAME).getCache(CACHE_NAME).getNumberOfEntriesInMemory());
assertEquals(0, server2.getCacheManager(MANAGER_NAME).getCache(CACHE_NAME).getNumberOfEntriesInMemory()); //not replicated
mc2.delete("key"); //delete from the other cache (the entry is not here)
assertEquals(null, mc1.get("key"));
assertEquals(null, mc2.get("key"));
assertEquals(null, dbServer1.stringTable.getValueByKey("key"));
}
private void assertCleanCache() throws Exception {
mc1.delete("key");
mc2.delete("key");
assertEquals(0, server1.getCacheManager(MANAGER_NAME).getCache(CACHE_NAME).getNumberOfEntries());
assertEquals(0, server2.getCacheManager(MANAGER_NAME).getCache(CACHE_NAME).getNumberOfEntries());
assertEquals(2, server1.getCacheManager(MANAGER_NAME).getClusterSize());
assertEquals(2, server2.getCacheManager(MANAGER_NAME).getClusterSize());
}
@Override
protected void dBServers() {
dbServer1.connectionUrl = System.getProperty("connection.url");
dbServer1.username = System.getProperty("username");
dbServer1.password = System.getProperty("password");
dbServer1.bucketTableName = null;
dbServer1.stringTableName = TABLE_NAME_PREFIX + "_" + CACHE_NAME;
dbServer2.connectionUrl = System.getProperty("connection.url");
dbServer2.username = System.getProperty("username");
dbServer2.password = System.getProperty("password");
dbServer2.bucketTableName = null;
dbServer2.stringTableName = TABLE_NAME_PREFIX + "_" + CACHE_NAME;
}
protected String managerName() {
return MANAGER_NAME;
}
protected String cacheName() {
return CACHE_NAME;
}
}