/*
* Copyright 2013 Robert von Burg <eitch@eitchnet.ch>
*
* 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.
*/
package li.strolch.utils.helper;
import static li.strolch.utils.helper.BaseEncoding.fromBase16;
import static li.strolch.utils.helper.BaseEncoding.fromBase32;
import static li.strolch.utils.helper.BaseEncoding.fromBase32Dmedia;
import static li.strolch.utils.helper.BaseEncoding.fromBase32Hex;
import static li.strolch.utils.helper.BaseEncoding.fromBase64;
import static li.strolch.utils.helper.BaseEncoding.toBase32Hex;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import li.strolch.utils.helper.PropertiesHelper;
import li.strolch.utils.helper.StringHelper;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
@SuppressWarnings("nls")
public class BaseDecodingTest {
public static final String PROP_RUN_PERF_TESTS = "li.strolch.utils.test.runPerfTests"; //$NON-NLS-1$
private static final Logger logger = LoggerFactory.getLogger(BaseDecodingTest.class);
public static boolean isSkipPerfTests() {
String context = BaseDecodingTest.class.getSimpleName();
String key = PROP_RUN_PERF_TESTS;
boolean runPerfTests = PropertiesHelper.getPropertyBool(context, key, Boolean.FALSE);
return !runPerfTests;
}
@Test
public void testBase64() {
assertEquals("", fromBase64(""));
assertEquals("f", fromBase64("Zg=="));
assertEquals("fo", fromBase64("Zm8="));
assertEquals("foo", fromBase64("Zm9v"));
assertEquals("foob", fromBase64("Zm9vYg=="));
assertEquals("fooba", fromBase64("Zm9vYmE="));
assertEquals("foobar", fromBase64("Zm9vYmFy"));
}
@Test
public void testBase32() {
assertEquals("", fromBase32(""));
assertEquals("f", fromBase32("MY======"));
assertEquals("fo", fromBase32("MZXQ===="));
assertEquals("foo", fromBase32("MZXW6==="));
assertEquals("foob", fromBase32("MZXW6YQ="));
assertEquals("fooba", fromBase32("MZXW6YTB"));
assertEquals("foobar", fromBase32("MZXW6YTBOI======"));
}
@Test
public void testBase32Hex() {
assertEquals("", fromBase32Hex(""));
assertEquals("f", fromBase32Hex("CO======"));
assertEquals("fo", fromBase32Hex("CPNG===="));
assertEquals("foo", fromBase32Hex("CPNMU==="));
assertEquals("foob", fromBase32Hex("CPNMUOG="));
assertEquals("fooba", fromBase32Hex("CPNMUOJ1"));
assertEquals("foobar", fromBase32Hex("CPNMUOJ1E8======"));
}
@Test
public void testBase32Dmedia() {
assertEquals("", fromBase32Dmedia(""));
assertEquals("binary foo", fromBase32Dmedia("FCNPVRELI7J9FUUI"));
assertEquals("f", fromBase32Dmedia("FR======"));
assertEquals("fo", fromBase32Dmedia("FSQJ===="));
assertEquals("foo", fromBase32Dmedia("FSQPX==="));
assertEquals("foob", fromBase32Dmedia("FSQPXRJ="));
assertEquals("fooba", fromBase32Dmedia("FSQPXRM4"));
assertEquals("foobar", fromBase32Dmedia("FSQPXRM4HB======"));
}
@Test
public void testBase16() {
assertEquals("", fromBase16(""));
assertEquals("f", fromBase16("66"));
assertEquals("fo", fromBase16("666F"));
assertEquals("foo", fromBase16("666F6F"));
assertEquals("foob", fromBase16("666F6F62"));
assertEquals("fooba", fromBase16("666F6F6261"));
assertEquals("foobar", fromBase16("666F6F626172"));
}
@Test
public void testBase64Perf() {
if (isSkipPerfTests()) {
return;
}
byte[] bytes = new byte[1024 * 1024];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = 'Z';
}
long start = System.nanoTime();
for (int i = 0; i < 200; i++) {
fromBase64(bytes);
}
long end = System.nanoTime();
logger.info("Decoding 200MB Base64 took " + StringHelper.formatNanoDuration(end - start));
}
@Test
public void testBase32Perf() {
if (isSkipPerfTests()) {
logger.info("Not running performance tests as not enabled by system property " + PROP_RUN_PERF_TESTS);
return;
}
byte[] bytes = new byte[1024 * 1024];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = 'M';
}
long start = System.nanoTime();
for (int i = 0; i < 200; i++) {
fromBase32(bytes);
}
long end = System.nanoTime();
logger.info("Decoding 200MB Base32 took " + StringHelper.formatNanoDuration(end - start));
}
@Test
public void testBase32HexPerf() {
if (isSkipPerfTests()) {
logger.info("Not running performance tests as not enabled by system property " + PROP_RUN_PERF_TESTS);
return;
}
byte[] bytes = new byte[1024 * 1024];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = 'C';
}
long start = System.nanoTime();
for (int i = 0; i < 200; i++) {
fromBase32Hex(bytes);
}
long end = System.nanoTime();
logger.info("Decoding 200MB Base32Hex took " + StringHelper.formatNanoDuration(end - start));
}
@Test
public void testBase32DmediaPerf() {
if (isSkipPerfTests()) {
logger.info("Not running performance tests as not enabled by system property " + PROP_RUN_PERF_TESTS);
return;
}
long start = System.nanoTime();
byte[] bytes = new byte[1024 * 1024];
for (int i = 0; i < 200; i++) {
toBase32Hex(bytes);
}
long end = System.nanoTime();
logger.info("Encoding 200MB Base32Dmedia took " + StringHelper.formatNanoDuration(end - start));
}
@Test
public void testBase16Perf() {
if (isSkipPerfTests()) {
logger.info("Not running performance tests as not enabled by system property " + PROP_RUN_PERF_TESTS);
return;
}
byte[] bytes = new byte[1024 * 1024];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = '6';
}
long start = System.nanoTime();
for (int i = 0; i < 200; i++) {
fromBase16(bytes);
}
long end = System.nanoTime();
logger.info("Decoding 200MB Base16 took " + StringHelper.formatNanoDuration(end - start));
}
}