summaryrefslogtreecommitdiffstats
path: root/java/com/google/gerrit/acceptance/AccountCreator.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/google/gerrit/acceptance/AccountCreator.java')
-rw-r--r--java/com/google/gerrit/acceptance/AccountCreator.java167
1 files changed, 167 insertions, 0 deletions
diff --git a/java/com/google/gerrit/acceptance/AccountCreator.java b/java/com/google/gerrit/acceptance/AccountCreator.java
new file mode 100644
index 0000000000..b8a8776d26
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/AccountCreator.java
@@ -0,0 +1,167 @@
+// 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 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.errors.NoSuchGroupException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+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.externalids.ExternalId;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gwtorm.server.OrmException;
+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;
+
+ @Inject
+ AccountCreator(
+ Sequences sequences,
+ @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider,
+ GroupCache groupCache,
+ @ServerInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
+ accounts = new HashMap<>();
+ this.sequences = sequences;
+ this.accountsUpdateProvider = accountsUpdateProvider;
+ this.groupCache = groupCache;
+ this.groupsUpdateProvider = groupsUpdateProvider;
+ }
+
+ public synchronized TestAccount create(
+ @Nullable String username,
+ @Nullable String email,
+ @Nullable String fullName,
+ String... groupNames)
+ throws Exception {
+
+ TestAccount account = accounts.get(username);
+ if (account != null) {
+ return account;
+ }
+ Account.Id id = new Account.Id(sequences.nextAccountId());
+
+ List<ExternalId> extIds = new ArrayList<>(2);
+ String httpPass = null;
+ if (username != null) {
+ httpPass = "http-pass";
+ extIds.add(ExternalId.createUsername(username, id, httpPass));
+ }
+
+ if (email != null) {
+ extIds.add(ExternalId.createEmail(id, email));
+ }
+
+ accountsUpdateProvider
+ .get()
+ .insert(
+ "Create Test Account",
+ id,
+ u -> u.setFullName(fullName).setPreferredEmail(email).addExternalIds(extIds));
+
+ if (groupNames != null) {
+ for (String n : groupNames) {
+ AccountGroup.NameKey k = new AccountGroup.NameKey(n);
+ Optional<InternalGroup> group = groupCache.get(k);
+ if (!group.isPresent()) {
+ throw new NoSuchGroupException(n);
+ }
+ addGroupMember(group.get().getGroupUUID(), id);
+ }
+ }
+
+ account = new TestAccount(id, username, email, fullName, httpPass);
+ if (username != null) {
+ accounts.put(username, account);
+ }
+ return account;
+ }
+
+ public TestAccount create(@Nullable String username, String group) throws Exception {
+ return create(username, null, username, group);
+ }
+
+ public TestAccount create() throws Exception {
+ return create(null);
+ }
+
+ public TestAccount create(@Nullable String username) throws Exception {
+ return create(username, null, username, (String[]) null);
+ }
+
+ public TestAccount admin() throws Exception {
+ return create("admin", "admin@example.com", "Administrator", "Administrators");
+ }
+
+ public TestAccount admin2() throws Exception {
+ return create("admin2", "admin2@example.com", "Administrator2", "Administrators");
+ }
+
+ public TestAccount user() throws Exception {
+ return create("user", "user@example.com", "User");
+ }
+
+ public TestAccount user2() throws Exception {
+ return create("user2", "user2@example.com", "User2");
+ }
+
+ public TestAccount get(String username) {
+ return requireNonNull(
+ accounts.get(username), () -> String.format("No TestAccount created for %s ", username));
+ }
+
+ public void evict(Collection<Account.Id> ids) {
+ accounts.values().removeIf(a -> ids.contains(a.id));
+ }
+
+ public ImmutableList<TestAccount> getAll() {
+ return ImmutableList.copyOf(accounts.values());
+ }
+
+ private void addGroupMember(AccountGroup.UUID groupUuid, Account.Id accountId)
+ throws OrmException, IOException, NoSuchGroupException, ConfigInvalidException {
+ InternalGroupUpdate groupUpdate =
+ InternalGroupUpdate.builder()
+ .setMemberModification(memberIds -> Sets.union(memberIds, ImmutableSet.of(accountId)))
+ .build();
+ groupsUpdateProvider.get().updateGroup(groupUuid, groupUpdate);
+ }
+}