1/*
2 * Copyright (c) 2005, 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 6283045
27 * @summary Test the correctness of immutableInfo field in MBeanInfo descriptor
28 *          when overriding the methods cacheMBeanInfo, getCachedMBeanInfo,
29 *          getMBeanInfo and getNotificationInfo in StandardMBean and
30 *          StandardEmitterMBean.
31 * @author Luis-Miguel Alventosa
32 *
33 * @run clean StandardMBeanOverrideTest
34 * @run build StandardMBeanOverrideTest
35 * @run main StandardMBeanOverrideTest
36 */
37
38import java.io.*;
39import java.lang.management.*;
40import javax.management.*;
41import javax.management.openmbean.*;
42
43public class StandardMBeanOverrideTest {
44
45    private static Object testInstances[] = {
46        new TestClass0(false),
47        new TestClass1(false),
48        new TestClass2(false),
49        new TestClass3(false),
50        new TestClass4(false),
51        new TestClass5(false),
52        new TestClass6(false),
53        new TestClass7(false),
54        new TestClass8(false),
55        new TestClass9(false),
56        new TestClass0(true),
57        new TestClass1(true),
58        new TestClass2(true),
59        new TestClass3(true),
60        new TestClass4(true),
61        new TestClass5(true),
62        new TestClass6(true),
63        new TestClass7(true),
64        new TestClass8(true),
65        new TestClass9(true),
66    };
67
68    public interface ImmutableInfo {
69    }
70
71    public interface NonImmutableInfo {
72    }
73
74    public interface TestInterface {
75    }
76
77    public static class TestClass0
78        extends StandardMBean
79        implements TestInterface, ImmutableInfo {
80        public TestClass0(boolean mxbean) {
81            super(TestInterface.class, mxbean);
82        }
83    }
84
85    public static class TestClass1
86        extends StandardMBean
87        implements TestInterface, NonImmutableInfo {
88        public TestClass1(boolean mxbean) {
89            super(TestInterface.class, mxbean);
90        }
91        protected void cacheMBeanInfo(MBeanInfo info) {
92            super.cacheMBeanInfo(info);
93        }
94    }
95
96    public static class TestClass2
97        extends StandardMBean
98        implements TestInterface, NonImmutableInfo {
99        public TestClass2(boolean mxbean) {
100            super(TestInterface.class, mxbean);
101        }
102        protected MBeanInfo getCachedMBeanInfo() {
103            return super.getCachedMBeanInfo();
104        }
105    }
106
107    public static class TestClass3
108        extends StandardMBean
109        implements TestInterface, NonImmutableInfo {
110        public TestClass3(boolean mxbean) {
111            super(TestInterface.class, mxbean);
112        }
113        public MBeanInfo getMBeanInfo() {
114            return super.getMBeanInfo();
115        }
116    }
117
118    public static class TestClass4
119        extends StandardMBean
120        implements TestInterface, ImmutableInfo {
121        public TestClass4(boolean mxbean) {
122            super(TestInterface.class, mxbean);
123        }
124        public MBeanNotificationInfo[] getNotificationInfo() {
125            return new MBeanNotificationInfo[0];
126        }
127    }
128
129    public static class TestClass5
130        extends StandardEmitterMBean
131        implements TestInterface, ImmutableInfo {
132        public TestClass5(boolean mxbean) {
133            super(TestInterface.class, mxbean,
134                  new NotificationBroadcasterSupport());
135        }
136    }
137
138    public static class TestClass6
139        extends StandardEmitterMBean
140        implements TestInterface, NonImmutableInfo {
141        public TestClass6(boolean mxbean) {
142            super(TestInterface.class, mxbean,
143                  new NotificationBroadcasterSupport());
144        }
145        protected void cacheMBeanInfo(MBeanInfo info) {
146            super.cacheMBeanInfo(info);
147        }
148    }
149
150    public static class TestClass7
151        extends StandardEmitterMBean
152        implements TestInterface, NonImmutableInfo {
153        public TestClass7(boolean mxbean) {
154            super(TestInterface.class, mxbean,
155                  new NotificationBroadcasterSupport());
156        }
157        protected MBeanInfo getCachedMBeanInfo() {
158            return super.getCachedMBeanInfo();
159        }
160    }
161
162    public static class TestClass8
163        extends StandardEmitterMBean
164        implements TestInterface, NonImmutableInfo {
165        public TestClass8(boolean mxbean) {
166            super(TestInterface.class, mxbean,
167                  new NotificationBroadcasterSupport());
168        }
169        public MBeanInfo getMBeanInfo() {
170            return super.getMBeanInfo();
171        }
172    }
173
174    public static class TestClass9
175        extends StandardEmitterMBean
176        implements TestInterface, NonImmutableInfo {
177        public TestClass9(boolean mxbean) {
178            super(TestInterface.class, mxbean,
179                  new NotificationBroadcasterSupport());
180        }
181        public MBeanNotificationInfo[] getNotificationInfo() {
182            return new MBeanNotificationInfo[0];
183        }
184    }
185
186    public static void main(String[] args) throws Exception {
187
188        int error = 0;
189
190        // Instantiate the MBean server
191        //
192        echo("\n>>> Create the MBean server");
193        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
194
195        // Get default domain
196        //
197        echo("\n>>> Get the MBean server's default domain");
198        String domain = mbs.getDefaultDomain();
199        echo("\tDefault Domain = " + domain);
200
201        for (int i = 0; i < testInstances.length; i++) {
202            // Create and register the TestClass MBean
203            //
204            String cn = testInstances[i].getClass().getName();
205            String ons = domain + ":type=" + cn + ",name=" + i;
206            echo("\n>>> Create the " + cn +
207                 " MBean within the MBeanServer");
208            echo("\tObjectName = " + ons);
209            ObjectName on = ObjectName.getInstance(ons);
210            mbs.registerMBean(testInstances[i], on);
211
212            // Check immutableInfo field in descriptor
213            //
214            MBeanInfo mbi = mbs.getMBeanInfo(on);
215            Descriptor d = mbi.getDescriptor();
216            echo("MBeanInfo descriptor = " + d);
217            if (d == null || d.getFieldNames().length == 0) {
218                error++;
219                echo("Descriptor is null or empty");
220                continue;
221            }
222            if (testInstances[i] instanceof ImmutableInfo) {
223                if ("true".equals(d.getFieldValue("immutableInfo"))) {
224                    echo("OK: immutableInfo field is true");
225                } else {
226                    echo("KO: immutableInfo field should be true");
227                    error++;
228                }
229                continue;
230            }
231            if (testInstances[i] instanceof NonImmutableInfo) {
232                if ("false".equals(d.getFieldValue("immutableInfo"))) {
233                    echo("OK: immutableInfo field is false");
234                } else {
235                    echo("KO: immutableInfo field should be false");
236                    error++;
237                }
238                continue;
239            }
240        }
241
242        if (error > 0) {
243            echo("\nTest failed! " + error + " errors.\n");
244            throw new IllegalArgumentException("Test failed");
245        } else {
246            echo("\nTest passed!\n");
247        }
248    }
249
250    private static void echo(String msg) {
251        System.out.println(msg);
252    }
253}
254