package com.asolutions.scmsshd.test.integration; import static org.junit.Assert.assertEquals; import java.io.File; import java.io.IOException; import java.util.Properties; import org.apache.commons.io.FileUtils; import org.apache.sshd.common.keyprovider.FileKeyPairProvider; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.spearce.jgit.lib.Ref; import org.spearce.jgit.lib.Repository; import org.spearce.jgit.transport.FetchResult; import com.asolutions.scmsshd.SCuMD; import com.asolutions.scmsshd.authenticators.AlwaysPassPublicKeyAuthenticator; import com.asolutions.scmsshd.authorizors.AlwaysPassProjectAuthorizer; import com.asolutions.scmsshd.commands.factories.GitCommandFactory; import com.asolutions.scmsshd.commands.factories.GitSCMCommandFactory; import com.asolutions.scmsshd.test.integration.util.ConstantProjectNameConverter; public class PushTest extends IntegrationTestCase { private static final String ORIGIN = "origin"; private static final String REFSPEC = "master"; private File toRepoDir; private File fromRepoDir; private Repository fromRepository; private Ref fromRefMaster; @Before public void createRepoClone() throws IOException{ toRepoDir = makeScratchDir(); createBareRepo(toRepoDir); fromRepoDir = makeScratchDir(); // clone the repo to tmp so we don't break our own source FileUtils.copyDirectory(new File(".git"), fromRepoDir); fromRepository = new Repository(fromRepoDir); fromRefMaster = fromRepository.getRef(REFSPEC); } @After public void closeRepos() { fromRepository.close(); } @Test public void testPush() throws Exception { addRemoteConfigForLocalGitDirectory(fromRepository, toRepoDir, ORIGIN); push(ORIGIN, REFSPEC, fromRepository); assertPushOfMaster(fromRefMaster); } @Test public void testRoundTrip() throws Exception { File gitDir = new File(".git"); addRemoteConfigForLocalGitDirectory(fromRepository, toRepoDir, ORIGIN); push(ORIGIN, REFSPEC, fromRepository); Repository db = createCloneToRepo(); addRemoteConfigForLocalGitDirectory(db, gitDir, ORIGIN); FetchResult r = cloneFromRemote(db, ORIGIN); assert(r.getTrackingRefUpdates().size() > 0); } @Test public void testPushSCuMD() throws Exception { final SCuMD sshd = new SCuMD(); try{ int serverPort = generatePort(); System.out.println("Running on port: " + serverPort); sshd.setPort(serverPort); sshd.setKeyPairProvider(new FileKeyPairProvider(new String[] { "src/main/resources/ssh_host_rsa_key", "src/main/resources/ssh_host_dsa_key" })); sshd.setPublickeyAuthenticator(new AlwaysPassPublicKeyAuthenticator()); GitCommandFactory factory = new GitCommandFactory(); factory.setPathToProjectNameConverter(new ConstantProjectNameConverter()); factory.setProjectAuthorizor(new AlwaysPassProjectAuthorizer()); Properties config = new Properties(); config.setProperty(GitSCMCommandFactory.REPOSITORY_BASE, toRepoDir.getParent()); factory.setConfiguration(config); sshd.setCommandFactory(factory); new Thread(){ @Override public void run() { try { sshd.start(); } catch (IOException e) { e.printStackTrace(); } } }.start(); Thread.sleep(3000); addRemoteConfigForRemoteGitDirectory(fromRepository, ORIGIN, serverPort, toRepoDir.getName()); push(ORIGIN, REFSPEC, fromRepository); assertPushOfMaster(fromRefMaster); } finally{ sshd.stop(); } } @Test public void testRoundTripSCuMD() throws Exception { final SCuMD sshd = new SCuMD(); try{ int serverPort = generatePort(); System.out.println("Running on port: " + serverPort); sshd.setPort(serverPort); sshd.setKeyPairProvider(new FileKeyPairProvider(new String[] { "src/main/resources/ssh_host_rsa_key", "src/main/resources/ssh_host_dsa_key" })); sshd.setPublickeyAuthenticator(new AlwaysPassPublicKeyAuthenticator()); GitCommandFactory factory = new GitCommandFactory(); factory.setPathToProjectNameConverter(new ConstantProjectNameConverter()); factory.setProjectAuthorizor(new AlwaysPassProjectAuthorizer()); Properties config = new Properties(); config.setProperty(GitSCMCommandFactory.REPOSITORY_BASE, toRepoDir.getParent()); factory.setConfiguration(config); sshd.setCommandFactory(factory); new Thread(){ @Override public void run() { try { sshd.start(); } catch (IOException e) { e.printStackTrace(); } } }.start(); Thread.sleep(3000); addRemoteConfigForRemoteGitDirectory(fromRepository, ORIGIN, serverPort, toRepoDir.getName()); push(ORIGIN, REFSPEC, fromRepository); File gitDir = new File(".git"); addRemoteConfigForLocalGitDirectory(fromRepository, toRepoDir, ORIGIN); push(ORIGIN, REFSPEC, fromRepository); Repository db = createCloneToRepo(); addRemoteConfigForLocalGitDirectory(db, gitDir, ORIGIN); FetchResult r = cloneFromRemote(db, ORIGIN); assert(r.getTrackingRefUpdates().size() > 0); } finally{ sshd.stop(); } } private void assertPushOfMaster(Ref fromRefMaster) throws IOException { Repository to = new Repository(toRepoDir); Ref toRefMaster = to.getRef(REFSPEC); assertEquals(fromRefMaster.getObjectId(), toRefMaster.getObjectId()); } }