1 /*
2  * Copyright (c) 2003, 2015, 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 4894801
27  * @summary Test that ObjectName.getInstance(ObjectName) preserves key order
28  * @author Eamonn McManus
29  *
30  * @run clean ObjectNameGetInstanceTest
31  * @run build ObjectNameGetInstanceTest
32  * @run main ObjectNameGetInstanceTest
33  */
34 
35 import javax.management.*;
36 
37 public class ObjectNameGetInstanceTest {
main(String[] args)38     public static void main(String[] args) throws Exception {
39         System.out.println("Test that ObjectName.getInstance(ObjectName) " +
40                            "preserves the order of keys in its input");
41 
42         final String nonCanonical = "d:x=y,a=b";
43         ObjectName nice = new ObjectName(nonCanonical);
44 
45         // Check that we are in fact using an ObjectName whose canonical
46         // form is not the same as the input
47         if (nice.getCanonicalName().equals(nonCanonical)) {
48             System.err.println("TEST IS BROKEN: INPUT ALREADY CANONICAL");
49             System.exit(1);
50         }
51 
52         ObjectName evil = new EvilObjectName(nonCanonical);
53         ObjectName unEvil = ObjectName.getInstance(evil);
54         if (unEvil instanceof EvilObjectName) {
55             System.err.println("FAILS: getInstance did not banish evil");
56             System.exit(1);
57         }
58 
59         if (nice.equals(unEvil))
60             System.out.println("Test passes: original key order preserved");
61         else {
62             System.out.println("FAILS: key order changed");
63             System.exit(1);
64         }
65     }
66 
67     public static class EvilObjectName extends ObjectName {
EvilObjectName(String s)68         public EvilObjectName(String s) throws MalformedObjectNameException {
69             super(s);
70         }
71 
getCanonicalName()72         public String getCanonicalName() {
73             return "bogus:canonical=name";
74         }
75     }
76 }
77