/* * JBoss, Home of Professional Open Source * Copyright 2009 Red Hat Inc. and/or its affiliates and other * contributors as indicated by the @author tags. All rights reserved. * See the copyright.txt in the distribution for a full listing of * individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.infinispan.loaders.jdbc; import org.infinispan.Cache; import org.infinispan.loaders.CacheLoaderConfig; import org.infinispan.loaders.CacheLoaderException; import org.infinispan.loaders.CacheLoaderManager; import org.infinispan.loaders.CacheStore; import org.infinispan.loaders.jdbc.binary.JdbcBinaryCacheStore; import org.infinispan.loaders.jdbc.mixed.JdbcMixedCacheStore; import org.infinispan.loaders.jdbc.stringbased.JdbcStringBasedCacheStore; import org.infinispan.loaders.jdbc.stringbased.JdbcStringBasedCacheStoreConfig; import org.infinispan.manager.CacheContainer; import org.infinispan.test.AbstractInfinispanTest; import org.infinispan.test.TestingUtil; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.testng.annotations.Test; import java.io.Serializable; import java.sql.Connection; /** * 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 = "loaders.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"); CacheLoaderConfig firstCacheLoaderConfig = first.getConfiguration().getCacheLoaderManagerConfig().getFirstCacheLoaderConfig(); assert firstCacheLoaderConfig != null; CacheLoaderConfig secondCacheLoaderConfig = second.getConfiguration().getCacheLoaderManagerConfig().getFirstCacheLoaderConfig(); assert secondCacheLoaderConfig != null; assert firstCacheLoaderConfig instanceof JdbcStringBasedCacheStoreConfig; assert secondCacheLoaderConfig instanceof JdbcStringBasedCacheStoreConfig; JdbcStringBasedCacheStore firstCs = (JdbcStringBasedCacheStore) TestingUtil.extractComponent(first, CacheLoaderManager.class).getCacheLoader(); JdbcStringBasedCacheStore secondCs = (JdbcStringBasedCacheStore) TestingUtil.extractComponent(second, CacheLoaderManager.class).getCacheLoader(); asserTableExistance(firstCs.getConnectionFactory().getConnection(), "ISPN_STRING_TABLE_second", "ISPN_STRING_TABLE_first", "ISPN_STRING_TABLE"); assertNoOverlapingState(first, second, firstCs, secondCs); } finally { TestingUtil.killCacheManagers(cm); } } public void testForJdbcBinaryCacheStore() throws Exception { CacheContainer cm = null; try { cm = TestCacheManagerFactory.fromXml("configs/binary.xml"); Cache<String, String> first = cm.getCache("first"); Cache<String, String> second = cm.getCache("second"); JdbcBinaryCacheStore firstCs = (JdbcBinaryCacheStore) TestingUtil.extractComponent(first, CacheLoaderManager.class).getCacheLoader(); JdbcBinaryCacheStore secondCs = (JdbcBinaryCacheStore) TestingUtil.extractComponent(second, CacheLoaderManager.class).getCacheLoader(); asserTableExistance(firstCs.getConnectionFactory().getConnection(), "ISPN_BUCKET_TABLE_second", "ISPN_BUCKET_TABLE_first", "IISPN_BUCKET_TABLE"); assertNoOverlapingState(first, second, firstCs, secondCs); } finally { TestingUtil.killCacheManagers(cm); } } @SuppressWarnings("unchecked") public void testForMixedCacheStore() throws Exception { CacheContainer cm = null; try { cm = TestCacheManagerFactory.fromXml("configs/mixed.xml"); Cache first = cm.getCache("first"); Cache second = cm.getCache("second"); JdbcMixedCacheStore firstCs = (JdbcMixedCacheStore) TestingUtil.extractComponent(first, CacheLoaderManager.class).getCacheLoader(); JdbcMixedCacheStore secondCs = (JdbcMixedCacheStore) TestingUtil.extractComponent(second, CacheLoaderManager.class).getCacheLoader(); asserTableExistance(firstCs.getConnectionFactory().getConnection(), "ISPN_MIXED_STR_TABLE_second", "ISPN_MIXED_STR_TABLE_first", "ISPN_MIXED_STR_TABLE"); asserTableExistance(firstCs.getConnectionFactory().getConnection(), "ISPN_MIXED_BINARY_TABLE_second", "ISPN_MIXED_BINARY_TABLE_first", "ISPN_MIXED_BINARY_TABLE"); assertNoOverlapingState(first, second, firstCs, secondCs); Person person1 = new Person(29, "Mircea"); Person person2 = new Person(29, "Manik"); first.put("k", person1); assert firstCs.containsKey("k"); assert !secondCs.containsKey("k"); assert first.get("k").equals(person1); assert second.get("k") == null; second.put("k2", person2); assert second.get("k2").equals(person2); assert first.get("k2") == null; } finally { TestingUtil.killCacheManagers(cm); } } static class Person implements Serializable { 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 asserTableExistance(Connection connection, String secondTable, String firstTable, String tablePrefix) throws Exception { assert !TableManipulationTest.existsTable(connection, tablePrefix) : "this table should not exist!"; assert TableManipulationTest.existsTable(connection, firstTable); assert TableManipulationTest.existsTable(connection, secondTable); connection.close(); } private void assertNoOverlapingState(Cache<String, String> first, Cache<String, String> second, CacheStore firstCs, CacheStore secondCs) throws CacheLoaderException { first.put("k", "v"); assert firstCs.containsKey("k"); assert !secondCs.containsKey("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; } }