/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.core.system;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.system.windows.RegistryEntry;
import org.rhq.core.system.windows.RegistryEntry.Root;
/**
* Tests the native layer if running on Windows.
*
* @author John Mazzitelli
*/
@Test(groups = "native.system")
public class WindowsTest {
@AfterMethod
@BeforeMethod
public void terminateNativeLibrary() {
try {
SystemInfoFactory.shutdown();
} catch (Throwable ignore) {
}
}
/**
* Will return <code>true</code> if the platform this test is running on is the correct platform needed for the
* tests.
*
* @param testName the name of the test that is asking to be performed
*
* @return <code>true</code> if the platform is the correct one that our tests need
*/
private boolean isCorrectTestPlatform(String testName) {
if (System.getProperty("os.name").indexOf("Windows") == -1) {
System.out.println("~~~ [" + testName + "] Test machine is not the correct platform for this test "
+ "- cannot test the native library");
return false;
}
System.out.println("Running native test: " + testName);
return true;
}
/**
* Tests accessing the registry.
*/
public void testRegistry() {
if (!isCorrectTestPlatform("testRegistry")) {
return;
}
WindowsNativeSystemInfo platform = (WindowsNativeSystemInfo) SystemInfoFactory.createSystemInfo();
Root root = RegistryEntry.Root.HKEY_LOCAL_MACHINE;
String baseKey = "SOFTWARE\\Microsoft";
List<String> keys = platform.getRegistryChildKeys(root, baseKey);
System.out.println("Child registry keys of: " + keys);
assert keys.size() > 0;
for (String key : keys) {
// find a key that has more than 1 value - I assume SOFTWARE/Microsoft has a key that has more than one value
String fullKey = baseKey + "\\" + key;
List<String> names = platform.getRegistryValueNames(root, fullKey);
if (names.size() > 1) {
System.out.println("Value names of registry key [" + fullKey + "]: " + names);
// we found a key that has values - make sure we can get their values and end the test
for (String name : names) {
System.out.print("Value of registry key [" + fullKey + "\\" + name + "]: ");
RegistryEntry entry = platform.getRegistryEntry(root, fullKey, name);
System.out.println(entry);
assert entry.getValue() != null;
}
List<RegistryEntry> entries = platform.getRegistryEntries(root, fullKey);
assert entries.size() == names.size();
break; // end test - don't bother looking for more keys
}
}
}
/**
* Test waiting for a process and killing it if we timeout.
*/
public void testExecuteWithWaitKill() {
if (!isCorrectTestPlatform("testExecuteWithWaitKill")) {
return;
}
SystemInfo platform = SystemInfoFactory.createSystemInfo();
ProcessExecution pe = new ProcessExecution("C:\\WINDOWS\\system32\\sol.exe");
pe.setKillOnTimeout(true);
pe.setWaitForCompletion(1500L);
long before = System.currentTimeMillis();
ProcessExecutionResults results = platform.executeProcess(pe);
long after = System.currentTimeMillis();
assert (after - before) >= 1500L : "Did not wait for 1500ms: Waited=" + (after - before);
assert results.getError() == null : "Failed to exec process: " + results;
}
/**
* Test executing a process.
*/
public void testExecute() {
if (!isCorrectTestPlatform("testExecute")) {
return;
}
SystemInfo platform = SystemInfoFactory.createSystemInfo();
ProcessExecution pe = new ProcessExecution("C:\\WINDOWS\\system32\\cmd.exe");
pe.setWorkingDirectory("C:\\");
pe.setCaptureOutput(true);
pe.setWaitForCompletion(5000L);
pe.setArguments(new String[] { "/C", "dir" });
ProcessExecutionResults results = platform.executeProcess(pe);
assert results.getError() == null : "Failed to exec process: " + results;
assert results.getExitCode().intValue() == 0 : "Failed to get a 0 exit code: " + results;
assert results.getCapturedOutput().length() > 0 : "Missing output";
Map envVars = new HashMap();
envVars.put("WINTESTVAR", "hello there");
pe.setEnvironmentVariables(envVars);
pe.setArguments(new String[] { "/C", "echo", "%WINTESTVAR%" });
results = platform.executeProcess(pe);
assert results.getError() == null : "Failed to exec process: " + results;
assert results.getExitCode().intValue() == 0 : "Failed to get a 0 exit code: " + results;
assert results.getCapturedOutput().length() > 0 : "Missing output";
assert results.getCapturedOutput().indexOf("hello there") > -1 : "Not the expected output: "
+ results.getCapturedOutput();
}
/**
* Tests getting Windows stuff.
*/
public void testWindows() {
if (!isCorrectTestPlatform("testWindows")) {
return;
}
assert SystemInfoFactory.isNativeSystemInfoAvailable() : "Native library should be available";
assert !SystemInfoFactory.isNativeSystemInfoDisabled() : "Native library should not be disabled";
SystemInfo platform = SystemInfoFactory.createSystemInfo();
assert platform != null;
boolean isNative = platform.isNative();
String hostname = platform.getHostname();
String operatingSystemName = platform.getOperatingSystemName();
List<ProcessInfo> processes = platform.getAllProcesses();
assert isNative : "Should have been native";
assert platform instanceof NativeSystemInfo : "Should have be given a NativeSystemInfo object";
assert hostname != null;
assert operatingSystemName != null;
assert processes.size() > 0 : "Should be at least 1 process running";
System.out.println("is-native=" + isNative);
System.out.println("hostname=" + hostname);
System.out.println("os name=" + operatingSystemName);
System.out.println("process count=" + processes.size());
// for ( ProcessInfo process : processes )
// {
// System.out.println( process.getPid() + " " + process.getName() + " : " + process.getCommandLine() );
// }
}
/**
* We don't use JBNATIVE anymore, but let's keep this test anyway.
*/
public void testJBNATIVE16() {
if (!isCorrectTestPlatform("testJBNATIVE16")) {
return;
}
assert SystemInfoFactory.isNativeSystemInfoAvailable() : "Native library should be available";
assert !SystemInfoFactory.isNativeSystemInfoDisabled() : "Native library should not be disabled";
SystemInfo platform = SystemInfoFactory.createSystemInfo();
assert platform != null;
boolean isNative = platform.isNative();
String hostname = platform.getHostname();
String operatingSystemName = platform.getOperatingSystemName();
List<ProcessInfo> processes = platform.getAllProcesses();
assert isNative : "Should have been native";
assert platform instanceof NativeSystemInfo : "Should have be given a NativeSystemInfo object";
assert hostname != null;
assert operatingSystemName != null;
assert processes.size() > 0 : "Should be at least 1 process running";
System.out.println("is-native=" + isNative);
System.out.println("hostname=" + hostname);
System.out.println("os name=" + operatingSystemName);
System.out.println("process count=" + processes.size());
SystemInfoFactory.shutdown();
platform = SystemInfoFactory.createSystemInfo();
ProcessExecution pe = new ProcessExecution("C:\\WINDOWS\\system32\\cmd.exe");
pe.setWorkingDirectory("C:\\");
pe.setCaptureOutput(true);
pe.setWaitForCompletion(5000L);
pe.setArguments(new String[] { "/C", "dir" });
ProcessExecutionResults results = platform.executeProcess(pe);
assert results.getError() == null : "Failed to exec process: " + results;
assert results.getExitCode().intValue() == 0 : "Failed to get a 0 exit code: " + results;
assert results.getCapturedOutput().length() > 0 : "Missing output";
Map envVars = new HashMap();
envVars.put("WINTESTVAR", "hello there");
pe.setEnvironmentVariables(envVars);
pe.setArguments(new String[] { "/C", "echo", "%WINTESTVAR%" });
results = platform.executeProcess(pe);
assert results.getError() == null : "Failed to exec process: " + results;
assert results.getExitCode().intValue() == 0 : "Failed to get a 0 exit code: " + results;
assert results.getCapturedOutput().length() > 0 : "Missing output";
assert results.getCapturedOutput().indexOf("hello there") > -1 : "Not the expected output: "
+ results.getCapturedOutput();
}
}