1/*
2 * Copyright (c) 2006, 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 6417044
27 * @summary Test that a failing MBean registration does not lead to a deadlock
28 * @author Eamonn McManus
29 *
30 * @run main PostRegisterDeadlockTest2
31 */
32
33import javax.management.*;
34
35public class PostRegisterDeadlockTest2 {
36    private static String failed;
37
38    public static interface EmptyMBean {}
39
40    public static class Empty implements EmptyMBean, MBeanRegistration {
41        public ObjectName preRegister(MBeanServer mbs, ObjectName on) {
42            this.mbs = mbs;
43            this.on = on;
44            return on;
45        }
46        public void postRegister(Boolean done) {
47            Thread t = new Thread() {
48                public void run() {
49                    if (!mbs.isRegistered(on))
50                        failed = "Not registered!";
51                }
52            };
53            t.start();
54            try {
55                t.join(5000L);
56            } catch (InterruptedException e) {
57                failed = "Interrupted: " + e;
58            }
59            if (t.isAlive())
60                failed = "Deadlock detected";
61        }
62        public void preDeregister() {}
63        public void postDeregister() {}
64
65        private MBeanServer mbs;
66        private ObjectName on;
67    }
68
69    public static void main(String[] args) throws Exception {
70        MBeanServer mbs = MBeanServerFactory.newMBeanServer();
71        ObjectName on = new ObjectName("a:b=c");
72        mbs.registerMBean(new Empty(), on);
73        try {
74            mbs.registerMBean(new Empty(), on);
75            throw new Exception("FAILED: did not get expected exception");
76        } catch (InstanceAlreadyExistsException e) {
77            System.out.println("OK: got expected exception");
78        }
79        if (failed != null)
80            throw new Exception("FAILED: " + failed);
81        System.out.println("TEST PASSED");
82    }
83}
84