1 /*
   2  * Copyright (c) 2004, 2020, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 import java.awt.*;
  25 import java.beans.PropertyChangeEvent;
  26 import java.beans.PropertyChangeListener;
  27 import java.io.InputStream;
  28 
  29 /*
  30  * @test
  31  * @key headful
  32  * @bug 4758438
  33  * @summary Testcase to check the implementation of RFE 4758438
  34  *          The RFE suggests that the GNOME desktop properties
  35  *          should be made accessible through the
  36  *          Toolkit.getDesktopProperty() API.
  37  * @author Girish R (girish.ramachandran@sun.com)
  38  * @author Dmitriy Ermashov (dmitriy.ermashov@oracle.com)
  39  * @run shell rfe4758438.sh
  40  */
  41 
  42 public class rfe4758438 implements PropertyChangeListener {
  43 
  44     enum PROPS {
  45         drag_threshold(
  46                 "org.gnome.settings-daemon.peripherals.mouse drag-threshold",
  47                 "/desktop/gnome/peripherals/mouse/drag_threshold",
  48                 "gnome.Net/DndDragThreshold",
  49                 "int",
  50                 new String[]{"5", "6"}),
  51         double_click(
  52                 "org.gnome.settings-daemon.peripherals.mouse double-click",
  53                 "/desktop/gnome/peripherals/mouse/double_click",
  54                 "gnome.Net/DoubleClickTime",
  55                 "int",
  56                 new String[]{"200","300"}),
  57         cursor_blink(
  58                 "org.gnome.desktop.interface cursor-blink",
  59                 "/desktop/gnome/interface/cursor_blink",
  60                 "gnome.Net/CursorBlink",
  61                 "bool",
  62                 new String[]{"true","false"}),
  63         cursor_blink_time(
  64                 "org.gnome.desktop.interface cursor-blink-time",
  65                 "/desktop/gnome/interface/cursor_blink_time",
  66                 "gnome.Net/CursorBlinkTime",
  67                 "int",
  68                 new String[]{"1000","1500"}),
  69         gtk_theme(
  70                 "org.gnome.desktop.interface gtk-theme",
  71                 "/desktop/gnome/interface/gtk_theme",
  72                 "gnome.Net/ThemeName",
  73                 "string",
  74                 new String[]{"Crux","Simple"});
  75 
  76         public final String gsettings;
  77         public final String gconftool;
  78         public final String java;
  79         public final String type;
  80         public final String[] values;
  81 
  82         PROPS(String gsettings, String gconftool, String java, String type, String[] values){
  83             this.gsettings = gsettings;
  84             this.gconftool = gconftool;
  85             this.java = java;
  86             this.type = type;
  87             this.values = values;
  88         }
  89     }
  90 
  91     static boolean useGsettings;
  92     static String tool;
  93     Toolkit toolkit = Toolkit.getDefaultToolkit();
  94     String changedProperty;
  95     Object changedValue;
  96     Object lock = new Object();
  97 
  98     /**
  99      * Implementation of PropertyChangeListener method
 100      */
 101     public void propertyChange(PropertyChangeEvent event) {
 102         changedProperty = event.getPropertyName();
 103         changedValue = toolkit.getDesktopProperty(changedProperty);
 104         System.out.println("Property "+changedProperty+" changed. Changed value: "+changedValue);
 105         synchronized(lock) {
 106             try {
 107                 lock.notifyAll();
 108             } catch (Exception e) {
 109             }
 110         }
 111     }
 112 
 113     public static void main(String[] args) throws Exception {
 114         useGsettings = System.getProperty("useGsettings").equals("true");
 115         tool = System.getProperty("tool");
 116 
 117         String osName = System.getProperty("os.name");
 118         if (!"Linux".equals(osName))
 119             System.out.println("This test need not be run on this platform");
 120         else
 121             new rfe4758438().doTest();
 122     }
 123 
 124     void doTest() throws Exception {
 125         for (PROPS p : PROPS.values())
 126             toolkit.addPropertyChangeListener(p.java, this);
 127 
 128         for (PROPS p : PROPS.values()) {
 129             Thread.sleep(1000);
 130             doTest(p);
 131         }
 132         System.out.println("Test passed");
 133     }
 134 
 135     /**
 136      * Do the test for each property. Find the current value
 137      * of the property, set the property to a value not equal
 138      * to the current value, check if the propertyChange event
 139      * is triggered. Reset the property to the actual value.
 140      */
 141     void doTest(PROPS property) throws Exception {
 142         //Choose the test value which is not same as the current value
 143         Object obj = toolkit.getDesktopProperty(property.java);
 144         if (obj == null)
 145             throw new RuntimeException("No such property available: " + property.java);
 146 
 147         //For boolean type values, getDesktopProperty method returns Integer objects
 148         if (property.type.equals("bool")) {
 149             if (obj.equals(new Integer(1))) {
 150                 obj = new String("true");
 151             } else {
 152                 obj = new String("false");
 153             }
 154         }
 155         Object value = property.values[0];
 156         if (obj.toString().equals(value)) {
 157             value = property.values[1];
 158         }
 159 
 160         //Create the command to execute
 161         StringBuffer sb = new StringBuffer(tool);
 162         if (useGsettings) {
 163             sb.append(" set ");
 164             sb.append(property.gsettings);
 165             sb.append(" ");
 166         } else {
 167             sb.append(" --set --type=");
 168             sb.append(property.type);
 169             sb.append(" ");
 170             sb.append(property.gconftool);
 171             sb.append(" ");
 172         }
 173         String tempCommand = sb.toString();
 174         sb.append(value.toString());
 175 
 176         //Initialize the variables and execute the command
 177         changedProperty = "";
 178         changedValue = null;
 179         if (executeCommand(sb.toString()) != 0)
 180             throw new RuntimeException("Could not execute the command");
 181 
 182         synchronized(lock) {
 183             try {
 184                 lock.wait(5000);
 185             } catch (Exception e) {
 186             }
 187         }
 188         if (property.type.equals("bool")) {
 189             if (changedValue.equals(new Integer(1))) {
 190                 changedValue = new String("true");
 191             } else {
 192                 changedValue = new String("false");
 193             }
 194         }
 195 
 196         //Check if the event got triggered
 197         if (!changedProperty.equals(property.java)) {
 198             //Reset the property
 199             executeCommand(tempCommand + obj.toString());
 200             throw new RuntimeException("PropertyChangedEvent did not occur for " + property.java);
 201         } else if (!changedValue.toString().equals(value.toString())) {
 202             //Reset the property
 203             executeCommand(tempCommand + obj.toString());
 204             throw new RuntimeException("New value of the property is different from " +
 205                                        "the value supplied");
 206         }
 207 
 208         //Reset the property
 209         executeCommand(tempCommand + obj.toString());
 210     }
 211 
 212     /**
 213      * Uses the gconftool-2 command to change the value of the property.
 214      * Gets the output of the command and prints the output
 215      */
 216     int executeCommand(String command) throws Exception {
 217         System.out.println("Executing " + command);
 218         Process process = Runtime.getRuntime().exec(command);
 219 
 220         InputStream is = process.getInputStream();
 221         InputStream es = process.getErrorStream();
 222         StringBuilder stdout = new StringBuilder();
 223         StringBuilder stderr = new StringBuilder();
 224 
 225         process.waitFor();
 226 
 227         while (is.available() > 0)
 228             stdout.append((char) is.read());
 229 
 230         while (es.available() > 0)
 231             stderr.append((char) es.read());
 232 
 233         if (stdout.length() > 0)
 234             System.out.println(stdout.toString());
 235         if (stderr.length() > 0)
 236             System.err.println(stderr.toString());
 237         return process.exitValue();
 238     }
 239 }