blob: f2a48799fb4a1d0f71aeb585f14cf9eaf9387bbd [file] [log] [blame]
package org.testng;
import java.io.File;
import java.io.IOException;
/**
* Assertion tool for File centric assertions.
* Conceptually this is an extension of {@link Assert}
* Presents assertion methods with a more natural parameter order.
* The order is always <B>actualValue</B>, <B>expectedValue</B> [, message].
*
* @author <a href='mailto:pmendelson@trueoutcomes.com'>Paul Mendelon</a>
* @since 5.6
* @version $Revision: 650 $, $Date: 2009-01-05 03:51:54 -0800 (Mon, 05 Jan 2009) $
*/
public class FileAssert {
/**
* Protect constructor since it is a static only class
*/
private FileAssert() {
// hide constructor
}
/**
* Asserts that a {@code tstvalue} is a proper directory. If it isn't,
* an AssertionError, with the given message, is thrown.
* @param tstvalue the file to evaluate
* @param message the assertion error message
*/
static public void assertDirectory(File tstvalue, String message) {
boolean condition=false;
try {
condition=tstvalue.isDirectory();
} catch(SecurityException e) {
failSecurity(e,tstvalue,fileType(tstvalue),"Directory", message);
}
if(!condition) {
failFile(tstvalue,fileType(tstvalue),"Directory", message);
}
}
static public void assertDirectory(File tstvalue) {
assertDirectory(tstvalue, null);
}
/**
* Asserts that a {@code tstvalue} is a proper directory. If it isn't,
* an AssertionError, with the given message, is thrown.
* @param tstvalue the file to evaluate
* @param message the assertion error message
*/
static public void assertFile(File tstvalue, String message) {
boolean condition=false;
try {
condition=tstvalue.isFile();
} catch(SecurityException e) {
failSecurity(e,tstvalue,fileType(tstvalue),"File", message);
}
if(!condition) {
failFile(tstvalue,fileType(tstvalue),"File", message);
}
}
/**
* @see #assertFile(File, String)
*/
static public void assertFile(File tstvalue) {
assertFile(tstvalue, null);
}
/**
* Asserts that a {@code tstvalue} is a file of exactly {@code expected} characters
* or a directory of exactly {@code expected} entries. If it isn't,
* an AssertionError, with the given message, is thrown.
* @param tstvalue the file to evaluate
* @param message the assertion error message
*/
static public void assertLength(File tstvalue, long expected, String message) {
long actual=-1L;
try {
actual=tstvalue.isDirectory()?tstvalue.list().length:tstvalue.length();
} catch(SecurityException e) {
failSecurity(e,tstvalue,String.valueOf(actual),String.valueOf(expected), message);
}
if(actual!=expected) {
failFile(tstvalue,String.valueOf(actual),String.valueOf(expected), message);
}
}
/**
* @see #assertLength(File, long, String)
*/
static public void assertLength(File tstvalue, long expected) {
assertLength(tstvalue, expected, null);
}
/**
* Asserts that a {@code tstvalue} is a file of at least {@code expected} characters
* or a directory of at least {@code expected} entries. If it isn't,
* an AssertionError, with the given message, is thrown.
* @param tstvalue the file to evaluate
* @param message the assertion error message
*/
static public void assertMinLength(File tstvalue, long expected, String message) {
long actual=-1L;
try {
actual=tstvalue.isDirectory()?tstvalue.list().length:tstvalue.length();
} catch(SecurityException e) {
failSecurity(e,tstvalue,String.valueOf(actual),"at least "+String.valueOf(expected), message);
}
if(actual<expected) {
failFile(tstvalue,String.valueOf(actual),"at least "+String.valueOf(expected), message);
}
}
/**
* @see #assertMinLength(File, long, String)
*/
static public void assertMinLength(File tstvalue, long expected) {
assertMinLength(tstvalue, expected, null);
}
/**
* Asserts that a {@code tstvalue} is a file of at most {@code expected} characters
* or a directory of at most {@code expected} entries. If it isn't,
* an AssertionError, with the given message, is thrown.
* @param tstvalue the file to evaluate
* @param message the assertion error message
*/
static public void assertMaxLength(File tstvalue, long expected, String message) {
long actual=-1L;
try {
actual=tstvalue.isDirectory()?tstvalue.list().length:tstvalue.length();
} catch(SecurityException e) {
failSecurity(e,tstvalue,String.valueOf(actual),"at most "+String.valueOf(expected), message);
}
if(actual>expected) {
failFile(tstvalue,String.valueOf(actual),"at most "+String.valueOf(expected), message);
}
}
/**
* @see #assertMaxLength(File, long, String)
*/
static public void assertMaxLength(File tstvalue, long expected) {
assertMaxLength(tstvalue, expected, null);
}
/**
* Asserts that a {@code tstvalue} is readable. If it isn't,
* an AssertionError, with the given message, is thrown.
* @param tstvalue the file to evaluate
* @param message the assertion error message
*/
static public void assertReadable(File tstvalue, String message) {
boolean condition=false;
try {
condition=tstvalue.canRead();
} catch(SecurityException e) {
failSecurity(e,tstvalue,fileAccess(tstvalue),"Read Access", message);
}
if(!condition) {
failFile(tstvalue,fileAccess(tstvalue),"Read Access", message);
}
}
/**
* @see #assertReadable(File, String)
*/
static public void assertReadable(File tstvalue) {
assertReadable(tstvalue, null);
}
/**
* Asserts that a {@code tstvalue} is writeable. If it isn't,
* an AssertionError, with the given message, is thrown.
* @param tstvalue the file to evaluate
* @param message the assertion error message
*/
static public void assertWriteable(File tstvalue, String message) {
boolean condition=false;
try {
condition=tstvalue.canWrite();
} catch(SecurityException e) {
failSecurity(e,tstvalue,fileAccess(tstvalue),"Write Access", message);
}
if(!condition) {
failFile(tstvalue,fileAccess(tstvalue),"Write Access", message);
}
}
/**
* @see #assertWriteable(File, String)
*/
static public void assertWriteable(File tstvalue) {
assertReadable(tstvalue, null);
}
/**
* Asserts that a {@code tstvalue} is readable and writeable. If it isn't,
* an AssertionError, with the given message, is thrown.
* @param tstvalue the file to evaluate
* @param message the assertion error message
*/
static public void assertReadWrite(File tstvalue, String message) {
boolean condition=false;
try {
condition=tstvalue.canRead() && tstvalue.canWrite();
} catch(SecurityException e) {
failSecurity(e,tstvalue,fileAccess(tstvalue),"Read/Write Access", message);
}
if(!condition) {
failFile(tstvalue,fileAccess(tstvalue),"Read/Write Access", message);
}
}
/**
* @see #assertReadWrite(File, String)
*/
static public void assertReadWrite(File tstvalue) {
assertReadWrite(tstvalue, null);
}
/**
* Fails a test with the given message and wrapping the original exception.
*
* @param message the assertion error message
* @param realCause the original exception
*/
static public void fail(String message, Throwable realCause) {
AssertionError ae = new AssertionError(message);
ae.initCause(realCause);
throw ae;
}
/**
* Fails a test with the given message.
* @param message the assertion error message
*/
static public void fail(String message) {
throw new AssertionError(message);
}
/**
* Fails a test with no message.
*/
static public void fail() {
fail(null);
}
/**
* Formats failure for file assertions
*/
private static void failFile(File path, String actual, String expected, String message) {
String formatted = "";
if(message != null) {
formatted = message + " ";
}
fail(formatted + "expected <" + expected +"> but was <" + toString(path) + ">"
+(expected!=null?"<" + expected +">":""));
}
/**
* @param tstvalue
* @param string
* @param string2
* @param message
*/
private static void failSecurity(Exception e, File path, String actual, String expected, String message) {
String formatted = "";
if(message != null) {
formatted = message + " ";
}
fail(formatted + "expected <" + expected +"> but was <" + toString(path) + ">"
+"<"
+ (e!=null && e.getMessage()!=null && e.getMessage().length()>0
?e.getMessage()
:"not authorized by JVM")
+ ">");
}
/**
* String representation of what sort of file {@code path} is.
*/
private static String fileType(File path) {
try {
if(!path.exists()) {
return "Non existant";
} else if (path.isDirectory()) {
return "Directory";
} else if (path.isFile()) {
return "File";
} else {
return "Special File";
}
} catch (SecurityException e) {
return "Unauthorized";
}
}
/**
* String representation of what sort of file {@code path} is.
*/
private static String fileAccess(File path) {
try {
if(!path.exists()) {
return "Non existant";
} else if (path.canWrite() && path.canRead()) {
return "Read/Write Access";
} else if (path.canRead()) {
return "Read only Access";
} else if (path.canWrite()) {
return "Write only Access";
} else {
return "No Access";
}
} catch (SecurityException e) {
return "Unauthorized";
}
}
private static String toString(File path) {
try {
return path.getCanonicalPath();
} catch(IOException e) {
return path.getAbsolutePath();
}
}
}