1 /*
   2  * Copyright (c) 2005, 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 5036680
  27  * @summary Test the ObjectName.compareTo() method.
  28  * @author Luis-Miguel Alventosa
  29  * @run clean ComparatorTest
  30  * @run build ComparatorTest
  31  * @run main ComparatorTest
  32  */
  33 
  34 import javax.management.*;
  35 
  36 public class ComparatorTest {
  37 
  38     private static final char LT = '<';
  39     private static final char EQ = '=';
  40     private static final char GT = '>';
  41 
  42     private static final String tests[][] = {
  43         //
  44         // domains
  45         //
  46         { String.valueOf(LT), ":k1=v1", "d:k1=v1" },
  47         { String.valueOf(EQ), "d:k1=v1", "d:k1=v1" },
  48         { String.valueOf(GT), "d2:k1=v1", "d1:k1=v1" },
  49         //
  50         // "type=" key property
  51         //
  52         { String.valueOf(GT), "d:type=a,k1=v1", "d:k1=v1" },
  53         { String.valueOf(GT), "d:type=a,k1=v1", "d:type=" },
  54         { String.valueOf(GT), "d:type=a,k1=v1", "d:type=,k1=v1" },
  55         { String.valueOf(LT), "d:type=a,k1=v1", "d:type=b,k1=v1" },
  56         { String.valueOf(LT), "d:type=a,k2=v2", "d:type=b,k1=v1" },
  57         //
  58         // canonical form
  59         //
  60         { String.valueOf(EQ), "d:k1=v1,k2=v2", "d:k2=v2,k1=v1" },
  61         { String.valueOf(LT), "d:k1=v1,k2=v2", "d:k1=v1,k3=v3" },
  62         { String.valueOf(LT), "d:k1=v1,k2=v2", "d:k2=v2,k1=v1,k3=v3" },
  63         //
  64         // wildcards
  65         //
  66         { String.valueOf(LT), "d:k1=v1", "d:k1=v1,*" },
  67         { String.valueOf(GT), "d:k1=v1,k2=v2", "d:k1=v1,*" },
  68         { String.valueOf(GT), "domain:k1=v1", "?:k1=v1" },
  69         { String.valueOf(GT), "domain:k1=v1", "*:k1=v1" },
  70         { String.valueOf(GT), "domain:k1=v1", "domai?:k1=v1" },
  71         { String.valueOf(GT), "domain:k1=v1", "domai*:k1=v1" },
  72         { String.valueOf(GT), "domain:k1=v1", "do?ain:k1=v1" },
  73         { String.valueOf(GT), "domain:k1=v1", "do*ain:k1=v1" },
  74     };
  75 
  76     private static boolean compare(char comparator, String on1, String on2) {
  77         boolean ok = false;
  78         System.out.println("Test " + on1 + " " + comparator + " " + on2);
  79         try {
  80             ObjectName o1 = ObjectName.getInstance(on1);
  81             ObjectName o2 = ObjectName.getInstance(on2);
  82             int result = o1.compareTo(o2);
  83             switch (comparator) {
  84                 case LT:
  85                     if (result < 0)
  86                         ok = true;
  87                     break;
  88                 case EQ:
  89                     if (result == 0)
  90                         ok = true;
  91                     break;
  92                 case GT:
  93                     if (result > 0)
  94                         ok = true;
  95                     break;
  96                 default:
  97                     throw new IllegalArgumentException(
  98                               "Test incorrect: case: " + comparator);
  99             }
 100         } catch (Exception e) {
 101             ok = false;
 102             System.out.println("Got Unexpected Exception = " + e.toString());
 103         }
 104         return ok;
 105     }
 106 
 107     private static boolean lessThan(String on1, String on2) {
 108         return compare(LT, on1, on2);
 109     }
 110 
 111     private static boolean equalTo(String on1, String on2) {
 112         return compare(EQ, on1, on2);
 113     }
 114 
 115     private static boolean greaterThan(String on1, String on2) {
 116         return compare(GT, on1, on2);
 117     }
 118 
 119     private static int runTest(char comparator, String on1, String on2) {
 120         System.out.println("----------------------------------------------");
 121         boolean ok = false;
 122         boolean lt = lessThan(on1, on2);
 123         boolean eq = equalTo(on1, on2);
 124         boolean gt = greaterThan(on1, on2);
 125         switch (comparator) {
 126             case LT:
 127                 ok = lt && !eq && !gt;
 128                 System.out.println("Comparison result: LessThan");
 129                 break;
 130             case EQ:
 131                 ok = !lt && eq && !gt;
 132                 System.out.println("Comparison result: EqualTo");
 133                 break;
 134             case GT:
 135                 ok = !lt && !eq && gt;
 136                 System.out.println("Comparison result: GreaterThan");
 137                 break;
 138             default:
 139                 throw new IllegalArgumentException(
 140                           "Test incorrect: case: " + comparator);
 141         }
 142         if (ok)
 143             System.out.println("Test passed!");
 144         else
 145             System.out.println("Test failed!");
 146         System.out.println("----------------------------------------------");
 147         return ok ? 0 : 1;
 148     }
 149 
 150     public static void main(String[] args) throws Exception {
 151 
 152         int error = 0;
 153 
 154         // Check null values
 155         //
 156         System.out.println("----------------------------------------------");
 157         System.out.println("Test ObjectName.compareTo(null)");
 158         try {
 159             new ObjectName("d:k=v").compareTo(null);
 160             error++;
 161             System.out.println("Didn't get expected NullPointerException!");
 162             System.out.println("Test failed!");
 163         } catch (NullPointerException e) {
 164             System.out.println("Got expected exception = " + e.toString());
 165             System.out.println("Test passed!");
 166         } catch (Exception e) {
 167             error++;
 168             System.out.println("Got unexpected exception = " + e.toString());
 169             System.out.println("Test failed!");
 170         }
 171         System.out.println("----------------------------------------------");
 172 
 173         // Compare ObjectNames
 174         //
 175         for (int i = 0; i < tests.length; i++)
 176             error += runTest(tests[i][0].charAt(0), tests[i][1], tests[i][2]);
 177 
 178         if (error > 0) {
 179             final String msg = "Test FAILED! Got " + error + " error(s)";
 180             System.out.println(msg);
 181             throw new IllegalArgumentException(msg);
 182         } else {
 183             System.out.println("Test PASSED!");
 184         }
 185     }
 186 }