summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java')
-rw-r--r--gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java672
1 files changed, 0 insertions, 672 deletions
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java
deleted file mode 100644
index 05f6796d40..0000000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java
+++ /dev/null
@@ -1,672 +0,0 @@
-// Copyright (C) 2016 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.server.query.account;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.toList;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.gerrit.extensions.api.access.AccessSectionInfo;
-import com.google.gerrit.extensions.api.access.PermissionInfo;
-import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
-import com.google.gerrit.extensions.api.access.ProjectAccessInput;
-import com.google.gerrit.extensions.api.accounts.Accounts.QueryRequest;
-import com.google.gerrit.extensions.api.groups.GroupInput;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.client.ListAccountsOption;
-import com.google.gerrit.extensions.client.ProjectWatchInfo;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountConfig;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.Accounts;
-import com.google.gerrit.server.account.AccountsUpdate;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.index.account.AccountIndex;
-import com.google.gerrit.server.index.account.AccountIndexCollection;
-import com.google.gerrit.server.schema.SchemaCreator;
-import com.google.gerrit.server.util.ManualRequestContext;
-import com.google.gerrit.server.util.OneOffRequestContext;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.GerritServerTests;
-import com.google.gerrit.testutil.InMemoryDatabase;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.util.Providers;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
-@Ignore
-public abstract class AbstractQueryAccountsTest extends GerritServerTests {
- @ConfigSuite.Default
- public static Config defaultConfig() {
- Config cfg = new Config();
- cfg.setInt("index", null, "maxPages", 10);
- return cfg;
- }
-
- @Inject protected Accounts accounts;
-
- @Inject protected AccountsUpdate.Server accountsUpdate;
-
- @Inject protected AccountCache accountCache;
-
- @Inject protected AccountManager accountManager;
-
- @Inject protected GerritApi gApi;
-
- @Inject @GerritPersonIdent Provider<PersonIdent> serverIdent;
-
- @Inject protected IdentifiedUser.GenericFactory userFactory;
-
- @Inject private Provider<AnonymousUser> anonymousUser;
-
- @Inject protected InMemoryDatabase schemaFactory;
-
- @Inject protected SchemaCreator schemaCreator;
-
- @Inject protected ThreadLocalRequestContext requestContext;
-
- @Inject protected OneOffRequestContext oneOffRequestContext;
-
- @Inject protected Provider<InternalAccountQuery> queryProvider;
-
- @Inject protected AllProjectsName allProjects;
-
- @Inject protected AllUsersName allUsers;
-
- @Inject protected GitRepositoryManager repoManager;
-
- @Inject protected AccountIndexCollection accountIndexes;
-
- protected LifecycleManager lifecycle;
- protected Injector injector;
- protected ReviewDb db;
- protected AccountInfo currentUserInfo;
- protected CurrentUser user;
-
- protected abstract Injector createInjector();
-
- @Before
- public void setUpInjector() throws Exception {
- lifecycle = new LifecycleManager();
- injector = createInjector();
- lifecycle.add(injector);
- injector.injectMembers(this);
- lifecycle.start();
- initAfterLifecycleStart();
- setUpDatabase();
- }
-
- @After
- public void cleanUp() {
- lifecycle.stop();
- db.close();
- }
-
- protected void setUpDatabase() throws Exception {
- db = schemaFactory.open();
- schemaCreator.create(db);
-
- Account.Id userId = createAccount("user", "User", "user@example.com", true);
- user = userFactory.create(userId);
- requestContext.setContext(newRequestContext(userId));
- currentUserInfo = gApi.accounts().id(userId.get()).get();
- }
-
- protected void initAfterLifecycleStart() throws Exception {}
-
- protected RequestContext newRequestContext(Account.Id requestUserId) {
- final CurrentUser requestUser = userFactory.create(requestUserId);
- return new RequestContext() {
- @Override
- public CurrentUser getUser() {
- return requestUser;
- }
-
- @Override
- public Provider<ReviewDb> getReviewDbProvider() {
- return Providers.of(db);
- }
- };
- }
-
- protected void setAnonymous() {
- requestContext.setContext(
- new RequestContext() {
- @Override
- public CurrentUser getUser() {
- return anonymousUser.get();
- }
-
- @Override
- public Provider<ReviewDb> getReviewDbProvider() {
- return Providers.of(db);
- }
- });
- }
-
- @After
- public void tearDownInjector() {
- if (lifecycle != null) {
- lifecycle.stop();
- }
- requestContext.setContext(null);
- if (db != null) {
- db.close();
- }
- InMemoryDatabase.drop(schemaFactory);
- }
-
- @Test
- public void byId() throws Exception {
- AccountInfo user = newAccount("user");
-
- assertQuery("9999999");
- assertQuery(currentUserInfo._accountId, currentUserInfo);
- assertQuery(user._accountId, user);
- }
-
- @Test
- public void bySelf() throws Exception {
- assertQuery("self", currentUserInfo);
- }
-
- @Test
- public void byEmail() throws Exception {
- AccountInfo user1 = newAccountWithEmail("user1", name("user1@example.com"));
-
- String domain = name("test.com");
- AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
- AccountInfo user3 = newAccountWithEmail("user3", "user3@" + domain);
-
- String prefix = name("prefix");
- AccountInfo user4 = newAccountWithEmail("user4", prefix + "user4@example.com");
-
- AccountInfo user5 = newAccountWithEmail("user5", name("user5MixedCase@example.com"));
-
- assertQuery("notexisting@test.com");
-
- assertQuery(currentUserInfo.email, currentUserInfo);
- assertQuery("email:" + currentUserInfo.email, currentUserInfo);
-
- assertQuery(user1.email, user1);
- assertQuery("email:" + user1.email, user1);
-
- assertQuery(domain, user2, user3);
-
- assertQuery("email:" + prefix, user4);
-
- assertQuery(user5.email, user5);
- assertQuery("email:" + user5.email, user5);
- assertQuery("email:" + user5.email.toUpperCase(), user5);
- }
-
- @Test
- public void byUsername() throws Exception {
- AccountInfo user1 = newAccount("myuser");
-
- assertQuery("notexisting");
- assertQuery("Not Existing");
-
- assertQuery(user1.username, user1);
- assertQuery("username:" + user1.username, user1);
- assertQuery("username:" + user1.username.toUpperCase(), user1);
- }
-
- @Test
- public void isActive() throws Exception {
- String domain = name("test.com");
- AccountInfo user1 = newAccountWithEmail("user1", "user1@" + domain);
- AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
- AccountInfo user3 = newAccount("user3", "user3@" + domain, false);
- AccountInfo user4 = newAccount("user4", "user4@" + domain, false);
-
- // by default only active accounts are returned
- assertQuery(domain, user1, user2);
- assertQuery("name:" + domain, user1, user2);
-
- assertQuery("is:active name:" + domain, user1, user2);
-
- assertQuery("is:inactive name:" + domain, user3, user4);
- }
-
- @Test
- public void byName() throws Exception {
- AccountInfo user1 = newAccountWithFullName("jdoe", "John Doe");
- AccountInfo user2 = newAccountWithFullName("jroe", "Jane Roe");
- AccountInfo user3 = newAccountWithFullName("user3", "Mr Selfish");
-
- assertQuery("notexisting");
- assertQuery("Not Existing");
-
- assertQuery(quote(user1.name), user1);
- assertQuery("name:" + quote(user1.name), user1);
- assertQuery("John", user1);
- assertQuery("john", user1);
- assertQuery("Doe", user1);
- assertQuery("doe", user1);
- assertQuery("DOE", user1);
- assertQuery("Jo Do", user1);
- assertQuery("jo do", user1);
- assertQuery("self", currentUserInfo, user3);
- assertQuery("me", currentUserInfo);
- assertQuery("name:John", user1);
- assertQuery("name:john", user1);
- assertQuery("name:Doe", user1);
- assertQuery("name:doe", user1);
- assertQuery("name:DOE", user1);
- assertQuery("name:self", user3);
-
- assertQuery(quote(user2.name), user2);
- assertQuery("name:" + quote(user2.name), user2);
- }
-
- @Test
- public void byCansee() throws Exception {
- String domain = name("test.com");
- AccountInfo user1 = newAccountWithEmail("account1", "account1@" + domain);
- AccountInfo user2 = newAccountWithEmail("account2", "account2@" + domain);
- AccountInfo user3 = newAccountWithEmail("account3", "account3@" + domain);
-
- Project.NameKey p = createProject(name("p"));
- ChangeInfo c = createChange(p);
- assertQuery("name:" + domain + " cansee:" + c.changeId, user1, user2, user3);
-
- GroupInfo group = createGroup(name("group"), user1, user2);
- blockRead(p, group);
- assertQuery("name:" + domain + " cansee:" + c.changeId, user3);
- }
-
- @Test
- public void byWatchedProject() throws Exception {
- Project.NameKey p = createProject(name("p"));
- Project.NameKey p2 = createProject(name("p2"));
- AccountInfo user1 = newAccountWithFullName("jdoe", "John Doe");
- AccountInfo user2 = newAccountWithFullName("jroe", "Jane Roe");
- AccountInfo user3 = newAccountWithFullName("user3", "Mr Selfish");
-
- assertThat(queryProvider.get().byWatchedProject(p)).isEmpty();
-
- watch(user1, p, null);
- assertAccounts(queryProvider.get().byWatchedProject(p), user1);
-
- watch(user2, p, "keyword");
- assertAccounts(queryProvider.get().byWatchedProject(p), user1, user2);
-
- watch(user3, p2, "keyword");
- watch(user3, allProjects, "keyword");
- assertAccounts(queryProvider.get().byWatchedProject(p), user1, user2);
- assertAccounts(queryProvider.get().byWatchedProject(p2), user3);
- assertAccounts(queryProvider.get().byWatchedProject(allProjects), user3);
- }
-
- @Test
- public void byDeletedAccount() throws Exception {
- AccountInfo user = newAccountWithFullName("jdoe", "John Doe");
- Account.Id userId = Account.Id.parse(user._accountId.toString());
- assertQuery("John", user);
-
- for (AccountIndex index : accountIndexes.getWriteIndexes()) {
- index.delete(userId);
- }
- assertQuery("John");
- }
-
- @Test
- public void withLimit() throws Exception {
- String domain = name("test.com");
- AccountInfo user1 = newAccountWithEmail("user1", "user1@" + domain);
- AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
- AccountInfo user3 = newAccountWithEmail("user3", "user3@" + domain);
-
- List<AccountInfo> result = assertQuery(domain, user1, user2, user3);
- assertThat(Iterables.getLast(result)._moreAccounts).isNull();
-
- result = assertQuery(newQuery(domain).withLimit(2), result.subList(0, 2));
- assertThat(Iterables.getLast(result)._moreAccounts).isTrue();
- }
-
- @Test
- public void withStart() throws Exception {
- String domain = name("test.com");
- AccountInfo user1 = newAccountWithEmail("user1", "user1@" + domain);
- AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
- AccountInfo user3 = newAccountWithEmail("user3", "user3@" + domain);
-
- List<AccountInfo> result = assertQuery(domain, user1, user2, user3);
- assertQuery(newQuery(domain).withStart(1), result.subList(1, 3));
- }
-
- @Test
- public void withDetails() throws Exception {
- AccountInfo user1 = newAccount("myuser", "My User", "my.user@example.com", true);
-
- List<AccountInfo> result = assertQuery(user1.username, user1);
- AccountInfo ai = result.get(0);
- assertThat(ai._accountId).isEqualTo(user1._accountId);
- assertThat(ai.name).isNull();
- assertThat(ai.username).isNull();
- assertThat(ai.email).isNull();
- assertThat(ai.avatars).isNull();
-
- result = assertQuery(newQuery(user1.username).withOption(ListAccountsOption.DETAILS), user1);
- ai = result.get(0);
- assertThat(ai._accountId).isEqualTo(user1._accountId);
- assertThat(ai.name).isEqualTo(user1.name);
- assertThat(ai.username).isEqualTo(user1.username);
- assertThat(ai.email).isEqualTo(user1.email);
- assertThat(ai.avatars).isNull();
- }
-
- @Test
- public void withSecondaryEmails() throws Exception {
- AccountInfo user1 = newAccount("myuser", "My User", "my.user@example.com", true);
- String[] secondaryEmails = new String[] {"bar@example.com", "foo@example.com"};
- addEmails(user1, secondaryEmails);
-
- List<AccountInfo> result = assertQuery(user1.username, user1);
- assertThat(result.get(0).secondaryEmails).isNull();
-
- result = assertQuery(newQuery(user1.username).withOption(ListAccountsOption.DETAILS), user1);
- assertThat(result.get(0).secondaryEmails).isNull();
-
- result = assertQuery(newQuery(user1.username).withOption(ListAccountsOption.ALL_EMAILS), user1);
- assertThat(result.get(0).secondaryEmails)
- .containsExactlyElementsIn(Arrays.asList(secondaryEmails))
- .inOrder();
-
- result =
- assertQuery(
- newQuery(user1.username)
- .withOptions(ListAccountsOption.DETAILS, ListAccountsOption.ALL_EMAILS),
- user1);
- assertThat(result.get(0).secondaryEmails)
- .containsExactlyElementsIn(Arrays.asList(secondaryEmails))
- .inOrder();
- }
-
- @Test
- public void asAnonymous() throws Exception {
- AccountInfo user1 = newAccount("user1");
-
- setAnonymous();
- assertQuery("9999999");
- assertQuery("self");
- assertQuery("username:" + user1.username, user1);
- }
-
- // reindex permissions are tested by {@link AccountIT#reindexPermissions}
- @Test
- public void reindex() throws Exception {
- AccountInfo user1 = newAccountWithFullName("tester", "Test Usre");
-
- // update account without reindex so that account index is stale
- Account.Id accountId = new Account.Id(user1._accountId);
- String newName = "Test User";
- try (Repository repo = repoManager.openRepository(allUsers)) {
- MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsers, repo);
- PersonIdent ident = serverIdent.get();
- md.getCommitBuilder().setAuthor(ident);
- md.getCommitBuilder().setCommitter(ident);
- AccountConfig accountConfig = new AccountConfig(null, accountId);
- accountConfig.load(repo);
- accountConfig.getAccount().setFullName(newName);
- accountConfig.commit(md);
- }
-
- assertQuery("name:" + quote(user1.name), user1);
- assertQuery("name:" + quote(newName));
-
- gApi.accounts().id(user1.username).index();
- assertQuery("name:" + quote(user1.name));
- assertQuery("name:" + quote(newName), user1);
- }
-
- protected AccountInfo newAccount(String username) throws Exception {
- return newAccountWithEmail(username, null);
- }
-
- protected AccountInfo newAccountWithEmail(String username, String email) throws Exception {
- return newAccount(username, email, true);
- }
-
- protected AccountInfo newAccountWithFullName(String username, String fullName) throws Exception {
- return newAccount(username, fullName, null, true);
- }
-
- protected AccountInfo newAccount(String username, String email, boolean active) throws Exception {
- return newAccount(username, null, email, active);
- }
-
- protected AccountInfo newAccount(String username, String fullName, String email, boolean active)
- throws Exception {
- String uniqueName = name(username);
-
- try {
- gApi.accounts().id(uniqueName).get();
- fail("user " + uniqueName + " already exists");
- } catch (ResourceNotFoundException e) {
- // expected: user does not exist yet
- }
-
- Account.Id id = createAccount(uniqueName, fullName, email, active);
- return gApi.accounts().id(id.get()).get();
- }
-
- protected Project.NameKey createProject(String name) throws RestApiException {
- ProjectInput in = new ProjectInput();
- in.name = name;
- in.createEmptyCommit = true;
- gApi.projects().create(in);
- return new Project.NameKey(name);
- }
-
- protected void blockRead(Project.NameKey project, GroupInfo group) throws RestApiException {
- ProjectAccessInput in = new ProjectAccessInput();
- in.add = new HashMap<>();
-
- AccessSectionInfo a = new AccessSectionInfo();
- PermissionInfo p = new PermissionInfo(null, null);
- p.rules =
- ImmutableMap.of(group.id, new PermissionRuleInfo(PermissionRuleInfo.Action.BLOCK, false));
- a.permissions = ImmutableMap.of("read", p);
- in.add = ImmutableMap.of("refs/*", a);
-
- gApi.projects().name(project.get()).access(in);
- }
-
- protected ChangeInfo createChange(Project.NameKey project) throws RestApiException {
- ChangeInput in = new ChangeInput();
- in.subject = "A change";
- in.project = project.get();
- in.branch = "master";
- return gApi.changes().create(in).get();
- }
-
- protected GroupInfo createGroup(String name, AccountInfo... members) throws RestApiException {
- GroupInput in = new GroupInput();
- in.name = name;
- in.members =
- Arrays.asList(members).stream().map(a -> String.valueOf(a._accountId)).collect(toList());
- return gApi.groups().create(in).get();
- }
-
- protected void watch(AccountInfo account, Project.NameKey project, String filter)
- throws RestApiException {
- List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
- ProjectWatchInfo pwi = new ProjectWatchInfo();
- pwi.project = project.get();
- pwi.filter = filter;
- pwi.notifyAbandonedChanges = true;
- pwi.notifyNewChanges = true;
- pwi.notifyAllComments = true;
- projectsToWatch.add(pwi);
- gApi.accounts().id(account._accountId).setWatchedProjects(projectsToWatch);
- }
-
- protected String quote(String s) {
- return "\"" + s + "\"";
- }
-
- protected String name(String name) {
- if (name == null) {
- return null;
- }
-
- String suffix = getSanitizedMethodName();
- if (name.contains("@")) {
- return name + "." + suffix;
- }
- return name + "_" + suffix;
- }
-
- private Account.Id createAccount(String username, String fullName, String email, boolean active)
- throws Exception {
- try (ManualRequestContext ctx = oneOffRequestContext.open()) {
- Account.Id id = accountManager.authenticate(AuthRequest.forUser(username)).getAccountId();
- if (email != null) {
- accountManager.link(id, AuthRequest.forEmail(email));
- }
- accountsUpdate
- .create()
- .update(
- id,
- a -> {
- a.setFullName(fullName);
- a.setPreferredEmail(email);
- a.setActive(active);
- });
- return id;
- }
- }
-
- private void addEmails(AccountInfo account, String... emails) throws Exception {
- Account.Id id = new Account.Id(account._accountId);
- for (String email : emails) {
- accountManager.link(id, AuthRequest.forEmail(email));
- }
- accountCache.evict(id);
- }
-
- protected QueryRequest newQuery(Object query) throws RestApiException {
- return gApi.accounts().query(query.toString());
- }
-
- protected List<AccountInfo> assertQuery(Object query, AccountInfo... accounts) throws Exception {
- return assertQuery(newQuery(query), accounts);
- }
-
- protected List<AccountInfo> assertQuery(QueryRequest query, AccountInfo... accounts)
- throws Exception {
- return assertQuery(query, Arrays.asList(accounts));
- }
-
- protected List<AccountInfo> assertQuery(QueryRequest query, List<AccountInfo> accounts)
- throws Exception {
- List<AccountInfo> result = query.get();
- Iterable<Integer> ids = ids(result);
- assertThat(ids)
- .named(format(query, result, accounts))
- .containsExactlyElementsIn(ids(accounts))
- .inOrder();
- return result;
- }
-
- protected void assertAccounts(List<AccountState> accounts, AccountInfo... expectedAccounts) {
- assertThat(accounts.stream().map(a -> a.getAccount().getId().get()).collect(toList()))
- .containsExactlyElementsIn(
- Arrays.asList(expectedAccounts).stream().map(a -> a._accountId).collect(toList()));
- }
-
- private String format(
- QueryRequest query, List<AccountInfo> actualIds, List<AccountInfo> expectedAccounts) {
- StringBuilder b = new StringBuilder();
- b.append("query '").append(query.getQuery()).append("' with expected accounts ");
- b.append(format(expectedAccounts));
- b.append(" and result ");
- b.append(format(actualIds));
- return b.toString();
- }
-
- private String format(Iterable<AccountInfo> accounts) {
- StringBuilder b = new StringBuilder();
- b.append("[");
- Iterator<AccountInfo> it = accounts.iterator();
- while (it.hasNext()) {
- AccountInfo a = it.next();
- b.append("{")
- .append(a._accountId)
- .append(", ")
- .append("name=")
- .append(a.name)
- .append(", ")
- .append("email=")
- .append(a.email)
- .append(", ")
- .append("username=")
- .append(a.username)
- .append("}");
- if (it.hasNext()) {
- b.append(", ");
- }
- }
- b.append("]");
- return b.toString();
- }
-
- protected static Iterable<Integer> ids(AccountInfo... accounts) {
- return ids(Arrays.asList(accounts));
- }
-
- protected static Iterable<Integer> ids(List<AccountInfo> accounts) {
- return accounts.stream().map(a -> a._accountId).collect(toList());
- }
-}