blob: b67361e2f00d8786bb89fd549decbbacfbd34e7e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.codehaus.groovy.runtime
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder
import static org.junit.Assert.assertEquals
import static org.junit.Assert.assertFalse
import static org.junit.Assert.assertTrue
class ResourceGroovyMethodsTest {
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder()
@Test
void test_Should_write_should_create_missing_directories_and_write() {
final String filename = "testing.txt"
File file = new File(temporaryFolder.getRoot().getAbsolutePath() + "\\foo\\bar\\" + filename)
String text = "foobar"
String encoding = "UTF-8"
ResourceGroovyMethods.write(file.createParentDirectories(), text, encoding)
assert file.getText(encoding) == text
}
@Test
void test_Should_write_String_to_File_using_default_encoding() {
File file = temporaryFolder.newFile()
String text = 'Hello World'
ResourceGroovyMethods.write(file, text)
assert file.text == text
}
@Test
void test_Should_write_String_to_File_using_specified_encoding() {
File file = temporaryFolder.newFile()
String text = "؁"
String encoding = 'UTF-8'
ResourceGroovyMethods.write(file, text, encoding)
assert file.getText(encoding) == text
}
@Test
void test_Should_write_String_and_bom_to_File_using_specified_encoding() {
File file = temporaryFolder.newFile()
String text = "؁"
String encoding = 'UTF-16LE'
ResourceGroovyMethods.write(file, text, encoding, true)
assert file.getBytes() == [-1, -2, 1, 6] as byte[]
}
@Test
void test_Should_append_ByteArray_to_File() {
File file = temporaryFolder.newFile()
file.write('Hello')
byte[] bytes = ' World'.bytes
ResourceGroovyMethods.append(file, bytes)
assert file.text == 'Hello World'
}
@Test
void test_Should_append_String_to_File_using_default_encoding() {
File file = temporaryFolder.newFile()
file.write('Hello')
ResourceGroovyMethods.append(file, ' World')
assert file.text == 'Hello World'
}
@Test
void test_Should_append_text_supplied_by_Reader_to_File_using_default_encoding() {
File file = temporaryFolder.newFile()
file.write('Hello')
Reader reader = new StringReader(' World')
ResourceGroovyMethods.append(file, reader)
assert file.text == 'Hello World'
}
@Test
void test_Should_append_text_supplied_by_Writer_to_File_using_default_encoding() {
File file = temporaryFolder.newFile()
file.write('Hello')
Writer writer = new StringWriter()
writer.append(' World')
ResourceGroovyMethods.append(file, writer)
assert file.text == 'Hello World'
}
@Test
void test_Should_append_String_to_File_using_specified_encoding() {
File file = temporaryFolder.newFile()
String encoding = 'UTF-8'
file.write('؁', encoding)
ResourceGroovyMethods.append(file, ' ؁', encoding)
assert file.getText(encoding) == '؁ ؁'
}
@Test
void test_Should_append_text_supplied_by_Reader_to_File_using_specified_encoding() {
File file = temporaryFolder.newFile()
String encoding = 'UTF-8'
file.write('؁', encoding)
Reader reader = new CharArrayReader([' ','؁'] as char[])
ResourceGroovyMethods.append(file, reader, encoding)
assert file.getText(encoding) == '؁ ؁'
}
@Test
void test_Should_append_text_supplied_by_Writer_to_File_using_specified_encoding() {
File file = temporaryFolder.newFile()
String encoding = 'UTF-8'
file.write('؁', encoding)
Writer writer = new CharArrayWriter()
writer.append(' ')
writer.append('؁')
ResourceGroovyMethods.append(file, writer, encoding)
assert file.getText(encoding) == '؁ ؁'
}
@Test
void test_Should_write_String_to_File_using_specified_encoding_with_bom() {
File file = temporaryFolder.newFile()
String text = "؁"
String encoding = 'UTF-16LE'
ResourceGroovyMethods.write(file, text, encoding, true)
assert file.getBytes() == [-1, -2, 1, 6] as byte[]
}
@Test
void test_Should_append_String_to_File_using_specified_encoding_with_bom() {
File file = temporaryFolder.newFile()
file.delete()
String encoding = 'UTF-16LE'
file.append('؁', encoding, true)
ResourceGroovyMethods.append(file, ' ؁', encoding, true)
assert file.getBytes() == [-1, -2, 1, 6, 32, 0, 1, 6] as byte[]
}
@Test
void test_Should_append_text_supplied_by_Reader_to_File_using_specified_encoding_with_bom() {
File file = temporaryFolder.newFile()
file.delete()
String encoding = 'UTF-16LE'
file.append('؁', encoding, true)
Reader reader = new CharArrayReader([' ','؁'] as char[])
ResourceGroovyMethods.append(file, reader, encoding, true)
assert file.getBytes() == [-1, -2, 1, 6, 32, 0, 1, 6] as byte[]
}
@Test
void test_Should_append_text_supplied_by_Writer_to_File_using_specified_encoding_with_bom() {
File file = temporaryFolder.newFile()
file.delete()
String encoding = 'UTF-16LE'
file.append('؁', encoding, true)
Writer writer = new CharArrayWriter()
writer.append(' ')
writer.append('؁')
ResourceGroovyMethods.append(file, writer, encoding, true)
assert file.getBytes() == [-1, -2, 1, 6, 32, 0, 1, 6] as byte[]
}
@Test
void testFileDirectorySizeExceptions() {
try {
ResourceGroovyMethods.directorySize(new File("doesn't exist"))
fail("directorySize() should fail when directory specified doesn't exist")
} catch (IOException ignore) {
}
File tempFile = File.createTempFile("testDirectorySizeExceptions", "")
try {
ResourceGroovyMethods.directorySize(tempFile)
fail("directorySize() should fail when a file is specified")
} catch (IllegalArgumentException ignore) {
}
tempFile.delete()
}
@Test
void testDirectorySize() {
File tempFile = File.createTempFile("__testDirectorySize__", "")
delete(tempFile)
File testDir = new File(tempFile.getAbsolutePath())
testDir.mkdirs()
final int nFiles = 3
final int maxFileSize = 102488
long totalSize = 0
Random r = new Random(new Random(System.currentTimeMillis()).nextLong())
for (int j = 0; j < nFiles; j++) {
int fileSize = r.nextInt(maxFileSize)
String path = (r.nextBoolean() ? "a/" : "") + (r.nextBoolean() ? "b/" : "") +
(r.nextBoolean() ? "c/" : "") + (r.nextBoolean() ? "d/" : "") +
(r.nextBoolean() ? "e/" : "") + (r.nextBoolean() ? "f" : "")
String filePath = String.format("%s/%s/%s", path, j, fileSize)
createFile(new File(testDir, filePath), fileSize)
totalSize += fileSize
}
assertEquals(totalSize, ResourceGroovyMethods.directorySize(testDir))
delete(testDir)
}
@Test
void testRelativePath() {
assertEquals("b", ResourceGroovyMethods.relativePath(new File("a"), new File("a/b")))
assertEquals("b/a", ResourceGroovyMethods.relativePath(new File("a"), new File("a/b/a")))
assertEquals("../b", ResourceGroovyMethods.relativePath(new File("a"), new File("b")))
assertEquals("../../b", ResourceGroovyMethods.relativePath(new File("a/b"), new File("b")))
assertEquals("", ResourceGroovyMethods.relativePath(new File("a"), new File("a")))
}
@Test
void test_asBoolean() {
File fileThatExists = temporaryFolder.newFile()
assertTrue(ResourceGroovyMethods.asBoolean(fileThatExists))
File fileThatDoesNotExist = temporaryFolder.newFile()
fileThatDoesNotExist.delete()
assertFalse(ResourceGroovyMethods.asBoolean(fileThatDoesNotExist))
}
/**
* Creates empty file of size specified.
*
* @param file file to create
* @param size file size
*/
private static void createFile(File file, int size) {
file.getParentFile().mkdirs()
try {
OutputStream os = new FileOutputStream(file)
os.write(new byte[size])
os.close()
} catch (IOException e) {
throw new RuntimeException(String.format("Failed to create [%s] of size [%s]: %s",
file.getAbsolutePath(), size, e),
e)
}
if (file.length() != size) {
throw new RuntimeException(String.format("Failed to create [%s] of size [%s]",
file.getAbsolutePath(), size))
}
}
/**
* Deletes file or directory specified. If directory is not empty, all its files are deleted as well.
*
* @param file file or directory to delete
*/
private static void delete(File file) {
if (file.isDirectory()) {
for (File f : file.listFiles()) {
delete(f)
}
}
if (!file.delete()) {
// Sometimes empty directory is not deleted on the first attempt
try {
Thread.sleep(1000)
} catch (InterruptedException ignored) {
}
if (!file.delete()) {
throw new RuntimeException(String.format("Failed to delete [%s]", file.getAbsolutePath()))
}
}
if (file.exists()) {
throw new RuntimeException(String.format("[%s] is not deleted", file.getAbsolutePath()))
}
}
}