blob: 1ee550f86881dc8091a72b42bfcde15ed2e78376 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.security.tests.storage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.Random;
import org.eclipse.equinox.security.storage.EncodingUtils;
import org.junit.Test;
public class Base64Test {
/**
* Number of random-generated round trip tests to run
*/
final private static int RANDOM_ITERATIONS = 1000;
final private static String decoded1 = "sample^^*";
final private static String encoded1 = "c2FtcGxlXl4q";
final private static String decoded2 = "lazy frog jumped over sleeping dog";
final private static String encoded2 = "bGF6eSBmcm9nIGp1bXBlZCBvdmVyIHNsZWVwaW5nIGRvZw==";
final private static byte[] decoded3 = {5, 0, 0, 12, 32, 1, 127, (byte) 0xFF};
final private static String encoded3 = "BQAADCABf/8=";
final private static byte[] decoded4 = new byte[0];
final private static String encoded4 = "";
final private static String decoded5 = "1.234";
final private static String encoded5 = "M\05S4y\tM\n\rzQ=\r\n"; // tests invalid characters
final private static String decoded6 = "a";
final private static String encoded6 = "YQ=="; // tests array bounds
/**
* Tests encoding using hand-calculated examples.
*/
@Test
public void testHandCoded() {
String encoded = EncodingUtils.encodeBase64(decoded1.getBytes());
assertEquals(encoded1, encoded);
byte[] bytes = EncodingUtils.decodeBase64(encoded2);
String decoded = new String(bytes);
assertEquals(decoded2, decoded);
String testZeroes = EncodingUtils.encodeBase64(decoded3);
assertEquals(encoded3, testZeroes);
byte[] roundtripBytes = EncodingUtils.decodeBase64(testZeroes);
compareArrays(decoded3, roundtripBytes);
byte[] bytesInvalidChars = EncodingUtils.decodeBase64(encoded5);
String decodedInvalidChars = new String(bytesInvalidChars);
assertEquals(decoded5, decodedInvalidChars);
String shortSample = EncodingUtils.encodeBase64(decoded6.getBytes());
assertEquals(encoded6, shortSample);
assertEquals(decoded6, new String(EncodingUtils.decodeBase64(shortSample)));
}
/**
* Tests edge conditions: null or empty arguments
*/
@Test
public void testEdge() {
assertNull(EncodingUtils.encodeBase64(null));
assertNull(EncodingUtils.decodeBase64(null));
String encoded = EncodingUtils.encodeBase64(decoded4);
assertNotNull(encoded);
assertEquals(encoded4, encoded);
byte[] decoded = EncodingUtils.decodeBase64(encoded);
compareArrays(decoded4, decoded);
}
/**
* Tests round trip using large random sequences
*/
@Test
public void testRandom() {
Random generator = new Random(System.currentTimeMillis());
for (int i = 0; i < RANDOM_ITERATIONS; i++) {
// length of array is random in [100, 1000)
int length = 100 + generator.nextInt(900);
byte[] bytes = new byte[length];
generator.nextBytes(bytes);
// round trip
String encoded = EncodingUtils.encodeBase64(bytes);
byte[] decoded = EncodingUtils.decodeBase64(encoded);
compareArrays(bytes, decoded);
}
}
private void compareArrays(byte[] array1, byte[] array2) {
assertNotNull(array1);
assertNotNull(array2);
assertEquals(array1.length, array2.length);
for (int i = 0; i < array1.length; i++)
assertEquals(array1[i], array2[i]);
}
}