From 3c77c1642ca07b4587e038926626c0e38248691f Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Wed, 14 Feb 2018 14:52:15 +0100 Subject: [PATCH] SONAR-10430 rewrite FileMoveDetectionStepTest to use DbTester --- .../filemove/FileMoveDetectionStepTest.java | 161 ++++++++---------- 1 file changed, 67 insertions(+), 94 deletions(-) diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStepTest.java index f630dd11e42..9de1df73da2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStepTest.java @@ -22,43 +22,35 @@ package org.sonar.server.computation.task.projectanalysis.filemove; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.function.Function; +import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.apache.commons.io.FileUtils; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.mockito.ArgumentCaptor; +import org.sonar.api.utils.System2; import org.sonar.core.hash.SourceLineHashesComputer; +import org.sonar.core.util.UuidFactoryFast; import org.sonar.db.DbClient; -import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDao; +import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; -import org.sonar.db.component.ComponentTreeQuery; -import org.sonar.db.source.FileSourceDao; +import org.sonar.db.component.ComponentTesting; +import org.sonar.db.organization.OrganizationDto; import org.sonar.db.source.FileSourceDto; import org.sonar.server.computation.task.projectanalysis.analysis.Analysis; import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolderRule; import org.sonar.server.computation.task.projectanalysis.component.Component; -import org.sonar.server.computation.task.projectanalysis.component.ReportComponent; import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolderRule; import org.sonar.server.computation.task.projectanalysis.source.SourceLinesHashRepository; import static com.google.common.base.Joiner.on; import static java.util.Arrays.stream; -import static java.util.stream.Collectors.toList; import static org.assertj.core.api.Assertions.assertThat; -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 static org.sonar.api.resources.Qualifiers.FILE; -import static org.sonar.api.resources.Qualifiers.UNIT_TEST_FILE; import static org.sonar.server.computation.task.projectanalysis.component.ReportComponent.builder; public class FileMoveDetectionStepTest { @@ -73,7 +65,6 @@ public class FileMoveDetectionStepTest { private static final int FILE_1_REF = 2; private static final int FILE_2_REF = 3; private static final int FILE_3_REF = 4; - private static final ReportComponent PROJECT = builder(Component.Type.PROJECT, ROOT_REF).build(); private static final Component FILE_1 = fileComponent(FILE_1_REF); private static final Component FILE_2 = fileComponent(FILE_2_REF); private static final Component FILE_3 = fileComponent(FILE_3_REF); @@ -220,24 +211,23 @@ public class FileMoveDetectionStepTest { public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); @Rule public MutableMovedFilesRepositoryRule movedFilesRepository = new MutableMovedFilesRepositoryRule(); + @Rule + public DbTester dbTester = DbTester.create(System2.INSTANCE); + + private DbClient dbClient = dbTester.getDbClient(); + private ComponentDto project; - private DbClient dbClient = mock(DbClient.class); - private DbSession dbSession = mock(DbSession.class); - private ComponentDao componentDao = mock(ComponentDao.class); private SourceLinesHashRepository sourceLinesHash = mock(SourceLinesHashRepository.class); - private FileSourceDao fileSourceDao = mock(FileSourceDao.class); private FileSimilarity fileSimilarity = new FileSimilarityImpl(new SourceSimilarityImpl()); - private long dbIdGenerator = 0; private FileMoveDetectionStep underTest = new FileMoveDetectionStep(analysisMetadataHolder, treeRootHolder, dbClient, fileSimilarity, movedFilesRepository, sourceLinesHash); @Before public void setUp() throws Exception { - when(dbClient.openSession(false)).thenReturn(dbSession); - when(dbClient.componentDao()).thenReturn(componentDao); - when(dbClient.fileSourceDao()).thenReturn(fileSourceDao); - treeRootHolder.setRoot(PROJECT); + OrganizationDto organization = dbTester.organizations().insert(); + project = dbTester.components().insertPrivateProject(organization); + treeRootHolder.setRoot(builder(Component.Type.PROJECT, ROOT_REF).setUuid(project.uuid()).build()); } @Test @@ -273,24 +263,10 @@ public class FileMoveDetectionStepTest { assertThat(movedFilesRepository.getComponentsWithOriginal()).isEmpty(); } - @Test - public void execute_retrieves_only_file_and_unit_tests_from_last_snapshot() { - analysisMetadataHolder.setBaseAnalysis(ANALYSIS); - ArgumentCaptor captor = ArgumentCaptor.forClass(ComponentTreeQuery.class); - when(componentDao.selectDescendants(eq(dbSession), captor.capture())) - .thenReturn(Collections.emptyList()); - - underTest.execute(); - - ComponentTreeQuery query = captor.getValue(); - assertThat(query.getBaseUuid()).isEqualTo(PROJECT.getUuid()); - assertThat(query.getQualifiers()).containsOnly(FILE, UNIT_TEST_FILE); - } - @Test public void execute_detects_no_move_if_there_is_no_file_in_report() { analysisMetadataHolder.setBaseAnalysis(ANALYSIS); - mockComponents( /* no components */); + insertFiles( /* no components */); setFilesInReport(); underTest.execute(); @@ -301,7 +277,7 @@ public class FileMoveDetectionStepTest { @Test public void execute_detects_no_move_if_file_key_exists_in_both_DB_and_report() { analysisMetadataHolder.setBaseAnalysis(ANALYSIS); - mockComponents(FILE_1.getKey(), FILE_2.getKey()); + insertFiles(FILE_1.getKey(), FILE_2.getKey()); setFilesInReport(FILE_2, FILE_1); underTest.execute(); @@ -312,8 +288,8 @@ public class FileMoveDetectionStepTest { @Test public void execute_detects_move_if_content_of_file_is_same_in_DB_and_report() { analysisMetadataHolder.setBaseAnalysis(ANALYSIS); - ComponentDto[] dtos = mockComponents(FILE_1.getKey()); - mockContentOfFileInDb(FILE_1.getKey(), CONTENT1); + ComponentDto[] dtos = insertFiles(FILE_1.getKey()); + insertContentOfFileInDb(FILE_1.getKey(), CONTENT1); setFilesInReport(FILE_2); setFileLineHashesInReport(FILE_2, CONTENT1); @@ -329,8 +305,8 @@ public class FileMoveDetectionStepTest { @Test public void execute_detects_no_move_if_content_of_file_is_not_similar_enough() { analysisMetadataHolder.setBaseAnalysis(ANALYSIS); - mockComponents(FILE_1.getKey()); - mockContentOfFileInDb(FILE_1.getKey(), CONTENT1); + insertFiles(FILE_1.getKey()); + insertContentOfFileInDb(FILE_1.getKey(), CONTENT1); setFilesInReport(FILE_2); setFileLineHashesInReport(FILE_2, LESS_CONTENT1); @@ -342,8 +318,8 @@ public class FileMoveDetectionStepTest { @Test public void execute_detects_no_move_if_content_of_file_is_empty_in_DB() { analysisMetadataHolder.setBaseAnalysis(ANALYSIS); - mockComponents(FILE_1.getKey()); - mockContentOfFileInDb(FILE_1.getKey(), CONTENT_EMPTY); + insertFiles(FILE_1.getKey()); + insertContentOfFileInDb(FILE_1.getKey(), CONTENT_EMPTY); setFilesInReport(FILE_2); setFileLineHashesInReport(FILE_2, CONTENT1); @@ -356,8 +332,8 @@ public class FileMoveDetectionStepTest { public void execute_detects_no_move_if_content_of_file_has_no_path_in_DB() { analysisMetadataHolder.setBaseAnalysis(ANALYSIS); - mockComponents(key -> newComponentDto(key).setPath(null), FILE_1.getKey()); - mockContentOfFileInDb(FILE_1.getKey(), CONTENT1); + insertFiles(key -> newComponentDto(key).setPath(null), FILE_1.getKey()); + insertContentOfFileInDb(FILE_1.getKey(), CONTENT1); setFilesInReport(FILE_2); setFileLineHashesInReport(FILE_2, CONTENT1); @@ -369,8 +345,8 @@ public class FileMoveDetectionStepTest { @Test public void execute_detects_no_move_if_content_of_file_is_empty_in_report() { analysisMetadataHolder.setBaseAnalysis(ANALYSIS); - mockComponents(FILE_1.getKey()); - mockContentOfFileInDb(FILE_1.getKey(), CONTENT1); + insertFiles(FILE_1.getKey()); + insertContentOfFileInDb(FILE_1.getKey(), CONTENT1); setFilesInReport(FILE_2); setFileLineHashesInReport(FILE_2, CONTENT_EMPTY); @@ -382,8 +358,8 @@ public class FileMoveDetectionStepTest { @Test public void execute_detects_no_move_if_two_added_files_have_same_content_as_the_one_in_db() { analysisMetadataHolder.setBaseAnalysis(ANALYSIS); - mockComponents(FILE_1.getKey()); - mockContentOfFileInDb(FILE_1.getKey(), CONTENT1); + insertFiles(FILE_1.getKey()); + insertContentOfFileInDb(FILE_1.getKey(), CONTENT1); setFilesInReport(FILE_2, FILE_3); setFileLineHashesInReport(FILE_2, CONTENT1); setFileLineHashesInReport(FILE_3, CONTENT1); @@ -396,9 +372,9 @@ public class FileMoveDetectionStepTest { @Test public void execute_detects_no_move_if_two_deleted_files_have_same_content_as_the_one_added() { analysisMetadataHolder.setBaseAnalysis(ANALYSIS); - mockComponents(FILE_1.getKey(), FILE_2.getKey()); - mockContentOfFileInDb(FILE_1.getKey(), CONTENT1); - mockContentOfFileInDb(FILE_2.getKey(), CONTENT1); + insertFiles(FILE_1.getKey(), FILE_2.getKey()); + insertContentOfFileInDb(FILE_1.getKey(), CONTENT1); + insertContentOfFileInDb(FILE_2.getKey(), CONTENT1); setFilesInReport(FILE_3); setFileLineHashesInReport(FILE_3, CONTENT1); @@ -410,9 +386,9 @@ public class FileMoveDetectionStepTest { @Test public void execute_detects_no_move_if_two_files_are_empty() { analysisMetadataHolder.setBaseAnalysis(ANALYSIS); - mockComponents(FILE_1.getKey(), FILE_2.getKey()); - mockContentOfFileInDb(FILE_1.getKey(), null); - mockContentOfFileInDb(FILE_2.getKey(), null); + insertFiles(FILE_1.getKey(), FILE_2.getKey()); + insertContentOfFileInDb(FILE_1.getKey(), null); + insertContentOfFileInDb(FILE_2.getKey(), null); underTest.execute(); @@ -430,11 +406,11 @@ public class FileMoveDetectionStepTest { Component file4 = fileComponent(5); Component file5 = fileComponent(6); Component file6 = fileComponent(7); - ComponentDto[] dtos = mockComponents(FILE_1.getKey(), FILE_2.getKey(), file4.getKey(), file5.getKey()); - mockContentOfFileInDb(FILE_1.getKey(), CONTENT1); - mockContentOfFileInDb(FILE_2.getKey(), LESS_CONTENT1); - mockContentOfFileInDb(file4.getKey(), new String[] {"e", "f", "g", "h", "i"}); - mockContentOfFileInDb(file5.getKey(), CONTENT2); + ComponentDto[] dtos = insertFiles(FILE_1.getKey(), FILE_2.getKey(), file4.getKey(), file5.getKey()); + insertContentOfFileInDb(FILE_1.getKey(), CONTENT1); + insertContentOfFileInDb(FILE_2.getKey(), LESS_CONTENT1); + insertContentOfFileInDb(file4.getKey(), new String[] {"e", "f", "g", "h", "i"}); + insertContentOfFileInDb(file5.getKey(), CONTENT2); setFilesInReport(FILE_3, file4, file6); setFileLineHashesInReport(FILE_3, CONTENT1); setFileLineHashesInReport(file4, new String[] {"a", "b"}); @@ -459,12 +435,10 @@ public class FileMoveDetectionStepTest { @Test public void real_life_use_case() throws Exception { analysisMetadataHolder.setBaseAnalysis(ANALYSIS); - List componentDtoKey = new ArrayList<>(); for (File f : FileUtils.listFiles(new File("src/test/resources/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStepTest/v1"), null, false)) { - componentDtoKey.add(f.getName()); - mockContentOfFileInDb(f.getName(), readLines(f)); + insertFiles(f.getName()); + insertContentOfFileInDb(f.getName(), readLines(f)); } - mockComponents(componentDtoKey.toArray(new String[0])); Map comps = new HashMap<>(); int i = 1; @@ -512,49 +486,48 @@ public class FileMoveDetectionStepTest { when(sourceLinesHash.getLineHashesMatchingDBVersion(file)).thenReturn(computer.getLineHashes()); } - private void mockContentOfFileInDb(String key, @Nullable String[] content) { - FileSourceDto dto = new FileSourceDto(); - if (content != null) { - SourceLineHashesComputer linesHashesComputer = new SourceLineHashesComputer(); - stream(content).forEach(linesHashesComputer::addLine); - dto.setLineHashes(on('\n').join(linesHashesComputer.getLineHashes())); - } - - when(fileSourceDao.selectSourceByFileUuid(dbSession, componentUuidOf(key))).thenReturn(dto); + @CheckForNull + private FileSourceDto insertContentOfFileInDb(String key, @Nullable String[] content) { + return dbTester.getDbClient().componentDao().selectByKey(dbTester.getSession(), key) + .transform(file -> { + SourceLineHashesComputer linesHashesComputer = new SourceLineHashesComputer(); + if (content != null) { + stream(content).forEach(linesHashesComputer::addLine); + } + FileSourceDto fileSourceDto = new FileSourceDto() + .setFileUuid(file.uuid()) + .setProjectUuid(file.projectUuid()) + .setLineHashes(on('\n').join(linesHashesComputer.getLineHashes())) + .setDataType(FileSourceDto.Type.SOURCE); + dbTester.getDbClient().fileSourceDao().insert(dbTester.getSession(), fileSourceDto); + dbTester.commit(); + return fileSourceDto; + }).orNull(); } private void setFilesInReport(Component... files) { treeRootHolder.setRoot(builder(Component.Type.PROJECT, ROOT_REF) + .setUuid(project.uuid()) .addChildren(files) .build()); } - private ComponentDto[] mockComponents(String... componentKeys) { - return mockComponents(key -> newComponentDto(key), componentKeys); + private ComponentDto[] insertFiles(String... componentKeys) { + return insertFiles(this::newComponentDto, componentKeys); } - private ComponentDto[] mockComponents(Function newComponentDto, String... componentKeys) { - List componentDtos = stream(componentKeys) + private ComponentDto[] insertFiles(Function newComponentDto, String... componentKeys) { + return stream(componentKeys) .map(newComponentDto) - .collect(toList()); - when(componentDao.selectDescendants(eq(dbSession), any(ComponentTreeQuery.class))) - .thenReturn(componentDtos); - return componentDtos.toArray(new ComponentDto[componentDtos.size()]); + .map(dto -> dbTester.components().insertComponent(dto)) + .toArray(ComponentDto[]::new); } private ComponentDto newComponentDto(String key) { - ComponentDto res = new ComponentDto(); - res - .setId(dbIdGenerator) + return ComponentTesting.newFileDto(project) .setDbKey(key) - .setUuid(componentUuidOf(key)) + .setUuid(UuidFactoryFast.getInstance().create()) .setPath("path_" + key); - dbIdGenerator++; - return res; - } - - private static String componentUuidOf(String key) { - return "uuid_" + key; } private static Component fileComponent(int ref) { -- 2.39.5