1 /*
   2  * Copyright (c) 2004, 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 4990825
  27  * @summary test that VmIdentifier objects get created as expected
  28  */
  29 
  30 import java.io.*;
  31 import java.net.*;
  32 import javax.xml.parsers.*;
  33 import org.xml.sax.*;
  34 import org.xml.sax.helpers.DefaultHandler;
  35 import sun.jvmstat.monitor.*;
  36 
  37 public class VmIdentifierCreateResolve {
  38 
  39     public static void main(String args[]) throws Exception {
  40         File testcases =
  41                 new File(System.getProperty("test.src", "."), "testcases");
  42 
  43         SAXParserFactory spf = SAXParserFactory.newInstance();
  44         SAXParser sp = spf.newSAXParser();
  45         DefaultHandler dh = new VmIdentifierTestHandler();
  46         sp.parse(testcases, dh);
  47     }
  48 }
  49 
  50 class VmIdentifierTestHandler extends DefaultHandler {
  51     private static final boolean debug = false;
  52     private static final int START                     = 0;
  53     private static final int VMIDENTIFIER_TESTS        = 1;
  54     private static final int TESTCASE                  = 2;
  55     private static final int DESCRIPTION               = 3;
  56     private static final int VMIDENTIFIER              = 4;
  57     private static final int HOSTIDENTIFIER            = 5;
  58     private static final int RESOLVED                  = 6;
  59 
  60     private TestCase test;
  61     private String value = null;
  62     private int state;
  63     private Attributes attributes;
  64 
  65     public VmIdentifierTestHandler() {
  66         super();
  67     }
  68 
  69     public void characters(char[] ch, int start, int length) {
  70         String s = new String(ch, start, length);
  71         if (debug) {
  72             System.out.println("characters: start = " + start +
  73                                " length = " + length +
  74                                " chars = " + s);
  75         }
  76 
  77         if (value == null) {
  78             value = s.trim();
  79         } else {
  80             value = value + s.trim();
  81             if (debug) {
  82                 System.out.println("characters: appended characters to "
  83                                    + "previous value: new value = " + value);
  84             }
  85         }
  86     }
  87 
  88     public void endDocument() {
  89         if (debug) {
  90             System.out.println("endDocument()");
  91         }
  92     }
  93 
  94     public void endElement(String namespaceURI, String localName,
  95                            String qName)
  96                 throws SAXException {
  97         if (debug) {
  98             System.out.println("endElement(): namespaceURI = " + namespaceURI
  99                                + " localName = " + localName
 100                                + " qName = " + qName
 101                                + " state = " + state);
 102         }
 103 
 104         switch (state) {
 105         case START:
 106             throw new RuntimeException("Unexpected state: " + state);
 107 
 108         case VMIDENTIFIER_TESTS:
 109             state = START;
 110             break;
 111 
 112         case TESTCASE:
 113             if (test == null) {
 114                 throw new RuntimeException("Unexpected thread state");
 115             }
 116             try {
 117               System.out.println("running test case " + test.id);
 118               test.run();            // run the test
 119             }
 120             catch (Exception e) {
 121               throw new SAXException(e);
 122             }
 123             state = VMIDENTIFIER_TESTS;
 124             test = null;
 125             value = null;
 126             break;
 127 
 128         case DESCRIPTION:
 129             test.setDescription(value);
 130             state = TESTCASE;
 131             value = null;
 132             break;
 133 
 134         case VMIDENTIFIER:
 135             test.setExpectedVmIdentifier(value);
 136             state = TESTCASE;
 137             value = null;
 138             break;
 139 
 140         case HOSTIDENTIFIER:
 141             test.setExpectedHostIdentifier(value);
 142             state = TESTCASE;
 143             value = null;
 144             break;
 145 
 146         case RESOLVED:
 147             test.setResolvedVmIdentifier(value);
 148             state = TESTCASE;
 149             value = null;
 150             break;
 151 
 152         default:
 153             throw new RuntimeException("Unexpected state: " + state);
 154         }
 155     }
 156 
 157     public void endPrefixMapping(String prefix) {
 158         if (debug) {
 159             System.out.println("endPrefixMapping(): prefix = " + prefix);
 160         }
 161     }
 162 
 163     public void ignorableWhitespace(char[] ch, int start, int length) {
 164         if (debug) {
 165             System.out.println("ignoreableWhitespace():"
 166                                + " ch = " + new String(ch, start, length)
 167                                + " start = " + start
 168                                + " length = " + length);
 169         }
 170     }
 171 
 172     public void processingInstruction(String target, String data) {
 173         if (debug) {
 174             System.out.println("processingInstruction():"
 175                                + " target = " + target
 176                                + " data = " + data);
 177         }
 178     }
 179 
 180     public void setDocumentLocator(Locator locator) {
 181         if (debug) {
 182             System.out.println("setDocumentLocator(): locator = " + locator);
 183         }
 184     }
 185 
 186     public void skippedEntity(String name) {
 187         if (debug) {
 188             System.out.println("skippedEntity(): name = " + name);
 189         }
 190     }
 191 
 192     public void startDocument() {
 193         if (debug) {
 194             System.out.println("startDocument():");
 195         }
 196     }
 197 
 198     public void startElement(String namespaceURI, String localName,
 199                              String qName, Attributes attributes) {
 200         if (debug) {
 201             System.out.println("startElement():"
 202                                + " namespaceURI = " + namespaceURI
 203                                + " localName = " + localName
 204                                + " qName = " + qName
 205                                + " state = " + state);
 206 
 207             System.out.println("   Attributes(" + attributes.getLength() + ")");
 208             for (int i = 0; i < attributes.getLength(); i++) {
 209                 System.out.println("     name = " + attributes.getQName(i)
 210                                    + " value = " + attributes.getValue(i));
 211             }
 212         }
 213 
 214         this.attributes = attributes;
 215 
 216         switch (state) {
 217         case START:
 218             if (qName.compareTo("VmIdentifierTests") == 0) {
 219                 state = VMIDENTIFIER_TESTS;
 220             } else {
 221                 System.err.println("unexpected input: state = " + state
 222                                    + " input = " + qName);
 223             }
 224             break;
 225 
 226         case VMIDENTIFIER_TESTS:
 227             if (qName.compareTo("testcase") == 0) {
 228                 state = TESTCASE;
 229                 int id_n = attributes.getIndex("id");
 230 
 231                 if (id_n == -1) {
 232                     throw new RuntimeException("id attribute expected");
 233                 }
 234 
 235                 int vmid_n = attributes.getIndex("VmIdentifierInput");
 236                 if (vmid_n == -1) {
 237                     throw new RuntimeException(
 238                             "VmIdentifier attribute expected");
 239                 }
 240 
 241                 String hostid_input = null;
 242                 int hostid_n = attributes.getIndex("HostIdentifierInput");
 243                 if (hostid_n != -1) {
 244                     hostid_input = attributes.getValue(hostid_n);
 245                 }
 246 
 247                 String vmid_input = attributes.getValue(vmid_n);
 248                 String id = attributes.getValue(id_n);
 249 
 250                 test = new TestCase(id, vmid_input, hostid_input);
 251             } else {
 252                 System.err.println("unexpected input: state = " + state
 253                                    + " input = " + qName);
 254             }
 255             break;
 256 
 257         case TESTCASE:
 258             if (test == null) {
 259                 throw new RuntimeException("TestCase null");
 260             }
 261             value = null;
 262             if (qName.compareTo("description") == 0) {
 263                 state = DESCRIPTION;
 264 
 265             } else if (qName.compareTo("VmIdentifier") == 0) {
 266                 state = VMIDENTIFIER;
 267 
 268             } else if (qName.compareTo("HostIdentifier") == 0) {
 269                 state = HOSTIDENTIFIER;
 270 
 271             } else if (qName.compareTo("Resolved") == 0) {
 272                 state = RESOLVED;
 273 
 274             } else {
 275                 System.err.println("unexpected input: state = " + state
 276                                    + " input = " + qName);
 277             }
 278             break;
 279 
 280         case DESCRIPTION:
 281         case VMIDENTIFIER:
 282         case HOSTIDENTIFIER:
 283         case RESOLVED:
 284             if (test == null) {
 285                 throw new RuntimeException("TestCase null");
 286             }
 287             break;
 288 
 289         default:
 290             System.err.println("Unexpected state: " + state);
 291             break;
 292         }
 293     }
 294 
 295     public void startPrefixMapping(String prefix, String uri) {
 296         if (debug) {
 297             System.out.println("startPrefixMapping():"
 298                                + " prefix = " + prefix
 299                                + " uri = " + uri);
 300         }
 301     }
 302 }
 303 
 304 class VmIdentifierException extends Exception {
 305     String result;
 306     TestCase test;
 307 
 308     VmIdentifierException(TestCase test, String result) {
 309         this.test = test;
 310         this.result = result;
 311     }
 312 
 313     public String getMessage() {
 314         return "Test " + test.id + " " + "Failed: "
 315                + "Expected = " + test.expectedVmIdentifier + " "
 316                + "Actual = " + result;
 317     }
 318 }
 319 
 320 class HostIdentifierException extends Exception {
 321     String result;
 322     TestCase test;
 323 
 324     HostIdentifierException(TestCase test, String result) {
 325         this.test = test;
 326         this.result = result;
 327     }
 328 
 329     public String getMessage() {
 330         return "Test " + test.id + " " + "Failed: "
 331                + "Expected = " + test.expectedHostIdentifier + " "
 332                + "Actual = " + result;
 333     }
 334 }
 335 
 336 class ResolvedVmIdentifierException extends Exception {
 337     String result;
 338     TestCase test;
 339 
 340     ResolvedVmIdentifierException(TestCase test, String result) {
 341         this.test = test;
 342         this.result = result;
 343     }
 344     public String getMessage() {
 345         return "Test " + test.id + " " + "Failed: "
 346                + "Expected = " + test.resolvedVmIdentifier + " "
 347                + "Actual = " + result;
 348     }
 349 }
 350 
 351 class TestCase {
 352     private static final boolean debug = false;
 353 
 354     String id;
 355     String vmid;
 356     String hostid;
 357     String expectedVmIdentifier;
 358     String expectedHostIdentifier;
 359     String resolvedVmIdentifier;
 360     String description;
 361 
 362     public TestCase(String id, String vmid, String hostid) {
 363         this.id = id;
 364         this.vmid = vmid;
 365         this.hostid = hostid;
 366     }
 367 
 368     public void run() throws Exception {
 369         if (expectedVmIdentifier == null || expectedHostIdentifier == null
 370                 || resolvedVmIdentifier == null) {
 371             throw new IllegalArgumentException(
 372                     "expected values not initialized");
 373         }
 374 
 375         VmIdentifier test_vmid = null;
 376         HostIdentifier test_hostid = null;
 377         VmIdentifier resolved_vmid =  null;
 378 
 379         if (debug) {
 380             System.out.println("creating VmIdentifier");
 381         }
 382 
 383         test_vmid = new VmIdentifier(vmid);
 384 
 385         if (debug) {
 386             System.out.println("creating HostIdentifier");
 387         }
 388 
 389         if (hostid != null) {
 390             test_hostid = new HostIdentifier(hostid);
 391         } else {
 392             test_hostid = new HostIdentifier(test_vmid);
 393         }
 394 
 395         if (debug) {
 396             System.out.println("resolving VmIdentifier");
 397         }
 398 
 399         resolved_vmid =  test_hostid.resolve(test_vmid);
 400 
 401         String test_vmid_str = test_vmid.toString();
 402         String test_hostid_str = test_hostid.toString();
 403         String resolved_vmid_str = resolved_vmid.toString();
 404 
 405         if (debug) {
 406             System.out.println("comparing VmIdentifier result");
 407         }
 408 
 409         if (test_vmid_str.compareTo(expectedVmIdentifier) != 0) {
 410             throw new VmIdentifierException(this, test_vmid_str);
 411         }
 412 
 413         if (debug) {
 414             System.out.println("comparing HostIdentifier result");
 415         }
 416 
 417         if (test_hostid_str.compareTo(expectedHostIdentifier) != 0) {
 418             throw new HostIdentifierException(this, test_hostid_str);
 419         }
 420 
 421         if (debug) {
 422             System.out.println("comparing VmIdentifier result");
 423         }
 424 
 425         if (resolved_vmid_str.compareTo(resolvedVmIdentifier) != 0) {
 426             throw new ResolvedVmIdentifierException(this, resolved_vmid_str);
 427         }
 428     }
 429 
 430     public void setDescription(String description) {
 431         this.description = description;
 432     }
 433 
 434     public void setExpectedVmIdentifier(String expectedVmIdentifier) {
 435         if (debug) {
 436             System.out.println("setting vmidentifier string to " + vmid);
 437         }
 438         this.expectedVmIdentifier = expectedVmIdentifier;
 439     }
 440 
 441     public void setExpectedHostIdentifier(String expectedHostIdentifier) {
 442         this.expectedHostIdentifier = expectedHostIdentifier;
 443     }
 444 
 445     public void setResolvedVmIdentifier(String resolvedVmIdentifier) {
 446         this.resolvedVmIdentifier = resolvedVmIdentifier;
 447     }
 448 }