blob: bb49a6de77380e5e18c97121d7c8c58780650fae [file] [log] [blame]
// Copyright (C) 2022 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.notedb;
import static com.google.common.truth.Truth.assertThat;
import static com.google.gerrit.testing.GerritJUnit.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.Change;
import com.google.gerrit.server.account.externalids.ExternalId;
import com.google.gerrit.server.account.externalids.ExternalIdCache;
import com.google.gerrit.server.git.RepositoryCaseMismatchException;
import com.google.inject.AbstractModule;
import java.util.Optional;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.junit.Before;
import org.junit.Test;
public class ImportedChangeNotesTest extends AbstractChangeNotesTest {
private static final String FOREIGN_SERVER_ID = "foreign-server-id";
private static final String IMPORTED_SERVER_ID = "gerrit-imported-1";
private ExternalIdCache externalIdCacheMock;
@Before
@Override
public void setUpTestEnvironment() throws Exception {
setupTestPrerequisites();
}
private void initServerIds(String serverId, String... importedServerIds)
throws Exception, RepositoryCaseMismatchException, RepositoryNotFoundException {
externalIdCacheMock = mock(ExternalIdCache.class);
injector =
createTestInjector(
new AbstractModule() {
@Override
protected void configure() {
bind(ExternalIdCache.class).toInstance(externalIdCacheMock);
}
},
serverId,
importedServerIds);
injector.injectMembers(this);
createAllUsers(injector);
}
@Test
public void allowChangeFromImportedServerId() throws Exception {
initServerIds(LOCAL_SERVER_ID, IMPORTED_SERVER_ID);
ExternalId.Key importedAccountIdKey =
ExternalId.Key.create(
ExternalId.SCHEME_IMPORTED,
changeOwner.getAccountId() + "@" + IMPORTED_SERVER_ID,
false);
ExternalId importedAccountId =
ExternalId.create(importedAccountIdKey, changeOwner.getAccountId(), null, null, null);
when(externalIdCacheMock.byKey(eq(importedAccountIdKey)))
.thenReturn(Optional.of(importedAccountId));
Change importedChange = newChange(createTestInjector(IMPORTED_SERVER_ID), false);
Change localChange = newChange();
assertThat(newNotes(importedChange).getServerId()).isEqualTo(IMPORTED_SERVER_ID);
assertThat(newNotes(localChange).getServerId()).isEqualTo(LOCAL_SERVER_ID);
}
@Test
public void rejectChangeWithForeignServerId() throws Exception {
initServerIds(LOCAL_SERVER_ID);
when(externalIdCacheMock.byKey(any())).thenReturn(Optional.empty());
Change foreignChange = newChange(createTestInjector(FOREIGN_SERVER_ID), false);
InvalidServerIdException invalidServerIdEx =
assertThrows(InvalidServerIdException.class, () -> newNotes(foreignChange));
String invalidServerIdMessage = invalidServerIdEx.getMessage();
assertThat(invalidServerIdMessage).contains("expected " + LOCAL_SERVER_ID);
assertThat(invalidServerIdMessage).contains("actual: " + FOREIGN_SERVER_ID);
}
@Test
public void changeFromImportedServerIdWithUnknownAccountId() throws Exception {
initServerIds(LOCAL_SERVER_ID, IMPORTED_SERVER_ID);
when(externalIdCacheMock.byKey(any())).thenReturn(Optional.empty());
Change importedChange = newChange(createTestInjector(IMPORTED_SERVER_ID), false);
assertThat(newNotes(importedChange).getServerId()).isEqualTo(IMPORTED_SERVER_ID);
assertThat(newNotes(importedChange).getChange().getOwner())
.isEqualTo(Account.UNKNOWN_ACCOUNT_ID);
}
}