package co.codewizards.cloudstore.test.repotorepo; import static co.codewizards.cloudstore.core.oio.OioFileFactory.*; import static org.assertj.core.api.Assertions.*; import java.util.Properties; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import co.codewizards.cloudstore.core.config.Config; import co.codewizards.cloudstore.core.config.ConfigImpl; import co.codewizards.cloudstore.core.oio.File; import co.codewizards.cloudstore.core.progress.LoggerProgressMonitor; import co.codewizards.cloudstore.core.repo.local.LocalRepoManager; import co.codewizards.cloudstore.core.util.PropertiesUtil; public class PathPrefixedConfigInheritanceRepoToRepoSyncIT extends AbstractRepoToRepoSyncIT { private static final Logger logger = LoggerFactory.getLogger(PathPrefixedConfigInheritanceRepoToRepoSyncIT.class); @Test public void parentConfigWithRemotePathPrefix() throws Exception { remotePathPrefix = "/2/1 {11 11ä11#+} 1"; syncFromRemoteToLocal(); File dir2 = createFile(remoteRoot, "2"); File dir2_1 = createFile(dir2, "1 {11 11ä11#+} 1"); assertThat(dir2_1.getIoFile()).exists().isDirectory(); File dir2_1_d1 = createDirectory(dir2_1, "d1"); File dir2_1_d2 = createDirectory(dir2_1, "d2"); File dir2_1_d3 = createDirectory(dir2_1, "d3"); File dir2_1_d1_d10 = createDirectory(dir2_1_d1, "d10"); File dir2_1_d1_d11 = createDirectory(dir2_1_d1, "d11"); File dir2_1_d1_f20 = createFileWithRandomContent(dir2_1_d1, "f20"); File dir2_1_d1_f21 = createFileWithRandomContent(dir2_1_d1, "f21"); File dir2_1_d1_d10_f30 = createFileWithRandomContent(dir2_1_d1_d10, "f30"); File dir2_1_d2_d20 = createDirectory(dir2_1_d2, "d20"); File dir2_1_d2_f40 = createDirectory(dir2_1_d2, "f40"); // Create and sync ignore rules. Properties properties = new Properties(); properties.put("ignore[bla].namePattern", "bla"); properties.put("ignore[test].namePattern", "test"); properties.put("ignore[blubb].namePattern", "blubb"); PropertiesUtil.store(createFile(remoteRoot, ".cloudstore.properties"), properties, null); properties = new Properties(); properties.put("ignore[test].namePattern", "overwrittenTest"); properties.put("ignore[blubb].namePattern", "overwrittenBlubb"); properties.put("ignore[oink].namePattern", "oink!"); PropertiesUtil.store(createFile(dir2, ".cloudstore.properties"), properties, null); // The above 2 should be merged into the parent.properties, but the // following should not, because it's synced normally. properties = new Properties(); properties.put("ignore[test].namePattern", "overwritten222"); properties.put("ignore[bak].namePattern", "*.bak"); PropertiesUtil.store(createFile(dir2_1, ".cloudstore.properties"), properties, null); // sync again repoToRepoSync.sync(new LoggerProgressMonitor(logger)); File parentPropsFile = createFile(localRoot, LocalRepoManager.META_DIR_NAME, "parent.properties"); assertThat(parentPropsFile.getIoFile()).exists().isFile(); long parentPropsFileTimestamp = parentPropsFile.getLastModifiedNoFollow(); Properties parentProps = PropertiesUtil.load(parentPropsFile); assertThat(parentProps.getProperty("ignore[bla].namePattern", null)).isEqualTo("bla"); assertThat(parentProps.getProperty("ignore[blubb].namePattern", null)).isEqualTo("overwrittenBlubb"); assertThat(parentProps.getProperty("ignore[test].namePattern", null)).isEqualTo("overwrittenTest"); assertThat(parentProps.getProperty("ignore[bak].namePattern", null)).isNull(); Config configForRoot = ConfigImpl.getInstanceForDirectory(localRoot); assertThat(configForRoot.getProperty("ignore[bla].namePattern", null)).isEqualTo("bla"); assertThat(configForRoot.getProperty("ignore[blubb].namePattern", null)).isEqualTo("overwrittenBlubb"); assertThat(configForRoot.getProperty("ignore[test].namePattern", null)).isEqualTo("overwritten222"); assertThat(configForRoot.getProperty("ignore[bak].namePattern", null)).isEqualTo("*.bak"); // sync again repoToRepoSync.sync(new LoggerProgressMonitor(logger)); assertThat(parentPropsFile.getLastModifiedNoFollow()).isEqualTo(parentPropsFileTimestamp); properties = new Properties(); properties.put("ignore[test].namePattern", "aaaaaaa"); properties.put("ignore[blubb].namePattern", "bbbbbbb"); properties.put("ignore[xxx].namePattern", "yyy"); PropertiesUtil.store(createFile(remoteRoot, ".cloudstore.properties"), properties, null); // sync again repoToRepoSync.sync(new LoggerProgressMonitor(logger)); assertThat(parentPropsFile.getLastModifiedNoFollow()).isNotEqualTo(parentPropsFileTimestamp); parentPropsFileTimestamp = parentPropsFile.getLastModifiedNoFollow(); parentProps = PropertiesUtil.load(parentPropsFile); assertThat(parentProps.getProperty("ignore[bla].namePattern", null)).isNull(); assertThat(parentProps.getProperty("ignore[xxx].namePattern", null)).isEqualTo("yyy"); assertThat(parentProps.getProperty("ignore[test].namePattern", null)).isEqualTo("overwrittenTest"); assertThat(parentProps.getProperty("ignore[blubb].namePattern", null)).isEqualTo("overwrittenBlubb"); assertThat(parentProps.getProperty("ignore[oink].namePattern", null)).isEqualTo("oink!"); assertThat(parentProps.getProperty("ignore[bak].namePattern", null)).isNull(); createFile(dir2, ".cloudstore.properties").delete(); // sync again repoToRepoSync.sync(new LoggerProgressMonitor(logger)); assertThat(parentPropsFile.getLastModifiedNoFollow()).isNotEqualTo(parentPropsFileTimestamp); parentProps = PropertiesUtil.load(parentPropsFile); assertThat(parentProps.getProperty("ignore[bla].namePattern", null)).isNull(); assertThat(parentProps.getProperty("ignore[xxx].namePattern", null)).isEqualTo("yyy"); assertThat(parentProps.getProperty("ignore[test].namePattern", null)).isEqualTo("aaaaaaa"); assertThat(parentProps.getProperty("ignore[blubb].namePattern", null)).isEqualTo("bbbbbbb"); assertThat(parentProps.getProperty("ignore[oink].namePattern", null)).isNull(); assertThat(parentProps.getProperty("ignore[bak].namePattern", null)).isNull(); } @Test public void parentConfigWithLocalPathPrefix() throws Exception { localPathPrefix = "/2/1 {11 11ä11#+} 1"; syncFromLocalToRemote(); File dir2 = createFile(localRoot, "2"); File dir2_1 = createFile(dir2, "1 {11 11ä11#+} 1"); assertThat(dir2_1.getIoFile()).exists().isDirectory(); File dir2_1_d1 = createDirectory(dir2_1, "d1"); File dir2_1_d2 = createDirectory(dir2_1, "d2"); File dir2_1_d3 = createDirectory(dir2_1, "d3"); File dir2_1_d1_d10 = createDirectory(dir2_1_d1, "d10"); File dir2_1_d1_d11 = createDirectory(dir2_1_d1, "d11"); File dir2_1_d1_f20 = createFileWithRandomContent(dir2_1_d1, "f20"); File dir2_1_d1_f21 = createFileWithRandomContent(dir2_1_d1, "f21"); File dir2_1_d1_d10_f30 = createFileWithRandomContent(dir2_1_d1_d10, "f30"); File dir2_1_d2_d20 = createDirectory(dir2_1_d2, "d20"); File dir2_1_d2_f40 = createDirectory(dir2_1_d2, "f40"); // Create and sync ignore rules. Properties properties = new Properties(); properties.put("ignore[bla].namePattern", "bla"); properties.put("ignore[test].namePattern", "test"); properties.put("ignore[blubb].namePattern", "blubb"); PropertiesUtil.store(createFile(localRoot, ".cloudstore.properties"), properties, null); properties = new Properties(); properties.put("ignore[test].namePattern", "overwrittenTest"); properties.put("ignore[blubb].namePattern", "overwrittenBlubb"); properties.put("ignore[oink].namePattern", "oink!"); PropertiesUtil.store(createFile(dir2, ".cloudstore.properties"), properties, null); // The above 2 should be merged into the parent.properties, but the // following should not, because it's synced normally. properties = new Properties(); properties.put("ignore[test].namePattern", "overwritten222"); properties.put("ignore[bak].namePattern", "*.bak"); PropertiesUtil.store(createFile(dir2_1, ".cloudstore.properties"), properties, null); // sync again repoToRepoSync.sync(new LoggerProgressMonitor(logger)); File parentPropsFile = createFile(remoteRoot, LocalRepoManager.META_DIR_NAME, "parent.properties"); assertThat(parentPropsFile.getIoFile()).exists().isFile(); long parentPropsFileTimestamp = parentPropsFile.getLastModifiedNoFollow(); Properties parentProps = PropertiesUtil.load(parentPropsFile); assertThat(parentProps.getProperty("ignore[bla].namePattern", null)).isEqualTo("bla"); assertThat(parentProps.getProperty("ignore[blubb].namePattern", null)).isEqualTo("overwrittenBlubb"); assertThat(parentProps.getProperty("ignore[test].namePattern", null)).isEqualTo("overwrittenTest"); assertThat(parentProps.getProperty("ignore[bak].namePattern", null)).isNull(); Config configForRoot = ConfigImpl.getInstanceForDirectory(remoteRoot); assertThat(configForRoot.getProperty("ignore[bla].namePattern", null)).isEqualTo("bla"); assertThat(configForRoot.getProperty("ignore[blubb].namePattern", null)).isEqualTo("overwrittenBlubb"); assertThat(configForRoot.getProperty("ignore[test].namePattern", null)).isEqualTo("overwritten222"); assertThat(configForRoot.getProperty("ignore[bak].namePattern", null)).isEqualTo("*.bak"); // sync again repoToRepoSync.sync(new LoggerProgressMonitor(logger)); assertThat(parentPropsFile.getLastModifiedNoFollow()).isEqualTo(parentPropsFileTimestamp); properties = new Properties(); properties.put("ignore[test].namePattern", "aaaaaaa"); properties.put("ignore[blubb].namePattern", "bbbbbbb"); properties.put("ignore[xxx].namePattern", "yyy"); PropertiesUtil.store(createFile(localRoot, ".cloudstore.properties"), properties, null); // sync again repoToRepoSync.sync(new LoggerProgressMonitor(logger)); assertThat(parentPropsFile.getLastModifiedNoFollow()).isNotEqualTo(parentPropsFileTimestamp); parentPropsFileTimestamp = parentPropsFile.getLastModifiedNoFollow(); parentProps = PropertiesUtil.load(parentPropsFile); assertThat(parentProps.getProperty("ignore[bla].namePattern", null)).isNull(); assertThat(parentProps.getProperty("ignore[xxx].namePattern", null)).isEqualTo("yyy"); assertThat(parentProps.getProperty("ignore[test].namePattern", null)).isEqualTo("overwrittenTest"); assertThat(parentProps.getProperty("ignore[blubb].namePattern", null)).isEqualTo("overwrittenBlubb"); assertThat(parentProps.getProperty("ignore[oink].namePattern", null)).isEqualTo("oink!"); assertThat(parentProps.getProperty("ignore[bak].namePattern", null)).isNull(); createFile(dir2, ".cloudstore.properties").delete(); // sync again repoToRepoSync.sync(new LoggerProgressMonitor(logger)); assertThat(parentPropsFile.getLastModifiedNoFollow()).isNotEqualTo(parentPropsFileTimestamp); parentProps = PropertiesUtil.load(parentPropsFile); assertThat(parentProps.getProperty("ignore[bla].namePattern", null)).isNull(); assertThat(parentProps.getProperty("ignore[xxx].namePattern", null)).isEqualTo("yyy"); assertThat(parentProps.getProperty("ignore[test].namePattern", null)).isEqualTo("aaaaaaa"); assertThat(parentProps.getProperty("ignore[blubb].namePattern", null)).isEqualTo("bbbbbbb"); assertThat(parentProps.getProperty("ignore[oink].namePattern", null)).isNull(); assertThat(parentProps.getProperty("ignore[bak].namePattern", null)).isNull(); } }