package co.codewizards.cloudstore.local;
import static co.codewizards.cloudstore.core.oio.OioFileFactory.*;
import static org.assertj.core.api.Assertions.*;
import java.io.IOException;
import java.lang.reflect.Proxy;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import co.codewizards.cloudstore.core.oio.File;
import co.codewizards.cloudstore.core.repo.local.FileAlreadyRepositoryException;
import co.codewizards.cloudstore.core.repo.local.FileNoDirectoryException;
import co.codewizards.cloudstore.core.repo.local.FileNoRepositoryException;
import co.codewizards.cloudstore.core.repo.local.FileNotFoundException;
import co.codewizards.cloudstore.core.repo.local.LocalRepoManager;
public class LocalRepoManagerFactoryTest extends AbstractTest {
@BeforeClass
public static void beforeClass() {
System.setProperty(LocalRepoManager.SYSTEM_PROPERTY_CLOSE_DEFERRED_MILLIS, "0");
}
@AfterClass
public static void afterClass() {
System.clearProperty(LocalRepoManager.SYSTEM_PROPERTY_CLOSE_DEFERRED_MILLIS);
}
@Test
public void createLocalRepoManagerForExistingNonRepoDirectory() throws Exception {
final File localRoot = newTestRepositoryLocalRoot();
assertThat(localRoot.exists()).isFalse();
localRoot.mkdirs();
assertThat(localRoot.isDirectory()).isTrue();
final LocalRepoManager localRepoManager = localRepoManagerFactory.createLocalRepoManagerForNewRepository(localRoot);
assertThat(localRepoManager).isNotNull();
final LocalRepoManager localRepoManager2 = localRepoManagerFactory.createLocalRepoManagerForExistingRepository(createFile(createFile(localRoot, "bla"), ".."));
assertThat(localRepoManager2).isNotNull();
assertThat(localRepoManager2).isNotSameAs(localRepoManager);
assertThat(Proxy.isProxyClass(localRepoManager.getClass())).isTrue();
assertThat(Proxy.isProxyClass(localRepoManager2.getClass())).isTrue();
final LocalRepoManagerInvocationHandler invocationHandler = (LocalRepoManagerInvocationHandler) Proxy.getInvocationHandler(localRepoManager);
final LocalRepoManagerInvocationHandler invocationHandler2 = (LocalRepoManagerInvocationHandler) Proxy.getInvocationHandler(localRepoManager2);
assertThat(invocationHandler).isNotSameAs(invocationHandler2);
assertThat(invocationHandler.localRepoManagerImpl).isSameAs(invocationHandler2.localRepoManagerImpl);
localRepoManager.close();
localRepoManager2.close();
}
@Test
public void getLocalRepoManagerForExistingRepository() throws Exception {
final File localRoot = newTestRepositoryLocalRoot();
assertThat(localRoot.exists()).isFalse();
localRoot.mkdirs();
assertThat(localRoot.isDirectory()).isTrue();
final LocalRepoManager localRepoManager = localRepoManagerFactory.createLocalRepoManagerForNewRepository(localRoot);
assertThat(localRepoManager).isNotNull();
localRepoManager.close();
final LocalRepoManager localRepoManager2 = localRepoManagerFactory.createLocalRepoManagerForExistingRepository(createFile(createFile(localRoot, "bla"), ".."));
assertThat(localRepoManager2).isNotNull();
assertThat(localRepoManager2).isNotSameAs(localRepoManager);
localRepoManager2.close();
}
@Test(expected=FileNotFoundException.class)
public void getLocalRepoManagerForNonExistingDirectory() throws Exception {
final File localRoot = newTestRepositoryLocalRoot();
assertThat(localRoot.exists()).isFalse();
localRepoManagerFactory.createLocalRepoManagerForExistingRepository(localRoot);
}
@Test(expected=FileNoDirectoryException.class)
public void getLocalRepoManagerForExistingNonDirectoryFile() throws Exception {
final File localRoot = newTestRepositoryLocalRoot();
final File localRootParent = localRoot.getParentFile();
localRootParent.mkdirs();
assertThat(localRootParent.isDirectory()).isTrue();
localRoot.createNewFile();
assertThat(localRoot.isFile()).isTrue();
localRepoManagerFactory.createLocalRepoManagerForExistingRepository(localRoot);
}
@Test(expected=FileNoRepositoryException.class)
public void getLocalRepoManagerForExistingNonRepoDirectory() throws Exception {
final File localRoot = newTestRepositoryLocalRoot();
localRoot.mkdirs();
assertThat(localRoot.isDirectory()).isTrue();
final LocalRepoManager localRepoManager = localRepoManagerFactory.createLocalRepoManagerForExistingRepository(localRoot);
localRepoManager.close();
}
@Test(expected=FileNotFoundException.class)
public void createLocalRepoManagerForNonExistingDirectory() throws Exception {
final File localRoot = newTestRepositoryLocalRoot();
assertThat(localRoot.exists()).isFalse();
localRepoManagerFactory.createLocalRepoManagerForNewRepository(localRoot);
}
@Test(expected=FileAlreadyRepositoryException.class)
public void createLocalRepoManagerForRepoDirectory() throws Exception {
final File localRoot = newTestRepositoryLocalRoot();
assertThat(localRoot.exists()).isFalse();
localRoot.mkdirs();
assertThat(localRoot.isDirectory()).isTrue();
final LocalRepoManager localRepoManager = localRepoManagerFactory.createLocalRepoManagerForNewRepository(localRoot);
assertThat(localRepoManager).isNotNull();
localRepoManager.close();
localRepoManagerFactory.createLocalRepoManagerForNewRepository(localRoot);
}
/**
* Expects the same behaviour as {@link #createLocalRepoManagerForRepoDirectory()}
*/
@Test(expected=FileAlreadyRepositoryException.class)
public void createLocalRepoManagerForRepoDirectoryWithClose() throws Exception {
final File localRoot = newTestRepositoryLocalRoot();
assertThat(localRoot.exists()).isFalse();
localRoot.mkdirs();
assertThat(localRoot.isDirectory()).isTrue();
final LocalRepoManager localRepoManager = localRepoManagerFactory.createLocalRepoManagerForNewRepository(localRoot);
assertThat(localRepoManager).isNotNull();
localRepoManager.close();
localRepoManagerFactory.createLocalRepoManagerForNewRepository(localRoot);
}
@Test(expected=FileAlreadyRepositoryException.class)
public void createLocalRepoManagerForNonRepoDirInsideRepoDirectory() throws Exception {
final File localRoot = newTestRepositoryLocalRoot();
localRoot.mkdirs();
assertThat(localRoot.isDirectory()).isTrue();
final LocalRepoManager localRepoManager = localRepoManagerFactory.createLocalRepoManagerForNewRepository(localRoot);
assertThat(localRepoManager.getLocalRoot()).isEqualTo(localRoot.getCanonicalFile());
final File sub1Dir = createFile(localRepoManager.getLocalRoot(), "sub1");
final File sub1SubAaaDir = createFile(sub1Dir, "aaa");
sub1SubAaaDir.mkdirs();
assertThat(sub1SubAaaDir.isDirectory()).isTrue();
localRepoManager.close();
localRepoManagerFactory.createLocalRepoManagerForNewRepository(sub1SubAaaDir);
}
private File newTestRepositoryLocalRoot() throws IOException {
return newTestRepositoryLocalRoot("");
}
}