/*
* Copyright 2012-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file 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.amazonaws.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import org.apache.commons.io.IOUtils;
/**
* Helper class that helps in creating and writing data to temporary files.
*
*/
public class FileUtils {
static final int ASCII_LOW = 33; // '!', skipping space for readability
static final int ASCII_HIGH = 126;
// include a line break character
static final int modulo = ASCII_HIGH - ASCII_LOW + 2;
private static final Random rand = new Random();
/**
* Returns a reference to the file created with the given file name in the
* System's temporary directory.
*
* @param fileName
* @return a reference to the file
* @throws IOException
*/
public static File createTempFileForTesting(String fileName) throws IOException {
return File.createTempFile(String.valueOf(System.currentTimeMillis()),
fileName);
}
/**
* Creates a file with the given name in the System's temporary directory.
* Adds the data to the given file and returns the reference to the file.
*
* @param fileName
* @param data
* @return reference to the file.
* @throws IOException
*/
public static File createTempFileForTesting(String fileName, String data)
throws IOException {
return appendDataToTempFile(File.createTempFile(
String.valueOf(System.currentTimeMillis()), fileName), data);
}
/**
* Appends the given data to the file specified in the input and returns the
* reference to the file.
*
* @param file
* @param dataToAppend
* @return reference to the file.
* @throws IOException
*/
public static File appendDataToTempFile(File file, String dataToAppend)
throws IOException {
FileWriter outputWriter = new FileWriter(file);
try {
outputWriter.append(dataToAppend);
} finally {
outputWriter.close();
}
return file;
}
/**
* Generate a random ASCII file of the specified number of bytes. The ASCII
* characters ranges over all printable ASCII from 33 to 126 inclusive and
* LF '\n', intentionally skipping space for readability.
*/
public static File generateRandomAsciiFile(long byteSize)
throws IOException {
return generateRandomAsciiFile(byteSize, true);
}
public static File generateRandomAsciiFile(long byteSize,
boolean deleteOnExit) throws IOException {
File file = File.createTempFile("CryptoTestUtils", ".txt");
System.out.println("Generating random ASCII file with size: "
+ byteSize + " at " + file);
if (deleteOnExit)
file.deleteOnExit();
OutputStream out = new FileOutputStream(file);
int BUFSIZE = 1024 * 8;
byte[] buf = new byte[1024 * 8];
long counts = byteSize / BUFSIZE;
try {
while (counts-- > 0) {
IOUtils.write(fillRandomAscii(buf), out);
}
int remainder = (int) byteSize % BUFSIZE;
if (remainder > 0) {
buf = new byte[remainder];
IOUtils.write(fillRandomAscii(buf), out);
}
} finally {
out.close();
}
return file;
}
private static byte[] fillRandomAscii(byte[] bytes) {
rand.nextBytes(bytes);
for (int i = 0; i < bytes.length; i++) {
byte b = bytes[i];
if (b < ASCII_LOW || b > ASCII_HIGH) {
byte c = (byte) (b % modulo);
if (c < 0)
c = (byte) (c + modulo);
bytes[i] = (byte) (c + ASCII_LOW);
if (bytes[i] > ASCII_HIGH)
bytes[i] = (byte) '\n';
}
}
return bytes;
}
}