From: Sébastien Lesaint Date: Mon, 23 Apr 2018 13:05:23 +0000 (+0200) Subject: SONAR-10430 add FileSourceDto#getLineCount() X-Git-Tag: 7.5~1128 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e8d18a35e2d2e60328b1abab78d36d0a8ab9340d;p=sonarqube.git SONAR-10430 add FileSourceDto#getLineCount() and do not expose hash list as raw string anymore --- diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceDto.java index 0e30488e1d7..0d19dbff934 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceDto.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceDto.java @@ -19,6 +19,8 @@ */ package org.sonar.db.source; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; import com.google.protobuf.CodedInputStream; import com.google.protobuf.InvalidProtocolBufferException; import java.io.ByteArrayInputStream; @@ -26,6 +28,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import javax.annotation.CheckForNull; import javax.annotation.Nullable; @@ -34,12 +37,16 @@ import net.jpountz.lz4.LZ4BlockOutputStream; import org.apache.commons.io.IOUtils; import org.sonar.db.protobuf.DbFileSources; +import static com.google.common.base.Splitter.on; import static java.lang.String.format; public class FileSourceDto { private static final String SIZE_LIMIT_EXCEEDED_EXCEPTION_MESSAGE = "Protocol message was too large. May be malicious. " + "Use CodedInputStream.setSizeLimit() to increase the size limit."; + private static final Joiner LINE_RETURN_JOINER = Joiner.on('\n'); + public static final Splitter LINES_HASHES_SPLITTER = on('\n'); + public static final int LINE_COUNT_NOT_POPULATED = -1; private Long id; private String projectUuid; @@ -47,8 +54,20 @@ public class FileSourceDto { private long createdAt; private long updatedAt; private String lineHashes; + /** + * When {@code line_count} column has been added, it's been populated with value {@link #LINE_COUNT_NOT_POPULATED -1}, + * which implies all existing files sources have this value at the time SonarQube is upgraded. + *

+ * Column {@code line_count} is populated with the correct value from every new files and for existing files as the + * project they belong to is analyzed for the first time after the migration. + *

