package org.peerbox.app.manager.file;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.times;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.hive2hive.core.api.configs.FileConfiguration;
import org.hive2hive.core.api.interfaces.IFileConfiguration;
import org.hive2hive.core.api.interfaces.IH2HNode;
import org.hive2hive.core.exceptions.NoPeerConnectionException;
import org.hive2hive.core.exceptions.NoSessionException;
import org.hive2hive.core.model.IFileVersion;
import org.hive2hive.core.model.PermissionType;
import org.hive2hive.core.processes.files.list.FileNode;
import org.hive2hive.core.processes.files.recover.IVersionSelector;
import org.hive2hive.processframework.exceptions.InvalidProcessStateException;
import org.hive2hive.processframework.exceptions.ProcessExecutionException;
import org.hive2hive.processframework.interfaces.IProcessComponent;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.peerbox.BaseJUnitTest;
import org.peerbox.app.config.UserConfig;
import org.peerbox.app.manager.ProcessHandle;
import org.peerbox.app.manager.node.INodeManager;
public class FileManagerTest extends BaseJUnitTest {
private Path rootPath;
private Path file;
private UserConfig userConfig;
private IH2HNode h2hNode;
private INodeManager nodeManager;
private org.hive2hive.core.api.interfaces.IFileManager h2hFileManager;
private IFileManager fileManager;
// process to return
private IProcessComponent<Void> process;
@SuppressWarnings("unchecked")
@Before
public void setUp() throws Exception {
rootPath = Paths.get(FileUtils.getTempDirectoryPath(), "PeerWasp_TestRootPath");
file = rootPath.resolve("aFile.txt");
userConfig = Mockito.mock(UserConfig.class);
Mockito.stub(userConfig.getRootPath()).toReturn(rootPath);
nodeManager = Mockito.mock(INodeManager.class);
h2hNode = Mockito.mock(IH2HNode.class);
h2hFileManager = Mockito.mock(org.hive2hive.core.api.interfaces.IFileManager.class);
process = Mockito.mock(IProcessComponent.class);
Mockito.stub(h2hNode.getFileManager()).toReturn(h2hFileManager);
Mockito.stub(nodeManager.getNode()).toReturn(h2hNode);
fileManager = new FileManager(nodeManager, userConfig);
}
@After
public void tearDown() throws Exception {
nodeManager = null;
fileManager = null;
}
@Test
public void testAdd() throws NoSessionException, NoPeerConnectionException {
Mockito.stub(h2hFileManager.createAddProcess(any())).toReturn(process);
ProcessHandle<Void> p = fileManager.add(file);
assertNotNull(p);
assertNotNull(p.getProcess());
assertEquals(process, p.getProcess());
Mockito.verify(h2hFileManager, times(1)).createAddProcess(file.toFile());
Mockito.verifyNoMoreInteractions(h2hFileManager);
}
@Test
public void testUpdate() throws NoSessionException, NoPeerConnectionException {
Mockito.stub(h2hFileManager.createUpdateProcess(any())).toReturn(process);
ProcessHandle<Void> p = fileManager.update(file);
assertNotNull(p);
assertNotNull(p.getProcess());
assertEquals(process, p.getProcess());
Mockito.verify(h2hFileManager, times(1)).createUpdateProcess(file.toFile());
Mockito.verifyNoMoreInteractions(h2hFileManager);
}
@Test
public void testDelete() throws NoSessionException, NoPeerConnectionException, IllegalArgumentException {
Mockito.stub(h2hFileManager.createDeleteProcess(any())).toReturn(process);
ProcessHandle<Void> p = fileManager.delete(file);
assertNotNull(p);
assertNotNull(p.getProcess());
assertEquals(process, p.getProcess());
Mockito.verify(h2hFileManager, times(1)).createDeleteProcess(file.toFile());
Mockito.verifyNoMoreInteractions(h2hFileManager);
}
@Test
public void testMove() throws NoSessionException, NoPeerConnectionException {
Mockito.stub(h2hFileManager.createMoveProcess(any(), any())).toReturn(process);
Path dst = rootPath.resolve("moveDst.txt");
ProcessHandle<Void> p = fileManager.move(file, dst);
assertNotNull(p);
assertNotNull(p.getProcess());
assertEquals(process, p.getProcess());
Mockito.verify(h2hFileManager, times(1)).createMoveProcess(file.toFile(), dst.toFile());
Mockito.verifyNoMoreInteractions(h2hFileManager);
}
@Test
public void testDownload() throws NoPeerConnectionException, NoSessionException, IllegalArgumentException {
Mockito.stub(h2hFileManager.createDownloadProcess(any())).toReturn(process);
ProcessHandle<Void> p = fileManager.download(file);
assertNotNull(p);
assertNotNull(p.getProcess());
assertEquals(process, p.getProcess());
Mockito.verify(h2hFileManager, times(1)).createDownloadProcess(file.toFile());
Mockito.verifyNoMoreInteractions(h2hFileManager);
}
@Test
public void testRecover() throws NoSessionException, NoPeerConnectionException {
Mockito.stub(h2hFileManager.createRecoverProcess(any(), any())).toReturn(process);
IVersionSelector version = new IVersionSelector() {
@Override
public IFileVersion selectVersion(List<IFileVersion> availableVersions) {
return null;
}
@Override
public String getRecoveredFileName(String fullName, String name, String extension) {
return null;
}
};
ProcessHandle<Void> p = fileManager.recover(file, version);
assertNotNull(p);
assertNotNull(p.getProcess());
assertEquals(process, p.getProcess());
Mockito.verify(h2hFileManager, times(1)).createRecoverProcess(file.toFile(), version);
Mockito.verifyNoMoreInteractions(h2hFileManager);
}
@Test
public void testShare() throws NoSessionException, NoPeerConnectionException, IllegalArgumentException, InvalidProcessStateException, ProcessExecutionException {
Mockito.stub(h2hFileManager.createShareProcess(any(), any(), any())).toReturn(process);
String user = "otherUser";
PermissionType permission = PermissionType.READ;
ProcessHandle<Void> p = fileManager.share(file, user, permission);
assertNotNull(p);
assertNotNull(p.getProcess());
assertEquals(process, p.getProcess());
Mockito.verify(h2hFileManager, times(1)).createShareProcess(file.toFile(), user, permission);
Mockito.verifyNoMoreInteractions(h2hFileManager);
}
@Test
public void testListFiles() throws NoPeerConnectionException, NoSessionException {
@SuppressWarnings("unchecked")
IProcessComponent<FileNode> listFiles = (IProcessComponent<FileNode>)Mockito.mock(IProcessComponent.class);
Mockito.stub(h2hFileManager.createFileListProcess()).toReturn(listFiles);
ProcessHandle<FileNode> p = fileManager.listFiles();
assertNotNull(p);
assertNotNull(p.getProcess());
assertEquals(listFiles, p.getProcess());
Mockito.verify(h2hFileManager, times(1)).createFileListProcess();
Mockito.verifyNoMoreInteractions(h2hFileManager);
}
@Test
public void testExistsRemote() throws IOException {
// see FileManagerNetworkTest
}
@Test
public void testIsSmallFile() throws IOException {
IFileConfiguration fileConf = FileConfiguration.createDefault();
Mockito.stub(nodeManager.getFileConfiguration()).toReturn(fileConf);
int size = -1 + fileConf.getMaxFileSize().intValue();
String content = RandomStringUtils.randomAlphanumeric(size);
Path smallFile = rootPath.resolve("smallFile.txt");
FileUtils.writeStringToFile(smallFile.toFile(), content);
assertTrue(fileManager.isSmallFile(smallFile));
assertFalse(fileManager.isLargeFile(smallFile));
Files.deleteIfExists(smallFile);
}
@Test
public void testIsLargeFile() throws IOException {
IFileConfiguration fileConf = FileConfiguration.createDefault();
Mockito.stub(nodeManager.getFileConfiguration()).toReturn(fileConf);
int size = 1 + fileConf.getMaxFileSize().intValue();
String content = RandomStringUtils.randomAlphanumeric(size);
Path largeFile = rootPath.resolve("smallFile.txt");
FileUtils.writeStringToFile(largeFile.toFile(), content);
assertFalse(fileManager.isSmallFile(largeFile));
assertTrue(fileManager.isLargeFile(largeFile));
Files.deleteIfExists(largeFile);
}
}