From 551db520fa153e6654e9d39bde8404aeae14f9d3 Mon Sep 17 00:00:00 2001 From: Duarte Meneses Date: Mon, 28 Jun 2021 10:10:21 -0500 Subject: SONAR-14917 Misleading memory amounts displayed in Administration > System --- .../main/java/org/sonar/core/util/FileUtils.java | 22 +++++++++++++++++++ .../java/org/sonar/core/util/FileUtilsTest.java | 25 ++++++++++++++++++++++ 2 files changed, 47 insertions(+) (limited to 'sonar-core') diff --git a/sonar-core/src/main/java/org/sonar/core/util/FileUtils.java b/sonar-core/src/main/java/org/sonar/core/util/FileUtils.java index 109e6769ce9..ad058a6f45b 100644 --- a/sonar-core/src/main/java/org/sonar/core/util/FileUtils.java +++ b/sonar-core/src/main/java/org/sonar/core/util/FileUtils.java @@ -27,6 +27,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; +import java.text.CharacterIterator; +import java.text.StringCharacterIterator; import java.util.EnumSet; import javax.annotation.Nullable; @@ -161,6 +163,26 @@ public final class FileUtils { checkIO(!file.exists(), "Unable to delete directory '%s'", path); } + /** + * Replaces the use of Apache Commons FileUtils #byteCountToDisplaySize (see SONAR-14917) + * @param bytes number of bytes + * @return human readable byte count, with 1 decimal place + */ + public static String humanReadableByteCountSI(long bytes) { + if (-1000 < bytes && bytes < 1000) { + if (bytes == 1) { + return bytes + " byte"; + } + return bytes + " bytes"; + } + CharacterIterator ci = new StringCharacterIterator("kMGTPE"); + while (bytes <= -999_950 || bytes >= 999_950) { + bytes /= 1000; + ci.next(); + } + return String.format("%.1f %cB", bytes / 1000.0, ci.current()); + } + /** * This visitor is intended to be used to visit direct children of directory or a symLink to a directory, * so, with a max depth of {@link #VISIT_MAX_DEPTH 1}. Each direct children will either be directly deleted (if file) diff --git a/sonar-core/src/test/java/org/sonar/core/util/FileUtilsTest.java b/sonar-core/src/test/java/org/sonar/core/util/FileUtilsTest.java index 89eefb5b4a9..de333333ccb 100644 --- a/sonar-core/src/test/java/org/sonar/core/util/FileUtilsTest.java +++ b/sonar-core/src/test/java/org/sonar/core/util/FileUtilsTest.java @@ -159,6 +159,31 @@ public class FileUtilsTest { assertThat(childDir2).doesNotExist(); } + @Test + public void humanReadableByteCountSI_returns_bytes() { + assertThat(FileUtils.humanReadableByteCountSI(123)).isEqualTo("123 bytes"); + assertThat(FileUtils.humanReadableByteCountSI(0)).isEqualTo("0 bytes"); + assertThat(FileUtils.humanReadableByteCountSI(1)).isEqualTo("1 byte"); + } + + @Test + public void humanReadableByteCountSI_returns_kbs() { + assertThat(FileUtils.humanReadableByteCountSI(1_234)).isEqualTo("1.2 kB"); + assertThat(FileUtils.humanReadableByteCountSI(1_000)).isEqualTo("1.0 kB"); + assertThat(FileUtils.humanReadableByteCountSI(9_999)).isEqualTo("10.0 kB"); + assertThat(FileUtils.humanReadableByteCountSI(999_949)).isEqualTo("999.9 kB"); + } + + @Test + public void humanReadableByteCountSI_returns_tbs() { + assertThat(FileUtils.humanReadableByteCountSI(1_234_000_000_000L)).isEqualTo("1.2 TB"); + } + + @Test + public void humanReadableByteCountSI_returns_mbs() { + assertThat(FileUtils.humanReadableByteCountSI(1234567)).isEqualTo("1.2 MB"); + } + @Test public void deleteQuietly_deletes_symbolicLink() throws IOException { assumeTrue(SystemUtils.IS_OS_UNIX); -- cgit v1.2.3