/*
* 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.distributed;
import static org.junit.Assert.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.distributed.internal.DistributionManager;
import org.apache.geode.distributed.internal.InternalDistributedSystem;
import org.apache.geode.internal.SystemAdmin;
import org.apache.geode.test.dunit.DistributedTestUtils;
import org.apache.geode.test.dunit.LogWriterUtils;
import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
import org.apache.geode.test.junit.categories.DistributedTest;
import org.apache.geode.test.junit.categories.FlakyTest;
@Category(DistributedTest.class)
public class SystemAdminDUnitTest extends JUnit4DistributedTestCase {
@Override
public final void postSetUp() throws Exception {
disconnect();
}
@Override
public final void preTearDown() throws Exception {
disconnect();
}
public void disconnect() {
// get rid of the command-line distributed system created by SystemAdmin
nullSystem();
InternalDistributedSystem sys = InternalDistributedSystem.getAnyInstance();
if (sys != null && sys.isConnected()) {
LogWriterUtils.getLogWriter().info("disconnecting(3)");
sys.disconnect();
}
}
@Category(FlakyTest.class) // GEODE-1585
@Test
public void testPrintStacks() throws Exception {
// create a gemfire.properties that lets SystemAdmin find the dunit locator
Properties p =
DistributedTestUtils.getAllDistributedSystemProperties(getDistributedSystemProperties());
try {
SystemAdmin.setDistributedSystemProperties(p);
String filename2 = getUniqueName() + "2.txt";
List<String> options = new ArrayList<String>(1);
options.add(filename2);
SystemAdmin.printStacks(options, true);
checkStackDumps(filename2, false);
disconnect();
String filename1 = getUniqueName() + "1.txt";
options.clear();
options.add(filename1);
SystemAdmin.printStacks(options, false);
checkStackDumps(filename1, true);
} finally {
// SystemAdmin calls methods that set these static variables
DistributionManager.isDedicatedAdminVM = false;
DistributionManager.isCommandLineAdminVM = false;
SystemAdmin.setDistributedSystemProperties(null);
}
}
private void checkStackDumps(String filename, boolean isPruned) throws IOException {
File file = new File(filename);
if (!file.exists()) {
fail("printStacks did not create a stack dump");
}
BufferedReader in = new BufferedReader(new FileReader(file));
// look for some threads that shouldn't be there
boolean setting = !isPruned;
boolean foundManagementTask = setting;
boolean foundGCThread = setting;
boolean foundFunctionThread = setting;
String line;
do {
line = in.readLine();
if (line != null) {
if (line.contains("GemFire Garbage Collection"))
foundGCThread = true;
else if (line.contains("Management Task"))
foundManagementTask = true;
else if (line.contains("Function Execution Processor"))
foundFunctionThread = true;
}
} while (line != null);
if (isPruned) {
assertFalse("found a GemFire Garbage Collection thread in stack dump in " + filename,
foundGCThread);
assertFalse("found a Management Task thread in stack dump in " + filename,
foundManagementTask);
assertFalse("found a Function Excecution Processor thread in stack dump in " + filename,
foundFunctionThread);
} else {
assertTrue("found no GemFire Garbage Collection thread in stack dump in " + filename,
foundGCThread);
assertTrue("found no Management Task thread in stack dump in " + filename,
foundManagementTask);
assertTrue("found no Function Excecution Processor thread in stack dump in " + filename,
foundFunctionThread);
}
file.delete();
}
}