194 lines
5.5 KiB
Java
194 lines
5.5 KiB
Java
/*
|
|
* Copyright (C) 2007 The Guava Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.google.common.io;
|
|
|
|
import com.google.common.collect.Sets;
|
|
import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
|
import java.io.File;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.OutputStream;
|
|
import java.net.URL;
|
|
import java.util.Set;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
import junit.framework.TestCase;
|
|
|
|
/**
|
|
* Base test case class for I/O tests.
|
|
*
|
|
* @author Chris Nokleberg
|
|
* @author Colin Decker
|
|
*/
|
|
public abstract class IoTestCase extends TestCase {
|
|
|
|
private static final Logger logger = Logger.getLogger(IoTestCase.class.getName());
|
|
|
|
static final String I18N =
|
|
"\u00CE\u00F1\u0163\u00E9\u0072\u00F1\u00E5\u0163\u00EE\u00F6"
|
|
+ "\u00F1\u00E5\u013C\u00EE\u017E\u00E5\u0163\u00EE\u00F6\u00F1";
|
|
|
|
static final String ASCII =
|
|
" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
+ "[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
|
|
|
|
private File testDir;
|
|
private File tempDir;
|
|
|
|
private final Set<File> filesToDelete = Sets.newHashSet();
|
|
|
|
@Override
|
|
protected void tearDown() {
|
|
for (File file : filesToDelete) {
|
|
if (file.exists()) {
|
|
delete(file);
|
|
}
|
|
}
|
|
filesToDelete.clear();
|
|
}
|
|
|
|
private File getTestDir() throws IOException {
|
|
if (testDir != null) {
|
|
return testDir;
|
|
}
|
|
|
|
URL testFileUrl = IoTestCase.class.getResource("testdata/i18n.txt");
|
|
if (testFileUrl == null) {
|
|
throw new RuntimeException("unable to locate testdata directory");
|
|
}
|
|
|
|
if (testFileUrl.getProtocol().equals("file")) {
|
|
try {
|
|
File testFile = new File(testFileUrl.toURI());
|
|
testDir = testFile.getParentFile(); // the testdata directory
|
|
} catch (Exception ignore) {
|
|
// probably URISyntaxException or IllegalArgumentException
|
|
// fall back to copying URLs to files in the testDir == null block below
|
|
}
|
|
}
|
|
|
|
if (testDir == null) {
|
|
// testdata resources aren't file:// urls, so create a directory to store them in and then
|
|
// copy the resources to the filesystem as needed
|
|
testDir = createTempDir();
|
|
}
|
|
|
|
return testDir;
|
|
}
|
|
|
|
/** Returns the file with the given name under the testdata directory. */
|
|
protected final File getTestFile(String name) throws IOException {
|
|
File file = new File(getTestDir(), name);
|
|
if (!file.exists()) {
|
|
URL resourceUrl = IoTestCase.class.getResource("testdata/" + name);
|
|
if (resourceUrl == null) {
|
|
return null;
|
|
}
|
|
copy(resourceUrl, file);
|
|
}
|
|
|
|
return file;
|
|
}
|
|
|
|
/**
|
|
* Creates a new temp dir for testing. The returned directory and all contents of it will be
|
|
* deleted in the tear-down for this test.
|
|
*/
|
|
protected final File createTempDir() throws IOException {
|
|
File tempFile = File.createTempFile("IoTestCase", "");
|
|
if (!tempFile.delete() || !tempFile.mkdir()) {
|
|
throw new IOException("failed to create temp dir");
|
|
}
|
|
filesToDelete.add(tempFile);
|
|
return tempFile;
|
|
}
|
|
|
|
/**
|
|
* Gets a temp dir for testing. The returned directory and all contents of it will be deleted in
|
|
* the tear-down for this test. Subsequent invocations of this method will return the same
|
|
* directory.
|
|
*/
|
|
protected final File getTempDir() throws IOException {
|
|
if (tempDir == null) {
|
|
tempDir = createTempDir();
|
|
}
|
|
|
|
return tempDir;
|
|
}
|
|
|
|
/**
|
|
* Creates a new temp file in the temp directory returned by {@link #getTempDir()}. The file will
|
|
* be deleted in the tear-down for this test.
|
|
*/
|
|
protected final File createTempFile() throws IOException {
|
|
return File.createTempFile("test", null, getTempDir());
|
|
}
|
|
|
|
/** Returns a byte array of length size that has values 0 .. size - 1. */
|
|
static byte[] newPreFilledByteArray(int size) {
|
|
return newPreFilledByteArray(0, size);
|
|
}
|
|
|
|
/** Returns a byte array of length size that has values offset .. offset + size - 1. */
|
|
static byte[] newPreFilledByteArray(int offset, int size) {
|
|
byte[] array = new byte[size];
|
|
for (int i = 0; i < size; i++) {
|
|
array[i] = (byte) (offset + i);
|
|
}
|
|
return array;
|
|
}
|
|
|
|
private static void copy(URL url, File file) throws IOException {
|
|
InputStream in = url.openStream();
|
|
try {
|
|
OutputStream out = new FileOutputStream(file);
|
|
try {
|
|
byte[] buf = new byte[4096];
|
|
for (int read = in.read(buf); read != -1; read = in.read(buf)) {
|
|
out.write(buf, 0, read);
|
|
}
|
|
} finally {
|
|
out.close();
|
|
}
|
|
} finally {
|
|
in.close();
|
|
}
|
|
}
|
|
|
|
@CanIgnoreReturnValue
|
|
private boolean delete(File file) {
|
|
if (file.isDirectory()) {
|
|
File[] files = file.listFiles();
|
|
if (files != null) {
|
|
for (File f : files) {
|
|
if (!delete(f)) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!file.delete()) {
|
|
logger.log(Level.WARNING, "couldn't delete file: {0}", new Object[] {file});
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|