+ * Method {@link #getLineCount()} hides this migration-only-related complexity by either returning the value + * of column {@code line_count} when its been populated, or computed the returned value from the value of column + * {@code line_hashes}. + */ + private int lineCount = LINE_COUNT_NOT_POPULATED; private String srcHash; - private byte[] binaryData; + private byte[] binaryData = new byte[0]; private String dataType; private String dataHash; private String revision; @@ -241,13 +260,43 @@ public class FileSourceDto { return this; } - @CheckForNull - public String getLineHashes() { + /** Used by MyBatis */ + public String getRawLineHashes() { return lineHashes; } - public FileSourceDto setLineHashes(@Nullable String lineHashes) { + public void setRawLineHashes(@Nullable String lineHashes) { this.lineHashes = lineHashes; + } + + public List getLineHashes() { + if (lineHashes == null) { + return Collections.emptyList(); + } + return LINES_HASHES_SPLITTER.splitToList(lineHashes); + } + + /** + * @return the value of column {@code line_count} if populated, otherwise the size of {@link #getLineHashes()}. + */ + public int getLineCount() { + if (lineCount == LINE_COUNT_NOT_POPULATED) { + return getLineHashes().size(); + } + return lineCount; + } + + public FileSourceDto setLineHashes(@Nullable List lineHashes) { + if (lineHashes == null) { + this.lineHashes = null; + this.lineCount = 0; + } else if (lineHashes.isEmpty()) { + this.lineHashes = null; + this.lineCount = 1; + } else { + this.lineHashes = LINE_RETURN_JOINER.join(lineHashes); + this.lineCount = lineHashes.size(); + } return this; } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/source/FileSourceMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/source/FileSourceMapper.xml index 2fc4b3f6bc2..e449b0e0803 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/source/FileSourceMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/source/FileSourceMapper.xml @@ -5,11 +5,26 @@ - INSERT INTO file_sources (project_uuid, file_uuid, created_at, updated_at, binary_data, line_hashes, data_hash, - src_hash, data_type, revision, line_hashes_version) - VALUES (#{projectUuid,jdbcType=VARCHAR}, #{fileUuid,jdbcType=VARCHAR}, #{createdAt,jdbcType=BIGINT}, - #{updatedAt,jdbcType=BIGINT}, #{binaryData,jdbcType=BLOB}, #{lineHashes,jdbcType=CLOB}, - #{dataHash,jdbcType=VARCHAR}, #{srcHash,jdbcType=VARCHAR},#{dataType,jdbcType=VARCHAR}, - #{revision,jdbcType=VARCHAR}, #{lineHashesVersion,jdbcType=INTEGER}) + insert into file_sources + ( + project_uuid, + file_uuid, + created_at, + updated_at, + binary_data, + line_hashes, + line_hashes_version, + line_count, + data_hash, + src_hash, + data_type, + revision + ) + values + ( + #{projectUuid,jdbcType=VARCHAR}, + #{fileUuid,jdbcType=VARCHAR}, + #{createdAt,jdbcType=BIGINT}, + #{updatedAt,jdbcType=BIGINT}, + #{binaryData,jdbcType=BLOB}, + #{rawLineHashes,jdbcType=CLOB}, + #{lineHashesVersion,jdbcType=INTEGER}, + #{lineCount,jdbcType=INTEGER}, + #{dataHash,jdbcType=VARCHAR}, + #{srcHash,jdbcType=VARCHAR}, + #{dataType,jdbcType=VARCHAR}, + #{revision,jdbcType=VARCHAR} + ) - UPDATE file_sources SET - updated_at = #{updatedAt,jdbcType=BIGINT}, - binary_data = #{binaryData,jdbcType=BLOB}, - line_hashes = #{lineHashes,jdbcType=CLOB}, - data_hash = #{dataHash,jdbcType=VARCHAR}, - src_hash = #{srcHash,jdbcType=VARCHAR}, - revision = #{revision,jdbcType=VARCHAR}, - line_hashes_version = #{lineHashesVersion,jdbcType=INTEGER} - WHERE id = #{id} + update + file_sources + set + updated_at = #{updatedAt,jdbcType=BIGINT}, + binary_data = #{binaryData,jdbcType=BLOB}, + line_hashes = #{rawLineHashes,jdbcType=CLOB}, + line_hashes_version = #{lineHashesVersion,jdbcType=INTEGER}, + line_count = #{lineCount,jdbcType=INTEGER}, + data_hash = #{dataHash,jdbcType=VARCHAR}, + src_hash = #{srcHash,jdbcType=VARCHAR}, + revision = #{revision,jdbcType=VARCHAR} + where + id = #{id} diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceDaoTest.java index c8fd1b8a734..efd8bfc8578 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceDaoTest.java @@ -19,6 +19,7 @@ */ package org.sonar.db.source; +import com.google.common.collect.ImmutableList; import java.io.IOException; import java.io.Reader; import java.util.function.Consumer; @@ -31,6 +32,9 @@ import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.source.FileSourceDto.Type; +import static com.google.common.collect.ImmutableList.of; +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; @@ -93,24 +97,79 @@ public class FileSourceDaoTest { @Test public void insert() { - dbTester.prepareDbUnit(getClass(), "shared.xml"); - - underTest.insert(session, new FileSourceDto() + FileSourceDto expected = new FileSourceDto() .setProjectUuid("PRJ_UUID") .setFileUuid("FILE2_UUID") .setBinaryData("FILE2_BINARY_DATA".getBytes()) .setDataHash("FILE2_DATA_HASH") - .setLineHashes("LINE1_HASH\\nLINE2_HASH") + .setLineHashes(of("LINE1_HASH", "LINE2_HASH")) .setSrcHash("FILE2_HASH") .setDataType(Type.SOURCE) .setCreatedAt(1500000000000L) .setUpdatedAt(1500000000001L) .setLineHashesVersion(1) - .setRevision("123456789")); + .setRevision("123456789"); + underTest.insert(session, expected); + session.commit(); + + FileSourceDto fileSourceDto = underTest.selectSourceByFileUuid(session, expected.getFileUuid()); + + assertThat(fileSourceDto.getProjectUuid()).isEqualTo(expected.getProjectUuid()); + assertThat(fileSourceDto.getFileUuid()).isEqualTo(expected.getFileUuid()); + assertThat(fileSourceDto.getBinaryData()).isEqualTo(expected.getBinaryData()); + assertThat(fileSourceDto.getDataHash()).isEqualTo(expected.getDataHash()); + assertThat(fileSourceDto.getRawLineHashes()).isEqualTo(expected.getRawLineHashes()); + assertThat(fileSourceDto.getLineHashes()).isEqualTo(expected.getLineHashes()); + assertThat(fileSourceDto.getLineCount()).isEqualTo(expected.getLineCount()); + assertThat(fileSourceDto.getSrcHash()).isEqualTo(expected.getSrcHash()); + assertThat(fileSourceDto.getCreatedAt()).isEqualTo(expected.getCreatedAt()); + assertThat(fileSourceDto.getUpdatedAt()).isEqualTo(expected.getUpdatedAt()); + assertThat(fileSourceDto.getRevision()).isEqualTo(expected.getRevision()); + } + + @Test + public void insert_does_not_fail_on_FileSourceDto_with_only_non_nullable_data() { + FileSourceDto fileSourceDto = new FileSourceDto() + .setProjectUuid("Foo") + .setFileUuid("Bar") + .setCreatedAt(1500000000000L) + .setUpdatedAt(1500000000001L); + underTest.insert(session, fileSourceDto); + session.commit(); + } + + @Test + public void selectSourceByFileUuid_reads_source_without_line_hashes() { + FileSourceDto fileSourceDto = new FileSourceDto() + .setProjectUuid("Foo") + .setFileUuid("Bar") + .setDataType(Type.SOURCE) + .setCreatedAt(1500000000000L) + .setUpdatedAt(1500000000001L); + underTest.insert(session, fileSourceDto); + session.commit(); + + FileSourceDto res = underTest.selectSourceByFileUuid(session, fileSourceDto.getFileUuid()); + + assertThat(res.getLineCount()).isEqualTo(0); + assertThat(res.getLineHashes()).isEmpty(); + } + + @Test + public void selectTest_reads_test_without_line_hashes() { + FileSourceDto fileSourceDto = new FileSourceDto() + .setProjectUuid("Foo") + .setFileUuid("Bar") + .setDataType(Type.TEST) + .setCreatedAt(1500000000000L) + .setUpdatedAt(1500000000001L); + underTest.insert(session, fileSourceDto); session.commit(); - dbTester.assertDbUnitTable(getClass(), "insert-result.xml", "file_sources", - "project_uuid", "file_uuid", "data_hash", "line_hashes", "src_hash", "created_at", "updated_at", "data_type", "revision", "line_hashes_version"); + FileSourceDto res = underTest.selectTestByFileUuid(session, fileSourceDto.getFileUuid()); + + assertThat(res.getLineCount()).isEqualTo(0); + assertThat(res.getLineHashes()).isEmpty(); } @Test @@ -139,7 +198,7 @@ public class FileSourceDaoTest { .setFileUuid("FILE2_UUID") .setBinaryData("FILE2_BINARY_DATA".getBytes()) .setDataHash("FILE2_DATA_HASH") - .setLineHashes("hashes") + .setLineHashes(singletonList("hashes")) .setSrcHash("FILE2_HASH") .setDataType(Type.SOURCE) .setCreatedAt(1500000000000L) @@ -157,7 +216,7 @@ public class FileSourceDaoTest { .setFileUuid("FILE2_UUID") .setBinaryData("FILE2_BINARY_DATA".getBytes()) .setDataHash("FILE2_DATA_HASH") - .setLineHashes("hashes") + .setLineHashes(singletonList("hashes")) .setSrcHash("FILE2_HASH") .setDataType(Type.SOURCE) .setCreatedAt(1500000000000L) @@ -207,7 +266,7 @@ public class FileSourceDaoTest { .setBinaryData("updated data".getBytes()) .setDataHash("NEW_DATA_HASH") .setSrcHash("NEW_FILE_HASH") - .setLineHashes("NEW_LINE_HASHES") + .setLineHashes(singletonList("NEW_LINE_HASHES")) .setDataType(Type.SOURCE) .setUpdatedAt(1500000000002L) .setLineHashesVersion(1) @@ -218,6 +277,33 @@ public class FileSourceDaoTest { "data_hash", "line_hashes", "src_hash", "created_at", "updated_at", "data_type", "revision", "line_hashes_version"); } + @Test + public void update_to_no_line_hashes() { + ImmutableList lineHashes = of("a", "b", "c"); + FileSourceDto fileSourceDto = new FileSourceDto() + .setProjectUuid("Foo") + .setFileUuid("Bar") + .setDataType(Type.SOURCE) + .setLineHashes(lineHashes) + .setCreatedAt(1500000000000L) + .setUpdatedAt(1500000000001L); + underTest.insert(session, fileSourceDto); + session.commit(); + + FileSourceDto resBefore = underTest.selectSourceByFileUuid(session, fileSourceDto.getFileUuid()); + assertThat(resBefore.getLineCount()).isEqualTo(lineHashes.size()); + assertThat(resBefore.getLineHashes()).isEqualTo(lineHashes); + + fileSourceDto.setId(resBefore.getId()); + fileSourceDto.setLineHashes(emptyList()); + underTest.update(session, fileSourceDto); + session.commit(); + + FileSourceDto res = underTest.selectSourceByFileUuid(session, fileSourceDto.getFileUuid()); + assertThat(res.getLineHashes()).isEmpty(); + assertThat(res.getLineCount()).isEqualTo(1); + } + private static class ReaderToStringConsumer implements Consumer { String result = null; diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceDtoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceDtoTest.java index 6ec45c589dd..4089a700f3b 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceDtoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceDtoTest.java @@ -19,8 +19,13 @@ */ package org.sonar.db.source; +import com.google.common.base.Joiner; import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -91,4 +96,44 @@ public class FileSourceDtoTest { } return dataBuilder.build(); } + + @Test + public void new_FileSourceDto_as_lineCount_0_and_rawLineHashes_to_null() { + FileSourceDto underTest = new FileSourceDto(); + + assertThat(underTest.getLineCount()).isZero(); + assertThat(underTest.getLineHashes()).isEmpty(); + assertThat(underTest.getRawLineHashes()).isNull(); + } + + @Test + public void setLineHashes_null_sets_lineCount_to_0_and_rawLineHashes_to_null() { + FileSourceDto underTest = new FileSourceDto(); + underTest.setLineHashes(null); + + assertThat(underTest.getLineCount()).isZero(); + assertThat(underTest.getLineHashes()).isEmpty(); + assertThat(underTest.getRawLineHashes()).isNull(); + } + + @Test + public void setLineHashes_empty_sets_lineCount_to_1_and_rawLineHashes_to_null() { + FileSourceDto underTest = new FileSourceDto(); + underTest.setLineHashes(Collections.emptyList()); + + assertThat(underTest.getLineCount()).isEqualTo(1); + assertThat(underTest.getLineHashes()).isEmpty(); + assertThat(underTest.getRawLineHashes()).isNull(); + } + + @Test + public void setLineHashes_sets_lineCount_to_size_of_list_and_rawLineHashes_to_join_by_line_return() { + FileSourceDto underTest = new FileSourceDto(); + int expected = 1 + new Random().nextInt(96); + List lineHashes = IntStream.range(0, expected).mapToObj(String::valueOf).collect(Collectors.toList()); + underTest.setLineHashes(lineHashes); + + assertThat(underTest.getLineCount()).isEqualTo(expected); + assertThat(underTest.getRawLineHashes()).isEqualTo(Joiner.on('\n').join(lineHashes)); + } } diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceTester.java b/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceTester.java index f850837c331..2da66345b72 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceTester.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceTester.java @@ -21,8 +21,11 @@ package org.sonar.db.source; import java.util.Arrays; import java.util.Date; +import java.util.Random; import java.util.function.Consumer; +import java.util.stream.IntStream; import org.apache.commons.lang.math.RandomUtils; +import org.sonar.core.util.stream.MoreCollectors; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.protobuf.DbFileSources; @@ -44,7 +47,7 @@ public class FileSourceTester { .setFileUuid(file.uuid()) .setSrcHash(randomAlphanumeric(50)) .setDataHash(randomAlphanumeric(50)) - .setLineHashes(randomAlphanumeric(50)) + .setLineHashes(IntStream.range(0, new Random().nextInt(21)).mapToObj(String::valueOf).collect(MoreCollectors.toList())) .setRevision(randomAlphanumeric(100)) .setSourceData(newRandomData(3).build()) .setCreatedAt(new Date().getTime()) diff --git a/server/sonar-db-dao/src/test/resources/org/sonar/db/source/FileSourceDaoTest/insert-result.xml b/server/sonar-db-dao/src/test/resources/org/sonar/db/source/FileSourceDaoTest/insert-result.xml deleted file mode 100644 index 5aec962e987..00000000000 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/source/FileSourceDaoTest/insert-result.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStep.java index 3a622ac7680..f1a27767fb5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStep.java @@ -53,7 +53,6 @@ import org.sonar.server.computation.task.projectanalysis.filemove.FileSimilarity import org.sonar.server.computation.task.projectanalysis.source.SourceLinesHashRepository; import org.sonar.server.computation.task.step.ComputationStep; -import static com.google.common.base.MoreObjects.firstNonNull; import static com.google.common.base.Splitter.on; import static com.google.common.collect.FluentIterable.from; import static java.util.Arrays.asList; @@ -222,8 +221,7 @@ public class FileMoveDetectionStep implements ComputationStep { if (fileSourceDto == null) { return null; } - String lineHashes = firstNonNull(fileSourceDto.getLineHashes(), ""); - return new File(dbComponent.getPath(), LINES_HASHES_SPLITTER.splitToList(lineHashes)); + return new File(dbComponent.getPath(), fileSourceDto.getLineHashes()); } private static void printIfDebug(ScoreMatrix scoreMatrix) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/ComputeFileSourceData.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/ComputeFileSourceData.java index d15efb9b1c0..85992b45241 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/ComputeFileSourceData.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/ComputeFileSourceData.java @@ -51,7 +51,7 @@ public class ComputeFileSourceData { read(fileSourceBuilder, currentLine, linesIterator.next(), linesIterator.hasNext()); } - return new Data(fileSourceBuilder.build(), LINE_RETURN_JOINER.join(lineHashesComputer.getResult()), sourceHashComputer.getHash()); + return new Data(fileSourceBuilder.build(), lineHashesComputer.getResult(), sourceHashComputer.getHash()); } private void read(DbFileSources.Data.Builder fileSourceBuilder, int currentLine, String lineSource, boolean hasNextLine) { @@ -70,10 +70,10 @@ public class ComputeFileSourceData { public static class Data { private final DbFileSources.Data fileSourceData; - private final String lineHashes; + private final List lineHashes; private final String srcHash; - private Data(DbFileSources.Data fileSourceData, String lineHashes, String srcHash) { + private Data(DbFileSources.Data fileSourceData, List lineHashes, String srcHash) { this.fileSourceData = fileSourceData; this.lineHashes = lineHashes; this.srcHash = srcHash; @@ -83,7 +83,7 @@ public class ComputeFileSourceData { return srcHash; } - public String getLineHashes() { + public List getLineHashes() { return lineHashes; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStep.java index 749d48cf510..7ed6759b6ac 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStep.java @@ -135,9 +135,9 @@ public class PersistFileSourcesStep implements ComputationStep { byte[] data = FileSourceDto.encodeSourceData(fileData); String dataHash = DigestUtils.md5Hex(data); String srcHash = fileSourceData.getSrcHash(); - String lineHashes = fileSourceData.getLineHashes(); + List lineHashes = fileSourceData.getLineHashes(); + Integer lineHashesVersion = sourceLinesHash.getLineHashesVersion(file); FileSourceDto previousDto = previousFileSourcesByUuid.get(file.getUuid()); - int lineHashesVersion = sourceLinesHash.getLineHashesVersion(file); if (previousDto == null) { FileSourceDto dto = new FileSourceDto() diff --git a/server/sonar-server/src/test/java/org/sonar/server/batch/ProjectDataLoaderTest.java b/server/sonar-server/src/test/java/org/sonar/server/batch/ProjectDataLoaderTest.java index ea8f2be347e..5444d7ad49e 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/batch/ProjectDataLoaderTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/batch/ProjectDataLoaderTest.java @@ -45,6 +45,7 @@ import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.tester.UserSessionRule; +import static com.google.common.collect.ImmutableList.of; import static java.lang.String.format; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.entry; @@ -728,7 +729,7 @@ public class ProjectDataLoaderTest { .setFileUuid(file.uuid()) .setProjectUuid(file.projectUuid()) .setDataHash("0263047cd758c68c27683625f072f010") - .setLineHashes("8d7b3d6b83c0a517eac07e1aac94b773") + .setLineHashes(of("8d7b3d6b83c0a517eac07e1aac94b773")) .setCreatedAt(System.currentTimeMillis()) .setUpdatedAt(System.currentTimeMillis()) .setDataType(FileSourceDto.Type.SOURCE) 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 9de1df73da2..0c844c8dbd4 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 @@ -46,7 +46,6 @@ import org.sonar.server.computation.task.projectanalysis.component.Component; 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 org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -497,7 +496,7 @@ public class FileMoveDetectionStepTest { FileSourceDto fileSourceDto = new FileSourceDto() .setFileUuid(file.uuid()) .setProjectUuid(file.projectUuid()) - .setLineHashes(on('\n').join(linesHashesComputer.getLineHashes())) + .setLineHashes(linesHashesComputer.getLineHashes()) .setDataType(FileSourceDto.Type.SOURCE); dbTester.getDbClient().fileSourceDao().insert(dbTester.getSession(), fileSourceDto); dbTester.commit(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/ComputeFileSourceDataTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/ComputeFileSourceDataTest.java index b3436685c34..c66d1606c89 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/ComputeFileSourceDataTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/ComputeFileSourceDataTest.java @@ -45,7 +45,7 @@ public class ComputeFileSourceDataTest { lineHashesComputer); ComputeFileSourceData.Data data = computeFileSourceData.compute(); - assertThat(data.getLineHashes()).isEqualTo("137f72c3708c6bd0de00a0e5a69c699b"); + assertThat(data.getLineHashes()).containsOnly("137f72c3708c6bd0de00a0e5a69c699b"); assertThat(data.getSrcHash()).isEqualTo("137f72c3708c6bd0de00a0e5a69c699b"); assertThat(data.getFileSourceData().getLinesList()).hasSize(1); assertThat(data.getFileSourceData().getLines(0).getHighlighting()).isEqualTo("h-1"); @@ -65,7 +65,7 @@ public class ComputeFileSourceDataTest { lineHashesComputer); ComputeFileSourceData.Data data = computeFileSourceData.compute(); - assertThat(data.getLineHashes()).isEqualTo("137f72c3708c6bd0de00a0e5a69c699b\ne6251bcf1a7dc3ba5e7933e325bbe605"); + assertThat(data.getLineHashes()).containsOnly("137f72c3708c6bd0de00a0e5a69c699b", "e6251bcf1a7dc3ba5e7933e325bbe605"); assertThat(data.getSrcHash()).isEqualTo("ee5a58024a155466b43bc559d953e018"); assertThat(data.getFileSourceData().getLinesList()).hasSize(2); assertThat(data.getFileSourceData().getLines(0).getHighlighting()).isEqualTo("h-1"); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStepTest.java index ab910b36ac2..84793b8a023 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStepTest.java @@ -21,6 +21,7 @@ package org.sonar.server.computation.task.projectanalysis.step; import com.google.common.collect.Lists; import java.util.Arrays; +import java.util.List; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -53,6 +54,7 @@ import org.sonar.server.computation.task.projectanalysis.source.SourceLinesHashR import org.sonar.server.computation.task.projectanalysis.source.SourceLinesRepositoryRule; import org.sonar.server.computation.task.step.ComputationStep; +import static com.google.common.collect.ImmutableList.of; import static com.google.common.collect.Lists.newArrayList; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -137,7 +139,7 @@ public class PersistFileSourcesStepTest extends BaseStepTest { assertThat(dbTester.countRowsOfTable("file_sources")).isEqualTo(1); FileSourceDto fileSourceDto = dbClient.fileSourceDao().selectSourceByFileUuid(session, FILE1_UUID); - assertThat(fileSourceDto.getLineHashes()).isEqualTo("137f72c3708c6bd0de00a0e5a69c699b\ne6251bcf1a7dc3ba5e7933e325bbe605"); + assertThat(fileSourceDto.getLineHashes()).containsExactly("137f72c3708c6bd0de00a0e5a69c699b", "e6251bcf1a7dc3ba5e7933e325bbe605"); assertThat(fileSourceDto.getSrcHash()).isEqualTo("ee5a58024a155466b43bc559d953e018"); } @@ -326,7 +328,7 @@ public class PersistFileSourcesStepTest extends BaseStepTest { // Existing sources long past = 150000L; String srcHash = "137f72c3708c6bd0de00a0e5a69c699b"; - String lineHashes = "137f72c3708c6bd0de00a0e5a69c699b"; + List lineHashes = of("137f72c3708c6bd0de00a0e5a69c699b"); String dataHash = "29f25900140c94db38035128cb6de6a2"; dbClient.fileSourceDao().insert(dbTester.getSession(), new FileSourceDto() @@ -369,7 +371,7 @@ public class PersistFileSourcesStepTest extends BaseStepTest { .setFileUuid(FILE1_UUID) .setDataType(Type.SOURCE) .setSrcHash("5b4bd9815cdb17b8ceae19eb1810c34c") - .setLineHashes("6438c669e0d0de98e6929c2cc0fac474\n") + .setLineHashes(of("6438c669e0d0de98e6929c2cc0fac474", "")) .setDataHash("6cad150e3d065976c230cddc5a09efaa") .setSourceData(DbFileSources.Data.newBuilder() .addLines(DbFileSources.Line.newBuilder() @@ -408,7 +410,7 @@ public class PersistFileSourcesStepTest extends BaseStepTest { .setFileUuid(FILE1_UUID) .setDataType(Type.SOURCE) // Source hash is missing, update will be made - .setLineHashes("137f72c3708c6bd0de00a0e5a69c699b") + .setLineHashes(of("137f72c3708c6bd0de00a0e5a69c699b")) .setDataHash("29f25900140c94db38035128cb6de6a2") .setSourceData(DbFileSources.Data.newBuilder() .addLines(DbFileSources.Line.newBuilder() @@ -440,7 +442,7 @@ public class PersistFileSourcesStepTest extends BaseStepTest { .setFileUuid(FILE1_UUID) .setDataType(Type.SOURCE) .setSrcHash("137f72c3708c6bd0de00a0e5a69c699b") - .setLineHashes("137f72c3708c6bd0de00a0e5a69c699b") + .setLineHashes(of("137f72c3708c6bd0de00a0e5a69c699b")) .setDataHash("8e84c0d961cfe364e43833c4cc4ddef5") // Revision is missing, update will be made .setSourceData(DbFileSources.Data.newBuilder() @@ -479,7 +481,7 @@ public class PersistFileSourcesStepTest extends BaseStepTest { .setFileUuid(FILE1_UUID) .setDataType(Type.SOURCE) .setSrcHash("137f72c3708c6bd0de00a0e5a69c699b") - .setLineHashes("137f72c3708c6bd0de00a0e5a69c699b") + .setLineHashes(of("137f72c3708c6bd0de00a0e5a69c699b")) .setDataHash("8e84c0d961cfe364e43833c4cc4ddef5") // Revision is missing, update will be made .setSourceData(DbFileSources.Data.newBuilder() diff --git a/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/shared.xml b/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/shared.xml index be57e6c9b98..ae19ab0df34 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/shared.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/shared.xml @@ -41,6 +41,7 @@ file_uuid="CDEF" binary_data="" data_hash="hash" + line_count="1" line_hashes="987654" src_hash="12345" created_at="1414597442000" diff --git a/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/show_hashes_on_test_file.xml b/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/show_hashes_on_test_file.xml index 71ce93166c6..dd0619767d5 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/show_hashes_on_test_file.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/show_hashes_on_test_file.xml @@ -41,6 +41,7 @@ file_uuid="CDEF" binary_data="" data_hash="[null]" + line_count="0" line_hashes="[null]" src_hash="[null]" created_at="1414597442000" @@ -52,6 +53,7 @@ file_uuid="CDEF" binary_data="" data_hash="hash" + line_count="1" line_hashes="987654" src_hash="12345" created_at="1414597442000" diff --git a/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestIndexerTest/db.xml b/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestIndexerTest/db.xml index c2326dde5dc..5aedd1c1678 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestIndexerTest/db.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestIndexerTest/db.xml @@ -1,6 +1,14 @@ - + diff --git a/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestResultSetIteratorTest/filter_by_project.xml b/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestResultSetIteratorTest/filter_by_project.xml index c629e0e50a8..5db8861307c 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestResultSetIteratorTest/filter_by_project.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestResultSetIteratorTest/filter_by_project.xml @@ -1,9 +1,23 @@ - + - + diff --git a/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestResultSetIteratorTest/filter_by_project_and_date.xml b/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestResultSetIteratorTest/filter_by_project_and_date.xml index 2edb2eafec1..b40d33fae8b 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestResultSetIteratorTest/filter_by_project_and_date.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestResultSetIteratorTest/filter_by_project_and_date.xml @@ -1,9 +1,23 @@ - + - + diff --git a/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestResultSetIteratorTest/shared.xml b/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestResultSetIteratorTest/shared.xml index 3942d39e9f6..ca4a6e5d88a 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestResultSetIteratorTest/shared.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/test/index/TestResultSetIteratorTest/shared.xml @@ -1,6 +1,13 @@ - +