/*
* JBoss, Home of Professional Open Source
* Copyright 2011, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.richfaces.request;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;
import java.util.UUID;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.richfaces.util.StreamUtils;
/**
* @author Nick Belaevski
*
*/
public class FileUploadResourcesTest {
private FileUploadMemoryResource memoryResource;
private FileUploadDiscResource discResource;
private String memoryTempDirectory;
private String discTempDirectory;
private String createTempDirectory() {
File tmpDir = new File(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString());
if (!tmpDir.mkdirs()) {
fail();
}
return tmpDir.getAbsolutePath();
}
private void eraseDirectory(String location) {
File file = new File(location);
for (File f : file.listFiles()) {
f.delete();
}
file.delete();
}
private byte[] getRandomBytes(int size) {
byte[] bs = new byte[size];
new Random().nextBytes(bs);
return bs;
}
private byte[] readFully(InputStream is) throws IOException {
try {
return StreamUtils.toByteArray(is);
} finally {
try {
is.close();
} catch (IOException e) {
// Swallow
}
}
}
private byte[] readFully(File file) throws IOException {
assertNotNull(file);
return readFully(new FileInputStream(file));
}
private File getSingleFile(String location) {
File root = new File(location);
File[] files = root.listFiles();
switch (files.length) {
case 0:
return null;
case 1:
return files[0];
default:
throw new IllegalStateException("File is not single");
}
}
@Before
public void setUp() throws Exception {
memoryTempDirectory = createTempDirectory();
discTempDirectory = createTempDirectory();
memoryResource = new FileUploadMemoryResource("form:memoryUpload", memoryTempDirectory);
memoryResource.create();
discResource = new FileUploadDiscResource("form:discUpload", discTempDirectory);
discResource.create();
}
@After
public void tearDown() throws Exception {
eraseDirectory(memoryTempDirectory);
eraseDirectory(discTempDirectory);
memoryTempDirectory = null;
discTempDirectory = null;
memoryResource = null;
discResource = null;
}
@Test
public void testBasics() throws Exception {
int length = 5;
byte[] bytes = getRandomBytes(length);
memoryResource.handle(bytes, bytes.length);
discResource.handle(bytes, bytes.length);
memoryResource.complete();
discResource.complete();
assertTrue(memoryResource.isFileParam());
assertTrue(discResource.isFileParam());
InputStream is = null;
try {
is = memoryResource.getInputStream();
assertNotNull(is);
} finally {
try {
is.close();
} catch (IOException e) {
// Swallow
}
}
try {
is = discResource.getInputStream();
assertNotNull(is);
} finally {
try {
is.close();
} catch (IOException e) {
// Swallow
}
}
assertSame(memoryResource, memoryResource.getResource());
assertSame(discResource, discResource.getResource());
assertNull(memoryResource.getValue());
assertNull(discResource.getValue());
assertEquals("form:memoryUpload", memoryResource.getName());
assertEquals("form:discUpload", discResource.getName());
}
@Test
public void testSmallData() throws Exception {
// should be less than 128 - initial buffer size
int length = 68;
byte[] bytes = getRandomBytes(length);
memoryResource.handle(bytes, bytes.length);
discResource.handle(bytes, bytes.length);
memoryResource.complete();
discResource.complete();
checkResourcesContent(bytes);
}
@Test
public void testLargeData() throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int count = new Random().nextInt(256) + 256;
for (int i = 0; i < count; i++) {
int size = new Random().nextInt(512) + 512;
byte[] bytes = getRandomBytes(size);
memoryResource.handle(bytes, bytes.length);
discResource.handle(bytes, bytes.length);
baos.write(bytes);
}
memoryResource.complete();
discResource.complete();
checkResourcesContent(baos.toByteArray());
}
private void checkResourcesContent(byte[] expected) throws IOException {
int length = expected.length;
assertEquals(length, memoryResource.getSize());
assertEquals(length, discResource.getSize());
assertArrayEquals(expected, readFully(memoryResource.getInputStream()));
assertArrayEquals(expected, readFully(discResource.getInputStream()));
assertNull(getSingleFile(memoryTempDirectory));
assertArrayEquals(expected, readFully(getSingleFile(discTempDirectory)));
memoryResource.write("out");
discResource.write("out");
File memoryOutFile = getSingleFile(memoryTempDirectory);
File discOutFile = getSingleFile(discTempDirectory);
assertEquals("out", memoryOutFile.getName());
assertEquals("out", discOutFile.getName());
assertTrue(memoryOutFile.getAbsolutePath().startsWith(memoryTempDirectory));
assertTrue(discOutFile.getAbsolutePath().startsWith(discTempDirectory));
assertArrayEquals(expected, readFully(memoryOutFile));
assertArrayEquals(expected, readFully(discOutFile));
}
@Test
public void testDelete() throws Exception {
int length = 5;
byte[] bytes = getRandomBytes(length);
memoryResource.handle(bytes, bytes.length);
discResource.handle(bytes, bytes.length);
memoryResource.complete();
discResource.complete();
assertNull(getSingleFile(memoryTempDirectory));
assertNotNull(getSingleFile(discTempDirectory));
memoryResource.delete();
discResource.delete();
assertNull(getSingleFile(memoryTempDirectory));
assertNull(getSingleFile(discTempDirectory));
}
}