/*
* Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hazelcast.config;
import com.hazelcast.memory.MemorySize;
import com.hazelcast.memory.MemoryUnit;
import com.hazelcast.test.HazelcastParallelClassRunner;
import com.hazelcast.test.annotation.ParallelTest;
import com.hazelcast.test.annotation.QuickTest;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import java.io.ByteArrayInputStream;
import java.util.Collections;
import java.util.HashMap;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@RunWith(HazelcastParallelClassRunner.class)
@Category({QuickTest.class, ParallelTest.class})
public class ConfigXmlGeneratorTest {
@Test
public void testIfSensitiveDataIsMasked() {
Config cfg = new Config();
SSLConfig sslConfig = new SSLConfig();
sslConfig.setProperty("keyStorePassword", "Hazelcast");
cfg.getNetworkConfig().setSSLConfig(sslConfig);
SymmetricEncryptionConfig symmetricEncryptionConfig = new SymmetricEncryptionConfig();
symmetricEncryptionConfig.setPassword("Hazelcast");
symmetricEncryptionConfig.setSalt("theSalt");
cfg.getNetworkConfig().setSymmetricEncryptionConfig(symmetricEncryptionConfig);
cfg.setLicenseKey("HazelcastLicenseKey");
Config newConfigViaXMLGenerator = getNewConfigViaXMLGenerator(cfg);
SSLConfig generatedSSLConfig = newConfigViaXMLGenerator.getNetworkConfig().getSSLConfig();
assertEquals(generatedSSLConfig.getProperty("keyStorePassword"), ConfigXmlGenerator.MASK_FOR_SESITIVE_DATA);
String secPassword = newConfigViaXMLGenerator.getNetworkConfig().getSymmetricEncryptionConfig().getPassword();
String theSalt = newConfigViaXMLGenerator.getNetworkConfig().getSymmetricEncryptionConfig().getSalt();
assertEquals(secPassword, ConfigXmlGenerator.MASK_FOR_SESITIVE_DATA);
assertEquals(theSalt, ConfigXmlGenerator.MASK_FOR_SESITIVE_DATA);
assertEquals(newConfigViaXMLGenerator.getLicenseKey(), ConfigXmlGenerator.MASK_FOR_SESITIVE_DATA);
assertEquals(newConfigViaXMLGenerator.getGroupConfig().getPassword(), ConfigXmlGenerator.MASK_FOR_SESITIVE_DATA);
}
@Test
public void testReplicatedMapConfigGenerator() {
ReplicatedMapConfig replicatedMapConfig = new ReplicatedMapConfig()
.setName("replicated-map-name")
.setStatisticsEnabled(false)
.setConcurrencyLevel(128)
.addEntryListenerConfig(new EntryListenerConfig("com.hazelcast.entrylistener", false, false));
Config config = new Config()
.addReplicatedMapConfig(replicatedMapConfig);
Config xmlConfig = getNewConfigViaXMLGenerator(config);
ReplicatedMapConfig xmlReplicatedMapConfig = xmlConfig.getReplicatedMapConfig("replicated-map-name");
assertEquals("replicated-map-name", xmlReplicatedMapConfig.getName());
assertFalse(xmlReplicatedMapConfig.isStatisticsEnabled());
assertEquals(128, xmlReplicatedMapConfig.getConcurrencyLevel());
assertEquals("com.hazelcast.entrylistener", xmlReplicatedMapConfig.getListenerConfigs().get(0).getClassName());
}
@Test
public void testCacheQuorumRef() {
CacheSimpleConfig cacheConfig = new CacheSimpleConfig()
.setName("testCache")
.setQuorumName("testQuorum");
Config config = new Config()
.addCacheConfig(cacheConfig);
Config xmlConfig = getNewConfigViaXMLGenerator(config);
CacheSimpleConfig xmlCacheConfig = xmlConfig.getCacheConfig("testCache");
assertEquals("testQuorum", xmlCacheConfig.getQuorumName());
}
@Test
public void testCacheMergePolicy() {
CacheSimpleConfig cacheConfig = new CacheSimpleConfig();
cacheConfig.setName("testCache");
cacheConfig.setMergePolicy("testMergePolicy");
Config config = new Config()
.addCacheConfig(cacheConfig);
Config xmlConfig = getNewConfigViaXMLGenerator(config);
CacheSimpleConfig xmlCacheConfig = xmlConfig.getCacheConfig("testCache");
assertEquals("testMergePolicy", xmlCacheConfig.getMergePolicy());
}
@Test
public void testNativeMemory() {
NativeMemoryConfig nativeMemoryConfig = new NativeMemoryConfig();
nativeMemoryConfig.setEnabled(true);
nativeMemoryConfig.setAllocatorType(NativeMemoryConfig.MemoryAllocatorType.STANDARD);
nativeMemoryConfig.setMetadataSpacePercentage((float) 12.5);
nativeMemoryConfig.setMinBlockSize(50);
nativeMemoryConfig.setPageSize(100);
nativeMemoryConfig.setSize(new MemorySize(20, MemoryUnit.MEGABYTES));
Config config = new Config()
.setNativeMemoryConfig(nativeMemoryConfig);
Config xmlConfig = getNewConfigViaXMLGenerator(config);
NativeMemoryConfig xmlNativeMemoryConfig = xmlConfig.getNativeMemoryConfig();
assertTrue(xmlNativeMemoryConfig.isEnabled());
assertEquals(NativeMemoryConfig.MemoryAllocatorType.STANDARD, nativeMemoryConfig.getAllocatorType());
assertEquals(12.5, nativeMemoryConfig.getMetadataSpacePercentage(), 0.0001);
assertEquals(50, nativeMemoryConfig.getMinBlockSize());
assertEquals(100, nativeMemoryConfig.getPageSize());
assertEquals(new MemorySize(20, MemoryUnit.MEGABYTES).getUnit(), nativeMemoryConfig.getSize().getUnit());
assertEquals(new MemorySize(20, MemoryUnit.MEGABYTES).getValue(), nativeMemoryConfig.getSize().getValue());
}
@Test
public void testMapAttributesConfig() {
MapAttributeConfig attrConfig = new MapAttributeConfig()
.setName("power")
.setExtractor("com.car.PowerExtractor");
MapConfig mapConfig = new MapConfig()
.setName("carMap")
.addMapAttributeConfig(attrConfig);
Config config = new Config()
.addMapConfig(mapConfig);
Config xmlConfig = getNewConfigViaXMLGenerator(config);
MapAttributeConfig xmlAttrConfig = xmlConfig.getMapConfig("carMap").getMapAttributeConfigs().get(0);
assertEquals(attrConfig.getName(), xmlAttrConfig.getName());
assertEquals(attrConfig.getExtractor(), xmlAttrConfig.getExtractor());
}
@Test
public void testMapNearCacheConfig() {
NearCacheConfig nearCacheConfig = new NearCacheConfig()
.setInMemoryFormat(InMemoryFormat.NATIVE)
.setMaxSize(23)
.setEvictionPolicy("LRU")
.setMaxIdleSeconds(42)
.setCacheLocalEntries(true);
MapConfig mapConfig = new MapConfig()
.setName("nearCacheTest")
.setNearCacheConfig(nearCacheConfig);
Config config = new Config()
.addMapConfig(mapConfig);
Config xmlConfig = getNewConfigViaXMLGenerator(config);
NearCacheConfig xmlNearCacheConfig = xmlConfig.getMapConfig("nearCacheTest").getNearCacheConfig();
assertEquals(InMemoryFormat.NATIVE, xmlNearCacheConfig.getInMemoryFormat());
assertEquals(23, xmlNearCacheConfig.getMaxSize());
assertEquals(23, xmlNearCacheConfig.getEvictionConfig().getSize());
assertEquals("LRU", xmlNearCacheConfig.getEvictionPolicy());
assertEquals(EvictionPolicy.LRU, xmlNearCacheConfig.getEvictionConfig().getEvictionPolicy());
assertEquals(42, xmlNearCacheConfig.getMaxIdleSeconds());
assertTrue(xmlNearCacheConfig.isCacheLocalEntries());
}
@Test
public void testWanConfig() {
final HashMap<String, Comparable> props = new HashMap<String, Comparable>();
props.put("prop1", "val1");
props.put("prop2", "val2");
props.put("prop3", "val3");
final WanReplicationConfig wanConfig = new WanReplicationConfig()
.setName("testName")
.setWanConsumerConfig(new WanConsumerConfig().setClassName("dummyClass").setProperties(props));
final WanPublisherConfig publisherConfig = new WanPublisherConfig()
.setGroupName("dummyGroup")
.setClassName("dummyClass")
.setAwsConfig(getDummyAwsConfig())
.setDiscoveryConfig(getDummyDiscoveryConfig());
wanConfig.setWanPublisherConfigs(Collections.singletonList(publisherConfig));
final Config config = new Config().addWanReplicationConfig(wanConfig);
final Config xmlConfig = getNewConfigViaXMLGenerator(config);
ConfigCompatibilityChecker.checkWanConfigs(config.getWanReplicationConfigs(), xmlConfig.getWanReplicationConfigs());
}
private DiscoveryConfig getDummyDiscoveryConfig() {
final DiscoveryStrategyConfig strategyConfig = new DiscoveryStrategyConfig("dummyClass");
strategyConfig.addProperty("prop1", "val1");
strategyConfig.addProperty("prop2", "val2");
final DiscoveryConfig c = new DiscoveryConfig();
c.setNodeFilterClass("dummyNodeFilter");
c.addDiscoveryStrategyConfig(strategyConfig);
c.addDiscoveryStrategyConfig(new DiscoveryStrategyConfig("dummyClass2"));
return c;
}
private AwsConfig getDummyAwsConfig() {
return new AwsConfig().setHostHeader("dummyHost")
.setRegion("dummyRegion")
.setEnabled(false)
.setConnectionTimeoutSeconds(1)
.setAccessKey("dummyKey")
.setIamRole("dummyIam")
.setSecretKey("dummySecretKey")
.setSecurityGroupName("dummyGroupName")
.setTagKey("dummyTagKey")
.setTagValue("dummyTagValue");
}
private static Config getNewConfigViaXMLGenerator(Config config) {
ConfigXmlGenerator configXmlGenerator = new ConfigXmlGenerator();
String xml = configXmlGenerator.generate(config);
ByteArrayInputStream bis = new ByteArrayInputStream(xml.getBytes());
XmlConfigBuilder configBuilder = new XmlConfigBuilder(bis);
return configBuilder.build();
}
}