blob: 80b11ea6c1da734dff58625d163e7052eeb6ad77 [file] [log] [blame]
/**
*******************************************************************************
* Copyright (C) 2001-2004, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.dev.test;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public final class TestUtil {
/**
* Path to test data in icu4jtest.jar
*/
public static final String LOCAL_DATA_PATH = "/com/ibm/icu/dev/data/";
/**
* Standard path to the test data in the file system.
*/
public static final String DATA_PATH = "/src" + LOCAL_DATA_PATH;
/**
* Property for user-defined data path.
*/
public static final String DATA_PATH_PROPERTY = "ICUDataPath";
/**
* Property for modular build.
*/
public static final String DATA_MODULAR_BUILD_PROPERTY = "ICUModularBuild";
/**
* Compute a full data path using the ICUDataPath, if defined, or the user.dir, if we
* are allowed access to it.
*/
private static final String dataPath(String fileName) {
String s = System.getProperty(DATA_PATH_PROPERTY);
if (s == null) {
// assume user.dir is directly above src directory
// data path must end in '/' or '\', fileName should not start with one
s = System.getProperty("user.dir"); // protected property
s = s + DATA_PATH;
}
return s + fileName;
}
/**
* Return an input stream on the data file at path 'name' rooted at the data path
*/
public static final InputStream getDataStream(String name) throws IOException {
InputStream is = null;
try {
is = new FileInputStream(dataPath(name));
} catch (Throwable e) {
try {
is = TestUtil.class.getResourceAsStream(LOCAL_DATA_PATH + name);
} catch (Throwable t) {
IOException ex =
new IOException("data resource '" + name + "' not found");
//initCause API was introduced in JDK 1.4
//ex.initCause(t);
t.printStackTrace();
throw ex;
}
}
return is;
}
/**
* Return a buffered reader on the data file at path 'name' rooted at the data path.
*/
public static final BufferedReader getDataReader(String name, String charset) throws IOException {
InputStream is = getDataStream(name);;
InputStreamReader isr =
charset == null
? new InputStreamReader(is)
: new InputStreamReader(is, charset);
return new BufferedReader(isr);
}
/**
* Return a buffered reader on the data file at path 'name' rooted at the data path,
* using the provided encoding.
*/
public static final BufferedReader getDataReader(String name)
throws IOException {
return getDataReader(name, null);
}
static final char DIGITS[] =
{
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z' };
/**
* Return true if the character is NOT printable ASCII. The tab,
* newline and linefeed characters are considered unprintable.
*/
public static boolean isUnprintable(int c) {
return !(c >= 0x20 && c <= 0x7E);
}
/**
* Escape unprintable characters using <backslash>uxxxx notation
* for U+0000 to U+FFFF and <backslash>Uxxxxxxxx for U+10000 and
* above. If the character is printable ASCII, then do nothing
* and return FALSE. Otherwise, append the escaped notation and
* return TRUE.
*/
public static boolean escapeUnprintable(StringBuffer result, int c) {
if (isUnprintable(c)) {
result.append('\\');
if ((c & ~0xFFFF) != 0) {
result.append('U');
result.append(DIGITS[0xF & (c >> 28)]);
result.append(DIGITS[0xF & (c >> 24)]);
result.append(DIGITS[0xF & (c >> 20)]);
result.append(DIGITS[0xF & (c >> 16)]);
} else {
result.append('u');
}
result.append(DIGITS[0xF & (c >> 12)]);
result.append(DIGITS[0xF & (c >> 8)]);
result.append(DIGITS[0xF & (c >> 4)]);
result.append(DIGITS[0xF & c]);
return true;
}
return false;
}
static class Lock {
private int count;
synchronized void inc() {
++count;
}
synchronized void dec() {
--count;
}
synchronized int count() {
return count;
}
void go() {
try {
while (count() > 0) {
synchronized (this) {
notifyAll();
}
Thread.sleep(50);
}
} catch (InterruptedException e) {
}
}
}
static class TestThread extends Thread {
Lock lock;
Runnable target;
TestThread(Lock lock, Runnable target) {
this.lock = lock;
this.target = target;
lock.inc();
}
public void run() {
try {
synchronized (lock) {
lock.wait();
}
target.run();
} catch (InterruptedException e) {
}
lock.dec();
}
}
public static void runUntilDone(Runnable[] targets) {
if (targets == null) {
throw new IllegalArgumentException("targets is null");
}
if (targets.length == 0) {
return;
}
Lock lock = new Lock();
for (int i = 0; i < targets.length; ++i) {
new TestThread(lock, targets[i]).start();
}
lock.go();
}
}