blob: 77b147f46220f430ddd053b2ff5c5e94ceb86587 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You 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 org.apache.geode.cache30;
import static org.apache.geode.distributed.ConfigurationProperties.CACHE_XML_FILE;
import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
import static org.apache.geode.test.dunit.Assert.fail;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
import org.junit.Rule;
import org.apache.geode.cache.Cache;
import org.apache.geode.distributed.internal.DistributionConfig;
import org.apache.geode.internal.cache.GemFireCacheImpl;
import org.apache.geode.internal.cache.xmlcache.CacheCreation;
import org.apache.geode.internal.cache.xmlcache.CacheXml;
import org.apache.geode.internal.cache.xmlcache.CacheXmlGenerator;
import org.apache.geode.internal.cache.xmlcache.ClientCacheCreation;
import org.apache.geode.test.dunit.Invoke;
import org.apache.geode.test.dunit.cache.internal.JUnit4CacheTestCase;
import org.apache.geode.test.dunit.rules.DistributedRestoreSystemProperties;
import org.apache.geode.test.junit.rules.serializable.SerializableTemporaryFolder;
import org.apache.geode.test.junit.rules.serializable.SerializableTestName;
public class CacheXmlTestCase extends JUnit4CacheTestCase {
/** The file used by this test (method) to initialize the cache */
private File xmlFile;
/** set this to false if a test needs a non-loner distributed system */
static boolean lonerDistributedSystem = true;
private static String previousMemoryEventTolerance;
@Rule
public DistributedRestoreSystemProperties restoreSystemProperties =
new DistributedRestoreSystemProperties();
@Rule
public SerializableTemporaryFolder temporaryFolder = new SerializableTemporaryFolder();
@Rule
public SerializableTestName testName = new SerializableTestName();
@Override
public final void postSetUp() throws Exception {
previousMemoryEventTolerance =
System.setProperty(DistributionConfig.GEMFIRE_PREFIX + "memoryEventTolerance", "1");
disconnectAllFromDS();
}
@Override
public final void preTearDownCacheTestCase() throws Exception {
this.xmlFile = null;
GemFireCacheImpl.testCacheXml = null;
waitForNoRebalancing();
Invoke.invokeInEveryVM(CacheXmlTestCase::waitForNoRebalancing);
if (previousMemoryEventTolerance != null) {
System.setProperty(DistributionConfig.GEMFIRE_PREFIX + "memoryEventTolerance",
previousMemoryEventTolerance);
}
super.preTearDownCacheTestCase();
}
/**
* Some tests run so quickly that the rebalance operation doesn't even have time to start before
* regions are already being destroyed - GEDOE-4312.
*/
private static void waitForNoRebalancing() {
if (cache != null && !cache.isClosed()) {
await().until(() -> {
return cache.getResourceManager().getRebalanceOperations().size() == 0;
});
}
}
@Override
public final void postTearDownCacheTestCase() throws Exception {
disconnectAllFromDS();
}
/**
* The version of GemFire tested by this class. This method should be overridden by subclasses.
*
* @see CacheXml#VERSION_3_0
*/
protected String getGemFireVersion() {
return CacheXml.VERSION_3_0;
}
protected boolean getUseSchema() {
return false;
}
/**
* Sets the file used by this test to initialize the cache
*/
protected void setXmlFile(File xmlFile) {
this.xmlFile = xmlFile;
}
/**
* Finds an XML file with the given name. Looks in $JTESTS.
*/
protected File findFile(String fileName) throws IOException {
return copyResourceToDirectory(this.temporaryFolder.getRoot(), fileName);
// String path = TestUtil.getResourcePath(getClass(), fileName);
// return new File(path);
}
protected File copyResourceToDirectory(File directory, String fileName) throws IOException {
URL url = getClass().getResource(fileName);
File file = new File(directory, fileName);
FileUtils.copyURLToFile(url, file);
return file;
}
@Override
public Properties getDistributedSystemProperties() {
Properties props = super.getDistributedSystemProperties();
if (this.xmlFile != null) {
props.setProperty(CACHE_XML_FILE, this.xmlFile.toString());
}
// make it a loner
if (lonerDistributedSystem) {
props.setProperty(MCAST_PORT, "0");
props.setProperty(LOCATORS, "");
}
return props;
}
/**
* Uses the {@link CacheXmlGenerator} to generate an XML file from the given
* {@link CacheCreation}. It then creates a {@link Cache} from the XML and asserts that it is the
* same as the cache described in the <code>CacheCreation</code>.
*/
protected void testXml(CacheCreation creation) throws IOException {
testXml(creation, true);
}
protected void testXml(CacheCreation creation, boolean checkSame) throws IOException {
File root = this.temporaryFolder.getRoot();
File dir = new File(root, "XML_" + getGemFireVersion());
dir.mkdirs();
File file = new File(dir, getUniqueName() + ".xml");
final boolean useSchema = getUseSchema();
final String version = getGemFireVersion();
PrintWriter pw = new PrintWriter(new FileWriter(file), true);
CacheXmlGenerator.generate(creation, pw, useSchema, version);
pw.close();
setXmlFile(file);
boolean client = creation instanceof ClientCacheCreation;
Cache cache = getCache(client);
try {
if (checkSame && !creation.sameAs(cache)) {
StringWriter sw = new StringWriter();
CacheXmlGenerator.generate(creation, new PrintWriter(sw, true), useSchema, version);
CacheXmlGenerator.generate(cache, new PrintWriter(sw, true), useSchema, version);
fail(sw.toString());
}
} catch (RuntimeException re) {
StringWriter sw = new StringWriter();
CacheXmlGenerator.generate(creation, new PrintWriter(sw, true), useSchema, version);
CacheXmlGenerator.generate(cache, new PrintWriter(sw, true), useSchema, version);
fail(sw.toString(), re);
}
}
}