/*
|
* CDDL HEADER START
|
*
|
* The contents of this file are subject to the terms of the
|
* Common Development and Distribution License, Version 1.0 only
|
* (the "License"). You may not use this file except in compliance
|
* with the License.
|
*
|
* You can obtain a copy of the license at
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
|
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
|
* See the License for the specific language governing permissions
|
* and limitations under the License.
|
*
|
* When distributing Covered Code, include this CDDL HEADER in each
|
* file and include the License file at
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
|
* add the following below this CDDL HEADER, with the fields enclosed
|
* by brackets "[]" replaced with your own identifying information:
|
* Portions Copyright [yyyy] [name of copyright owner]
|
*
|
* CDDL HEADER END
|
*
|
*
|
* Copyright 2006-2009 Sun Microsystems, Inc.
|
* Portions Copyright 2011 ForgeRock AS
|
*/
|
package org.opends.server.util;
|
|
import java.io.BufferedReader;
|
import java.io.BufferedWriter;
|
import java.io.File;
|
import java.io.FileReader;
|
import java.io.FileWriter;
|
import java.io.IOException;
|
import java.io.PrintWriter;
|
import java.io.RandomAccessFile;
|
import java.nio.ByteBuffer;
|
import java.nio.channels.FileChannel;
|
import java.nio.channels.FileLock;
|
import java.text.ParseException;
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.Collections;
|
import java.util.LinkedList;
|
import java.util.List;
|
|
import org.opends.server.TestCaseUtils;
|
import org.opends.server.types.ByteString;
|
import org.opends.server.types.ByteSequence;
|
import org.testng.Assert;
|
import org.testng.annotations.BeforeClass;
|
import org.testng.annotations.DataProvider;
|
import org.testng.annotations.Test;
|
|
/**
|
* This class defines a set of tests for the
|
* {@link org.opends.server.util.StaticUtils} class.
|
*/
|
public final class TestStaticUtils extends UtilTestCase {
|
// Lower case hex digit lookup table.
|
private static final char[] HEX_DIGITS_LOWER = new char[] { '0', '1',
|
'2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
|
|
// Upper case hex digit lookup table.
|
private static final char[] HEX_DIGITS_UPPER = new char[] { '0', '1',
|
'2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
|
|
// Lookup table for 8-bit strings.
|
private static final String[] BIT_STRINGS = new String[256];
|
static {
|
final char[] ZEROS = new char[] { '0', '0', '0', '0', '0', '0', '0',
|
'0' };
|
|
for (int i = 0; i < 256; i++) {
|
String bits = Integer.toBinaryString(i);
|
StringBuilder sb = new StringBuilder(8);
|
sb.append(ZEROS, 0, 8 - bits.length());
|
sb.append(bits);
|
BIT_STRINGS[i] = sb.toString();
|
}
|
}
|
|
/**
|
* Once-only initialization.
|
*
|
* @throws Exception
|
* If an unexpected error occurred.
|
*/
|
@BeforeClass
|
public void setUp() throws Exception {
|
}
|
|
/**
|
* Create test strings for the {@link StaticUtils#getBytes(String)}.
|
*
|
* @return Returns an array of test strings.
|
*/
|
@DataProvider(name = "getBytesTestData")
|
public Object[][] createGetBytesTestData() {
|
List<String> strings = new LinkedList<String>();
|
|
// Some simple strings.
|
strings.add("");
|
strings.add(" ");
|
strings.add("an ascii string");
|
|
// A string containing just UTF-8 1 byte sequences.
|
StringBuilder builder = new StringBuilder();
|
for (char c = '\u0000'; c < '\u0080'; c++) {
|
builder.append(c);
|
}
|
strings.add(builder.toString());
|
|
// A string containing UTF-8 1 and 2 byte sequences.
|
builder = new StringBuilder();
|
for (char c = '\u0000'; c < '\u0100'; c++) {
|
builder.append(c);
|
}
|
strings.add(builder.toString());
|
|
// A string containing UTF-8 1 and 6 byte sequences.
|
builder = new StringBuilder();
|
for (char c = '\u0000'; c < '\u0080'; c++) {
|
builder.append(c);
|
}
|
for (char c = '\uff00'; c != '\u0000'; c++) {
|
builder.append(c);
|
}
|
strings.add(builder.toString());
|
|
// Construct the array.
|
Object[][] data = new Object[strings.size()][];
|
for (int i = 0; i < strings.size(); i++) {
|
data[i] = new Object[] { strings.get(i) };
|
}
|
|
return data;
|
}
|
|
/**
|
* Tests the {@link StaticUtils#decodeUTF8(byte[])} method.
|
*
|
* @param inputString
|
* The input string.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "getBytesTestData")
|
public void testDecodeUTF8(String inputString) throws Exception
|
{
|
final byte[] bytes = inputString.getBytes("UTF-8");
|
Assert.assertEquals(StaticUtils.decodeUTF8(bytes), inputString);
|
}
|
|
/**
|
* Tests the {@link StaticUtils#getBytes(String)} method.
|
*
|
* @param inputString
|
* The input string.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "getBytesTestData")
|
public void testGetBytes(String inputString) throws Exception {
|
Assert.assertEquals(StaticUtils.getBytes(inputString), inputString
|
.getBytes("UTF-8"));
|
}
|
|
/**
|
* Tests the {@link StaticUtils#getBytes(char[])} method.
|
*
|
* @param inputString
|
* The input string.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "getBytesTestData")
|
public void testCharsToBytes(String inputString) throws Exception {
|
Assert.assertEquals(StaticUtils.getBytes(inputString.toCharArray()),
|
inputString.getBytes("UTF-8"));
|
}
|
|
/**
|
* Create test strings for the {@link StaticUtils#byteToHex(byte)}.
|
*
|
* @return Returns an array of test strings.
|
*/
|
@DataProvider(name = "byteToHexTestData")
|
public Object[][] createByteToHexTestData() {
|
Object[][] data = new Object[256][];
|
|
for (int i = 0; i < 256; i++) {
|
data[i] = new Object[] { new Byte((byte) i) };
|
}
|
|
return data;
|
}
|
|
/**
|
* Tests the {@link StaticUtils#byteToHex(byte)} method.
|
*
|
* @param b
|
* The input byte.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "byteToHexTestData")
|
public void testByteToHex(byte b) throws Exception {
|
char[] chars = new char[] { HEX_DIGITS_UPPER[(b & 0xf0) >> 4],
|
HEX_DIGITS_UPPER[b & 0x0f] };
|
|
String hex = new String(chars);
|
|
Assert.assertEquals(StaticUtils.byteToHex(b), hex);
|
}
|
|
/**
|
* Tests the {@link StaticUtils#byteToLowerHex(byte)} method.
|
*
|
* @param b
|
* The input byte.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "byteToHexTestData")
|
public void testByteToLowerHex(byte b) throws Exception {
|
char[] chars = new char[] { HEX_DIGITS_LOWER[(b & 0xf0) >> 4],
|
HEX_DIGITS_LOWER[b & 0x0f] };
|
|
String hex = new String(chars);
|
|
Assert.assertEquals(StaticUtils.byteToLowerHex(b), hex);
|
}
|
|
/**
|
* Tests the {@link StaticUtils#byteToASCII(byte)} method.
|
*
|
* @param b
|
* The input byte.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "byteToHexTestData")
|
public void testByteToASCII(byte b) throws Exception {
|
if (b < 32 || b > 126) {
|
Assert.assertEquals(StaticUtils.byteToASCII(b), ' ');
|
} else {
|
Assert.assertEquals(StaticUtils.byteToASCII(b), (char) b);
|
}
|
}
|
|
/**
|
* Create test strings for the {@link StaticUtils#bytesToHex(byte[])}.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "bytesToHexTestData")
|
public Object[][] createBytesToHexTestData() {
|
return new Object[][] {
|
{ null, "" },
|
{ new byte[0], "" },
|
{ new byte[] { 0x00 }, "00" },
|
{ new byte[] { 0x00, 0x7f, (byte) 0x80, (byte) 0xff },
|
"00 7F 80 FF" } };
|
}
|
|
/**
|
* Tests the {@link StaticUtils#bytesToHex(byte[])} method.
|
*
|
* @param bytes
|
* The input byte array.
|
* @param expected
|
* The expected result.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "bytesToHexTestData")
|
public void testBytesToHex(byte[] bytes, String expected)
|
throws Exception {
|
Assert.assertEquals(StaticUtils.bytesToHex(bytes), expected);
|
}
|
|
/**
|
* Tests the {@link StaticUtils#bytesToHex(java.nio.ByteBuffer)}
|
* method.
|
*
|
* @param bytes
|
* The input byte array.
|
* @param expected
|
* The expected result.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "bytesToHexTestData")
|
public void testBytesToHexByteBuffer(byte[] bytes, String expected)
|
throws Exception {
|
ByteBuffer buffer = (bytes != null) ? ByteBuffer.wrap(bytes) : null;
|
|
Assert.assertEquals(StaticUtils.bytesToHex(buffer), expected);
|
}
|
|
/**
|
* Tests the {@link StaticUtils#byteToBinary(byte)} method.
|
*
|
* @param b
|
* The input byte.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "byteToHexTestData")
|
public void testByteToBinary(byte b) throws Exception {
|
Assert.assertEquals(StaticUtils.byteToBinary(b), BIT_STRINGS[b & 0xff]);
|
}
|
|
/**
|
* Create test data for {@link StaticUtils#compare(byte[], byte[])}.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "compareBytesTestData")
|
public Object[][] createCompareBytesTestData() {
|
return new Object[][] {
|
{ null, null, 0 },
|
{ null, new byte[0], -1 },
|
{ new byte[0], null, 1 },
|
{ new byte[0], new byte[0], 0 },
|
{ new byte[] { 0x00 }, new byte[] { 0x00 }, 0 },
|
{ new byte[] { 0x01 }, new byte[] { 0x00 }, 1 },
|
{ new byte[] { 0x7f }, new byte[] { 0x00 }, 1 },
|
{ new byte[] { (byte) 0x80 }, new byte[] { 0x00 }, 1 },
|
{ new byte[] { (byte) 0xff }, new byte[] { 0x00 }, 1 },
|
{ new byte[] { 0x00 }, new byte[] { 0x01 }, -1 },
|
{ new byte[] { 0x00 }, new byte[] { 0x7f }, -1 },
|
{ new byte[] { 0x00 }, new byte[] { (byte) 0x80 }, -1 },
|
{ new byte[] { 0x00 }, new byte[] { (byte) 0xff }, -1 },
|
{ new byte[] { 0x00, 0x01, 0x02 },
|
new byte[] { 0x00, 0x01, 0x02 }, 0 },
|
{ new byte[] { 0x00, 0x01 }, new byte[] { 0x00, 0x01, 0x02 },
|
-1 },
|
{ new byte[] { 0x00, 0x01, 0x02 }, new byte[] { 0x00, 0x01 },
|
1 }, };
|
}
|
|
/**
|
* Tests the {@link StaticUtils#compare(byte[], byte[])} method.
|
*
|
* @param a
|
* The first byte array.
|
* @param a2
|
* The second byte array.
|
* @param expected
|
* The expected result.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "compareBytesTestData")
|
public void testCompareBytes(byte[] a, byte[] a2, int expected)
|
throws Exception {
|
int rc = StaticUtils.compare(a, a2);
|
|
if (expected < 0 && rc >= 0) {
|
Assert.fail("Expected negative result but got " + rc);
|
}
|
|
if (expected > 0 && rc <= 0) {
|
Assert.fail("Expected positive result but got " + rc);
|
}
|
|
if (expected == 0 && rc != 0) {
|
Assert.fail("Expected zero result but got " + rc);
|
}
|
}
|
|
/**
|
* Create test strings for the {@link StaticUtils#isDigit(char)}.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "isDigitTestData")
|
public Object[][] createIsDigitTestData() {
|
List<Object[]> data = new LinkedList<Object[]>();
|
|
for (char c = '0'; c <= '9'; c++) {
|
data.add(new Object[] { c, true });
|
}
|
|
data.add(new Object[] { ' ', false });
|
data.add(new Object[] { (char) ('0' - 1), false });
|
data.add(new Object[] { (char) ('9' + 1), false });
|
data.add(new Object[] { '\uFF10', false });
|
|
return data.toArray(new Object[2][]);
|
}
|
|
/**
|
* Tests the {@link StaticUtils#isDigit(char)} method.
|
*
|
* @param c
|
* The test char.
|
* @param result
|
* The expected result.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "isDigitTestData")
|
public void testIsDigit(char c, boolean result) throws Exception {
|
Assert.assertEquals(StaticUtils.isDigit(c), result);
|
}
|
|
/**
|
* Create test strings for the {@link StaticUtils#isAlpha(char)}.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "isAlphaTestData")
|
public Object[][] createIsAlphaTestData() {
|
List<Object[]> data = new LinkedList<Object[]>();
|
|
for (char c = 'a'; c <= 'z'; c++) {
|
data.add(new Object[] { c, true });
|
}
|
|
for (char c = 'A'; c <= 'Z'; c++) {
|
data.add(new Object[] { c, true });
|
}
|
|
for (char c = '0'; c <= '9'; c++) {
|
data.add(new Object[] { c, false });
|
}
|
|
data.add(new Object[] { ' ', false });
|
data.add(new Object[] { (char) ('a' - 1), false });
|
data.add(new Object[] { (char) ('z' + 1), false });
|
data.add(new Object[] { (char) ('A' - 1), false });
|
data.add(new Object[] { (char) ('Z' + 1), false });
|
data.add(new Object[] { '\u00D9', false });
|
|
return data.toArray(new Object[2][]);
|
}
|
|
/**
|
* Tests the {@link StaticUtils#isAlpha(char)} method.
|
*
|
* @param c
|
* The test char.
|
* @param result
|
* The expected result.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "isAlphaTestData")
|
public void testIsAlpha(char c, boolean result) throws Exception {
|
Assert.assertEquals(StaticUtils.isAlpha(c), result);
|
}
|
|
/**
|
* Create test strings for the {@link StaticUtils#isHexDigit(char)}.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "isHexDigitTestData")
|
public Object[][] createIsHexDigitTestData() {
|
List<Object[]> data = new LinkedList<Object[]>();
|
|
for (char c = 'a'; c <= 'f'; c++) {
|
data.add(new Object[] { c, true });
|
}
|
|
for (char c = 'A'; c <= 'F'; c++) {
|
data.add(new Object[] { c, true });
|
}
|
|
for (char c = '0'; c <= '9'; c++) {
|
data.add(new Object[] { c, true });
|
}
|
|
data.add(new Object[] { ' ', false });
|
data.add(new Object[] { (char) ('0' - 1), false });
|
data.add(new Object[] { (char) ('9' + 1), false });
|
data.add(new Object[] { (char) ('a' - 1), false });
|
data.add(new Object[] { (char) ('f' + 1), false });
|
data.add(new Object[] { (char) ('A' - 1), false });
|
data.add(new Object[] { (char) ('F' + 1), false });
|
data.add(new Object[] { '\u00D9', false });
|
|
return data.toArray(new Object[2][]);
|
}
|
|
/**
|
* Tests the {@link StaticUtils#isHexDigit(char)} method.
|
*
|
* @param c
|
* The test char.
|
* @param result
|
* The expected result.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "isHexDigitTestData")
|
public void testIsHexDigit(char c, boolean result) throws Exception {
|
Assert.assertEquals(StaticUtils.isHexDigit(c), result);
|
}
|
|
/**
|
* Create invalid test strings for the
|
* {@link StaticUtils#hexStringToByteArray(String)}.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "hexStringToByteArrayInvalidTestData")
|
public Object[][] createHexStringToByteArrayInvalidTestData() {
|
return new Object[][] { { "a" }, { "aaa" }, { "0/" }, { "0:" },
|
{ "0@" }, { "0G" }, { "0`" }, { "0g" } };
|
}
|
|
/**
|
* Tests the {@link StaticUtils#hexStringToByteArray(String)} method.
|
*
|
* @param hexString
|
* The test string.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(expectedExceptions = ParseException.class, dataProvider = "hexStringToByteArrayInvalidTestData")
|
public void testHexStringToByteArrayException(String hexString)
|
throws Exception {
|
StaticUtils.hexStringToByteArray(hexString);
|
}
|
|
/**
|
* Create test strings for the
|
* {@link StaticUtils#hexStringToByteArray(String)}.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "hexStringToByteArrayTestData")
|
public Object[][] createHexStringToByteArrayTestData() {
|
return new Object[][] { { null, new byte[0] }, { "", new byte[0] },
|
{ "00010f107f80ff", new byte[] { 0, 1, 15, 16, 127, -128, -1 } } };
|
}
|
|
/**
|
* Tests the {@link StaticUtils#hexStringToByteArray(String)} method.
|
*
|
* @param hexString
|
* The test string.
|
* @param bytes
|
* The expected byte array.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "hexStringToByteArrayTestData")
|
public void testHexStringToByteArray(String hexString, byte[] bytes)
|
throws Exception {
|
Assert.assertEquals(StaticUtils.hexStringToByteArray(hexString), bytes);
|
}
|
|
/**
|
* Create test strings for the
|
* {@link StaticUtils#needsBase64Encoding(String)}.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "needsBase64EncodingTestData")
|
public Object[][] createNeedsBase64EncodingTestData() {
|
List<Object[]> data = new LinkedList<Object[]>();
|
|
// Check SAFE-INIT-CHAR.
|
for (char c = '\u0000'; c < '\u0100'; c++) {
|
boolean result = false;
|
|
switch (c) {
|
case '\u0000':
|
case '\r':
|
case '\n':
|
case ' ':
|
case ':':
|
case '<':
|
result = true;
|
break;
|
default:
|
if (c >= '\u0080') {
|
result = true;
|
}
|
break;
|
}
|
|
String s = new String(new char[] { c, 'a', 'b', 'c' });
|
data.add(new Object[] { s, result });
|
}
|
|
// Check SAFE-CHAR.
|
for (char c = '\u0000'; c < '\u0100'; c++) {
|
boolean result = false;
|
|
switch (c) {
|
case '\u0000':
|
case '\r':
|
case '\n':
|
result = true;
|
break;
|
default:
|
if (c >= '\u0080') {
|
result = true;
|
}
|
break;
|
}
|
|
String s = new String(new char[] { 'a', 'b', c, 'c' });
|
data.add(new Object[] { s, result });
|
}
|
|
data.add(new Object[] { null, false });
|
data.add(new Object[] { "", false });
|
data.add(new Object[] { " ", true });
|
data.add(new Object[] { "abc ", true });
|
|
return data.toArray(new Object[2][]);
|
}
|
|
/**
|
* Tests the {@link StaticUtils#needsBase64Encoding(String)} method.
|
*
|
* @param s
|
* The test string.
|
* @param result
|
* The expected result.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "needsBase64EncodingTestData")
|
public void testNeedsBase64EncodingString(String s, boolean result)
|
throws Exception {
|
Assert.assertEquals(StaticUtils.needsBase64Encoding(s), result);
|
}
|
|
/**
|
* Tests the {@link StaticUtils#needsBase64Encoding(ByteSequence)} method.
|
*
|
* @param s
|
* The test string.
|
* @param result
|
* The expected result.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "needsBase64EncodingTestData")
|
public void testNeedsBase64EncodingBytes(String s, boolean result)
|
throws Exception {
|
ByteString bytes = s != null ? ByteString.valueOf(s) : null;
|
Assert.assertEquals(StaticUtils.needsBase64Encoding(bytes), result);
|
}
|
|
/**
|
* Create test strings for the
|
* {@link StaticUtils#isRelativePath(String)}.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "isRelativePathTestData")
|
public Object[][] createIsRelativePathTestData() {
|
String root = File.listRoots()[0].getPath();
|
return new Object[][] { { "", true }, { root, false },
|
{ root + "foo", false }, { "foo", true },
|
{ "foo" + File.separator + "bar", true },
|
{ root + "foo" + File.separator + "bar", false },
|
{ ".", true }, { "..", true },
|
{ root + "foo" + File.separator + ".", false },
|
{ root + "foo" + File.separator + "..", false } };
|
}
|
|
/**
|
* Tests the {@link StaticUtils#isRelativePath(String)} method.
|
*
|
* @param path
|
* The test string.
|
* @param result
|
* Expected result.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "isRelativePathTestData")
|
public void testIsRelativePath(String path, boolean result)
|
throws Exception {
|
Assert.assertEquals(StaticUtils.isRelativePath(path), result);
|
}
|
|
/**
|
* Create test lists for the {@link StaticUtils#listToArray(List)}.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "listToArrayTestData")
|
public Object[][] createListToArrayTestData() {
|
return new Object[][] { { null }, { new String[] {} },
|
{ new String[] { "aaa" } },
|
{ new String[] { "aaa", "bbb", "ccc" } } };
|
}
|
|
/**
|
* Tests the {@link StaticUtils#listToArray(List)} method.
|
*
|
* @param strings
|
* The test string list.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "listToArrayTestData")
|
public void testListToArray(String[] strings) throws Exception {
|
if (strings != null) {
|
List<String> list = new ArrayList<String>(strings.length);
|
for (String string : strings) {
|
list.add(string);
|
}
|
Assert.assertEquals(StaticUtils.listToArray(list), strings);
|
} else {
|
Assert.assertNull(StaticUtils.listToArray(null));
|
}
|
}
|
|
/**
|
* Tests the {@link StaticUtils#moveFile(java.io.File, java.io.File)}
|
* method.
|
*
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(expectedExceptions = IOException.class)
|
public void testMoveFileNonExistentSrc() throws Exception {
|
File src = File.createTempFile("src", null);
|
File dst = TestCaseUtils.createTemporaryDirectory("dst");
|
File newSrc = new File(dst, src.getName());
|
|
src.delete();
|
|
try {
|
StaticUtils.moveFile(src, dst);
|
} finally {
|
src.delete();
|
dst.delete();
|
newSrc.delete();
|
}
|
}
|
|
/**
|
* Tests the {@link StaticUtils#moveFile(java.io.File, java.io.File)}
|
* method.
|
*
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(expectedExceptions = IOException.class)
|
public void testMoveFileNonExistentDst() throws Exception {
|
File src = File.createTempFile("src", null);
|
File dst = TestCaseUtils.createTemporaryDirectory("dst");
|
File newSrc = new File(dst, src.getName());
|
|
dst.delete();
|
|
try {
|
StaticUtils.moveFile(src, dst);
|
} finally {
|
src.delete();
|
dst.delete();
|
newSrc.delete();
|
}
|
}
|
|
/**
|
* Tests the {@link StaticUtils#moveFile(java.io.File, java.io.File)}
|
* method.
|
*
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(expectedExceptions = IOException.class)
|
public void testMoveFileSrcNotFile() throws Exception {
|
File src = TestCaseUtils.createTemporaryDirectory("src");
|
File dst = TestCaseUtils.createTemporaryDirectory("dst");
|
File newSrc = new File(dst, src.getName());
|
|
try {
|
StaticUtils.moveFile(src, dst);
|
} finally {
|
src.delete();
|
dst.delete();
|
newSrc.delete();
|
}
|
}
|
|
/**
|
* Tests the {@link StaticUtils#moveFile(java.io.File, java.io.File)}
|
* method.
|
*
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(expectedExceptions = IOException.class)
|
public void testMoveFileDstNotDirectory() throws Exception {
|
File src = File.createTempFile("src", null);
|
File dst = File.createTempFile("dst", null);
|
File newSrc = new File(dst, src.getName());
|
|
try {
|
StaticUtils.moveFile(src, dst);
|
} finally {
|
src.delete();
|
dst.delete();
|
newSrc.delete();
|
}
|
}
|
|
/**
|
* Create test content for {@link StaticUtils#moveFile(File, File)}.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "moveFileTestData")
|
public Object[][] createMoveFileTestData() {
|
return new Object[][] { { new String[] {} }, { new String[] { "" } },
|
{ new String[] { "", "" } }, { new String[] { " " } },
|
{ new String[] { " ", "", " " } },
|
{ new String[] { "one two three", "four five six", "seven" } } };
|
}
|
|
/**
|
* Tests the {@link StaticUtils#moveFile(java.io.File, java.io.File)}
|
* method.
|
*
|
* @param lines
|
* The test file contents.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "moveFileTestData")
|
public void testMoveFile(String[] lines) throws Exception {
|
File src = File.createTempFile("src", null);
|
File dst = TestCaseUtils.createTemporaryDirectory("dst");
|
File newSrc = new File(dst, src.getName());
|
|
try {
|
// Generate contents.
|
PrintWriter writer = new PrintWriter(new BufferedWriter(
|
new FileWriter(src)));
|
|
for (String line : lines) {
|
writer.println(line);
|
}
|
writer.close();
|
|
// Move the file.
|
StaticUtils.moveFile(src, dst);
|
|
// Post conditions.
|
Assert.assertFalse(src.exists());
|
|
Assert.assertTrue(newSrc.exists());
|
|
BufferedReader reader = new BufferedReader(new FileReader(newSrc));
|
for (String line : lines) {
|
Assert.assertEquals(reader.readLine(), line);
|
}
|
Assert.assertNull(reader.readLine());
|
reader.close();
|
} finally {
|
src.delete();
|
dst.delete();
|
newSrc.delete();
|
}
|
}
|
|
/**
|
* Tests the {@link StaticUtils#renameFile(java.io.File, java.io.File)}
|
* method.
|
*
|
* @throws Exception If the test failed unexpectedly.
|
*/
|
@Test
|
public void testRenameFileNonExistentTarget() throws Exception {
|
File src = File.createTempFile("src", null);
|
File target = new File(src.getParentFile(), "target");
|
try {
|
if (target.exists()) {
|
target.delete();
|
assert(!target.exists());
|
}
|
StaticUtils.renameFile(src, target);
|
assert(!src.exists());
|
assert(target.exists());
|
} finally {
|
src.delete();
|
target.delete();
|
}
|
}
|
|
/**
|
* Tests the {@link StaticUtils#renameFile(java.io.File, java.io.File)}
|
* method.
|
*
|
* @throws Exception If the test failed unexpectedly.
|
*/
|
@Test
|
public void testRenameFileExistentTarget() throws Exception {
|
File src = File.createTempFile("src", null);
|
File target = File.createTempFile("target", null);
|
try {
|
StaticUtils.renameFile(src, target);
|
assert(!src.exists());
|
assert(target.exists());
|
} finally {
|
src.delete();
|
target.delete();
|
}
|
}
|
|
/**
|
* Tests the {@link StaticUtils#renameFile(java.io.File, java.io.File)}
|
* method. Renaming locked files is a problem on Windows but not so
|
* much on other platforms.
|
*
|
* @throws Exception If the test failed unexpectedly.
|
*/
|
@Test(groups={"windows"}, expectedExceptions=IOException.class)
|
public void testRenameFileLockedTarget() throws Exception {
|
File src = File.createTempFile("src", null);
|
File target = File.createTempFile("target", null);
|
FileChannel c = new RandomAccessFile(target, "rw").getChannel();
|
FileLock lock = c.lock();
|
try {
|
StaticUtils.renameFile(src, target);
|
} finally {
|
lock.release();
|
src.delete();
|
target.delete();
|
}
|
}
|
|
/**
|
* Tests the {@link StaticUtils#recursiveDelete(File)} method.
|
*
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test
|
public void testRecursiveDeleteNonExistent() throws Exception {
|
File src = File.createTempFile("src", null);
|
src.delete();
|
|
Assert.assertFalse(StaticUtils.recursiveDelete(src));
|
}
|
|
/**
|
* Tests the {@link StaticUtils#recursiveDelete(File)} method.
|
*
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test
|
public void testRecursiveDelete() throws Exception {
|
File dir0 = TestCaseUtils.createTemporaryDirectory("dst");
|
|
List<File> files = new LinkedList<File>();
|
|
File dir1 = new File(dir0, "one");
|
dir1.mkdir();
|
files.add(dir1);
|
|
File dir2 = new File(dir0, "two");
|
dir2.mkdir();
|
files.add(dir2);
|
|
File dir3 = new File(dir0, "three");
|
dir3.mkdir();
|
files.add(dir3);
|
|
File dir4 = new File(dir1, "four");
|
dir4.mkdir();
|
files.add(dir4);
|
|
File f1 = new File(dir1, "f1");
|
f1.createNewFile();
|
files.add(f1);
|
|
File f2 = new File(dir1, "f2");
|
f2.createNewFile();
|
files.add(f2);
|
|
File f3 = new File(dir2, "f3");
|
f3.createNewFile();
|
files.add(f3);
|
|
Assert.assertTrue(StaticUtils.recursiveDelete(dir0));
|
|
for (File f : files) {
|
Assert.assertFalse(f.exists());
|
}
|
}
|
|
/**
|
* Create test strings for the {@link StaticUtils#toLowerCase(String)}
|
* related methods.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "stringCaseConversionTestData")
|
public Object[][] createStringCaseConversionTestData() {
|
return new Object[][] {
|
{ null, null, null },
|
{ "", "", "" },
|
{ " ", " ", " " },
|
{ " a B c ", " a b c ", " A B C " },
|
{
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}|[]:;'<>?,./!@#$%^&*()_+",
|
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789{}|[]:;'<>?,./!@#$%^&*()_+",
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}|[]:;'<>?,./!@#$%^&*()_+" },
|
{ "some non-ascii \u00c0\u00e0\u00c6\u00e6\u00dd\u00fd",
|
"some non-ascii \u00e0\u00e0\u00e6\u00e6\u00fd\u00fd",
|
"SOME NON-ASCII \u00c0\u00c0\u00c6\u00c6\u00dd\u00dd" } };
|
}
|
|
/**
|
* Tests the {@link StaticUtils#toLowerCase(String)} method.
|
*
|
* @param input
|
* The test string.
|
* @param lower
|
* The test string in lower case.
|
* @param upper
|
* The test string in upper case.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "stringCaseConversionTestData")
|
public void testToLowerCaseString(String input, String lower, String upper)
|
throws Exception {
|
Assert.assertEquals(StaticUtils.toLowerCase(input), lower);
|
}
|
|
/**
|
* Tests the
|
* {@link StaticUtils#toLowerCase(ByteSequence, StringBuilder, boolean)}
|
* method.
|
*
|
* @param input
|
* The test string.
|
* @param lower
|
* The test string in lower case.
|
* @param upper
|
* The test string in upper case.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "stringCaseConversionTestData")
|
public void testToLowerCaseBytes(String input, String lower, String upper)
|
throws Exception {
|
ByteString bytes = input != null ? ByteString.valueOf(input) : null;
|
StringBuilder buffer = new StringBuilder();
|
StaticUtils.toLowerCase(bytes, buffer, false);
|
Assert.assertEquals(buffer.toString(), input != null ? lower : "");
|
}
|
|
/**
|
* Tests the {@link StaticUtils#toUpperCase(String)} method.
|
*
|
* @param input
|
* The test string.
|
* @param lower
|
* The test string in lower case.
|
* @param upper
|
* The test string in upper case.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "stringCaseConversionTestData")
|
public void testToUpperCaseString(String input, String lower, String upper)
|
throws Exception {
|
Assert.assertEquals(StaticUtils.toUpperCase(input), upper);
|
}
|
|
/**
|
* Tests the
|
* {@link StaticUtils#toUpperCase(byte[], StringBuilder, boolean)}
|
* method.
|
*
|
* @param input
|
* The test string.
|
* @param lower
|
* The test string in lower case.
|
* @param upper
|
* The test string in upper case.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "stringCaseConversionTestData")
|
public void testToUpperCaseBytes(String input, String lower, String upper)
|
throws Exception {
|
byte[] bytes = input != null ? input.getBytes("UTF-8") : null;
|
StringBuilder buffer = new StringBuilder();
|
StaticUtils.toUpperCase(bytes, buffer, false);
|
Assert.assertEquals(buffer.toString(), input != null ? upper : "");
|
}
|
|
/**
|
* Create test strings for the
|
* {@link StaticUtils#toRFC3641StringValue(StringBuilder, String)}
|
* method.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "toRFC3641StringValueTestData")
|
public Object[][] createToRFC3641StringValueTestData() {
|
return new Object[][] { { "", "\"\"" }, { " ", "\" \"" },
|
{ " a B c ", "\" a B c \"" },
|
{ " \"hello world\" ", "\" \"\"hello world\"\" \"" },
|
{ "\"\"\"", "\"\"\"\"\"\"\"\"" }, };
|
}
|
|
/**
|
* Tests the
|
* {@link StaticUtils#toRFC3641StringValue(StringBuilder, String)}
|
* method.
|
*
|
* @param input
|
* The test string.
|
* @param expected
|
* The expected result.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "toRFC3641StringValueTestData")
|
public void testToRFC3641StringValue(String input, String expected)
|
throws Exception {
|
StringBuilder builder = new StringBuilder();
|
StaticUtils.toRFC3641StringValue(builder, input);
|
Assert.assertEquals(builder.toString(), expected);
|
}
|
|
/**
|
* Create test lists for the
|
* {@link StaticUtils#listsAreEqual(List, List)} method.
|
*
|
* @return Returns an array of test data.
|
*/
|
@DataProvider(name = "listsAreEqualTestData")
|
public Object[][] createListsAreEqualTestData() {
|
return new Object[][] {
|
// Check null behaviour.
|
{ null, null, true },
|
{ null, Collections.emptyList(), false },
|
{ Collections.emptyList(), null, false },
|
|
// Check empty-list behaviour.
|
{ Collections.emptyList(), Collections.emptyList(), true },
|
{ Collections.singletonList(0), Collections.emptyList(), false },
|
{ Collections.emptyList(), Collections.singletonList(0), false },
|
|
// Check single-element behaviour.
|
{ Collections.singletonList(0), Collections.singletonList(0), true },
|
{ Collections.singletonList(0), Collections.singletonList(1), false },
|
|
// Check multi-element random access behaviour.
|
{ Arrays.asList(0, 1), Arrays.asList(0, 1), true },
|
{ Arrays.asList(0, 1), Arrays.asList(1, 0), false },
|
|
// ...With duplicates.
|
{ Arrays.asList(0, 1), Arrays.asList(0, 1, 1), false },
|
|
// Check multi-element sequential behaviour.
|
{ new LinkedList<Integer>(Arrays.asList(0, 1)),
|
new LinkedList<Integer>(Arrays.asList(0, 1)), true },
|
{ new LinkedList<Integer>(Arrays.asList(0, 1)),
|
new LinkedList<Integer>(Arrays.asList(1, 0)), false },
|
|
// ...With duplicates.
|
{ new LinkedList<Integer>(Arrays.asList(0, 1)),
|
new LinkedList<Integer>(Arrays.asList(0, 1, 1)), false } };
|
}
|
|
/**
|
* Tests the {@link StaticUtils#listsAreEqual(List, List)} method.
|
*
|
* @param list1
|
* The first list.
|
* @param list2
|
* The second list.
|
* @param result
|
* The expected equality result.
|
* @throws Exception
|
* If the test failed unexpectedly.
|
*/
|
@Test(dataProvider = "listsAreEqualTestData")
|
public void testListsAreEqual(List<?> list1, List<?> list2, boolean result)
|
throws Exception {
|
Assert.assertEquals(StaticUtils.listsAreEqual(list1, list2), result);
|
}
|
}
|