/*
* Copyright [2014] [Christian Loehnert, krampenschiesser@gmail.com]
* 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 de.ks.file;
import com.google.common.base.Charsets;
import com.google.common.net.MediaType;
import de.ks.LauncherRunner;
import de.ks.activity.ActivityController;
import de.ks.activity.ActivityHint;
import de.ks.idnadrev.entity.Cleanup;
import de.ks.idnadrev.entity.FileReference;
import de.ks.idnadrev.entity.Thought;
import de.ks.idnadrev.thought.add.AddThoughtActivity;
import de.ks.option.Options;
import de.ks.persistence.PersistentWork;
import org.apache.commons.codec.digest.DigestUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.*;
@RunWith(LauncherRunner.class)
public class FileStoreTest {
private static final Logger log = LoggerFactory.getLogger(FileStoreTest.class);
private static final String TMPDIR = System.getProperty("java.io.tmpdir");
@Inject
FileStore fileStore;
@Inject
ActivityController controller;
@Inject
protected Cleanup cleanup;
private String fileStoreDir;
private static final String md5 = DigestUtils.md5Hex("hello world");
private static final String content = "hello world";
@Before
public void setUp() throws Exception {
controller.startOrResume(new ActivityHint(AddThoughtActivity.class));
cleanup.cleanup();
fileStoreDir = TMPDIR + File.separator + "idnadrevTestStore";
Options.store(fileStoreDir, FileOptions.class).getFileStoreDir();
File file = new File(fileStoreDir);
if (file.exists()) {
Files.walkFileTree(file.toPath(), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
}
}
@After
public void tearDown() throws Exception {
controller.stopAll();
}
protected File createTmpFile() throws IOException {
String tempFile = TMPDIR + File.separator + "input.txt";
log.info("Creating tempfile {}", tempFile);
File file = new File(tempFile);
file.createNewFile();
file.deleteOnExit();
com.google.common.io.Files.write(content, file, Charsets.US_ASCII);
return file;
}
@Test
public void testSaveFileWithThought() throws Exception {
final File file = createTmpFile();
FileReference fileReference = PersistentWork.read(em -> {
Thought bla = new Thought("bla");
em.persist(bla);
FileReference ref = null;
try {
ref = fileStore.getReference(file).get();
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
bla.getFiles().add(ref);
fileStore.scheduleCopy(ref, file);
return ref;
});
assertNotNull(fileReference.getMd5Sum());
assertEquals(fileReference.getMd5Sum(), md5);
log.info("Generated md5sum {}", fileReference.getMd5Sum());
String expectedFileStorePath = fileReference.getMd5Sum();
assertTrue(new File(fileStoreDir + File.separator + expectedFileStorePath).exists());
File reloaded = fileStore.getFile(fileReference);
assertTrue(reloaded + " does not exist", reloaded.exists());
PersistentWork.wrap(() -> {
Thought thought = PersistentWork.forName(Thought.class, "bla");
Set<FileReference> files = thought.getFiles();
assertEquals(1, files.size());
assertEquals(file.getName(), files.iterator().next().getName());
});
}
@Test
public void testExistingFile() throws Exception {
File file = createTmpFile();
Thought bla = new Thought("bla");
PersistentWork.persist(bla);
FileReference fileReference = fileStore.getReference(file).get();
PersistentWork.run(em -> {
Thought reload = PersistentWork.reload(bla);
reload.addFileReference(fileReference);
fileStore.scheduleCopy(fileReference, file);
em.persist(fileReference);
});
com.google.common.io.Files.write("hello sauerland", file, Charsets.US_ASCII);
FileReference newReference = fileStore.getReference(file).get();
fileStore.saveInFileStore(newReference, file);
assertEquals(fileReference.getId(), newReference.getId());
assertNotEquals(fileReference.getMd5Sum(), newReference.getMd5Sum());
File fileStoreFile = fileStore.getFile(newReference);
List<String> lines = com.google.common.io.Files.readLines(fileStoreFile, Charsets.US_ASCII);
assertEquals(1, lines.size());
assertEquals("hello sauerland", lines.get(0));
}
@Test
public void testGetFileReferences() throws Exception {
Path path = Files.createTempFile("img", ".jpg");
URL resource = getClass().getResource("/de/ks/idnadrev/entity/img.jpg");
Path src = Paths.get(resource.toURI());
Files.copy(src, path, StandardCopyOption.REPLACE_EXISTING);
File file = path.toFile();
file.deleteOnExit();
FileReference fileReference = fileStore.getReference(file).get();
PersistentWork.run(em -> {
fileStore.scheduleCopy(fileReference, file);
em.persist(fileReference);
});
assertThat(fileReference.getMimeType(), containsString("image"));
List<FileReference> references = fileStore.getFilesByMimeType(MediaType.ANY_IMAGE_TYPE);
assertEquals(1, references.size());
references = fileStore.getFilesByMimeType(MediaType.ANY_AUDIO_TYPE);
assertEquals(0, references.size());
references = fileStore.getFilesByMimeType(MediaType.ANY_TYPE);
assertEquals(1, references.size());
}
}