//package org.peerbox.watchservice;
//
//import static org.junit.Assert.assertNotNull;
//import static org.junit.Assert.assertNull;
//import static org.junit.Assert.assertTrue;
//
//import java.io.File;
//import java.io.IOException;
//import java.io.RandomAccessFile;
//import java.nio.file.Files;
//import java.nio.file.Paths;
//import java.util.ArrayList;
//
//import org.apache.commons.io.FileUtils;
//import org.junit.AfterClass;
//import org.junit.Before;
//import org.junit.BeforeClass;
//import org.junit.Test;
//import org.mockito.Mockito;
//import org.peerbox.app.manager.file.IFileManager;
//import org.peerbox.watchservice.filetree.FileTree;
//import org.peerbox.watchservice.filetree.composite.FileComponent;
//import org.peerbox.watchservice.integration.TestPeerWaspConfig;
//
////import com.google.common.io.Files;
//
//public class FileWalkerTestWhenFolderCreated {
//
// private static IFileManager fileManager;
//
// private static ActionExecutor actionExecutor;
//
// private static TestPeerWaspConfig config = new TestPeerWaspConfig();
//
// private static String parentPath = System.getProperty("user.home") + File.separator + "PeerWasp_FileWalkerTest" + File.separator;
//
// private static String dir1Str = parentPath + "dir1" + File.separator;
// private static String dir2Str = parentPath + "dir2" + File.separator;
// private static String file1Str = dir1Str + "file1";
// private static String file2Str = dir1Str + "file2";
// private static String dir1NewStr = dir2Str + "dir1" + File.separator;
// private static String file1NewStr = dir1NewStr + "file1";
// private static String file2NewStr = dir1NewStr + "file2";
// private static String file1RootStr = parentPath + "file1";
//
// private static File testDirectory;
// private static File dir1;
// private static File dir2;
//
// private static RandomAccessFile randfile1;
// private static File file1;
// private static File file2;
// private static File file1New;
// private static File file2New;
// private static File file1Root;
// private static File dir1New;
//
//
// private static FileEventManager manager;
// private static FileTree fileTree;
// private static FolderWatchService watchService;
//
// @BeforeClass
// public static void staticSetup(){
// testDirectory = new File(parentPath);
// testDirectory.mkdir();
// fileTree = new FileTree(Paths.get(parentPath), false);
// manager = new FileEventManager(fileTree, null);
// fileManager = Mockito.mock(IFileManager.class);
// actionExecutor = new ActionExecutor(manager, fileManager, config);
// actionExecutor.setWaitForActionCompletion(false);
// actionExecutor.start();
//
// dir1 = new File(dir1Str);
// dir2 = new File(dir2Str);
// file1 = new File(file1Str);
// file2 = new File(file2Str);
// file1New = new File(file1NewStr);
// file2New = new File(file2NewStr);
// file1Root = new File(file1RootStr);
// dir1New = new File(dir1NewStr);
// dir1.mkdir();
// dir2.mkdir();
//
// try {
// file1.createNewFile();
// randfile1 = new RandomAccessFile(file1Str, "rw");
// randfile1.setLength(1024);
// randfile1.close();
// file2.createNewFile();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// try {
// watchService = new FolderWatchService();
// watchService.addFileEventListener(manager);
// watchService.start(Paths.get(parentPath));
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// }
//
// @Before
// public void setup(){
// try {
// Thread.sleep(config.getAggregationIntervalInMillis() * 2);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
//
// @AfterClass
// public static void rollback() throws Exception{
// watchService.stop();
// file1.delete();
// file2.delete();
// //dirA.delete();
// dir1.delete();
// dir2.delete();
// testDirectory.delete();
//
// try {
// FileUtils.deleteDirectory(testDirectory);
// } catch (IOException e) {
// e.printStackTrace();
// }
// //assertTrue(testDirectory.delete());
//
// }
//
// /**
// * This test should detect the following directory move:
// *
// * root root
// * | |
// * --------------- ---------
// * | | |
// * dir1 dir2 dir2
// * | |
// * --------- => dir1
// * | | |
// * file1 file2 -----------
// * | |
// * file1 file2
// *
// * @throws InterruptedException
// *
// */
// @Test @Deprecated
// public void testFolderMoveDetection() throws InterruptedException{
// try {
// manager.onLocalFileCreated(dir1.toPath());
// manager.onLocalFileCreated(file1.toPath());
// manager.onLocalFileCreated(file2.toPath());
// manager.onLocalFileCreated(dir2.toPath());
// Thread.sleep(config.getAggregationIntervalInMillis() * 2);
// assertTrue(manager.getFileTree().getDeletedByContentHash().size() == 0);
// assertTrue(manager.getFileComponentQueue().size() == 0);
//
// Files.move(dir1.toPath(), dir1New.toPath());
// Thread.sleep(10);
//
// assertTrue(manager.getFileTree().getDeletedByContentHash().size() == 0);
// assertTrue(manager.getFileTree().getDeletedByStructureHash().size() == 0);
// assertTrue(manager.getFileComponentQueue().size() == 1);
//
// //Ensure old files are removed and new ones appended to the tree
// assertNull(manager.getFileTree().getFile(dir1.toPath()));
// assertNull(manager.getFileTree().getFile(file1.toPath()));
// assertNull(manager.getFileTree().getFile(file2.toPath()));
// assertNotNull(manager.getFileTree().getFile(dir1New.toPath()));
// assertNotNull(manager.getFileTree().getFile(file1New.toPath()));
// assertNotNull(manager.getFileTree().getFile(Paths.get(dir2Str + "dir1" + File.separator + "file2")));
// System.out.println(manager.getFileTree().getFile(dir1New.toPath()));
// System.out.println(Paths.get(dir2Str + "dir1"));
// assertTrue(manager.getFileTree().getFile(dir1New.toPath()).getPath().equals(dir1New.toPath()));
// assertTrue(manager.getFileTree().getFile(dir1New.toPath()).getAction().getFile().getPath().equals(dir1New.toPath()));
// System.out.println(file1Str);
// System.out.println(manager.getFileTree().getFile(file1New.toPath()).getPath().toString());
// System.out.println(file1New.toPath());
// assertTrue(manager.getFileTree().getFile(file1New.toPath()).getPath().equals(file1New.toPath()));
//
// assertTrue(manager.getFileTree().getFile(file1New.toPath()).getAction().getFile().getPath().equals(file1New.toPath()));
//
// assertTrue(manager.getFileTree().getFile(file2New.toPath()).getPath().equals(file2New.toPath()));
// assertTrue(manager.getFileTree().getFile(file2New.toPath()).getAction().getFile().getPath().equals(file2New.toPath()));
//
//
// System.out.println("Before folder move");
// for(FileComponent comp : manager.getFileTree().getDeletedByContentHash().values()){
// System.out.println(comp.getPath() + " : " + comp.getAction().getFile().getPath() + " : " + comp.getAction().getCurrentState().getClass().toString());
// }
//
// Thread.sleep(config.getAggregationIntervalInMillis() * 2);
//
// System.out.println("After folder move");
// for(FileComponent comp : manager.getFileTree().getDeletedByContentHash().values()){
// System.out.println(comp.getPath() + " : " + comp.getAction().getFile().getPath() + " : " + comp.getAction().getCurrentState().getClass().toString());
// }
//
// assertTrue(manager.getFileTree().getDeletedByContentHash().size() == 0);
// assertTrue(manager.getFileTree().getDeletedByStructureHash().size() == 0);
// assertTrue(manager.getFileComponentQueue().size() == 0);
// Files.move(file1New.toPath(), file1Root.toPath());
// Thread.sleep(10);
//
// System.out.println("Last");
// for(FileComponent comp : manager.getFileTree().getDeletedByContentHash().values()){
// System.out.println(comp.getPath() + " : " + comp.getAction().getFile().getPath() + " : " + comp.getAction().getCurrentState().getClass().toString());
// }
//
// assertTrue(manager.getFileTree().getDeletedByContentHash().size() == 0);
// assertTrue(manager.getFileTree().getDeletedByStructureHash().size() == 0);
// ArrayList<FileComponent> list = new ArrayList<FileComponent>(manager.getFileComponentQueue().getQueue());
//
// for(FileComponent comp : list){
// System.out.println(comp.getPath() + ": " + comp.getAction().getCurrentState().getClass().toString());
// }
// assertTrue(manager.getFileComponentQueue().size() == 1);
//
// assertNull(manager.getFileTree().getFile(file1New.toPath()));
// assertNotNull(manager.getFileTree().getFile(file1Root.toPath()));
//
// assertTrue(manager.getFileTree().getFile(file1Root.toPath()).getPath().equals(file1Root.toPath()));
//
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
//}