package org.peerbox.watchservice.filetree; import static org.junit.Assert.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.RandomStringUtils; import org.hive2hive.core.processes.files.list.FileNode; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.peerbox.app.DbContext; import org.peerbox.app.manager.file.FileInfo; import org.peerbox.utils.UserDbUtils; import org.peerbox.watchservice.PathUtils; import org.peerbox.watchservice.filetree.persistency.RemoteFileDao; public class RemoteFileDaoTest { private Path basePath; private Path dbFile; private RemoteFileDao dao; private DbContext dbContext; @Before public void setUp() throws Exception { basePath = Paths.get(FileUtils.getTempDirectoryPath(), RandomStringUtils.randomAlphabetic(12)); dbFile = Paths.get(FileUtils.getTempDirectoryPath(), String.format("%s.testdb", RandomStringUtils.randomAlphabetic(12))); dbContext = UserDbUtils.createDbContext(dbFile); dao = new RemoteFileDao(dbContext); } @After public void tearDown() throws Exception { // physical db file has suffix ".mv.db" Files.deleteIfExists(Paths.get(dbFile.toString() + ".mv.db")); } @Test public void testCreateTable() { // check that table does not exist dao.createTable(); assertTrue(dao.tableExists()); } @Test public void testDao() throws InterruptedException { dao.createTable(); // retrieved from db List<FileInfo> resultNodes = null; // nodes to store in DB List<FileNode> nodes = createNodeList(10); // store and retrieve dao.persistAndReplaceFileNodes(nodes); dao.dumpCsv(); resultNodes = dao.getAllFileNodeAttributes(); // check content checkGivenAndPersisted(resultNodes, nodes); // remove some nodes nodes.remove(8); nodes.remove(5); nodes.remove(3); // add another node Path newFile = basePath.resolve(RandomStringUtils.randomAlphabetic(12)); FileNode newNode = createFileNode(newFile, true, "new".getBytes()); nodes.add(newNode); // change hash Mockito.stub(nodes.get(0).getMd5()).toReturn("newhash".getBytes()); // store and retrieve again Thread.sleep(1000); dao.persistAndReplaceFileNodes(nodes); dao.dumpCsv(); resultNodes = dao.getAllFileNodeAttributes(); // check content again checkGivenAndPersisted(resultNodes, nodes); } /** * @param persistedNodes * @param givenNodes */ private void checkGivenAndPersisted(List<FileInfo> persistedNodes, List<FileNode> givenNodes) { // sort the arrays by path in order to compare the lists Collections.sort(givenNodes, new Comparator<FileNode>() { @Override public int compare(FileNode o1, FileNode o2) { return o1.getFile().toPath().compareTo(o2.getFile().toPath()); } }); Collections.sort(persistedNodes, new Comparator<FileInfo>() { @Override public int compare(FileInfo o1, FileInfo o2) { return o1.getPath().compareTo(o2.getPath()); } }); // compare retrieved and given information assertTrue(persistedNodes.size() == givenNodes.size()); for(int i = 0; i < persistedNodes.size(); ++i) { FileInfo attr = persistedNodes.get(i); FileNode node = givenNodes.get(i); assertEquals(attr.getPath(), node.getFile().toPath()); assertEquals(attr.isFile(), node.isFile()); if (attr.isFile()) { assertEquals(attr.getContentHash(), PathUtils.base64Encode(node.getMd5())); } else { assertEquals("", attr.getContentHash()); } } } private List<FileNode> createNodeList(int numNodes) { List<FileNode> nodes = new ArrayList<>(); // create some file nodes for(int i = 0; i < numNodes; ++i) { Path file = basePath.resolve(RandomStringUtils.randomAlphabetic(12)); boolean isFile = i % 2 == 0; byte[] hash = null; if (isFile) { hash = String.format("hash%d", i).getBytes(); } FileNode node = createFileNode(file, isFile, hash); nodes.add(node); } return nodes; } private FileNode createFileNode(Path file, boolean isFile, byte[] contentHash) { FileNode node = Mockito.mock(FileNode.class); Mockito.stub(node.getFile()).toReturn(file.toFile()); Mockito.stub(node.isFile()).toReturn(isFile); Mockito.stub(node.getMd5()).toReturn(contentHash); return node; } }