blob: a8547649bb107e2583850a3be459e87d6966b19a [file] [log] [blame]
// Copyright (C) 2014 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.assertThatNameList;
import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
import static org.junit.Assert.fail;
import com.google.common.collect.Iterables;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.acceptance.Sandboxed;
import com.google.gerrit.acceptance.TestProjectInput;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.api.projects.ConfigInfo;
import com.google.gerrit.extensions.api.projects.ConfigInput;
import com.google.gerrit.extensions.api.projects.Projects.ListRequest;
import com.google.gerrit.extensions.api.projects.Projects.ListRequest.FilterType;
import com.google.gerrit.extensions.client.ProjectState;
import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.AllUsersName;
import com.google.gerrit.server.git.ProjectConfig;
import com.google.gerrit.server.project.ProjectCacheImpl;
import com.google.gerrit.server.project.Util;
import com.google.inject.Inject;
import java.util.List;
import java.util.Map;
import org.junit.Test;
@NoHttpd
@Sandboxed
public class ListProjectsIT extends AbstractDaemonTest {
@Inject private AllUsersName allUsers;
@Test
public void listProjects() throws Exception {
Project.NameKey someProject = createProject("some-project");
assertThatNameList(filter(gApi.projects().list().get()))
.containsExactly(allProjects, allUsers, project, someProject)
.inOrder();
}
@Test
public void listProjectsFiltersInvisibleProjects() throws Exception {
setApiUser(user);
assertThatNameList(gApi.projects().list().get()).contains(project);
ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*");
saveProjectConfig(project, cfg);
assertThatNameList(filter(gApi.projects().list().get())).doesNotContain(project);
}
@Test
public void listProjectsWithBranch() throws Exception {
Map<String, ProjectInfo> result = gApi.projects().list().addShowBranch("master").getAsMap();
assertThat(result).containsKey(project.get());
ProjectInfo info = result.get(project.get());
assertThat(info.branches).isNotNull();
assertThat(info.branches).hasSize(1);
assertThat(info.branches.get("master")).isNotNull();
}
@Test
@TestProjectInput(description = "Description of some-project")
public void listProjectWithDescription() throws Exception {
// description not be included in the results by default.
Map<String, ProjectInfo> result = gApi.projects().list().getAsMap();
assertThat(result).containsKey(project.get());
assertThat(result.get(project.get()).description).isNull();
result = gApi.projects().list().withDescription(true).getAsMap();
assertThat(result).containsKey(project.get());
assertThat(result.get(project.get()).description).isEqualTo("Description of some-project");
}
@Test
public void listProjectsWithLimit() throws Exception {
ProjectCacheImpl projectCacheImpl = (ProjectCacheImpl) projectCache;
for (int i = 0; i < 5; i++) {
createProject("someProject" + i);
}
String p = name("");
// 5, plus p which was automatically created.
int n = 6;
projectCacheImpl.evictAllByName();
for (int i = 1; i <= n + 2; i++) {
assertThatNameList(gApi.projects().list().withPrefix(p).withLimit(i).get())
.hasSize(Math.min(i, n));
assertThat(projectCacheImpl.sizeAllByName())
.isAtMost((long) (i + 2)); // 2 = AllProjects + AllUsers
}
}
@Test
public void listProjectsWithPrefix() throws Exception {
Project.NameKey someProject = createProject("some-project");
Project.NameKey someOtherProject = createProject("some-other-project");
createProject("project-awesome");
String p = name("some");
assertBadRequest(gApi.projects().list().withPrefix(p).withRegex(".*"));
assertBadRequest(gApi.projects().list().withPrefix(p).withSubstring(p));
assertThatNameList(filter(gApi.projects().list().withPrefix(p).get()))
.containsExactly(someOtherProject, someProject)
.inOrder();
p = name("SOME");
assertThatNameList(filter(gApi.projects().list().withPrefix(p).get())).isEmpty();
}
@Test
public void listProjectsWithRegex() throws Exception {
Project.NameKey someProject = createProject("some-project");
Project.NameKey someOtherProject = createProject("some-other-project");
Project.NameKey projectAwesome = createProject("project-awesome");
assertBadRequest(gApi.projects().list().withRegex("[.*"));
assertBadRequest(gApi.projects().list().withRegex(".*").withPrefix("p"));
assertBadRequest(gApi.projects().list().withRegex(".*").withSubstring("p"));
assertThatNameList(filter(gApi.projects().list().withRegex(".*some").get()))
.containsExactly(projectAwesome);
String r = name("some-project$").replace(".", "\\.");
assertThatNameList(filter(gApi.projects().list().withRegex(r).get()))
.containsExactly(someProject);
assertThatNameList(filter(gApi.projects().list().withRegex(".*").get()))
.containsExactly(
allProjects, allUsers, project, projectAwesome, someOtherProject, someProject)
.inOrder();
}
@Test
public void listProjectsWithStart() throws Exception {
for (int i = 0; i < 5; i++) {
createProject(new Project.NameKey("someProject" + i).get());
}
String p = name("");
List<ProjectInfo> all = gApi.projects().list().withPrefix(p).get();
// 5, plus p which was automatically created.
int n = 6;
assertThat(all).hasSize(n);
assertThatNameList(gApi.projects().list().withPrefix(p).withStart(n - 1).get())
.containsExactly(new Project.NameKey(Iterables.getLast(all).name));
}
@Test
public void listProjectsWithSubstring() throws Exception {
Project.NameKey someProject = createProject("some-project");
Project.NameKey someOtherProject = createProject("some-other-project");
Project.NameKey projectAwesome = createProject("project-awesome");
assertBadRequest(gApi.projects().list().withSubstring("some").withRegex(".*"));
assertBadRequest(gApi.projects().list().withSubstring("some").withPrefix("some"));
assertThatNameList(filter(gApi.projects().list().withSubstring("some").get()))
.containsExactly(projectAwesome, someOtherProject, someProject)
.inOrder();
assertThatNameList(filter(gApi.projects().list().withSubstring("SOME").get()))
.containsExactly(projectAwesome, someOtherProject, someProject)
.inOrder();
}
@Test
public void listProjectsWithTree() throws Exception {
Project.NameKey someParentProject = createProject("some-parent-project");
Project.NameKey someChildProject = createProject("some-child-project", someParentProject);
Map<String, ProjectInfo> result = gApi.projects().list().withTree(true).getAsMap();
assertThat(result).containsKey(someChildProject.get());
assertThat(result.get(someChildProject.get()).parent).isEqualTo(someParentProject.get());
}
@Test
public void listProjectWithType() throws Exception {
Map<String, ProjectInfo> result =
gApi.projects().list().withType(FilterType.PERMISSIONS).getAsMap();
assertThat(result).hasSize(1);
assertThat(result).containsKey(allProjects.get());
assertThatNameList(filter(gApi.projects().list().withType(FilterType.ALL).get()))
.containsExactly(allProjects, allUsers, project)
.inOrder();
}
@Test
public void listParentCandidates() throws Exception {
Map<String, ProjectInfo> result =
gApi.projects().list().withType(FilterType.PARENT_CANDIDATES).getAsMap();
assertThat(result).hasSize(1);
assertThat(result).containsKey(allProjects.get());
// Create a new project with 'project' as parent
Project.NameKey testProject = createProject(name("test"), project);
// Parent candidates are All-Projects and 'project'
assertThatNameList(filter(gApi.projects().list().withType(FilterType.PARENT_CANDIDATES).get()))
.containsExactly(allProjects, project)
.inOrder();
// All projects are listed
assertThatNameList(filter(gApi.projects().list().get()))
.containsExactly(allProjects, allUsers, testProject, project)
.inOrder();
}
@Test
public void listWithHiddenProject() throws Exception {
Project.NameKey hidden = createProject("project-to-hide");
// The project is included because it was not hidden yet
assertThatNameList(gApi.projects().list().get())
.containsExactly(allProjects, allUsers, project, hidden)
.inOrder();
// Hide the project
ConfigInput input = new ConfigInput();
input.state = ProjectState.HIDDEN;
ConfigInfo info = gApi.projects().name(hidden.get()).config(input);
assertThat(info.state).isEqualTo(input.state);
// Project is still accessible directly
gApi.projects().name(hidden.get()).get();
// But is not included in the list
assertThatNameList(gApi.projects().list().get())
.containsExactly(allProjects, allUsers, project)
.inOrder();
// ALL filter applies to type, and doesn't include hidden state
assertThatNameList(gApi.projects().list().withType(FilterType.ALL).get())
.containsExactly(allProjects, allUsers, project)
.inOrder();
}
private void assertBadRequest(ListRequest req) throws Exception {
try {
req.get();
fail("Expected BadRequestException");
} catch (BadRequestException expected) {
// Expected.
}
}
private Iterable<ProjectInfo> filter(Iterable<ProjectInfo> infos) {
String prefix = name("");
return Iterables.filter(
infos,
p -> {
return p.name != null
&& (p.name.equals(allProjects.get())
|| p.name.equals(allUsers.get())
|| p.name.startsWith(prefix));
});
}
}