c05dbac3cb
Reviewed-by: serb
280 lines
9.5 KiB
Java
280 lines
9.5 KiB
Java
/*
|
|
* Copyright (c) 2004, 2022, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This code 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
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
import java.awt.*;
|
|
import java.beans.PropertyChangeEvent;
|
|
import java.beans.PropertyChangeListener;
|
|
import java.io.InputStream;
|
|
|
|
/*
|
|
* @test
|
|
* @key headful
|
|
* @bug 4758438
|
|
* @requires os.family == "linux"
|
|
* @summary Testcase to check the implementation of RFE 4758438
|
|
* The RFE suggests that the GNOME desktop properties
|
|
* should be made accessible through the
|
|
* Toolkit.getDesktopProperty() API.
|
|
* @author Girish R (girish.ramachandran@sun.com)
|
|
* @author Dmitriy Ermashov (dmitriy.ermashov@oracle.com)
|
|
* @run shell rfe4758438.sh
|
|
*/
|
|
|
|
public class rfe4758438 implements PropertyChangeListener {
|
|
|
|
enum PROPS {
|
|
drag_threshold(
|
|
"org.gnome.desktop.peripherals.mouse drag-threshold",
|
|
"org.gnome.settings-daemon.peripherals.mouse drag-threshold",
|
|
"/desktop/gnome/peripherals/mouse/drag_threshold",
|
|
"gnome.Net/DndDragThreshold",
|
|
"int",
|
|
new String[]{"5", "6"}),
|
|
double_click(
|
|
"org.gnome.desktop.peripherals.mouse double-click",
|
|
"org.gnome.settings-daemon.peripherals.mouse double-click",
|
|
"/desktop/gnome/peripherals/mouse/double_click",
|
|
"gnome.Net/DoubleClickTime",
|
|
"int",
|
|
new String[]{"200","300"}),
|
|
cursor_blink(
|
|
"org.gnome.desktop.interface cursor-blink",
|
|
null,
|
|
"/desktop/gnome/interface/cursor_blink",
|
|
"gnome.Net/CursorBlink",
|
|
"bool",
|
|
new String[]{"true","false"}),
|
|
cursor_blink_time(
|
|
"org.gnome.desktop.interface cursor-blink-time",
|
|
null,
|
|
"/desktop/gnome/interface/cursor_blink_time",
|
|
"gnome.Net/CursorBlinkTime",
|
|
"int",
|
|
new String[]{"1000","1500"}),
|
|
gtk_theme(
|
|
"org.gnome.desktop.interface gtk-theme",
|
|
null,
|
|
"/desktop/gnome/interface/gtk_theme",
|
|
"gnome.Net/ThemeName",
|
|
"string",
|
|
new String[]{"Crux","Simple"});
|
|
|
|
public final String gsettings;
|
|
public final String gsettingsFallback;
|
|
public final String gconftool;
|
|
public final String java;
|
|
public final String type;
|
|
public final String[] values;
|
|
|
|
PROPS(
|
|
String gsettings,
|
|
String gsettingsFallback,
|
|
String gconftool,
|
|
String java,
|
|
String type,
|
|
String[] values
|
|
){
|
|
this.gsettings = gsettings;
|
|
this.gsettingsFallback = gsettingsFallback;
|
|
this.gconftool = gconftool;
|
|
this.java = java;
|
|
this.type = type;
|
|
this.values = values;
|
|
}
|
|
}
|
|
|
|
static boolean useGsettings;
|
|
static String tool;
|
|
final Toolkit toolkit = Toolkit.getDefaultToolkit();
|
|
String changedProperty;
|
|
Object changedValue;
|
|
final Object lock = new Object();
|
|
|
|
/**
|
|
* Implementation of PropertyChangeListener method
|
|
*/
|
|
public void propertyChange(PropertyChangeEvent event) {
|
|
changedProperty = event.getPropertyName();
|
|
changedValue = toolkit.getDesktopProperty(changedProperty);
|
|
System.out.println("Property "+changedProperty+" changed. Changed value: "+changedValue);
|
|
synchronized(lock) {
|
|
try {
|
|
lock.notifyAll();
|
|
} catch (Exception ignored) {
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
useGsettings = System.getProperty("useGsettings").equals("true");
|
|
tool = System.getProperty("tool");
|
|
|
|
String osName = System.getProperty("os.name");
|
|
if (!"Linux".equals(osName))
|
|
System.out.println("This test need not be run on this platform");
|
|
else
|
|
new rfe4758438().doTest();
|
|
}
|
|
|
|
void doTest() throws Exception {
|
|
for (PROPS p : PROPS.values())
|
|
toolkit.addPropertyChangeListener(p.java, this);
|
|
|
|
for (PROPS p : PROPS.values()) {
|
|
Thread.sleep(1000);
|
|
doTest(p);
|
|
}
|
|
System.out.println("Test passed");
|
|
}
|
|
|
|
String prepareCommand(PROPS property, boolean useMain) {
|
|
//Create the command to execute
|
|
StringBuffer sb = new StringBuffer(tool);
|
|
if (useGsettings) {
|
|
sb.append(" set ");
|
|
sb.append( useMain
|
|
? property.gsettings
|
|
: property.gsettingsFallback
|
|
);
|
|
sb.append(" ");
|
|
} else {
|
|
sb.append(" --set --type=");
|
|
sb.append(property.type);
|
|
sb.append(" ");
|
|
sb.append(property.gconftool);
|
|
sb.append(" ");
|
|
}
|
|
return sb.toString();
|
|
}
|
|
|
|
int doTestCommand(String cmd) throws Exception {
|
|
//Initialize the variables and execute the command
|
|
changedProperty = "";
|
|
changedValue = null;
|
|
|
|
return executeCommand(cmd);
|
|
}
|
|
|
|
/**
|
|
* Do the test for each property. Find the current value
|
|
* of the property, set the property to a value not equal
|
|
* to the current value, check if the propertyChange event
|
|
* is triggered. Reset the property to the actual value.
|
|
*/
|
|
void doTest(PROPS property) throws Exception {
|
|
//Choose the test value which is not same as the current value
|
|
Object obj = toolkit.getDesktopProperty(property.java);
|
|
if (obj == null)
|
|
throw new RuntimeException("No such property available: " + property.java);
|
|
|
|
//For boolean type values, getDesktopProperty method returns Integer objects
|
|
if (property.type.equals("bool")) {
|
|
if (obj.equals(1)) {
|
|
obj = "true";
|
|
} else {
|
|
obj = "false";
|
|
}
|
|
}
|
|
Object value = property.values[0];
|
|
if (obj.toString().equals(value)) {
|
|
value = property.values[1];
|
|
}
|
|
|
|
String tempCommand = prepareCommand(property, true);
|
|
|
|
int retVal = doTestCommand(tempCommand + value);
|
|
|
|
if (retVal != 0) {
|
|
if (useGsettings && property.gsettingsFallback != null) {
|
|
System.out.printf("Failed:\n\t%s\nTrying fallback:\n\t", tempCommand);
|
|
tempCommand = prepareCommand(property, false);
|
|
System.out.println(tempCommand);
|
|
|
|
retVal = doTestCommand(tempCommand + value);
|
|
}
|
|
|
|
if (retVal != 0) {
|
|
throw new RuntimeException("Could not execute the command");
|
|
}
|
|
}
|
|
|
|
synchronized(lock) {
|
|
try {
|
|
lock.wait(5000);
|
|
} catch (Exception ignored) {
|
|
}
|
|
}
|
|
|
|
if (property.type.equals("bool")) {
|
|
if (changedValue.equals(1)) {
|
|
changedValue = "true";
|
|
} else {
|
|
changedValue = "false";
|
|
}
|
|
}
|
|
|
|
//Check if the event got triggered
|
|
if (!changedProperty.equals(property.java)) {
|
|
//Reset the property
|
|
executeCommand(tempCommand + obj);
|
|
throw new RuntimeException("PropertyChangedEvent did not occur for " + property.java);
|
|
} else if (!changedValue.toString().equals(value.toString())) {
|
|
//Reset the property
|
|
executeCommand(tempCommand + obj);
|
|
throw new RuntimeException("New value of the property is different from " +
|
|
"the value supplied");
|
|
}
|
|
|
|
//Reset the property
|
|
executeCommand(tempCommand + obj);
|
|
}
|
|
|
|
/**
|
|
* Uses the gconftool-2 command to change the value of the property.
|
|
* Gets the output of the command and prints the output
|
|
*/
|
|
int executeCommand(String command) throws Exception {
|
|
System.out.println("Executing " + command);
|
|
Process process = Runtime.getRuntime().exec(command);
|
|
|
|
InputStream is = process.getInputStream();
|
|
InputStream es = process.getErrorStream();
|
|
StringBuilder stdout = new StringBuilder();
|
|
StringBuilder stderr = new StringBuilder();
|
|
|
|
process.waitFor();
|
|
|
|
while (is.available() > 0)
|
|
stdout.append((char) is.read());
|
|
|
|
while (es.available() > 0)
|
|
stderr.append((char) es.read());
|
|
|
|
if (stdout.length() > 0)
|
|
System.out.println(stdout);
|
|
if (stderr.length() > 0)
|
|
System.err.println(stderr);
|
|
return process.exitValue();
|
|
}
|
|
}
|