blob: f58963c075e457a94504df33e24cbdb393ab7260 [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.brooklyn.qa.longevity;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.brooklyn.qa.longevity.MonitorUtils.ProcessHasStderr;
import org.apache.brooklyn.util.os.Os;
import org.apache.brooklyn.util.text.Strings;
import org.testng.annotations.Test;
import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableMap;
import com.google.common.io.Files;
public class MonitorUtilsTest {
@Test(enabled=false, timeOut=1000) // Demonstrates that process.waitFor() hangs for big output streams
public void testExecuteAndWaitFor() throws Exception {
Process process = createDumpingProcess(false);
process.waitFor();
fail("Should block while waiting to consume process output");
}
@Test(enabled=false, timeOut=1000) // Demonstrates that process.waitFor() hangs for big err streams
public void testExecuteAndWaitForErr() throws Exception {
Process process = createDumpingProcess(true);
process.waitFor();
fail("Should block while waiting to consume process output");
}
@Test(timeOut=1000)
public void testExecuteAndWaitForConsumingOutputStream() throws Exception {
Process process = createDumpingProcess(false);
String out = MonitorUtils.waitFor(process);
assertTrue(out.length() > 100000, "out.size="+out.length());
}
@Test(timeOut=1000, expectedExceptions=IllegalStateException.class)
public void testExecuteAndWaitForConsumingErrorStream() throws Exception {
Process process = createDumpingProcess(true);
MonitorUtils.waitFor(process);
}
private Process createDumpingProcess(boolean writeToErr) throws IOException {
String errSuffix = writeToErr ? " >&2" : "";
//Windows limits the length of the arguments so echo multiple times instead
String bigstr = Strings.repeat("a", 8000);
String bigcmd = Strings.repeat(getSilentPrefix() + "echo " + bigstr + errSuffix + Os.LINE_SEPARATOR, 15);
File file = Os.newTempFile("test-consume", ".bat");
file.setExecutable(true);
Files.write(bigcmd, file, Charsets.UTF_8);
Process process = MonitorUtils.exec(file.getAbsolutePath());
return process;
}
@Test(groups="UNIX")
public void testFindOwnPid() throws Exception {
int ownpid = MonitorUtils.findOwnPid();
assertTrue(ownpid > 0, "ownpid=$ownpid");
assertTrue(MonitorUtils.isPidRunning(ownpid, "java"),"java is not running");
}
@Test(groups="UNIX")
public void testIsPidRunning() throws Exception {
int usedPid = MonitorUtils.findOwnPid();
//the child process will terminate freeing it PID
String[] cmd = new String[]{"bash", "-c", "echo $$"};
Process process = Runtime.getRuntime().exec(cmd);
String out = MonitorUtils.waitFor(process);
int unusedPid = Integer.parseInt(out.trim());
assertTrue(MonitorUtils.isPidRunning(usedPid));
assertFalse(MonitorUtils.isPidRunning(unusedPid));
try {
assertFalse(MonitorUtils.isPidRunning(1234567)); // too large
} catch (ProcessHasStderr e) {
// expected on osx
}
}
@Test(groups="UNIX")
public void testGetRunningPids() throws Exception {
int ownpid = MonitorUtils.findOwnPid();
List<Integer> javapids = MonitorUtils.getRunningPids("java");
assertTrue(javapids.contains(ownpid), "javapids="+javapids+"; ownpid="+ownpid);
}
@Test
public void testIsUrlUp() throws Exception {
assertFalse(MonitorUtils.isUrlUp(new URL("http://localhost/thispathdoesnotexist")));
}
@Test(groups="UNIX")
public void testSearchLog() throws Exception {
String fileContents = "line1\nline2\nline3\n";
File file = File.createTempFile("monitorUtilsTest.testSearchLog", ".txt");
Files.write(fileContents, file, Charsets.UTF_8);
try {
assertEquals(MonitorUtils.searchLog(file, "line1"), Arrays.asList("line1"));
assertEquals(MonitorUtils.searchLog(file, "line1|line2"), Arrays.asList("line1", "line2"));
assertEquals(MonitorUtils.searchLog(file, "textnotthere"), Collections.emptyList());
assertEquals(MonitorUtils.searchLog(file, "line"), Arrays.asList("line1", "line2", "line3"));
} finally {
file.delete();
}
}
@Test(groups="Integration")
public void testMemoryUsage() throws Exception {
int ownpid = MonitorUtils.findOwnPid();
MonitorUtils.MemoryUsage memUsage = MonitorUtils.getMemoryUsage(ownpid);
assertTrue(memUsage.totalInstances > 0, memUsage.toString());
assertTrue(memUsage.totalMemoryBytes > 0, memUsage.toString());
assertEquals(memUsage.getInstanceCounts(), Collections.emptyMap());
MonitorUtils.MemoryUsage memUsage2 = MonitorUtils.getMemoryUsage(ownpid, MonitorUtilsTest.class.getCanonicalName(),0);
assertEquals(memUsage2.getInstanceCounts(), ImmutableMap.of(MonitorUtilsTest.class.getCanonicalName(), 1));
MonitorUtils.MemoryUsage memUsage3 = MonitorUtils.getMemoryUsage(ownpid, MonitorUtilsTest.class.getCanonicalName(), 2);
assertEquals(memUsage3.getInstanceCounts(), Collections.emptyMap());
}
private String getSilentPrefix() {
if (Os.isMicrosoftWindows()) {
return "@";
} else {
return "";
}
}
}