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 4944680
27 * @summary Tests that IllegalArgumentException is thrown when
28 *          MBeanServerForwrder is null.
29 * @author Daniel Fuchs
30 * @modules java.management.rmi
31 *          java.management/com.sun.jmx.remote.security
32 * @run clean SetMBeanServerForwarder
33 * @run build SetMBeanServerForwarder
34 * @run main SetMBeanServerForwarder
35 */
36import javax.management.*;
37import javax.management.remote.*;
38import javax.management.remote.rmi.*;
39import java.util.Map;
40
41import com.sun.jmx.remote.security.MBeanServerAccessController;
42
43public class SetMBeanServerForwarder {
44
45    static boolean isPresent(String cn) {
46        try {
47            Class.forName(cn);
48            return true;
49        } catch (ClassNotFoundException x) {
50            return false;
51        }
52    }
53
54    public static int test(String... urls) {
55        int errorCount = 0;
56        for (int i=0;i<urls.length;i++) {
57            try {
58                final MBeanServer mbs = MBeanServerFactory.newMBeanServer();
59                final JMXConnectorServer cs1,cs2;
60                final JMXServiceURL      url;
61
62                System.out.println("*** -----------------------------------");
63                System.out.println("*** JMXConnectorServer("+urls[i]+")");
64                System.out.println("*** -----------------------------------");
65
66                try {
67                    url = new JMXServiceURL(urls[i]);
68                    cs1 = JMXConnectorServerFactory
69                        .newJMXConnectorServer(url,(Map)null,mbs);
70                    cs2 = JMXConnectorServerFactory
71                        .newJMXConnectorServer(url,(Map)null,null);
72                } catch (Throwable thr) {
73                    System.out.println("Failed to create ConnectorServer "+
74                                       "from [" + urls[i] +"]: " + thr);
75                    thr.printStackTrace();
76                    errorCount++;
77                    continue;
78                }
79
80                // Test using a JMXConnectorServer already connected to an
81                // MBeanServer
82                //
83
84                // Set null MBeanServerForwarder - expect exception
85                //
86                try {
87                    cs1.setMBeanServerForwarder(null);
88                    errorCount++;
89                    System.out.println("Expected IllegalArgumentException "+
90                                       " not thrown (null forwarder) for " +
91                                       url);
92                    System.out.println("\t\t[connected to MBeanServer]");
93                } catch (IllegalArgumentException iae) {
94                    System.out.println("Received expected exception: " +
95                                       iae);
96                }
97
98                // Now try with a real MBSF - should not throw exception
99                //
100                try {
101                    final MBeanServerForwarder fwd = new
102                        MBeanServerAccessController() {
103                            protected void checkRead() {}
104                            protected void checkWrite() {}
105                        };
106                    cs1.setMBeanServerForwarder(fwd);
107
108                    // Verify that the MBSF was correctly set.
109                    //
110                    if (cs1.getMBeanServer() != fwd) {
111                        System.out.println("MBeanServerForwarder not set "+
112                                           "for " + url);
113                        System.out.println("\t\t[connected to MBeanServer]");
114                        throw new AssertionError("cs1.getMBeanServer()!=fwd");
115                    }
116
117                    // Verify that the MBS was correctly forwarded to the MBSF
118                    //
119                    if (fwd.getMBeanServer() != mbs) {
120                        System.out.println("MBeanServer not set in Forwarder"+
121                                           " for " + url);
122                        System.out.println("\t\t[connected to MBeanServer]");
123                        throw new AssertionError("fwd.getMBeanServer()!=mbs");
124                    }
125                    System.out.println("MBeanServerForwarder successfully "+
126                                       "set for " + url);
127                    System.out.println("\t\t[connected to MBeanServer]");
128                } catch (Throwable x) {
129                    errorCount++;
130                    System.out.println("Failed to set forwarder for " +
131                                       url);
132                    System.out.println("\t\t[connected to MBeanServer]");
133                    System.out.println("Unexpected exception: " +
134                                       x);
135                    x.printStackTrace();
136                }
137
138                // Test using a JMXConnectorServer not connected to any
139                // MBeanServer
140                //
141
142                // Set null MBeanServerForwarder - expect exception
143                //
144                try {
145                    cs2.setMBeanServerForwarder(null);
146                    errorCount++;
147                    System.out.println("Expected IllegalArgumentException "+
148                                       " not thrown (null forwarder) for " +
149                                       url);
150                    System.out.println("\t\t[not connected to MBeanServer]");
151                } catch (IllegalArgumentException iae) {
152                    System.out.println("Received expected exception: " +
153                                       iae);
154                }
155
156                // Now try with a real MBSF - should not throw exception
157                //
158                try {
159                    final MBeanServerForwarder fwd = new
160                        MBeanServerAccessController() {
161                            protected void checkRead() {}
162                            protected void checkWrite() {}
163                        };
164                    cs2.setMBeanServerForwarder(fwd);
165
166                    // Verify that the MBSF was correctly set.
167                    //
168                    if (cs2.getMBeanServer() != fwd) {
169                        System.out.println("MBeanServerForwarder not set "+
170                                           "for " + url);
171                        System.out.println("\t\t[not connected to MBeanServer]");
172                        throw new AssertionError("cs2.getMBeanServer()!=fwd");
173                    }
174
175                    // Now register the connector
176                    //
177                    final ObjectName name =
178                        new ObjectName(":type="+cs2.getClass().getName()+
179                                       ",url="+ObjectName.quote(urls[i]));
180                    mbs.registerMBean(cs2,name);
181                    try {
182
183                        // Verify that the MBSF was not disconnected.
184                        //
185                        if (cs2.getMBeanServer() != fwd) {
186                            System.out.
187                                println("MBeanServerForwarder changed "+
188                                        "for " + url);
189                            System.out.
190                                println("\t\t[registerMBean]");
191                            throw new
192                                AssertionError("cs2.getMBeanServer()!=fwd");
193                        }
194
195                        // Verify that the MBS was not forwarded to the MBSF
196                        //
197                        if (fwd.getMBeanServer() != null) {
198                            System.out.
199                                println("MBeanServer changed in Forwarder"+
200                                        " for " + url);
201                            System.out.println("\t\t[registerMBean]");
202                            throw new
203                                AssertionError("fwd.getMBeanServer()!=null");
204                        }
205
206                    } finally {
207                        mbs.unregisterMBean(name);
208                    }
209
210                    System.out.println("MBeanServerForwarder successfully "+
211                                       "set for " + url);
212                    System.out.println("\t\t[not connected to MBeanServer]");
213                } catch (Throwable x) {
214                    errorCount++;
215                    System.out.println("Failed to set forwarder for " +
216                                       url);
217                    System.out.println("\t\t[not connected to MBeanServer]");
218                    System.out.println("Unexpected exception: " +
219                                       x);
220                    x.printStackTrace();
221                }
222
223            } catch (Exception x) {
224                System.err.println("Unexpected exception for " +
225                                   urls[i] + ": " + x);
226                x.printStackTrace();
227                errorCount++;
228            }
229        }
230        return errorCount;
231    }
232
233    public static void main(String args[]) {
234        int errCount = 0;
235
236        // mandatory
237        errCount += test("service:jmx:rmi://");
238
239        // optional
240        if (isPresent("javax.management.remote.rmi._RMIConnectionImpl_Tie"))
241            errCount += test("service:jmx:iiop://");
242        if (isPresent("javax.management.remote.generic.GenericConnector"))
243            errCount += test("service:jmx:jmxmp://");
244
245        if (errCount > 0) {
246            throw new RuntimeException("SetMBeanServerForwarder failed: " +
247                                       errCount + " error(s) reported.");
248        }
249        System.out.println("SetMBeanServerForwarder passed.");
250    }
251}
252