1 /*
   2  * Copyright (c) 2001, 2016, 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 /*
  25  * @test
  26  * @bug 4322313
  27  * @summary Make sure that new implementation of custom time zone
  28  * support for TimeZone.getTimeZone() works correctly and the
  29  * getDisplayName() methods are locale independent.
  30  * @library /java/text/testlib
  31  */
  32 
  33 import java.io.*;
  34 import java.text.*;
  35 import java.util.*;
  36 
  37 public class Bug4322313 extends IntlTest {
  38     private static final int MPM = 60 * 1000;    /* Milliseconds per minute */
  39     private static final Object[][] VALIDS = {
  40         /* given ID    rawOffset   normalized ID */
  41         {"GMT+00:00",  0,          "GMT+00:00"},
  42         {"GMT+3:04",   184 * MPM,  "GMT+03:04"},
  43         {"GMT+03:04",  184 * MPM,  "GMT+03:04"},
  44         {"GMT+13:42",  822 * MPM,  "GMT+13:42"},
  45         /* ISO-LATIN-1 digits */
  46         {"GMT+\u0030\u0031:\u0032\u0033", 83 * MPM, "GMT+01:23"},
  47 
  48         {"GMT+0",      0,          "GMT+00:00"},
  49         {"GMT+3",      180 * MPM,  "GMT+03:00"},
  50         {"GMT+13",     780 * MPM,  "GMT+13:00"},
  51         {"GMT+034",    34 * MPM,   "GMT+00:34"},
  52         {"GMT+1034",   634 * MPM,  "GMT+10:34"},
  53 
  54         {"GMT-00:00",  0,          "GMT-00:00"},
  55         {"GMT-3:04",   -184 * MPM, "GMT-03:04"},
  56         {"GMT-03:04",  -184 * MPM, "GMT-03:04"},
  57         {"GMT-13:42",  -822 * MPM, "GMT-13:42"},
  58         /* ISO-LATIN-1 digits */
  59         {"GMT-\u0030\u0031:\u0032\u0033", -83 * MPM, "GMT-01:23"},
  60 
  61         {"GMT-0",      0,          "GMT-00:00"},
  62         {"GMT-3",      -180 * MPM, "GMT-03:00"},
  63         {"GMT-13",     -780 * MPM, "GMT-13:00"},
  64         {"GMT-034",    -34 * MPM,  "GMT-00:34"},
  65         {"GMT-1034",   -634 * MPM, "GMT-10:34"},
  66     };
  67 
  68     private static final String[] INVALIDS = {
  69         "GMT+5:8",    "GMT+11:1",    "GMT+23:60",  "GMT+24:13",
  70         "GMT+0a:0A",  "GMT +13:42",  "GMT+ 13:42", "GMT+13 :42",
  71         "GMT+13: 42", "GMT+421:950", "GMT+-13:42", "GMT+!13:42",
  72         "GMT+a",      "GMT+24",      "GMT+060",    "GMT+3003",
  73         "GMT+42195",  "GMT+-1",      "GMT+-15",    " GMT",
  74 
  75         "GMT-5:8",    "GMT-11:1",    "GMT-23:60",  "GMT-24:13",
  76         "GMT-0a:0A",  "GMT -13:42",  "GMT- 13:42", "GMT-13 :42",
  77         "GMT-13: 42", "GMT-421:950", "GMT-+13:42", "GMT-#13:42",
  78         "GMT-a",      "GMT-24",      "GMT-060",    "GMT-2403",
  79         "GMT-42195",  "GMT-+1",      "GMT-+15",    "G M T",
  80         "GMT+09:00 ",
  81     };
  82 
  83     void Test4322313() {
  84         Locale savedLocale = Locale.getDefault();
  85         TimeZone savedTimeZone = TimeZone.getDefault();
  86         boolean err = false;
  87 
  88         Locale[] locs = Locale.getAvailableLocales();
  89         try {
  90             TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
  91 
  92             for (int i = 0; i < locs.length; i++) {
  93                 Locale.setDefault(locs[i]);
  94 
  95                 /* Okay case */
  96                 for (int k = 0; k < VALIDS.length; k++) {
  97                     TimeZone tz = TimeZone.getTimeZone((String)VALIDS[k][0]);
  98                     int offset;
  99 
 100                     if (!tz.getID().equals(VALIDS[k][2])) {
 101                         err = true;
 102                         System.err.println("\tFailed [Locale=" +
 103                                            Locale.getDefault() + ", \"" + VALIDS[k][0] +
 104                                            "\"] Invalid TimeZone ID, expected:" +
 105                                            VALIDS[k][2] + ", got:" + tz.getID() + ", " + tz);
 106                     } else {
 107                         logln("\tPassed [Locale=" +
 108                               Locale.getDefault() + ", \"" + VALIDS[k][0] +
 109                               "\"] Valid TimeZone ID, got:" + VALIDS[k][2]);
 110                     }
 111 
 112                     offset = tz.getRawOffset();
 113                     if (offset != (int)VALIDS[k][1]) {
 114                         err = true;
 115                         System.err.println("\tFailed [Locale=" +
 116                                            Locale.getDefault() + ", \"" + VALIDS[k][0] +
 117                                            "\"] Invalid RawOffset, expected:" + VALIDS[k][1] +
 118                                            ", got:" + offset + ", " + tz);
 119                     } else {
 120                         logln("\tPassed [Locale=" +
 121                               Locale.getDefault() + ", \"" + VALIDS[k][0] +
 122                               "\"] Vaild RawOffset, got:" + offset);
 123                     }
 124 
 125                     offset = tz.getDSTSavings();
 126                     if (offset != 0) {
 127                         err = true;
 128                         System.err.println("\tFailed [Locale=" +
 129                                            Locale.getDefault() + ", \"" + VALIDS[k][0] +
 130                                            "\"] DSTSavings should be zero, got:" + offset +
 131                                            ", " + tz);
 132                     } else {
 133                         logln("\tPassed [Locale=" +
 134                               Locale.getDefault() + ", \"" + VALIDS[k][0] +
 135                               "\"] DSTSavings is zero.");
 136                     }
 137                 }
 138 
 139                 /* Error case */
 140                 for (int k=0; k < INVALIDS.length; k++) {
 141                     TimeZone tz = TimeZone.getTimeZone(INVALIDS[k]);
 142                     int offset;
 143 
 144                     if (!tz.getID().equals("GMT")) {
 145                         err = true;
 146                         System.err.println("\tFailed [Locale=" +
 147                                            Locale.getDefault() + ", \"" + INVALIDS[k] +
 148                                            "\"] Invalid TimeZone ID, expected:GMT, got:" +
 149                                            tz.getID() + ", " + tz);
 150                     } else {
 151                         logln("\tPassed [Locale=" +
 152                               Locale.getDefault() + ", \"" + INVALIDS[k] +
 153                               "\"] Valid TimeZone ID, got:" + tz.getID());
 154                     }
 155 
 156                     offset = tz.getRawOffset();
 157                     if (offset != 0) {
 158                         err = true;
 159                         System.err.println("\tFailed [Locale=" +
 160                                            Locale.getDefault() + ", \"" + INVALIDS[k] +
 161                                            "\"] RawOffset should be zero, got:" + offset +
 162                                            ", " + tz);
 163                     } else {
 164                         logln("\tPassed [Locale=" +
 165                               Locale.getDefault() + ", \"" + INVALIDS[k] +
 166                               "\"] RawOffset is zero.");
 167                     }
 168 
 169                     offset = tz.getDSTSavings();
 170                     if (offset != 0) {
 171                         err = true;
 172                         System.err.println("\tFailed [Locale=" +
 173                                            Locale.getDefault() + ", \"" + INVALIDS[k] +
 174                                            "\"] DSTSavings should be zero, got:" + offset +
 175                                            ", " + tz);
 176                     } else {
 177                         logln("\tPassed [Locale=" +
 178                               Locale.getDefault() + ", \"" + INVALIDS[k] +
 179                               "\"] DSTSavings is zero.");
 180                     }
 181                 }
 182 
 183                 // getDisplayName() tests
 184                 {
 185                     String normalizedID = "GMT-08:00";
 186                     TimeZone tz = TimeZone.getTimeZone("GMT-8");
 187                     String s;
 188                     s = tz.getDisplayName(true, tz.LONG);
 189                     if (!normalizedID.equals(s)) {
 190                         err = true;
 191                         System.err.println("getDisplayName returned unexpected name: " + s +
 192                                            " in " + Locale.getDefault());
 193                     }
 194                     s = tz.getDisplayName(true, tz.SHORT);
 195                     if (!normalizedID.equals(s)) {
 196                         err = true;
 197                         System.err.println("getDisplayName returned unexpected name: " + s +
 198                                            " in " + Locale.getDefault());
 199                     }
 200                     s = tz.getDisplayName(false, tz.LONG);
 201                     if (!normalizedID.equals(s)) {
 202                         err = true;
 203                         System.err.println("getDisplayName returned unexpected name: " + s +
 204                                            " in " + Locale.getDefault());
 205                     }
 206                     s = tz.getDisplayName(false, tz.SHORT);
 207                     if (!normalizedID.equals(s)) {
 208                         err = true;
 209                         System.err.println("getDisplayName returned unexpected name: " + s +
 210                                            " in " + Locale.getDefault());
 211                     }
 212                 }
 213             }
 214         } finally {
 215             Locale.setDefault(savedLocale);
 216             TimeZone.setDefault(savedTimeZone);
 217         }
 218         if (err) {
 219             errln("TimeZone.getTimeZone() test failed");
 220         } else {
 221             logln("TimeZone.getTimeZone() test passed");
 222         }
 223     }
 224 
 225     public static void main (String[] args) throws Exception {
 226         new Bug4322313().run(args);
 227     }
 228 }