diff options
author | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2015-04-27 17:26:15 +0200 |
---|---|---|
committer | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2015-04-28 12:22:45 +0200 |
commit | e35378a7d9d058cadd1723634f4bb10ef2aabb2f (patch) | |
tree | 7b0886f0ed0ac5cd8df3de9d85fdc9ec43ccc3be /server | |
parent | e2954649262d71c92a474471dbe893446f04dfc2 (diff) | |
download | sonarqube-e35378a7d9d058cadd1723634f4bb10ef2aabb2f.tar.gz sonarqube-e35378a7d9d058cadd1723634f4bb10ef2aabb2f.zip |
several tests with the same name SONAR-6255
several tests can have the same name. a uuid is introduced to have an identifier for the test.
coverage details are aggregated for all the tests with the same name.
Diffstat (limited to 'server')
2 files changed, 202 insertions, 95 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistTestsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistTestsStep.java index 9ff1a514184..8be0e1c5d2e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistTestsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistTestsStep.java @@ -20,16 +20,22 @@ package org.sonar.server.computation.step; +import com.google.common.base.Joiner; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.HashBasedTable; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ListMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Table; import org.apache.ibatis.session.ResultContext; import org.apache.ibatis.session.ResultHandler; import org.sonar.api.resources.Qualifiers; import org.sonar.api.utils.System2; +import org.sonar.api.utils.internal.Uuids; +import org.sonar.api.utils.log.Logger; +import org.sonar.api.utils.log.Loggers; import org.sonar.batch.protocol.output.BatchReport; import org.sonar.batch.protocol.output.BatchReportReader; import org.sonar.core.persistence.DbSession; @@ -41,17 +47,20 @@ import org.sonar.server.computation.source.ReportIterator; import org.sonar.server.db.DbClient; import org.sonar.server.source.db.FileSourceDb; -import javax.annotation.CheckForNull; - import java.io.File; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ExecutionException; public class PersistTestsStep implements ComputationStep { + private static final Logger LOG = Loggers.get(PersistTestsStep.class); + private final DbClient dbClient; private final System2 system; @@ -74,6 +83,9 @@ public class PersistTestsStep implements ComputationStep { recursivelyProcessComponent(context, rootComponentRef); session.commit(); + if (context.hasUnprocessedCoverageDetails) { + LOG.warn("Some coverage tests are not taken into account during analysis of project '{}'", computationContext.getProject().getKey()); + } } finally { MyBatis.closeQuietly(session); } @@ -82,7 +94,7 @@ public class PersistTestsStep implements ComputationStep { private void recursivelyProcessComponent(TestContext context, int componentRef) { BatchReportReader reportReader = context.reader; BatchReport.Component component = reportReader.readComponent(componentRef); - if (component.getIsTest() && reportReader.readTests(componentRef) != null) { + if (component.getIsTest()) { persistTestResults(component, context); } @@ -92,8 +104,16 @@ public class PersistTestsStep implements ComputationStep { } private void persistTestResults(BatchReport.Component component, TestContext context) { - ListMultimap<String, FileSourceDb.Test.CoveredFile> coveredFilesByName = loadCoverageDetails(component.getRef(), context); - List<FileSourceDb.Test> tests = buildDbTests(component, context, coveredFilesByName); + Multimap<String, FileSourceDb.Test.Builder> testsByName = buildDbTests(context, component); + Table<String, String, FileSourceDb.Test.CoveredFile.Builder> coveredFilesByName = loadCoverageDetails(component.getRef(), context); + List<FileSourceDb.Test> tests = addCoveredFilesToTests(testsByName, coveredFilesByName); + if (checkIfThereAreUnprocessedCoverageDetails(testsByName, coveredFilesByName, component)) { + context.hasUnprocessedCoverageDetails = true; + } + + if (tests.isEmpty()) { + return; + } FileSourceDto existingDto = context.existingFileSourcesByUuid.get(component.getUuid()); long now = system.now(); @@ -116,53 +136,102 @@ public class PersistTestsStep implements ComputationStep { } } - private List<FileSourceDb.Test> buildDbTests(BatchReport.Component component, TestContext context, ListMultimap<String, FileSourceDb.Test.CoveredFile> coveredFilesByName) { + private boolean checkIfThereAreUnprocessedCoverageDetails(Multimap<String, FileSourceDb.Test.Builder> testsByName, + Table<String, String, FileSourceDb.Test.CoveredFile.Builder> coveredFilesByName, + BatchReport.Component component) { + Set<String> unprocessedCoverageDetailNames = new HashSet<>(coveredFilesByName.rowKeySet()); + unprocessedCoverageDetailNames.removeAll(testsByName.keySet()); + boolean hasUnprocessedCoverageDetails = !unprocessedCoverageDetailNames.isEmpty(); + if (hasUnprocessedCoverageDetails) { + LOG.trace("The following test coverages for file '{}' have not been taken into account: {}", component.getPath(), Joiner.on(", ").join(unprocessedCoverageDetailNames)); + } + return hasUnprocessedCoverageDetails; + } + + private List<FileSourceDb.Test> addCoveredFilesToTests(Multimap<String, FileSourceDb.Test.Builder> testsByName, + Table<String, String, FileSourceDb.Test.CoveredFile.Builder> coveredFilesByName) { List<FileSourceDb.Test> tests = new ArrayList<>(); - ReportIterator<BatchReport.Test> testIterator = new ReportIterator<>(context.reader.readTests(component.getRef()), BatchReport.Test.PARSER); - while (testIterator.hasNext()) { - BatchReport.Test batchTest = testIterator.next(); - FileSourceDb.Test.Builder dbTest = FileSourceDb.Test.newBuilder(); - dbTest.setType(batchTest.getType()); - dbTest.setName(batchTest.getName()); - if (batchTest.hasStacktrace()) { - dbTest.setStacktrace(batchTest.getStacktrace()); - } - if (batchTest.hasStatus()) { - dbTest.setStatus(batchTest.getStatus()); - } - if (batchTest.hasMsg()) { - dbTest.setMsg(batchTest.getMsg()); - } - if (batchTest.hasExecutionTimeMs()) { - dbTest.setExecutionTimeMs(batchTest.getExecutionTimeMs()); + for (FileSourceDb.Test.Builder test : testsByName.values()) { + Collection<FileSourceDb.Test.CoveredFile.Builder> coveredFiles = coveredFilesByName.row(test.getName()).values(); + if (!coveredFiles.isEmpty()) { + for (FileSourceDb.Test.CoveredFile.Builder coveredFile : coveredFiles) { + test.addCoveredFile(coveredFile); + } } - List<FileSourceDb.Test.CoveredFile> coveredFiles = coveredFilesByName == null ? null : coveredFilesByName.get(batchTest.getName()); - if (coveredFiles != null) { - dbTest.addAllCoveredFile(coveredFiles); + tests.add(test.build()); + } + + return tests; + } + + private Multimap<String, FileSourceDb.Test.Builder> buildDbTests(TestContext context, BatchReport.Component component) { + Multimap<String, FileSourceDb.Test.Builder> tests = ArrayListMultimap.create(); + File testsFile = context.reader.readTests(component.getRef()); + if (testsFile == null) { + return tests; + } + ReportIterator<BatchReport.Test> testIterator = new ReportIterator<>(testsFile, BatchReport.Test.PARSER); + try { + while (testIterator.hasNext()) { + BatchReport.Test batchTest = testIterator.next(); + FileSourceDb.Test.Builder dbTest = FileSourceDb.Test.newBuilder(); + dbTest.setUuid(Uuids.create()); + dbTest.setName(batchTest.getName()); + if (batchTest.hasStacktrace()) { + dbTest.setStacktrace(batchTest.getStacktrace()); + } + if (batchTest.hasStatus()) { + dbTest.setStatus(batchTest.getStatus()); + } + if (batchTest.hasMsg()) { + dbTest.setMsg(batchTest.getMsg()); + } + if (batchTest.hasDurationInMs()) { + dbTest.setExecutionTimeMs(batchTest.getDurationInMs()); + } + + tests.put(dbTest.getName(), dbTest); } - tests.add(dbTest.build()); + } finally { + testIterator.close(); } return tests; } - @CheckForNull - private ListMultimap<String, FileSourceDb.Test.CoveredFile> loadCoverageDetails(int testFileRef, TestContext context) { + /** + * returns a Table of (test name, main file uuid, covered file) + */ + private Table<String, String, FileSourceDb.Test.CoveredFile.Builder> loadCoverageDetails(int testFileRef, TestContext context) { + Table<String, String, FileSourceDb.Test.CoveredFile.Builder> nameToCoveredFiles = HashBasedTable.create(); File coverageDetailsFile = context.reader.readCoverageDetails(testFileRef); if (coverageDetailsFile == null) { - return null; + return nameToCoveredFiles; } - ListMultimap<String, FileSourceDb.Test.CoveredFile> nameToCoveredFiles = ArrayListMultimap.create(); ReportIterator<BatchReport.CoverageDetail> coverageIterator = new ReportIterator<>(coverageDetailsFile, BatchReport.CoverageDetail.PARSER); - while (coverageIterator.hasNext()) { - BatchReport.CoverageDetail batchCoverageDetail = coverageIterator.next(); - for (BatchReport.CoverageDetail.CoveredFile batchCoveredFile : batchCoverageDetail.getCoveredFileList()) { - FileSourceDb.Test.CoveredFile.Builder dbCoveredFile = FileSourceDb.Test.CoveredFile.newBuilder() - .setFileUuid(context.getUuid(batchCoveredFile.getFileRef())) - .addAllCoveredLine(batchCoveredFile.getCoveredLineList()); - nameToCoveredFiles.put(batchCoverageDetail.getTestName(), dbCoveredFile.build()); + try { + while (coverageIterator.hasNext()) { + BatchReport.CoverageDetail batchCoverageDetail = coverageIterator.next(); + for (BatchReport.CoverageDetail.CoveredFile batchCoveredFile : batchCoverageDetail.getCoveredFileList()) { + String testName = batchCoverageDetail.getTestName(); + String mainFileUuid = context.getUuid(batchCoveredFile.getFileRef()); + FileSourceDb.Test.CoveredFile.Builder existingDbCoveredFile = nameToCoveredFiles.get(testName, mainFileUuid); + List<Integer> batchCoveredLines = batchCoveredFile.getCoveredLineList(); + if (existingDbCoveredFile == null) { + FileSourceDb.Test.CoveredFile.Builder dbCoveredFile = FileSourceDb.Test.CoveredFile.newBuilder() + .setFileUuid(context.getUuid(batchCoveredFile.getFileRef())) + .addAllCoveredLine(batchCoveredLines); + nameToCoveredFiles.put(testName, mainFileUuid, dbCoveredFile); + } else { + List<Integer> remainingBatchCoveredLines = new ArrayList<>(batchCoveredLines); + remainingBatchCoveredLines.removeAll(existingDbCoveredFile.getCoveredLineList()); + existingDbCoveredFile.addAllCoveredLine(batchCoveredLines); + } + } } + } finally { + coverageIterator.close(); } return nameToCoveredFiles; } @@ -178,6 +247,7 @@ public class PersistTestsStep implements ComputationStep { final BatchReportReader reader; final Cache<Integer, String> componentRefToUuidCache; final Map<String, FileSourceDto> existingFileSourcesByUuid; + boolean hasUnprocessedCoverageDetails = false; TestContext(ComputationContext context, DbSession session) { this.session = session; @@ -187,6 +257,7 @@ public class PersistTestsStep implements ComputationStep { .maximumSize(500_000) .build( new CacheLoader<Integer, String>() { + @Override public String load(Integer key) { return reader.readComponent(key).getUuid(); } @@ -207,7 +278,7 @@ public class PersistTestsStep implements ComputationStep { try { return componentRefToUuidCache.get(fileRef); } catch (ExecutionException e) { - throw new IllegalStateException(String.format("Error while retrieving uuid of component file ref '%d'", fileRef)); + throw new IllegalStateException(String.format("Error while retrieving uuid of component file ref '%d'", fileRef), e); } } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistTestsStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistTestsStepTest.java index 1d91b26da9e..474b5f44527 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistTestsStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistTestsStepTest.java @@ -27,9 +27,10 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.utils.System2; +import org.sonar.api.utils.log.LogTester; +import org.sonar.api.utils.log.LoggerLevel; import org.sonar.batch.protocol.Constants; import org.sonar.batch.protocol.Constants.TestStatus; -import org.sonar.batch.protocol.Constants.TestType; import org.sonar.batch.protocol.output.BatchReport; import org.sonar.batch.protocol.output.BatchReport.CoverageDetail; import org.sonar.batch.protocol.output.BatchReportReader; @@ -38,7 +39,6 @@ import org.sonar.core.persistence.DbSession; import org.sonar.core.persistence.DbTester; import org.sonar.core.persistence.MyBatis; import org.sonar.core.source.db.FileSourceDto; -import org.sonar.server.component.ComponentTesting; import org.sonar.server.computation.ComputationContext; import org.sonar.server.db.DbClient; import org.sonar.server.source.db.FileSourceDao; @@ -50,8 +50,10 @@ import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.sonar.server.component.ComponentTesting.newProjectDto; public class PersistTestsStepTest extends BaseStepTest { private static final String PROJECT_UUID = "PROJECT"; @@ -63,6 +65,8 @@ public class PersistTestsStepTest extends BaseStepTest { private static final String TEST_FILE_UUID_2 = "TEST-FILE-2"; private static final String MAIN_FILE_UUID_1 = "MAIN-FILE-1"; private static final String MAIN_FILE_UUID_2 = "MAIN-FILE-2"; + private static final String TEST_FILE_PATH_1 = "TEST-PATH-1"; + private static final String TEST_FILE_PATH_2 = "TEST-PATH-2"; PersistTestsStep sut; @@ -72,6 +76,9 @@ public class PersistTestsStepTest extends BaseStepTest { @ClassRule public static DbTester db = new DbTester(); + @Rule + public LogTester log = new LogTester(); + File reportDir; DbSession session; DbClient dbClient; @@ -106,9 +113,10 @@ public class PersistTestsStepTest extends BaseStepTest { @Test public void no_test_in_database_and_batch_report() throws Exception { - sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto())); + sut.execute(new ComputationContext(new BatchReportReader(reportDir), newProjectDto())); assertThat(dbClient.fileSourceDao().selectTest(TEST_FILE_UUID_1)).isNull(); + assertThat(log.logs()).isEmpty(); } @Test @@ -120,10 +128,10 @@ public class PersistTestsStepTest extends BaseStepTest { writer.writeTests(TEST_FILE_REF_1, batchTests); List<CoverageDetail> coverageDetails = Arrays.asList( newCoverageDetail(1, MAIN_FILE_REF_1) - ); + ); writer.writeCoverageDetails(TEST_FILE_REF_1, coverageDetails); - sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto(PROJECT_UUID))); + sut.execute(new ComputationContext(new BatchReportReader(reportDir), newProjectDto(PROJECT_UUID))); FileSourceDto dto = dbClient.fileSourceDao().selectTest(TEST_FILE_UUID_1); assertThat(dto.getCreatedAt()).isEqualTo(now); @@ -132,29 +140,20 @@ public class PersistTestsStepTest extends BaseStepTest { assertThat(dto.getFileUuid()).isEqualTo(TEST_FILE_UUID_1); assertThat(dto.getTestData()).hasSize(2); - FileSourceDb.Test test1 = dto.getTestData().get(0); - assertThat(test1.getName()).isEqualTo("name#1"); - assertThat(test1.getCoveredFileCount()).isEqualTo(1); - assertThat(test1.getCoveredFile(0).getFileUuid()).isEqualTo(MAIN_FILE_UUID_1); + assertThat(dto.getTestData()).extracting("name", "coveredFileCount").containsOnly( + tuple("name#1", 1), + tuple("name#2", 0)); - FileSourceDb.Test test2 = dto.getTestData().get(1); - assertThat(test2.getName()).isEqualTo("name#2"); - assertThat(test2.getCoveredFileList()).isEmpty(); + assertThat(log.logs()).isEmpty(); } @Test public void insert_all_data_of_a_test() throws Exception { BatchReportWriter writer = new BatchReportWriter(reportDir); - List<BatchReport.Test> batchTests = Arrays.asList( - newTest(1) - ); - writer.writeTests(TEST_FILE_REF_1, batchTests); - List<CoverageDetail> coverageDetails = Arrays.asList( - newCoverageDetail(1, MAIN_FILE_REF_1) - ); - writer.writeCoverageDetails(TEST_FILE_REF_1, coverageDetails); + writer.writeTests(TEST_FILE_REF_1, Arrays.asList(newTest(1))); + writer.writeCoverageDetails(TEST_FILE_REF_1, Arrays.asList(newCoverageDetail(1, MAIN_FILE_REF_1))); - sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto(PROJECT_UUID))); + sut.execute(new ComputationContext(new BatchReportReader(reportDir), newProjectDto(PROJECT_UUID))); FileSourceDto dto = dbClient.fileSourceDao().selectTest(TEST_FILE_UUID_1); assertThat(dto.getCreatedAt()).isEqualTo(now); @@ -164,99 +163,134 @@ public class PersistTestsStepTest extends BaseStepTest { assertThat(dto.getTestData()).hasSize(1); FileSourceDb.Test test1 = dto.getTestData().get(0); + assertThat(test1.getUuid()).isNotEmpty(); assertThat(test1.getName()).isEqualTo("name#1"); assertThat(test1.getMsg()).isEqualTo("message#1"); assertThat(test1.getStacktrace()).isEqualTo("stacktrace#1"); assertThat(test1.getStatus()).isEqualTo(TestStatus.FAILURE); - assertThat(test1.getType()).isEqualTo(TestType.UT); assertThat(test1.getExecutionTimeMs()).isEqualTo(1_000); assertThat(test1.getCoveredFileCount()).isEqualTo(1); - assertThat(test1.getCoveredFile(0).getCoveredLineList()).containsExactly(1, 2, 3); + assertThat(test1.getCoveredFile(0).getCoveredLineList()).containsOnly(1, 2, 3); assertThat(test1.getCoveredFile(0).getFileUuid()).isEqualTo(MAIN_FILE_UUID_1); } @Test public void insert_tests_without_coverage_details() throws Exception { BatchReportWriter writer = new BatchReportWriter(reportDir); - List<BatchReport.Test> batchTests = Arrays.asList( - newTest(1), newTest(2) - ); + List<BatchReport.Test> batchTests = Arrays.asList(newTest(1), newTest(2)); writer.writeTests(TEST_FILE_REF_1, batchTests); - sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto(PROJECT_UUID))); + sut.execute(new ComputationContext(new BatchReportReader(reportDir), newProjectDto(PROJECT_UUID))); FileSourceDto dto = dbClient.fileSourceDao().selectTest(TEST_FILE_UUID_1); assertThat(dto.getFileUuid()).isEqualTo(TEST_FILE_UUID_1); List<FileSourceDb.Test> tests = dto.getTestData(); assertThat(tests).hasSize(2); assertThat(tests.get(0).getCoveredFileList()).isEmpty(); + assertThat(tests.get(0).getMsg()).isEqualTo("message#1"); + assertThat(tests.get(1).getCoveredFileList()).isEmpty(); + } + + @Test + public void insert_coverage_details_not_taken_into_account() throws Exception { + BatchReportWriter writer = new BatchReportWriter(reportDir); + List<BatchReport.Test> batchTests = Arrays.asList(newTest(1)); + writer.writeTests(TEST_FILE_REF_1, batchTests); + List<CoverageDetail> coverageDetails = Arrays.asList(newCoverageDetail(1, MAIN_FILE_REF_1), newCoverageDetail(2, MAIN_FILE_REF_2)); + writer.writeCoverageDetails(TEST_FILE_REF_1, coverageDetails); + writer.writeCoverageDetails(TEST_FILE_REF_2, coverageDetails); + + sut.execute(new ComputationContext(new BatchReportReader(reportDir), newProjectDto(PROJECT_UUID))); + + assertThat(log.logs(LoggerLevel.WARN)).hasSize(1); + assertThat(log.logs(LoggerLevel.WARN).get(0)).isEqualTo("Some coverage tests are not taken into account during analysis of project 'KEY_PROJECT'"); + assertThat(log.logs(LoggerLevel.TRACE)).hasSize(2); + assertThat(log.logs(LoggerLevel.TRACE).get(0)).isEqualTo("The following test coverages for file 'TEST-PATH-1' have not been taken into account: name#2"); + assertThat(log.logs(LoggerLevel.TRACE).get(1)).startsWith("The following test coverages for file 'TEST-PATH-2' have not been taken into account: "); + assertThat(log.logs(LoggerLevel.TRACE).get(1)).contains("name#1", "name#2"); } @Test - public void update_one_test() throws Exception { + public void aggregate_coverage_details() throws Exception { + BatchReportWriter writer = new BatchReportWriter(reportDir); + writer.writeTests(TEST_FILE_REF_1, Arrays.asList(newTest(1))); + writer.writeCoverageDetails(TEST_FILE_REF_1, Arrays.asList( + newCoverageDetailWithLines(1, MAIN_FILE_REF_1, 1, 3), + newCoverageDetailWithLines(1, MAIN_FILE_REF_1, 2, 4))); + + sut.execute(new ComputationContext(new BatchReportReader(reportDir), newProjectDto(PROJECT_UUID))); + + FileSourceDto dto = dbClient.fileSourceDao().selectTest(TEST_FILE_UUID_1); + List<Integer> coveredLines = dto.getTestData().get(0).getCoveredFile(0).getCoveredLineList(); + assertThat(coveredLines).containsOnly(1, 2, 3, 4); + } + + @Test + public void update_existing_test() throws Exception { // ARRANGE dbClient.fileSourceDao().insert(session, new FileSourceDto() .setProjectUuid(PROJECT_UUID) .setFileUuid(TEST_FILE_UUID_1) - .setTestData(Arrays.asList(newDbTest(1))) + .setTestData(Arrays.asList(FileSourceDb.Test.newBuilder() + .setUuid("test-uuid-1") + .setName("name#1") + .setStatus(TestStatus.ERROR) + .setStacktrace("old-stacktrace#1") + .setMsg("old-message#1") + .setExecutionTimeMs(987_654_321L) + .build())) .setCreatedAt(100_000) .setUpdatedAt(100_000)); session.commit(); assertThat(dbClient.fileSourceDao().selectTest(TEST_FILE_UUID_1)).isNotNull(); + BatchReportWriter writer = new BatchReportWriter(reportDir); - List<BatchReport.Test> batchTests = Arrays.asList( - newTest(1), newTest(2) - ); - writer.writeTests(TEST_FILE_REF_1, batchTests); - List<CoverageDetail> coverageDetails = Arrays.asList( - newCoverageDetail(1, MAIN_FILE_REF_1) - ); - writer.writeCoverageDetails(TEST_FILE_REF_1, coverageDetails); + BatchReport.Test newBatchTest = newTest(1); + writer.writeTests(TEST_FILE_REF_1, Arrays.asList(newBatchTest)); + + CoverageDetail newCoverageDetail = newCoverageDetail(1, MAIN_FILE_REF_1); + writer.writeCoverageDetails(TEST_FILE_REF_1, Arrays.asList(newCoverageDetail)); // ACT - sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto(PROJECT_UUID))); + sut.execute(new ComputationContext(new BatchReportReader(reportDir), newProjectDto(PROJECT_UUID))); // ASSERT FileSourceDto dto = dbClient.fileSourceDao().selectTest(TEST_FILE_UUID_1); assertThat(dto.getCreatedAt()).isEqualTo(100_000); assertThat(dto.getUpdatedAt()).isEqualTo(now); - assertThat(dto.getTestData()).hasSize(2); + assertThat(dto.getTestData()).hasSize(1); FileSourceDb.Test test = dto.getTestData().get(0); + assertThat(test.getUuid()).isNotEqualTo("test-uuid-1"); assertThat(test.getName()).isEqualTo("name#1"); - assertThat(test.getMsg()).isEqualTo("message#1"); + assertThat(test.getStatus()).isEqualTo(newBatchTest.getStatus()); + assertThat(test.getMsg()).isEqualTo(newBatchTest.getMsg()); + assertThat(test.getStacktrace()).isEqualTo(newBatchTest.getStacktrace()); + assertThat(test.getExecutionTimeMs()).isEqualTo(newBatchTest.getDurationInMs()); assertThat(test.getCoveredFileCount()).isEqualTo(1); - assertThat(test.getCoveredFile(0).getCoveredLineList()).containsExactly(1, 2, 3); + assertThat(test.getCoveredFile(0).getCoveredLineList()).containsOnly(1, 2, 3); assertThat(test.getCoveredFile(0).getFileUuid()).isEqualTo(MAIN_FILE_UUID_1); } - private FileSourceDb.Test newDbTest(int id) { - return FileSourceDb.Test.newBuilder() - .setName("name#" + id) - .setType(TestType.IT) - .setStatus(TestStatus.ERROR) - .setStacktrace("old-stacktrace#" + id) - .setMsg("old-message#" + id) - .setExecutionTimeMs(123_456_789L) - .build(); - } - private BatchReport.Test newTest(int id) { return BatchReport.Test.newBuilder() - .setType(TestType.UT) .setStatus(TestStatus.FAILURE) .setName("name#" + id) .setStacktrace("stacktrace#" + id) .setMsg("message#" + id) - .setExecutionTimeMs(1_000) + .setDurationInMs(1_000) .build(); } private BatchReport.CoverageDetail newCoverageDetail(int id, int covered_file_ref) { + return newCoverageDetailWithLines(id, covered_file_ref, 1, 2, 3); + } + + private BatchReport.CoverageDetail newCoverageDetailWithLines(int id, int covered_file_ref, Integer... lines) { return CoverageDetail.newBuilder() .setTestName("name#" + id) .addCoveredFile(CoverageDetail.CoveredFile.newBuilder() - .addAllCoveredLine(Arrays.asList(1, 2, 3)) + .addAllCoveredLine(Arrays.asList(lines)) .setFileRef(covered_file_ref) .build() ) @@ -287,12 +321,14 @@ public class PersistTestsStepTest extends BaseStepTest { .setIsTest(true) .setType(Constants.ComponentType.FILE) .setUuid(TEST_FILE_UUID_1) + .setPath(TEST_FILE_PATH_1) .build()); writer.writeComponent(BatchReport.Component.newBuilder() .setRef(TEST_FILE_REF_2) .setIsTest(true) .setType(Constants.ComponentType.FILE) .setUuid(TEST_FILE_UUID_2) + .setPath(TEST_FILE_PATH_2) .build()); writer.writeComponent(BatchReport.Component.newBuilder() .setRef(MAIN_FILE_REF_1) |