com.google.gerrit.acceptance.rest.project.CreateProjectIT.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gerrit.acceptance.rest.project.CreateProjectIT.java

Source

// Copyright (C) 2013 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.rest.project;

import static com.google.common.truth.Truth.assertThat;
import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertProjectInfo;
import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertProjectOwners;

import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.common.net.HttpHeaders;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.acceptance.UseLocalDisk;
import com.google.gerrit.extensions.api.projects.ProjectInput;
import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.extensions.client.SubmitType;
import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.group.SystemGroupBackend;
import com.google.gerrit.server.project.ProjectState;

import org.apache.http.HttpStatus;
import org.apache.http.message.BasicHeader;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.junit.Test;

import java.io.IOException;
import java.util.Collections;
import java.util.Set;

public class CreateProjectIT extends AbstractDaemonTest {
    @Test
    public void testCreateProjectHttp() throws Exception {
        String newProjectName = name("newProject");
        RestResponse r = adminSession.put("/projects/" + newProjectName);
        assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_CREATED);
        ProjectInfo p = newGson().fromJson(r.getReader(), ProjectInfo.class);
        assertThat(p.name).isEqualTo(newProjectName);
        ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
        assertThat(projectState).isNotNull();
        assertProjectInfo(projectState.getProject(), p);
        assertHead(newProjectName, "refs/heads/master");
    }

    @Test
    public void testCreateProjectHttpWhenProjectAlreadyExists_Conflict() throws Exception {
        RestResponse r = adminSession.put("/projects/" + allProjects.get());
        assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_CONFLICT);
    }

    @Test
    public void testCreateProjectHttpWhenProjectAlreadyExists_PreconditionFailed() throws Exception {
        RestResponse r = adminSession.putWithHeader("/projects/" + allProjects.get(),
                new BasicHeader(HttpHeaders.IF_NONE_MATCH, "*"));
        assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_PRECONDITION_FAILED);
    }

    @Test
    @UseLocalDisk
    public void testCreateProjectHttpWithUnreasonableName_BadRequest() throws Exception {
        RestResponse r = adminSession.put("/projects/" + Url.encode(name("invalid/../name")));
        assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_BAD_REQUEST);
    }

    @Test
    public void testCreateProjectHttpWithNameMismatch_BadRequest() throws Exception {
        ProjectInput in = new ProjectInput();
        in.name = name("otherName");
        RestResponse r = adminSession.put("/projects/" + name("someName"), in);
        assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_BAD_REQUEST);
    }

    @Test
    public void testCreateProjectHttpWithInvalidRefName_BadRequest() throws Exception {
        ProjectInput in = new ProjectInput();
        in.branches = Collections.singletonList(name("invalid ref name"));
        RestResponse r = adminSession.put("/projects/" + name("newProject"), in);
        assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_BAD_REQUEST);
    }

    @Test
    public void testCreateProject() throws Exception {
        String newProjectName = name("newProject");
        ProjectInfo p = gApi.projects().create(newProjectName).get();
        assertThat(p.name).isEqualTo(newProjectName);
        ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
        assertThat(projectState).isNotNull();
        assertProjectInfo(projectState.getProject(), p);
        assertHead(newProjectName, "refs/heads/master");
    }

    @Test
    public void testCreateProjectWithGitSuffix() throws Exception {
        String newProjectName = name("newProject");
        ProjectInfo p = gApi.projects().create(newProjectName + ".git").get();
        assertThat(p.name).isEqualTo(newProjectName);
        ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
        assertThat(projectState).isNotNull();
        assertProjectInfo(projectState.getProject(), p);
        assertHead(newProjectName, "refs/heads/master");
    }

    @Test
    public void testCreateProjectWithProperties() throws Exception {
        String newProjectName = name("newProject");
        ProjectInput in = new ProjectInput();
        in.name = newProjectName;
        in.description = "Test description";
        in.submitType = SubmitType.CHERRY_PICK;
        in.useContributorAgreements = InheritableBoolean.TRUE;
        in.useSignedOffBy = InheritableBoolean.TRUE;
        in.useContentMerge = InheritableBoolean.TRUE;
        in.requireChangeId = InheritableBoolean.TRUE;
        ProjectInfo p = gApi.projects().create(in).get();
        assertThat(p.name).isEqualTo(newProjectName);
        Project project = projectCache.get(new Project.NameKey(newProjectName)).getProject();
        assertProjectInfo(project, p);
        assertThat(project.getDescription()).isEqualTo(in.description);
        assertThat(project.getSubmitType()).isEqualTo(in.submitType);
        assertThat(project.getUseContributorAgreements()).isEqualTo(in.useContributorAgreements);
        assertThat(project.getUseSignedOffBy()).isEqualTo(in.useSignedOffBy);
        assertThat(project.getUseContentMerge()).isEqualTo(in.useContentMerge);
        assertThat(project.getRequireChangeID()).isEqualTo(in.requireChangeId);
    }

    @Test
    public void testCreateChildProject() throws Exception {
        String parentName = name("parent");
        ProjectInput in = new ProjectInput();
        in.name = parentName;
        gApi.projects().create(in);

        String childName = name("child");
        in = new ProjectInput();
        in.name = childName;
        in.parent = parentName;
        gApi.projects().create(in);
        Project project = projectCache.get(new Project.NameKey(childName)).getProject();
        assertThat(project.getParentName()).isEqualTo(in.parent);
    }

    @Test
    public void testCreateChildProjectUnderNonExistingParent_UnprocessableEntity() throws Exception {
        ProjectInput in = new ProjectInput();
        in.name = name("newProjectName");
        in.parent = "non-existing-project";
        assertCreateFails(in, UnprocessableEntityException.class);
    }

    @Test
    public void testCreateProjectWithOwner() throws Exception {
        String newProjectName = name("newProject");
        ProjectInput in = new ProjectInput();
        in.name = newProjectName;
        in.owners = Lists.newArrayListWithCapacity(3);
        in.owners.add("Anonymous Users"); // by name
        in.owners.add(SystemGroupBackend.REGISTERED_USERS.get()); // by UUID
        in.owners.add(Integer.toString(groupCache.get(new AccountGroup.NameKey("Administrators")).getId().get())); // by ID
        gApi.projects().create(in);
        ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
        Set<AccountGroup.UUID> expectedOwnerIds = Sets.newHashSetWithExpectedSize(3);
        expectedOwnerIds.add(SystemGroupBackend.ANONYMOUS_USERS);
        expectedOwnerIds.add(SystemGroupBackend.REGISTERED_USERS);
        expectedOwnerIds.add(groupUuid("Administrators"));
        assertProjectOwners(expectedOwnerIds, projectState);
    }

    @Test
    public void testCreateProjectWithNonExistingOwner_UnprocessableEntity() throws Exception {
        ProjectInput in = new ProjectInput();
        in.name = name("newProjectName");
        in.owners = Collections.singletonList("non-existing-group");
        assertCreateFails(in, UnprocessableEntityException.class);
    }

    @Test
    public void testCreatePermissionOnlyProject() throws Exception {
        String newProjectName = name("newProject");
        ProjectInput in = new ProjectInput();
        in.name = newProjectName;
        in.permissionsOnly = true;
        gApi.projects().create(in);
        assertHead(newProjectName, RefNames.REFS_CONFIG);
    }

    @Test
    public void testCreateProjectWithEmptyCommit() throws Exception {
        String newProjectName = name("newProject");
        ProjectInput in = new ProjectInput();
        in.name = newProjectName;
        in.createEmptyCommit = true;
        gApi.projects().create(in);
        assertEmptyCommit(newProjectName, "refs/heads/master");
    }

    @Test
    public void testCreateProjectWithBranches() throws Exception {
        String newProjectName = name("newProject");
        ProjectInput in = new ProjectInput();
        in.name = newProjectName;
        in.createEmptyCommit = true;
        in.branches = Lists.newArrayListWithCapacity(3);
        in.branches.add("refs/heads/test");
        in.branches.add("refs/heads/master");
        in.branches.add("release"); // without 'refs/heads' prefix
        gApi.projects().create(in);
        assertHead(newProjectName, "refs/heads/test");
        assertEmptyCommit(newProjectName, "refs/heads/test", "refs/heads/master", "refs/heads/release");
    }

    @Test
    public void testCreateProjectWithoutCapability_Forbidden() throws Exception {
        setApiUser(user);
        ProjectInput in = new ProjectInput();
        in.name = name("newProject");
        assertCreateFails(in, AuthException.class);
    }

    @Test
    public void testCreateProjectWhenProjectAlreadyExists_Conflict() throws Exception {
        ProjectInput in = new ProjectInput();
        in.name = allProjects.get();
        assertCreateFails(in, ResourceConflictException.class);
    }

    private AccountGroup.UUID groupUuid(String groupName) {
        return groupCache.get(new AccountGroup.NameKey(groupName)).getGroupUUID();
    }

    private void assertHead(String projectName, String expectedRef)
            throws RepositoryNotFoundException, IOException {
        try (Repository repo = repoManager.openRepository(new Project.NameKey(projectName))) {
            assertThat(repo.getRef(Constants.HEAD).getTarget().getName()).isEqualTo(expectedRef);
        }
    }

    private void assertEmptyCommit(String projectName, String... refs)
            throws RepositoryNotFoundException, IOException {
        Project.NameKey projectKey = new Project.NameKey(projectName);
        try (Repository repo = repoManager.openRepository(projectKey);
                RevWalk rw = new RevWalk(repo);
                TreeWalk tw = new TreeWalk(rw.getObjectReader())) {
            for (String ref : refs) {
                RevCommit commit = rw.lookupCommit(repo.getRef(ref).getObjectId());
                rw.parseBody(commit);
                tw.addTree(commit.getTree());
                assertThat(tw.next()).isFalse();
                tw.reset();
            }
        }
    }

    private void assertCreateFails(ProjectInput in, Class<? extends RestApiException> errType) throws Exception {
        exception.expect(errType);
        gApi.projects().create(in);
    }
}