| // 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; |
| |
| import static com.google.gerrit.common.UsedAt.Project.GOOGLE; |
| import static java.util.Objects.requireNonNull; |
| |
| import com.google.common.collect.ImmutableList; |
| import com.google.common.collect.ImmutableSet; |
| import com.google.common.collect.Sets; |
| import com.google.gerrit.common.Nullable; |
| import com.google.gerrit.common.UsedAt; |
| import com.google.gerrit.entities.Account; |
| import com.google.gerrit.entities.AccountGroup; |
| import com.google.gerrit.entities.InternalGroup; |
| import com.google.gerrit.exceptions.NoSuchGroupException; |
| import com.google.gerrit.server.Sequences; |
| import com.google.gerrit.server.ServerInitiated; |
| import com.google.gerrit.server.account.AccountsUpdate; |
| import com.google.gerrit.server.account.GroupCache; |
| import com.google.gerrit.server.account.ServiceUserClassifier; |
| import com.google.gerrit.server.account.externalids.ExternalId; |
| import com.google.gerrit.server.account.externalids.ExternalIdFactory; |
| import com.google.gerrit.server.group.db.GroupDelta; |
| import com.google.gerrit.server.group.db.GroupsUpdate; |
| import com.google.inject.Inject; |
| import com.google.inject.Provider; |
| import com.google.inject.Singleton; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Optional; |
| import org.eclipse.jgit.errors.ConfigInvalidException; |
| |
| @Singleton |
| public class AccountCreator { |
| private final Map<String, TestAccount> accounts; |
| |
| private final Sequences sequences; |
| private final Provider<AccountsUpdate> accountsUpdateProvider; |
| private final GroupCache groupCache; |
| private final Provider<GroupsUpdate> groupsUpdateProvider; |
| private final ExternalIdFactory externalIdFactory; |
| |
| @Inject |
| @UsedAt(GOOGLE) |
| protected AccountCreator( |
| Sequences sequences, |
| @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider, |
| GroupCache groupCache, |
| @ServerInitiated Provider<GroupsUpdate> groupsUpdateProvider, |
| ExternalIdFactory externalIdFactory) { |
| accounts = new HashMap<>(); |
| this.sequences = sequences; |
| this.accountsUpdateProvider = accountsUpdateProvider; |
| this.groupCache = groupCache; |
| this.groupsUpdateProvider = groupsUpdateProvider; |
| this.externalIdFactory = externalIdFactory; |
| } |
| |
| public synchronized TestAccount create( |
| @Nullable String username, |
| @Nullable String email, |
| @Nullable String fullName, |
| @Nullable String displayName, |
| String... groupNames) |
| throws Exception { |
| |
| TestAccount account = accounts.get(username); |
| if (account != null) { |
| return account; |
| } |
| Account.Id id = Account.id(sequences.nextAccountId()); |
| |
| List<ExternalId> extIds = new ArrayList<>(2); |
| String httpPass = null; |
| if (username != null) { |
| httpPass = externalIdFactory.arePasswordsAllowed() ? "http-pass" : null; |
| extIds.add(externalIdFactory.createUsername(username, id, httpPass)); |
| } |
| |
| if (email != null) { |
| extIds.add(externalIdFactory.createEmail(id, email)); |
| } |
| |
| accountsUpdateProvider |
| .get() |
| .insert( |
| "Create Test Account", |
| id, |
| u -> |
| u.setFullName(fullName) |
| .setDisplayName(displayName) |
| .setPreferredEmail(email) |
| .addExternalIds(extIds)); |
| |
| ImmutableList.Builder<String> tags = ImmutableList.builder(); |
| addUserToGroups(id, groupNames); |
| if (groupNames != null) { |
| for (String n : groupNames) { |
| if (ServiceUserClassifier.SERVICE_USERS.equals(n)) { |
| tags.add("SERVICE_USER"); |
| } |
| } |
| } |
| |
| account = |
| TestAccount.create(id, username, email, fullName, displayName, httpPass, tags.build()); |
| if (username != null) { |
| accounts.put(username, account); |
| } |
| return account; |
| } |
| |
| protected void addUserToGroups(Account.Id id, String... groupNames) throws Exception { |
| if (groupNames != null) { |
| for (String n : groupNames) { |
| AccountGroup.NameKey k = AccountGroup.nameKey(n); |
| Optional<InternalGroup> group = groupCache.get(k); |
| if (!group.isPresent()) { |
| throw new NoSuchGroupException(n); |
| } |
| addGroupMember(group.get().getGroupUUID(), id); |
| } |
| } |
| } |
| |
| public TestAccount create(@Nullable String username, String group) throws Exception { |
| return create(username, null, username, null, group); |
| } |
| |
| public TestAccount create() throws Exception { |
| return create(null); |
| } |
| |
| public TestAccount create(@Nullable String username) throws Exception { |
| return create(username, null, username, null, (String[]) null); |
| } |
| |
| public TestAccount createValid(String username) throws Exception { |
| return create(username, username + "@example.com", username, username); |
| } |
| |
| public TestAccount admin() throws Exception { |
| return create("admin", "admin@example.com", "Administrator", "Adminny", "Administrators"); |
| } |
| |
| public TestAccount admin2() throws Exception { |
| return create("admin2", "admin2@example.com", "Administrator2", null, "Administrators"); |
| } |
| |
| public TestAccount user1() throws Exception { |
| return create("user1", "user1@example.com", "User1", null); |
| } |
| |
| public TestAccount user2() throws Exception { |
| return create("user2", "user2@example.com", "User2", null); |
| } |
| |
| public TestAccount get(String username) { |
| return requireNonNull( |
| accounts.get(username), () -> String.format("No TestAccount created for %s ", username)); |
| } |
| |
| public void evict(Account.Id id) { |
| evict(ImmutableSet.of(id)); |
| } |
| |
| public void evict(Collection<Account.Id> ids) { |
| accounts.values().removeIf(a -> ids.contains(a.id())); |
| } |
| |
| public ImmutableList<TestAccount> getAll() { |
| return ImmutableList.copyOf(accounts.values()); |
| } |
| |
| protected void addGroupMember(AccountGroup.UUID groupUuid, Account.Id accountId) |
| throws IOException, NoSuchGroupException, ConfigInvalidException { |
| GroupDelta groupDelta = |
| GroupDelta.builder() |
| .setMemberModification(memberIds -> Sets.union(memberIds, ImmutableSet.of(accountId))) |
| .build(); |
| groupsUpdateProvider.get().updateGroup(groupUuid, groupDelta); |
| } |
| } |