package org.netbeans.gradle.model.util;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.nio.charset.Charset;
import org.junit.Test;
import static org.junit.Assert.*;
public class TemporaryFileManagerTest {
private static final Charset UTF8 = Charset.forName("UTF-8");
private static byte[] readAll(InputStream input) throws IOException {
byte[] buffer = new byte[8 * 1024];
ByteArrayOutputStream result = new ByteArrayOutputStream(256);
int readCount = input.read(buffer);
while (readCount > 0) {
result.write(buffer, 0, readCount);
readCount = input.read(buffer);
}
return result.toByteArray();
}
private static byte[] readAll(File file) throws IOException {
FileInputStream fileStream = new FileInputStream(file);
try {
return readAll(fileStream);
} finally {
fileStream.close();
}
}
private static void assertContent(TemporaryFileRef fileRef, String expectedContent) throws IOException {
String fileContent = new String(readAll(fileRef.getFile()), UTF8.name());
assertEquals(expectedContent, fileContent);
}
private void testFileContainsText(String name, String content) throws Exception {
TemporaryFileRef fileRef = createRef(name, content);
try {
assertContent(fileRef, content);
} finally {
fileRef.close();
}
}
private TemporaryFileRef createRef(String name, String content) throws IOException {
return TemporaryFileManager.getDefault().createFile(name, content, UTF8);
}
@Test
public void testFileContainsTextEmpty() throws Exception {
testFileContainsText("testFileContainsTextEmpty", "");
}
@Test
public void testFileContainsTextNonEmpty() throws Exception {
testFileContainsText("testFileContainsTextNonEmpty", "EXPECTED FILE content: testFileContainsText");
}
@Test
public void testDeleteAfterClose() throws Exception {
String content = "EXPECTED FILE content: testMultipleRefs";
String name = "testMultipleRefs";
TemporaryFileRef fileRef1 = createRef(name, content);
File file;
try {
file = fileRef1.getFile();
} finally {
fileRef1.close();
}
assertFalse("File must be deleted after close.", file.exists());
}
@Test
public void testMultipleRefs() throws Exception {
String content = "EXPECTED FILE content: testMultipleRefs";
String name = "testMultipleRefs";
TemporaryFileRef fileRef1 = createRef(name, content);
try {
TemporaryFileRef fileRef2 = createRef(name, content);
try {
assertEquals(fileRef1.getFile(), fileRef2.getFile());
assertContent(fileRef2, content);
} finally {
fileRef2.close();
}
assertContent(fileRef1, content);
} finally {
fileRef1.close();
}
assertFalse("File must be deleted after close.", fileRef1.getFile().exists());
}
private void testModifiedContent(String name, byte[] modContent) throws Exception {
String content = "EXPECTED FILE content: testModifiedContent";
TemporaryFileRef fileRef1 = createRef(name, content);
fileRef1.close();
try {
RandomAccessFile fileContent = new RandomAccessFile(fileRef1.getFile(), "rw");
try {
fileContent.setLength(0);
fileContent.write(modContent);
} finally {
fileContent.close();
}
TemporaryFileRef fileRef2 = createRef(name, content);
try {
assertContent(fileRef2, content);
} finally {
fileRef2.close();
}
} finally {
fileRef1.getFile().delete();
}
}
@Test
public void testModifiedContentWithEmpty() throws Exception {
testModifiedContent("testModifiedContentWithEmpty", new byte[0]);
}
@Test
public void testModifiedContentWithNonEmpty() throws Exception {
testModifiedContent("testModifiedContentWithNonEmpty", new byte[]{1, 2, 3});
}
}