blob: bba19a87576d45ca92296e8d6278015273ef761c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package org.apache.kafka.common.utils;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.lang.management.ManagementFactory;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.OperationsException;
import org.junit.Test;
public class SanitizerTest {
@Test
public void testSanitize() {
String principal = "CN=Some characters !@#$%&*()_-+=';:,/~";
String sanitizedPrincipal = Sanitizer.sanitize(principal);
assertTrue(sanitizedPrincipal.replace('%', '_').matches("[a-zA-Z0-9\\._\\-]+"));
assertEquals(principal, Sanitizer.desanitize(sanitizedPrincipal));
}
@Test
public void testJmxSanitize() throws MalformedObjectNameException {
int unquoted = 0;
for (int i = 0; i < 65536; i++) {
char c = (char) i;
String value = "value" + c;
String jmxSanitizedValue = Sanitizer.jmxSanitize(value);
if (jmxSanitizedValue.equals(value))
unquoted++;
verifyJmx(jmxSanitizedValue, i);
String encodedValue = Sanitizer.sanitize(value);
verifyJmx(encodedValue, i);
// jmxSanitize should not sanitize URL-encoded values
assertEquals(encodedValue, Sanitizer.jmxSanitize(encodedValue));
}
assertEquals(68, unquoted); // a-zA-Z0-9-_% space and tab
}
private void verifyJmx(String sanitizedValue, int c) throws MalformedObjectNameException {
Object mbean = new TestStat();
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName("test:key=" + sanitizedValue);
try {
server.registerMBean(mbean, objectName);
server.unregisterMBean(objectName);
} catch (OperationsException | MBeanException e) {
fail("Could not register char=\\u" + c);
}
}
public interface TestStatMBean {
int getValue();
}
public class TestStat implements TestStatMBean {
public int getValue() {
return 1;
}
}
}