// 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.api.project; import static com.google.common.truth.Truth.assertThat; import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS; import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.common.data.Permission; import com.google.gerrit.extensions.api.projects.BranchInput; import com.google.gerrit.extensions.api.projects.ConfigInfo; import com.google.gerrit.extensions.api.projects.ConfigInput; import com.google.gerrit.extensions.api.projects.DescriptionInput; import com.google.gerrit.extensions.api.projects.ProjectInput; import com.google.gerrit.extensions.client.InheritableBoolean; import com.google.gerrit.extensions.client.ProjectState; import com.google.gerrit.extensions.client.SubmitType; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.reviewdb.client.RefNames; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Test; @NoHttpd public class ProjectIT extends AbstractDaemonTest { @Test public void createProject() throws Exception { String name = name("foo"); assertThat(name).isEqualTo(gApi.projects().create(name).get().name); RevCommit head = getRemoteHead(name, RefNames.REFS_CONFIG); eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, null, head); eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", new String[] {}); } @Test public void createProjectWithGitSuffix() throws Exception { String name = name("foo"); assertThat(name).isEqualTo(gApi.projects().create(name + ".git").get().name); RevCommit head = getRemoteHead(name, RefNames.REFS_CONFIG); eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, null, head); eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", new String[] {}); } @Test public void createProjectWithInitialCommit() throws Exception { String name = name("foo"); ProjectInput input = new ProjectInput(); input.name = name; input.createEmptyCommit = true; assertThat(name).isEqualTo(gApi.projects().create(input).get().name); RevCommit head = getRemoteHead(name, RefNames.REFS_CONFIG); eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, null, head); head = getRemoteHead(name, "refs/heads/master"); eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", null, head); } @Test public void createProjectWithMismatchedInput() throws Exception { ProjectInput in = new ProjectInput(); in.name = name("foo"); exception.expect(BadRequestException.class); exception.expectMessage("name must match input.name"); gApi.projects().name("bar").create(in); } @Test public void createProjectNoNameInInput() throws Exception { ProjectInput in = new ProjectInput(); exception.expect(BadRequestException.class); exception.expectMessage("input.name is required"); gApi.projects().create(in); } @Test public void createProjectDuplicate() throws Exception { ProjectInput in = new ProjectInput(); in.name = name("baz"); gApi.projects().create(in); exception.expect(ResourceConflictException.class); exception.expectMessage("Project already exists"); gApi.projects().create(in); } @Test public void createBranch() throws Exception { allow(Permission.READ, ANONYMOUS_USERS, "refs/*"); gApi.projects().name(project.get()).branch("foo").create(new BranchInput()); } @Test public void descriptionChangeCausesRefUpdate() throws Exception { RevCommit initialHead = getRemoteHead(project, RefNames.REFS_CONFIG); assertThat(gApi.projects().name(project.get()).description()).isEmpty(); DescriptionInput in = new DescriptionInput(); in.description = "new project description"; gApi.projects().name(project.get()).description(in); assertThat(gApi.projects().name(project.get()).description()).isEqualTo(in.description); RevCommit updatedHead = getRemoteHead(project, RefNames.REFS_CONFIG); eventRecorder.assertRefUpdatedEvents( project.get(), RefNames.REFS_CONFIG, initialHead, updatedHead); } @Test public void descriptionIsDeletedWhenNotSpecified() throws Exception { assertThat(gApi.projects().name(project.get()).description()).isEmpty(); DescriptionInput in = new DescriptionInput(); in.description = "new project description"; gApi.projects().name(project.get()).description(in); assertThat(gApi.projects().name(project.get()).description()).isEqualTo(in.description); in.description = null; gApi.projects().name(project.get()).description(in); assertThat(gApi.projects().name(project.get()).description()).isEmpty(); } @Test public void configChangeCausesRefUpdate() throws Exception { RevCommit initialHead = getRemoteHead(project, RefNames.REFS_CONFIG); ConfigInfo info = gApi.projects().name(project.get()).config(); assertThat(info.submitType).isEqualTo(SubmitType.MERGE_IF_NECESSARY); ConfigInput input = new ConfigInput(); input.submitType = SubmitType.CHERRY_PICK; info = gApi.projects().name(project.get()).config(input); assertThat(info.submitType).isEqualTo(SubmitType.CHERRY_PICK); info = gApi.projects().name(project.get()).config(); assertThat(info.submitType).isEqualTo(SubmitType.CHERRY_PICK); RevCommit updatedHead = getRemoteHead(project, RefNames.REFS_CONFIG); eventRecorder.assertRefUpdatedEvents( project.get(), RefNames.REFS_CONFIG, initialHead, updatedHead); } @Test public void setConfig() throws Exception { ConfigInput input = createTestConfigInput(); ConfigInfo info = gApi.projects().name(project.get()).config(input); assertThat(info.description).isEqualTo(input.description); assertThat(info.useContributorAgreements.configuredValue) .isEqualTo(input.useContributorAgreements); assertThat(info.useContentMerge.configuredValue).isEqualTo(input.useContentMerge); assertThat(info.useSignedOffBy.configuredValue).isEqualTo(input.useSignedOffBy); assertThat(info.createNewChangeForAllNotInTarget.configuredValue) .isEqualTo(input.createNewChangeForAllNotInTarget); assertThat(info.requireChangeId.configuredValue).isEqualTo(input.requireChangeId); assertThat(info.rejectImplicitMerges.configuredValue).isEqualTo(input.rejectImplicitMerges); assertThat(info.enableReviewerByEmail.configuredValue).isEqualTo(input.enableReviewerByEmail); assertThat(info.createNewChangeForAllNotInTarget.configuredValue) .isEqualTo(input.createNewChangeForAllNotInTarget); assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo(input.maxObjectSizeLimit); assertThat(info.submitType).isEqualTo(input.submitType); assertThat(info.state).isEqualTo(input.state); } @Test public void setPartialConfig() throws Exception { ConfigInput input = createTestConfigInput(); ConfigInfo info = gApi.projects().name(project.get()).config(input); ConfigInput partialInput = new ConfigInput(); partialInput.useContributorAgreements = InheritableBoolean.FALSE; info = gApi.projects().name(project.get()).config(partialInput); assertThat(info.description).isNull(); assertThat(info.useContributorAgreements.configuredValue) .isEqualTo(partialInput.useContributorAgreements); assertThat(info.useContentMerge.configuredValue).isEqualTo(input.useContentMerge); assertThat(info.useSignedOffBy.configuredValue).isEqualTo(input.useSignedOffBy); assertThat(info.createNewChangeForAllNotInTarget.configuredValue) .isEqualTo(input.createNewChangeForAllNotInTarget); assertThat(info.requireChangeId.configuredValue).isEqualTo(input.requireChangeId); assertThat(info.rejectImplicitMerges.configuredValue).isEqualTo(input.rejectImplicitMerges); assertThat(info.enableReviewerByEmail.configuredValue).isEqualTo(input.enableReviewerByEmail); assertThat(info.createNewChangeForAllNotInTarget.configuredValue) .isEqualTo(input.createNewChangeForAllNotInTarget); assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo(input.maxObjectSizeLimit); assertThat(info.submitType).isEqualTo(input.submitType); assertThat(info.state).isEqualTo(input.state); } @Test public void nonOwnerCannotSetConfig() throws Exception { ConfigInput input = createTestConfigInput(); setApiUser(user); exception.expect(AuthException.class); exception.expectMessage("restricted to project owner"); gApi.projects().name(project.get()).config(input); } private ConfigInput createTestConfigInput() { ConfigInput input = new ConfigInput(); input.description = "some description"; input.useContributorAgreements = InheritableBoolean.TRUE; input.useContentMerge = InheritableBoolean.TRUE; input.useSignedOffBy = InheritableBoolean.TRUE; input.createNewChangeForAllNotInTarget = InheritableBoolean.TRUE; input.requireChangeId = InheritableBoolean.TRUE; input.rejectImplicitMerges = InheritableBoolean.TRUE; input.enableReviewerByEmail = InheritableBoolean.TRUE; input.createNewChangeForAllNotInTarget = InheritableBoolean.TRUE; input.maxObjectSizeLimit = "5m"; input.submitType = SubmitType.CHERRY_PICK; input.state = ProjectState.HIDDEN; return input; } }