“1363c3cd8603a913a27e2995dccbd70d5312d8e6”上不存在“arch/x86/mm/hugetlbpage.c”
提交 3cbc9252 编写于 作者: R robm

Merge

......@@ -34,6 +34,7 @@ import java.awt.event.MouseEvent;
import java.awt.event.InputEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.KeyEvent;
import java.util.Locale;
/**
* Translates NSEvents/NPCocoaEvents into AWT events.
......@@ -171,6 +172,16 @@ final class CPlatformResponder {
}
}
// If Pinyin Simplified input method is selected, CAPS_LOCK key is supposed to switch
// input to latin letters.
// It is necessary to use testCharIgnoringModifiers instead of testChar for event
// generation in such case to avoid uppercase letters in text components.
LWCToolkit lwcToolkit = (LWCToolkit)Toolkit.getDefaultToolkit();
if (lwcToolkit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK) &&
Locale.SIMPLIFIED_CHINESE.equals(lwcToolkit.getDefaultKeyboardLocale())) {
testChar = testCharIgnoringModifiers;
}
jkeyCode = out[0];
jkeyLocation = out[1];
jeventType = isNpapiCallback ? NSEvent.npToJavaEventType(eventType) :
......
......@@ -536,8 +536,10 @@ AWT_ASSERT_APPKIT_THREAD;
}
-(BOOL) isCodePointInUnicodeBlockNeedingIMEvent: (unichar) codePoint {
if ((codePoint >= 0x3000) && (codePoint <= 0x303F)) {
// Code point is in 'CJK Symbols and Punctuation' Unicode block.
if (((codePoint >= 0x3000) && (codePoint <= 0x303F)) ||
((codePoint >= 0xFF00) && (codePoint <= 0xFFEF))) {
// Code point is in 'CJK Symbols and Punctuation' or
// 'Halfwidth and Fullwidth Forms' Unicode block.
return YES;
}
return NO;
......
......@@ -71,6 +71,17 @@ public final class DHKeyPairGenerator extends KeyPairGeneratorSpi {
initialize(1024, null);
}
private static void checkKeySize(int keysize)
throws InvalidParameterException {
if ((keysize < 512) || (keysize > 2048) || ((keysize & 0x3F) != 0)) {
throw new InvalidParameterException(
"DH key size must be multiple of 64, and can only range " +
"from 512 to 2048 (inclusive). " +
"The specific key size " + keysize + " is not supported");
}
}
/**
* Initializes this key pair generator for a certain keysize and source of
* randomness.
......@@ -80,12 +91,8 @@ public final class DHKeyPairGenerator extends KeyPairGeneratorSpi {
* @param random the source of randomness
*/
public void initialize(int keysize, SecureRandom random) {
if ((keysize < 512) || (keysize > 2048) || (keysize % 64 != 0)) {
throw new InvalidParameterException("Keysize must be multiple "
+ "of 64, and can only range "
+ "from 512 to 2048 "
+ "(inclusive)");
}
checkKeySize(keysize);
this.pSize = keysize;
this.lSize = 0;
this.random = random;
......@@ -115,11 +122,10 @@ public final class DHKeyPairGenerator extends KeyPairGeneratorSpi {
params = (DHParameterSpec)algParams;
pSize = params.getP().bitLength();
if ((pSize < 512) || (pSize > 2048) ||
(pSize % 64 != 0)) {
throw new InvalidAlgorithmParameterException
("Prime size must be multiple of 64, and can only range "
+ "from 512 to 2048 (inclusive)");
try {
checkKeySize(pSize);
} catch (InvalidParameterException ipe) {
throw new InvalidAlgorithmParameterException(ipe.getMessage());
}
// exponent size is optional, could be 0
......
......@@ -59,12 +59,13 @@ extends AlgorithmParameterGeneratorSpi {
private SecureRandom random = null;
private static void checkKeySize(int keysize)
throws InvalidAlgorithmParameterException {
if ((keysize != 2048) &&
throws InvalidParameterException {
if ((keysize != 2048) &&
((keysize < 512) || (keysize > 1024) || (keysize % 64 != 0))) {
throw new InvalidAlgorithmParameterException(
"Keysize must be multiple of 64 ranging from "
+ "512 to 1024 (inclusive), or 2048");
throw new InvalidParameterException(
"DH key size must be multiple of 64 and range " +
"from 512 to 1024 (inclusive), or 2048. " +
"The specific key size " + keysize + " is not supported");
}
}
......@@ -78,11 +79,7 @@ extends AlgorithmParameterGeneratorSpi {
*/
protected void engineInit(int keysize, SecureRandom random) {
// Re-uses DSA parameters and thus have the same range
try {
checkKeySize(keysize);
} catch (InvalidAlgorithmParameterException ex) {
throw new InvalidParameterException(ex.getMessage());
}
checkKeySize(keysize);
this.primeSize = keysize;
this.random = random;
}
......@@ -111,7 +108,11 @@ extends AlgorithmParameterGeneratorSpi {
primeSize = dhParamSpec.getPrimeSize();
// Re-uses DSA parameters and thus have the same range
checkKeySize(primeSize);
try {
checkKeySize(primeSize);
} catch (InvalidParameterException ipe) {
throw new InvalidAlgorithmParameterException(ipe.getMessage());
}
exponentSize = dhParamSpec.getExponentSize();
if (exponentSize <= 0) {
......
/*
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -60,7 +60,6 @@ class DigestClientId extends SimpleClientId {
final private String[] propvals;
final private int myHash;
private int pHash = 0;
DigestClientId(int version, String hostname, int port,
String protocol, Control[] bindCtls, OutputStream trace,
......@@ -78,12 +77,9 @@ class DigestClientId extends SimpleClientId {
propvals = new String[SASL_PROPS.length];
for (int i = 0; i < SASL_PROPS.length; i++) {
propvals[i] = (String) env.get(SASL_PROPS[i]);
if (propvals[i] != null) {
pHash = pHash * 31 + propvals[i].hashCode();
}
}
}
myHash = super.hashCode() + pHash;
myHash = super.hashCode() ^ Arrays.hashCode(propvals);
}
public boolean equals(Object obj) {
......@@ -92,7 +88,6 @@ class DigestClientId extends SimpleClientId {
}
DigestClientId other = (DigestClientId)obj;
return myHash == other.myHash
&& pHash == other.pHash
&& super.equals(obj)
&& Arrays.equals(propvals, other.propvals);
}
......
/*
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -49,21 +49,23 @@ class SimpleClientId extends ClientId {
socketFactory);
this.username = username;
int pwdHashCode = 0;
if (passwd == null) {
this.passwd = null;
} else if (passwd instanceof String) {
this.passwd = passwd;
} else if (passwd instanceof byte[]) {
this.passwd = ((byte[])passwd).clone();
pwdHashCode = Arrays.hashCode((byte[])passwd);
} else if (passwd instanceof char[]) {
this.passwd = ((char[])passwd).clone();
pwdHashCode = Arrays.hashCode((char[])passwd);
} else {
this.passwd = passwd;
pwdHashCode = passwd.hashCode();
}
myHash = super.hashCode()
+ (username != null ? username.hashCode() : 0)
+ (passwd != null ? passwd.hashCode() : 0);
^ (username != null ? username.hashCode() : 0)
^ pwdHashCode;
}
public boolean equals(Object obj) {
......
......@@ -118,7 +118,11 @@ final public class Pool {
PooledConnectionFactory factory) throws NamingException {
d("get(): ", id);
d("size: ", map.size());
if (debug) {
synchronized (map) {
d("size: ", map.size());
}
}
expungeStaleConnections();
......@@ -141,10 +145,9 @@ final public class Pool {
// Keep the weak reference through the element of a linked list
weakRefs.add(weakRef);
}
d("get(): size after: ", map.size());
}
d("get(): size after: ", map.size());
return conns.get(timeout, factory); // get one connection from list
}
......@@ -209,19 +212,24 @@ final public class Pool {
out.println("maximum pool size: " + maxSize);
out.println("preferred pool size: " + prefSize);
out.println("initial pool size: " + initSize);
out.println("current pool size: " + map.size());
for (Map.Entry<Object, ConnectionsRef> entry : map.entrySet()) {
id = entry.getKey();
conns = entry.getValue().getConnections();
out.println(" " + id + ":" + conns.getStats());
synchronized (map) {
out.println("current pool size: " + map.size());
for (Map.Entry<Object, ConnectionsRef> entry : map.entrySet()) {
id = entry.getKey();
conns = entry.getValue().getConnections();
out.println(" " + id + ":" + conns.getStats());
}
}
out.println("====== Pool end =====================");
}
public String toString() {
return super.toString() + " " + map.toString();
synchronized (map) {
return super.toString() + " " + map.toString();
}
}
private void d(String msg, int i) {
......
......@@ -1006,6 +1006,8 @@ public class BasicComboPopup extends JPopupMenu implements ComboPopup {
if (e.getStateChange() == ItemEvent.SELECTED) {
JComboBox comboBox = (JComboBox)e.getSource();
setListSelection(comboBox.getSelectedIndex());
} else {
setListSelection(-1);
}
}
......
......@@ -270,10 +270,21 @@ public final class CompositeFont extends Font2D {
if (componentNames[slot] == null) {
componentNames[slot] = name;
} else if (!componentNames[slot].equalsIgnoreCase(name)) {
components[slot] =
(PhysicalFont) fm.findFont2D(componentNames[slot],
style,
/* If a component specifies the file with a bad font,
* the corresponding slot will be initialized by
* default physical font. In such case findFont2D may
* return composite font which cannot be casted to
* physical font.
*/
try {
components[slot] =
(PhysicalFont) fm.findFont2D(componentNames[slot],
style,
FontManager.PHYSICAL_FALLBACK);
} catch (ClassCastException cce) {
/* Assign default physical font to the slot */
components[slot] = fm.getDefaultPhysicalFont();
}
}
}
deferredInitialisation[slot] = false;
......
......@@ -44,7 +44,7 @@ public final class ScriptRunData {
if (cp >= data[cache] && cp < data[cache+2]) {
return data[cache+1];
}
if (cp >= CHAR_START & cp < CHAR_LIMIT) {
if ((cp >= CHAR_START) && (cp < CHAR_LIMIT)) {
int probe = dataPower;
int index = 0;
......
......@@ -228,29 +228,34 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi {
// check native range first
if ((minKeySize != -1) && (keySize < minKeySize)) {
throw new InvalidAlgorithmParameterException(algorithm +
" key must be at least " + minKeySize + " bits");
" key must be at least " + minKeySize + " bits. " +
"The specific key size " + keySize + " is not supported");
}
if ((maxKeySize != -1) && (keySize > maxKeySize)) {
throw new InvalidAlgorithmParameterException(algorithm +
" key must be at most " + maxKeySize + " bits");
" key must be at most " + maxKeySize + " bits. " +
"The specific key size " + keySize + " is not supported");
}
// check our own algorithm-specific limits also
if (algorithm.equals("EC")) {
if (keySize < 112) {
throw new InvalidAlgorithmParameterException
("Key size must be at least 112 bit");
throw new InvalidAlgorithmParameterException(
"EC key size must be at least 112 bit. " +
"The specific key size " + keySize + " is not supported");
}
if (keySize > 2048) {
// sanity check, nobody really wants keys this large
throw new InvalidAlgorithmParameterException
("Key size must be at most 2048 bit");
throw new InvalidAlgorithmParameterException(
"EC key size must be at most 2048 bit. " +
"The specific key size " + keySize + " is not supported");
}
} else {
// RSA, DH, DSA
if (keySize < 512) {
throw new InvalidAlgorithmParameterException
("Key size must be at least 512 bit");
throw new InvalidAlgorithmParameterException(algorithm +
" key size must be at least 512 bit. " +
"The specific key size " + keySize + " is not supported");
}
if (algorithm.equals("RSA")) {
BigInteger tmpExponent = rsaPublicExponent;
......@@ -271,8 +276,10 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi {
if (algorithm.equals("DH") && (params != null)) {
// sanity check, nobody really wants keys this large
if (keySize > 64 * 1024) {
throw new InvalidAlgorithmParameterException
("Key size must be at most 65536 bit");
throw new InvalidAlgorithmParameterException(
"DH key size must be at most 65536 bit. " +
"The specific key size " +
keySize + " is not supported");
}
} else {
// this restriction is in the spec for DSA
......@@ -282,7 +289,9 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi {
((keySize > 1024) || ((keySize & 0x3f) != 0))) {
throw new InvalidAlgorithmParameterException(algorithm +
" key must be multiples of 64 if less than 1024 bits" +
", or 2048 bits");
", or 2048 bits. " +
"The specific key size " +
keySize + " is not supported");
}
}
}
......
......@@ -137,8 +137,10 @@ final class ServerHandshaker extends Handshaker {
customizedDHKeySize = Integer.parseUnsignedInt(property);
if (customizedDHKeySize < 1024 || customizedDHKeySize > 2048) {
throw new IllegalArgumentException(
"Customized DH key size should be positive integer " +
"between 1024 and 2048 bits, inclusive");
"Unsupported customized DH key size: " +
customizedDHKeySize + ". " +
"The key size can only range from 1024" +
" to 2048 (inclusive)");
}
} catch (NumberFormatException nfe) {
throw new IllegalArgumentException(
......
......@@ -155,6 +155,7 @@ static char* next_arg(char* cmdline, char* arg, jboolean* wildcard) {
}
}
dest += copyCh(ch, dest);
slashes = 0;
break;
default:
......
......@@ -102,7 +102,7 @@ echo "resume 1";
sleep 5 # give time for Client to throw exception
# JVM_PROC should have exited but just in case, include it.
kill -9 $ORB_PROC $JVM_PROC
kill -9 $ORB_PROC $JVM_PROC $SERVER_PROC
grep "ORBUtilSystemException.writeErrorSend" client.$$
result=$?
......
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -150,11 +150,6 @@ public abstract class TestCipher {
}
// Encryption
int PAD_LEN = 0;
if (pad.equalsIgnoreCase("PKCS5Padding")) {
// Need to consider pad bytes
PAD_LEN = 8;
}
byte[] plainText = INPUT_TEXT.clone();
......@@ -162,12 +157,13 @@ public abstract class TestCipher {
byte[] cipherText = ci.doFinal(INPUT_TEXT, ENC_OFFSET, TEXT_LEN);
// Generate cipher and save to same buffer
int offset = ci.update(
int enc_bytes = ci.update(
INPUT_TEXT, ENC_OFFSET, TEXT_LEN, INPUT_TEXT, STORAGE_OFFSET);
ci.doFinal(INPUT_TEXT, offset + STORAGE_OFFSET);
enc_bytes += ci.doFinal(INPUT_TEXT, enc_bytes + STORAGE_OFFSET);
if (!equalsBlock(
INPUT_TEXT, STORAGE_OFFSET, cipherText, 0, cipherText.length)) {
INPUT_TEXT, STORAGE_OFFSET, enc_bytes,
cipherText, 0, cipherText.length)) {
throw new RuntimeException(
"Different ciphers generated with same buffer");
}
......@@ -183,8 +179,8 @@ public abstract class TestCipher {
byte[] recoveredText = ci.doFinal(cipherText, 0, cipherText.length);
if (!equalsBlock(
plainText, ENC_OFFSET, recoveredText, 0,
recoveredText.length)) {
plainText, ENC_OFFSET, TEXT_LEN,
recoveredText, 0, recoveredText.length)) {
throw new RuntimeException(
"Recovered text not same as plain text");
} else {
......@@ -192,13 +188,13 @@ public abstract class TestCipher {
}
// Recover text from cipher and save to same buffer
ci.update(INPUT_TEXT, STORAGE_OFFSET, TEXT_LEN + PAD_LEN, INPUT_TEXT,
ENC_OFFSET);
ci.doFinal(INPUT_TEXT, ENC_OFFSET);
int dec_bytes = ci.update(
INPUT_TEXT, STORAGE_OFFSET, enc_bytes, INPUT_TEXT, ENC_OFFSET);
dec_bytes += ci.doFinal(INPUT_TEXT, dec_bytes + ENC_OFFSET);
if (!equalsBlock(
plainText, ENC_OFFSET, recoveredText, 0,
recoveredText.length)) {
plainText, ENC_OFFSET, TEXT_LEN,
INPUT_TEXT, ENC_OFFSET, dec_bytes)) {
throw new RuntimeException(
"Recovered text not same as plain text with same buffer");
} else {
......@@ -208,9 +204,12 @@ public abstract class TestCipher {
out.println("Test Passed.");
}
private static boolean equalsBlock(byte[] b1, int off1, byte[] b2, int off2,
int len) {
for (int i = off1, j = off2, k = 0; k < len; i++, j++, k++) {
private static boolean equalsBlock(byte[] b1, int off1, int len1,
byte[] b2, int off2, int len2) {
if (len1 != len2) {
return false;
}
for (int i = off1, j = off2, k = 0; k < len1; i++, j++, k++) {
if (b1[i] != b2[j]) {
return false;
}
......
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8158802
* @summary com.sun.jndi.ldap.SimpleClientId produces wrong hash code
* @modules java.naming/com.sun.jndi.ldap
*/
import java.io.OutputStream;
import java.lang.reflect.Constructor;
import javax.naming.ldap.Control;
public class SimpleClientIdHashCode {
public static void main(String[] args) throws Throwable {
Class<?> simpleClientIdClass
= Class.forName("com.sun.jndi.ldap.SimpleClientId");
Constructor<?> init = simpleClientIdClass.getDeclaredConstructor(
int.class, String.class, int.class, String.class,
Control[].class, OutputStream.class, String.class,
String.class, Object.class);
init.setAccessible(true);
Object p1 = new byte[]{66,77};
Object p2 = new char[]{'w','d'};
Object p3 = "word";
test(init, new byte[]{65}, new byte[]{65});
test(init, new char[]{'p'}, new char[]{'p'});
test(init, "pass", "pass");
test(init, p1, p1);
test(init, p2, p2);
test(init, p3, p3);
test(init, null, null);
}
private static void test(Constructor<?> init, Object pass1, Object pass2)
throws Throwable {
Object o1 = init.newInstance(1, "host", 3, "", null, System.out,
null, null, pass1);
Object o2 = init.newInstance(1, "host", 3, "", null, System.out,
null, null, pass2);
if (!o1.equals(o2))
throw new RuntimeException("Objects not equal");
if (o1.hashCode() != o2.hashCode())
throw new RuntimeException("Inconsistent hash codes");
}
}
<!--
Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2 only, as
published by the Free Software Foundation.
This code is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
version 2 for more details (a copy is included in the LICENSE file that
accompanied this code).
You should have received a copy of the GNU General Public License version
2 along with this work; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
or visit www.oracle.com if you need additional information or have any
questions.
-->
<html>
<body>
Verify that Chinese comma can be entered in JTextField with Pinyin input method (IM).
This test is for OS X only. For other platforms please simply press "Pass".
1. Go to "System Preferences -> Keyboard -> Input Sources" and add "Pinyin – Traditional" or "Pinyin – Simplified" IM from Chinese language group.
2. Set current IM to "Pinyin".
3. Set focus to the text field of the test and press "comma" character on the keyboard.
4. Set current IM to the IM used before "Pinyin" was set.
5. If "," character is displayed in the text area, press "Pass", if "," character is displayed, press "Fail".
<applet code="bug8148984.class" width=400 height=400></applet>
</body>
</html>
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
* @bug 8148984
* @summary Chinese Comma cannot be entered using Pinyin Input Method on OS X
* @author Dmitry Markov
* @run applet/manual=yesno bug8148984.html
*/
import javax.swing.*;
public class bug8148984 extends JApplet {
@Override
public void init() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JPanel panel = new JPanel();
panel.add(new JLabel("Text field:"));
panel.add(new JTextField(20));
add(panel);
}
});
}
}
<!--
Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2 only, as
published by the Free Software Foundation.
This code is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
version 2 for more details (a copy is included in the LICENSE file that
accompanied this code).
You should have received a copy of the GNU General Public License version
2 along with this work; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
or visit www.oracle.com if you need additional information or have any
questions.
-->
<html>
<body>
Verify that Caps Lock key works properly with Pinyin input method, (i.e. if
Caps Lock is pressed, input should be swithced to lowercase latin letters).
This test is for OS X only. For other platforms please simply press "Pass".
1. Go to "System Preferences -> Keyboard -> Input Sources" and add "Pinyin – Traditional" or "Pinyin – Simplified" IM from Chinese language group.
2. Set current IM to "Pinyin".
3. Set focus to the text field of the test and press Caps Lock key on the keyboard.
4. Press "a" character on the keyboard
5. If "a" character is displayed in the text field, press "Pass", if "A" character is displayed, press "Fail".
<applet code="bug8154816.class" width=400 height=400></applet>
</body>
</html>
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
* @bug 8154816
* @summary Caps Lock doesn't work as expected when using Pinyin Simplified input method
* @author Dmitry Markov
* @run applet/manual=yesno bug8154816.html
*/
import javax.swing.*;
public class bug8154816 extends JApplet {
@Override
public void init() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JPanel panel = new JPanel();
panel.add(new JLabel("Text field:"));
panel.add(new JTextField(20));
add(panel);
}
});
}
}
/*
* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.util.ArrayList;
import javax.management.AttributeNotFoundException;
import javax.management.BadAttributeValueExpException;
import javax.management.BadBinaryOpValueExpException;
import javax.management.BadStringOperationException;
import javax.management.InstanceAlreadyExistsException;
import javax.management.InstanceNotFoundException;
import javax.management.IntrospectionException;
import javax.management.InvalidApplicationException;
import javax.management.InvalidAttributeValueException;
import javax.management.JMException;
import javax.management.JMRuntimeException;
import javax.management.ListenerNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanRegistrationException;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.OperationsException;
import javax.management.ReflectionException;
import javax.management.RuntimeErrorException;
import javax.management.RuntimeMBeanException;
import javax.management.RuntimeOperationsException;
import javax.management.ServiceNotFoundException;
import javax.management.StringValueExp;
import javax.management.modelmbean.InvalidTargetObjectTypeException;
import javax.management.modelmbean.XMLParseException;
import javax.management.monitor.MonitorSettingException;
import javax.management.openmbean.InvalidKeyException;
import javax.management.openmbean.InvalidOpenTypeException;
import javax.management.openmbean.KeyAlreadyExistsException;
import javax.management.openmbean.OpenDataException;
import javax.management.relation.InvalidRelationIdException;
import javax.management.relation.InvalidRelationServiceException;
import javax.management.relation.InvalidRelationTypeException;
import javax.management.relation.InvalidRoleInfoException;
import javax.management.relation.InvalidRoleValueException;
import javax.management.relation.RelationException;
import javax.management.relation.RelationNotFoundException;
import javax.management.relation.RelationServiceNotRegisteredException;
import javax.management.relation.RelationTypeNotFoundException;
import javax.management.relation.RoleInfoNotFoundException;
import javax.management.relation.RoleNotFoundException;
import javax.management.remote.JMXProviderException;
import javax.management.remote.JMXServerErrorException;
/**
* |----- Original Description Coming From Tonga Original Source Code -------|
* | |
* | That class creates an ArrayList and fill it with an instance of each of |
* | the Exception class of the JMX API. |
* | It's dedicated to use by ExceptionTest. |
* |-------------------------------------------------------------------------|
*/
public class ExceptionFactory {
public static final ArrayList<Exception> exceptions =
new ArrayList<Exception>();
static {
String mes = "SQE";
exceptions.add(new AttributeNotFoundException());
exceptions.add(new BadAttributeValueExpException(mes));
exceptions.add(new BadBinaryOpValueExpException(new StringValueExp(mes)));
exceptions.add(new BadStringOperationException(mes));
exceptions.add(new InstanceAlreadyExistsException());
exceptions.add(new InstanceNotFoundException());
exceptions.add(new IntrospectionException());
exceptions.add(new InvalidApplicationException(mes));
exceptions.add(new InvalidAttributeValueException());
exceptions.add(new JMException());
exceptions.add(new JMRuntimeException());
exceptions.add(new ListenerNotFoundException());
exceptions.add(new MalformedObjectNameException());
exceptions.add(new MBeanException(new Exception(mes), mes));
exceptions.add(new MBeanRegistrationException(new Exception(mes), mes));
exceptions.add(new NotCompliantMBeanException());
exceptions.add(new OperationsException());
exceptions.add(new ReflectionException(new Exception(mes), mes));
exceptions.add(new RuntimeErrorException(new Error(mes), mes));
exceptions.add(new RuntimeMBeanException(new RuntimeException(mes), mes));
exceptions.add(new RuntimeOperationsException(new RuntimeException(mes), mes));
exceptions.add(new ServiceNotFoundException());
exceptions.add(new InvalidTargetObjectTypeException());
exceptions.add(new XMLParseException());
exceptions.add(new MonitorSettingException());
exceptions.add(new InvalidKeyException());
exceptions.add(new InvalidOpenTypeException());
exceptions.add(new KeyAlreadyExistsException());
exceptions.add(new OpenDataException());
exceptions.add(new InvalidRelationIdException());
exceptions.add(new InvalidRelationServiceException());
exceptions.add(new InvalidRelationTypeException());
exceptions.add(new InvalidRoleInfoException());
exceptions.add(new InvalidRoleValueException());
exceptions.add(new RelationException());
exceptions.add(new RelationNotFoundException());
exceptions.add(new RelationServiceNotRegisteredException());
exceptions.add(new RelationTypeNotFoundException());
exceptions.add(new RoleInfoNotFoundException());
exceptions.add(new RoleNotFoundException());
exceptions.add(new JMXProviderException());
exceptions.add(new JMXServerErrorException(mes, new Error(mes)));
ExceptionTest.Utils.debug(ExceptionTest.Utils.DEBUG_STANDARD,
"DataFactory::updateMap: Initialized" +
" an ArrayList with the " +
exceptions.size() + " exceptions of the JMX API");
}
}
/*
* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8058865
* @summary Checks that exceptions are correctly wired (compared to reference).
* @author Olivier Lagneau
* @modules java.management
* @run main/othervm/timeout=300 -DDEBUG_STANDARD ExceptionTest
*/
import java.util.Map;
import java.util.HashMap;
import java.util.Properties;
import java.lang.reflect.Method;
import java.lang.management.ManagementFactory;
import javax.management.ObjectName;
import javax.management.MBeanServer;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
public class ExceptionTest {
/*
* First Debug properties and arguments are collect in expected
* map (argName, value) format, then calls original test's run method.
*/
public static void main(String args[]) throws Exception {
System.out.println("=================================================");
// Parses parameters
Utils.parseDebugProperties();
Map<String, Object> map = Utils.parseParameters(args) ;
// Run test
ExceptionTest test = new ExceptionTest();
test.run(map);
}
public void run(Map<String, Object> args) {
System.out.println("ExceptionTest::run: Start");
int errorCount = 0;
JMXConnectorServer cs = null;
JMXConnector cc = null;
try {
// JMX MbeanServer used inside single VM as if remote.
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
JMXServiceURL url = new JMXServiceURL("rmi", null, 0);
cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
cs.start();
JMXServiceURL addr = cs.getAddress();
cc = JMXConnectorFactory.connect(addr);
MBeanServerConnection mbsc = cc.getMBeanServerConnection();
// ----
ObjectName objName =
new ObjectName(ExceptionThrower.EXCEPTION_THROWER_NAME);
System.out.println("ExceptionTest::run: Create and register MBean " + objName);
mbsc.createMBean("ExceptionThrower", objName);
System.out.println("---- OK\n");
// ----
System.out.println("ExceptionTest::run: Ask for exception(s)");
Object[] throwExceptionParam = new Object[1];
String[] throwExceptionSig = new String[]{"int"};
for (int i = 0; i < ExceptionFactory.exceptions.size(); i++) {
throwExceptionParam[0] = new Integer(i);
Exception ex =
(Exception)mbsc.invoke(objName,
"throwException", throwExceptionParam, throwExceptionSig);
if ( ! matches(ex, ExceptionFactory.exceptions.get(i)) ) {
errorCount++;
System.out.println("ExceptionTest::run: (ERROR) Received \n["
+ ex + "]\nin place of\n["
+ ExceptionFactory.exceptions.get(i) + "]");
} else {
System.out.println("OK [" + ex + "]");
}
}
System.out.println("---- DONE\n");
} catch (Exception e) {
Utils.printThrowable(e, true);
throw new RuntimeException();
} finally {
try {
// Close JMX Connector Client
cc.close();
// Stop connertor server
cs.stop();
} catch (Exception e) {
Utils.printThrowable(e, true);
throw new RuntimeException(
"Unable to either close connector client or stop connector server");
}
}
if (errorCount == 0) {
System.out.println("ExceptionTest::run: Done without any error");
} else {
System.out.println("ExceptionTest::run: Done with " + errorCount
+ " error(s)");
throw new RuntimeException("errorCount = " + errorCount);
}
System.out.println("ExceptionTest::run: Done");
}
// Check both Exception are identical.
// That means:
// - none is null.
// - they are of the same Class.
// - if their respective messages aren't null they're equal.
// - if the message of one is null the message of the other is null too.
private boolean matches(Exception ex, Exception refex) {
if ( ex == null || refex == null ) {
System.out.println("(ERROR) Called with one or more null parameter; check "
+ ex + " against " + refex);
return false;
}
String exClass = ex.getClass().getName();
String refexClass = refex.getClass().getName();
if ( ! exClass.equals(refexClass) ) {
System.out.println("(ERROR) Class names don't match; check ["
+ exClass + "] against [" + refexClass + "]");
return false;
}
String exMes = ex.getMessage();
String refexMes = refex.getMessage();
if ( exMes != null && refexMes != null ) {
if ( ! exMes.equals(refexMes) ) {
System.out.println("(ERROR) Non null messages don't match; check ["
+ exMes + "] against [" + refexMes + "]");
return false;
}
} else if ( (exMes == null && refexMes != null)
|| (exMes != null && refexMes == null) ) {
System.out.println("(ERROR) Messages don't match; check [" + exMes
+ "] against [" + refexMes + "]");
}
return true;
}
// Utility inner class coming from JMX Tonga test suite.
// Also used by ExceptionFactory.
static class Utils {
// DEBUG is printed depending on the DEBUG and DEBUG_LEVEL JAVA property
static final String DEBUG_HEADER = "[debug] ";
// DEBUG levels
static int selectedDebugLevel = 0;
static final int DEBUG_STANDARD = 1;
static final int DEBUG_VERBOSE = 2; // Mainly used for stress tests
static final int DEBUG_ALL = DEBUG_STANDARD | DEBUG_VERBOSE;
static void parseDebugProperties() {
int level = 0;
Properties p = System.getProperties();
// get selected levels
if (p.getProperty("DEBUG_STANDARD") != null) {
level |= DEBUG_STANDARD;
}
if (p.getProperty("DEBUG_VERBOSE") != null) {
level |= DEBUG_VERBOSE;
}
if (p.getProperty("DEBUG_ALL") != null) {
level |= DEBUG_ALL;
}
selectedDebugLevel = level;
}
/**
* Reproduces the original parsing and collection of test parameters
* from the DTonga JMX test suite.
*
* Collects passed args and returns them in a map(argname, value) structure,
* which will be then propagated as necessary to various called methods.
*/
static Map<String, Object> parseParameters(String args[])
throws Exception {
debug(DEBUG_STANDARD, "TestRoot::parseParameters: Start");
HashMap<String, Object> map = new HashMap<>();
for ( int i = 0; i < args.length; i++ ) {
if ( args[i].trim().startsWith("-") ) {
if ((i+1) < args.length && !args[i+1].startsWith("-") ) {
debug(DEBUG_STANDARD,
"TestRoot::parseParameters: added in map = " +
args[i] +
" with value " +
args[i+1]) ;
map.put(args[i].trim(), args[i+1].trim()) ;
} else if ((i+1) < args.length && args[i+1].startsWith("-") ||
(i+1) == args.length ) {
debug(DEBUG_STANDARD,
"TestRoot::parseParameters: added in map = " +
args[i] +
" with null value") ;
map.put(args[i].trim(), null) ;
} else {
System.out.println(
"TestRoot::parseParameters: (WARNING) not added in map = " +
args[i]) ;
}
}
}
debug(DEBUG_STANDARD, "TestRoot::parseParameters: Done") ;
return map ;
}
/**
* This method is to be used in all tests to print anything
* that is temporary.
* Printing is done only when debug is activated by the property DEBUG.
* Printing depends also on the DEBUG_LEVEL property.
* Here it encapsulates a System.out.println.
*/
static void debug(int level, String line) {
if ((selectedDebugLevel & level) != 0) {
System.out.println(DEBUG_HEADER + line);
}
}
/**
* Do print stack trace when withStack is true.
* Does try to call getTargetException() and getTargetError() then
* print embedded stacks in the case of an Exception wrapping
* another Exception or an Error. Recurse until no more wrapping
* is found.
*/
static void printThrowable(Throwable theThro, boolean withStack) {
try {
if (withStack) {
theThro.printStackTrace(System.out);
}
if (theThro instanceof Exception) {
Exception t = (Exception) theThro;
Method target = null;
String blank = " ";
try {
target = t.getClass().getMethod("getTargetException",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetException method could be there or not
}
System.out.println(blank + t.getClass() + "==>" + t.getMessage());
while (target != null) {
try {
t = (Exception) target.invoke(t,
(java.lang.Object[]) null);
} catch (Exception ee) {
t = null;
}
try {
if (t != null) {
blank = blank + " ";
System.out.println(blank + t.getClass() + "==>" +
t.getMessage());
try {
target =
t.getClass().getMethod("getTargetException",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetException method could be there or not }
}
} else {
target = null;
}
} catch (Exception ee) {
target = null;
}
}
// We may have exceptions wrapping an Error then it is
// getTargetError that is likely to be called
try {
target = ((Exception) theThro).getClass().getMethod("getTargetError",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetError method could be there or not
}
Throwable err = theThro;
while (target != null) {
try {
err = (Error) target.invoke(err,
(java.lang.Object[]) null);
} catch (Exception ee) {
err = null;
}
try {
if (err != null) {
blank = blank + " ";
System.out.println(blank + err.getClass() + "==>" +
err.getMessage());
if (withStack) {
err.printStackTrace(System.out);
}
try {
target = err.getClass().getMethod("getTargetError",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetError method could be there or not
}
} else {
target = null;
}
} catch (Exception ee) {
target = null;
}
}
} else {
System.out.println("Throwable is : " + theThro);
}
} catch (Throwable x) {
System.out.println("Exception : raised in printException : " + x);
}
}
}
}
/*
* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* This class defines a simple standard MBean.
*/
public class ExceptionThrower implements ExceptionThrowerMBean {
public static final String EXCEPTION_THROWER_NAME
= "sqe:type=ExceptionThrower";
public Exception throwException(int exceptionIndex) {
return ExceptionFactory.exceptions.get(exceptionIndex);
}
}
/*
* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* This interface defines a simple standard MBean.
*/
public interface ExceptionThrowerMBean {
public Exception throwException(int exceptionIndex);
}
......@@ -27,6 +27,7 @@
* @summary Test that no locks are held when a monitor attribute is sampled
* or notif delivered.
* @author Eamonn McManus
* @library /lib/testlibrary
* @run clean GaugeMonitorDeadlockTest
* @run build GaugeMonitorDeadlockTest
* @run main GaugeMonitorDeadlockTest 1
......@@ -47,6 +48,8 @@ import javax.management.ObjectName;
import javax.management.monitor.GaugeMonitor;
import javax.management.monitor.GaugeMonitorMBean;
import jdk.testlibrary.Utils;
public class GaugeMonitorDeadlockTest {
private static enum When {IN_GET_ATTRIBUTE, IN_NOTIFY};
private static long checkingTime;
......@@ -54,8 +57,7 @@ public class GaugeMonitorDeadlockTest {
public static void main(String[] args) throws Exception {
if (args.length != 1)
throw new Exception("Arg should be test number");
double factor = Double.parseDouble(System.getProperty("test.timeout.factor", "1.0"));
checkingTime = (long)factor*1000;
checkingTime = Utils.adjustTimeout(1000); // default 1s timeout
System.out.println("=== checkingTime = " + checkingTime + "ms");
int testNo = Integer.parseInt(args[0]) - 1;
......@@ -101,11 +103,12 @@ public class GaugeMonitorDeadlockTest {
monitorProxy.setGranularityPeriod(10L); // 10 ms
monitorProxy.setNotifyHigh(true);
monitorProxy.setNotifyLow(true);
monitorProxy.start();
System.out.println("=== Waiting observedProxy.getGetCount() to be "
+ "changed, presumable deadlock if timeout?");
final int initGetCount = observedProxy.getGetCount();
monitorProxy.start();
long checkedTime = System.currentTimeMillis();
long nowTime;
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
......
......@@ -37,7 +37,6 @@
import java.lang.management.ManagementFactory;
import java.util.concurrent.atomic.AtomicInteger;
import javax.management.Attribute;
import javax.management.JMX;
import javax.management.MBeanServer;
import javax.management.Notification;
......@@ -95,9 +94,10 @@ public class StringMonitorDeadlockTest {
monitorProxy.setStringToCompare("old");
monitorProxy.setGranularityPeriod(10L); // 10 ms
monitorProxy.setNotifyDiffer(true);
monitorProxy.start();
final int initGetCount = observedProxy.getGetCount();
monitorProxy.start();
int getCount = initGetCount;
for (int i = 0; i < 500; i++) { // 500 * 10 = 5 seconds
getCount = observedProxy.getGetCount();
......
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import javax.management.Descriptor;
import javax.management.ImmutableDescriptor;
import javax.management.ListenerNotFoundException;
import javax.management.MBeanNotificationInfo;
import javax.management.MBeanRegistration;
import javax.management.MBeanServer;
import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;
import javax.management.NotificationEmitter;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;
import javax.management.ObjectName;
/**
* Class Basic
* Basic Description
*/
public class Basic implements BasicMXBean, NotificationEmitter,
MBeanRegistration {
public static final String EXCEPTION_MESSAGE = "from Basic";
public static final String NOTIFICATION_MESSAGE = "from Basic";
/** Attribute : IntAtt */
private int intAtt = 0;
/** Attribute : IntegerAtt */
private Integer integerAtt = 0;
/** Attribute : BoolAtt */
private boolean boolAtt = false;
/** Attribute : BooleanAtt */
private Boolean booleanAtt = false;
/** Attribute : StringAtt */
private String stringAtt = null;
/** Attribute : DateAtt */
private Date dateAtt = null;
/** Attribute : ObjectNameAtt */
private ObjectName objectNameAtt = null;
/** Attribute : NotifDescriptorAsMapAtt */
private Map<String, String> notifDescriptorAsMapAtt = null;
/** Attribute : NotifDescriptorAtt */
private Descriptor notifDescriptorAtt = null;
/** Attribute : SqeParameter */
private SqeParameter sqeParameterAtt = null;
/* Creates a new instance of Basic */
@SqeDescriptorKey("CONSTRUCTOR Basic")
public Basic() {
}
/* Creates a new instance of Basic */
@SqeDescriptorKey("CONSTRUCTOR Basic")
public Basic(
@SqeDescriptorKey("CONSTRUCTOR PARAMETER SqeParameter") SqeParameter param) {
}
/**
* Get int attribute
*/
public int getIntAtt() {
return intAtt;
}
/**
* Set int attribute
*/
public void setIntAtt(int value) {
intAtt = value;
}
/**
* Get Integer attribute
*/
public Integer getIntegerAtt() {
return integerAtt;
}
/**
* Set Integer attribute
*/
public void setIntegerAtt(Integer value) {
integerAtt = value;
}
/**
* Get boolean attribute
*/
public boolean getBoolAtt() {
return boolAtt;
}
/**
* Set boolean attribute
*/
public void setBoolAtt(boolean value) {
boolAtt = value;
}
/**
* Get Boolean attribute
*/
public Boolean getBooleanAtt() {
return booleanAtt;
}
/**
* Set Boolean attribute
*/
public void setBooleanAtt(Boolean value) {
booleanAtt = value;
}
/**
* Get String attribute
*/
public String getStringAtt() {
return stringAtt;
}
/**
* Set String attribute
*/
public void setStringAtt(String value) {
stringAtt = value;
}
/**
* Get Date attribute
*/
public Date getDateAtt() {
return dateAtt;
}
/**
* Set Date attribute
*/
public void setDateAtt(Date value) {
dateAtt = value;
}
/**
* Get ObjectName attribute
*/
public ObjectName getObjectNameAtt() {
return objectNameAtt;
}
/**
* Set ObjectName attribute
*/
public void setObjectNameAtt(ObjectName value) {
objectNameAtt = value;
}
/**
* Get SqeParameter attribute
*/
public SqeParameter getSqeParameterAtt() throws Exception {
if (sqeParameterAtt == null) {
sqeParameterAtt = new SqeParameter();
sqeParameterAtt.setGlop("INITIALIZED");
}
return sqeParameterAtt;
}
/**
* Set SqeParameter attribute
*/
public void setSqeParameterAtt(SqeParameter value) {
sqeParameterAtt = value;
}
/**
* Get the Descriptor used to build the NotificationInfo
* of emitted notifications.
*/
public Map<String, String> getNotifDescriptorAsMapAtt() {
if (notifDescriptorAsMapAtt == null) {
initNotifDescriptorAtt();
}
return notifDescriptorAsMapAtt;
}
/**
* Set the Descriptor used to build the NotificationInfo
* of emitted notifications.
* <br>A Map<String, Object> would better fit Descriptor needs but then
* it is not convertible according the MXBean specification so the MBean
* registration fails.
* As we plan to test our custom Descriptor finds its way into
* the metadata of emitted notifications, String is good enough.
*/
public void setNotifDescriptorAsMapAtt(Map<String, String> value) {
notifDescriptorAsMapAtt = new HashMap<String, String>(value);
notifDescriptorAtt = new ImmutableDescriptor(value);
}
/**
* Do nothing
*/
public void doNothing() {
// I said NOTHING !
}
/**
* Do take SqeParameter as a parameter
*/
public void doWeird(SqeParameter param) {
}
/**
* Throw an Exception
*/
public void throwException() throws Exception {
throw new Exception(EXCEPTION_MESSAGE);
}
/**
* Throw an Error
*/
public void throwError() {
throw new InternalError(EXCEPTION_MESSAGE);
}
/**
* Reset all attributes
*/
public void reset() {
intAtt = 0;
integerAtt = 0;
boolAtt = false;
booleanAtt = Boolean.FALSE;
stringAtt = null;
dateAtt = null;
objectNameAtt = null;
}
/**
* Returns the weather for the coming days
* @param verbose <code>boolean</code> verbosity
* @throws java.lang.Exception <code>storm</code>
* @return <code>ObjectName</code>
*/
public Weather getWeather(boolean verbose)
throws java.lang.Exception {
return Weather.SUNNY;
}
// Starting here are the 4 methods of MBeanRegistration interface.
// We use that to grab the ObjectName the MBean is registered with.
//
public ObjectName preRegister(MBeanServer server, ObjectName name)
throws Exception {
// Grab a reference on the MBeanServer we're registered in.
mbs = server;
// Compute the name we're registered with.
if (name != null) {
mbeanName = name;
return name;
} else {
mbeanName =
new ObjectName("sqe:type=" + Basic.class.getName());
return mbeanName;
}
}
public void postRegister(Boolean registrationDone) {
// Do nothing
}
public void preDeregister() throws Exception {
// Do nothing
}
public void postDeregister() {
// Do nothing
}
/**
* Send one Notification of the provided notifType type.
*/
public void sendNotification(String notifType) {
Notification notification = null;
if (notifType.equals(NOTIF_TYPE_0)) {
notification = new Notification(NOTIF_TYPE_0,
mbeanName,
seqNumber,
NOTIFICATION_MESSAGE);
} else if (notifType.equals(NOTIF_TYPE_1)) {
notification = new SqeNotification(NOTIF_TYPE_1,
mbeanName,
seqNumber,
NOTIFICATION_MESSAGE);
}
seqNumber++;
broadcaster.sendNotification(notification);
}
/**
* That method starts a set of threads, each thread sends a given number of
* notifications.
* The number of threads can be set via the attribute numOfNotificationSenders.
* The number of notification sent by each thread can be set via
* the attribute numOfNotificationSenderLoops.
* Depending on the parameter customNotification we send either custom
* notification(s) or MBeanServer registration and unregistration notification(s).
* When customNotification=true the total number of notification(s) sent is
* (numOfNotificationSenders * numOfNotificationSenderLoops). They are
* sequentially of type NOTIF_TYPE_0 then NOTIF_TYPE_1 and so on.
*
* When customNotification=false the total number of notification(s) sent is
* (numOfNotificationSenders * numOfNotificationSenderLoops) registration
* notification(s)
* +
* (numOfNotificationSenders * numOfNotificationSenderLoops) unregistration
* notification(s)
*
* @throws java.lang.Exception
*/
public void sendNotificationWave(boolean customNotification) throws
Exception {
// Build the set of notification sender.
Collection<Callable<Integer>> tasks =
new HashSet<Callable<Integer>>(numOfNotificationSenders);
for (int i = 1; i <= numOfNotificationSenders; i++) {
tasks.add(new NotifSender(numOfNotificationSenderLoops,
customNotification, i));
}
// Start all notification sender in parallel.
ExecutorService execServ = null;
try {
execServ = Executors.newFixedThreadPool(numOfNotificationSenders);
List<Future<Integer>> taskHandlers = execServ.invokeAll(tasks);
checkNotifSenderThreadStatus(taskHandlers);
} finally {
if (!execServ.isShutdown()) {
execServ.shutdown();
}
}
}
public void setNumOfNotificationSenders(int value) {
numOfNotificationSenders = value;
}
public void setNumOfNotificationSenderLoops(int value) {
numOfNotificationSenderLoops = value;
}
/**
* MBean Notification support
* You shouldn't update these methods
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
public void addNotificationListener(NotificationListener listener,
NotificationFilter filter,
Object handback)
throws IllegalArgumentException {
broadcaster.addNotificationListener(listener, filter, handback);
}
public MBeanNotificationInfo[] getNotificationInfo() {
if (notifDescriptorAtt == null) {
initNotifDescriptorAtt();
}
return new MBeanNotificationInfo[]{
new MBeanNotificationInfo(new String[]{
NOTIF_TYPE_0
},
javax.management.Notification.class.getName(),
"Standard JMX Notification",
notifDescriptorAtt),
new MBeanNotificationInfo(new String[]{
NOTIF_TYPE_1
},
SqeNotification.class.getName(),
"SQE Notification",
notifDescriptorAtt)
};
}
public void removeNotificationListener(NotificationListener listener)
throws ListenerNotFoundException {
broadcaster.removeNotificationListener(listener);
}
public void removeNotificationListener(NotificationListener listener,
NotificationFilter filter,
Object handback)
throws ListenerNotFoundException {
broadcaster.removeNotificationListener(listener, filter, handback);
}
// </editor-fold>
private synchronized long getNextSeqNumber() {
return seqNumber++;
}
private void initNotifDescriptorAtt() {
String key = "CRABE";
String value = "TAMBOUR";
notifDescriptorAtt =
new ImmutableDescriptor(new String[]{key + "=" + value});
notifDescriptorAsMapAtt =
new HashMap<String, String>();
notifDescriptorAsMapAtt.put(key, value);
}
private void checkNotifSenderThreadStatus(
List<Future<Integer>> taskHandlers)
throws Exception {
String msgTag = "Basic::checkNotifSenderThreadStatus: ";
// Grab back status of each notification sender.
for (Future<Integer> f : taskHandlers) {
if (f.isCancelled()) {
String message = msgTag +
"---- ERROR : One thread has been cancelled";
System.out.println(message);
throw new RuntimeException(message);
} else {
Integer effectiveNumOfLoops = f.get();
if (effectiveNumOfLoops != numOfNotificationSenderLoops) {
String message = msgTag + "---- ERROR : One thread did " +
effectiveNumOfLoops + " loops in place of " +
numOfNotificationSenderLoops;
System.out.println(message);
throw new RuntimeException(message);
}
}
}
}
//
private int numOfNotificationSenderLoops = 2;
private int numOfNotificationSenders = 13;
private class NotifSender implements Callable<Integer> {
private int cycles;
private boolean customNotification;
private int senderID;
public NotifSender(int cycles, boolean customNotification, int id) {
this.cycles = cycles;
this.customNotification = customNotification;
this.senderID = id;
}
public Integer call() throws Exception {
int callsDone = 0;
try {
for (int i = 1; i <= cycles; i++) {
if (customNotification) {
if (i % 2 == 0) {
sendNotification(NOTIF_TYPE_0);
} else {
sendNotification(NOTIF_TYPE_1);
}
} else {
ObjectName mbeanName = new ObjectName("SQE:type=" +
mbeanClassName + ",senderID=" + senderID);
mbs.createMBean(mbeanClassName, mbeanName);
mbs.unregisterMBean(mbeanName);
}
callsDone++;
}
} catch (Exception e) {
System.out.println("NotifSender::call: (ERROR) Thread [" + senderID +
"] failed after " + callsDone + " cycles");
throw e;
}
return Integer.valueOf(callsDone);
}
}
//
private long seqNumber;
private final NotificationBroadcasterSupport broadcaster =
new NotificationBroadcasterSupport();
private ObjectName mbeanName;
private MBeanServer mbs;
private String mbeanClassName = "Simple";
/**
* Notification types definitions. To use when creating JMX Notifications.
*/
public static final String NOTIF_TYPE_0 =
"sqe.notification.a.type";
public static final String NOTIF_TYPE_1 =
"sqe.notification.b.type";
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.util.Date;
import java.util.Map;
import javax.management.ObjectName;
/**
* Interface BasicMBean
* Basic Description
*/
@SqeDescriptorKey("INTERFACE BasicMXBean")
public interface BasicMXBean
{
/**
* Get int attribute
*/
@SqeDescriptorKey("ATTRIBUTE intAtt")
public int getIntAtt();
/**
* Set int attribute
*/
@SqeDescriptorKey("ATTRIBUTE intAtt")
public void setIntAtt(int value);
/**
* Get Integer attribute
*/
@SqeDescriptorKey("ATTRIBUTE integerAtt")
public Integer getIntegerAtt();
/**
* Set Integer attribute
*/
@SqeDescriptorKey("ATTRIBUTE integerAtt")
public void setIntegerAtt(Integer value);
/**
* Get boolean attribute
*/
@SqeDescriptorKey("ATTRIBUTE boolAtt")
public boolean getBoolAtt();
/**
* Set boolean attribute
*/
@SqeDescriptorKey("ATTRIBUTE boolAtt")
public void setBoolAtt(boolean value);
/**
* Get Boolean attribute
*/
@SqeDescriptorKey("ATTRIBUTE booleanAtt")
public Boolean getBooleanAtt();
/**
* Set Boolean attribute
*/
@SqeDescriptorKey("ATTRIBUTE booleanAtt")
public void setBooleanAtt(Boolean value);
/**
* Get String attribute
*/
@SqeDescriptorKey("ATTRIBUTE stringAtt")
public String getStringAtt();
/**
* Set String attribute
*/
@SqeDescriptorKey("ATTRIBUTE stringAtt")
public void setStringAtt(String value);
/**
* Get Date attribute
*/
@SqeDescriptorKey("ATTRIBUTE dateAtt")
public Date getDateAtt();
/**
* Set Date attribute
*/
@SqeDescriptorKey("ATTRIBUTE dateAtt")
public void setDateAtt(Date value);
/**
* Get ObjectName attribute
*/
@SqeDescriptorKey("ATTRIBUTE objectNameAtt")
public ObjectName getObjectNameAtt();
/**
* Set ObjectName attribute
*/
@SqeDescriptorKey("ATTRIBUTE objectNameAtt")
public void setObjectNameAtt(ObjectName value);
/**
* Get SqeParameter attribute
*/
@SqeDescriptorKey("ATTRIBUTE sqeParameterAtt")
public SqeParameter getSqeParameterAtt() throws Exception;
/**
* Set SqeParameter attribute
*/
@SqeDescriptorKey("ATTRIBUTE sqeParameterAtt")
public void setSqeParameterAtt(SqeParameter value);
/**
* Set NumOfNotificationSenders attribute
*/
@SqeDescriptorKey("ATTRIBUTE NumOfNotificationSenders")
public void setNumOfNotificationSenders(int value);
/**
* Set NumOfNotificationSenderLoops attribute
*/
@SqeDescriptorKey("ATTRIBUTE NumOfNotificationSenderLoops")
public void setNumOfNotificationSenderLoops(int value);
/**
* do nothing
*
*/
@SqeDescriptorKey("OPERATION doNothing")
public void doNothing();
/**
* Do take SqeParameter as a parameter
*/
@SqeDescriptorKey("OPERATION doWeird")
public void doWeird(@SqeDescriptorKey("METHOD PARAMETER")SqeParameter param);
/**
* throw an Exception
*
*/
@SqeDescriptorKey("OPERATION throwException")
public void throwException() throws Exception;
/**
* throw an Error
*
*/
@SqeDescriptorKey("OPERATION throwError")
public void throwError();
/**
* reset all attributes
*
*/
@SqeDescriptorKey("OPERATION reset")
public void reset();
/**
* returns the weather for the coming days
*
* @param verbose <code>boolean</code> verbosity
* @return <code>ObjectName</code>
*/
@SqeDescriptorKey("OPERATION getWeather")
public Weather getWeather(@SqeDescriptorKey("METHOD PARAMETER")boolean verbose)
throws java.lang.Exception;
public enum Weather {
CLOUDY, SUNNY
}
@SqeDescriptorKey("ATTRIBUTE notifDescriptorAsMapAtt")
public Map<String, String> getNotifDescriptorAsMapAtt();
@SqeDescriptorKey("ATTRIBUTE notifDescriptorAsMapAtt")
public void setNotifDescriptorAsMapAtt(Map<String, String> value);
@SqeDescriptorKey("OPERATION sendNotification")
public void sendNotification(@SqeDescriptorKey("METHOD PARAMETER")String notifType);
@SqeDescriptorKey("OPERATION sendNotificationWave")
public void sendNotificationWave(boolean customNotification) throws Exception;
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8058865
* @summary Checks correct exception and error events from NotificationListener
* @author Olivier Lagneau
* @modules java.management
* @library /lib/testlibrary
* @compile Basic.java
* @run main/othervm/timeout=300 -DDEBUG_STANDARD MXBeanExceptionHandlingTest -timeForNotificationInSeconds 3
*/
import java.util.Map;
import java.util.HashMap;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.MBeanException;
import javax.management.MBeanServerDelegate;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.RuntimeErrorException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
public class MXBeanExceptionHandlingTest implements NotificationListener {
private static String BASIC_MXBEAN_CLASS_NAME = "Basic";
private long timeForNotificationInSeconds = 3L;
private int numOfNotifications = 2;
private BlockingQueue<Notification> notifList = null;
/*
* First Debug properties and arguments are collect in expected
* map (argName, value) format, then calls original test's run method.
*/
public static void main(String args[]) throws Exception {
System.out.println("=================================================");
// Parses parameters
Utils.parseDebugProperties();
Map<String, Object> map = Utils.parseParameters(args) ;
// Run test
MXBeanExceptionHandlingTest test = new MXBeanExceptionHandlingTest();
test.run(map);
}
protected void parseArgs(Map<String, Object> args) throws Exception {
String arg = null;
// Init timeForNotificationInSeconds
// It is the maximum time in seconds we wait for a notification.
arg = (String)args.get("-timeForNotificationInSeconds") ;
if (arg != null) {
timeForNotificationInSeconds = (new Long(arg)).longValue();
}
}
public void run(Map<String, Object> args) {
System.out.println("MXBeanExceptionHandlingTest::run: Start") ;
int errorCount = 0 ;
try {
parseArgs(args);
notifList = new ArrayBlockingQueue<Notification>(numOfNotifications);
// JMX MbeanServer used inside single VM as if remote.
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
JMXServiceURL url = new JMXServiceURL("rmi", null, 0);
JMXConnectorServer cs =
JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
cs.start();
JMXServiceURL addr = cs.getAddress();
JMXConnector cc = JMXConnectorFactory.connect(addr);
MBeanServerConnection mbsc = cc.getMBeanServerConnection();
// ----
System.out.println("Add me as notification listener");
mbsc.addNotificationListener(MBeanServerDelegate.DELEGATE_NAME,
this, null, null);
System.out.println("---- OK\n") ;
// ----
System.out.println("Create and register the MBean");
ObjectName objName = new ObjectName("sqe:type=Basic,protocol=rmi") ;
mbsc.createMBean(BASIC_MXBEAN_CLASS_NAME, objName);
System.out.println("---- OK\n") ;
// ----
System.out.println("Call method throwException on our MXBean");
try {
mbsc.invoke(objName, "throwException", null, null);
errorCount++;
System.out.println("(ERROR) Did not get awaited MBeanException") ;
} catch (MBeanException mbe) {
System.out.println("(OK) Got awaited MBeanException") ;
Throwable cause = mbe.getCause();
if ( cause instanceof java.lang.Exception ) {
System.out.println("(OK) Cause is of the right class") ;
String mess = cause.getMessage();
if ( mess.equals(Basic.EXCEPTION_MESSAGE ) ) {
System.out.println("(OK) Cause message is fine") ;
} else {
errorCount++;
System.out.println("(ERROR) Cause has message "
+ cause.getMessage()
+ " as we expect "
+ Basic.EXCEPTION_MESSAGE) ;
}
} else {
errorCount++;
System.out.println("(ERROR) Cause is of class "
+ cause.getClass().getName()
+ " as we expect java.lang.Exception") ;
}
} catch (Exception e) {
errorCount++;
System.out.println("(ERROR) Did not get awaited MBeanException but "
+ e) ;
Utils.printThrowable(e, true);
}
System.out.println("---- DONE\n") ;
// ----
System.out.println("Call method throwError on our MXBean");
try {
mbsc.invoke(objName, "throwError", null, null);
errorCount++;
System.out.println("(ERROR) Did not get awaited RuntimeErrorException") ;
} catch (RuntimeErrorException ree) {
System.out.println("(OK) Got awaited RuntimeErrorException") ;
Throwable cause = ree.getCause();
if ( cause instanceof java.lang.InternalError ) {
System.out.println("(OK) Cause is of the right class") ;
String mess = cause.getMessage();
if ( mess.equals(Basic.EXCEPTION_MESSAGE ) ) {
System.out.println("(OK) Cause message is fine") ;
} else {
errorCount++;
System.out.println("(ERROR) Cause has message "
+ cause.getMessage()
+ " as we expect "
+ Basic.EXCEPTION_MESSAGE) ;
}
} else {
errorCount++;
System.out.println("(ERROR) Cause is of class "
+ cause.getClass().getName()
+ " as we expect java.lang.InternalError") ;
}
} catch (Exception e) {
errorCount++;
System.out.println("(ERROR) Did not get awaited RuntimeErrorException but "
+ e) ;
Utils.printThrowable(e, true);
}
System.out.println("---- DONE\n") ;
// ----
System.out.println("Unregister the MBean");
mbsc.unregisterMBean(objName);
System.out.println("---- OK\n") ;
Thread.sleep(timeForNotificationInSeconds * 1000);
int numOfReceivedNotif = notifList.size();
if ( numOfReceivedNotif == numOfNotifications ) {
System.out.println("(OK) We received "
+ numOfNotifications
+ " Notifications") ;
} else {
errorCount++;
System.out.println("(ERROR) We received "
+ numOfReceivedNotif
+ " Notifications in place of "
+ numOfNotifications) ;
}
} catch(Exception e) {
Utils.printThrowable(e, true) ;
throw new RuntimeException(e);
}
if ( errorCount == 0 ) {
System.out.println("MXBeanExceptionHandlingTest::run: Done without any error") ;
} else {
System.out.println("MXBeanExceptionHandlingTest::run: Done with "
+ errorCount
+ " error(s)") ;
throw new RuntimeException("errorCount = " + errorCount);
}
}
public void handleNotification(Notification notification, Object handback) {
System.out.println("MXBeanExceptionHandlingTest::handleNotification: Received "
+ notification);
notifList.add(notification);
}
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8058865
* @summary Test all MXBeans available by default on the platform
* @author Olivier Lagneau
* @modules java.management
* @library /lib/testlibrary
* @run main/othervm/timeout=300 -DDEBUG_STANDARD MXBeanInteropTest1
*/
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.lang.management.ClassLoadingMXBean;
import java.lang.management.CompilationMXBean;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryManagerMXBean;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.RuntimeMXBean;
import java.lang.management.ThreadMXBean;
import javax.management.JMX;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MBeanInfo;
import javax.management.MBeanNotificationInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
public class MXBeanInteropTest1 {
/*
* First Debug properties and arguments are collect in expected
* map (argName, value) format, then calls original test's run method.
*/
public static void main(String args[]) throws Exception {
System.out.println("=================================================");
// Parses parameters
Utils.parseDebugProperties();
Map<String, Object> map = Utils.parseParameters(args) ;
// Run test
MXBeanInteropTest1 test = new MXBeanInteropTest1();
test.run(map);
}
public void run(Map<String, Object> args) {
System.out.println("MXBeanInteropTest1::run: Start") ;
int errorCount = 0 ;
try {
// JMX MbeanServer used inside single VM as if remote.
// MBeanServer mbs = MBeanServerFactory.newMBeanServer();
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
JMXServiceURL url = new JMXServiceURL("rmi", null, 0);
JMXConnectorServer cs =
JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
cs.start();
JMXServiceURL addr = cs.getAddress();
JMXConnector cc = JMXConnectorFactory.connect(addr);
MBeanServerConnection mbsc = cc.getMBeanServerConnection();
// Print out registered java.lang.management MXBeans found
// in the remote jvm.
printMBeans(mbsc) ;
// For each possible kind of JDK 5 defined MXBean, we retrieve its
// MBeanInfo and print it and we call all getters and print
// their output.
errorCount += doClassLoadingMXBeanTest(mbsc) ;
errorCount += doMemoryMXBeanTest(mbsc) ;
errorCount += doThreadMXBeanTest(mbsc) ;
errorCount += doRuntimeMXBeanTest(mbsc) ;
errorCount += doOperatingSystemMXBeanTest(mbsc) ;
errorCount += doCompilationMXBeanTest(mbsc) ;
errorCount += doGarbageCollectorMXBeanTest(mbsc) ;
errorCount += doMemoryManagerMXBeanTest(mbsc) ;
errorCount += doMemoryPoolMXBeanTest(mbsc) ;
// Terminate the JMX Client
cc.close();
} catch(Exception e) {
Utils.printThrowable(e, true) ;
throw new RuntimeException(e);
}
if ( errorCount == 0 ) {
System.out.println("MXBeanInteropTest1::run: Done without any error") ;
} else {
System.out.println("MXBeanInteropTest1::run: Done with "
+ errorCount
+ " error(s)") ;
throw new RuntimeException("errorCount = " + errorCount);
}
}
/**
* Prints all MBeans of domain java.lang.
* They are MBeans related to the JSR 174 that defines
* package java.lang.management.
*/
private static void printMBeans(MBeanServerConnection mbsc) throws Exception {
ObjectName filterName = new ObjectName("java.lang:*");
Set<ObjectName> set = mbsc.queryNames(filterName, null);
if ( set.size() == 0 ) {
throw new RuntimeException("(ERROR) No MBean found with filter "
+ filterName);
}
System.out.println("---- MBeans found in domain java.lang :");
for (Iterator<ObjectName> iter = set.iterator(); iter.hasNext(); ) {
System.out.println(iter.next().toString());
}
System.out.println("\n") ;
}
private final int doClassLoadingMXBeanTest(MBeanServerConnection mbsc) {
int errorCount = 0 ;
System.out.println("---- ClassLoadingMXBean") ;
try {
ObjectName classLoadingName =
new ObjectName(ManagementFactory.CLASS_LOADING_MXBEAN_NAME) ;
MBeanInfo mbInfo = mbsc.getMBeanInfo(classLoadingName);
errorCount += checkNonEmpty(mbInfo);
System.out.println("getMBeanInfo\t\t"
+ mbInfo);
ClassLoadingMXBean classLoading = null;
classLoading = JMX.newMXBeanProxy(mbsc,
classLoadingName,
ClassLoadingMXBean.class) ;
System.out.println("getLoadedClassCount\t\t"
+ classLoading.getLoadedClassCount());
System.out.println("getTotalLoadedClassCount\t\t"
+ classLoading.getTotalLoadedClassCount());
System.out.println("getUnloadedClassCount\t\t"
+ classLoading.getUnloadedClassCount());
System.out.println("isVerbose\t\t"
+ classLoading.isVerbose());
System.out.println("---- OK\n") ;
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++ ;
System.out.println("---- ERROR\n") ;
}
return errorCount ;
}
private final int doMemoryMXBeanTest(MBeanServerConnection mbsc) {
int errorCount = 0 ;
System.out.println("---- MemoryMXBean") ;
try {
ObjectName memoryName =
new ObjectName(ManagementFactory.MEMORY_MXBEAN_NAME) ;
MBeanInfo mbInfo = mbsc.getMBeanInfo(memoryName);
errorCount += checkNonEmpty(mbInfo);
System.out.println("getMBeanInfo\t\t"
+ mbInfo);
MemoryMXBean memory = null ;
memory =
JMX.newMXBeanProxy(mbsc,
memoryName,
MemoryMXBean.class,
true) ;
System.out.println("getMemoryHeapUsage\t\t"
+ memory.getHeapMemoryUsage());
System.out.println("getNonHeapMemoryHeapUsage\t\t"
+ memory.getNonHeapMemoryUsage());
System.out.println("getObjectPendingFinalizationCount\t\t"
+ memory.getObjectPendingFinalizationCount());
System.out.println("isVerbose\t\t"
+ memory.isVerbose());
System.out.println("---- OK\n") ;
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++ ;
System.out.println("---- ERROR\n") ;
}
return errorCount ;
}
private final int doThreadMXBeanTest(MBeanServerConnection mbsc) {
int errorCount = 0 ;
System.out.println("---- ThreadMXBean") ;
try {
ObjectName threadName =
new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME) ;
MBeanInfo mbInfo = mbsc.getMBeanInfo(threadName);
errorCount += checkNonEmpty(mbInfo);
System.out.println("getMBeanInfo\t\t" + mbInfo);
ThreadMXBean thread = null ;
thread =
JMX.newMXBeanProxy(mbsc,
threadName,
ThreadMXBean.class) ;
System.out.println("findMonitorDeadlockedThreads\t\t"
+ thread.findMonitorDeadlockedThreads());
long[] threadIDs = thread.getAllThreadIds() ;
System.out.println("getAllThreadIds\t\t"
+ threadIDs);
for ( long threadID : threadIDs ) {
System.out.println("getThreadInfo long\t\t"
+ thread.getThreadInfo(threadID));
System.out.println("getThreadInfo long, int\t\t"
+ thread.getThreadInfo(threadID, 2));
}
System.out.println("getThreadInfo long[]\t\t"
+ thread.getThreadInfo(threadIDs));
System.out.println("getThreadInfo long[], int\t\t"
+ thread.getThreadInfo(threadIDs, 2));
System.out.println("getDaemonThreadCount\t\t"
+ thread.getDaemonThreadCount());
System.out.println("getPeakThreadCount\t\t"
+ thread.getPeakThreadCount());
System.out.println("getThreadCount\t\t"
+ thread.getThreadCount());
System.out.println("getTotalStartedThreadCount\t\t"
+ thread.getTotalStartedThreadCount());
boolean supported = thread.isThreadContentionMonitoringSupported() ;
System.out.println("isThreadContentionMonitoringSupported\t\t"
+ supported);
if ( supported ) {
System.out.println("isThreadContentionMonitoringEnabled\t\t"
+ thread.isThreadContentionMonitoringEnabled());
}
supported = thread.isThreadCpuTimeSupported() ;
System.out.println("isThreadCpuTimeSupported\t\t"
+ supported);
if ( supported ) {
System.out.println("isThreadCpuTimeEnabled\t\t"
+ thread.isThreadCpuTimeEnabled());
for (long id : threadIDs) {
System.out.println("getThreadCpuTime(" + id + ")\t\t"
+ thread.getThreadCpuTime(id));
System.out.println("getThreadUserTime(" + id + ")\t\t"
+ thread.getThreadUserTime(id));
}
}
supported = thread.isCurrentThreadCpuTimeSupported() ;
System.out.println("isCurrentThreadCpuTimeSupported\t\t"
+ supported);
if ( supported ) {
System.out.println("getCurrentThreadCpuTime\t\t"
+ thread.getCurrentThreadCpuTime());
System.out.println("getCurrentThreadUserTime\t\t"
+ thread.getCurrentThreadUserTime());
}
thread.resetPeakThreadCount() ;
System.out.println("---- OK\n") ;
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++ ;
System.out.println("---- ERROR\n") ;
}
return errorCount ;
}
private final int doRuntimeMXBeanTest(MBeanServerConnection mbsc) {
int errorCount = 0 ;
System.out.println("---- RuntimeMXBean") ;
try {
ObjectName runtimeName =
new ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME) ;
MBeanInfo mbInfo = mbsc.getMBeanInfo(runtimeName);
errorCount += checkNonEmpty(mbInfo);
System.out.println("getMBeanInfo\t\t" + mbInfo);
RuntimeMXBean runtime = null;
runtime =
JMX.newMXBeanProxy(mbsc,
runtimeName,
RuntimeMXBean.class) ;
System.out.println("getClassPath\t\t"
+ runtime.getClassPath());
System.out.println("getInputArguments\t\t"
+ runtime.getInputArguments());
System.out.println("getLibraryPath\t\t"
+ runtime.getLibraryPath());
System.out.println("getManagementSpecVersion\t\t"
+ runtime.getManagementSpecVersion());
System.out.println("getName\t\t"
+ runtime.getName());
System.out.println("getSpecName\t\t"
+ runtime.getSpecName());
System.out.println("getSpecVendor\t\t"
+ runtime.getSpecVendor());
System.out.println("getSpecVersion\t\t"
+ runtime.getSpecVersion());
System.out.println("getStartTime\t\t"
+ runtime.getStartTime());
System.out.println("getSystemProperties\t\t"
+ runtime.getSystemProperties());
System.out.println("getUptime\t\t"
+ runtime.getUptime());
System.out.println("getVmName\t\t"
+ runtime.getVmName());
System.out.println("getVmVendor\t\t"
+ runtime.getVmVendor());
System.out.println("getVmVersion\t\t"
+ runtime.getVmVersion());
boolean supported = runtime.isBootClassPathSupported() ;
System.out.println("isBootClassPathSupported\t\t"
+ supported);
if ( supported ) {
System.out.println("getBootClassPath\t\t"
+ runtime.getBootClassPath());
}
System.out.println("---- OK\n") ;
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++ ;
System.out.println("---- ERROR\n") ;
}
return errorCount ;
}
private final int doOperatingSystemMXBeanTest(MBeanServerConnection mbsc) {
int errorCount = 0 ;
System.out.println("---- OperatingSystemMXBean") ;
try {
ObjectName operationName =
new ObjectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME) ;
MBeanInfo mbInfo = mbsc.getMBeanInfo(operationName);
errorCount += checkNonEmpty(mbInfo);
System.out.println("getMBeanInfo\t\t" + mbInfo);
OperatingSystemMXBean operation = null ;
operation =
JMX.newMXBeanProxy(mbsc,
operationName,
OperatingSystemMXBean.class) ;
System.out.println("getArch\t\t"
+ operation.getArch());
System.out.println("getAvailableProcessors\t\t"
+ operation.getAvailableProcessors());
System.out.println("getName\t\t"
+ operation.getName());
System.out.println("getVersion\t\t"
+ operation.getVersion());
System.out.println("---- OK\n") ;
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++ ;
System.out.println("---- ERROR\n") ;
}
return errorCount ;
}
private final int doCompilationMXBeanTest(MBeanServerConnection mbsc) {
int errorCount = 0 ;
System.out.println("---- CompilationMXBean") ;
try {
ObjectName compilationName =
new ObjectName(ManagementFactory.COMPILATION_MXBEAN_NAME);
if ( mbsc.isRegistered(compilationName) ) {
MBeanInfo mbInfo = mbsc.getMBeanInfo(compilationName);
errorCount += checkNonEmpty(mbInfo);
System.out.println("getMBeanInfo\t\t" + mbInfo);
CompilationMXBean compilation = null ;
compilation =
JMX.newMXBeanProxy(mbsc,
compilationName,
CompilationMXBean.class) ;
System.out.println("getName\t\t"
+ compilation.getName());
boolean supported =
compilation.isCompilationTimeMonitoringSupported() ;
System.out.println("isCompilationTimeMonitoringSupported\t\t"
+ supported);
if ( supported ) {
System.out.println("getTotalCompilationTime\t\t"
+ compilation.getTotalCompilationTime());
}
}
System.out.println("---- OK\n") ;
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++ ;
System.out.println("---- ERROR\n") ;
}
return errorCount ;
}
private final int doGarbageCollectorMXBeanTest(MBeanServerConnection mbsc) {
int errorCount = 0 ;
System.out.println("---- GarbageCollectorMXBean") ;
try {
ObjectName filterName =
new ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE
+ ",*");
Set<ObjectName> onSet = mbsc.queryNames(filterName, null);
for (Iterator<ObjectName> iter = onSet.iterator(); iter.hasNext(); ) {
ObjectName garbageName = iter.next() ;
System.out.println("-------- " + garbageName) ;
MBeanInfo mbInfo = mbsc.getMBeanInfo(garbageName);
errorCount += checkNonEmpty(mbInfo);
System.out.println("getMBeanInfo\t\t" + mbInfo);
GarbageCollectorMXBean garbage = null ;
garbage =
JMX.newMXBeanProxy(mbsc,
garbageName,
GarbageCollectorMXBean.class) ;
System.out.println("getCollectionCount\t\t"
+ garbage.getCollectionCount());
System.out.println("getCollectionTime\t\t"
+ garbage.getCollectionTime());
}
System.out.println("---- OK\n") ;
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++ ;
System.out.println("---- ERROR\n") ;
}
return errorCount ;
}
private final int doMemoryManagerMXBeanTest(MBeanServerConnection mbsc) {
int errorCount = 0 ;
System.out.println("---- MemoryManagerMXBean") ;
try {
ObjectName filterName =
new ObjectName(ManagementFactory.MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE
+ ",*");
Set<ObjectName> onSet = mbsc.queryNames(filterName, null);
for (Iterator<ObjectName> iter = onSet.iterator(); iter.hasNext(); ) {
ObjectName memoryManagerName = iter.next() ;
System.out.println("-------- " + memoryManagerName) ;
MBeanInfo mbInfo = mbsc.getMBeanInfo(memoryManagerName);
System.out.println("getMBeanInfo\t\t" + mbInfo);
errorCount += checkNonEmpty(mbInfo);
MemoryManagerMXBean memoryManager = null;
memoryManager =
JMX.newMXBeanProxy(mbsc,
memoryManagerName,
MemoryManagerMXBean.class) ;
System.out.println("getMemoryPoolNames\t\t"
+ Arrays.deepToString(memoryManager.getMemoryPoolNames()));
System.out.println("getName\t\t"
+ memoryManager.getName());
System.out.println("isValid\t\t"
+ memoryManager.isValid());
}
System.out.println("---- OK\n") ;
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++ ;
System.out.println("---- ERROR\n") ;
}
return errorCount ;
}
private final int doMemoryPoolMXBeanTest(MBeanServerConnection mbsc) {
int errorCount = 0 ;
System.out.println("---- MemoryPoolMXBean") ;
try {
ObjectName filterName =
new ObjectName(ManagementFactory.MEMORY_POOL_MXBEAN_DOMAIN_TYPE
+ ",*");
Set<ObjectName> onSet = mbsc.queryNames(filterName, null);
for (Iterator<ObjectName> iter = onSet.iterator(); iter.hasNext(); ) {
ObjectName memoryPoolName = iter.next() ;
System.out.println("-------- " + memoryPoolName) ;
MBeanInfo mbInfo = mbsc.getMBeanInfo(memoryPoolName);
errorCount += checkNonEmpty(mbInfo);
System.out.println("getMBeanInfo\t\t" + mbInfo);
MemoryPoolMXBean memoryPool = null;
memoryPool =
JMX.newMXBeanProxy(mbsc,
memoryPoolName,
MemoryPoolMXBean.class,
true) ;
System.out.println("getCollectionUsage\t\t"
+ memoryPool.getCollectionUsage());
System.out.println("getMemoryManagerNames\t\t"
+ Arrays.deepToString(memoryPool.getMemoryManagerNames()));
System.out.println("getName\t\t"
+ memoryPool.getName());
System.out.println("getPeakUsage\t\t"
+ memoryPool.getPeakUsage());
System.out.println("getType\t\t"
+ memoryPool.getType());
System.out.println("getUsage\t\t"
+ memoryPool.getUsage());
System.out.println("isValid\t\t"
+ memoryPool.isValid());
boolean supported = memoryPool.isUsageThresholdSupported() ;
System.out.println("isUsageThresholdSupported\t\t"
+ supported);
if ( supported ) {
System.out.println("getUsageThreshold\t\t"
+ memoryPool.getUsageThreshold());
System.out.println("isUsageThresholdExceeded\t\t"
+ memoryPool.isUsageThresholdExceeded());
System.out.println("getUsageThresholdCount\t\t"
+ memoryPool.getUsageThresholdCount());
}
supported = memoryPool.isCollectionUsageThresholdSupported() ;
System.out.println("isCollectionUsageThresholdSupported\t\t"
+ supported);
if ( supported ) {
System.out.println("getCollectionUsageThreshold\t\t"
+ memoryPool.getCollectionUsageThreshold());
System.out.println("getCollectionUsageThresholdCount\t\t"
+ memoryPool.getCollectionUsageThresholdCount());
System.out.println("isCollectionUsageThresholdExceeded\t\t"
+ memoryPool.isCollectionUsageThresholdExceeded());
}
memoryPool.resetPeakUsage();
}
System.out.println("---- OK\n") ;
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++ ;
System.out.println("---- ERROR\n") ;
}
return errorCount ;
}
private int checkNonEmpty(MBeanInfo mbi) {
if ( mbi.toString().length() == 0 ) {
System.out.println("(ERROR) MBeanInfo is empty !");
return 1;
} else {
return 0;
}
}
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8058865
* @summary Checks access to test MXBean
* @author Olivier Lagneau
* @modules java.management
* @library /lib/testlibrary
* @compile Basic.java
* @run main/othervm/timeout=300 -DDEBUG_STANDARD MXBeanInteropTest2
*/
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.management.Attribute;
import javax.management.JMX;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo;
import javax.management.MBeanServer;
import java.lang.management.ManagementFactory;
import javax.management.MBeanInfo;
import javax.management.MBeanNotificationInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
public class MXBeanInteropTest2 {
private static String BASIC_MXBEAN_CLASS_NAME = "Basic";
/*
* First Debug properties and arguments are collect in expected
* map (argName, value) format, then calls original test's run method.
*/
public static void main(String args[]) throws Exception {
System.out.println("=================================================");
// Parses parameters
Utils.parseDebugProperties();
Map<String, Object> map = Utils.parseParameters(args) ;
// Run test
MXBeanInteropTest2 test = new MXBeanInteropTest2();
test.run(map);
}
public void run(Map<String, Object> args) {
System.out.println("MXBeanInteropTest2::run: Start") ;
int errorCount = 0 ;
try {
// JMX MbeanServer used inside single VM as if remote.
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
JMXServiceURL url = new JMXServiceURL("rmi", null, 0);
JMXConnectorServer cs =
JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
cs.start();
JMXServiceURL addr = cs.getAddress();
JMXConnector cc = JMXConnectorFactory.connect(addr);
MBeanServerConnection mbsc = cc.getMBeanServerConnection();
// Prints all MBeans whatever the domain is.
printMBeans(mbsc) ;
// Call test body
errorCount += doBasicMXBeanTest(mbsc) ;
// Terminate the JMX Client
cc.close();
} catch(Exception e) {
Utils.printThrowable(e, true) ;
throw new RuntimeException(e);
}
if ( errorCount == 0 ) {
System.out.println("MXBeanInteropTest2::run: Done without any error") ;
} else {
System.out.println("MXBeanInteropTest2::run: Done with "
+ errorCount
+ " error(s)") ;
throw new RuntimeException("errorCount = " + errorCount);
}
}
/**
* Prints all MBeans whatever the domain is.
*/
private static void printMBeans(MBeanServerConnection mbsc) throws Exception {
Set<ObjectName> set = mbsc.queryNames(null, null);
System.out.println("---- MBeans found :");
for (Iterator<ObjectName> iter = set.iterator(); iter.hasNext(); ) {
System.out.println(iter.next().toString());
}
System.out.println("\n") ;
}
private final int doBasicMXBeanTest(MBeanServerConnection mbsc) {
int errorCount = 0 ;
System.out.println("---- doBasicMXBeanTest") ;
try {
ObjectName objName =
new ObjectName("sqe:type=BasicMXBean") ;
mbsc.createMBean(BASIC_MXBEAN_CLASS_NAME, objName);
MBeanInfo mbInfo = mbsc.getMBeanInfo(objName);
printMBeanInfo(mbInfo);
System.out.println("---- OK\n") ;
System.out.println("getMBeanInfo\t\t"
+ mbInfo);
System.out.println("---- OK\n") ;
System.out.println("Check mxbean field in the MBeanInfo");
String mxbeanField =
(String)mbInfo.getDescriptor().getFieldValue(JMX.MXBEAN_FIELD);
if ( mxbeanField == null || ! mxbeanField.equals("true")) {
System.out.println("---- ERROR : Improper mxbean field value "
+ mxbeanField);
errorCount++;
}
System.out.println("---- OK\n") ;
System.out.println("Set attribute ObjectNameAtt");
Attribute att = new Attribute("ObjectNameAtt", objName);
mbsc.setAttribute(objName, att);
ObjectName value =
(ObjectName)mbsc.getAttribute(objName, "ObjectNameAtt");
if ( ! value.equals(objName) ) {
errorCount++;
System.out.println("---- ERROR : setAttribute failed, got "
+ value
+ " while expecting "
+ objName);
}
System.out.println("---- OK\n") ;
System.out.println("Call operation doNothing");
mbsc.invoke(objName, "doNothing", null, null);
System.out.println("---- OK\n") ;
System.out.println("Call operation getWeather");
Object weather = mbsc.invoke(objName,
"getWeather",
new Object[]{Boolean.TRUE},
new String[]{"boolean"});
System.out.println("Weather is " + weather);
System.out.println("---- OK\n") ;
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++ ;
System.out.println("---- ERROR\n") ;
}
return errorCount ;
}
private void printMBeanInfo(MBeanInfo mbInfo) {
System.out.println("Description " + mbInfo.getDescription());
for (MBeanConstructorInfo ctor : mbInfo.getConstructors()) {
System.out.println("Constructor " + ctor.getName());
}
for (MBeanAttributeInfo att : mbInfo.getAttributes()) {
System.out.println("Attribute " + att.getName()
+ " [" + att.getType() + "]");
}
for (MBeanOperationInfo oper : mbInfo.getOperations()) {
System.out.println("Operation " + oper.getName());
}
for (MBeanNotificationInfo notif : mbInfo.getNotifications()) {
System.out.println("Notification " + notif.getName());
}
}
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8058865
* @summary Checks correct collection of MXBean's class after unregistration
* @author Olivier Lagneau
* @modules java.management
* @library /lib/testlibrary
* @run main/othervm/timeout=300 MXBeanLoadingTest1
*/
import java.lang.ref.WeakReference;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Arrays;
import java.util.Map;
import javax.management.Attribute;
import javax.management.JMX;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MXBean;
import javax.management.ObjectName;
import javax.management.loading.PrivateMLet;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.OpenType;
import javax.management.openmbean.SimpleType;
public class MXBeanLoadingTest1 {
public static void main(String[] args) throws Exception {
MXBeanLoadingTest1 test = new MXBeanLoadingTest1();
test.run((Map<String, Object>)null);
}
public void run(Map<String, Object> args) {
System.out.println("MXBeanLoadingTest1::run: Start") ;
try {
System.out.println("We ensure no reference is retained on MXBean class"
+ " after it is unregistered. We take time to perform"
+ " some little extra check of Descriptors, MBean*Info.");
ClassLoader myClassLoader = MXBeanLoadingTest1.class.getClassLoader();
if (!(myClassLoader instanceof URLClassLoader)) {
String message = "(ERROR) Test's class loader is not " +
"a URLClassLoader";
System.out.println(message);
throw new RuntimeException(message);
}
URLClassLoader myURLClassLoader = (URLClassLoader) myClassLoader;
URL[] urls = myURLClassLoader.getURLs();
PrivateMLet mlet = new PrivateMLet(urls, null, false);
Class<?> shadowClass = mlet.loadClass(TestMXBean.class.getName());
if (shadowClass == TestMXBean.class) {
String message = "(ERROR) MLet got original TestMXBean, not shadow";
System.out.println(message);
throw new RuntimeException(message);
}
shadowClass = null;
MBeanServer mbs = MBeanServerFactory.createMBeanServer();
ObjectName mletName = new ObjectName("x:type=mlet");
mbs.registerMBean(mlet, mletName);
ObjectName testName = new ObjectName("x:type=test");
mbs.createMBean(Test.class.getName(), testName, mletName);
// That test fails because the MXBean instance is accessed via
// a delegate OpenMBean which has
ClassLoader testLoader = mbs.getClassLoaderFor(testName);
if (testLoader != mlet) {
System.out.println("MLet " + mlet);
String message = "(ERROR) MXBean's class loader is not MLet: "
+ testLoader;
System.out.println(message);
throw new RuntimeException(message);
}
testLoader = null;
// Cycle get/set/get of the attribute of type Luis.
// We check the set is effective.
CompositeData cd_B = (CompositeData)mbs.getAttribute(testName, "B");
CompositeType compType_B = cd_B.getCompositeType();
CompositeDataSupport cds_B =
new CompositeDataSupport(compType_B,
new String[]{"something"},
new Object[]{Integer.valueOf(13)});
Attribute myAtt = new Attribute("B", cds_B);
mbs.setAttribute(testName, myAtt);
CompositeData cd_B2 = (CompositeData)mbs.getAttribute(testName, "B");
if ( ((Integer)cd_B2.get("something")).intValue() != 13 ) {
String message = "(ERROR) The setAttribute of att B did not work;"
+ " expect Luis.something = 13 but got "
+ cd_B2.get("something");
System.out.println(message);
throw new RuntimeException(message);
}
MBeanInfo info = mbs.getMBeanInfo(testName);
String mxbeanField =
(String)info.getDescriptor().getFieldValue(JMX.MXBEAN_FIELD);
if ( mxbeanField == null || ! mxbeanField.equals("true")) {
String message = "(ERROR) Improper mxbean field value "
+ mxbeanField;
System.out.println(message);
throw new RuntimeException(message);
}
// Check the 2 attributes.
MBeanAttributeInfo[] attrs = info.getAttributes();
if ( attrs.length == 2 ) {
for (MBeanAttributeInfo mbai : attrs) {
String originalTypeFieldValue =
(String)mbai.getDescriptor().getFieldValue(JMX.ORIGINAL_TYPE_FIELD);
OpenType<?> openTypeFieldValue =
(OpenType<?>)mbai.getDescriptor().getFieldValue(JMX.OPEN_TYPE_FIELD);
if ( mbai.getName().equals("A") ) {
if ( !mbai.isReadable() || !mbai.isWritable()
|| mbai.isIs()
|| !mbai.getType().equals("int") ) {
String message = "(ERROR) Unexpected MBeanAttributeInfo for A "
+ mbai;
System.out.println(message);
throw new RuntimeException(message);
}
if ( ! originalTypeFieldValue.equals("int") ) {
String message = "(ERROR) Unexpected originalType in Descriptor for A "
+ originalTypeFieldValue;
System.out.println(message);
throw new RuntimeException(message);
}
if ( ! openTypeFieldValue.equals(SimpleType.INTEGER) ) {
String message = "(ERROR) Unexpected openType in Descriptor for A "
+ originalTypeFieldValue;
System.out.println(message);
throw new RuntimeException(message);
}
} else if ( mbai.getName().equals("B") ) {
if ( !mbai.isReadable() || !mbai.isWritable()
|| mbai.isIs()
|| !mbai.getType().equals("javax.management.openmbean.CompositeData") ) {
String message = "(ERROR) Unexpected MBeanAttributeInfo for B "
+ mbai;
System.out.println(message);
throw new RuntimeException(message);
}
if ( ! originalTypeFieldValue.equals(Luis.class.getName()) ) {
String message = "(ERROR) Unexpected originalType in Descriptor for B "
+ originalTypeFieldValue;
System.out.println(message);
throw new RuntimeException(message);
}
if ( ! openTypeFieldValue.equals(compType_B) ) {
String message = "(ERROR) Unexpected openType in Descriptor for B "
+ compType_B;
System.out.println(message);
throw new RuntimeException(message);
}
} else {
String message = "(ERROR) Unknown attribute name";
System.out.println(message);
throw new RuntimeException(message);
}
}
} else {
String message = "(ERROR) Unexpected MBeanAttributeInfo array"
+ Arrays.deepToString(attrs);
System.out.println(message);
throw new RuntimeException(message);
}
// Check the MXBean operation.
MBeanOperationInfo[] ops = info.getOperations();
// The impact is ACTION_INFO as for a standard MBean it is UNKNOWN,
// logged 6320104.
if (ops.length != 1 || !ops[0].getName().equals("bogus")
|| ops[0].getSignature().length > 0
|| !ops[0].getReturnType().equals("void")) {
String message = "(ERROR) Unexpected MBeanOperationInfo array "
+ Arrays.deepToString(ops);
System.out.println(message);
throw new RuntimeException(message);
}
String originalTypeFieldValue =
(String)ops[0].getDescriptor().getFieldValue(JMX.ORIGINAL_TYPE_FIELD);
OpenType<?> openTypeFieldValue =
(OpenType<?>)ops[0].getDescriptor().getFieldValue(JMX.OPEN_TYPE_FIELD);
if ( ! originalTypeFieldValue.equals("void") ) {
String message = "(ERROR) Unexpected originalType in Descriptor for bogus "
+ originalTypeFieldValue;
System.out.println(message);
throw new RuntimeException(message);
}
if ( ! openTypeFieldValue.equals(SimpleType.VOID) ) {
String message = "(ERROR) Unexpected openType in Descriptor for bogus "
+ originalTypeFieldValue;
System.out.println(message);
throw new RuntimeException(message);
}
// Check there is 2 constructors.
if (info.getConstructors().length != 2) {
String message = "(ERROR) Wrong number of constructors " +
"in introspected bean: " +
Arrays.asList(info.getConstructors());
System.out.println(message);
throw new RuntimeException(message);
}
// Check MXBean class name.
if (!info.getClassName().endsWith("Test")) {
String message = "(ERROR) Wrong info class name: " +
info.getClassName();
System.out.println(message);
throw new RuntimeException(message);
}
mbs.unregisterMBean(testName);
mbs.unregisterMBean(mletName);
WeakReference<PrivateMLet> mletRef =
new WeakReference<PrivateMLet>(mlet);
mlet = null;
System.out.println("MXBean registered and unregistered, waiting for " +
"garbage collector to collect class loader");
for (int i = 0; i < 10000 && mletRef.get() != null; i++) {
System.gc();
Thread.sleep(1);
}
if (mletRef.get() == null)
System.out.println("(OK) class loader was GC'd");
else {
String message = "(ERROR) Class loader was not GC'd";
System.out.println(message);
throw new RuntimeException(message);
}
} catch(Exception e) {
Utils.printThrowable(e, true) ;
throw new RuntimeException(e);
}
System.out.println("MXBeanLoadingTest1::run: Done without any error") ;
}
// I agree the use of the MXBean annotation and the MXBean suffix for the
// interface name are redundant but however harmless.
//
@MXBean(true)
public static interface TestMXBean {
public void bogus();
public int getA();
public void setA(int a);
public Luis getB();
public void setB(Luis mi);
}
public static class Test implements TestMXBean {
private Luis luis = new Luis() ;
public Test() {}
public Test(int x) {}
public void bogus() {}
public int getA() {return 0;}
public void setA(int a) {}
public Luis getB() {return this.luis;}
public void setB(Luis luis) {this.luis = luis;}
}
public static class Luis {
private int something = 0;
public Luis() {}
public int getSomething() {return something;}
public void setSomething(int v) {something = v;}
public void doNothing() {}
}
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8058865
* @summary Checks MXBean proper registration both as its implementation class and interface
* @author Olivier Lagneau
* @modules java.management
* @library /lib/testlibrary
* @compile Basic.java
* @run main/othervm/timeout=300 -DDEBUG_STANDARD MXBeanNotifTest -numOfNotifications 239 -timeForNotificationInSeconds 4
*/
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.lang.management.ManagementFactory;
import javax.management.Attribute;
import javax.management.Descriptor;
import javax.management.ImmutableDescriptor;
import javax.management.MBeanServer;
import javax.management.MBeanInfo;
import javax.management.MBeanNotificationInfo;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.OpenType;
import javax.management.openmbean.SimpleType;
import javax.management.openmbean.TabularData;
import javax.management.openmbean.TabularDataSupport;
import javax.management.openmbean.TabularType;
public class MXBeanNotifTest implements NotificationListener {
private static String BASIC_MXBEAN_CLASS_NAME = "Basic";
private static String BASIC_MXBEAN_INTERFACE_NAME = "BasicMXBean";
private long timeForNotificationInSeconds = 3L;
private int numOfNotifications = 1;
private BlockingQueue<Notification> notifList = null;
private int numOfNotifDescriptorElements = 13;
/*
* First Debug properties and arguments are collect in expected
* map (argName, value) format, then calls original test's run method.
*/
public static void main(String args[]) throws Exception {
System.out.println("=================================================");
// Parses parameters
Utils.parseDebugProperties();
Map<String, Object> map = Utils.parseParameters(args) ;
// Run test
MXBeanNotifTest test = new MXBeanNotifTest();
test.run(map);
}
protected void parseArgs(Map<String, Object> args) throws Exception {
String arg = null;
// Init numOfNotifications
// It is the number of notifications we should trigger and check.
arg = (String)args.get("-numOfNotifications") ;
if (arg != null) {
numOfNotifications = (new Integer(arg)).intValue();
}
// Init timeForNotificationInSeconds
// It is the maximum time in seconds we wait for each notification.
arg = (String)args.get("-timeForEachNotificationInSeconds") ;
if (arg != null) {
timeForNotificationInSeconds = (new Long(arg)).longValue();
}
}
public void run(Map<String, Object> args) {
System.out.println("MXBeanNotifTest::run: Start") ;
int errorCount = 0 ;
try {
parseArgs(args);
notifList = new ArrayBlockingQueue<Notification>(numOfNotifications);
// JMX MbeanServer used inside single VM as if remote.
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
JMXServiceURL url = new JMXServiceURL("rmi", null, 0);
JMXConnectorServer cs =
JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
cs.start();
JMXServiceURL addr = cs.getAddress();
JMXConnector cc = JMXConnectorFactory.connect(addr);
MBeanServerConnection mbsc = cc.getMBeanServerConnection();
// ----
System.out.println("MXBeanNotifTest::run: Create and register the MBean");
ObjectName objName = new ObjectName("sqe:type=Basic,protocol=rmi") ;
mbsc.createMBean(BASIC_MXBEAN_CLASS_NAME, objName);
System.out.println("---- OK\n") ;
// ----
System.out.println("MXBeanNotifTest::run: Add me as notification listener");
mbsc.addNotificationListener(objName, this, null, null);
// ----
System.out.println("MXBeanNotifTest::run: Retrieve the Descriptor"
+ " that should be in MBeanNotificationInfo");
TabularData tabData =
(TabularData)mbsc.getAttribute(objName, "NotifDescriptorAsMapAtt");
Map<String, String> descrMap = new HashMap<>();
for (Iterator<?> it = tabData.values().iterator(); it.hasNext(); ) {
CompositeData compData = (CompositeData)it.next();
descrMap.put((String)compData.get("key"),
(String)compData.get("value"));
}
Descriptor refNotifDescriptor = new ImmutableDescriptor(descrMap);
System.out.println("---- OK\n") ;
// ----
// Because the MBean holding the targeted attribute is MXBean, we
// should use for the setAttribute a converted form for the
// attribute value as described by the MXBean mapping rules.
// This explains all that lovely stuff for creating a
// TabularDataSupport.
//
// WARNING : the MBeanInfo of the MXBean used on opposite side
// is computed when the MBean is registered.
// It means the Descriptor considered for the MBeanNotificationInfo
// is not the one we set in the lines below, it is too late.
// However, we check that set is harmless when we check
// the MBeanNotificationInfo.
//
System.out.println("MXBeanNotifTest::run: Set a Map<String, String>"
+ " attribute");
String typeName =
"java.util.Map<java.lang.String,java.lang.String>";
String[] keyValue = new String[] {"key", "value"};
OpenType<?>[] openTypes =
new OpenType<?>[] {SimpleType.STRING, SimpleType.STRING};
CompositeType rowType = new CompositeType(typeName, typeName,
keyValue, keyValue, openTypes);
TabularType tabType = new TabularType(typeName, typeName,
rowType, new String[]{"key"});
TabularDataSupport convertedDescrMap =
new TabularDataSupport(tabType);
for (int i = 0; i < numOfNotifDescriptorElements; i++) {
Object[] descrValue = {"field" + i, "value" + i};
CompositeData data =
new CompositeDataSupport(rowType, keyValue, descrValue);
convertedDescrMap.put(data);
}
Attribute descrAtt =
new Attribute("NotifDescriptorAsMapAtt", convertedDescrMap);
mbsc.setAttribute(objName, descrAtt);
System.out.println("---- OK\n") ;
// ----
System.out.println("MXBeanNotifTest::run: Compare the Descriptor from"
+ " the MBeanNotificationInfo against a reference");
MBeanInfo mbInfo = mbsc.getMBeanInfo(objName);
errorCount += checkMBeanInfo(mbInfo, refNotifDescriptor);
System.out.println("---- DONE\n") ;
// ----
System.out.println("Check isInstanceOf(Basic)");
if ( ! mbsc.isInstanceOf(objName, BASIC_MXBEAN_CLASS_NAME) ) {
errorCount++;
System.out.println("---- ERROR isInstanceOf returned false\n") ;
} else {
System.out.println("---- OK\n") ;
}
// ----
System.out.println("Check isInstanceOf(BasicMXBean)");
if ( ! mbsc.isInstanceOf(objName, BASIC_MXBEAN_INTERFACE_NAME) ) {
errorCount++;
System.out.println("---- ERROR isInstanceOf returned false\n") ;
} else {
System.out.println("---- OK\n") ;
}
// ----
System.out.println("MXBeanNotifTest::run: Ask for "
+ numOfNotifications + " notification(s)");
Object[] sendNotifParam = new Object[1];
String[] sendNotifSig = new String[]{"java.lang.String"};
for (int i = 0; i < numOfNotifications; i++) {
// Select which type of notification we ask for
if ( i % 2 == 0 ) {
sendNotifParam[0] = Basic.NOTIF_TYPE_0;
} else {
sendNotifParam[0] = Basic.NOTIF_TYPE_1;
}
// Trigger notification emission
mbsc.invoke(objName,
"sendNotification",
sendNotifParam,
sendNotifSig);
// Wait for it then check it when it comes early enough
Notification notif =
notifList.poll(timeForNotificationInSeconds,
TimeUnit.SECONDS) ;
// The very first notification is likely to come in slower than
// all the others. Because that test isn't targeting the speed
// notifications are delivered with, we prefer to secure it.
if (i == 0 && notif == null) {
System.out.println("MXBeanNotifTest::run: Wait extra "
+ timeForNotificationInSeconds + " second(s) the "
+ " very first notification");
notif = notifList.poll(timeForNotificationInSeconds,
TimeUnit.SECONDS);
}
if ( notif == null ) {
errorCount++;
System.out.println("---- ERROR No notification received"
+ " within allocated " + timeForNotificationInSeconds
+ " second(s) !");
} else {
errorCount +=
checkNotification(notif,
(String)sendNotifParam[0],
Basic.NOTIFICATION_MESSAGE,
objName);
}
}
int toc = 0;
while ( notifList.size() < 2 && toc < 10 ) {
Thread.sleep(499);
toc++;
}
System.out.println("---- DONE\n") ;
} catch(Exception e) {
Utils.printThrowable(e, true) ;
throw new RuntimeException(e);
}
if ( errorCount == 0 ) {
System.out.println("MXBeanNotifTest::run: Done without any error") ;
} else {
System.out.println("MXBeanNotifTest::run: Done with "
+ errorCount
+ " error(s)") ;
throw new RuntimeException("errorCount = " + errorCount);
}
}
private int checkMBeanInfo(MBeanInfo mbi, Descriptor refDescr) {
MBeanNotificationInfo[] notifsInfo = mbi.getNotifications();
int res = 0;
for (MBeanNotificationInfo mbni : notifsInfo) {
if ( mbni.getDescriptor().equals(refDescr) ) {
System.out.println("(OK)");
} else {
System.out.println("(ERROR) Descriptor of the notification is "
+ mbni.getDescriptor()
+ " as we expect "
+ refDescr);
res++;
}
}
return res;
}
private int checkNotification(Notification notif,
String refType,
String refMessage,
ObjectName refSource) {
int res = 0;
Utils.debug(Utils.DEBUG_VERBOSE,
"\t getSource " + notif.getSource());
Utils.debug(Utils.DEBUG_VERBOSE,
"\t getMessage " + notif.getMessage());
Utils.debug(Utils.DEBUG_VERBOSE,
"\t getSequenceNumber " + notif.getSequenceNumber());
Utils.debug(Utils.DEBUG_VERBOSE,
"\t getTimeStamp " + notif.getTimeStamp());
Utils.debug(Utils.DEBUG_VERBOSE,
"\t getType " + notif.getType());
Utils.debug(Utils.DEBUG_VERBOSE,
"\t getUserData " + notif.getUserData());
if ( ! notif.getType().equals(refType) ) {
res++;
System.out.println("(ERROR) Type is not "
+ refType + " in notification\n" + notif);
} else {
if ( notif.getType().equals(Basic.NOTIF_TYPE_0)
&& ! (notif instanceof javax.management.Notification) ) {
res++;
System.out.println("(ERROR) Notification is not instance of "
+ " javax.management.Notification but rather "
+ notif.getClass().getName());
} else if ( notif.getType().equals(Basic.NOTIF_TYPE_1)
&& ! (notif instanceof SqeNotification) ) {
res++;
System.out.println("(ERROR) Notification is not instance of "
+ " javasoft.sqe.jmx.share.SqeNotification but rather "
+ notif.getClass().getName());
}
}
if ( ! notif.getMessage().equals(refMessage) ) {
res++;
System.out.println("(ERROR) Message is not "
+ refMessage + " in notification\n" + notif);
}
if ( ! notif.getSource().equals(refSource) ) {
res++;
System.out.println("(ERROR) Source is not "
+ refSource + " in notification\n" + notif);
}
return res;
}
public void handleNotification(Notification notification, Object handback) {
Utils.debug(Utils.DEBUG_VERBOSE,
"MXBeanNotifTest::handleNotification: Received "
+ notification);
notifList.add(notification);
}
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8058865
* @summary Checks that a serialized instance is not transmitted from an MXBean.
* All the communication should be done via Open Types
* @author Olivier Lagneau
* @modules java.management
* @library /lib/testlibrary
* @compile Basic.java
* @run main/othervm/timeout=300 -DDEBUG_STANDARD MXBeanWeirdParamTest
*/
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.lang.Process;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.OpenType;
import javax.management.openmbean.SimpleType;
import javax.management.openmbean.TabularDataSupport;
import javax.management.openmbean.TabularType;
import jdk.testlibrary.ProcessTools;
import jdk.testlibrary.JDKToolFinder;
public class MXBeanWeirdParamTest {
private static String BASIC_MXBEAN_CLASS_NAME = "Basic";
private static final String CLIENT_CLASS_MAIN =
"MXBeanWeirdParamTest$ClientSide";
private JMXConnectorServer cs;
/*
* First Debug properties and arguments are collect in expected
* map (argName, value) format, then calls original test's run method.
*/
public static void main(String args[]) throws Exception {
System.out.println("=================================================");
// Parses parameters
Utils.parseDebugProperties();
Map<String, Object> map = Utils.parseParameters(args) ;
// Run test
MXBeanWeirdParamTest test = new MXBeanWeirdParamTest();
test.run(map);
}
/*
* Create the MBeansServe side of the test and returns its address
*/
private JMXServiceURL createServerSide() throws Exception {
final int NINETY_SECONDS = 90;
// We will use the platform mbean server
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
JMXServiceURL url = new JMXServiceURL("rmi", null, 0);
cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
cs.start();
Utils.waitReady(cs, NINETY_SECONDS);
JMXServiceURL addr = cs.getAddress();
return addr;
}
/*
* Creating command-line for running subprocess JVM:
*
* JVM command line is like:
* {test_jdk}/bin/java {defaultopts} -cp {test.class.path} {testopts} main
*
* {defaultopts} are the default java options set by the framework.
*
*/
private List<String> buildCommandLine() {
List<String> opts = new ArrayList<>();
opts.add(JDKToolFinder.getJDKTool("java"));
opts.addAll(Arrays.asList(jdk.testlibrary.Utils.getTestJavaOpts()));
// We need to set WEIRD_PARAM propertty on the client-side
opts.add("-DWEIRD_PARAM");
opts.add("-cp");
opts.add(System.getProperty("test.class.path", "test.class.path"));
opts.add(CLIENT_CLASS_MAIN);
return opts;
}
/**
* Runs MXBeanWeirdParamTest$ClientSide with the passed options and redirects
* subprocess standard I/O to the current (parent) process. This provides a
* trace of what happens in the subprocess while it is runnning (and before
* it terminates).
*
* @param serviceUrlStr string representing the JMX service Url to connect to.
*/
private int runClientSide(String serviceUrlStr) throws Exception {
// Building command-line
List<String> opts = buildCommandLine();
opts.add(serviceUrlStr);
// Launch separate JVM subprocess
int exitCode = 0;
String[] optsArray = opts.toArray(new String[0]);
ProcessBuilder pb = new ProcessBuilder(optsArray);
Process p = ProcessTools.startProcess("MXBeanWeirdParamTest$ClientSide", pb);
// Handling end of subprocess
try {
exitCode = p.waitFor();
if (exitCode != 0) {
System.out.println(
"Subprocess unexpected exit value of [" + exitCode +
"]. Expected 0.\n");
}
} catch (InterruptedException e) {
System.out.println("Parent process interrupted with exception : \n " + e + " :" );
// Parent thread unknown state, killing subprocess.
p.destroyForcibly();
throw new RuntimeException(
"Parent process interrupted with exception : \n " + e + " :" );
} finally {
return exitCode;
}
}
public void run(Map<String, Object> args) throws Exception {
System.out.println("MXBeanWeirdParamTest::run: Start") ;
int errorCount = 0;
try {
// Initialise the server side
JMXServiceURL urlToUse = createServerSide();
// Run client side
errorCount = runClientSide(urlToUse.toString());
if ( errorCount == 0 ) {
System.out.println("MXBeanWeirdParamTest::run: Done without any error") ;
} else {
System.out.println("MXBeanWeirdParamTest::run: Done with "
+ errorCount
+ " error(s)") ;
throw new RuntimeException("errorCount = " + errorCount);
}
cs.stop();
} catch(Exception e) {
throw new RuntimeException(e);
}
}
private static class ClientSide {
public static void main(String args[]) throws Exception {
int errorCount = 0 ;
String msgTag = "ClientSide::main: ";
try {
// Get a connection to remote mbean server
JMXServiceURL addr = new JMXServiceURL(args[0]);
JMXConnector cc = JMXConnectorFactory.connect(addr);
MBeanServerConnection mbsc = cc.getMBeanServerConnection();
// ----
System.out.println(msgTag + "Create and register the MBean");
ObjectName objName = new ObjectName("sqe:type=Basic,protocol=rmi") ;
mbsc.createMBean(BASIC_MXBEAN_CLASS_NAME, objName);
System.out.println(msgTag +"---- OK\n") ;
// ----
System.out.println(msgTag +"Get attribute SqeParameterAtt on our MXBean");
Object result = mbsc.getAttribute(objName, "SqeParameterAtt");
System.out.println(msgTag +"(OK) Got result of class "
+ result.getClass().getName());
System.out.println(msgTag +"Received CompositeData is " + result);
System.out.println(msgTag +"---- OK\n") ;
// ----
// We use the value returned by getAttribute to perform the invoke.
System.out.println(msgTag +"Call operation doWeird on our MXBean [1]");
mbsc.invoke(objName, "doWeird",
new Object[]{result},
new String[]{"javax.management.openmbean.CompositeData"});
System.out.println(msgTag +"---- OK\n") ;
// ----
// We build the CompositeData ourselves that time.
System.out.println(msgTag +"Call operation doWeird on our MXBean [2]");
String typeName = "SqeParameter";
String[] itemNames = new String[] {"glop"};
OpenType<?>[] openTypes = new OpenType<?>[] {SimpleType.STRING};
CompositeType rowType = new CompositeType(typeName, typeName,
itemNames, itemNames, openTypes);
Object[] itemValues = {"HECTOR"};
CompositeData data =
new CompositeDataSupport(rowType, itemNames, itemValues);
TabularType tabType = new TabularType(typeName, typeName,
rowType, new String[]{"glop"});
TabularDataSupport tds = new TabularDataSupport(tabType);
tds.put(data);
System.out.println(msgTag +"Source CompositeData is " + data);
mbsc.invoke(objName, "doWeird",
new Object[]{data},
new String[]{"javax.management.openmbean.CompositeData"});
System.out.println(msgTag +"---- OK\n") ;
// ----
System.out.println(msgTag +"Unregister the MBean");
mbsc.unregisterMBean(objName);
System.out.println(msgTag +"---- OK\n") ;
// Terminate the JMX Client
cc.close();
} catch(Exception e) {
Utils.printThrowable(e, true) ;
errorCount++;
throw new RuntimeException(e);
} finally {
System.exit(errorCount);
}
}
}
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.management.DescriptorKey;
/**
* That annotation is usable everywhere DescriptorKey is (and even more).
* It is for use to test that you can retrieve the SqeDescriptorKey into the
* appropriate Descriptor instances as built by the JMX runtime.
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface SqeDescriptorKey {
@DescriptorKey("sqeDescriptorKey")
String value();
// List descriptor fields that may be added or may be updated
// when retrieving an MBeanInfo using a JMXWS connection compared to the
// MBeanInfo returned by a local MBeanServer.
// The annotation format is :
// <descriptorFieldName>=<descriptorFieldValue>
// The values actually handled by the test suite are :
// openType=SimpleType.VOID
@DescriptorKey("descriptorFields")
String[] descriptorFields() default {};
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import javax.management.Notification;
/**
* Could hold someday a specific semantic.
* For now it is used to have a Notification which of another class, no more.
*/
public class SqeNotification extends Notification {
/** Creates a new instance of SqeNotification */
public SqeNotification(String type, Object source, long sequenceNumber) {
super(type, source, sequenceNumber);
}
/** Creates a new instance of SqeNotification */
public SqeNotification(String type, Object source, long sequenceNumber,
long timeStamp) {
super(type, source, sequenceNumber, timeStamp);
}
/** Creates a new instance of SqeNotification */
public SqeNotification(String type, Object source, long sequenceNumber,
long timeStamp, String message) {
super(type, source, sequenceNumber, timeStamp, message);
}
/** Creates a new instance of SqeNotification */
public SqeNotification(String type, Object source, long sequenceNumber,
String message) {
super(type, source, sequenceNumber, message);
}
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.io.Serializable;
/**
* That class is to use as an MBean operation parameter or returned value.
* The property Glop with its public getter + setter is only there to be
* reconstructible following MXBean specification, so that SqeParameter can be
* used for what it is designed to.
*/
public class SqeParameter implements Serializable {
private static boolean weird;
private String glop;
static {
if ( System.getProperty("WEIRD_PARAM") != null ) {
weird = true;
}
}
/**
* Creates a new instance of SqeParameter.
* <br>When the Java property WEIRD_PARAM is set, that constructor
* throws an exception.
* <br>That can be used to ensure the class is instantiated on server side
* but never on client side.
*/
public SqeParameter() throws Exception {
if ( weird ) {
throw new Exception();
}
}
public String getGlop() {
return glop;
}
public void setGlop(String value) {
glop = value;
}
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.util.Map;
import java.util.HashMap;
import java.util.Properties;
import java.lang.reflect.Method;
import javax.management.remote.JMXConnectorServerMBean;
// utility class for MXBean* tests coming from JMX Tonga test suite
class Utils {
// DEBUG is printed depending on the DEBUG and DEBUG_LEVEL JAVA property
private static final String DEBUG_HEADER = "[debug] ";
// DEBUG levels
private static int selectedDebugLevel = 0;
static final int DEBUG_STANDARD = 1;
static final int DEBUG_VERBOSE = 2; // Mainly used for stress tests
static final int DEBUG_ALL = DEBUG_STANDARD | DEBUG_VERBOSE;
static void parseDebugProperties() {
int level = 0;
Properties p = System.getProperties();
// get selected levels
if (p.getProperty("DEBUG_STANDARD") != null) {
level |= DEBUG_STANDARD;
}
if (p.getProperty("DEBUG_VERBOSE") != null) {
level |= DEBUG_VERBOSE;
}
if (p.getProperty("DEBUG_ALL") != null) {
level |= DEBUG_ALL;
}
selectedDebugLevel = level;
}
/**
* Reproduces the original parsing and collection of test parameters
* from the DTonga JMX test suite.
*
* Collects passed args and returns them in a map(argname, value) structure,
* which will be then propagated as necessary to various called methods.
*/
static Map<String, Object> parseParameters(String args[])
throws Exception {
Utils.debug(DEBUG_STANDARD, "TestRoot::parseParameters: Start");
HashMap<String, Object> map = new HashMap<>();
for ( int i = 0; i < args.length; i++ ) {
if ( args[i].trim().startsWith("-") ) {
if ((i+1) < args.length && !args[i+1].startsWith("-") ) {
Utils.debug(DEBUG_STANDARD,
"TestRoot::parseParameters: added in map = " +
args[i] +
" with value " +
args[i+1]) ;
map.put(args[i].trim(), args[i+1].trim()) ;
} else if ((i+1) < args.length && args[i+1].startsWith("-") ||
(i+1) == args.length ) {
Utils.debug(DEBUG_STANDARD,
"TestRoot::parseParameters: added in map = " +
args[i] +
" with null value") ;
map.put(args[i].trim(), null) ;
} else {
System.out.println(
"TestRoot::parseParameters: (WARNING) not added in map = " +
args[i]) ;
}
}
}
Utils.debug(DEBUG_STANDARD, "TestRoot::parseParameters: Done") ;
return map ;
}
/**
* This method is to be used in all tests to print anything
* that is temporary.
* Printing is done only when debug is activated by the property DEBUG.
* Printing depends also on the DEBUG_LEVEL property.
* Here it encapsulates a System.out.println.
*/
public static void debug(int level, String line) {
if ((selectedDebugLevel & level) != 0) {
System.out.println(DEBUG_HEADER + line);
}
}
/**
* Do print stack trace when withStack is true.
* Does try to call getTargetException() and getTargetError() then
* print embedded stacks in the case of an Exception wrapping
* another Exception or an Error. Recurse until no more wrapping
* is found.
*/
public static void printThrowable(Throwable theThro, boolean withStack) {
try {
if (withStack) {
theThro.printStackTrace(System.out);
}
if (theThro instanceof Exception) {
Exception t = (Exception) theThro;
Method target = null;
String blank = " ";
try {
target = t.getClass().getMethod("getTargetException",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetException method could be there or not
}
System.out.println(blank + t.getClass() + "==>" + t.getMessage());
while (target != null) {
try {
t = (Exception) target.invoke(t,
(java.lang.Object[]) null);
} catch (Exception ee) {
t = null;
}
try {
if (t != null) {
blank = blank + " ";
System.out.println(blank + t.getClass() + "==>" +
t.getMessage());
try {
target =
t.getClass().getMethod("getTargetException",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetException method could be there or not }
}
} else {
target = null;
}
} catch (Exception ee) {
target = null;
}
}
// We may have exceptions wrapping an Error then it is
// getTargetError that is likely to be called
try {
target = ((Exception) theThro).getClass().getMethod("getTargetError",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetError method could be there or not
}
Throwable err = theThro;
while (target != null) {
try {
err = (Error) target.invoke(err,
(java.lang.Object[]) null);
} catch (Exception ee) {
err = null;
}
try {
if (err != null) {
blank = blank + " ";
System.out.println(blank + err.getClass() + "==>" +
err.getMessage());
if (withStack) {
err.printStackTrace(System.out);
}
try {
target = err.getClass().getMethod("getTargetError",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetError method could be there or not
}
} else {
target = null;
}
} catch (Exception ee) {
target = null;
}
}
} else {
System.out.println("Throwable is : " + theThro);
}
} catch (Throwable x) {
System.out.println("Exception : raised in printException : " + x);
}
}
/**
* Wait up to maxTimeInSeconds second(s) the given JMX connector server
* comes up (which means isActive returns true).
* If it fails to do so we throw a RunTime exception.
*/
public static void waitReady(JMXConnectorServerMBean server,
int maxTimeInSeconds) throws Exception {
int elapsed = 0;
while (!server.isActive() && elapsed < maxTimeInSeconds) {
Thread.sleep(1000);
elapsed++;
}
if (server.isActive()) {
String message = "Utils::waitReady: JMX connector server came up";
if ( elapsed == 0) {
message += " immediately";
} else {
message += " after " + elapsed + " seconds";
}
message += " [" + server.getAddress() + "]";
Utils.debug(DEBUG_STANDARD, message);
} else {
String message = "Utils::waitReady: (ERROR) JMX connector" +
" server didn't come up after " + elapsed + " seconds [" +
server.getAddress() + "]";
System.out.println(message);
throw new RuntimeException(message);
}
}
}
/*
* Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
public abstract class QueryData {
protected int intValue = 9;
protected long longValue = 9L;
protected Integer integerValue = Integer.valueOf(9);
protected boolean booleanValue = true;
protected double doubleValue = 9D;
protected float floatValue = 9.0F;
protected String stringValue = "9";
}
/*
* Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.util.ArrayList;
import javax.management.Query;
import javax.management.QueryExp;
import javax.management.ValueExp;
/**
* Class used for building QueryExp instances of all every possible type
* in terms of JMX API members; note that several JMX classes are private
* and appears in the JDK API only by their serial form.
* Comments in each case of the big switch in method getQuery() details which
* API member we cover with a given query.
*/
public class QueryFactory extends QueryData {
private String mbeanClassName = "";
private String primitiveIntAttName = "IntAtt";
private String primitiveLongAttName = "LongAtt";
private String integerAttName = "IntegerAtt";
private String primitiveBooleanAttName = "BooleanAtt";
private String primitiveDoubleAttName = "DoubleAtt";
private String primitiveFloatAttName = "FloatAtt";
private String stringAttName = "StringAtt";
private ArrayList<QueryExp> queries = new ArrayList<QueryExp>();
/**
* Creates a new instance of QueryFactory.
* The name is the fully qualified class name of an MBean.
* There is severe constraints on that MBean that must:
* <ul>
* <li>extend QueryData in order to inherit attribute values.
* <li>define a RW attribute IntAtt of type int
* initialized to QueryData.longValue
* <li>define a RW attribute LongAtt of type long
* initialized to QueryData.intValue
* <li>define a RW attribute IntegerAtt of type Integer
* initialized to QueryData.integerValue
* <li>define a RW attribute BooleanAtt of type boolean
* initialized to QueryData.booleanValue
* <li>define a RW attribute DoubleAtt of type double
* initialized to QueryData.doubleValue
* <li>define a RW attribute FloatAtt of type float
* initialized to QueryData.floatValue
* <li>define a RW attribute StringAtt of type String
* initialized to QueryData.stringValue
* </ul>
*/
public QueryFactory(String name) {
this.mbeanClassName = name;
}
/**
* Returns the highest index value the method getQuery supports.
* WARNING : returns 0 if buildQueries haven't been called first !
*/
public int getSize() {
return queries.size();
}
/**
* Populates an ArrayList of QueryExp.
* Lowest index is 1.
* Highest index is returned by getSize().
* <br>The queries numbered 1 to 23 allow to cover all the underlying
* Java classes of the JMX API used to build queries.
*/
public void buildQueries() {
if ( queries.size() == 0 ) {
int smallerIntValue = intValue - 1;
int biggerIntValue = intValue + 1;
// case 1:
// True if the MBean is of class mbeanClassName
// We cover javax.management.InstanceOfQueryExp
queries.add(Query.isInstanceOf(Query.value(mbeanClassName)));
// case 2:
// True if the MBean is of class mbeanClassName
// We cover javax.management.MatchQueryExp and
// javax.management.ClassAttributeValueExp
queries.add(Query.match(Query.classattr(),
Query.value(mbeanClassName)));
// case 3:
// True if an attribute named primitiveIntAttName of type int has
// the value intValue
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to EQ and javax.management.NumericValueExp
queries.add(Query.eq(Query.attr(primitiveIntAttName),
Query.value(intValue)));
// case 4:
// True if an attribute named primitiveLongAttName of type long has
// the value longValue
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to EQ and javax.management.NumericValueExp
queries.add(Query.eq(Query.attr(primitiveLongAttName),
Query.value(longValue)));
// case 5:
// True if an attribute named primitiveDoubleAttName of type double
// has the value doubleValue
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to EQ and javax.management.NumericValueExp
queries.add(Query.eq(Query.attr(primitiveDoubleAttName),
Query.value(doubleValue)));
// case 6:
// True if an attribute named primitiveFloatAttName of type float
// has the value floatValue
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to EQ and javax.management.NumericValueExp
queries.add(Query.eq(Query.attr(primitiveFloatAttName),
Query.value(floatValue)));
// case 7:
// True if an attribute named primitiveIntAttName of type int is
// hold by an MBean of class mbeanClassName and has
// the value intValue
// We cover javax.management.QualifiedAttributeValueExp
queries.add(Query.eq(Query.attr(mbeanClassName, primitiveIntAttName),
Query.value(intValue)));
// case 8:
// True if an attribute named stringAttName of type String has
// the value stringValue
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to EQ and javax.management.StringValueExp
queries.add(Query.eq(Query.attr(stringAttName),
Query.value(stringValue)));
// case 9:
// True if an attribute named integerAttName of type Integer has
// the value integerValue
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to EQ and javax.management.NumericValueExp
queries.add(Query.eq(Query.attr(integerAttName),
Query.value(integerValue)));
// case 10:
// True if an attribute named primitiveBooleanAttName of type boolean
// has the value booleanValue
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to EQ and javax.management.BooleanValueExp
queries.add(Query.eq(Query.attr(primitiveBooleanAttName),
Query.value(booleanValue)));
// case 11:
// True if an attribute named primitiveIntAttName of type int has
// not the value smallerIntValue
// We cover javax.management.NotQueryExp
queries.add(Query.not(Query.eq(Query.attr(primitiveIntAttName),
Query.value(smallerIntValue))));
// case 12:
// True if either
// an attribute named primitiveIntAttName of type int has
// the value intValue
// or
// an attribute named primitiveLongAttName of type long has
// the value longValue
// We cover javax.management.OrQueryExp
queries.add(Query.or(
Query.eq(Query.attr(primitiveIntAttName),
Query.value(intValue)),
Query.eq(Query.attr(primitiveLongAttName),
Query.value(longValue))));
// case 13:
// True if
// an attribute named primitiveIntAttName of type int has
// the value intValue
// and
// an attribute named primitiveLongAttName of type long has
// the value longValue
// We cover javax.management.AndQueryExp
queries.add(Query.and(
Query.eq(Query.attr(primitiveIntAttName),
Query.value(intValue)),
Query.eq(Query.attr(primitiveLongAttName),
Query.value(longValue))));
// case 14:
// True if an attribute named primitiveIntAttName of type int has
// the value intValue
// We cover javax.management.InQueryExp
ValueExp[] inArray = {Query.value(intValue)};
queries.add(Query.in(Query.attr(primitiveIntAttName), inArray));
// case 15:
// True if an attribute named primitiveIntAttName of type int has
// its value in between smallerIntValue and biggerIntValue
// We cover javax.management.BetweenRelQueryExp
queries.add(Query.between(Query.attr(primitiveIntAttName),
Query.value(smallerIntValue),
Query.value(biggerIntValue)));
// case 16:
// True if an attribute named primitiveIntAttName of type int has
// a value greater than smallerIntValue
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to GT
queries.add(Query.gt(Query.attr(primitiveIntAttName),
Query.value(smallerIntValue)));
// case 17:
// True if an attribute named primitiveIntAttName of type int has
// a value greater or equal to smallerIntValue
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to GE
queries.add(Query.geq(Query.attr(primitiveIntAttName),
Query.value(smallerIntValue)));
// case 18:
// True if an attribute named primitiveIntAttName of type int has
// a value smaller than biggerIntValue
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to LT
queries.add(Query.lt(Query.attr(primitiveIntAttName),
Query.value(biggerIntValue)));
// case 19:
// True if an attribute named primitiveIntAttName of type int has
// a value smaller or equal to biggerIntValue
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to LE
queries.add(Query.leq(Query.attr(primitiveIntAttName),
Query.value(biggerIntValue)));
// case 20:
// True if an attribute named primitiveIntAttName of type int has
// a value equal to intValue minus zero
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to MINUS
queries.add(Query.eq(Query.attr(primitiveIntAttName),
Query.minus(Query.value(intValue), Query.value(0))));
// case 21:
// True if an attribute named primitiveIntAttName of type int has
// a value equal to intValue plus zero
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to PLUS
queries.add(Query.eq(Query.attr(primitiveIntAttName),
Query.plus(Query.value(intValue), Query.value(0))));
// case 22:
// True if an attribute named primitiveIntAttName of type int has
// a value equal to intValue divided by one
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to DIV
queries.add(Query.eq(Query.attr(primitiveIntAttName),
Query.div(Query.value(intValue), Query.value(1))));
// case 23:
// True if an attribute named primitiveIntAttName of type int has
// a value equal to intValue multiplicated by one
// We cover javax.management.BinaryRelQueryExp with
// a relOp equal to TIMES
queries.add(Query.eq(Query.attr(primitiveIntAttName),
Query.times(Query.value(intValue), Query.value(1))));
// case 24:
// That query is a complex one that combines within a big AND
// queries with index 2 to 23 inclusive. But because a List is
// zero based, we must decrement all indexes by 1 when retrieving
// any previously stored query.
QueryExp q2_3 = Query.and(queries.get(2-1), queries.get(3-1));
QueryExp q4_5 = Query.and(queries.get(4-1), queries.get(5-1));
QueryExp q6_7 = Query.and(queries.get(6-1), queries.get(7-1));
QueryExp q8_9 = Query.and(queries.get(8-1), queries.get(9-1));
QueryExp q10_11 = Query.and(queries.get(10-1), queries.get(11-1));
QueryExp q12_13 = Query.and(queries.get(12-1), queries.get(13-1));
QueryExp q14_15 = Query.and(queries.get(14-1), queries.get(15-1));
QueryExp q16_17 = Query.and(queries.get(16-1), queries.get(17-1));
QueryExp q18_19 = Query.and(queries.get(18-1), queries.get(19-1));
QueryExp q20_21 = Query.and(queries.get(20-1), queries.get(21-1));
QueryExp q22_23 = Query.and(queries.get(22-1), queries.get(23-1));
QueryExp q2_5 = Query.and(q2_3, q4_5);
QueryExp q6_9 = Query.and(q6_7, q8_9);
QueryExp q10_13 = Query.and(q10_11, q12_13);
QueryExp q14_17 = Query.and(q14_15, q16_17);
QueryExp q18_21 = Query.and(q18_19, q20_21);
QueryExp q2_9 = Query.and(q2_5, q6_9);
QueryExp q10_17 = Query.and(q10_13, q14_17);
QueryExp q18_23 = Query.and(q18_21, q22_23);
QueryExp q2_17 = Query.and(q2_9, q10_17);
queries.add(Query.and(q2_17, q18_23));
// case 25:
// Complex query mixing AND and OR.
queries.add(Query.or(q6_9, q18_23));
}
}
/**
* Returns a QueryExp taken is the ArrayList populated by buildQueries().
* Lowest index is 1.
* Highest index is returned by getSize().
* <br>The queries numbered 1 to 23 allow to cover all the underlying
* Java classes of the JMX API used to build queries.
*/
public QueryExp getQuery(int index) {
return queries.get(index - 1);
}
}
/*
* Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.security.Principal;
import java.util.ArrayList;
import java.util.List;
import javax.management.remote.JMXServiceURL ;
import javax.management.MBeanRegistration;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.StandardMBean;
/**
* This class defines an MBean that can be registered and used on client side
* to handle informations or properties of the remote server.
*
* For example, this MBean can store IOR addresses
* of RMI/IIOP connector(s) used in a test.
*
* That MBean might not be used for testing purpose itself.
*/
public class ServerDelegate implements ServerDelegateMBean, MBeanRegistration {
private MBeanServer mbeanServer = null;
private List<JMXServiceURL> addresses = null;
private String port;
private static String javaVersion = System.getProperty("java.version");
private int sqeJmxwsCredentialsProviderCallCount = 0;
private String jmxwsCredentialsProviderUrl = null;
private int testJMXAuthenticatorCallCount = 0;
private Principal testJMXAuthenticatorPrincipal = null;
@SqeDescriptorKey("NO PARAMETER CONSTRUCTOR ServerDelegate")
public ServerDelegate() {
addresses = new ArrayList<JMXServiceURL>();
}
public ObjectName preRegister(MBeanServer server, ObjectName name)
throws Exception {
// Initialize MBeanServer attribute
mbeanServer = server;
return name;
}
public void postRegister(Boolean registrationDone) {
}
public void preDeregister() throws Exception {
}
public void postDeregister() {
}
public void addAddress(JMXServiceURL url) {
addresses.add(url) ;
}
public List<JMXServiceURL> getAddresses() {
return addresses ;
}
public void setPort(String p) {
port = p ;
}
public String getPort() {
return port ;
}
public String getJavaVersion() {
return javaVersion;
}
public void sqeJmxwsCredentialsProviderCalled() {
sqeJmxwsCredentialsProviderCallCount++;
}
public int getSqeJmxwsCredentialsProviderCallCount() {
return sqeJmxwsCredentialsProviderCallCount;
}
public void setJmxwsCredentialsProviderUrl(String url) {
jmxwsCredentialsProviderUrl = url;
}
public String getJmxwsCredentialsProviderUrl() {
return jmxwsCredentialsProviderUrl;
}
public void testJMXAuthenticatorCalled() {
testJMXAuthenticatorCallCount++;
}
public int getTestJMXAuthenticatorCallCount() {
return testJMXAuthenticatorCallCount;
}
public void setTestJMXAuthenticatorPrincipal(Principal principal) {
testJMXAuthenticatorPrincipal = principal;
}
public String getTestJMXAuthenticatorPrincipalString() {
if ( testJMXAuthenticatorPrincipal != null ) {
return testJMXAuthenticatorPrincipal.toString();
}
return null;
}
/**
* Instantiates and registers a StandardMBean in the MBean server.
*
* @param implementationClassName
* The implementation class name of the MBean.
* @param interfaceClassName
* The management interface class name of the MBean.
* @param isMXBean
* If true, the resultant MBean is an MXBean.
* @param name
* The object name of the StandardMBean.
*/
@SuppressWarnings("unchecked")
public void createStandardMBean(
String implementationClassName,
String interfaceClassName,
boolean isMXBean,
ObjectName name)
throws Exception {
Object implementation =
Class.forName(implementationClassName).newInstance();
Class<Object> interfaceClass = interfaceClassName == null ? null :
(Class<Object>)Class.forName(interfaceClassName);
// Create the StandardMBean
StandardMBean standardMBean = new StandardMBean(
implementation,
interfaceClass,
isMXBean);
// Register the StandardMBean
mbeanServer.registerMBean(standardMBean, name);
}
/**
* Instantiates and registers a StandardMBean in the MBean server.
* The object will use standard JMX design pattern to determine
* the management interface associated with the given implementation.
*/
@SuppressWarnings("unchecked")
public void createStandardMBean(
String implementationClassName,
boolean isMXBean,
ObjectName name)
throws Exception {
createStandardMBean(implementationClassName, null, isMXBean, name);
}
}
/*
* Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.security.Principal;
import java.util.List;
import javax.management.remote.JMXServiceURL ;
import javax.management.ObjectName;
@SqeDescriptorKey("INTERFACE ServerDelegateMBean")
public interface ServerDelegateMBean {
@SqeDescriptorKey("ATTRIBUTE Address")
public void addAddress(JMXServiceURL url);
@SqeDescriptorKey("ATTRIBUTE Address")
public List<JMXServiceURL> getAddresses();
public String getPort();
public void setPort(String p);
public String getJavaVersion();
public void sqeJmxwsCredentialsProviderCalled();
public int getSqeJmxwsCredentialsProviderCallCount();
public void setJmxwsCredentialsProviderUrl(String url);
public String getJmxwsCredentialsProviderUrl();
public void testJMXAuthenticatorCalled();
public int getTestJMXAuthenticatorCallCount();
public void setTestJMXAuthenticatorPrincipal(Principal principal);
public String getTestJMXAuthenticatorPrincipalString();
public void createStandardMBean(
String implementationClassName,
String interfaceClassName,
boolean isMXBean,
ObjectName name)
throws Exception;
public void createStandardMBean(
String implementationClassName,
boolean isMXBean,
ObjectName name)
throws Exception;
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.management.DescriptorKey;
/**
* That annotation is usable everywhere DescriptorKey is (and even more).
* It is for use to test that you can retrieve the SqeDescriptorKey into the
* appropriate Descriptor instances as built by the JMX runtime.
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface SqeDescriptorKey {
@DescriptorKey("sqeDescriptorKey")
String value();
// List descriptor fields that may be added or may be updated
// when retrieving an MBeanInfo using a JMXWS connection compared to the
// MBeanInfo returned by a local MBeanServer.
// The annotation format is :
// <descriptorFieldName>=<descriptorFieldValue>
// The values actually handled by the test suite are :
// openType=SimpleType.VOID
@DescriptorKey("descriptorFields")
String[] descriptorFields() default {};
}
/*
* Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8058865
* @summary Tests most of the existing query types.
* @author Olivier Lagneau
* @modules java.management
* @compile TestQuery.java
* @run main/othervm/timeout=300 -DDEBUG_STANDARD SupportedQueryTypesTest -mbeanClassName TestQuery
*/
import java.util.Map ;
import java.util.HashMap;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Properties;
import java.lang.reflect.Method;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName ;
import javax.management.QueryExp;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
public class SupportedQueryTypesTest {
protected String mbeanClassName = null;
private MBeanServerConnection mbsc = null;
/*
* First Debug properties and arguments are collect in expected
* map (argName, value) format, then calls original test's run method.
*/
public static void main(String args[]) throws Exception {
System.out.println("=================================================");
// Parses parameters
Utils.parseDebugProperties();
Map<String, Object> map = Utils.parseParameters(args) ;
// Run test
SupportedQueryTypesTest test = new SupportedQueryTypesTest();
test.run(map);
}
public void run(Map<String, Object> args) {
int errorCount = 0;
ObjectName on = null;
ObjectName serverDelegateObjectName = null;
JMXConnectorServer cs = null;
JMXConnector cc = null;
System.out.println("SupportedQueryTypesTest::run: Start") ;
try {
// JMX MbeanServer used inside single VM as if remote.
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
JMXServiceURL url = new JMXServiceURL("rmi", null, 0);
cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
cs.start();
JMXServiceURL addr = cs.getAddress();
cc = JMXConnectorFactory.connect(addr);
mbsc = cc.getMBeanServerConnection();
// Create and register the ServerDelegate MBean on the remote MBeanServer
String serverDelegateClassName = ServerDelegate.class.getName();
serverDelegateObjectName =
new ObjectName("defaultDomain:class=" + serverDelegateClassName);
mbsc.createMBean(serverDelegateClassName, serverDelegateObjectName);
// Retrieve the MBean class name
mbeanClassName = (String) args.get("-mbeanClassName") ;
on = new ObjectName("defaultDomain:class=" + mbeanClassName);
// Create and register the MBean on the remote MBeanServer
System.out.println("SupportedQueryTypesTest::run: CREATE " +
mbeanClassName + " on the remote MBeanServer with name "
+ on);
mbsc.createMBean(mbeanClassName, on);
// Create a QueryFactory and setup which query we'll use.
QueryFactory queries = new QueryFactory(mbeanClassName);
queries.buildQueries();
int maxIndex = queries.getSize();
int minIndex = 1;
// Create a reference Set<ObjectName> to check later on
// the queryNames() results
Set<ObjectName> referenceNameSet = new HashSet<ObjectName>();
referenceNameSet.add(on);
// Create a reference Set<ObjectInstance> to check later on
// the queryMBeans() results
ObjectInstance oi = new ObjectInstance(on, mbeanClassName);
Set<ObjectInstance> referenceInstanceSet =
new HashSet<ObjectInstance>();
referenceInstanceSet.add(oi);
// Perform the queryNames and queryMBeans requests
for (int i = minIndex; i <= maxIndex; i++ ) {
QueryExp query = queries.getQuery(i);
System.out.println("----");
System.out.println("SupportedQueryTypesTest::run: Query # " + i);
System.out.println("query " + query);
errorCount +=
doQueryNames(query, referenceNameSet);
errorCount +=
doQueryMBeans(query, referenceInstanceSet);
}
} catch(Exception e) {
Utils.printThrowable(e, true);
errorCount++;
} finally {
// Do unregister the MBean
try {
if (mbsc.isRegistered(on)) {
mbsc.unregisterMBean(on);
}
if (mbsc.isRegistered(serverDelegateObjectName)) {
mbsc.unregisterMBean(serverDelegateObjectName);
}
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++;
}
try {
// Close JMX Connector Client
cc.close();
// Stop connertor server
cs.stop();
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++;
}
}
System.out.println("");
System.out.println("SupportedQueryTypesTest::run: Done") ;
// Handle result
if (errorCount == 0) {
System.out.println("SupportedQueryTypesTest::run: (OK)");
} else {
String message = "SupportedQueryTypesTest::run: (ERROR) Got " +
+ errorCount + " error(s)";
System.out.println(message);
throw new RuntimeException(message);
}
}
private int doQueryNames(QueryExp query, Set<ObjectName> referenceSet) {
int errorCount = 0;
System.out.println(" <*> Perform queryNames call ");
try {
// Call queryNames on the remote MBeanServer
Set<ObjectName> remoteSet = mbsc.queryNames(null, query);
// Compare the 2 Set<ObjectName>
errorCount += checkSet(remoteSet, referenceSet);
// Cleaning
remoteSet.clear();
} catch (Exception e) {
Utils.printThrowable(e, true);
errorCount++;
}
if ( errorCount == 0 ) {
System.out.println("\t(OK)");
} else {
System.out.println("\t(ERROR) Query failed");
}
return errorCount;
}
private int doQueryMBeans(QueryExp query, Set<ObjectInstance> referenceSet) {
int errorCount = 0;
System.out.println(" <*> Perform queryMBeans call ");
try {
// Call queryMBeans on the remote MBeanServer
Set<ObjectInstance> remoteSet = mbsc.queryMBeans(null, query);
// Compare the 2 Set<ObjectInstance>
errorCount += checkSet(remoteSet, referenceSet);
// Cleaning
remoteSet.clear();
} catch (Exception e) {
Utils.printThrowable(e, true);
errorCount++;
}
if ( errorCount == 0 ) {
System.out.println("\t(OK)");
} else {
System.out.println("\t(ERROR) Query failed");
}
return errorCount;
}
/**
* Pretty print of a Set content.
* When the Set isn't empty, toString() is called on each element.
* <br>The variable's name used to hold that Set is given via the setName
* parameter and used in the output.
*/
private static void printSet(Set<?> printableSet, String setName) {
if ( printableSet.size() == 0 ) {
System.out.println("The Set " + setName + " is empty");
} else {
System.out.println("The Set " + setName + " contains :");
for (Iterator<?> it = printableSet.iterator(); it.hasNext();) {
Object elem = it.next();
System.out.println("\t" + elem.toString());
}
}
}
/**
* This method check the Set remoteSet is equal to
* the reference Set referenceSet,
* which means same size and content (order doesn't matter).
* <br>It returns 0 when the check is fine, otherwise 1.
*/
private int checkSet(Set<?> remoteSet, Set<?> referenceSet) {
if ( ! remoteSet.equals(referenceSet) ) {
System.out.println("SupportedQueryTypesTest::checkSet:"
+ " (ERROR) Set aren't as expected");
printSet(remoteSet, "remoteSet");
printSet(referenceSet, "referenceSet");
return 1;
} else {
return 0;
}
}
// Utility inner class coming from JMX Tonga test suite.
private static class Utils {
// DEBUG is printed depending on the DEBUG and DEBUG_LEVEL JAVA property
static final String DEBUG_HEADER = "[debug] ";
// DEBUG levels
static int selectedDebugLevel = 0;
static final int DEBUG_STANDARD = 1;
static final int DEBUG_VERBOSE = 2; // Mainly used for stress tests
static final int DEBUG_ALL = DEBUG_STANDARD | DEBUG_VERBOSE;
static void parseDebugProperties() {
int level = 0;
Properties p = System.getProperties();
// get selected levels
if (p.getProperty("DEBUG_STANDARD") != null) {
level |= DEBUG_STANDARD;
}
if (p.getProperty("DEBUG_VERBOSE") != null) {
level |= DEBUG_VERBOSE;
}
if (p.getProperty("DEBUG_ALL") != null) {
level |= DEBUG_ALL;
}
selectedDebugLevel = level;
}
/**
* Reproduces the original parsing and collection of test parameters
* from the DTonga JMX test suite.
*
* Collects passed args and returns them in a map(argname, value) structure,
* which will be then propagated as necessary to various called methods.
*/
static Map<String, Object> parseParameters(String args[])
throws Exception {
debug(DEBUG_STANDARD, "TestRoot::parseParameters: Start");
HashMap<String, Object> map = new HashMap<>();
for ( int i = 0; i < args.length; i++ ) {
if ( args[i].trim().startsWith("-") ) {
if ((i+1) < args.length && !args[i+1].startsWith("-") ) {
debug(DEBUG_STANDARD,
"TestRoot::parseParameters: added in map = " +
args[i] +
" with value " +
args[i+1]) ;
map.put(args[i].trim(), args[i+1].trim()) ;
} else if ((i+1) < args.length && args[i+1].startsWith("-") ||
(i+1) == args.length ) {
debug(DEBUG_STANDARD,
"TestRoot::parseParameters: added in map = " +
args[i] +
" with null value") ;
map.put(args[i].trim(), null) ;
} else {
System.out.println(
"TestRoot::parseParameters: (WARNING) not added in map = " +
args[i]) ;
}
}
}
debug(DEBUG_STANDARD, "TestRoot::parseParameters: Done") ;
return map ;
}
/**
* This method is to be used in all tests to print anything
* that is temporary.
* Printing is done only when debug is activated by the property DEBUG.
* Printing depends also on the DEBUG_LEVEL property.
* Here it encapsulates a System.out.println.
*/
static void debug(int level, String line) {
if ((selectedDebugLevel & level) != 0) {
System.out.println(DEBUG_HEADER + line);
}
}
/**
* Do print stack trace when withStack is true.
* Does try to call getTargetException() and getTargetError() then
* print embedded stacks in the case of an Exception wrapping
* another Exception or an Error. Recurse until no more wrapping
* is found.
*/
static void printThrowable(Throwable theThro, boolean withStack) {
try {
if (withStack) {
theThro.printStackTrace(System.out);
}
if (theThro instanceof Exception) {
Exception t = (Exception) theThro;
Method target = null;
String blank = " ";
try {
target = t.getClass().getMethod("getTargetException",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetException method could be there or not
}
System.out.println(blank + t.getClass() + "==>" + t.getMessage());
while (target != null) {
try {
t = (Exception) target.invoke(t,
(java.lang.Object[]) null);
} catch (Exception ee) {
t = null;
}
try {
if (t != null) {
blank = blank + " ";
System.out.println(blank + t.getClass() + "==>" +
t.getMessage());
try {
target =
t.getClass().getMethod("getTargetException",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetException method could be there or not }
}
} else {
target = null;
}
} catch (Exception ee) {
target = null;
}
}
// We may have exceptions wrapping an Error then it is
// getTargetError that is likely to be called
try {
target = ((Exception) theThro).getClass().getMethod("getTargetError",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetError method could be there or not
}
Throwable err = theThro;
while (target != null) {
try {
err = (Error) target.invoke(err,
(java.lang.Object[]) null);
} catch (Exception ee) {
err = null;
}
try {
if (err != null) {
blank = blank + " ";
System.out.println(blank + err.getClass() + "==>" +
err.getMessage());
if (withStack) {
err.printStackTrace(System.out);
}
try {
target = err.getClass().getMethod("getTargetError",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetError method could be there or not
}
} else {
target = null;
}
} catch (Exception ee) {
target = null;
}
}
} else {
System.out.println("Throwable is : " + theThro);
}
} catch (Throwable x) {
System.out.println("Exception : raised in printException : " + x);
}
}
}
}
/*
* Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* Class TestQuery
* MBean used for testing the types wired when using QueryExp.
* It is heavily linked to QueryFactory.
*/
public class TestQuery extends QueryData implements TestQueryMBean {
/**
* Attribute : BooleanAtt
*/
private boolean booleanAtt = booleanValue;
/**
* Attribute : DoubleAtt
*/
private double doubleAtt = doubleValue;
/**
* Attribute : FloatAtt
*/
private float floatAtt = floatValue;
/**
* Attribute : IntAtt
*/
private int intAtt = intValue;
/**
* Attribute : IntegerAtt
*/
private Integer integerAtt = integerValue;
/**
* Attribute : LongAtt
*/
private long longAtt = longValue;
/**
* Attribute : StringAtt
*/
private String stringAtt = stringValue;
public TestQuery() {
}
/**
* Get Att of type boolean
*/
public boolean getBooleanAtt() {
return booleanAtt;
}
/**
* Set Att of type boolean
*/
public void setBooleanAtt(boolean value) {
booleanAtt = value;
}
/**
* Get Att of type double
*/
public double getDoubleAtt() {
return doubleAtt;
}
/**
* Set Att of type double
*/
public void setDoubleAtt(double value) {
doubleAtt = value;
}
/**
* Get Att of type float
*/
public float getFloatAtt() {
return floatAtt;
}
/**
* Set Att of type float
*/
public void setFloatAtt(float value) {
floatAtt = value;
}
/**
* Get Att of type int
*/
public int getIntAtt() {
return intAtt;
}
/**
* Set Att of type int
*/
public void setIntAtt(int value) {
intAtt = value;
}
/**
* Get Att of type Integer
*/
public Integer getIntegerAtt() {
return integerAtt;
}
/**
* Set Att of type Integer
*/
public void setIntegerAtt(Integer value) {
integerAtt = value;
}
/**
* Get Att of type long
*/
public long getLongAtt() {
return longAtt;
}
/**
* Set Att of type long
*/
public void setLongAtt(long value) {
longAtt = value;
}
/**
* Get Att of type String
*/
public String getStringAtt() {
return stringAtt;
}
/**
* Set Att of type String
*/
public void setStringAtt(String value) {
stringAtt = value;
}
}
/*
* Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* Interface TestQueryMBean
* MBean used for testing the types wired when using QueryExp.
* It is heavily linked to QueryFactory.
*/
public interface TestQueryMBean
{
/**
* Get Att of type boolean
*/
public boolean getBooleanAtt();
/**
* Set Att of type boolean
*/
public void setBooleanAtt(boolean value);
/**
* Get Att of type double
*/
public double getDoubleAtt();
/**
* Set Att of type double
*/
public void setDoubleAtt(double value);
/**
* Get Att of type float
*/
public float getFloatAtt();
/**
* Set Att of type float
*/
public void setFloatAtt(float value);
/**
* Get Att of type int
*/
public int getIntAtt();
/**
* Set Att of type int
*/
public void setIntAtt(int value);
/**
* Get Att of type Integer
*/
public Integer getIntegerAtt();
/**
* Set Att of type Integer
*/
public void setIntegerAtt(Integer value);
/**
* Get Att of type long
*/
public long getLongAtt();
/**
* Set Att of type long
*/
public void setLongAtt(long value);
/**
* Get Att of type String
*/
public String getStringAtt();
/**
* Set Att of type String
*/
public void setStringAtt(String value);
}
/*
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8058865
* @summary Checks various authentication behavior from remote jmx client
* @author Olivier Lagneau
* @modules java.management
* @library /lib/testlibrary
* @compile Simple.java
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dusername=username1 -Dpassword=password1 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dusername=username2 -Dpassword=password2 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedCreateException -expectedSetException -expectedInvokeException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dusername=username6 -Dpassword=password6 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedCreateException -expectedGetException -expectedSetException -expectedInvokeException
* @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username1 -Dpassword=password1 AuthorizationTest -server -mapType x.password.file -populate -client -mapType credentials
* @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username3 -Dpassword=password3 AuthorizationTest -server -mapType x.password.file -populate -client -mapType credentials -expectedGetException
* @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username5 -Dpassword=password5 AuthorizationTest -server -mapType x.password.file -populate -client -mapType credentials -expectedCreateException -expectedGetException -expectedSetException -expectedInvokeException
* @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username6 -Dpassword=password6 AuthorizationTest -server -mapType x.password.file -populate -client -mapType credentials -expectedCreateException -expectedGetException -expectedSetException -expectedInvokeException
* @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username1 -Dpassword=password1 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials
* @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username2 -Dpassword=password2 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedCreateException -expectedSetException -expectedInvokeException
* @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username3 -Dpassword=password3 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedCreateException -expectedGetException -expectedSetException -expectedInvokeException
* @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username4 -Dpassword=password4 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedGetException -expectedSetException
* @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username5 -Dpassword=password5 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedCreateException -expectedGetException -expectedSetException -expectedInvokeException
*/
import java.io.File;
import java.util.Map ;
import java.util.HashMap ;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory ;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import javax.management.Attribute ;
import javax.management.ObjectName ;
import jdk.testlibrary.ProcessTools;
import jdk.testlibrary.JDKToolFinder;
public class AuthorizationTest {
static final String SERVER_CLASS_NAME = "AuthorizationTest";
static final String CLIENT_CLASS_NAME = "AuthorizationTest$ClientSide";
static final String CLIENT_CLASS_MAIN = CLIENT_CLASS_NAME;
static final String USERNAME_PROPERTY = "username";
static final String PASSWORD_PROPERTY = "password";
private JMXConnectorServer cs;
/*
* First Debug properties and arguments are collect in expected
* map (argName, value) format, then calls original test's run method.
*/
public static void main(String args[]) throws Exception {
System.out.println("=================================================");
// Parses parameters
Utils.parseDebugProperties();
// Supported parameters list format is :
// "MainClass [-server <param-spec> ...] [-client <param-spec> ...]
// with <param-spec> either "-parami valuei" or "-parami"
HashMap<String, Object> serverMap = new HashMap<>() ;
int clientArgsIndex =
Utils.parseServerParameters(args, SERVER_CLASS_NAME, serverMap);
// Extract and records client params
String[] clientParams = null;
if (clientArgsIndex < args.length) {
int clientParamsSize = args.length - clientArgsIndex;
clientParams = new String[clientParamsSize];
System.arraycopy(args, clientArgsIndex, clientParams, 0, clientParamsSize);
} else {
clientParams = new String[0];
}
// Run test
AuthorizationTest test = new AuthorizationTest();
test.run(serverMap, clientParams);
}
/*
* Create the MBeansServer side of the test and returns its address
*/
private JMXServiceURL createServerSide(Map<String, Object> serverMap)
throws Exception {
final int NINETY_SECONDS = 90;
System.out.println("AuthorizationTest::createServerSide: Start") ;
MBeanServer mbs = MBeanServerFactory.newMBeanServer();
JMXServiceURL url = new JMXServiceURL("rmi", null, 0);
// Creates connection environment from server side params
HashMap<String, Object> env = new HashMap<>();
String value = null;
if ((value = (String)serverMap.get("-mapType")) != null) {
if (value.contains("x.access.file")) {
String accessFileStr = System.getProperty("test.src") +
File.separator + "access.properties";
env.put("jmx.remote.x.access.file", accessFileStr);
System.out.println("Added " + accessFileStr + " file as jmx.remote.x.access.file");
}
if (value.contains("x.password.file")) {
String passwordFileStr = System.getProperty("test.src") +
File.separator + "password.properties";
env.put("jmx.remote.x.password.file", passwordFileStr);
System.out.println("Added " + passwordFileStr + " file as jmx.remote.x.password.file");
}
}
if (serverMap.containsKey("-populate")) {
String populateClassName = "Simple";
ObjectName on =
new ObjectName("defaultDomain:class=Simple");
Utils.debug(Utils.DEBUG_STANDARD, "create and register Simple MBean") ;
mbs.createMBean(populateClassName, on);
}
cs = JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs);
cs.start();
Utils.waitReady(cs, NINETY_SECONDS);
JMXServiceURL addr = cs.getAddress();
System.out.println("AuthorizationTest::createServerSide: Done.") ;
return addr;
}
/*
* Creating command-line for running subprocess JVM:
*
* JVM command line is like:
* {test_jdk}/bin/java {defaultopts} -cp {test.class.path} {testopts} main
*
* {defaultopts} are the default java options set by the framework.
*
*/
private List<String> buildCommandLine(String args[]) {
List<String> opts = new ArrayList<>();
opts.add(JDKToolFinder.getJDKTool("java"));
opts.addAll(Arrays.asList(jdk.testlibrary.Utils.getTestJavaOpts()));
String usernameValue = System.getProperty(USERNAME_PROPERTY);
if (usernameValue != null) {
opts.add("-D" + USERNAME_PROPERTY + "=" + usernameValue);
}
String passwordValue = System.getProperty(PASSWORD_PROPERTY);
if (passwordValue != null) {
opts.add("-D" + PASSWORD_PROPERTY + "=" + passwordValue);
}
opts.add("-cp");
opts.add(System.getProperty("test.class.path", "test.class.path"));
opts.add(CLIENT_CLASS_MAIN);
opts.addAll(Arrays.asList(args));
return opts;
}
/**
* Runs AuthorizationTest$ClientSide with the passed options and redirects
* subprocess standard I/O to the current (parent) process. This provides a
* trace of what happens in the subprocess while it is runnning (and before
* it terminates).
*
* @param serviceUrlStr string representing the JMX service Url to connect to.
*/
private int runClientSide(String args[], String serviceUrlStr) throws Exception {
// Building command-line
List<String> opts = buildCommandLine(args);
opts.add("-serviceUrl");
opts.add(serviceUrlStr);
// Launch separate JVM subprocess
int exitCode = 0;
String[] optsArray = opts.toArray(new String[0]);
ProcessBuilder pb = new ProcessBuilder(optsArray);
Process p = ProcessTools.startProcess("AuthorizationTest$ClientSide", pb);
// Handling end of subprocess
try {
exitCode = p.waitFor();
if (exitCode != 0) {
System.out.println(
"Subprocess unexpected exit value of [" + exitCode +
"]. Expected 0.\n");
}
} catch (InterruptedException e) {
System.out.println("Parent process interrupted with exception : \n " + e + " :" );
// Parent thread unknown state, killing subprocess.
p.destroyForcibly();
throw new RuntimeException(
"Parent process interrupted with exception : \n " + e + " :" );
} finally {
if (p.isAlive()) {
p.destroyForcibly();
}
return exitCode;
}
}
public void run(Map<String, Object> serverArgs, String clientArgs[]) {
System.out.println("AuthorizationTest::run: Start") ;
int errorCount = 0;
try {
// Initialise the server side
JMXServiceURL urlToUse = createServerSide(serverArgs);
// Run client side
errorCount = runClientSide(clientArgs, urlToUse.toString());
if ( errorCount == 0 ) {
System.out.println("AuthorizationTest::run: Done without any error") ;
} else {
System.out.println("AuthorizationTest::run: Done with "
+ errorCount
+ " error(s)") ;
throw new RuntimeException("errorCount = " + errorCount);
}
cs.stop();
} catch(Exception e) {
throw new RuntimeException(e);
}
}
private static class ClientSide {
private JMXConnector cc = null;
private MBeanServerConnection mbsc = null;
public static void main(String args[]) throws Exception {
// Parses parameters
Utils.parseDebugProperties();
// Supported parameters list format is : "MainClass [-client <param-spec> ...]
// with <param-spec> either "-parami valuei" or "-parami"
HashMap<String, Object> clientMap = new HashMap<>() ;
Utils.parseClientParameters(args, CLIENT_CLASS_NAME, clientMap);
// Run test
ClientSide test = new ClientSide();
test.run(clientMap);
}
public void run(Map<String, Object> args) {
int errorCount = 0 ;
try {
boolean expectedCreateException =
(args.containsKey("-expectedCreateException")) ? true : false ;
boolean expectedGetException =
(args.containsKey("-expectedGetException")) ? true : false ;
boolean expectedSetException =
(args.containsKey("-expectedSetException")) ? true : false ;
boolean expectedInvokeException =
(args.containsKey("-expectedInvokeException")) ? true : false ;
// JSR262 (see bug 6440374)
// There is no special JSR262 protocol operation for connect.
// The first request sent initiate the connection.
// In the JSR262 current implementation, getDefaultDomain is sent to
// the server in order to get the server part of the connection ID.
// => the connection may fail if no access permission on get requests.
boolean expectedConnectException =
(args.containsKey("-expectedConnectException")) ? true : false ;
// Before connection,
// remove the element of the Map with null values (not supported by RMI)
// See bug 4982668
args.remove("-expectedCreateException");
args.remove("-expectedGetException");
args.remove("-expectedSetException");
args.remove("-expectedInvokeException");
args.remove("-expectedConnectException");
// Here do connect to the JMX Server
String username = System.getProperty("username");
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::run: CONNECT on behalf of \"" + username + "\"");
doConnect(args, expectedConnectException);
// If the connection did not fail, perform some requests.
// At this stage the mbeanserver connection is up and running
if (mbsc != null) {
ObjectName on = new ObjectName("defaultDomain:class=Simple");
// Create request
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::run: CREATE on behalf of \"" +
username + "\"");
errorCount += doCreateRequest(mbsc,
new ObjectName("defaultDomain:class=Simple,user=" + username),
expectedCreateException);
// Get request
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::run: GET on behalf of \"" +
username + "\"");
errorCount += doGetRequest(mbsc, on, expectedGetException);
// Set request
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::run: SET on behalf of \"" +
username + "\"");
errorCount += doSetRequest(mbsc, on, expectedSetException);
// Invoke request
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::run: INVOKE on behalf of \"" +
username + "\"");
errorCount += doInvokeRequest(mbsc, on, expectedInvokeException);
}
} catch(Exception e) {
Utils.printThrowable(e, true) ;
errorCount++;
} finally {
// Terminate the JMX Client
try {
cc.close();
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++;
}
}
System.out.println("ClientSide::run: Done") ;
// Handle result
if (errorCount == 0) {
System.out.println("ClientSide::run: (OK) authorization test succeeded.");
} else {
String message = "AuthorizationTest$ClientSide::run: (ERROR) " +
" authorization test failed with " +
errorCount + " error(s)";
System.out.println(message);
throw new RuntimeException(message);
}
}
protected void doConnect(Map<String, Object> args,
boolean expectedException) {
String msgTag = "ClientSide::doConnect";
boolean throwRuntimeException = false;
String message = "";
try {
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::doConnect: Connect the client");
// Collect connection environment
HashMap<String, Object> env = new HashMap<>();
Object value = args.get("-mapType");
if (value != null) {
String username = System.getProperty("username");
String password = System.getProperty("password");
Utils.debug(Utils.DEBUG_STANDARD,
msgTag + "add \"jmx.remote.credentials\" = \"" +
username + "\", \"" + password + "\"");
env.put("jmx.remote.credentials",
new String[] { username , password });
}
// Get a connection to remote mbean server
JMXServiceURL addr = new JMXServiceURL((String)args.get("-serviceUrl"));
cc = JMXConnectorFactory.connect(addr,env);
mbsc = cc.getMBeanServerConnection();
if (expectedException) {
message = "ClientSide::doConnect: (ERROR) " +
"Connect did not fail with expected SecurityException";
System.out.println(message);
throwRuntimeException = true;
} else {
System.out.println("ClientSide::doConnect: (OK) Connect succeed");
}
} catch(Exception e) {
Utils.printThrowable(e, true);
if (expectedException) {
if (e instanceof java.lang.SecurityException) {
System.out.println("ClientSide::doConnect: (OK) " +
"Connect failed with expected SecurityException");
} else {
message = "ClientSide::doConnect: (ERROR) " +
"Create failed with " + e.getClass() +
" instead of expected SecurityException";
System.out.println(message);
throwRuntimeException = true;
}
} else {
message = "ClientSide::doConnect: (ERROR) " +
"Connect failed";
System.out.println(message);
throwRuntimeException = true;
}
}
// If the connection failed, or if the connection succeeded but should not,
// no need to go further => throw RuntimeException and exit the test
if (throwRuntimeException) {
throw new RuntimeException(message);
}
}
protected int doCreateRequest(MBeanServerConnection mbsc,
ObjectName on,
boolean expectedException) {
int errorCount = 0;
try {
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::doCreateRequest: Create and register the MBean") ;
mbsc.createMBean("Simple", on) ;
if (expectedException) {
System.out.println("ClientSide::doCreateRequest: " +
"(ERROR) Create did not fail with expected SecurityException");
errorCount++;
} else {
System.out.println("ClientSide::doCreateRequest: (OK) Create succeed") ;
}
} catch(Exception e) {
Utils.printThrowable(e, true) ;
if (expectedException) {
if (e instanceof java.lang.SecurityException) {
System.out.println("ClientSide::doCreateRequest: " +
"(OK) Create failed with expected SecurityException") ;
} else {
System.out.println("ClientSide::doCreateRequest: " +
"(ERROR) Create failed with " +
e.getClass() + " instead of expected SecurityException");
errorCount++;
}
} else {
System.out.println("ClientSide::doCreateRequest: " +
"(ERROR) Create failed");
errorCount++;
}
}
return errorCount;
}
protected int doGetRequest(MBeanServerConnection mbsc,
ObjectName on,
boolean expectedException) {
int errorCount = 0;
try {
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::doGetRequest: Get attributes of the MBean") ;
mbsc.getAttribute(on, "Attribute");
if (expectedException) {
System.out.println("ClientSide::doGetRequest: " +
"(ERROR) Get did not fail with expected SecurityException");
errorCount++;
} else {
System.out.println("ClientSide::doGetRequest: (OK) Get succeed") ;
}
} catch(Exception e) {
Utils.printThrowable(e, true) ;
if (expectedException) {
if (e instanceof java.lang.SecurityException) {
System.out.println("ClientSide::doGetRequest: " +
"(OK) Get failed with expected SecurityException") ;
} else {
System.out.println("ClientSide::doGetRequest: " +
"(ERROR) Get failed with " +
e.getClass() + " instead of expected SecurityException");
errorCount++;
}
} else {
System.out.println("ClientSide::doGetRequest: (ERROR) Get failed");
errorCount++;
}
}
return errorCount;
}
protected int doSetRequest(MBeanServerConnection mbsc,
ObjectName on,
boolean expectedException) {
int errorCount = 0;
try {
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::doSetRequest: Set attributes of the MBean") ;
Attribute attribute = new Attribute("Attribute", "My value") ;
mbsc.setAttribute(on, attribute) ;
if (expectedException) {
System.out.println("ClientSide::doSetRequest: " +
"(ERROR) Set did not fail with expected SecurityException");
errorCount++;
} else {
System.out.println("ClientSide::doSetRequest: (OK) Set succeed") ;
}
} catch(Exception e) {
Utils.printThrowable(e, true) ;
if (expectedException) {
if (e instanceof java.lang.SecurityException) {
System.out.println("ClientSide::doSetRequest: " +
"(OK) Set failed with expected SecurityException") ;
} else {
System.out.println("ClientSide::doSetRequest: " +
"(ERROR) Set failed with " +
e.getClass() + " instead of expected SecurityException");
errorCount++;
}
} else {
System.out.println("ClientSide::doSetRequest: (ERROR) Set failed");
errorCount++;
}
}
return errorCount;
}
protected int doInvokeRequest(MBeanServerConnection mbsc,
ObjectName on,
boolean expectedException) {
int errorCount = 0;
try {
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::doInvokeRequest: Invoke operations on the MBean") ;
mbsc.invoke(on, "operation", null, null) ;
if (expectedException) {
System.out.println("ClientSide::doInvokeRequest: " +
"(ERROR) Invoke did not fail with expected SecurityException");
errorCount++;
} else {
System.out.println("ClientSide::doInvokeRequest: (OK) Invoke succeed") ;
}
} catch(Exception e) {
Utils.printThrowable(e, true) ;
if (expectedException) {
if (e instanceof java.lang.SecurityException) {
System.out.println("ClientSide::doInvokeRequest: " +
"(OK) Invoke failed with expected SecurityException") ;
} else {
System.out.println("ClientSide::doInvokeRequest: " +
" (ERROR) Invoke failed with " +
e.getClass() + " instead of expected SecurityException");
errorCount++;
}
} else {
System.out.println("ClientSide::doInvokeRequest: " +
"(ERROR) Invoke failed");
errorCount++;
}
}
return errorCount;
}
}
}
/*
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.security.AccessControlContext;
import java.security.AccessController;
import javax.security.auth.Subject;
import java.security.Principal;
import java.util.Iterator;
import java.util.Set;
import javax.management.MBeanRegistration ;
import javax.management.MBeanServer ;
import javax.management.ObjectName ;
import javax.management.NotificationBroadcasterSupport;
import javax.management.NotificationListener;
import javax.management.Notification;
public class MBS_Light extends NotificationBroadcasterSupport
implements MBS_LightMBean, MBeanRegistration, NotificationListener
{
private RjmxMBeanParameter param = null ;
private String aString = "notset" ;
private int anInt = 0 ;
private MBeanServer mbs = null ;
private ObjectName objname = null ;
private Exception anException = null ;
private Error anError = null ;
private int count = 0;
private SimpleListener listener = new SimpleListener();
@SqeDescriptorKey("NO PARAMETER CONSTRUCTOR MBS_Light")
public MBS_Light() {
}
@SqeDescriptorKey("ONE RjmxMBeanParameter PARAMETER CONSTRUCTOR MBS_Light")
public MBS_Light(@SqeDescriptorKey("CONSTRUCTOR PARAMETER param")
RjmxMBeanParameter param) {
this.param = param ;
}
@SqeDescriptorKey("ONE String PARAMETER CONSTRUCTOR MBS_Light")
public MBS_Light(@SqeDescriptorKey("CONSTRUCTOR PARAMETER param")String param) {
this.aString = param ;
}
// Getter for property param
public RjmxMBeanParameter getParam() {
return this.param ;
}
// Setter for property param
public void setParam(RjmxMBeanParameter param) {
this.param = param ;
}
// Getter for property aString
public String getAstring() {
return this.aString ;
}
// Setter for property aString
public void setAstring(String aString) {
this.aString = aString ;
}
// Getter for property anInt
public int getAnInt() {
return this.anInt ;
}
// Setter for property anInt
public void setAnInt(int anInt) {
this.anInt = anInt ;
}
// Getter for property anException
public Exception getAnException() {
return this.anException ;
}
// Setter for property anException
public void setAnException(Exception anException) {
this.anException = anException ;
}
// Getter for property anError
public Error getAnError() {
return this.anError ;
}
// Setter for property anError
public void setAnError(Error anError) {
this.anError = anError ;
}
// An operation
public RjmxMBeanParameter operate1(String name) {
return new RjmxMBeanParameter(name) ;
}
// An operation
public String operate2(RjmxMBeanParameter param) {
return param.name ;
}
// An operation
public void throwError() {
throw new Error("JSR-160-ERROR");
}
// An operation
public void throwException() throws Exception {
throw new Exception("JSR-160-EXCEPTION");
}
// MBeanRegistration method
public void postDeregister() {
}
// MBeanRegistration method
public void postRegister(Boolean registrationDone) {
}
// MBeanRegistration method
public void preDeregister()
throws Exception
{
}
// MBeanRegistration method
public ObjectName preRegister(MBeanServer server, ObjectName name)
throws Exception
{
this.mbs = server ;
if ( name == null ) {
this.objname = new ObjectName("protocol:class=MBS_Light") ;
}
else {
this.objname = name ;
}
return this.objname ;
}
public synchronized void handleNotification(Notification notification,
Object handback) {
Utils.debug(Utils.DEBUG_STANDARD,
"MBS_Light::handleNotification: " + notification);
listener.handleNotification(notification, handback);
}
// Send a notification
public void sendNotification() {
Notification notification =
new Notification("JSR160-TCK-NOTIFICATION", this, count++);
sendNotification(notification);
}
public Object waitForNotificationHB() {
return listener.waitForNotificationHB();
}
// Receive multi notifications and send back handbacks
public synchronized Object[] waitForMultiNotifications(String nb) {
return listener.waitForMultiNotifications(Integer.valueOf(nb).intValue());
}
// Receive a notification
public synchronized String waitForNotification() {
return listener.waitForNotification();
}
// Is the notification received
public synchronized Boolean notificationReceived() {
return Boolean.valueOf(listener.isNotificationReceived());
}
// The authorization Id
public String getAuthorizationId() {
AccessControlContext acc = AccessController.getContext();
Subject subject = Subject.getSubject(acc);
Set<Principal> principals = subject.getPrincipals();
Iterator<Principal> i = principals.iterator();
StringBuffer buffer = new StringBuffer();
while(i.hasNext()) {
Principal p = i.next();
buffer.append(p.getName());
if(i.hasNext())
buffer.append(" ");
}
return buffer.toString();
}
}
/*
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
@SqeDescriptorKey("INTERFACE MBS_LightMBean")
public interface MBS_LightMBean {
// Getter for property param
@SqeDescriptorKey("ATTRIBUTE Param")
public RjmxMBeanParameter getParam() ;
// Setter for property param
@SqeDescriptorKey("ATTRIBUTE Param")
public void setParam(RjmxMBeanParameter param) ;
// Getter for property aString
@SqeDescriptorKey("ATTRIBUTE Astring")
public String getAstring() ;
// Setter for property aString
@SqeDescriptorKey("ATTRIBUTE Astring")
public void setAstring(String aString) ;
// Getter for property anInt
@SqeDescriptorKey("ATTRIBUTE AnInt")
public int getAnInt() ;
// Setter for property anInt
@SqeDescriptorKey("ATTRIBUTE AnInt")
public void setAnInt(int anInt) ;
// Getter for property anException
@SqeDescriptorKey("ATTRIBUTE AnException")
public Exception getAnException() ;
// Setter for property anException
@SqeDescriptorKey("ATTRIBUTE AnException")
public void setAnException(Exception anException) ;
// Getter for property anError
@SqeDescriptorKey("ATTRIBUTE AnError")
public Error getAnError() ;
// Setter for property anError
@SqeDescriptorKey("ATTRIBUTE AnError")
public void setAnError(Error anError) ;
// An operation
@SqeDescriptorKey("OPERATION operate1")
public RjmxMBeanParameter operate1(
@SqeDescriptorKey("OPERATION PARAMETER name")String name) ;
// An operation
@SqeDescriptorKey("OPERATION operate2")
public String operate2(
@SqeDescriptorKey("OPERATION PARAMETER param")RjmxMBeanParameter param) ;
// Throws an error
@SqeDescriptorKey("OPERATION throwError")
public void throwError();
// Throws an exception
@SqeDescriptorKey("OPERATION throwException")
public void throwException() throws Exception;
// Send a notification
@SqeDescriptorKey("OPERATION sendNotification")
public void sendNotification();
// Receive a notification and return the type
@SqeDescriptorKey("OPERATION waitForNotification")
public String waitForNotification();
// Receive a notification and return the HandBack
@SqeDescriptorKey("OPERATION waitForNotificationHB")
public Object waitForNotificationHB();
// Receive multi notifications and return the HandBacks
@SqeDescriptorKey("OPERATION waitForMultiNotifications")
public Object[] waitForMultiNotifications(
@SqeDescriptorKey("OPERATION PARAMETER nb")String nb);
// Is the notification received
@SqeDescriptorKey("OPERATION notificationReceived")
public Boolean notificationReceived();
// Return the current authorization Id
@SqeDescriptorKey("OPERATION getAuthorizationId")
public String getAuthorizationId();
}
/*
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.io.Serializable ;
/**
* That class is used to modelize a parameter to be used as MBean property
* value or MBean operation parameter or returned value.
*/
public class RjmxMBeanParameter implements Serializable {
public String name = "unset" ;
public RjmxMBeanParameter() {
}
public RjmxMBeanParameter(String name) {
this.name = name ;
}
public boolean equals(Object obj) {
if ( this.name.equals(((RjmxMBeanParameter)obj).name) ) {
return true ;
} else {
return false ;
}
}
}
/*
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8058865
* @summary Checks various secure ways of connecting from remote jmx client
* @author Olivier Lagneau
* @modules java.management
* @library /lib/testlibrary
* @compile MBS_Light.java ServerDelegate.java TestSampleLoginModule.java
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dusername=SQE_username -Dpassword=SQE_password SecurityTest -server -mapType x.password.file -client -mapType credentials
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dusername=UNKNOWN_username -Dpassword=SQE_password SecurityTest -server -mapType x.password.file -client -mapType credentials -expectedThrowable java.lang.SecurityException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dusername=SQE_username -Dpassword=WRONG_password SecurityTest -server -mapType x.password.file -client -mapType credentials -expectedThrowable java.lang.SecurityException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dsusername=TestJMXAuthenticatorUsername -Dspassword=TestJMXAuthenticatorPassword -Dusername=TestJMXAuthenticatorUsername -Dpassword=TestJMXAuthenticatorPassword SecurityTest -server -mapType x.authenticator -client -mapType credentials
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dsusername=TestJMXAuthenticatorUsername -Dspassword=TestJMXAuthenticatorPassword -Dusername=AnotherTestJMXAuthenticatorUsername -Dpassword=TestJMXAuthenticatorPassword SecurityTest -server -mapType x.authenticator -client -mapType credentials -expectedThrowable java.lang.SecurityException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dlogin.config.file=${test.src}/login.config -Dpassword.file=password.properties -Dusername=usernameFileLoginModule -Dpassword=passwordFileLoginModule SecurityTest -server -mapType x.login.config.PasswordFileAuthentication -client -mapType credentials
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dlogin.config.file=${test.src}/login.config.UNKNOWN -Dpassword.file=password.properties -Dusername=usernameFileLoginModule -Dpassword=passwordFileLoginModule SecurityTest -server -mapType x.login.config.PasswordFileAuthentication -client -mapType credentialss -expectedThrowable java.lang.SecurityException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dlogin.config.file=${test.src}/login.config -Dpassword.file=password.properties -Dusername=usernameFileLoginModule -Dpassword=passwordFileLoginModule SecurityTest -server -mapType x.login.config.UnknownAuthentication -client -mapType credentials -expectedThrowable java.lang.SecurityException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dlogin.config.file=${test.src}/login.config -Dsusername=usernameSampleLoginModule -Dspassword=passwordSampleLoginModule -Dpassword.file=password.properties -Dusername=usernameSampleLoginModule -Dpassword=passwordSampleLoginModule SecurityTest -server -mapType x.login.config.SampleLoginModule -client -mapType credentials
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dlogin.config.file=${test.src}/login.config -Dsusername=usernameSampleLoginModule -Dspassword=passwordSampleLoginModule -Dpassword.file=password.properties -Dusername=AnotherUsernameSampleLoginModule -Dpassword=passwordSampleLoginModule SecurityTest -server -mapType x.login.config.SampleLoginModule -client -mapType credentials -expectedThrowable java.lang.SecurityException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD SecurityTest -server -mapType rmi.client.socket.factory.ssl;rmi.server.socket.factory.ssl -keystore keystoreAgent -keystorepassword glopglop -client -truststore truststoreClient -truststorepassword glopglop
* @run main/othervm/timeout=300 -DDEBUG_STANDARD SecurityTest -server -mapType rmi.client.socket.factory.ssl;rmi.server.socket.factory.ssl -keystore keystoreAgent -keystorepassword glopglop -client -truststore truststoreClient -truststorepassword WRONG_password -expectedThrowable java.io.IOException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD SecurityTest -server -mapType rmi.server.socket.factory.ssl -keystore keystoreAgent -keystorepassword glopglop -client -truststore truststoreClient -truststorepassword glopglop -expectedThrowable java.io.IOException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD SecurityTest -server -mapType rmi.client.socket.factory.ssl -keystore keystoreAgent -keystorepassword glopglop -client -truststore truststoreClient -truststorepassword glopglop -expectedThrowable java.io.IOException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD SecurityTest -server -mapType rmi.client.socket.factory.ssl;rmi.server.socket.factory.ssl -keystore keystoreAgent -keystorepassword glopglop -client -expectedThrowable java.io.IOException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD SecurityTest -server -mapType rmi.client.socket.factory.ssl;rmi.server.socket.factory.ssl.need.client.authentication -keystore keystoreAgent -keystorepassword glopglop -truststore truststoreAgent -truststorepassword glopglop -client -keystore keystoreClient -keystorepassword glopglop -truststore truststoreClient -truststorepassword glopglop
* @run main/othervm/timeout=300 -DDEBUG_STANDARD SecurityTest -server -mapType rmi.client.socket.factory.ssl;rmi.server.socket.factory.ssl.need.client.authentication -keystore keystoreAgent -keystorepassword glopglop -truststore truststoreAgent -truststorepassword glopglop -client -keystore keystoreClient -keystorepassword WRONG_password -truststore truststoreClient -truststorepassword glopglop -expectedThrowable java.io.IOException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD SecurityTest -server -mapType rmi.client.socket.factory.ssl;rmi.server.socket.factory.ssl.need.client.authentication -keystore keystoreAgent -keystorepassword glopglop -truststore truststoreAgent -truststorepassword glopglop -client -truststore truststoreClient -truststorepassword glopglop -expectedThrowable java.io.IOException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD SecurityTest -server -mapType rmi.client.socket.factory.ssl;rmi.server.socket.factory.ssl.need.client.authentication -keystore keystoreAgent -keystorepassword glopglop -client -keystore keystoreClient -keystorepassword glopglop -truststore truststoreClient -truststorepassword glopglop -expectedThrowable java.io.IOException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Djavax.rmi.ssl.client.enabledCipherSuites=SSL_RSA_WITH_RC4_128_MD5 SecurityTest -server -mapType rmi.client.socket.factory.ssl;rmi.server.socket.factory.ssl.enabled.cipher.suites.md5 -keystore keystoreAgent -keystorepassword glopglop -client -truststore truststoreClient -truststorepassword glopglop
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Djavax.rmi.ssl.client.enabledCipherSuites=SSL_RSA_WITH_RC4_128_SHA SecurityTest -server -mapType rmi.client.socket.factory.ssl;rmi.server.socket.factory.ssl.enabled.cipher.suites.md5 -keystore keystoreAgent -keystorepassword glopglop -client -truststore truststoreClient -truststorepassword glopglop -expectedThrowable java.io.IOException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Djavax.rmi.ssl.client.enabledCipherSuites=SSL_RSA_WITH_RC4_128_MD5 SecurityTest -server -mapType rmi.client.socket.factory.ssl;rmi.server.socket.factory.ssl.enabled.cipher.suites.sha -keystore keystoreAgent -keystorepassword glopglop -client -truststore truststoreClient -truststorepassword glopglop -expectedThrowable java.io.IOException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Djavax.rmi.ssl.client.enabledProtocols=SSLv3 SecurityTest -server -mapType rmi.client.socket.factory.ssl;rmi.server.socket.factory.ssl.enabled.protocols.sslv3 -keystore keystoreAgent -keystorepassword glopglop -client -truststore truststoreClient -truststorepassword glopglop
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Djavax.rmi.ssl.client.enabledProtocols=TLSv1 SecurityTest -server -mapType rmi.client.socket.factory.ssl;rmi.server.socket.factory.ssl.enabled.protocols.sslv3 -keystore keystoreAgent -keystorepassword glopglop -client -truststore truststoreClient -truststorepassword glopglop -expectedThrowable java.io.IOException
* @run main/othervm/timeout=300 -DDEBUG_STANDARD -Djavax.rmi.ssl.client.enabledProtocols=SSLv3 SecurityTest -server -mapType rmi.client.socket.factory.ssl;rmi.server.socket.factory.ssl.enabled.protocols.tlsv1 -keystore keystoreAgent -keystorepassword glopglop -client -truststore truststoreClient -truststorepassword glopglop -expectedThrowable java.io.IOException
*/
import java.io.File;
import java.util.Map ;
import java.util.HashMap ;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory ;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import javax.management.Attribute ;
import javax.management.ObjectName ;
import javax.rmi.ssl.SslRMIClientSocketFactory;
import javax.rmi.ssl.SslRMIServerSocketFactory;
import java.security.Security;
import jdk.testlibrary.ProcessTools;
import jdk.testlibrary.JDKToolFinder;
public class SecurityTest {
static final String SERVER_CLASS_NAME = "SecurityTest";
static final String CLIENT_CLASS_NAME = "SecurityTest$ClientSide";
static final String CLIENT_CLASS_MAIN = CLIENT_CLASS_NAME;
static final String USERNAME_PROPERTY = "username";
static final String PASSWORD_PROPERTY = "password";
static final String SERVER_DELEGATE_MBEAN_NAME =
"defaultDomain:class=ServerDelegate";
static final String RMI_SERVER_SOCKET_FACTORY_SSL = "rmi.server.socket.factory.ssl";
static final String RMI_CLIENT_SOCKET_FACTORY_SSL = "rmi.client.socket.factory.ssl";
static final String KEYSTORE_PROPNAME = "javax.net.ssl.keyStore";
static final String KEYSTORE_PWD_PROPNAME = "javax.net.ssl.keyStorePassword";
static final String TRUSTSTORE_PROPNAME = "javax.net.ssl.trustStore";
static final String TRUSTSTORE_PWD_PROPNAME = "javax.net.ssl.trustStorePassword";
static final String RMI_SSL_CLIENT_ENABLEDCIPHERSUITES =
"javax.rmi.ssl.client.enabledCipherSuites";
static final String RMI_SSL_CLIENT_ENABLEDPROTOCOLS =
"javax.rmi.ssl.client.enabledProtocols";
private JMXConnectorServer cs;
// Construct and set keyStore properties from given map
static void setKeyStoreProperties(Map<String, Object> map) {
String keyStore = (String) map.get("-keystore");
keyStore = buildSourcePath(keyStore);
System.setProperty(KEYSTORE_PROPNAME, keyStore);
System.out.println("keyStore location = \"" + keyStore + "\"");
String password = (String) map.get("-keystorepassword");
System.setProperty(KEYSTORE_PWD_PROPNAME, password);
System.out.println("keyStore password = " + password);
}
// Construct and set trustStore properties from given map
static void setTrustStoreProperties(Map<String, Object> map) {
String trustStore = (String) map.get("-truststore");
trustStore = buildSourcePath(trustStore);
System.setProperty(TRUSTSTORE_PROPNAME, trustStore);
System.out.println("trustStore location = \"" + trustStore + "\"");
String password = (String) map.get("-truststorepassword");
System.setProperty(TRUSTSTORE_PWD_PROPNAME, password);
System.out.println("trustStore password = " + password);
}
/*
* First Debug properties and arguments are collect in expected
* map (argName, value) format, then calls original test's run method.
*/
public static void main(String args[]) throws Exception {
System.out.println("=================================================");
// Parses parameters
Utils.parseDebugProperties();
// Supported parameters list format is :
// "MainClass [-server <param-spec> ...] [-client <param-spec> ...]
// with <param-spec> either "-parami valuei" or "-parami"
HashMap<String, Object> serverMap = new HashMap<>() ;
int clientArgsIndex =
Utils.parseServerParameters(args, SERVER_CLASS_NAME, serverMap);
// Extract and records client params
String[] clientParams = null;
if (clientArgsIndex < args.length) {
int clientParamsSize = args.length - clientArgsIndex;
clientParams = new String[clientParamsSize];
System.arraycopy(args, clientArgsIndex, clientParams, 0, clientParamsSize);
} else {
clientParams = new String[0];
}
// Run test
SecurityTest test = new SecurityTest();
test.run(serverMap, clientParams);
}
// Return full path of filename in the test sopurce directory
private static String buildSourcePath(String filename) {
return System.getProperty("test.src") + File.separator + filename;
}
/*
* Collects security run params for server side.
*/
private HashMap<String, Object> setServerSecurityEnv(Map<String, Object> map)
throws Exception {
// Creates Authentication environment from server side params
HashMap<String, Object> env = new HashMap<>();
// Retrieve and set keystore and truststore config if any
if (map.containsKey("-keystore") &&
map.get("-keystore") != null) {
setKeyStoreProperties(map);
}
System.out.println("Done keystore properties");
if (map.containsKey("-truststore") &&
map.get("-truststore") != null) {
setTrustStoreProperties(map);
}
System.out.println("Done truststore properties");
String value = null;
if ((value = (String)map.get("-mapType")) != null) {
// Case of remote password file with all authorized credentials
if (value.contains("x.password.file")) {
String passwordFileStr = buildSourcePath("password.properties");
env.put("jmx.remote.x.password.file", passwordFileStr);
System.out.println("Added " + passwordFileStr +
" file as jmx.remote.x.password.file");
}
// Case of dedicated authenticator class : TestJMXAuthenticator
if (value.contains("x.authenticator")) {
env.put("jmx.remote.authenticator", new TestJMXAuthenticator()) ;
System.out.println(
"Added \"jmx.remote.authenticator\" = TestJMXAuthenticator");
}
// Case of security config file with standard Authentication
if (value.contains("x.login.config.PasswordFileAuthentication")) {
String loginConfig = System.getProperty("login.config.file");
// Override the default JAAS configuration
System.setProperty("java.security.auth.login.config",
"file:" + loginConfig);
System.out.println("Overrided default JAAS configuration with " +
"\"java.security.auth.login.config\" = \"" + loginConfig + "\"") ;
env.put("jmx.remote.x.login.config", "PasswordFileAuthentication") ;
System.out.println(
"Added \"jmx.remote.x.login.config\" = " +
"\"PasswordFileAuthentication\"") ;
// redirects "password.file" property to file in ${test.src}
String passwordFileStr =
buildSourcePath(System.getProperty("password.file"));
System.setProperty("password.file", passwordFileStr);
System.out.println(
"Redirected \"password.file\" property value to = " +
passwordFileStr) ;
}
// Case of security config file with unexisting athentication config
if (value.contains("x.login.config.UnknownAuthentication")) {
String loginConfig = System.getProperty("login.config.file");
// Override the default JAAS configuration
System.setProperty("java.security.auth.login.config",
"file:" + loginConfig);
System.out.println("Overrided default JAAS configuration with " +
"\"java.security.auth.login.config\" = \"" + loginConfig + "\"") ;
env.put("jmx.remote.x.login.config", "UnknownAuthentication") ;
System.out.println(
"Added \"jmx.remote.x.login.config\" = " +
"\"UnknownAuthentication\"") ;
// redirects "password.file" property to file in ${test.src}
String passwordFileStr =
buildSourcePath(System.getProperty("password.file"));
System.setProperty("password.file", passwordFileStr);
System.out.println(
"Redirected \"password.file\" property value to = " +
passwordFileStr) ;
}
// Case of security config file with dedicated login module
if (value.contains("x.login.config.SampleLoginModule")) {
String loginConfig = System.getProperty("login.config.file");
// Override the default JAAS configuration
System.setProperty("java.security.auth.login.config",
"file:" + loginConfig);
System.out.println("Overrided default JAAS configuration with " +
"\"java.security.auth.login.config\" = \"" + loginConfig + "\"") ;
env.put("jmx.remote.x.login.config", "SampleLoginModule") ;
System.out.println(
"Added \"jmx.remote.x.login.config\" = " +
"\"SampleLoginModule\"") ;
}
// Simple rmi ssl authentication
if (value.contains(RMI_CLIENT_SOCKET_FACTORY_SSL)) {
env.put("jmx.remote.rmi.client.socket.factory",
new SslRMIClientSocketFactory()) ;
System.out.println(
"Added \"jmx.remote.rmi.client.socket.factory\"" +
" = SslRMIClientSocketFactory") ;
}
if (value.contains(RMI_SERVER_SOCKET_FACTORY_SSL)) {
if (value.contains(
"rmi.server.socket.factory.ssl.need.client.authentication")) {
// rmi ssl authentication with client authentication
env.put("jmx.remote.rmi.server.socket.factory",
new SslRMIServerSocketFactory(null, null, true)) ;
System.out.println(
"Added \"jmx.remote.rmi.server.socket.factory\"" +
" = SslRMIServerSocketFactory with client authentication") ;
} else if (value.contains("rmi.server.socket.factory.ssl.enabled.cipher.suites.md5")) {
// Allows all ciphering and protocols for testing purpose
Security.setProperty("jdk.tls.disabledAlgorithms", "");
env.put("jmx.remote.rmi.server.socket.factory",
new SslRMIServerSocketFactory(
new String[] {"SSL_RSA_WITH_RC4_128_MD5"}, null, false));
System.out.println(
"Added \"jmx.remote.rmi.server.socket.factory\"" +
" = SslRMIServerSocketFactory with SSL_RSA_WITH_RC4_128_MD5 cipher suite");
} else if (value.contains("rmi.server.socket.factory.ssl.enabled.cipher.suites.sha")) {
// Allows all ciphering and protocols for testing purpose
Security.setProperty("jdk.tls.disabledAlgorithms", "");
env.put("jmx.remote.rmi.server.socket.factory",
new SslRMIServerSocketFactory(
new String[] { "SSL_RSA_WITH_RC4_128_SHA" }, null, false)) ;
System.out.println(
"Added \"jmx.remote.rmi.server.socket.factory\"" +
" = SslRMIServerSocketFactory with SSL_RSA_WITH_RC4_128_SHA cipher suite") ;
} else if (value.contains("rmi.server.socket.factory.ssl.enabled.protocols.sslv3")) {
// Allows all ciphering and protocols for testing purpose
Security.setProperty("jdk.tls.disabledAlgorithms", "");
env.put("jmx.remote.rmi.server.socket.factory",
new SslRMIServerSocketFactory(null, new String[] {"SSLv3"}, false)) ;
System.out.println(
"Added \"jmx.remote.rmi.server.socket.factory\"" +
" = SslRMIServerSocketFactory with SSLv3 protocol") ;
} else if (value.contains("rmi.server.socket.factory.ssl.enabled.protocols.tlsv1")) {
// Allows all ciphering and protocols for testing purpose
Security.setProperty("jdk.tls.disabledAlgorithms", "");
env.put("jmx.remote.rmi.server.socket.factory",
new SslRMIServerSocketFactory(null, new String[] {"TLSv1"}, false)) ;
System.out.println(
"Added \"jmx.remote.rmi.server.socket.factory\"" +
" = SslRMIServerSocketFactory with TLSv1 protocol") ;
} else {
env.put("jmx.remote.rmi.server.socket.factory",
new SslRMIServerSocketFactory());
System.out.println(
"Added \"jmx.remote.rmi.server.socket.factory\"" +
" = SslRMIServerSocketFactory");
}
}
}
return env;
}
/*
* Create the MBeansServer side of the test and returns its address
*/
private JMXServiceURL createServerSide(Map<String, Object> serverMap)
throws Exception {
final int NINETY_SECONDS = 90;
System.out.println("SecurityTest::createServerSide: Start") ;
// Prepare server side security env
HashMap<String, Object> env = setServerSecurityEnv(serverMap);
// Create and start mbean server and connector server
MBeanServer mbs = MBeanServerFactory.newMBeanServer();
JMXServiceURL url = new JMXServiceURL("rmi", null, 0);
cs = JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs);
cs.start();
// Waits availibility of connector server
Utils.waitReady(cs, NINETY_SECONDS);
JMXServiceURL addr = cs.getAddress();
System.out.println("SecurityTest::createServerSide: Done.") ;
return addr;
}
/*
* Creating command-line for running subprocess JVM:
*
* JVM command line is like:
* {test_jdk}/bin/java {defaultopts} -cp {test.class.path} {testopts} main
*
* {defaultopts} are the default java options set by the framework.
*
*/
private List<String> buildCommandLine(String args[]) {
System.out.println("SecurityTest::buildCommandLine: Start") ;
List<String> opts = new ArrayList<>();
opts.add(JDKToolFinder.getJDKTool("java"));
opts.addAll(Arrays.asList(jdk.testlibrary.Utils.getTestJavaOpts()));
// We need to forward some properties to the client side
opts.add("-Dtest.src=" + System.getProperty("test.src"));
String usernameValue = System.getProperty(USERNAME_PROPERTY);
if (usernameValue != null) {
System.out.println("SecurityTest::buildCommandLine: "+
" forward username property to client side");
opts.add("-D" + USERNAME_PROPERTY + "=" + usernameValue);
}
String passwordValue = System.getProperty(PASSWORD_PROPERTY);
if (passwordValue != null) {
System.out.println("SecurityTest::buildCommandLine: "+
" forward password property to client side");
opts.add("-D" + PASSWORD_PROPERTY + "=" + passwordValue);
}
String enabledCipherSuites =
System.getProperty(RMI_SSL_CLIENT_ENABLEDCIPHERSUITES);
if (enabledCipherSuites != null) {
System.out.println("SecurityTest::buildCommandLine: "+
" forward enabledCipherSuites property to client side");
opts.add("-D" + RMI_SSL_CLIENT_ENABLEDCIPHERSUITES +
"=" + enabledCipherSuites);
}
String enabledProtocols =
System.getProperty(RMI_SSL_CLIENT_ENABLEDPROTOCOLS);
if (enabledProtocols != null) {
System.out.println("SecurityTest::buildCommandLine: "+
" forward enabledProtocols property to client side");
opts.add("-D" + RMI_SSL_CLIENT_ENABLEDPROTOCOLS +
"=" + enabledProtocols);
}
opts.add("-cp");
opts.add(System.getProperty("test.class.path", "test.class.path"));
opts.add(CLIENT_CLASS_MAIN);
opts.addAll(Arrays.asList(args));
System.out.println("SecurityTest::buildCommandLine: Done.") ;
return opts;
}
/**
* Runs SecurityTest$ClientSide with the passed options and redirects
* subprocess standard I/O to the current (parent) process. This provides a
* trace of what happens in the subprocess while it is runnning (and before
* it terminates).
*
* @param serviceUrlStr string representing the JMX service Url to connect to.
*/
private int runClientSide(String args[], String serviceUrlStr) throws Exception {
System.out.println("SecurityTest::runClientSide: Start") ;
// Building command-line
List<String> opts = buildCommandLine(args);
opts.add("-serviceUrl");
opts.add(serviceUrlStr);
// Launch separate JVM subprocess
int exitCode = 0;
String[] optsArray = opts.toArray(new String[0]);
ProcessBuilder pb = new ProcessBuilder(optsArray);
Process p = ProcessTools.startProcess("SecurityTest$ClientSide", pb);
// Handling end of subprocess
try {
exitCode = p.waitFor();
if (exitCode != 0) {
System.out.println(
"Subprocess unexpected exit value of [" + exitCode +
"]. Expected 0.\n");
}
} catch (InterruptedException e) {
System.out.println("Parent process interrupted with exception : \n " + e + " :" );
// Parent thread unknown state, killing subprocess.
p.destroyForcibly();
throw new RuntimeException(
"Parent process interrupted with exception : \n " + e + " :" );
} finally {
if (p.isAlive()) {
p.destroyForcibly();
}
System.out.println("SecurityTest::runClientSide: Done") ;
return exitCode;
}
}
public void run(Map<String, Object> serverArgs, String clientArgs[]) {
System.out.println("SecurityTest::run: Start") ;
int errorCount = 0;
try {
// Initialise the server side
JMXServiceURL urlToUse = createServerSide(serverArgs);
// Run client side
errorCount = runClientSide(clientArgs, urlToUse.toString());
if ( errorCount == 0 ) {
System.out.println("SecurityTest::run: Done without any error") ;
} else {
System.out.println(
"SecurityTest::run: Done with " + errorCount + " error(s)");
throw new RuntimeException("errorCount = " + errorCount);
}
cs.stop();
} catch(Exception e) {
throw new RuntimeException(e);
}
}
private static class ClientSide {
private JMXConnector cc = null;
private MBeanServerConnection mbsc = null;
public static void main(String args[]) throws Exception {
// Parses parameters
Utils.parseDebugProperties();
// Supported parameters list format is : "MainClass [-client <param-spec> ...]
// with <param-spec> either "-parami valuei" or "-parami"
HashMap<String, Object> clientMap = new HashMap<>() ;
Utils.parseClientParameters(args, CLIENT_CLASS_NAME, clientMap);
// Run test
ClientSide test = new ClientSide();
test.run(clientMap);
}
public void run(Map<String, Object> args) {
System.out.println("ClientSide::run: Start");
int errorCount = 0;
try {
// Setup client side parameters
HashMap<String, Object> env = new HashMap<>();
// If needed allows all ciphering and protocols for testing purpose
if (System.getProperty(RMI_SSL_CLIENT_ENABLEDCIPHERSUITES) != null) {
Security.setProperty("jdk.tls.disabledAlgorithms", "");
}
// If needed allows all ciphering and protocols for testing purpose
if (System.getProperty(RMI_SSL_CLIENT_ENABLEDPROTOCOLS) != null) {
Security.setProperty("jdk.tls.disabledAlgorithms", "");
}
// Retrieve and set keystore and truststore config if any
if (args.containsKey("-keystore") &&
args.get("-keystore") != null) {
SecurityTest.setKeyStoreProperties(args);
}
if (args.containsKey("-truststore") &&
args.get("-truststore") != null) {
SecurityTest.setTrustStoreProperties(args);
}
Object value = args.get("-mapType");
if ((value != null) &&
value.equals("credentials")) {
String username = System.getProperty("username");
String password = System.getProperty("password");
Utils.debug(Utils.DEBUG_STANDARD,
"add \"jmx.remote.credentials\" = \"" +
username + "\", \"" + password + "\"");
env.put("jmx.remote.credentials",
new String[] { username , password });
}
String expectedThrowable = (String) args.get("-expectedThrowable");
String authCallCountName = "-expectedAuthenticatorCallCount";
int authCallCountValue = 0;
if (args.containsKey(authCallCountName)) {
authCallCountValue =
(new Integer((String) args.get(authCallCountName))).intValue();
}
try {
// Get a connection to remote mbean server
JMXServiceURL addr = new JMXServiceURL((String)args.get("-serviceUrl"));
cc = JMXConnectorFactory.connect(addr,env);
mbsc = cc.getMBeanServerConnection();
// In case we should have got an exception
if (expectedThrowable != null) {
System.out.println("ClientSide::run: (ERROR) " +
" Connect did not fail with expected " + expectedThrowable);
errorCount++;
} else {
System.out.println("ClientSide::run: (OK) Connect succeed");
}
} catch (Throwable e) {
Utils.printThrowable(e, true);
if (expectedThrowable != null) {
if (Utils.compareThrowable(e, expectedThrowable)) {
System.out.println("ClientSide::run: (OK) " +
"Connect failed with expected " + expectedThrowable);
} else {
System.out.println("ClientSide::run: (ERROR) Connect failed with " +
e.getClass() + " instead of expected " +
expectedThrowable);
errorCount++;
}
} else {
System.out.println("ClientSide::run: (ERROR) " +
"Connect failed with exception");
errorCount++;
}
}
// Depending on the client state,
// perform some requests
if (mbsc != null && errorCount == 0) {
// Perform some little JMX requests
System.out.println("ClientSide::run: Start sending requests");
doRequests();
// In case authentication has been used we check how it did.
if (authCallCountValue != 0) {
errorCount += checkAuthenticator(mbsc, authCallCountValue);
}
}
} catch (Exception e) {
Utils.printThrowable(e, true);
errorCount++;
} finally {
// Terminate the JMX Client if any
if (cc != null) {
try {
cc.close();
} catch (Exception e) {
Utils.printThrowable(e, true) ;
errorCount++;
}
}
}
System.out.println("ClientSide::run: Done");
// Handle result
if (errorCount != 0) {
throw new RuntimeException();
}
}
private void doRequests() throws Exception {
// Send some requests to the remote JMX server
ObjectName objName1 =
new ObjectName("TestDomain:class=MBS_Light,rank=1");
String mbeanClass = "MBS_Light";
Exception exception = new Exception("MY TEST EXCEPTION");
Attribute attException = new Attribute("AnException", exception);
Error error = new Error("MY TEST ERROR");
Attribute attError = new Attribute("AnError", error);
String opParamString = "TOTORO";
RjmxMBeanParameter opParam = new RjmxMBeanParameter(opParamString);
Object[] params1 = {opParamString};
String[] sig1 = {"java.lang.String"};
Object[] params2 = {opParam};
String[] sig2 = {"RjmxMBeanParameter"};
// Create and register the MBean
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::doRequests: Create and register the MBean");
mbsc.createMBean(mbeanClass, objName1);
if (!mbsc.isRegistered(objName1)) {
throw new Exception("Unable to register an MBean");
}
// Set attributes of the MBean
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::doRequests: Set attributes of the MBean");
mbsc.setAttribute(objName1, attException);
mbsc.setAttribute(objName1, attError);
// Get attributes of the MBean
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::doRequests: Get attributes of the MBean");
Exception retException =
(Exception) mbsc.getAttribute(objName1,"AnException");
if (!retException.getMessage().equals(exception.getMessage())) {
System.out.println("Expected = " + exception);
System.out.println("Got = " + retException);
throw new Exception("Attribute AnException not as expected");
}
Error retError = (Error) mbsc.getAttribute(objName1, "AnError");
if (!retError.getMessage().equals(error.getMessage())) {
System.out.println("Expected = " + error);
System.out.println("Got = " + retError);
throw new Exception("Attribute AnError not as expected");
}
// Invoke operations on the MBean
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::doRequests: Invoke operations on the MBean");
RjmxMBeanParameter res1 =
(RjmxMBeanParameter) mbsc.invoke(objName1, "operate1", params1, sig1);
if (!res1.equals(opParam)) {
System.out.println("Expected = " + opParam);
System.out.println("Got = " + res1);
throw new Exception("Operation operate1 behaved badly");
}
String res2 =
(String) mbsc.invoke(objName1, "operate2", params2, sig2);
if (!res2.equals(opParamString)) {
System.out.println("Expected = " + opParamString);
System.out.println("Got = " + res2);
throw new Exception("Operation operate2 behaved badly");
}
// Unregister the MBean
Utils.debug(Utils.DEBUG_STANDARD,
"ClientSide::doRequests: Unregister the MBean");
mbsc.unregisterMBean(objName1);
if (mbsc.isRegistered(objName1)) {
throw new Exception("Unable to unregister an MBean");
}
}
/**
* Make some check about the instance of TestJMXAuthenticator.
* The authenticator is supposed to have set some properties on
* a ServerDelegate MBean.
* We compare the number of times it has been called with the expected value.
* We also check the Principal that has been given to the authenticator
* was not null.
* That method is of use to authentication with the JSR 262.
* @param mbs
* @param expectedAuthenticatorCallCount
* @return The number of errors encountered.
* @throws java.lang.Exception
*/
protected int checkAuthenticator(MBeanServerConnection mbs,
int expectedAuthenticatorCallCount) throws Exception {
int errorCount = 0;
// Ensure the authenticator has been called the right number
// of times.
int callCount =
((Integer) mbs.getAttribute(
new ObjectName(SERVER_DELEGATE_MBEAN_NAME),
"TestJMXAuthenticatorCallCount")).intValue();
if (callCount == expectedAuthenticatorCallCount) {
System.out.println("---- OK Authenticator has been called "
+ expectedAuthenticatorCallCount + " time");
} else {
errorCount++;
System.out.println("---- ERROR Authenticator has been called " + callCount
+ " times in place of " + expectedAuthenticatorCallCount);
}
// Ensure the provider has been called with
// a non null Principal.
String principalString =
(String) mbs.getAttribute(
new ObjectName(SERVER_DELEGATE_MBEAN_NAME),
"TestJMXAuthenticatorPrincipalString");
if (principalString == null) {
errorCount++;
System.out.println("---- ERROR Authenticator has been called"
+ " with a null Principal");
} else {
if (principalString.length() > 0) {
System.out.println("---- OK Authenticator has been called"
+ " with the Principal " + principalString);
} else {
errorCount++;
System.out.println("---- ERROR Authenticator has been called"
+ " with an empty Principal");
}
}
return errorCount;
}
}
}
/*
* Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.security.Principal;
import java.util.ArrayList;
import java.util.List;
import javax.management.remote.JMXServiceURL ;
import javax.management.MBeanRegistration;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.StandardMBean;
/**
* This class defines an MBean that can be registered and used on client side
* to handle informations or properties of the remote server.
*
* For example, this MBean can store IOR addresses
* of RMI/IIOP connector(s) used in a test.
*
* That MBean might not be used for testing purpose itself.
*/
public class ServerDelegate implements ServerDelegateMBean, MBeanRegistration {
private MBeanServer mbeanServer = null;
private List<JMXServiceURL> addresses = null;
private String port;
private static String javaVersion = System.getProperty("java.version");
private int sqeJmxwsCredentialsProviderCallCount = 0;
private String jmxwsCredentialsProviderUrl = null;
private int testJMXAuthenticatorCallCount = 0;
private Principal testJMXAuthenticatorPrincipal = null;
@SqeDescriptorKey("NO PARAMETER CONSTRUCTOR ServerDelegate")
public ServerDelegate() {
addresses = new ArrayList<JMXServiceURL>();
}
public ObjectName preRegister(MBeanServer server, ObjectName name)
throws Exception {
// Initialize MBeanServer attribute
mbeanServer = server;
return name;
}
public void postRegister(Boolean registrationDone) {
}
public void preDeregister() throws Exception {
}
public void postDeregister() {
}
public void addAddress(JMXServiceURL url) {
addresses.add(url) ;
}
public List<JMXServiceURL> getAddresses() {
return addresses ;
}
public void setPort(String p) {
port = p ;
}
public String getPort() {
return port ;
}
public String getJavaVersion() {
return javaVersion;
}
public void sqeJmxwsCredentialsProviderCalled() {
sqeJmxwsCredentialsProviderCallCount++;
}
public int getSqeJmxwsCredentialsProviderCallCount() {
return sqeJmxwsCredentialsProviderCallCount;
}
public void setJmxwsCredentialsProviderUrl(String url) {
jmxwsCredentialsProviderUrl = url;
}
public String getJmxwsCredentialsProviderUrl() {
return jmxwsCredentialsProviderUrl;
}
public void testJMXAuthenticatorCalled() {
testJMXAuthenticatorCallCount++;
}
public int getTestJMXAuthenticatorCallCount() {
return testJMXAuthenticatorCallCount;
}
public void setTestJMXAuthenticatorPrincipal(Principal principal) {
testJMXAuthenticatorPrincipal = principal;
}
public String getTestJMXAuthenticatorPrincipalString() {
if ( testJMXAuthenticatorPrincipal != null ) {
return testJMXAuthenticatorPrincipal.toString();
}
return null;
}
/**
* Instantiates and registers a StandardMBean in the MBean server.
*
* @param implementationClassName
* The implementation class name of the MBean.
* @param interfaceClassName
* The management interface class name of the MBean.
* @param isMXBean
* If true, the resultant MBean is an MXBean.
* @param name
* The object name of the StandardMBean.
*/
@SuppressWarnings("unchecked")
public void createStandardMBean(
String implementationClassName,
String interfaceClassName,
boolean isMXBean,
ObjectName name)
throws Exception {
Object implementation =
Class.forName(implementationClassName).newInstance();
Class<Object> interfaceClass = interfaceClassName == null ? null :
(Class<Object>)Class.forName(interfaceClassName);
// Create the StandardMBean
StandardMBean standardMBean = new StandardMBean(
implementation,
interfaceClass,
isMXBean);
// Register the StandardMBean
mbeanServer.registerMBean(standardMBean, name);
}
/**
* Instantiates and registers a StandardMBean in the MBean server.
* The object will use standard JMX design pattern to determine
* the management interface associated with the given implementation.
*/
@SuppressWarnings("unchecked")
public void createStandardMBean(
String implementationClassName,
boolean isMXBean,
ObjectName name)
throws Exception {
createStandardMBean(implementationClassName, null, isMXBean, name);
}
}
/*
* Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.security.Principal;
import java.util.List;
import javax.management.remote.JMXServiceURL ;
import javax.management.ObjectName;
@SqeDescriptorKey("INTERFACE ServerDelegateMBean")
public interface ServerDelegateMBean {
@SqeDescriptorKey("ATTRIBUTE Address")
public void addAddress(JMXServiceURL url);
@SqeDescriptorKey("ATTRIBUTE Address")
public List<JMXServiceURL> getAddresses();
public String getPort();
public void setPort(String p);
public String getJavaVersion();
public void sqeJmxwsCredentialsProviderCalled();
public int getSqeJmxwsCredentialsProviderCallCount();
public void setJmxwsCredentialsProviderUrl(String url);
public String getJmxwsCredentialsProviderUrl();
public void testJMXAuthenticatorCalled();
public int getTestJMXAuthenticatorCallCount();
public void setTestJMXAuthenticatorPrincipal(Principal principal);
public String getTestJMXAuthenticatorPrincipalString();
public void createStandardMBean(
String implementationClassName,
String interfaceClassName,
boolean isMXBean,
ObjectName name)
throws Exception;
public void createStandardMBean(
String implementationClassName,
boolean isMXBean,
ObjectName name)
throws Exception;
}
/*
* Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.beans.ConstructorProperties;
/**
* This class defines a simple standard MBean.
*/
public class Simple implements SimpleMBean {
private String attribute = "initial_value";
private boolean operationInvoked = false;
private boolean operation2Invoked = false;
@SqeDescriptorKey("NO PARAMETER CONSTRUCTOR Simple")
public Simple() {
}
@SqeDescriptorKey("TWO PARAMETERS CONSTRUCTOR Simple")
@ConstructorProperties({"unused1", "unused2"})
public Simple(@SqeDescriptorKey("CONSTRUCTOR PARAMETER unused1")int unused1,
@SqeDescriptorKey("CONSTRUCTOR PARAMETER unused2")int unused2) {
}
public String getAttribute() {
return attribute;
}
public void setAttribute(String s) {
attribute = s;
}
public boolean getOperationInvoked() {
return operationInvoked;
}
public boolean getOperation2Invoked() {
return operation2Invoked;
}
public void operation() {
operationInvoked = true;
return;
}
public String operation2(int i) {
operation2Invoked = true;
return String.valueOf(i);
}
public void reset() {
attribute = "initial_value";
operationInvoked = false;
operation2Invoked = false;
}
}
/*
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
// JDK
import java.util.Vector;
// JMX
import javax.management.NotificationListener;
import javax.management.Notification;
public class SimpleListener implements NotificationListener {
private boolean received = false;
private String type = null;
private Object handback = null;
private Vector<Object> handbacks = new Vector<Object>();
private int nbrec = 0;
public synchronized void handleNotification(Notification notification,
Object handback) {
Utils.debug(Utils.DEBUG_STANDARD,
"SimpleListener::handleNotification :" + notification);
try {
received = true;
type = notification.getType();
this.handback = handback;
handbacks.add(handback);
nbrec++;
notify();
} catch(Exception e) {
System.out.println("(ERROR) SimpleListener::handleNotification :"
+ " Caught exception "
+ e) ;
}
}
public synchronized boolean isNotificationReceived() {
boolean ret = received;
reset();
return ret;
}
public synchronized Object[] waitForMultiNotifications(int nb) {
while(true) {
if(nbrec < nb) {
Utils.debug(Utils.DEBUG_STANDARD,
"SimpleListener::waitForMultiNotifications wait");
try {
wait();
} catch(InterruptedException ie) {
// OK : we wait for being interrupted
}
Utils.debug(Utils.DEBUG_STANDARD,
"SimpleListener::waitForMultiNotifications wait over");
}
else
break;
}
Object[] ret = handbacks.toArray();
reset();
return ret;
}
private void reset() {
received = false;
handback = null;
handbacks.removeAllElements();
type = null;
}
public synchronized Object waitForNotificationHB() {
while(true) {
if(!received) {
Utils.debug(Utils.DEBUG_STANDARD,
"SimpleListener::waitForNotificationHB wait");
try {
wait();
} catch(InterruptedException ie) {
// OK : we wait for being interrupted
}
Utils.debug(Utils.DEBUG_STANDARD,
"SimpleListener::waitForNotificationHB received");
}
else
break;
}
Object ret = handback;
reset();
return ret;
}
public synchronized String waitForNotification() {
while(true) {
if(!received) {
Utils.debug(Utils.DEBUG_STANDARD,
"SimpleListener::waitForNotification wait");
try {
wait();
} catch(InterruptedException ie) {
// OK : we wait for being interrupted
}
Utils.debug(Utils.DEBUG_STANDARD,
"SimpleListener::waitForNotification received");
}
else
break;
}
String ret = type;
reset();
return ret;
}
}
/*
* Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* This interface defines a simple standard MBean.
*/
@SqeDescriptorKey("INTERFACE SimpleMBean")
public interface SimpleMBean {
@SqeDescriptorKey("ATTRIBUTE Attribute")
public String getAttribute();
@SqeDescriptorKey("ATTRIBUTE Attribute")
public void setAttribute(String s);
@SqeDescriptorKey("ATTRIBUTE OperationInvoked")
public boolean getOperationInvoked();
@SqeDescriptorKey("ATTRIBUTE Operation2Invoked")
public boolean getOperation2Invoked();
// Void operation
// The associated MBeanOperationInfo is mapped to OpenMBeanOperationInfo
// => openType is added to the descriptor
@SqeDescriptorKey(value = "OPERATION operation",
descriptorFields = {"openType=SimpleType.VOID"})
public void operation();
@SqeDescriptorKey("OPERATION operation2")
public String operation2(int i);
// Void operation
// The associated MBeanOperationInfo is mapped to OpenMBeanOperationInfo
// => openType is added to the descriptor
@SqeDescriptorKey(value = "OPERATION reset",
descriptorFields = {"openType=SimpleType.VOID"})
public void reset();
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.management.DescriptorKey;
/**
* That annotation is usable everywhere DescriptorKey is (and even more).
* It is for use to test that you can retrieve the SqeDescriptorKey into the
* appropriate Descriptor instances as built by the JMX runtime.
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface SqeDescriptorKey {
@DescriptorKey("sqeDescriptorKey")
String value();
// List descriptor fields that may be added or may be updated
// when retrieving an MBeanInfo using a JMXWS connection compared to the
// MBeanInfo returned by a local MBeanServer.
// The annotation format is :
// <descriptorFieldName>=<descriptorFieldValue>
// The values actually handled by the test suite are :
// openType=SimpleType.VOID
@DescriptorKey("descriptorFields")
String[] descriptorFields() default {};
}
/*
* Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.security.Principal;
import javax.management.Attribute;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXAuthenticator;
import javax.management.remote.JMXPrincipal;
import javax.security.auth.Subject;
public final class TestJMXAuthenticator implements JMXAuthenticator {
private String protocol = "";
private MBeanServer mbs = null;
public TestJMXAuthenticator() {
}
public TestJMXAuthenticator(String protocol) {
this.protocol = protocol;
}
public TestJMXAuthenticator(String protocol, MBeanServer mbs) {
this.protocol = protocol;
this.mbs = mbs;
}
public Subject authenticate(Object credentials) {
String credentials_username = "";
String credentials_password = "";
Principal aPrincipal = null;
credentials_username = ((String[]) credentials)[0];
credentials_password = ((String[]) credentials)[1];
String authenticated_username = System.getProperty("susername");
String authenticated_password = System.getProperty("spassword");
String principal = System.getProperty("principal");
System.out.println("TestJMXAuthenticator::authenticate: Start");
System.out.println("TestJMXAuthenticator::authenticate: credentials username = " +
credentials_username);
System.out.println("TestJMXAuthenticator::authenticate: credentials password = " +
credentials_password);
System.out.println("TestJMXAuthenticator::authenticate: authenticated username = " +
authenticated_username);
System.out.println("TestJMXAuthenticator::authenticate: authenticated password = " +
authenticated_password);
System.out.println("TestJMXAuthenticator::authenticate: principal used for " +
"authorization = " + principal);
if (credentials_username.equals(authenticated_username) &&
credentials_password.equals(authenticated_password)) {
System.out.println("TestJMXAuthenticator::authenticate: " +
"Authenticator should succeed");
} else {
System.out.println("TestJMXAuthenticator::authenticate: " +
"Authenticator should reject");
throw new SecurityException("TestJMXAuthenticator throws EXCEPTION");
}
// At this point, authentication has succeeded
// (no SecurityException thrown).
//
// If no authorization is required, the returned subject (empty or not)
// is useless.
// Otherwise, the returned subject must define a principal
// and authorization will be performed against this principal.
//
// Note that this custom JMXAuthenticator is used for test purpose and
// the username used to perform authentication may be different from the
// username used to perform authorization.
//
Subject subject = new Subject();
if (principal != null) {
System.out.println("TestJMXAuthenticator::authenticate: " +
"Add " + principal + " principal to the returned subject");
subject.getPrincipals().add(new JMXPrincipal(principal));
}
return subject;
}
}
/*
* Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.util.Map;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
public final class TestSampleLoginModule implements LoginModule {
private Subject subject;
private CallbackHandler callbackHandler;
private Map<String, ?> sharedState;
private Map<String, ?> options;
public TestSampleLoginModule() {
}
public void initialize(Subject subject,
CallbackHandler callbackHandler,
Map<String,?> sharedState,
Map<String,?> options) {
this.subject = subject;
this.callbackHandler = callbackHandler;
this.sharedState = sharedState;
this.options = options;
}
/*
* Authenticate the user by comparing the values of the java properties
* (username and password) against the values of the credentials.
* */
public boolean login() throws LoginException {
String credentials_username = null;
String credentials_password = null;
String authenticated_username = System.getProperty("susername");
String authenticated_password = System.getProperty("spassword");
System.out.println("TestSampleLoginModule::login: Start");
// First retreive the credentials {username, password} from
// the callback handler
Callback[] callbacks = new Callback[2];
callbacks[0] = new NameCallback("username");
callbacks[1] = new PasswordCallback("password", false);
try {
callbackHandler.handle(callbacks);
credentials_username = ((NameCallback)callbacks[0]).getName();
credentials_password = new String(((PasswordCallback)callbacks[1]).
getPassword());
} catch (Exception e) {
throw new LoginException(e.toString());
}
System.out.println("TestSampleLoginModule::login: credentials username = " +
credentials_username);
System.out.println("TestSampleLoginModule::login: credentials password = " +
credentials_password);
System.out.println("TestSampleLoginModule::login: authenticated username = " +
authenticated_username);
System.out.println("TestSampleLoginModule::login: authenticated password = " +
authenticated_password);
if (credentials_username.equals(authenticated_username) &&
credentials_password.equals(authenticated_password)) {
System.out.println("TestSampleLoginModule::login: " +
"Authentication should succeed");
return true;
} else {
System.out.println("TestSampleLoginModule::login: " +
"Authentication should reject");
throw new LoginException("TestSampleLoginModule throws EXCEPTION");
}
}
public boolean commit() throws LoginException {
return true;
}
public boolean abort() throws LoginException {
return true;
}
public boolean logout() throws LoginException {
return true;
}
}
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.util.Map;
import java.util.HashMap;
import java.util.Properties;
import java.util.StringTokenizer;
import java.lang.reflect.Method;
import javax.management.remote.JMXConnectorServerMBean;
// utility class for MXBean* tests coming from JMX Tonga test suite
class Utils {
private static final String SERVER_SIDE_NAME = "-server";
private static final String CLIENT_SIDE_NAME = "-client";
// DEBUG is printed depending on the DEBUG and DEBUG_LEVEL JAVA property
private static final String DEBUG_HEADER = "[debug] ";
// DEBUG levels
private static int selectedDebugLevel = 0;
static final int DEBUG_STANDARD = 1;
static final int DEBUG_VERBOSE = 2; // Mainly used for stress tests
static final int DEBUG_ALL = DEBUG_STANDARD | DEBUG_VERBOSE;
static void parseDebugProperties() {
int level = 0;
Properties p = System.getProperties();
// get selected levels
if (p.getProperty("DEBUG_STANDARD") != null) {
level |= DEBUG_STANDARD;
}
if (p.getProperty("DEBUG_VERBOSE") != null) {
level |= DEBUG_VERBOSE;
}
if (p.getProperty("DEBUG_ALL") != null) {
level |= DEBUG_ALL;
}
selectedDebugLevel = level;
}
/**
* Reproduces the original parsing and collection of test parameters
* from the DTonga JMX test suite.
*
* Collects passed args and returns them in a map(argname, value) structure,
* which will be then propagated as necessary to various called methods.
*/
static Map<String, Object> parseParameters(String args[])
throws Exception {
Utils.debug(DEBUG_STANDARD, "TestRoot::parseParameters: Start");
HashMap<String, Object> map = new HashMap<>();
for ( int i = 0; i < args.length; i++ ) {
if ( args[i].trim().startsWith("-") ) {
if ((i+1) < args.length && !args[i+1].startsWith("-") ) {
Utils.debug(DEBUG_STANDARD,
"TestRoot::parseParameters: added in map = " +
args[i] +
" with value " +
args[i+1]) ;
map.put(args[i].trim(), args[i+1].trim()) ;
} else if ((i+1) < args.length && args[i+1].startsWith("-") ||
(i+1) == args.length ) {
Utils.debug(DEBUG_STANDARD,
"TestRoot::parseParameters: added in map = " +
args[i] +
" with null value") ;
map.put(args[i].trim(), null) ;
} else {
System.out.println(
"TestRoot::parseParameters: (WARNING) not added in map = " +
args[i]) ;
}
}
}
Utils.debug(DEBUG_STANDARD, "TestRoot::parseParameters: Done") ;
return map ;
}
// Parse server parameters and put them in passed serverMap
static int parseServerParameters(String args[],
String serverSideName,
Map<String, Object> serverMap )
throws Exception {
Utils.debug(Utils.DEBUG_STANDARD,
serverSideName + "::parseServerParameters: Start");
int nextIndex = 0;
boolean seenServerFlag = false;
for ( int i = 0; i < args.length; i++ ) {
// Case of reaching "-server" flag parameter
if (args[i].equals(SERVER_SIDE_NAME)) {
if (!seenServerFlag) {
seenServerFlag = true;
continue;
} else {
// Already parsing server params, invalid params list
Utils.debug(Utils.DEBUG_STANDARD,
serverSideName + "::parseParameters: Invalid " +
args[i] + " parameter detected in " +
SERVER_SIDE_NAME + " parameters list");
nextIndex = -1;
throw new RuntimeException("Invalid Parameter list");
}
}
// Case of reaching "-client" flag parameter
if (args[i].equals(CLIENT_SIDE_NAME)) {
// While parsing server parameters, then parsing is done.
Utils.debug(Utils.DEBUG_STANDARD,
serverSideName + "::parseServerParameters: Parsing of " +
SERVER_SIDE_NAME + " parameters done.");
return i;
}
i = parseParamAtIndex(args, i, serverMap);
nextIndex = i;
}
Utils.debug(Utils.DEBUG_STANDARD,
serverSideName + "::parseServerParameters: Parsing of parameters done");
return nextIndex;
}
// Parse client parameters and put them in passed clientMap
static void parseClientParameters(String args[],
String clientSideName,
Map<String, Object> clientMap )
throws Exception {
Utils.debug(Utils.DEBUG_STANDARD,
clientSideName + "::parseClientParameters: Start");
boolean seenClientFlag = false;
for ( int i = 0; i < args.length; i++ ) {
// Case of reaching "-client" flag parameter
if (args[i].equals(CLIENT_SIDE_NAME)) {
if (!seenClientFlag) {
seenClientFlag = true;
continue;
} else {
// Already parsing client params, invalid params list
Utils.debug(Utils.DEBUG_STANDARD,
clientSideName + "::parseClientParameters: Invalid " +
CLIENT_SIDE_NAME + " parameter detected in " +
CLIENT_SIDE_NAME + " parameters list.");
throw new RuntimeException("Invalid parameter in " +
clientSideName + " parameter list");
}
}
// Case of reaching "-server" flag parameter
if (args[i].equals(SERVER_SIDE_NAME)) {
// While parsing client parameters, invalid parameter list.
Utils.debug(Utils.DEBUG_STANDARD,
clientSideName + "::parseClientParameters: Invalid " +
SERVER_SIDE_NAME + " parameter inside " +
CLIENT_SIDE_NAME + " parameters list.");
throw new RuntimeException("Invalid parameter in " +
clientSideName + " parameter list");
}
i = parseParamAtIndex(args, i, clientMap);
}
Utils.debug(Utils.DEBUG_STANDARD,
clientSideName + "::parseClientParameters: Parsing of parameters done.");
}
// Add param found at index to passed map
// We only accept either "-param value" or "-param" form.
// The "value" form is invalid but just ignored.
private static int parseParamAtIndex(String args[],
int index,
Map<String, Object> map) {
if (args[index].trim().startsWith("-") ) {
// Case of a "-param value" form
if ((index+1) < args.length && !args[index+1].startsWith("-") ) {
Utils.debug(Utils.DEBUG_STANDARD,
"TestRoot::parseParamAtIndex: added in map = "
+ args[index]
+ " with value "
+ args[index+1]) ;
// adding ("param", value) to the passed map
map.put(args[index].trim(), args[index+1].trim()) ;
// value should not be parsed a second time
return index+1;
}
// Case of a "-param" form (flag parameter)
else if (((index+1) < args.length && args[index+1].startsWith("-")) ||
(index+1) == args.length ) {
Utils.debug(Utils.DEBUG_STANDARD,
"TestRoot::parseParamAtIndex: added in map = "
+ args[index]
+ " with null value") ;
// adding ("param", null) to passed map
map.put(args[index].trim(), null) ;
}
} else {
// Unsupported "value" alone parameter
Utils.debug(Utils.DEBUG_STANDARD,
"TestRoot::parseParamAtIndex: invalid " +
" value-alone \"" + args[index] + "\" parameter." +
" Parameter ignored.");
}
return index;
}
/**
* This method is to be used in all tests to print anything
* that is temporary.
* Printing is done only when debug is activated by the property DEBUG.
* Printing depends also on the DEBUG_LEVEL property.
* Here it encapsulates a System.out.println.
*/
static void debug(int level, String line) {
if ((selectedDebugLevel & level) != 0) {
System.out.println(DEBUG_HEADER + line);
}
}
/**
* Do print stack trace when withStack is true.
* Does try to call getTargetException() and getTargetError() then
* print embedded stacks in the case of an Exception wrapping
* another Exception or an Error. Recurse until no more wrapping
* is found.
*/
static void printThrowable(Throwable theThro, boolean withStack) {
try {
if (withStack) {
theThro.printStackTrace(System.out);
}
if (theThro instanceof Exception) {
Exception t = (Exception) theThro;
Method target = null;
String blank = " ";
try {
target = t.getClass().getMethod("getTargetException",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetException method could be there or not
}
System.out.println(blank + t.getClass() + "==>" + t.getMessage());
while (target != null) {
try {
t = (Exception) target.invoke(t,
(java.lang.Object[]) null);
} catch (Exception ee) {
t = null;
}
try {
if (t != null) {
blank = blank + " ";
System.out.println(blank + t.getClass() + "==>" +
t.getMessage());
try {
target =
t.getClass().getMethod("getTargetException",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetException method could be there or not }
}
} else {
target = null;
}
} catch (Exception ee) {
target = null;
}
}
// We may have exceptions wrapping an Error then it is
// getTargetError that is likely to be called
try {
target = ((Exception) theThro).getClass().getMethod("getTargetError",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetError method could be there or not
}
Throwable err = theThro;
while (target != null) {
try {
err = (Error) target.invoke(err,
(java.lang.Object[]) null);
} catch (Exception ee) {
err = null;
}
try {
if (err != null) {
blank = blank + " ";
System.out.println(blank + err.getClass() + "==>" +
err.getMessage());
if (withStack) {
err.printStackTrace(System.out);
}
try {
target = err.getClass().getMethod("getTargetError",
(java.lang.Class<?>[]) null);
} catch (Exception ee) {
// OK: getTargetError method could be there or not
}
} else {
target = null;
}
} catch (Exception ee) {
target = null;
}
}
} else {
System.out.println("Throwable is : " + theThro);
}
} catch (Throwable x) {
System.out.println("Exception : raised in printException : " + x);
}
}
/**
* Wait up to maxTimeInSeconds second(s) the given JMX connector server
* comes up (which means isActive returns true).
* If it fails to do so we throw a RunTime exception.
*/
static void waitReady(JMXConnectorServerMBean server,
int maxTimeInSeconds) throws Exception {
int elapsed = 0;
while (!server.isActive() && elapsed < maxTimeInSeconds) {
Thread.sleep(1000);
elapsed++;
}
if (server.isActive()) {
String message = "Utils::waitReady: JMX connector server came up";
if ( elapsed == 0) {
message += " immediately";
} else {
message += " after " + elapsed + " seconds";
}
message += " [" + server.getAddress() + "]";
Utils.debug(DEBUG_STANDARD, message);
} else {
String message = "Utils::waitReady: (ERROR) JMX connector" +
" server didn't come up after " + elapsed + " seconds [" +
server.getAddress() + "]";
System.out.println(message);
throw new RuntimeException(message);
}
}
/**
* This method is used to compare the specified Throwable and possibly
* the derived causes to the specified String argument.
* The expected String argument format is :
* throwable_1;throwable_2;...;throwable_N
* where throwable_i can be :
* - either a throwable class name
* - or the "*" character meaning several unknown throwable class names
* This character must be followed by a throwable class name
*/
static boolean compareThrowable(
Throwable t,
String expectedThrowable) {
// First parse the expectedThrowable String
StringTokenizer tokenizer = new StringTokenizer(expectedThrowable, ";");
String token = null;
try {
while (tokenizer.hasMoreTokens()) {
token = tokenizer.nextToken();
if (!token.equals("*")) {
if (!Class.forName(token).isInstance(t)) {
return false;
}
} else {
token = tokenizer.nextToken();
while (!Class.forName(token).isInstance(t)) {
t = t.getCause();
if (t == null) {
return false;
}
}
}
t = t.getCause();
}
} catch (ClassNotFoundException cnfe) {
String msg = "Expected throwable class(es) " + expectedThrowable +
" cannot be located";
System.out.println(msg);
throw new IllegalArgumentException(msg);
}
return true;
}
}
# Access control file for SQE tests.
# Default username
SQE_username readwrite create Simple
# Functional authorization tests
username1 readwrite create Simple
username2 readonly
username3 readonly
username4 readwrite create Simple
username5 readwrite create Simple
// Standard extensions get all permissions by default
grant codeBase "file:${java.home}/lib/ext/*" {
permission java.security.AllPermission;
};
// default permissions granted to all domains
grant {
// Allows any thread to stop itself using the java.lang.Thread.stop()
// method that takes no argument.
// Note that this permission is granted by default only to remain
// backwards compatible.
// It is strongly recommended that you either remove this permission
// from this policy file or further restrict it to code sources
// that you specify, because Thread.stop() is potentially unsafe.
// See "http://java.sun.com/notes" for more information.
permission java.lang.RuntimePermission "stopThread";
// allows anyone to listen on un-privileged ports
permission java.net.SocketPermission "localhost:1024-", "listen";
// "standard" properies that can be read by anyone
permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read";
permission java.util.PropertyPermission "java.vendor.url", "read";
permission java.util.PropertyPermission "java.class.version", "read";
permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "os.version", "read";
permission java.util.PropertyPermission "os.arch", "read";
permission java.util.PropertyPermission "file.separator", "read";
permission java.util.PropertyPermission "path.separator", "read";
permission java.util.PropertyPermission "line.separator", "read";
permission java.util.PropertyPermission "java.specification.version", "read";
permission java.util.PropertyPermission "java.specification.vendor", "read";
permission java.util.PropertyPermission "java.specification.name", "read";
permission java.util.PropertyPermission "java.vm.specification.version", "read";
permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
permission java.util.PropertyPermission "java.vm.specification.name", "read";
permission java.util.PropertyPermission "java.vm.version", "read";
permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read";
permission java.io.FilePermission "*","read,write";
};
grant codeBase "file:/-" {
permission java.security.AllPermission;
permission java.io.FilePermission "*","read,write";
};
grant principal javax.management.remote.JMXPrincipal "SQE_username" {
permission javax.management.MBeanServerPermission "*";
permission javax.management.MBeanPermission "Simple", "instantiate";
permission javax.management.MBeanPermission "Simple", "registerMBean";
};
grant principal javax.management.remote.JMXPrincipal "username1" {
//
// JMXPrincipals "username1" has all permissions.
//
permission java.security.AllPermission;
};
grant principal javax.management.remote.JMXPrincipal "username2" {
//
// JMXPrincipals "username2" has all permissions.
//
permission java.security.AllPermission;
};
grant principal javax.management.remote.JMXPrincipal "username3" {
//
// JMXPrincipals "username3" has some permissions.
//
permission javax.management.MBeanPermission "Simple", "instantiate";
permission javax.management.MBeanPermission "Simple", "registerMBean";
permission javax.management.MBeanPermission "Simple", "setAttribute";
permission javax.management.MBeanPermission "Simple", "invoke";
};
grant principal javax.management.remote.JMXPrincipal "username4" {
//
// JMXPrincipals "username4" has all permissions.
//
permission javax.management.MBeanPermission "Simple", "instantiate";
permission javax.management.MBeanPermission "Simple", "registerMBean";
permission javax.management.MBeanPermission "Simple", "invoke";
};
grant principal javax.management.remote.JMXPrincipal "username5" {
//
// JMXPrincipals "username5" has no permissions.
//
};
PasswordFileAuthentication {
com.sun.jmx.remote.security.FileLoginModule required
passwordFile="${password.file}";
};
SampleLoginModule {
TestSampleLoginModule required;
};
# Password file for default SQE username.
SQE_username SQE_password
# Functional authorization tests
username1 password1
username2 password2
username3 password3
username4 password4
username5 password5
username6 password6
usernameFileLoginModule passwordFileLoginModule
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8154069
* @summary Jaws reads wrong values from comboboxes when no element is selected
* @run main Bug8154069
*/
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleSelection;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;
public class Bug8154069 {
private static JFrame frame;
private static volatile Exception exception = null;
public static void main(String args[]) throws Exception {
try {
try {
UIManager.setLookAndFeel(new NimbusLookAndFeel());
} catch (Exception e) {
throw new RuntimeException(e);
}
SwingUtilities.invokeAndWait(() -> {
frame = new JFrame();
String[] petStrings = { "Bird", "Cat" };
JComboBox<String> cb = new JComboBox<>(petStrings);
cb.setSelectedIndex(1); // select Cat
frame.add(cb);
frame.pack();
try {
cb.setSelectedIndex(-1);
int i = cb.getSelectedIndex();
if (i != -1) {
throw new RuntimeException("getSelectedIndex is not -1");
}
Object o = cb.getSelectedItem();
if (o != null) {
throw new RuntimeException("getSelectedItem is not null");
}
AccessibleContext ac = cb.getAccessibleContext();
AccessibleSelection as = ac.getAccessibleSelection();
int count = as.getAccessibleSelectionCount();
if (count != 0) {
throw new RuntimeException("getAccessibleSelection count is not 0");
}
Accessible a = as.getAccessibleSelection(0);
if (a != null) {
throw new RuntimeException("getAccessibleSelection(0) is not null");
}
} catch (Exception e) {
exception = e;
}
});
if (exception != null) {
System.out.println("Test failed: " + exception.getMessage());
throw exception;
} else {
System.out.println("Test passed.");
}
} finally {
SwingUtilities.invokeAndWait(() -> {
frame.dispose();
});
}
}
}
/*
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -22,7 +22,10 @@
*/
import java.io.*;
import java.net.*;
import java.util.*;
import java.security.*;
import java.security.cert.*;
import javax.net.*;
import javax.net.ssl.*;
......@@ -71,22 +74,34 @@ public class ShortRSAKeyWithinTLS {
void doServerSide() throws Exception {
// load the key store
KeyStore ks = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
ks.load(null, null);
serverKS = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
serverKS.load(null, null);
System.out.println("Loaded keystore: Windows-MY");
// check key size
checkKeySize(ks);
checkKeySize(serverKS);
// initialize the SSLContext
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, null);
kmf.init(serverKS, null);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
tmf.init(serverKS);
TrustManager[] tms = tmf.getTrustManagers();
if (tms == null || tms.length == 0) {
throw new Exception("unexpected trust manager implementation");
} else {
if (!(tms[0] instanceof X509TrustManager)) {
throw new Exception("unexpected trust manager" +
" implementation: " +
tms[0].getClass().getCanonicalName());
}
}
serverTM = new MyExtendedX509TM((X509TrustManager)tms[0]);
tms = new TrustManager[] {serverTM};
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
ctx.init(kmf.getKeyManagers(), tms, null);
ServerSocketFactory ssf = ctx.getServerSocketFactory();
SSLServerSocket sslServerSocket = (SSLServerSocket)
......@@ -228,6 +243,8 @@ public class ShortRSAKeyWithinTLS {
Thread clientThread = null;
Thread serverThread = null;
KeyStore serverKS;
MyExtendedX509TM serverTM;
/*
* Primary constructor, used to drive remainder of the test.
......@@ -348,5 +365,60 @@ public class ShortRSAKeyWithinTLS {
}
}
}
class MyExtendedX509TM extends X509ExtendedTrustManager
implements X509TrustManager {
X509TrustManager tm;
MyExtendedX509TM(X509TrustManager tm) {
this.tm = tm;
}
public void checkClientTrusted(X509Certificate chain[], String authType)
throws CertificateException {
tm.checkClientTrusted(chain, authType);
}
public void checkServerTrusted(X509Certificate chain[], String authType)
throws CertificateException {
tm.checkServerTrusted(chain, authType);
}
public X509Certificate[] getAcceptedIssuers() {
List<X509Certificate> certs = new ArrayList<>();
try {
for (X509Certificate c : tm.getAcceptedIssuers()) {
if (serverKS.getCertificateAlias(c).equals(keyAlias))
certs.add(c);
}
} catch (KeyStoreException kse) {
throw new RuntimeException(kse);
}
return certs.toArray(new X509Certificate[certs.size()]);
}
public void checkClientTrusted(X509Certificate[] chain, String authType,
Socket socket) throws CertificateException {
tm.checkClientTrusted(chain, authType);
}
public void checkServerTrusted(X509Certificate[] chain, String authType,
Socket socket) throws CertificateException {
tm.checkServerTrusted(chain, authType);
}
public void checkClientTrusted(X509Certificate[] chain, String authType,
SSLEngine engine) throws CertificateException {
tm.checkClientTrusted(chain, authType);
}
public void checkServerTrusted(X509Certificate[] chain, String authType,
SSLEngine engine) throws CertificateException {
tm.checkServerTrusted(chain, authType);
}
}
}
......@@ -24,7 +24,7 @@
/**
* @test
* @bug 5030233 6214916 6356475 6571029 6684582 6742159 4459600 6758881 6753938
* 6894719 6968053 7151434 7146424 8007333 8077822
* 6894719 6968053 7151434 7146424 8007333 8077822 8143640
* @summary Argument parsing validation.
* @compile -XDignore.symbol.file Arrrghs.java
* @run main/othervm Arrrghs
......@@ -324,6 +324,8 @@ public class Arrrghs extends TestHelper {
// more treatment of mixed slashes
checkArgumentParsing("f1/ f3\\ f4/", "f1/", "f3\\", "f4/");
checkArgumentParsing("f1/ f2\' ' f3/ f4/", "f1/", "f2\'", "'", "f3/", "f4/");
checkArgumentParsing("a\\*\\b", "a\\*\\b");
}
private void initEmptyDir(File emptyDir) throws IOException {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册