blob: 3b6f640adf33d52c712b6559beaa184f6085f5cb [file] [log] [blame] [raw]
package net.querz.nbt;
import junit.framework.TestCase;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigInteger;
import java.net.URL;
import java.nio.file.Files;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;
import java.util.function.Supplier;
public abstract class NBTTestCase extends TestCase {
@Override
public void tearDown() throws Exception {
super.tearDown();
TagFactory.unregisterCustomTag(90);
TagFactory.unregisterCustomTag(100);
TagFactory.unregisterCustomTag(110);
TagFactory.unregisterCustomTag(120);
cleanupTmpDir();
}
protected byte[] serialize(Tag tag) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (DataOutputStream dos = new DataOutputStream(baos)) {
tag.serialize(dos, 0);
} catch (IOException ex) {
ex.printStackTrace();
fail(ex.getMessage());
}
return baos.toByteArray();
}
protected Tag deserialize(byte[] data) {
try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data))) {
return Tag.deserialize(dis, 0);
} catch (IOException ex) {
ex.printStackTrace();
fail(ex.getMessage());
return null;
}
}
protected File getResourceFile(String name) {
URL resource = getClass().getClassLoader().getResource(name);
assertNotNull(resource);
return new File(resource.getFile());
}
protected Tag deserializeFromFile(String f) {
try (DataInputStream dis = new DataInputStream(new FileInputStream(getResourceFile(f)))) {
return Tag.deserialize(dis, 0);
} catch (IOException ex) {
ex.printStackTrace();
fail(ex.getMessage());
return null;
}
}
protected <T> void invokeSetValue(Tag<T> tag, T value) {
try {
Class<?> c = tag.getClass();
Method m;
while (c != Object.class) {
try {
m = c.getDeclaredMethod("setValue", Object.class);
m.setAccessible(true);
m.invoke(tag, value);
return;
} catch (NoSuchMethodException ex) {
c = c.getSuperclass();
}
}
} catch (IllegalAccessException | InvocationTargetException e) {
fail("unable to invoke setValue() on " + tag.getClass().getSimpleName());
}
fail("could not find setValue()");
}
@SuppressWarnings("unchecked")
protected <T> T invokeGetValue(Tag<T> tag) {
try {
Class<?> c = tag.getClass();
Method m;
while (c != Object.class) {
try {
m = c.getDeclaredMethod("getValue");
m.setAccessible(true);
return (T) m.invoke(tag);
} catch (NoSuchMethodException ex) {
c = c.getSuperclass();
}
}
} catch (IllegalAccessException | InvocationTargetException e) {
fail("unable to invoke getValue() on " + tag.getClass().getSimpleName());
}
fail("could not find getValue()");
return null;
}
protected void assertThrowsException(ExceptionRunnable r, Class<? extends Exception> e) {
assertThrowsException(r, e, false);
}
protected void assertThrowsException(ExceptionRunnable r, Class<? extends Exception> e, boolean printStackTrace) {
try {
r.run();
TestCase.fail();
} catch (Exception ex) {
if (printStackTrace) {
ex.printStackTrace();
}
TestCase.assertEquals(ex.getClass(), e);
}
}
protected void assertThrowsNoException(ExceptionRunnable r) {
try {
r.run();
} catch (Exception ex) {
ex.printStackTrace();
TestCase.fail("Threw exception " + ex.getClass().getName() + " with message \"" + ex.getMessage() + "\"");
}
}
protected void assertThrowsException(ExceptionSupplier r, Class<? extends Exception> e) {
assertThrowsException(r, e, false);
}
protected void assertThrowsException(ExceptionSupplier r, Class<? extends Exception> e, boolean printStackTrace) {
try {
r.run();
TestCase.fail();
} catch (Exception ex) {
if (printStackTrace) {
ex.printStackTrace();
}
TestCase.assertEquals(ex.getClass(), e);
}
}
protected <T, E extends Exception> T assertThrowsNoException(ExceptionSupplier<T, E> r) {
try {
return r.run();
} catch (Exception ex) {
ex.printStackTrace();
TestCase.fail("Threw exception " + ex.getClass().getName() + " with message \"" + ex.getMessage() + "\"");
}
return null;
}
protected void assertThrowsRuntimeException(Runnable r, Class<? extends Exception> e) {
assertThrowsRuntimeException(r, e, false);
}
protected void assertThrowsRuntimeException(Runnable r, Class<? extends Exception> e, boolean printStackTrace) {
try {
r.run();
TestCase.fail();
} catch (Exception ex) {
if (printStackTrace) {
ex.printStackTrace();
}
TestCase.assertEquals(e, ex.getClass());
}
}
protected void assertThrowsRuntimeException(Runnable r, boolean printStackTrace) {
try {
r.run();
TestCase.fail();
} catch (Exception ex) {
if (printStackTrace) {
ex.printStackTrace();
}
}
}
@SuppressWarnings("unused")
protected void assertThrowsNoRuntimeException(Runnable r) {
Void v = assertThrowsNoRuntimeException(() -> {
r.run();
return null;
});
}
protected <T> T assertThrowsNoRuntimeException(Supplier<T> r) {
try {
return r.get();
} catch (Exception ex) {
ex.printStackTrace();
TestCase.fail("Threw exception " + ex.getClass().getName() + " with message \"" + ex.getMessage() + "\"");
}
return null;
}
protected File getNewTmpFile(String name) {
String workingDir = System.getProperty("user.dir");
File tmpDir = new File(workingDir, "tmp");
if (!tmpDir.exists()) {
tmpDir.mkdirs();
}
File tmpFile = new File(tmpDir, name);
if (tmpFile.exists()) {
tmpFile = new File(tmpDir, UUID.randomUUID() + name);
}
return tmpFile;
}
protected File copyResourceToTmp(String resource) {
URL resFileURL = getClass().getClassLoader().getResource(resource);
TestCase.assertNotNull(resFileURL);
File resFile = new File(resFileURL.getFile());
File tmpFile = getNewTmpFile(resource);
assertThrowsNoException(() -> Files.copy(resFile.toPath(), tmpFile.toPath()));
return tmpFile;
}
protected void cleanupTmpDir() {
String workingDir = System.getProperty("user.dir");
File tmpDir = new File(workingDir, "tmp");
File[] tmpFiles = tmpDir.listFiles();
if (tmpFiles != null && tmpFiles.length != 0) {
for (File file : tmpFiles) {
file.delete();
}
}
}
protected String calculateFileMD5(File file) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException ex) {
TestCase.fail(ex.getMessage());
}
try (BufferedInputStream bis = new BufferedInputStream(Files.newInputStream(file.toPath()))) {
byte[] buffer = new byte[8192];
int numRead;
do {
numRead = bis.read(buffer);
if (numRead > 0) {
md.update(buffer, 0, numRead);
}
} while (numRead != -1);
} catch (IOException ex) {
TestCase.fail(ex.getMessage());
}
return byteArrayToHexString(md.digest());
}
protected String byteArrayToHexString(byte[] bytes) {
BigInteger bi = new BigInteger(1, bytes);
return String.format("%0" + (bytes.length << 1) + "X", bi);
}
}