summaryrefslogtreecommitdiffstats
path: root/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java')
-rw-r--r--gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java365
1 files changed, 0 insertions, 365 deletions
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java
deleted file mode 100644
index e2e29c9221..0000000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright (C) 2015 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.gerrit.acceptance;
-
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.Lists;
-import com.google.gerrit.acceptance.InProcessProtocol.Context;
-import com.google.gerrit.common.data.Capable;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.AccessPath;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.RemotePeer;
-import com.google.gerrit.server.RequestCleanup;
-import com.google.gerrit.server.config.GerritRequestModule;
-import com.google.gerrit.server.config.RequestScopedReviewDbProvider;
-import com.google.gerrit.server.git.ReceivePackInitializer;
-import com.google.gerrit.server.git.TransferConfig;
-import com.google.gerrit.server.git.UploadPackInitializer;
-import com.google.gerrit.server.git.VisibleRefFilter;
-import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
-import com.google.gerrit.server.git.validators.UploadValidators;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.RequestScopePropagator;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestScopePropagator;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Key;
-import com.google.inject.Module;
-import com.google.inject.OutOfScopeException;
-import com.google.inject.Provider;
-import com.google.inject.Provides;
-import com.google.inject.Scope;
-import com.google.inject.servlet.RequestScoped;
-import com.google.inject.util.Providers;
-import java.io.IOException;
-import java.net.SocketAddress;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.PostReceiveHook;
-import org.eclipse.jgit.transport.PostReceiveHookChain;
-import org.eclipse.jgit.transport.PreUploadHook;
-import org.eclipse.jgit.transport.PreUploadHookChain;
-import org.eclipse.jgit.transport.ReceivePack;
-import org.eclipse.jgit.transport.TestProtocol;
-import org.eclipse.jgit.transport.UploadPack;
-import org.eclipse.jgit.transport.resolver.ReceivePackFactory;
-import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
-import org.eclipse.jgit.transport.resolver.UploadPackFactory;
-
-class InProcessProtocol extends TestProtocol<Context> {
- static Module module() {
- return new AbstractModule() {
- @Override
- public void configure() {
- install(new GerritRequestModule());
- bind(RequestScopePropagator.class).to(Propagator.class);
- bindScope(RequestScoped.class, InProcessProtocol.REQUEST);
- }
-
- @Provides
- @RemotePeer
- SocketAddress getSocketAddress() {
- // TODO(dborowitz): Could potentially fake this with thread ID or
- // something.
- throw new OutOfScopeException("No remote peer in acceptance tests");
- }
- };
- }
-
- private static final Scope REQUEST =
- new Scope() {
- @Override
- public <T> Provider<T> scope(Key<T> key, Provider<T> creator) {
- return new Provider<T>() {
- @Override
- public T get() {
- Context ctx = current.get();
- if (ctx == null) {
- throw new OutOfScopeException("Not in TestProtocol scope");
- }
- return ctx.get(key, creator);
- }
-
- @Override
- public String toString() {
- return String.format("%s[%s]", creator, REQUEST);
- }
- };
- }
-
- @Override
- public String toString() {
- return "InProcessProtocol.REQUEST";
- }
- };
-
- private static class Propagator extends ThreadLocalRequestScopePropagator<Context> {
- @Inject
- Propagator(
- ThreadLocalRequestContext local,
- Provider<RequestScopedReviewDbProvider> dbProviderProvider) {
- super(REQUEST, current, local, dbProviderProvider);
- }
-
- @Override
- protected Context continuingContext(Context ctx) {
- return ctx.newContinuingContext();
- }
- }
-
- private static final ThreadLocal<Context> current = new ThreadLocal<>();
-
- // TODO(dborowitz): Merge this with AcceptanceTestRequestScope.
- /**
- * Multi-purpose session/context object.
- *
- * <p>Confusingly, Gerrit has two ideas of what a "context" object is: one for Guice {@link
- * RequestScoped}, and one for its own simplified version of request scoping using {@link
- * ThreadLocalRequestContext}. This class provides both, in essence just delegating the {@code
- * ThreadLocalRequestContext} scoping to the Guice scoping mechanism.
- *
- * <p>It is also used as the session type for {@code UploadPackFactory} and {@code
- * ReceivePackFactory}, since, after all, it encapsulates all the information about a single
- * request.
- */
- static class Context implements RequestContext {
- private static final Key<RequestScopedReviewDbProvider> DB_KEY =
- Key.get(RequestScopedReviewDbProvider.class);
- private static final Key<RequestCleanup> RC_KEY = Key.get(RequestCleanup.class);
- private static final Key<CurrentUser> USER_KEY = Key.get(CurrentUser.class);
-
- private final SchemaFactory<ReviewDb> schemaFactory;
- private final IdentifiedUser.GenericFactory userFactory;
- private final Account.Id accountId;
- private final Project.NameKey project;
- private final RequestCleanup cleanup;
- private final Map<Key<?>, Object> map;
-
- Context(
- SchemaFactory<ReviewDb> schemaFactory,
- IdentifiedUser.GenericFactory userFactory,
- Account.Id accountId,
- Project.NameKey project) {
- this.schemaFactory = schemaFactory;
- this.userFactory = userFactory;
- this.accountId = accountId;
- this.project = project;
- map = new HashMap<>();
- cleanup = new RequestCleanup();
- map.put(DB_KEY, new RequestScopedReviewDbProvider(schemaFactory, Providers.of(cleanup)));
- map.put(RC_KEY, cleanup);
-
- IdentifiedUser user = userFactory.create(accountId);
- user.setAccessPath(AccessPath.GIT);
- map.put(USER_KEY, user);
- }
-
- private Context newContinuingContext() {
- return new Context(schemaFactory, userFactory, accountId, project);
- }
-
- @Override
- public CurrentUser getUser() {
- return get(USER_KEY, null);
- }
-
- @Override
- public Provider<ReviewDb> getReviewDbProvider() {
- return get(DB_KEY, null);
- }
-
- private synchronized <T> T get(Key<T> key, Provider<T> creator) {
- @SuppressWarnings("unchecked")
- T t = (T) map.get(key);
- if (t == null) {
- t = creator.get();
- map.put(key, t);
- }
- return t;
- }
- }
-
- private static class Upload implements UploadPackFactory<Context> {
- private final Provider<CurrentUser> userProvider;
- private final VisibleRefFilter.Factory refFilterFactory;
- private final TransferConfig transferConfig;
- private final DynamicSet<UploadPackInitializer> uploadPackInitializers;
- private final DynamicSet<PreUploadHook> preUploadHooks;
- private final UploadValidators.Factory uploadValidatorsFactory;
- private final ThreadLocalRequestContext threadContext;
- private final ProjectCache projectCache;
- private final PermissionBackend permissionBackend;
-
- @Inject
- Upload(
- Provider<CurrentUser> userProvider,
- VisibleRefFilter.Factory refFilterFactory,
- TransferConfig transferConfig,
- DynamicSet<UploadPackInitializer> uploadPackInitializers,
- DynamicSet<PreUploadHook> preUploadHooks,
- UploadValidators.Factory uploadValidatorsFactory,
- ThreadLocalRequestContext threadContext,
- ProjectCache projectCache,
- PermissionBackend permissionBackend) {
- this.userProvider = userProvider;
- this.refFilterFactory = refFilterFactory;
- this.transferConfig = transferConfig;
- this.uploadPackInitializers = uploadPackInitializers;
- this.preUploadHooks = preUploadHooks;
- this.uploadValidatorsFactory = uploadValidatorsFactory;
- this.threadContext = threadContext;
- this.projectCache = projectCache;
- this.permissionBackend = permissionBackend;
- }
-
- @Override
- public UploadPack create(Context req, Repository repo) throws ServiceNotAuthorizedException {
- // Set the request context, but don't bother unsetting, since we don't
- // have an easy way to run code when this instance is done being used.
- // Each operation is run in its own thread, so we don't need to recover
- // its original context anyway.
- threadContext.setContext(req);
- current.set(req);
-
- try {
- permissionBackend
- .user(userProvider)
- .project(req.project)
- .check(ProjectPermission.RUN_UPLOAD_PACK);
- } catch (AuthException e) {
- throw new ServiceNotAuthorizedException();
- } catch (PermissionBackendException e) {
- throw new RuntimeException(e);
- }
-
- ProjectState projectState;
- try {
- projectState = projectCache.checkedGet(req.project);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- if (projectState == null) {
- throw new RuntimeException("can't load project state for " + req.project.get());
- }
- UploadPack up = new UploadPack(repo);
- up.setPackConfig(transferConfig.getPackConfig());
- up.setTimeout(transferConfig.getTimeout());
- up.setAdvertiseRefsHook(refFilterFactory.create(projectState, repo));
- List<PreUploadHook> hooks = Lists.newArrayList(preUploadHooks);
- hooks.add(uploadValidatorsFactory.create(projectState.getProject(), repo, "localhost-test"));
- up.setPreUploadHook(PreUploadHookChain.newChain(hooks));
- for (UploadPackInitializer initializer : uploadPackInitializers) {
- initializer.init(req.project, up);
- }
- return up;
- }
- }
-
- private static class Receive implements ReceivePackFactory<Context> {
- private final Provider<CurrentUser> userProvider;
- private final ProjectControl.GenericFactory projectControlFactory;
- private final AsyncReceiveCommits.Factory factory;
- private final TransferConfig config;
- private final DynamicSet<ReceivePackInitializer> receivePackInitializers;
- private final DynamicSet<PostReceiveHook> postReceiveHooks;
- private final ThreadLocalRequestContext threadContext;
- private final PermissionBackend permissionBackend;
-
- @Inject
- Receive(
- Provider<CurrentUser> userProvider,
- ProjectControl.GenericFactory projectControlFactory,
- AsyncReceiveCommits.Factory factory,
- TransferConfig config,
- DynamicSet<ReceivePackInitializer> receivePackInitializers,
- DynamicSet<PostReceiveHook> postReceiveHooks,
- ThreadLocalRequestContext threadContext,
- PermissionBackend permissionBackend) {
- this.userProvider = userProvider;
- this.projectControlFactory = projectControlFactory;
- this.factory = factory;
- this.config = config;
- this.receivePackInitializers = receivePackInitializers;
- this.postReceiveHooks = postReceiveHooks;
- this.threadContext = threadContext;
- this.permissionBackend = permissionBackend;
- }
-
- @Override
- public ReceivePack create(Context req, Repository db) throws ServiceNotAuthorizedException {
- // Set the request context, but don't bother unsetting, since we don't
- // have an easy way to run code when this instance is done being used.
- // Each operation is run in its own thread, so we don't need to recover
- // its original context anyway.
- threadContext.setContext(req);
- current.set(req);
- try {
- permissionBackend
- .user(userProvider)
- .project(req.project)
- .check(ProjectPermission.RUN_RECEIVE_PACK);
- } catch (AuthException e) {
- throw new ServiceNotAuthorizedException();
- } catch (PermissionBackendException e) {
- throw new RuntimeException(e);
- }
- try {
- ProjectControl ctl = projectControlFactory.controlFor(req.project, userProvider.get());
- AsyncReceiveCommits arc = factory.create(ctl, db, null, ImmutableSetMultimap.of());
- ReceivePack rp = arc.getReceivePack();
-
- Capable r = arc.canUpload();
- if (r != Capable.OK) {
- throw new ServiceNotAuthorizedException();
- }
-
- rp.setRefLogIdent(ctl.getUser().asIdentifiedUser().newRefLogIdent());
- rp.setTimeout(config.getTimeout());
- rp.setMaxObjectSizeLimit(config.getMaxObjectSizeLimit());
-
- for (ReceivePackInitializer initializer : receivePackInitializers) {
- initializer.init(ctl.getProject().getNameKey(), rp);
- }
-
- rp.setPostReceiveHook(PostReceiveHookChain.newChain(Lists.newArrayList(postReceiveHooks)));
- return rp;
- } catch (NoSuchProjectException | IOException e) {
- throw new RuntimeException(e);
- }
- }
- }
-
- @Inject
- InProcessProtocol(Upload uploadPackFactory, Receive receivePackFactory) {
- super(uploadPackFactory, receivePackFactory);
- }
-}