@ -85,6 +85,7 @@ import org.eclipse.jgit.errors.RemoteRepositoryException;
import org.eclipse.jgit.errors.TransportException ;
import org.eclipse.jgit.errors.UnsupportedCredentialItem ;
import org.eclipse.jgit.http.server.GitServlet ;
import org.eclipse.jgit.http.server.resolver.DefaultUploadPackFactory ;
import org.eclipse.jgit.internal.JGitText ;
import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription ;
import org.eclipse.jgit.junit.TestRepository ;
@ -105,24 +106,35 @@ import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig ;
import org.eclipse.jgit.revwalk.RevBlob ;
import org.eclipse.jgit.revwalk.RevCommit ;
import org.eclipse.jgit.revwalk.RevWalk ;
import org.eclipse.jgit.storage.file.FileBasedConfig ;
import org.eclipse.jgit.transport.AbstractAdvertiseRefsHook ;
import org.eclipse.jgit.transport.AdvertiseRefsHook ;
import org.eclipse.jgit.transport.CredentialItem ;
import org.eclipse.jgit.transport.CredentialsProvider ;
import org.eclipse.jgit.transport.FetchConnection ;
import org.eclipse.jgit.transport.HttpTransport ;
import org.eclipse.jgit.transport.RefSpec ;
import org.eclipse.jgit.transport.RemoteRefUpdate ;
import org.eclipse.jgit.transport.Transport ;
import org.eclipse.jgit.transport.TransportHttp ;
import org.eclipse.jgit.transport.URIish ;
import org.eclipse.jgit.transport.UploadPack ;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider ;
import org.eclipse.jgit.transport.http.HttpConnectionFactory ;
import org.eclipse.jgit.transport.http.JDKHttpConnectionFactory ;
import org.eclipse.jgit.transport.http.apache.HttpClientConnectionFactory ;
import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException ;
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException ;
import org.eclipse.jgit.transport.resolver.UploadPackFactory ;
import org.eclipse.jgit.util.FS ;
import org.eclipse.jgit.util.HttpSupport ;
import org.eclipse.jgit.util.SystemReader ;
import org.hamcrest.Matchers ;
import org.junit.Before ;
import org.junit.Rule ;
import org.junit.Test ;
import org.junit.rules.ExpectedException ;
import org.junit.runner.RunWith ;
import org.junit.runners.Parameterized ;
import org.junit.runners.Parameterized.Parameters ;
@ -131,6 +143,11 @@ import org.junit.runners.Parameterized.Parameters;
public class SmartClientSmartServerTest extends HttpTestCase {
private static final String HDR_TRANSFER_ENCODING = "Transfer-Encoding" ;
@Rule
public ExpectedException thrown = ExpectedException . none ( ) ;
private AdvertiseRefsHook advertiseRefsHook ;
private Repository remoteRepository ;
private CredentialsProvider testCredentials = new UsernamePasswordCredentialsProvider (
@ -148,7 +165,7 @@ public class SmartClientSmartServerTest extends HttpTestCase {
private RevBlob A_txt ;
private RevCommit A , B ;
private RevCommit A , B , unreachableCommit ;
@Parameters
public static Collection < Object [ ] > data ( ) {
@ -175,6 +192,19 @@ public class SmartClientSmartServerTest extends HttpTestCase {
ConfigConstants . CONFIG_KEY_LOGALLREFUPDATES , true ) ;
GitServlet gs = new GitServlet ( ) ;
gs . setUploadPackFactory ( new UploadPackFactory < HttpServletRequest > ( ) {
@Override
public UploadPack create ( HttpServletRequest req , Repository db )
throws ServiceNotEnabledException ,
ServiceNotAuthorizedException {
DefaultUploadPackFactory f = new DefaultUploadPackFactory ( ) ;
UploadPack up = f . create ( req , db ) ;
if ( advertiseRefsHook ! = null ) {
up . setAdvertiseRefsHook ( advertiseRefsHook ) ;
}
return up ;
}
} ) ;
ServletContextHandler app = addNormalContext ( gs , src , srcName ) ;
@ -200,6 +230,8 @@ public class SmartClientSmartServerTest extends HttpTestCase {
B = src . commit ( ) . parent ( A ) . add ( "A_txt" , "C" ) . add ( "B" , "B" ) . create ( ) ;
src . update ( master , B ) ;
unreachableCommit = src . commit ( ) . add ( "A_txt" , A_txt ) . create ( ) ;
src . update ( "refs/garbage/a/very/long/ref/name/to/compress" , B ) ;
}
@ -455,6 +487,56 @@ public class SmartClientSmartServerTest extends HttpTestCase {
info . getResponseHeader ( HDR_CONTENT_TYPE ) ) ;
}
@Test
public void testFetchBySHA1 ( ) throws Exception {
Repository dst = createBareRepository ( ) ;
assertFalse ( dst . hasObject ( A_txt ) ) ;
try ( Transport t = Transport . open ( dst , remoteURI ) ) {
t . fetch ( NullProgressMonitor . INSTANCE ,
Collections . singletonList ( new RefSpec ( B . name ( ) ) ) ) ;
}
assertTrue ( dst . hasObject ( A_txt ) ) ;
}
@Test
public void testFetchBySHA1Unreachable ( ) throws Exception {
Repository dst = createBareRepository ( ) ;
assertFalse ( dst . hasObject ( A_txt ) ) ;
try ( Transport t = Transport . open ( dst , remoteURI ) ) {
thrown . expect ( TransportException . class ) ;
thrown . expectMessage ( Matchers . containsString (
"want " + unreachableCommit . name ( ) + " not valid" ) ) ;
t . fetch ( NullProgressMonitor . INSTANCE , Collections
. singletonList ( new RefSpec ( unreachableCommit . name ( ) ) ) ) ;
}
}
@Test
public void testFetchBySHA1UnreachableByAdvertiseRefsHook ( )
throws Exception {
Repository dst = createBareRepository ( ) ;
assertFalse ( dst . hasObject ( A_txt ) ) ;
advertiseRefsHook = new AbstractAdvertiseRefsHook ( ) {
@Override
protected Map < String , Ref > getAdvertisedRefs ( Repository repository ,
RevWalk revWalk ) {
return Collections . emptyMap ( ) ;
}
} ;
try ( Transport t = Transport . open ( dst , remoteURI ) ) {
thrown . expect ( TransportException . class ) ;
thrown . expectMessage ( Matchers . containsString (
"want " + A . name ( ) + " not valid" ) ) ;
t . fetch ( NullProgressMonitor . INSTANCE , Collections
. singletonList ( new RefSpec ( A . name ( ) ) ) ) ;
}
}
@Test
public void testInitialClone_Small ( ) throws Exception {
Repository dst = createBareRepository ( ) ;