package com.constellio.data.io.concurrent.filesystem;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.Arrays;
import java.util.List;
import com.constellio.sdk.tests.annotations.InDevelopmentTest;
import org.apache.zookeeper.server.NIOServerCnxnFactory;
import org.apache.zookeeper.server.ZooKeeperServer;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.constellio.data.io.IOServicesFactory;
import com.constellio.data.io.concurrent.data.DataWithVersion;
import com.constellio.data.io.concurrent.exception.FileNotFoundException;
import com.constellio.data.io.concurrent.exception.OptimisticLockingException;
import com.constellio.data.utils.hashing.HashingService;
import com.constellio.model.conf.FoldersLocator;
@InDevelopmentTest
//@RunWith(value = Parameterized.class)
public class AtomicFileSystemsAcceptTest {
// private static NIOServerCnxnFactory serverFactory;
// private static ZooKeeperServer zks;
//
// private static void setUpZookeeper(int port) throws IOException, InterruptedException{
// File zkTmpDir=File.createTempFile("zookeeper","test");
// zkTmpDir.delete();
// zkTmpDir.mkdir();
// zks = new ZooKeeperServer(zkTmpDir,zkTmpDir,2181);
// serverFactory = new NIOServerCnxnFactory();
// serverFactory.configure(new InetSocketAddress(port), 100);
// serverFactory.startup(zks);
// }
//
// @Parameters(name = "{index}: Test {0}")
// public static Iterable<Object[]> setUpParameters() throws Exception {
// File baseFld = new FoldersLocator().getDefaultTempFolder();
// HashingService hashingService = new IOServicesFactory(null).newHashingService();
// AtomicFileSystem localFileSystem = new ChildAtomicFileSystem(new AtomicLocalFileSystem(hashingService), baseFld.getAbsolutePath());
//
// int zkPort = 63210;
// setUpZookeeper(zkPort);
// AtomicFileSystem zookeeperAtomicFileSystem = new ChildAtomicFileSystem(new ZookeeperAtomicFileSystem("localhost:" + zkPort, 6000), "/tmp");
//
// return Arrays.asList(new Object[][] {
// { localFileSystem },
// { zookeeperAtomicFileSystem}
// });
// }
//
// @AfterClass
// public static void cleanup() throws IOException{
//// zkc.close();
// if (serverFactory != null) {
// serverFactory.shutdown();
// }
// if (zks != null) {
// zks.shutdown();
// }
// }
//
// private AtomicFileSystem fileSystemUnderTest;
// private String oldContent, newContent, path;
// private Object invalidVersion;
// private Object updatedVersion;
//
// public AtomicFileSystemsAcceptTest(AtomicFileSystem fileSystemUnderTest) {
// this.fileSystemUnderTest = fileSystemUnderTest;
// }
//
// @Before
// public void setUp(){
// oldContent = "it is a test";
// newContent = "it is an another data";
//
// path = "/test.txt";
//
// fileSystemUnderTest.delete("/", null);
// invalidVersion = fileSystemUnderTest.writeData(path, new DataWithVersion(oldContent.getBytes(), null)).getVersion();
// fileSystemUnderTest.writeData(path, new DataWithVersion(newContent.getBytes(), null)); //this will change the version of the file
//
// }
//
// @Test
// public void whenRemovingAllFilesInRootThenThereIsNoFileInTheRoot(){
// fileSystemUnderTest.delete("/", null);
//
// assertThat(fileSystemUnderTest.list("/")).hasSize(0);
// }
//
// @Test
// public void whenAddingAFileThenTheFileIsAdded(){
// assertThat(fileSystemUnderTest.exists(path)).isTrue();
// }
//
// @Test
// public void whenDeletingAFileThenTheFileDoesNotExist(){
// fileSystemUnderTest.delete(path, updatedVersion);
// assertThat(fileSystemUnderTest.exists(path)).isFalse();
// }
//
// @Test
// public void whenDeletingAFileThatDoesNotExistThenDoesNotThrowExceptio(){
// fileSystemUnderTest.delete(path, updatedVersion);
// fileSystemUnderTest.delete(path, null);
// }
//
// @Test
// public void whenAddingAFileThenItIsAccissibleInListFiles(){
// List<String> rootFiles = fileSystemUnderTest.list("/");
// assertThat(rootFiles).containsOnly(path);
// }
//
//
// @Test (expected = OptimisticLockingException.class)
// public void whenDeletingDataWhileItsVersionHasBeenChangedThenThrowOptimisticLockingException(){
// //then
// fileSystemUnderTest.delete(path, invalidVersion);
// }
//
// @Test (expected = OptimisticLockingException.class)
// public void whenWritingDataWhileItsVersionHasBeenChangedThenThrowOptimisticLockingException(){
// //then
// fileSystemUnderTest.writeData(path, new DataWithVersion(oldContent.getBytes(), invalidVersion));
// }
//
// @Test
// public void givenAPathThatItsParentDoesNotExistWhenCreateAFileOnThatPathThenParentDirectoryIsCreated(){
// //given
// String path = "/test/notexist/test.txt";
// String parent = "/test";
// if (fileSystemUnderTest.exists(parent))
// fileSystemUnderTest.delete(parent, null);
// assertThat(fileSystemUnderTest.exists(parent)).isFalse();
//
// //when
// fileSystemUnderTest.writeData(path, new DataWithVersion("it is a test".getBytes(), null));
//
// //then
// assertThat(fileSystemUnderTest.exists(parent));
// }
//
// @Test
// public void whenCreateADirectoryThenTheDirectoryExists(){
// //given
// String dirPath = "/test";
// if (fileSystemUnderTest.exists(dirPath))
// fileSystemUnderTest.delete(dirPath, null);
//
// //when
// fileSystemUnderTest.mkdirs(dirPath);
//
// //then
// assertThat(fileSystemUnderTest.exists(dirPath)).isTrue();
// }
//
// @Test
// public void whenDeletingTheRootThenTheRootStillIsDirectory(){
// fileSystemUnderTest.delete("/", null);
// assertThat(fileSystemUnderTest.isDirectory("/")).isTrue();
// assertThat(fileSystemUnderTest.exists("/"));
// }
//
//
// @Test
// public void whenListingANonExistanceDirectoryThenReturnNull(){
// String aPath = "/this/is/a/random/path";
// assertThat(fileSystemUnderTest.list(aPath)).isNull();
// }
//
// @Test
// public void givenAPathPointToAFileWhenListFilesInThePathThenReturnNull(){
// List<String> nullList = fileSystemUnderTest.list(path);
// assertThat(nullList).isNull();
// }
//
// @Test (expected = FileNotFoundException.class)
// public void whenReadingFromNonExistedPathThenThrowsFileNotFoundException(){
// String aPath = "/this/is/a/random/path";
// assertThat(fileSystemUnderTest.readData(aPath));
// }
//
// @Test
// public void whenReadingFromADirectoryThenReturnADataWithNullValue(){
// String aPath = "/aDirPath";
// if (fileSystemUnderTest.exists(aPath))
// fileSystemUnderTest.delete(aPath, null);
// fileSystemUnderTest.mkdirs(aPath);
//
// assertThat(fileSystemUnderTest.readData(aPath).getData()).isNull();
// }
//
// @Test
// public void whenCreatingAFileWithNoContentThenTheFileIsNotDirectory(){
// String aPath = "/aFileWithZeroContent";
// fileSystemUnderTest.writeData(aPath, new DataWithVersion(new byte[0], null));
//
// assertThat(fileSystemUnderTest.isDirectory(aPath)).isFalse();
// }
}