View Javadoc
1   /*
2    * Copyright (C) 2014, Matthias Sohn <matthias.sohn@sap.com> and others
3    *
4    * This program and the accompanying materials are made available under the
5    * terms of the Eclipse Distribution License v. 1.0 which is available at
6    * https://www.eclipse.org/org/documents/edl-v10.php.
7    *
8    * SPDX-License-Identifier: BSD-3-Clause
9    */
10  package org.eclipse.jgit.http.test;
11  
12  import static org.junit.Assert.assertEquals;
13  
14  import java.util.Collection;
15  import java.util.Collections;
16  
17  import javax.servlet.http.HttpServletRequest;
18  
19  import org.eclipse.jetty.servlet.ServletContextHandler;
20  import org.eclipse.jetty.servlet.ServletHolder;
21  import org.eclipse.jgit.errors.RepositoryNotFoundException;
22  import org.eclipse.jgit.http.server.GitServlet;
23  import org.eclipse.jgit.http.server.resolver.DefaultReceivePackFactory;
24  import org.eclipse.jgit.junit.TestRepository;
25  import org.eclipse.jgit.lib.Constants;
26  import org.eclipse.jgit.lib.NullProgressMonitor;
27  import org.eclipse.jgit.lib.ObjectId;
28  import org.eclipse.jgit.lib.Repository;
29  import org.eclipse.jgit.lib.StoredConfig;
30  import org.eclipse.jgit.revwalk.RevBlob;
31  import org.eclipse.jgit.revwalk.RevCommit;
32  import org.eclipse.jgit.transport.PushResult;
33  import org.eclipse.jgit.transport.ReceiveCommand;
34  import org.eclipse.jgit.transport.ReceivePack;
35  import org.eclipse.jgit.transport.RemoteRefUpdate;
36  import org.eclipse.jgit.transport.Transport;
37  import org.eclipse.jgit.transport.URIish;
38  import org.eclipse.jgit.transport.http.HttpConnectionFactory;
39  import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
40  import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
41  import org.junit.Before;
42  import org.junit.Test;
43  
44  public class MeasurePackSizeTest extends AllFactoriesHttpTestCase {
45  
46  	private Repository remoteRepository;
47  
48  	private URIish remoteURI;
49  
50  	long packSize = -1;
51  
52  	public MeasurePackSizeTest(HttpConnectionFactory cf) {
53  		super(cf);
54  	}
55  
56  	@Override
57  	@Before
58  	public void setUp() throws Exception {
59  		super.setUp();
60  
61  		final TestRepository<Repository> src = createTestRepository();
62  		final String srcName = src.getRepository().getDirectory().getName();
63  
64  		ServletContextHandler app = server.addContext("/git");
65  		GitServlet gs = new GitServlet();
66  		gs.setRepositoryResolver((HttpServletRequest req, String name) -> {
67  			if (!name.equals(srcName)) {
68  				throw new RepositoryNotFoundException(name);
69  			}
70  			final Repository db = src.getRepository();
71  			db.incrementOpen();
72  			return db;
73  		});
74  		gs.setReceivePackFactory(new DefaultReceivePackFactory() {
75  			@Override
76  			public ReceivePack create(HttpServletRequest req, Repository db)
77  					throws ServiceNotEnabledException,
78  					ServiceNotAuthorizedException {
79  				ReceivePack recv = super.create(req, db);
80  				recv.setPostReceiveHook((ReceivePack rp,
81  						Collection<ReceiveCommand> commands) -> {
82  					packSize = rp.getPackSize();
83  				});
84  				return recv;
85  			}
86  
87  		});
88  		app.addServlet(new ServletHolder(gs), "/*");
89  
90  		server.setUp();
91  
92  		remoteRepository = src.getRepository();
93  		remoteURI = toURIish(app, srcName);
94  
95  		StoredConfig cfg = remoteRepository.getConfig();
96  		cfg.setBoolean("http", null, "receivepack", true);
97  		cfg.save();
98  	}
99  
100 	@Test
101 	public void testPush_packSize() throws Exception {
102 		final TestRepository src = createTestRepository();
103 		final RevBlob Q_txt = src
104 				.blob("some blob content to measure pack size");
105 		final RevCommit Q = src.commit().add("Q", Q_txt).create();
106 		final Repository db = src.getRepository();
107 		final String dstName = Constants.R_HEADS + "new.branch";
108 		PushResult result;
109 
110 		try (Transport t = Transport.open(db, remoteURI)) {
111 			final String srcExpr = Q.name();
112 			final boolean forceUpdate = false;
113 			final String localName = null;
114 			final ObjectId oldId = null;
115 
116 			RemoteRefUpdate update = new RemoteRefUpdate(src.getRepository(),
117 					srcExpr, dstName, forceUpdate, localName, oldId);
118 			result = t.push(NullProgressMonitor.INSTANCE,
119 					Collections.singleton(update));
120 		}
121 		assertEquals("expected 1 RemoteUpdate", 1, result.getRemoteUpdates()
122 				.size());
123 		assertEquals("unexpected pack size", 1398, packSize);
124 	}
125 
126 }