1 # 
   2 # Copyright (c) 2007 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  20 # CA 95054 USA or visit www.sun.com if you need additional information or
  21 # have any questions.
  22 #
  23 # @test
  24 # @bug 4212439 5102289 6272156
  25 # @summary Tests for expiration control and reloading expired resource bundles.
  26 # @build ExpirationTest
  27 # @run shell/timeout=300 ExpirationTest.sh
  28 
  29 #
  30 # Timings of the test sequence
  31 #
  32 # 0         5    7      10             20             40  [seconds]
  33 # +---------+----+------+------//------+------//------+--
  34 # g         X    g      X              U              g   [event]
  35 #
  36 #  0 g - java starts; the first getBundle call gets "German";
  37 #        sleep for 7 sec
  38 #  5 X - the bundle expires (every 5 seconds)
  39 #  7 g - java wakes up; the second getBundle call still gets "German";
  40 #        sleep for 33 sec
  41 # 10 X - the bundle expires in the cache
  42 # 20 U - shell script updates DE and add AT
  43 # 40 g - java wakes up; third getBundle call; gets "Deutsch"
  44 #
  45 # event: g - getBundle, X - eXpire, U - Update
  46 #
  47 #
  48 # ExpirationTest.java uses 3 exit values.
  49 #  0 - passed
  50 #  1 - failed
  51 #  2 - can't proceed due to slow platform
  52 #
  53 
  54 # Check environment variables
  55 if [ "x$TESTJAVA" = "x" ]; then
  56     1>&2 echo "No TESTJAVA defined. exiting..."
  57     exit 1
  58 fi
  59 
  60 # Make sure that this test is run in C locale
  61 LANG=C
  62 export LANG
  63 LC_ALL=
  64 export LC_ALL
  65 
  66 : ${TESTCLASSES:=.}
  67 
  68 # YES if the platform has %s support in date
  69 HAS_S=NO
  70 
  71 case "`uname`" in
  72 Windows* | CYGWIN* )
  73     DEL=";"
  74     ;;
  75 SunOS)
  76     DEL=":"
  77     ;;
  78 Linux)
  79     DEL=":"
  80     HAS_S=YES
  81     ;;
  82 esac
  83 
  84 # Interval until resources are updated
  85 INTERVAL=20
  86 
  87 DATA=ExpirationData
  88 
  89 ROOT=${DATA}.properties
  90 JA=${DATA}_ja.properties
  91 DE=${DATA}_de.properties
  92 AT=${DATA}_de_AT.properties
  93 
  94 JARFILE=data.jar
  95 
  96 createProperties() {
  97     rm -f ${DATA}*.properties
  98     echo "data: English" > $ROOT
  99     (echo "data: Japanese"; echo "january: 1gatsu") > $JA
 100     (echo "data: German"; echo "january: Januar") > $DE
 101     echo "Properties files have been created at `date +%T`"
 102 }
 103 
 104 createJar() {
 105     if [ "$FORMAT" = "properties" ]; then
 106         createProperties
 107         F="${DATA}*.properties"
 108     else
 109         createClasses
 110         F="-C classes ${ROOT}.class -C classes ${JA}.class -C classes ${DE}.class"
 111     fi
 112     ${TESTJAVA}/bin/jar cf $JARFILE $F
 113     ${TESTJAVA}/bin/jar tvf $JARFILE
 114     rm -f ${DATA}*.properties
 115     echo "Jar created at `date +%T`"
 116 }
 117 
 118 createClasses() {
 119     rm -f ${DATA}*.java
 120     rm -rf classes
 121     mkdir classes
 122     createJava $ROOT English
 123     createJava $JA Japanese
 124     createJava $DE German Januar
 125     ${TESTJAVA}/bin/javac -d classes ${ROOT}.java ${JA}.java ${DE}.java
 126     echo "Created" classes/*.class "at `date +%T`"
 127 }
 128 
 129 createJava() {
 130     (echo "
 131 import java.util.*;
 132 
 133 public class $1 extends ListResourceBundle {
 134     public Object[][] getContents() {
 135         return new Object[][] {
 136             { \"data\", \"$2\" },"
 137     if [ "x$3" != "x" ]; then
 138         echo "      { \"january\", \"$3\" },"
 139     fi
 140 echo "  };
 141     }
 142 }") >$1.java
 143 }
 144 
 145 updateDEaddAT() {
 146     rm -f $DE
 147     (echo "data=Deutsch"; echo "january=Januar") > $DE
 148     # add de_AT
 149     echo "january=J\u00e4nner" > $AT
 150     echo "Updated '"${DE}"' and added '"${AT}"' at `date +%T`"
 151 }
 152 
 153 updateClassDEaddClassAT() {
 154     rm -f $DE.java classes/$DE.class
 155     createJava $DE Deutsch Januar
 156     ${TESTJAVA}/bin/javac -d classes ${DE}.java
 157     createJava $AT Deutsch "J\\u00e4nner"
 158     ${TESTJAVA}/bin/javac -d classes ${AT}.java
 159     echo "Updated '"${DE}"' class and added '"${AT}"' class at `date +%T`"
 160 }
 161 
 162 updateJar() {
 163     if [ "$FORMAT" = "properties" ]; then
 164         updateDEaddAT
 165         F="$DE $AT"
 166     else
 167         updateClassDEaddClassAT
 168         F="-C classes ${DE}.class -C classes ${AT}.class"
 169     fi
 170     ${TESTJAVA}/bin/jar uf $JARFILE $F
 171     rm -f $DE $AT
 172     echo "Updated '"${JARFILE}"' at `date +%T`"
 173     ${TESTJAVA}/bin/jar tvf $JARFILE
 174 }
 175 
 176 getSeconds() {
 177     if [ "$HAS_S" = "YES" ]; then
 178         date '+%s'
 179     else
 180         # Returns an approximation of the offset from the Epoch in
 181         # seconds.
 182         date -u '+%Y %j %H %M %S' | \
 183         awk '{d=($1-1970)*365.2425; print int(((((((d+$2-1)*24)+$3)*60)+$3)*60)+$5);}'
 184     fi
 185 }
 186 
 187 #
 188 # Execute $1 and check how long it takes
 189 #
 190 timedExec() {
 191     S=`getSeconds`
 192     eval $1
 193     E=`getSeconds`
 194     D=`expr $E - $S`
 195     #
 196     # If this machine is too slow, give up the further testing.
 197     #
 198     if [ "$D" -gt $2 ]; then
 199         1>&2 echo "This machine took $D seconds to prepare test data," \
 200                   "which is too slow to proceed. Exiting..."
 201         exit 0
 202     fi
 203     unset S
 204     unset E
 205     unset D
 206 }
 207 
 208 checkStatus() {
 209     if [ $1 = 0 ]; then
 210         echo "$2: PASSED"
 211     elif [ $1 != 2 ]; then
 212         echo "$2: FAILED"
 213         exit 1
 214     else
 215         # Just we should't proceed to avoid timing issues.
 216         exit 0
 217     fi
 218 }
 219 
 220 #
 221 # Before starting tests, check the latency with Thread.sleep().
 222 #
 223 ${TESTJAVA}/bin/java -cp "${TESTCLASSES}${DEL}." ExpirationTest -latency
 224 STATUS=$?
 225 if [ $STATUS = 2 ]; then
 226     exit 0
 227 fi
 228 
 229 #
 230 # Tests for properties
 231 #
 232 FORMAT=properties
 233 
 234 #
 235 # Test with plain files (properties)
 236 #
 237 echo "Starting test with properties files at `date +%T`"
 238 
 239 #
 240 # Creates properties files
 241 #
 242 timedExec createProperties 10
 243 
 244 #
 245 # Execute a child process which will update files in $INTERVAL seconds.
 246 #
 247 (sleep $INTERVAL; updateDEaddAT; exit 0) &
 248 
 249 ${TESTJAVA}/bin/java -cp "${TESTCLASSES}${DEL}." ExpirationTest properties file
 250 STATUS=$?
 251 wait
 252 checkStatus $STATUS "Test with properties files"
 253 
 254 #
 255 # Test with jar file if jar is available (properties)
 256 #
 257 if [ -x ${TESTJAVA}/bin/jar ] || [ -x ${TESTJAVA}/bin/jar.exe ]; then
 258     HASJAR=YES
 259 else
 260     HASJAR=NO
 261 fi
 262 
 263 if [ $HASJAR = YES  ]; then
 264     echo ""
 265     echo "Starting test with a jar file (properties) at `date +%T`"
 266 
 267     #
 268     # Create a jar files with properties
 269     #
 270     timedExec createJar 10
 271 
 272     (sleep $INTERVAL; updateJar; exit 0) &
 273     ${TESTJAVA}/bin/java -cp "${TESTCLASSES}${DEL}${JARFILE}" ExpirationTest properties jar
 274     STATUS=$?
 275     wait
 276     checkStatus $STATUS "Test with a jar file (properties)"
 277 fi
 278 
 279 #
 280 # Test for classes
 281 #
 282 
 283 # Note: class-based resource bundles can't be reloaded due to the
 284 # cache support in class loaders. So the results of the test cases
 285 # below are not checked. (Test cases always pass.)
 286 
 287 # If there's no javac available, then give up the test with
 288 # class-based properties.
 289 if [ ! -x ${TESTJAVA}/bin/javac ] && [ ! -x ${TESTJAVA}/bin/javac.exe ]; then
 290     exit 0
 291 fi
 292 
 293 rm -f ${DATA}*.properties $JARFILE
 294 
 295 FORMAT=class
 296 ROOT=`basename $ROOT .properties`
 297 JA=`basename $JA .properties`
 298 DE=`basename $DE .properties`
 299 AT=`basename $AT .properties`
 300 
 301 echo ""
 302 echo "Starting test with class files at `date +%T`"
 303 
 304 #
 305 # Create class files
 306 #
 307 timedExec createClasses 10
 308 
 309 (sleep $INTERVAL; updateClassDEaddClassAT; exit 0) &
 310 ${TESTJAVA}/bin/java -cp "${TESTCLASSES}${DEL}classes" ExpirationTest class file
 311 STATUS=$?
 312 wait
 313 checkStatus $STATUS "Test with class files"
 314 
 315 if [ $HASJAR = YES ]; then
 316     echo ""
 317     echo "Starting test with a jar file (class) at `date +%T`"
 318 
 319     #
 320     # Create a jar file with class files
 321     #
 322     timedExec createJar 10
 323 
 324     (sleep $INTERVAL; updateJar; exit 0) &
 325     ${TESTJAVA}/bin/java -cp "${TESTCLASSES}${DEL}${JARFILE}" ExpirationTest class jar
 326     STATUS=$?
 327     wait
 328     checkStatus $STATUS "Test with a jar file (class)"
 329 fi
 330 
 331 exit 0