package nl.minicom.gitolite.manager.integration; import com.google.common.io.Files; import nl.minicom.gitolite.manager.exceptions.ModificationException; import nl.minicom.gitolite.manager.git.GitManager; import nl.minicom.gitolite.manager.git.JGitManager; import nl.minicom.gitolite.manager.git.KeyGenerator; import nl.minicom.gitolite.manager.models.Config; import nl.minicom.gitolite.manager.models.ConfigManager; import nl.minicom.gitolite.manager.models.Group; import nl.minicom.gitolite.manager.models.Repository; import nl.minicom.gitolite.manager.models.User; import org.junit.After; import org.junit.Assert; import org.junit.Assume; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import com.google.common.base.Strings; import java.io.File; import java.io.FileWriter; import java.util.concurrent.Future; public class IntegrationTest { private static String gitUri; private static String adminUsername; @BeforeClass public static void beforeClass() { Assume.assumeTrue(Strings.isNullOrEmpty(System.getProperty("skipIntegrationTests"))); gitUri = System.getProperty("gitUri", "ssh://git@localhost:2222/gitolite-admin"); adminUsername = System.getProperty("gitAdmin", "git"); } private ConfigManager manager; @Before public void setUp() throws Exception { manager = ConfigManager.create(gitUri); clearEverything(); } @After public void tearDown() throws Exception { clearEverything(); } private void clearEverything() throws Exception { if(!Strings.isNullOrEmpty(System.getProperty("skipIntegrationTests"))) { return; } Config config = manager.get(); for (User user : config.getUsers()) { if (!adminUsername.equals(user.getName())) { config.removeUser(user); } } for (Group group : config.getGroups()) { config.removeGroup(group); } for (Repository repo : config.getRepositories()) { if (!"gitolite-admin".equals(repo.getName())) { config.removeRepository(repo); } } manager.apply(config); } @Test public void testSequentialRepositoryModification() throws Exception { Config config = manager.get(); config.createRepository("test-repo"); manager.apply(config); config = manager.get(); Repository repository = config.getRepository("test-repo"); config.removeRepository(repository); manager.apply(config); config = manager.get(); Assert.assertNull(config.getRepository("test-repo")); assertConfigPushedCorrectly(config); } @Test(expected = ModificationException.class) public void testConcurrentRepositoryCreation() throws Exception { Config config1 = manager.get(); Config config2 = manager.get(); config1.createRepository("test-repo"); config2.createRepository("test-repo"); Future<?> future = manager.applyAsync(config1); manager.apply(config2); future.get(); } @Test(expected = ModificationException.class) public void testConcurrentRepositoryRemoval() throws Exception { Config config = manager.get(); config.createRepository("test-repo"); manager.apply(config); Config config1 = manager.get(); Config config2 = manager.get(); config1.removeRepository(config1.getRepository("test-repo")); config2.removeRepository(config2.getRepository("test-repo")); manager.applyAsync(config1); manager.apply(config2); } @Test public void testSequentialGroupModification() throws Exception { Config config = manager.get(); config.createGroup("@test-group").add(config.getUser(adminUsername)); manager.apply(config); config = manager.get(); config.removeGroup(config.getGroup("@test-group")); manager.apply(config); config = manager.get(); Assert.assertNull(config.getGroup("@test-group")); assertConfigPushedCorrectly(config); } @Test(expected = ModificationException.class) public void testConcurrentGroupCreation() throws Exception { Config config1 = manager.get(); Config config2 = manager.get(); config1.createGroup("@test-group").add(config1.getUser(adminUsername)); config2.createGroup("@test-group").add(config2.getUser(adminUsername)); Future<?> future = manager.applyAsync(config1); manager.apply(config2); future.get(); } @Test(expected = ModificationException.class) public void testConcurrentGroupRemoval() throws Exception { Config config = manager.get(); config.createGroup("@test-group").add(config.getUser(adminUsername)); manager.apply(config); Config config1 = manager.get(); Config config2 = manager.get(); config1.removeGroup(config1.getGroup("@test-group")); config2.removeGroup(config2.getGroup("@test-group")); Future<?> future = manager.applyAsync(config1); manager.apply(config2); future.get(); } @Test public void testSequentialUserModification() throws Exception { Config config = manager.get(); config.createUser("test-user").setKey("key", KeyGenerator.generateRandomPublicKey()); manager.apply(config); config = manager.get(); config.removeUser(config.getUser("test-user")); manager.apply(config); config = manager.get(); Assert.assertNull(config.getUser("test-user")); assertConfigPushedCorrectly(config); } @Test public void testMoreUserModification() throws Exception { Config config = manager.get(); config.createUser("test-user").setKey("key", KeyGenerator.generateRandomPublicKey()); manager.apply(config); config = manager.get(); config.removeUser(config.getUser("test-user")); manager.apply(config); config = manager.get(); config.createUser("test-user2").setKey("key", KeyGenerator.generateRandomPublicKey()); manager.apply(config); config = manager.get(); Assert.assertNull(config.getUser("test-user")); Assert.assertNotNull(config.getUser("test-user2")); assertConfigPushedCorrectly(config); } public static void assertConfigPushedCorrectly(Config config) throws Exception { Assert.assertEquals(config, ConfigManager.create(gitUri).get()); } @Test(expected = ModificationException.class) public void testConcurrentUserCreation() throws Exception { Config config1 = manager.get(); Config config2 = manager.get(); config1.createUser("test-user").setKey("key", KeyGenerator.generateRandomPublicKey()); config2.createUser("test-user").setKey("key", KeyGenerator.generateRandomPublicKey()); Future<?> future = manager.applyAsync(config1); manager.apply(config2); future.get(); } @Test(expected = ModificationException.class) public void testConcurrentUserRemoval() throws Exception { Config config = manager.get(); config.createUser("test-user").setKey("key", KeyGenerator.generateRandomPublicKey()); manager.apply(config); Config config1 = manager.get(); Config config2 = manager.get(); config1.removeUser(config.getUser("test-user")); config2.removeUser(config.getUser("test-user")); Future<?> future = manager.applyAsync(config1); manager.apply(config2); future.get(); } @Test(expected = Exception.class) public void testApplyConfigOnAheadRemote() throws Exception { Config config = manager.get(); File copyWorkingDirectory = Files.createTempDir(); GitManager gitManager = new JGitManager(copyWorkingDirectory, null); gitManager.clone(gitUri); FileWriter writer = new FileWriter(new File(copyWorkingDirectory, "test.txt")); writer.write("Hello world"); writer.close(); gitManager.commitChanges(); gitManager.push(); // The remote is now ahead config.createRepository("test-repo"); manager.apply(config); } }