jdk/test/javax/management/namespace/JMXNamespacesTest.java
changeset 1156 bbc2d15aaf7a
child 1227 4546977d0d66
equal deleted inserted replaced
1155:a9a142fcf1b5 1156:bbc2d15aaf7a
       
     1 /*
       
     2  * Copyright 2008 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
       
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
       
    21  * have any questions.
       
    22  */
       
    23 /*
       
    24  * @test JMXNamespacesTest.java
       
    25  * @summary Test the static method that rewrite ObjectNames in JMXNamespacesTest
       
    26  * @author Daniel Fuchs
       
    27  * @run clean JMXNamespacesTest
       
    28  * @compile -XDignore.symbol.file=true JMXNamespacesTest.java
       
    29  * @run main JMXNamespacesTest
       
    30  */
       
    31 
       
    32 import com.sun.jmx.namespace.ObjectNameRouter;
       
    33 import java.io.Serializable;
       
    34 import java.util.Arrays;
       
    35 import java.util.logging.Logger;
       
    36 import javax.management.MalformedObjectNameException;
       
    37 import javax.management.ObjectName;
       
    38 import javax.management.namespace.JMXNamespaces;
       
    39 
       
    40 /**
       
    41  * Class JMXNamespacesTest
       
    42  * @author Sun Microsystems, 2005 - All rights reserved.
       
    43  */
       
    44 public class JMXNamespacesTest {
       
    45 
       
    46     /**
       
    47      * A logger for this class.
       
    48      **/
       
    49     private static final Logger LOG =
       
    50             Logger.getLogger(JMXNamespacesTest.class.getName());
       
    51 
       
    52     /** Creates a new instance of JMXNamespacesTest */
       
    53     public JMXNamespacesTest() {
       
    54     }
       
    55 
       
    56     public static class CustomObject implements Serializable {
       
    57         ObjectName toto;
       
    58         String titi;
       
    59         CustomObject(String toto, String titi) {
       
    60             try {
       
    61                 this.toto = new ObjectName(toto);
       
    62             } catch (MalformedObjectNameException m) {
       
    63                 throw new IllegalArgumentException(m);
       
    64             }
       
    65             this.titi = titi;
       
    66         }
       
    67         private Object[] data() {
       
    68             return new Object[] {toto, titi};
       
    69         }
       
    70         @Override
       
    71         public boolean equals(Object other) {
       
    72             if (! (other instanceof CustomObject)) return false;
       
    73             return Arrays.deepEquals(data(),((CustomObject)other).data());
       
    74         }
       
    75         @Override
       
    76         public int hashCode() {
       
    77             return Arrays.deepHashCode(data());
       
    78         }
       
    79     }
       
    80 
       
    81     public static CustomObject obj(String toto, String titi) {
       
    82         return new CustomObject(toto,titi);
       
    83     }
       
    84 
       
    85     private static String failure;
       
    86 
       
    87     public static void testDeepRewrite() throws Exception {
       
    88         failure = null;
       
    89         String s1 = "x//y//d:k=v";
       
    90         String s2 = "v//w//x//y//d:k=v";
       
    91         String p1 = "v//w";
       
    92         String p3 = "a//b";
       
    93 
       
    94         System.out.println("inserting "+p1);
       
    95         final CustomObject foo1 =
       
    96                 JMXNamespaces.deepReplaceHeadNamespace(obj(s1,s1),"",p1);
       
    97         assertEquals(foo1.toto.toString(),p1+"//"+s1);
       
    98         assertEquals(foo1.titi,s1);
       
    99 
       
   100        System.out.println("removing "+p1);
       
   101        final CustomObject foo2 =
       
   102                 JMXNamespaces.deepReplaceHeadNamespace(obj(s2,s2),p1,"");
       
   103         assertEquals(foo2.toto.toString(),s1);
       
   104         assertEquals(foo2.titi,s2);
       
   105 
       
   106         System.out.println("removing "+p1);
       
   107         final CustomObject foo3 =
       
   108                 JMXNamespaces.deepReplaceHeadNamespace(obj(p1+"//"+s2,s2),p1,"");
       
   109         assertEquals(foo3.toto.toString(),s2);
       
   110         assertEquals(foo3.titi,s2);
       
   111 
       
   112         System.out.println("replacing "+p1+" with "+p3);
       
   113         final CustomObject foo4 =
       
   114                 JMXNamespaces.deepReplaceHeadNamespace(obj(s2,s2),p1,p3);
       
   115         assertEquals(foo4.toto.toString(),p3+"//"+s1);
       
   116         assertEquals(foo4.titi,s2);
       
   117 
       
   118         System.out.println("replacing "+p1+" with "+p1);
       
   119         final CustomObject foo5 =
       
   120                 JMXNamespaces.deepReplaceHeadNamespace(obj(s2,s2),p1,p1);
       
   121         assertEquals(foo5.toto.toString(),s2);
       
   122         assertEquals(foo5.titi,s2);
       
   123 
       
   124         System.out.println("removing x//y in "+s2);
       
   125         try {
       
   126             final CustomObject foo7 =
       
   127                 JMXNamespaces.deepReplaceHeadNamespace(obj(s2,s2),"x//y","");
       
   128             failed("Remove x//y in "+s2+" should have failed!");
       
   129         } catch (IllegalArgumentException x) {
       
   130             System.out.println("Received expected exception: "+x);
       
   131         }
       
   132 
       
   133         System.out.println("replacing x//y with "+p3+" in "+s2);
       
   134         try {
       
   135             final CustomObject foo7 =
       
   136                 JMXNamespaces.deepReplaceHeadNamespace(obj(s2,s2),"x//y",p3);
       
   137             failed("Replace x//y in "+s2+" should have failed!");
       
   138         } catch (IllegalArgumentException x) {
       
   139             System.out.println("Received expected exception: "+x);
       
   140         }
       
   141 
       
   142         if (failure != null) throw new Exception(failure);
       
   143     }
       
   144 
       
   145     private static String[][] wildcards = {
       
   146         { "", "*:*" },
       
   147         { "//", "//*:*" },
       
   148         { "foo", "foo//*:*" },
       
   149         { "//foo", "//foo//*:*" },
       
   150         { "////foo", "//foo//*:*" },
       
   151         { "foo//", "foo//*:*" },
       
   152         { "foo////", "foo//*:*" },
       
   153         { "//foo//", "//foo//*:*" },
       
   154         { "////foo//", "//foo//*:*" },
       
   155         { "////foo////", "//foo//*:*" },
       
   156         { "foo//bar", "foo//bar//*:*" },
       
   157         { "//foo//bar", "//foo//bar//*:*" },
       
   158         { "////foo//bar", "//foo//bar//*:*" },
       
   159         { "foo//bar//", "foo//bar//*:*" },
       
   160         { "foo//bar////", "foo//bar//*:*" },
       
   161         { "//foo//bar//", "//foo//bar//*:*" },
       
   162         { "////foo//bar//", "//foo//bar//*:*" },
       
   163         { "////foo//bar////", "//foo//bar//*:*" },
       
   164         { "foo////bar", "foo//bar//*:*" },
       
   165         { "//foo////bar", "//foo//bar//*:*" },
       
   166         { "////foo////bar", "//foo//bar//*:*" },
       
   167         { "foo////bar//", "foo//bar//*:*" },
       
   168         { "foo////bar////", "foo//bar//*:*" },
       
   169         { "//foo////bar//", "//foo//bar//*:*" },
       
   170         { "////foo////bar//", "//foo//bar//*:*" },
       
   171         { "////foo////bar////", "//foo//bar//*:*" },
       
   172         { "fo/o", "fo/o//*:*" },
       
   173         { "//f/oo", "//f/oo//*:*" },
       
   174         { "////f/o/o", "//f/o/o//*:*" },
       
   175         { "fo/o//", "fo/o//*:*" },
       
   176         { "f/oo////", "f/oo//*:*" },
       
   177         { "//fo/o//", "//fo/o//*:*" },
       
   178         { "////f/oo//", "//f/oo//*:*" },
       
   179         { "////f/o/o////", "//f/o/o//*:*" },
       
   180         { "foo//b/a/r", "foo//b/a/r//*:*" },
       
   181         { "//fo/o//bar", "//fo/o//bar//*:*" },
       
   182         { "////foo//b/ar", "//foo//b/ar//*:*" },
       
   183         { "foo//ba/r//", "foo//ba/r//*:*" },
       
   184         { "f/oo//bar////", "f/oo//bar//*:*" },
       
   185         { "//f/o/o//bar//", "//f/o/o//bar//*:*" },
       
   186         { "////foo//b/a/r//", "//foo//b/a/r//*:*" },
       
   187         { "////f/o/o//b/a/r////", "//f/o/o//b/a/r//*:*" },
       
   188         { "foo////ba/r", "foo//ba/r//*:*" },
       
   189         { "//foo////b/ar", "//foo//b/ar//*:*" },
       
   190         { "////f/oo////bar", "//f/oo//bar//*:*" },
       
   191         { "fo/o////bar//", "fo/o//bar//*:*" },
       
   192         { "foo////ba/r////", "foo//ba/r//*:*" },
       
   193         { "//fo/o////ba/r//", "//fo/o//ba/r//*:*" },
       
   194         { "////f/oo////b/ar//", "//f/oo//b/ar//*:*" },
       
   195         { "////f/o/o////b/a/r////", "//f/o/o//b/a/r//*:*" },
       
   196     };
       
   197     private final static String[] badguys = {
       
   198         null,
       
   199         "/",         "/*:*",
       
   200         "///",       "///*:*" ,
       
   201         "/foo",      "/foo//*:*",
       
   202         "//foo/",    "//foo///*:*" ,
       
   203         "/////foo",  "///foo//*:*",
       
   204         "/foo//",    "/foo//*:*",
       
   205         "foo/////",  "foo///*:*",
       
   206         "///foo//",  "///foo//*:*",
       
   207         "////foo///", "//foo///*:*" ,
       
   208         "/////foo/////", "///foo///*:*",
       
   209         "/foo//bar", "/foo//bar//*:*",
       
   210         "//foo///bar", "//foo///bar//*:*",
       
   211         "/////foo////bar/", "///foo//bar///*:*",
       
   212         "foo///bar//", "foo//bar///*:*",
       
   213         "foo//bar/////", "foo///bar//*:*",
       
   214         "///foo//bar//", "//foo///bar//*:*" ,
       
   215     };
       
   216     public static void testWildcard() throws Exception {
       
   217         int i = 0;
       
   218         for (String[] pair : wildcards) {
       
   219             i++;
       
   220             final String msg = "testWildcard[good,"+i+"] "+Arrays.asList(pair)+": ";
       
   221             assertEquals(msg, new ObjectName(pair[1]),
       
   222                     JMXNamespaces.getWildcardFor(pair[0]));
       
   223         }
       
   224         i=0;
       
   225         for (String bad : badguys) {
       
   226             i++;
       
   227             try {
       
   228                 JMXNamespaces.getWildcardFor(bad);
       
   229                 failed("testWildcard[bad,"+i+"] "+bad+" incorrectly accepted. " +
       
   230                         "IllegalArgumentException was expected");
       
   231             } catch (IllegalArgumentException x) {
       
   232                 // OK
       
   233             }
       
   234         }
       
   235         if (failure != null) throw new Exception(failure);
       
   236     }
       
   237 
       
   238     private static String[][] goodinsert = {
       
   239         {"","d:k=v","d:k=v"},
       
   240         {"","//d:k=v","//d:k=v"},
       
   241         {"//","d:k=v","//d:k=v"},
       
   242         {"//","//d:k=v","//d:k=v"},
       
   243         {"//","a//d:k=v","//a//d:k=v"},
       
   244         {"//","//a//d:k=v","//a//d:k=v"},
       
   245         {"//","////a////d:k=v","//a//d:k=v"},
       
   246         {"//b","////a////d:k=v","//b//a//d:k=v"},
       
   247         {"b","////a////d:k=v","b//a//d:k=v"},
       
   248         {"b","d:k=v","b//d:k=v"},
       
   249         {"b//","d:k=v","b//d:k=v"},
       
   250         {"//b//","d:k=v","//b//d:k=v"},
       
   251         {"//b","////a////d:k=v","//b//a//d:k=v"},
       
   252         {"b//c","////a////d:k=v","b//c//a//d:k=v"},
       
   253         {"b//c","d:k=v","b//c//d:k=v"},
       
   254         {"b//c//","d:k=v","b//c//d:k=v"},
       
   255         {"//b//c//","d:k=v","//b//c//d:k=v"},
       
   256         {"","/d:k=v","/d:k=v"},
       
   257         {"","///d:k=v","///d:k=v"},
       
   258         {"//","/d:k=v","///d:k=v"},
       
   259         {"//","///d:k=v","///d:k=v"},
       
   260         {"//","a///d:k=v","//a///d:k=v"},
       
   261         {"//","//a///d:k=v","//a///d:k=v"},
       
   262         {"//","////a////d/:k=v","//a//d/:k=v"},
       
   263         {"//b","////a/////d:k=v","//b//a///d:k=v"},
       
   264         {"b","////a////d/:k=v","b//a//d/:k=v"},
       
   265         {"b","/d:k=v","b///d:k=v"},
       
   266         {"b//","/d:k=v","b///d:k=v"},
       
   267         {"//b//","/d:k=v","//b///d:k=v"},
       
   268         {"//b","////a/////d:k=v","//b//a///d:k=v"},
       
   269         {"b//c","////a/////d:k=v","b//c//a///d:k=v"},
       
   270         {"b//c","/d:k=v","b//c///d:k=v"},
       
   271         {"b//c//","/d:k=v","b//c///d:k=v"},
       
   272         {"//b//c//","d/:k=v","//b//c//d/:k=v"},
       
   273     };
       
   274 
       
   275     private static String[][] badinsert = {
       
   276         {"/","d:k=v"},
       
   277         {"/","//d:k=v"},
       
   278         {"///","d:k=v"},
       
   279         {"///","//d:k=v"},
       
   280         {"///","/a//d:k=v"},
       
   281         {"///","///a//d:k=v"},
       
   282         {"///","/////a////d:k=v"},
       
   283         {"//b","/////a////d:k=v"},
       
   284         {"b/","////a////d:k=v"},
       
   285         {"b/","d:k=v"},
       
   286         {"b///","d:k=v"},
       
   287         {"//b///","d:k=v"},
       
   288         {"//b/","////a////d:k=v"},
       
   289         {"b///c","////a////d:k=v"},
       
   290         {"b//c/","d:k=v"},
       
   291         {"b///c//","d:k=v"},
       
   292         {"//b///c//","d:k=v"},
       
   293 
       
   294     };
       
   295 
       
   296     public static void testInsertPath() throws Exception {
       
   297         int i = 0;
       
   298         for (String[] pair : goodinsert) {
       
   299             i++;
       
   300             final String msg = "testInsertPath[good,"+i+"] "+Arrays.asList(pair)+": ";
       
   301             assertEquals(msg,new ObjectName(pair[2]),
       
   302                     JMXNamespaces.insertPath(pair[0],
       
   303                     new ObjectName(pair[1])));
       
   304         }
       
   305         i=0;
       
   306         for (String[] bad : badinsert) {
       
   307             i++;
       
   308             try {
       
   309                 JMXNamespaces.insertPath(bad[0],
       
   310                     new ObjectName(bad[1]));
       
   311                 failed("testInsertPath[bad,"+i+"] "+
       
   312                         Arrays.asList(bad)+" incorrectly accepted. " +
       
   313                         "IllegalArgumentException was expected");
       
   314             } catch (IllegalArgumentException x) {
       
   315                 // OK
       
   316             }
       
   317         }
       
   318         if (failure != null) throw new Exception(failure);
       
   319     }
       
   320 
       
   321     private static String[][] testpath  = {
       
   322         {"/a/a/:k=v",""},
       
   323         {"/:k=v",""},
       
   324         {"bli:k=v",""},
       
   325         {"///a/a/:k=v",""},
       
   326         {"///:k=v",""},
       
   327         {"//bli:k=v",""},
       
   328         {"/////a/a/:k=v",""},
       
   329         {"/////:k=v",""},
       
   330         {"////bli:k=v",""},
       
   331         {"y///a/a/:k=v","y"},
       
   332         {"y///:k=v","y"},
       
   333         {"y//bli:k=v","y"},
       
   334         {"y/////a/a/:k=v","y"},
       
   335         {"y/////:k=v","y"},
       
   336         {"y////bli:k=v","y"},
       
   337         {"//y///a/a/:k=v","y"},
       
   338         {"//y///:k=v","y"},
       
   339         {"//y//bli:k=v","y"},
       
   340         {"//y/////a/a/:k=v","y"},
       
   341         {"//y/////:k=v","y"},
       
   342         {"//y////bli:k=v","y"},
       
   343         {"////y///a/a/:k=v","y"},
       
   344         {"////y///:k=v","y"},
       
   345         {"////y//bli:k=v","y"},
       
   346         {"////y/////a/a/:k=v","y"},
       
   347         {"////y/////:k=v","y"},
       
   348         {"////y////bli:k=v","y"},
       
   349 
       
   350         {"z//y///a/a/:k=v","z//y"},
       
   351         {"z//y///:k=v","z//y"},
       
   352         {"z//y//bli:k=v","z//y"},
       
   353         {"z//y/////a/a/:k=v","z//y"},
       
   354         {"z//y/////:k=v","z//y"},
       
   355         {"z//y////bli:k=v","z//y"},
       
   356         {"//z//y///a/a/:k=v","z//y"},
       
   357         {"//z//y///:k=v","z//y"},
       
   358         {"//z//y//bli:k=v","z//y"},
       
   359         {"//z//y/////a/a/:k=v","z//y"},
       
   360         {"//z//y/////:k=v","z//y"},
       
   361         {"//z//y////bli:k=v","z//y"},
       
   362         {"z////y///a/a/:k=v","z//y"},
       
   363         {"z////y///:k=v","z//y"},
       
   364         {"z////y//bli:k=v","z//y"},
       
   365         {"z////y/////a/a/:k=v","z//y"},
       
   366         {"z////y/////:k=v","z//y"},
       
   367         {"z////y////bli:k=v","z//y"},
       
   368         {"//z////y///a/a/:k=v","z//y"},
       
   369         {"//z////y///:k=v","z//y"},
       
   370         {"//z////y//bli:k=v","z//y"},
       
   371         {"//z////y/////a/a/:k=v","z//y"},
       
   372         {"//z////y/////:k=v","z//y"},
       
   373         {"//z////y////bli:k=v","z//y"},
       
   374         {"////z////y///a/a/:k=v","z//y"},
       
   375         {"////z////y///:k=v","z//y"},
       
   376         {"////z////y//bli:k=v","z//y"},
       
   377         {"////z////y/////a/a/:k=v","z//y"},
       
   378         {"////z////y/////:k=v","z//y"},
       
   379         {"////z////y////bli:k=v","z//y"},
       
   380 
       
   381     };
       
   382 
       
   383     public static void testGetNormalizedPath() throws Exception {
       
   384         int i = 0;
       
   385         for (String[] pair : testpath) {
       
   386             i++;
       
   387             final String msg = "testGetNormalizedPath["+i+"] "+Arrays.asList(pair)+": ";
       
   388             assertEquals(msg,pair[1],
       
   389                     JMXNamespaces.getContainingNamespace(new ObjectName(pair[0])));
       
   390         }
       
   391         if (failure != null) throw new Exception(failure);
       
   392     }
       
   393 
       
   394     private static String[][] testdomain  = {
       
   395         {"/a/a/","/a/a/"},
       
   396         {"/","/"},
       
   397         {"bli","bli"},
       
   398         {"///a/a/","///a/a/"},
       
   399         {"///","///"},
       
   400         {"//bli","//bli"},
       
   401         {"/////a/a/","///a/a/"},
       
   402         {"/////","///"},
       
   403         {"////bli","//bli"},
       
   404         {"y///a/a/","y///a/a/"},
       
   405         {"y///","y///"},
       
   406         {"y//bli","y//bli"},
       
   407         {"y/////a/a/","y///a/a/"},
       
   408         {"y/////","y///"},
       
   409         {"y////bli","y//bli"},
       
   410         {"//y///a/a/","//y///a/a/"},
       
   411         {"//y///","//y///"},
       
   412         {"//y//bli","//y//bli"},
       
   413         {"//y/////a/a/","//y///a/a/"},
       
   414         {"//y/////","//y///"},
       
   415         {"//y////bli","//y//bli"},
       
   416         {"////y///a/a/","//y///a/a/"},
       
   417         {"////y///","//y///"},
       
   418         {"////y//bli","//y//bli"},
       
   419         {"////y/////a/a/","//y///a/a/"},
       
   420         {"////y/////","//y///"},
       
   421         {"////y////bli","//y//bli"},
       
   422 
       
   423         {"z//y///a/a/","z//y///a/a/"},
       
   424         {"z//y///","z//y///"},
       
   425         {"z//y//bli","z//y//bli"},
       
   426         {"z//y/////a/a/","z//y///a/a/"},
       
   427         {"z//y/////","z//y///"},
       
   428         {"z//y////bli","z//y//bli"},
       
   429         {"//z//y///a/a/","//z//y///a/a/"},
       
   430         {"//z//y///","//z//y///"},
       
   431         {"//z//y//bli","//z//y//bli"},
       
   432         {"//z//y/////a/a/","//z//y///a/a/"},
       
   433         {"//z//y/////","//z//y///"},
       
   434         {"//z//y////bli","//z//y//bli"},
       
   435         {"z////y///a/a/","z//y///a/a/"},
       
   436         {"z////y///","z//y///"},
       
   437         {"z////y//bli","z//y//bli"},
       
   438         {"z////y/////a/a/","z//y///a/a/"},
       
   439         {"z////y/////","z//y///"},
       
   440         {"z////y////bli","z//y//bli"},
       
   441         {"//z////y///a/a/","//z//y///a/a/"},
       
   442         {"//z////y///","//z//y///"},
       
   443         {"//z////y//bli","//z//y//bli"},
       
   444         {"//z////y/////a/a/","//z//y///a/a/"},
       
   445         {"//z////y/////","//z//y///"},
       
   446         {"//z////y////bli","//z//y//bli"},
       
   447         {"////z////y///a/a/","//z//y///a/a/"},
       
   448         {"////z////y///","//z//y///"},
       
   449         {"////z////y//bli","//z//y//bli"},
       
   450         {"////z////y/////a/a/","//z//y///a/a/"},
       
   451         {"////z////y/////","//z//y///"},
       
   452         {"////z////y////bli","//z//y//bli"},
       
   453 
       
   454         {"bli//","bli//"},
       
   455         {"//bli//","//bli//"},
       
   456         {"////bli//","//bli//"},
       
   457         {"y////","y//"},
       
   458         {"y//bli//","y//bli//"},
       
   459         {"y////","y//"},
       
   460         {"y////bli//","y//bli//"},
       
   461         {"//y////","//y//"},
       
   462         {"//y//bli//","//y//bli//"},
       
   463         {"//y//////","//y//"},
       
   464         {"//y////bli//","//y//bli//"},
       
   465         {"////y////","//y//"},
       
   466         {"////y//bli////","//y//bli//"},
       
   467         {"////y//////","//y//"},
       
   468         {"////y////bli////","//y//bli//"},
       
   469         {"z//y////","z//y//"},
       
   470         {"z//y//bli//","z//y//bli//"},
       
   471         {"z//y//////","z//y//"},
       
   472         {"z//y////bli//","z//y//bli//"},
       
   473         {"//z//y////","//z//y//"},
       
   474         {"//z//y//bli//","//z//y//bli//"},
       
   475         {"//z//y//////","//z//y//"},
       
   476         {"//z//y////bli//","//z//y//bli//"},
       
   477         {"z////y////","z//y//"},
       
   478         {"z////y//bli//","z//y//bli//"},
       
   479         {"z////y//////","z//y//"},
       
   480         {"z////y////bli//","z//y//bli//"},
       
   481         {"//z////y////","//z//y//"},
       
   482         {"//z////y//bli//","//z//y//bli//"},
       
   483         {"//z////y//////","//z//y//"},
       
   484         {"//z////y////bli//","//z//y//bli//"},
       
   485         {"////z////y////","//z//y//"},
       
   486         {"////z////y//bli//","//z//y//bli//"},
       
   487         {"////z////y//////","//z//y//"},
       
   488         {"////z////y////bli//","//z//y//bli//"},
       
   489 
       
   490     };
       
   491     private static String[][] testnolead  = {
       
   492         {"/a/a/","/a/a/"},
       
   493         {"/","/"},
       
   494         {"bli","bli"},
       
   495         {"///a/a/","/a/a/"},
       
   496         {"///","/"},
       
   497         {"//bli","bli"},
       
   498         {"/////a/a/","/a/a/"},
       
   499         {"/////","/"},
       
   500         {"////bli","bli"},
       
   501         {"y///a/a/","y///a/a/"},
       
   502         {"y///","y///"},
       
   503         {"y//bli","y//bli"},
       
   504         {"y/////a/a/","y///a/a/"},
       
   505         {"y/////","y///"},
       
   506         {"y////bli","y//bli"},
       
   507         {"//y///a/a/","y///a/a/"},
       
   508         {"//y///","y///"},
       
   509         {"//y//bli","y//bli"},
       
   510         {"//y/////a/a/","y///a/a/"},
       
   511         {"//y/////","y///"},
       
   512         {"//y////bli","y//bli"},
       
   513         {"////y///a/a/","y///a/a/"},
       
   514         {"////y///","y///"},
       
   515         {"////y//bli","y//bli"},
       
   516         {"////y/////a/a/","y///a/a/"},
       
   517         {"////y/////","y///"},
       
   518         {"////y////bli","y//bli"},
       
   519 
       
   520         {"z//y///a/a/","z//y///a/a/"},
       
   521         {"z//y///","z//y///"},
       
   522         {"z//y//bli","z//y//bli"},
       
   523         {"z//y/////a/a/","z//y///a/a/"},
       
   524         {"z//y/////","z//y///"},
       
   525         {"z//y////bli","z//y//bli"},
       
   526         {"//z//y///a/a/","z//y///a/a/"},
       
   527         {"//z//y///","z//y///"},
       
   528         {"//z//y//bli","z//y//bli"},
       
   529         {"//z//y/////a/a/","z//y///a/a/"},
       
   530         {"//z//y/////","z//y///"},
       
   531         {"//z//y////bli","z//y//bli"},
       
   532         {"z////y///a/a/","z//y///a/a/"},
       
   533         {"z////y///","z//y///"},
       
   534         {"z////y//bli","z//y//bli"},
       
   535         {"z////y/////a/a/","z//y///a/a/"},
       
   536         {"z////y/////","z//y///"},
       
   537         {"z////y////bli","z//y//bli"},
       
   538         {"//z////y///a/a/","z//y///a/a/"},
       
   539         {"//z////y///","z//y///"},
       
   540         {"//z////y//bli","z//y//bli"},
       
   541         {"//z////y/////a/a/","z//y///a/a/"},
       
   542         {"//z////y/////","z//y///"},
       
   543         {"//z////y////bli","z//y//bli"},
       
   544         {"////z////y///a/a/","z//y///a/a/"},
       
   545         {"////z////y///","z//y///"},
       
   546         {"////z////y//bli","z//y//bli"},
       
   547         {"////z////y/////a/a/","z//y///a/a/"},
       
   548         {"////z////y/////","z//y///"},
       
   549         {"////z////y////bli","z//y//bli"},
       
   550 
       
   551         {"bli//","bli//"},
       
   552         {"//bli//","bli//"},
       
   553         {"////bli//","bli//"},
       
   554         {"y////","y//"},
       
   555         {"y//bli//","y//bli//"},
       
   556         {"y////","y//"},
       
   557         {"y////bli//","y//bli//"},
       
   558         {"//y////","y//"},
       
   559         {"//y//bli//","y//bli//"},
       
   560         {"//y//////","y//"},
       
   561         {"//y////bli//","y//bli//"},
       
   562         {"////y////","y//"},
       
   563         {"////y//bli////","y//bli//"},
       
   564         {"////y//////","y//"},
       
   565         {"////y////bli////","y//bli//"},
       
   566         {"z//y////","z//y//"},
       
   567         {"z//y//bli//","z//y//bli//"},
       
   568         {"z//y//////","z//y//"},
       
   569         {"z//y////bli//","z//y//bli//"},
       
   570         {"//z//y////","z//y//"},
       
   571         {"//z//y//bli//","z//y//bli//"},
       
   572         {"//z//y//////","z//y//"},
       
   573         {"//z//y////bli//","z//y//bli//"},
       
   574         {"z////y////","z//y//"},
       
   575         {"z////y//bli//","z//y//bli//"},
       
   576         {"z////y//////","z//y//"},
       
   577         {"z////y////bli//","z//y//bli//"},
       
   578         {"//z////y////","z//y//"},
       
   579         {"//z////y//bli//","z//y//bli//"},
       
   580         {"//z////y//////","z//y//"},
       
   581         {"//z////y////bli//","z//y//bli//"},
       
   582         {"////z////y////","z//y//"},
       
   583         {"////z////y//bli//","z//y//bli//"},
       
   584         {"////z////y//////","z//y//"},
       
   585         {"////z////y////bli//","z//y//bli//"},
       
   586 
       
   587     };
       
   588 
       
   589     public static void testNormalizeDomain() throws Exception {
       
   590         int i = 0;
       
   591         for (String[] pair : testdomain) {
       
   592             i++;
       
   593             final String msg = "testNormalizeDomain["+i+", false] "+Arrays.asList(pair)+": ";
       
   594             assertEquals(msg,pair[1],
       
   595                     ObjectNameRouter.normalizeDomain(pair[0],false));
       
   596         }
       
   597         if (failure != null) throw new Exception(failure);
       
   598         i = 0;
       
   599         for (String[] pair : testnolead) {
       
   600             i++;
       
   601             final String msg = "testNormalizeDomain["+i+", true] "+Arrays.asList(pair)+": ";
       
   602             assertEquals(msg,pair[1],
       
   603                     ObjectNameRouter.normalizeDomain(pair[0],true));
       
   604         }
       
   605         if (failure != null) throw new Exception(failure);
       
   606     }
       
   607 
       
   608     public static void main(String[] args) throws Exception {
       
   609         testDeepRewrite();
       
   610         testNormalizeDomain();
       
   611         testInsertPath();
       
   612         testWildcard();
       
   613         testGetNormalizedPath();
       
   614     }
       
   615 
       
   616     private static void assertEquals(Object x, Object y) {
       
   617         assertEquals("",x,y);
       
   618     }
       
   619 
       
   620     private static void assertEquals(String msg, Object x, Object y) {
       
   621         if (msg == null) msg="";
       
   622         if (!equal(x, y))
       
   623             failed(msg+"expected " + string(x) + "; got " + string(y));
       
   624     }
       
   625 
       
   626     private static boolean equal(Object x, Object y) {
       
   627         if (x == y)
       
   628             return true;
       
   629         if (x == null || y == null)
       
   630             return false;
       
   631         if (x.getClass().isArray())
       
   632             return Arrays.deepEquals(new Object[] {x}, new Object[] {y});
       
   633         return x.equals(y);
       
   634     }
       
   635 
       
   636     private static String string(Object x) {
       
   637         String s = Arrays.deepToString(new Object[] {x});
       
   638         return s.substring(1, s.length() - 1);
       
   639     }
       
   640 
       
   641 
       
   642     private static void failed(String why) {
       
   643         failure = why;
       
   644         new Throwable("FAILED: " + why).printStackTrace(System.out);
       
   645     }
       
   646 
       
   647 }