/* * JBoss, Home of Professional Open Source * Copyright 2012 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 copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * 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, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ package org.infinispan.configuration.parsing; import static org.infinispan.test.TestingUtil.INFINISPAN_START_TAG; import static org.infinispan.test.TestingUtil.withCacheManager; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.Configuration; import org.infinispan.manager.DefaultCacheManager; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.test.CacheManagerCallable; import org.infinispan.test.TestingUtil; import org.infinispan.util.concurrent.IsolationLevel; import org.testng.Assert; import org.testng.annotations.Test; @Test(groups = "functional") public class ParserTest { /** * This test makes sure that some named cached values are overridden properly */ public void testNamedCacheOverride() throws Exception { final String cacheName = "asyncRepl"; String xml1 = INFINISPAN_START_TAG + " <namedCache name=\"" + cacheName + "\">\n" + " <clustering mode=\"repl\">\n" + " <stateTransfer fetchInMemoryState=\"false\"/>\n" + " <async useReplQueue=\"false\" asyncMarshalling=\"false\"/>\n" + " </clustering>\n" + " <locking isolationLevel=\"REPEATABLE_READ\" concurrencyLevel=\"1000\" lockAcquisitionTimeout=\"20000\"/>\n" + " <storeAsBinary enabled=\"true\"/>\n" + " <expiration wakeUpInterval=\"23\" lifespan=\"50012\" maxIdle=\"1341\"/>\n" + " </namedCache>\n" + TestingUtil.INFINISPAN_END_TAG; String xml2 = INFINISPAN_START_TAG + " <namedCache name=\"" + cacheName + "\">\n" + " <clustering mode=\"repl\">\n" + " <stateTransfer fetchInMemoryState=\"true\"/>\n" + " <sync replTimeout=\"30000\"/>\n" + " </clustering>\n" + " <locking isolationLevel=\"READ_COMMITTED\" concurrencyLevel=\"30\" lockAcquisitionTimeout=\"25000\"/>\n" + " <storeAsBinary enabled=\"false\"/>\n" + " </namedCache>\n" + TestingUtil.INFINISPAN_END_TAG; ConfigurationBuilderHolder holder = getHolder(xml1, xml2); withCacheManager(new CacheManagerCallable(fromHolder(holder)){ @Override public void call() throws Exception { Configuration c = cm.getCacheConfiguration(cacheName); // These are all overridden values Assert.assertEquals(c.clustering().cacheMode(), CacheMode.REPL_SYNC); Assert.assertEquals(c.clustering().stateTransfer().fetchInMemoryState(), true); Assert.assertEquals(c.clustering().sync().replTimeout(), 30000); Assert.assertEquals(c.locking().isolationLevel(), IsolationLevel.READ_COMMITTED); Assert.assertEquals(c.locking().concurrencyLevel(), 30); Assert.assertEquals(c.locking().lockAcquisitionTimeout(), 25000); Assert.assertEquals(c.storeAsBinary().enabled(), false); // Following should have been taken over from first cache Assert.assertEquals(c.expiration().wakeUpInterval(), 23); Assert.assertEquals(c.expiration().lifespan(), 50012); Assert.assertEquals(c.expiration().maxIdle(), 1341); } }); } /** * This test makes sure that both defaults are applied to a named cache */ public void testDefaultCacheOverride() throws Exception { String xml1 = INFINISPAN_START_TAG + " <default>\n" + " <clustering mode=\"repl\">\n" + " <stateTransfer fetchInMemoryState=\"false\"/>\n" + " <async useReplQueue=\"false\" asyncMarshalling=\"false\"/>\n" + " </clustering>\n" + " <locking isolationLevel=\"REPEATABLE_READ\" concurrencyLevel=\"1000\" lockAcquisitionTimeout=\"20000\"/>\n" + " <storeAsBinary enabled=\"true\"/>\n" + " <expiration wakeUpInterval=\"23\" lifespan=\"50012\" maxIdle=\"1341\"/>\n" + " <jmxStatistics enabled=\"true\"/>\n" + " </default>\n" + TestingUtil.INFINISPAN_END_TAG; String xml2 = INFINISPAN_START_TAG + " <default>\n" + " <clustering mode=\"repl\">\n" + " <stateTransfer fetchInMemoryState=\"true\"/>\n" + " <sync replTimeout=\"30000\"/>\n" + " </clustering>\n" + " <locking isolationLevel=\"READ_COMMITTED\" concurrencyLevel=\"30\" lockAcquisitionTimeout=\"25000\"/>\n" + " <storeAsBinary enabled=\"false\"/>\n" + " </default>\n" + TestingUtil.INFINISPAN_END_TAG; ConfigurationBuilderHolder holder = getHolder(xml1, xml2); withCacheManager(new CacheManagerCallable(fromHolder(holder)){ @Override public void call() throws Exception { Configuration c = cm.getDefaultCacheConfiguration(); // These are all overridden values Assert.assertEquals(c.clustering().cacheMode(), CacheMode.REPL_SYNC); Assert.assertEquals(c.clustering().stateTransfer().fetchInMemoryState(), true); Assert.assertEquals(c.clustering().sync().replTimeout(), 30000); Assert.assertEquals(c.locking().isolationLevel(), IsolationLevel.READ_COMMITTED); Assert.assertEquals(c.locking().concurrencyLevel(), 30); Assert.assertEquals(c.locking().lockAcquisitionTimeout(), 25000); Assert.assertEquals(c.storeAsBinary().enabled(), false); // Following should have been taken over from first cache Assert.assertEquals(c.expiration().wakeUpInterval(), 23); Assert.assertEquals(c.expiration().lifespan(), 50012); Assert.assertEquals(c.expiration().maxIdle(), 1341); Assert.assertEquals(c.jmxStatistics().enabled(), true); } }); } /** * This test makes sure that both defaults are applied to a named cache then * named caches in order are applied to a named cache */ public void testDefaultAndNamedCacheOverride() throws Exception { final String cacheName = "ourCache"; String xml1 = INFINISPAN_START_TAG + " <default>\n" + " <clustering mode=\"repl\">\n" + " <stateTransfer fetchInMemoryState=\"false\"/>\n" + " <async useReplQueue=\"false\" asyncMarshalling=\"false\"/>\n" + " </clustering>\n" + " <locking isolationLevel=\"REPEATABLE_READ\" concurrencyLevel=\"1000\" lockAcquisitionTimeout=\"20000\"/>\n" + " <storeAsBinary enabled=\"true\"/>\n" + " <expiration wakeUpInterval=\"23\" lifespan=\"50012\" maxIdle=\"1341\"/>\n" + " <deadlockDetection enabled=\"true\" spinDuration=\"1221\"/>\n" + " </default>\n" + " <namedCache name=\"" + cacheName + "\">\n" + " <clustering>\n" + " <async useReplQueue=\"true\" replQueueInterval=\"105\" replQueueMaxElements=\"341\"/>\n" + " </clustering>\n" + " <jmxStatistics enabled=\"true\"/>\n" + " <deadlockDetection enabled=\"true\" spinDuration=\"502\"/>\n" + " <deadlockDetection enabled=\"true\" spinDuration=\"1223\"/>\n" + " </namedCache>" + TestingUtil.INFINISPAN_END_TAG; String xml2 = INFINISPAN_START_TAG + " <default>\n" + " <clustering mode=\"repl\">\n" + " <stateTransfer fetchInMemoryState=\"true\"/>\n" + " <sync replTimeout=\"30000\"/>\n" + " </clustering>\n" + " <locking isolationLevel=\"READ_COMMITTED\" concurrencyLevel=\"30\" lockAcquisitionTimeout=\"25000\"/>\n" + " <storeAsBinary enabled=\"false\"/>\n" + " <deadlockDetection enabled=\"true\" spinDuration=\"1222\"/>\n" + " </default>\n" + " <namedCache name=\"" + cacheName + "\">\n" + " <clustering mode=\"dist\">\n" + " <hash numOwners=\"3\" numVirtualNodes=\"51\"/>\n" + " <l1 enabled=\"true\" lifespan=\"12345\"/>\n" + " <async useReplQueue=\"false\"/>\n" + " </clustering>\n" + " <jmxStatistics enabled=\"true\"/>\n" + " <deadlockDetection enabled=\"true\" spinDuration=\"1224\"/>\n" + " </namedCache>" + TestingUtil.INFINISPAN_END_TAG; ConfigurationBuilderHolder holder = getHolder(xml1, xml2); withCacheManager(new CacheManagerCallable(fromHolder(holder)){ @Override public void call() throws Exception { Configuration c = cm.getCacheConfiguration(cacheName); // These are all overridden values Assert.assertEquals(c.clustering().cacheMode(), CacheMode.DIST_ASYNC); Assert.assertEquals(c.clustering().hash().numOwners(), 3); Assert.assertEquals(c.clustering().hash().numVirtualNodes(), 51); Assert.assertEquals(c.clustering().l1().enabled(), true); Assert.assertEquals(c.clustering().l1().lifespan(), 12345); Assert.assertEquals(c.clustering().stateTransfer().fetchInMemoryState(), true); Assert.assertEquals(c.clustering().async().useReplQueue(), false); Assert.assertEquals(c.clustering().async().replQueueInterval(), 105); Assert.assertEquals(c.clustering().async().replQueueMaxElements(), 341); Assert.assertEquals(c.jmxStatistics().enabled(), true); Assert.assertEquals(c.locking().isolationLevel(), IsolationLevel.READ_COMMITTED); Assert.assertEquals(c.locking().concurrencyLevel(), 30); Assert.assertEquals(c.locking().lockAcquisitionTimeout(), 25000); Assert.assertEquals(c.storeAsBinary().enabled(), false); Assert.assertEquals(c.expiration().wakeUpInterval(), 23); Assert.assertEquals(c.expiration().lifespan(), 50012); Assert.assertEquals(c.expiration().maxIdle(), 1341); Assert.assertEquals(c.deadlockDetection().enabled(), true); Assert.assertEquals(c.deadlockDetection().spinDuration(), 1224); } }); } private EmbeddedCacheManager fromHolder(ConfigurationBuilderHolder holder) { return new DefaultCacheManager(holder, true); } private ConfigurationBuilderHolder getHolder(String... xmls) { Parser parser = new Parser(Thread.currentThread().getContextClassLoader()); List<InputStream> streams = new ArrayList<InputStream>(); for (int i = 0; i < xmls.length; ++i) { streams.add(i, new ByteArrayInputStream(xmls[i].getBytes())); } return parser.parse(streams); } }