blob: 3e2e7f1ed500336292d740dfb972539594a527ba [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.commons.codec.net;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.EncoderException;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
/**
* Percent codec test cases.
*/
public class PercentCodecTest {
@Test
public void testBasicEncodeDecode() throws Exception {
final PercentCodec percentCodec = new PercentCodec();
final String input = "abcdABCD";
final byte[] encoded = percentCodec.encode(input.getBytes(StandardCharsets.UTF_8));
final String encodedS = new String(encoded, StandardCharsets.UTF_8);
final byte[] decoded = percentCodec.decode(encoded);
final String decodedS = new String(decoded, StandardCharsets.UTF_8);
assertEquals("Basic PercentCodec encoding test", input, encodedS);
assertEquals("Basic PercentCodec decoding test", input, decodedS);
}
@Test
@Ignore
public void testBasicSpace() throws Exception {
final PercentCodec percentCodec = new PercentCodec();
final String input = " ";
final byte[] encoded = percentCodec.encode(input.getBytes(StandardCharsets.UTF_8));
Assert.assertArrayEquals("%20".getBytes(StandardCharsets.UTF_8), encoded);
}
@Test
public void testConfigurablePercentEncoder() throws Exception {
final String input = "abc123_-.*\u03B1\u03B2";
final PercentCodec percentCodec = new PercentCodec("abcdef".getBytes(StandardCharsets.UTF_8), false);
final byte[] encoded = percentCodec.encode(input.getBytes(StandardCharsets.UTF_8));
final String encodedS = new String(encoded, StandardCharsets.UTF_8);
assertEquals("Configurable PercentCodec encoding test", "%61%62%63123_-.*%CE%B1%CE%B2", encodedS);
final byte[] decoded = percentCodec.decode(encoded);
assertEquals("Configurable PercentCodec decoding test", new String(decoded, StandardCharsets.UTF_8), input);
}
@Test
public void testDecodeInvalidEncodedResultDecoding() throws Exception {
final String inputS = "\u03B1\u03B2";
final PercentCodec percentCodec = new PercentCodec();
final byte[] encoded = percentCodec.encode(inputS.getBytes(StandardCharsets.UTF_8));
try {
percentCodec.decode(Arrays.copyOf(encoded, encoded.length-1)); //exclude one byte
} catch (final Exception e) {
assertTrue(DecoderException.class.isInstance(e) &&
ArrayIndexOutOfBoundsException.class.isInstance(e.getCause()));
}
}
@Test
public void testDecodeNullObject() throws Exception {
final PercentCodec percentCodec = new PercentCodec();
assertNull(percentCodec.decode((Object) null));
}
@Test(expected = DecoderException.class)
public void testDecodeUnsupportedObject() throws Exception {
final PercentCodec percentCodec = new PercentCodec();
percentCodec.decode("test");
}
@Test
public void testEncodeNullObject() throws Exception {
final PercentCodec percentCodec = new PercentCodec();
assertNull(percentCodec.encode((Object) null));
}
@Test(expected = EncoderException.class)
public void testEncodeUnsupportedObject() throws Exception {
final PercentCodec percentCodec = new PercentCodec();
percentCodec.encode("test");
}
@Test
public void testPercentEncoderDecoderWithNullOrEmptyInput() throws Exception {
final PercentCodec percentCodec = new PercentCodec(null, true);
assertNull("Null input value encoding test", percentCodec.encode(null));
assertNull("Null input value decoding test", percentCodec.decode(null));
final byte[] emptyInput = "".getBytes(StandardCharsets.UTF_8);
assertEquals("Empty input value encoding test", percentCodec.encode(emptyInput), emptyInput);
assertArrayEquals("Empty input value decoding test", percentCodec.decode(emptyInput), emptyInput);
}
@Test
public void testPercentEncoderDecoderWithPlusForSpace() throws Exception {
final String input = "a b c d";
final PercentCodec percentCodec = new PercentCodec(null, true);
final byte[] encoded = percentCodec.encode(input.getBytes(StandardCharsets.UTF_8));
final String encodedS = new String(encoded, StandardCharsets.UTF_8);
assertEquals("PercentCodec plus for space encoding test", "a+b+c+d", encodedS);
final byte[] decode = percentCodec.decode(encoded);
assertEquals("PercentCodec plus for space decoding test", new String(decode, StandardCharsets.UTF_8), input);
}
@Test
public void testSafeCharEncodeDecodeObject() throws Exception {
final PercentCodec percentCodec = new PercentCodec(null, true);
final String input = "abc123_-.*";
final Object encoded = percentCodec.encode((Object) input.getBytes(StandardCharsets.UTF_8));
final String encodedS = new String((byte[]) encoded, StandardCharsets.UTF_8);
final Object decoded = percentCodec.decode(encoded);
final String decodedS = new String((byte[]) decoded, StandardCharsets.UTF_8);
assertEquals("Basic PercentCodec safe char encoding test", input, encodedS);
assertEquals("Basic PercentCodec safe char decoding test", input, decodedS);
}
@Test
public void testUnsafeCharEncodeDecode() throws Exception {
final PercentCodec percentCodec = new PercentCodec();
final String input = "\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6% ";
final byte[] encoded = percentCodec.encode(input.getBytes(StandardCharsets.UTF_8));
final String encodedS = new String(encoded, StandardCharsets.UTF_8);
final byte[] decoded = percentCodec.decode(encoded);
final String decodedS = new String(decoded, StandardCharsets.UTF_8);
assertEquals("Basic PercentCodec unsafe char encoding test", "%CE%B1%CE%B2%CE%B3%CE%B4%CE%B5%CE%B6%25 ", encodedS);
assertEquals("Basic PercentCodec unsafe char decoding test", input, decodedS);
}
}