package org.jolokia.jvmagent;
/*
* Copyright 2009-2013 Roland Huss
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import com.sun.net.httpserver.Authenticator;
import org.jolokia.config.ConfigKey;
import org.jolokia.config.Configuration;
import org.jolokia.jvmagent.security.UserPasswordAuthenticator;
import org.jolokia.util.EscapeUtil;
import org.testng.annotations.Test;
import java.io.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import static org.testng.Assert.*;
/**
* @author roland
* @since 13.08.11
*/
public class JvmAgentConfigTest {
@Test
public void simple() {
JvmAgentConfig config = new JvmAgentConfig("port=4711,mode=stop");
assertEquals(config.getPort(), 4711);
assertTrue(config.isModeStop());
assertEquals(config.getBacklog(), 10);
}
@Test
public void withMultipleEquals() {
JvmAgentConfig config = new JvmAgentConfig("clientPrincipal=O=jolokia.org\\,DN=Roland Huss,protocol=https");
assertEquals(config.getClientPrincipals().get(0),"O=jolokia.org,DN=Roland Huss");
assertEquals(config.getProtocol(),"https");
assertEquals(config.getBacklog(), 10);
}
@Test
public void detectorArgs() {
JvmAgentConfig config = new JvmAgentConfig("bootAmx=true");
Configuration jConfig = config.getJolokiaConfig();
String detectorOpts = jConfig.get(ConfigKey.DETECTOR_OPTIONS);
assertEquals(detectorOpts.replaceAll("\\s*", ""), "{\"glassfish\":{\"bootAmx\":true}}");
}
@Test
public void listArgs() {
JvmAgentConfig config = new JvmAgentConfig("clientPrincipal=O=jolokia.org\\,CN=Roland Huss,clientPrincipal.1=O=redhat.com\\,CN=jolokia,clientPrincipal.3=bla");
assertEquals(config.getClientPrincipals().size(),2);
assertEquals(config.getClientPrincipals().get(0),"O=jolokia.org,CN=Roland Huss");
assertEquals(config.getClientPrincipals().get(1),"O=redhat.com,CN=jolokia");
}
@Test
public void defaults() throws UnknownHostException {
JvmAgentConfig config = new JvmAgentConfig("");
assertEquals(config.getAddress(), InetAddress.getByName(null));
assertFalse(config.isModeStop());
assertEquals(config.getProtocol(), "http");
assertEquals(config.getPort(), 8778);
assertNull(config.getAuthenticator());
assertEquals(config.getBacklog(), 10);
assertEquals(config.getContextPath(), "/jolokia/");
assertEquals(config.getExecutor(), "single");
assertEquals(config.getThreadNr(), 5);
assertFalse(config.useSslClientAuthentication());
assertNull(config.getKeystore());
assertEquals(config.getKeystorePassword().length, 0);
}
@Test
public void context() {
JvmAgentConfig config = new JvmAgentConfig("agentContext=/bla");
assertEquals(config.getContextPath(), "/bla/");
}
@Test
public void jolokiaConfig() {
JvmAgentConfig config = new JvmAgentConfig("maxDepth=42");
Configuration jolokiaConfig = config.getJolokiaConfig();
assertEquals(jolokiaConfig.get(ConfigKey.MAX_DEPTH), "42");
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void invalidOptions() {
new JvmAgentConfig("port=a=1812");
}
@Test
public void readConfig() throws IOException {
String path = copyResourceToTemp("/agent-test.properties");
JvmAgentConfig config = new JvmAgentConfig("config=" + path);
assertEquals(config.getProtocol(), "https");
Authenticator authenticator = config.getAuthenticator();
assertNotNull(authenticator);
assertEquals(config.getClientPrincipals().get(0),"O=jolokia.org,OU=JVM");
assertTrue(authenticator instanceof UserPasswordAuthenticator);
assertTrue(((UserPasswordAuthenticator) authenticator).checkCredentials("roland", "s!cr!t"));
}
@Test
public void readConfigWithCustomAuthenticator() throws IOException {
String path = copyResourceToTemp("/agent-custom-authenticator-test.properties");
JvmAgentConfig config = new JvmAgentConfig("config=" + path);
assertEquals(config.getProtocol(), "http");
Authenticator authenticator = config.getAuthenticator();
assertNotNull(authenticator);
assertTrue(authenticator instanceof Dummy);
assertSame(((Dummy) authenticator).getConfig(), config.getJolokiaConfig());
}
@Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = ".*bla\\.txt.*")
public void configNotFound() {
new JvmAgentConfig("config=/bla.txt");
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void wrongProtocol() {
new JvmAgentConfig("protocol=ftp");
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void invalidHost() {
new JvmAgentConfig("host=[192.168.5.0]");
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void invalidPort() {
new JvmAgentConfig("port=bla");
}
@Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = ".*blub.*")
public void invalidMode() {
new JvmAgentConfig("mode=blub");
}
@Test
public void keystorePassword() throws UnknownHostException {
JvmAgentConfig config = new JvmAgentConfig("keystorePassword=passwd");
assertEquals(config.getKeystorePassword(), "passwd".toCharArray());
}
@Test
public void keystorePasswordEncrypted() throws UnknownHostException {
JvmAgentConfig config = new JvmAgentConfig("keystorePassword=[[b4m+ADwT8u8HAoVvv3n6WLAEfFFceJHSu6rsNT1/CsHiWFzUseNMS4C2d1AtxJNC]]");
assertEquals(config.getKeystorePassword(), "1234567890123456".toCharArray());
}
// =======================================================================================
private String copyResourceToTemp(String pResource) throws IOException {
InputStream is = this.getClass().getResourceAsStream(pResource);
assertNotNull(is, "Cannot find " + pResource);
File out = File.createTempFile("prop", ".properties");
copy(is, new FileOutputStream(out));
String path = out.getAbsolutePath();
if (EscapeUtil.CSV_ESCAPE.equals("\\\\") && (File.separator.equals("\\"))) {
/* Path can be similar to C:\...\...\...\...\Temp\prop424242424242424242.properties on Win,
so we need to escape \ otherwise tests will fail. We need to escape it twice, once for
list of parameter split unescaping and once more for parameter=value split unecapsulation
*/
//First "\\\\" is regex
path = path.replaceAll("\\\\", Matcher.quoteReplacement("\\\\\\\\"));
}
return path;
}
private void copy(InputStream in, OutputStream out) throws IOException {
try {
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
out.flush();
} finally {
if (in != null) {
in.close();
}
}
}
}