package org.infinispan.configuration.serializer;
import static org.testng.AssertJUnit.assertEquals;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.infinispan.commons.configuration.attributes.Attribute;
import org.infinispan.commons.configuration.attributes.AttributeSet;
import org.infinispan.commons.util.FileLookupFactory;
import org.infinispan.configuration.cache.AbstractStoreConfiguration;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.cache.StoreConfiguration;
import org.infinispan.configuration.global.GlobalConfiguration;
import org.infinispan.configuration.parsing.ConfigurationBuilderHolder;
import org.infinispan.configuration.parsing.ParserRegistry;
import org.infinispan.test.AbstractInfinispanTest;
import org.testng.annotations.Test;
@Test(groups = "functional")
public abstract class AbstractConfigurationSerializerTest extends AbstractInfinispanTest {
@Test(dataProvider="configurationFiles")
public void configurationSerializationTest(String config) throws Exception {
ParserRegistry registry = new ParserRegistry();
InputStream is = FileLookupFactory.newInstance().lookupFileStrict(config, Thread.currentThread().getContextClassLoader());
ConfigurationBuilderHolder holderBefore = registry.parse(is);
Map<String, Configuration> configurations = new HashMap<>();
for(Map.Entry<String, ConfigurationBuilder> configuration : holderBefore.getNamedConfigurationBuilders().entrySet()) {
configurations.put(configuration.getKey(), configuration.getValue().build());
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
registry.serialize(baos, holderBefore.getGlobalConfigurationBuilder().build(), configurations);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
try {
ConfigurationBuilderHolder holderAfter = registry.parse(bais);
GlobalConfiguration globalConfigurationBefore = holderBefore.getGlobalConfigurationBuilder().build();
GlobalConfiguration globalConfigurationAfter = holderAfter.getGlobalConfigurationBuilder().build();
assertEquals(globalConfigurationBefore.sites().localSite(), globalConfigurationAfter.sites().localSite());
assertEquals(globalConfigurationBefore.security().securityCacheTimeout(), globalConfigurationAfter.security().securityCacheTimeout());
compareAttributeSets("Global", globalConfigurationBefore.globalState().attributes(), globalConfigurationAfter.globalState().attributes());
compareAttributeSets("Global", globalConfigurationBefore.globalJmxStatistics().attributes(), globalConfigurationAfter.globalJmxStatistics().attributes(), "mBeanServerLookup");
compareAttributeSets("Global", globalConfigurationBefore.security().authorization().attributes(), globalConfigurationAfter.security().authorization().attributes());
compareAttributeSets("Global", globalConfigurationBefore.serialization().attributes(), globalConfigurationAfter.serialization().attributes(), "marshaller", "classResolver");
compareAttributeSets("Global", globalConfigurationBefore.transport().attributes(), globalConfigurationAfter.transport().attributes(), "transport");
compareExtraGlobalConfiguration(globalConfigurationBefore, globalConfigurationAfter);
for (String name : holderBefore.getNamedConfigurationBuilders().keySet()) {
Configuration configurationBefore = holderBefore.getNamedConfigurationBuilders().get(name).build();
Configuration configurationAfter = holderAfter.getNamedConfigurationBuilders().get(name).build();
compareAttributeSets(name, configurationBefore.clustering().attributes(), configurationAfter.clustering().attributes());
compareAttributeSets(name, configurationBefore.compatibility().attributes(), configurationAfter.compatibility().attributes(), "marshaller");
compareAttributeSets(name, configurationBefore.eviction().attributes(), configurationAfter.eviction().attributes());
compareAttributeSets(name, configurationBefore.expiration().attributes(), configurationAfter.expiration().attributes());
compareAttributeSets(name, configurationBefore.indexing().attributes(), configurationAfter.indexing().attributes());
compareAttributeSets(name, configurationBefore.locking().attributes(), configurationAfter.locking().attributes());
compareAttributeSets(name, configurationBefore.persistence().attributes(), configurationAfter.persistence().attributes());
compareStores(name, configurationBefore.persistence().stores(), configurationAfter.persistence().stores());
compareAttributeSets(name, configurationBefore.security().authorization().attributes(), configurationAfter.security().authorization().attributes());
compareAttributeSets(name, configurationBefore.storeAsBinary().attributes(), configurationAfter.storeAsBinary().attributes());
compareAttributeSets(name, configurationBefore.transaction().attributes(), configurationAfter.transaction().attributes(), "transaction-manager-lookup");
compareAttributeSets(name, configurationBefore.versioning().attributes(), configurationAfter.versioning().attributes());
compareExtraConfiguration(name, configurationBefore, configurationAfter);
}
} catch (Throwable e) {
System.out.println(new String(baos.toByteArray()));
throw e;
}
}
protected void compareExtraConfiguration(String name, Configuration configurationBefore, Configuration configurationAfter) {
// Do nothing. Subclasses can override to implement their own specific comparison
}
protected void compareExtraGlobalConfiguration(GlobalConfiguration configurationBefore, GlobalConfiguration configurationAfter) {
// Do nothing. Subclasses can override to implement their own specific comparison
}
private void compareStores(String name, List<StoreConfiguration> beforeStores, List<StoreConfiguration> afterStores) {
assertEquals("Configuration "+ name + " stores count mismatch", beforeStores.size(), afterStores.size());
for(int i = 0; i < beforeStores.size(); i++) {
StoreConfiguration beforeStore = beforeStores.get(i);
StoreConfiguration afterStore = afterStores.get(i);
assertEquals("Configuration " + name + " stores class mismatch", beforeStore.getClass(), afterStore.getClass());
compareStoreConfiguration(name, beforeStore, afterStore);
}
}
protected void compareStoreConfiguration(String name, StoreConfiguration beforeStore, StoreConfiguration afterStore) {
if (beforeStore instanceof AbstractStoreConfiguration) {
AbstractStoreConfiguration beforeASC = (AbstractStoreConfiguration) beforeStore;
AbstractStoreConfiguration afterASC = (AbstractStoreConfiguration) afterStore;
compareAttributeSets(name, beforeASC.attributes(), afterASC.attributes());
compareAttributeSets(name, beforeASC.singletonStore().attributes(), afterASC.singletonStore().attributes());
compareAttributeSets(name, beforeASC.async().attributes(), afterASC.async().attributes());
} else {
throw new IllegalArgumentException("Cannot compare stores of type: "+beforeStore.getClass().getName());
}
}
protected void compareAttributeSets(String name, AttributeSet before, AttributeSet after, String... exclude) {
List<String> exclusions = exclude != null ? Arrays.asList(exclude) : Collections.emptyList();
for(Attribute<?> attribute : before.attributes()) {
if (!exclusions.contains(attribute.name()))
assertEquals("Configuration "+name, attribute, after.attribute(attribute.name()));
}
}
}