package org.infinispan.persistence.jdbc;
import static org.testng.AssertJUnit.assertEquals;
import java.io.Serializable;
import java.sql.Connection;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.StoreConfiguration;
import org.infinispan.manager.CacheContainer;
import org.infinispan.marshall.core.ExternalPojo;
import org.infinispan.persistence.jdbc.configuration.JdbcStringBasedStoreConfiguration;
import org.infinispan.persistence.jdbc.stringbased.JdbcStringBasedStore;
import org.infinispan.persistence.jdbc.table.management.TableName;
import org.infinispan.persistence.spi.CacheLoader;
import org.infinispan.persistence.spi.PersistenceException;
import org.infinispan.test.AbstractInfinispanTest;
import org.infinispan.test.TestingUtil;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.testng.annotations.Test;
/**
* Test to make sure that no two caches will use the same table for storing data.
*
* @author Mircea.Markus@jboss.com
*/
@Test(groups = "functional", testName = "persistence.jdbc.TableNameUniquenessTest")
public class TableNameUniquenessTest extends AbstractInfinispanTest {
public void testForJdbcStringBasedCacheStore() throws Exception {
CacheContainer cm = null;
try {
cm = TestCacheManagerFactory.fromXml("configs/string-based.xml");
Cache<String, String> first = cm.getCache("first");
Cache<String, String> second = cm.getCache("second");
StoreConfiguration firstCacheLoaderConfig = first.getCacheConfiguration().persistence().stores().get(0);
StoreConfiguration secondCacheLoaderConfig = second.getCacheConfiguration().persistence().stores().get(0);
assertEquals(JdbcStringBasedStoreConfiguration.class, firstCacheLoaderConfig.getClass());
assertEquals(JdbcStringBasedStoreConfiguration.class, secondCacheLoaderConfig.getClass());
JdbcStringBasedStore firstCs = (JdbcStringBasedStore) TestingUtil.getFirstLoader(first);
JdbcStringBasedStore secondCs = (JdbcStringBasedStore) TestingUtil.getFirstLoader(second);
assertTableExistence(firstCs.getConnectionFactory().getConnection(), firstCs.getTableManager().getIdentifierQuoteString(),
"second", "first", "ISPN_STRING_TABLE");
assertNoOverlapingState(first, second, firstCs, secondCs);
} finally {
TestingUtil.killCacheManagers(cm);
}
}
static class Person implements Serializable, ExternalPojo {
int age;
String name;
private static final long serialVersionUID = 4227565864228124235L;
Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
if (age != person.age) return false;
if (name != null ? !name.equals(person.name) : person.name != null) return false;
return true;
}
@Override
public int hashCode() {
int result = age;
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
}
}
private void assertTableExistence(Connection connection, String identifierQuote, String secondTable, String firstTable, String tablePrefix) throws Exception {
assert !TableManagerTest.existsTable(connection, new TableName(identifierQuote, tablePrefix, "")) : "this table should not exist!";
assert TableManagerTest.existsTable(connection, new TableName(identifierQuote, tablePrefix, firstTable));
assert TableManagerTest.existsTable(connection, new TableName(identifierQuote, tablePrefix, secondTable));
connection.close();
}
private void assertNoOverlapingState(Cache first, Cache second, CacheLoader firstCs, CacheLoader secondCs) throws PersistenceException {
first.put("k", "v");
assert firstCs.contains("k");
assert !secondCs.contains("k");
assert first.get("k").equals("v");
assert second.get("k") == null;
second.put("k2", "v2");
assert second.get("k2").equals("v2");
assert first.get("k2") == null;
}
}