1 /* 2 * Copyright (c) 2008, 2010, 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. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 /* 27 * @bug 6622366 28 * @summary Utility class used by other jtreg tests 29 */ 30 31 import com.sun.servicetag.RegistrationData; 32 import com.sun.servicetag.ServiceTag; 33 import com.sun.servicetag.Registry; 34 35 import java.util.Set; 36 import java.util.Date; 37 import java.util.Map; 38 import java.util.Properties; 39 import java.util.TimeZone; 40 import java.text.ParseException; 41 import java.text.SimpleDateFormat; 42 import java.io.*; 43 44 public class Util { 45 public static ServiceTag newServiceTag(File f) 46 throws FileNotFoundException, IOException, NumberFormatException { 47 return newServiceTag(f, false /* with instance_urn */); 48 } 49 50 public static ServiceTag newServiceTag(File f, boolean noInstanceURN) 51 throws FileNotFoundException, IOException, NumberFormatException { 52 Properties props = new Properties(); 53 FileReader reader = new FileReader(f); 54 try { 55 props.load(reader); 56 } finally { 57 reader.close(); 58 } 59 if (noInstanceURN) { 60 return ServiceTag.newInstance( 61 props.getProperty("product_name"), 62 props.getProperty("product_version"), 63 props.getProperty("product_urn"), 64 props.getProperty("product_parent"), 65 props.getProperty("product_parent_urn"), 66 props.getProperty("product_defined_inst_id"), 67 props.getProperty("product_vendor"), 68 props.getProperty("platform_arch"), 69 props.getProperty("container"), 70 props.getProperty("source")); 71 } else { 72 return ServiceTag.newInstance( 73 props.getProperty("instance_urn"), 74 props.getProperty("product_name"), 75 props.getProperty("product_version"), 76 props.getProperty("product_urn"), 77 props.getProperty("product_parent"), 78 props.getProperty("product_parent_urn"), 79 props.getProperty("product_defined_inst_id"), 80 props.getProperty("product_vendor"), 81 props.getProperty("platform_arch"), 82 props.getProperty("container"), 83 props.getProperty("source")); 84 } 85 } 86 87 public static boolean matches(ServiceTag st1, ServiceTag st2) { 88 if (!st1.getInstanceURN().equals(st2.getInstanceURN())) { 89 System.out.println("instance_urn: " + st1.getInstanceURN() + 90 " != " + st2.getInstanceURN()); 91 return false; 92 } 93 return matchesNoInstanceUrn(st1, st2); 94 } 95 96 public static boolean matchesNoInstanceUrn(ServiceTag st1, ServiceTag st2) { 97 if (!st1.getProductName().equals(st2.getProductName())) { 98 System.out.println("product_name: " + st1.getProductName() + 99 " != " + st2.getProductName()); 100 return false; 101 } 102 103 if (!st1.getProductVersion().equals(st2.getProductVersion())) { 104 System.out.println("product_version: " + st1.getProductVersion() + 105 " != " + st2.getProductVersion()); 106 return false; 107 } 108 if (!st1.getProductURN().equals(st2.getProductURN())) { 109 System.out.println("product_urn: " + st1.getProductURN() + 110 " != " + st2.getProductURN()); 111 return false; 112 } 113 if (!st1.getProductParentURN().equals(st2.getProductParentURN())) { 114 System.out.println("product_parent_urn: " + st1.getProductParentURN() + 115 " != " + st2.getProductParentURN()); 116 return false; 117 } 118 if (!st1.getProductParent().equals(st2.getProductParent())) { 119 System.out.println("product_parent: " + st1.getProductParent() + 120 " != " + st2.getProductParent()); 121 return false; 122 } 123 if (!st1.getProductDefinedInstanceID().equals(st2.getProductDefinedInstanceID())) { 124 System.out.println("product_defined_inst_id: " + 125 st1.getProductDefinedInstanceID() + 126 " != " + st2.getProductDefinedInstanceID()); 127 return false; 128 } 129 if (!st1.getProductVendor().equals(st2.getProductVendor())) { 130 System.out.println("product_vendor: " + st1.getProductVendor() + 131 " != " + st2.getProductVendor()); 132 return false; 133 } 134 if (!st1.getPlatformArch().equals(st2.getPlatformArch())) { 135 System.out.println("platform_arch: " + st1.getPlatformArch() + 136 " != " + st2.getPlatformArch()); 137 return false; 138 } 139 if (!st1.getContainer().equals(st2.getContainer())) { 140 System.out.println("container: " + st1.getContainer() + 141 " != " + st2.getContainer()); 142 return false; 143 } 144 if (!st1.getSource().equals(st2.getSource())) { 145 System.out.println("source: " + st1.getSource() + 146 " != " + st2.getSource()); 147 return false; 148 } 149 return true; 150 } 151 152 public static void checkRegistrationData(String regFile, 153 Map<String, ServiceTag> stMap) 154 throws IOException { 155 BufferedInputStream in = new BufferedInputStream(new FileInputStream(regFile)); 156 RegistrationData registration = RegistrationData.loadFromXML(in); 157 Set<ServiceTag> svcTags = registration.getServiceTags(); 158 if (svcTags.size() != stMap.size()) { 159 throw new RuntimeException("Invalid service tag count= " + 160 svcTags.size() + " expected=" + stMap.size()); 161 } 162 for (ServiceTag st : svcTags) { 163 ServiceTag st1 = stMap.get(st.getInstanceURN()); 164 if (!matches(st, st1)) { 165 System.err.println(st); 166 System.err.println(st1); 167 throw new RuntimeException("ServiceTag in the registry " + 168 "does not match the one in the map"); 169 } 170 } 171 } 172 173 174 /** 175 * Formats the Date into a timestamp string in YYYY-MM-dd HH:mm:ss GMT. 176 * @param timestamp Date 177 * @return a string representation of the timestamp in the YYYY-MM-dd HH:mm:ss GMT format. 178 */ 179 static String formatTimestamp(Date timestamp) { 180 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); 181 df.setTimeZone(TimeZone.getTimeZone("GMT")); 182 return df.format(timestamp); 183 } 184 185 /** 186 * Parses a timestamp string in YYYY-MM-dd HH:mm:ss GMT format. 187 * @param timestamp Timestamp in the YYYY-MM-dd HH:mm:ss GMT format. 188 * @return Date 189 */ 190 static Date parseTimestamp(String timestamp) { 191 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); 192 df.setTimeZone(TimeZone.getTimeZone("GMT")); 193 try { 194 return df.parse(timestamp); 195 } catch (ParseException e) { 196 // should not reach here 197 e.printStackTrace(); 198 return new Date(); 199 } 200 } 201 202 /** 203 * Returns the command simulating stclient behavior. 204 */ 205 static String getSvcClientCommand(String stclientRegistry) { 206 String regDir = System.getProperty("test.classes"); 207 208 StringBuilder sb = new StringBuilder(); 209 // wrap each argument to the command with double quotes 210 sb.append("\""); 211 sb.append(System.getProperty("java.home")); 212 sb.append(File.separator).append("bin"); 213 sb.append(File.separator).append("java"); 214 sb.append("\""); 215 sb.append(" -cp "); 216 sb.append("\"").append(regDir).append("\""); 217 sb.append(" \"-Dstclient.registry.path="); 218 sb.append(stclientRegistry).append("\""); 219 sb.append(" SvcTagClient"); 220 return sb.toString(); 221 } 222 223 private static Registry registry = null; 224 private static File registryFile = null; 225 /** 226 * Returns the Registry processed by SvcTagClient that simulates 227 * stclient. 228 */ 229 static synchronized Registry getSvcTagClientRegistry() throws IOException { 230 String regDir = System.getProperty("test.classes"); 231 File f = new File(regDir, "registry.xml"); 232 if (registry != null) { 233 if (!f.equals(registryFile) && f.length() != 0) { 234 throw new AssertionError("Has to be empty registry.xml to run in samevm"); 235 } 236 return registry; 237 } 238 239 // System.setProperty("servicetag.verbose", "true"); 240 // enable the helper class 241 System.setProperty("servicetag.sthelper.supported", "true"); 242 registryFile = f; 243 244 String stclientCmd = Util.getSvcClientCommand(registryFile.getCanonicalPath()); 245 System.out.println("stclient cmd: " + stclientCmd); 246 System.setProperty("servicetag.stclient.cmd", stclientCmd); 247 248 // get the Registry object after the system properties are set 249 registry = Registry.getSystemRegistry(); 250 return registry; 251 } 252 253 static void emptyRegistryFile() throws IOException { 254 if (registryFile.exists()) { 255 BufferedOutputStream out = new BufferedOutputStream( 256 new FileOutputStream(registryFile)); 257 try { 258 RegistrationData data = new RegistrationData(); 259 data.storeToXML(out); 260 } finally { 261 out.close(); 262 } 263 } 264 } 265 }