diff --git a/platform/platform-tests/testSrc/com/intellij/platform/util/io/storages/appendonlylog/AppendOnlyLogOverMMappedFileTest.java b/platform/platform-tests/testSrc/com/intellij/platform/util/io/storages/appendonlylog/AppendOnlyLogOverMMappedFileTest.java index 983b2117542a..edcbe8b2daf1 100644 --- a/platform/platform-tests/testSrc/com/intellij/platform/util/io/storages/appendonlylog/AppendOnlyLogOverMMappedFileTest.java +++ b/platform/platform-tests/testSrc/com/intellij/platform/util/io/storages/appendonlylog/AppendOnlyLogOverMMappedFileTest.java @@ -49,7 +49,7 @@ public class AppendOnlyLogOverMMappedFileTest { @Before public void setUp() throws IOException { assertEquals("THREADS_COUNT(" + THREADS_COUNT + ") must divide ENOUGH_RECORDS(" + ENOUGH_RECORDS + ")", - 0, + 0, ENOUGH_RECORDS % THREADS_COUNT); @@ -89,8 +89,8 @@ public class AppendOnlyLogOverMMappedFileTest { return true; }); assertEquals("Data written must be the data read back", - dataToWrite, - dataReadBackRef.get()); + dataToWrite, + dataReadBackRef.get()); } @Test @@ -282,6 +282,21 @@ public class AppendOnlyLogOverMMappedFileTest { //Special/edge cases, regressions: + + @Test + public void readingRecordWithNULL_ID_leadsToException() throws IOException { + assertThrows(IllegalArgumentException.class, () -> { + appendOnlyLog.read(0, buffer -> null); + }); + } + + @Test + public void readingRecordWithNegative_ID_leadsToException() throws IOException { + assertThrows(IllegalArgumentException.class, () -> { + appendOnlyLog.read(-1, buffer -> null); + }); + } + @Test public void singleEmptyRecordWritten_CouldBeReadBackAsIs() throws Exception { byte[] dataToWrite = new byte[0]; @@ -292,8 +307,8 @@ public class AppendOnlyLogOverMMappedFileTest { return bytes; }); assertArrayEquals("Data written must be the data read back", - dataToWrite, - dataReadBack); + dataToWrite, + dataReadBack); } @Test @@ -308,8 +323,8 @@ public class AppendOnlyLogOverMMappedFileTest { return true; }); assertArrayEquals("Data written must be the data read back", - dataToWrite, - dataReadBackRef.get()); + dataToWrite, + dataReadBackRef.get()); } @Test @@ -371,8 +386,8 @@ public class AppendOnlyLogOverMMappedFileTest { Object stringWritten = idToStringWritten.get(recordId); if (!stringReadBack.equals(stringWritten)) { assertEquals("[" + i + "]: data written[recordId: " + recordId + "] must be the data read back[recordId: " + recordId + "]", - stringWritten, - stringReadBack); + stringWritten, + stringReadBack); } i.inc(); @@ -386,8 +401,8 @@ public class AppendOnlyLogOverMMappedFileTest { long recordId = recordsIds[i]; String stringReadBack = appendOnlyLog.read(recordId, IOUtil::readString); assertEquals("[" + i + "]: data written must be the data read back", - stringsWritten[i], - stringReadBack); + stringsWritten[i], + stringReadBack); } } diff --git a/platform/util/storages/src/com/intellij/platform/util/io/storages/appendonlylog/AppendOnlyLogOverMMappedFile.java b/platform/util/storages/src/com/intellij/platform/util/io/storages/appendonlylog/AppendOnlyLogOverMMappedFile.java index 11ff57d0b396..09dae2cdea6a 100644 --- a/platform/util/storages/src/com/intellij/platform/util/io/storages/appendonlylog/AppendOnlyLogOverMMappedFile.java +++ b/platform/util/storages/src/com/intellij/platform/util/io/storages/appendonlylog/AppendOnlyLogOverMMappedFile.java @@ -1096,6 +1096,9 @@ public final class AppendOnlyLogOverMMappedFile implements AppendOnlyLog, Unmapp @VisibleForTesting static long recordIdToOffset(long recordId) { + if (recordId <= 0) { + throw new IllegalArgumentException("recordId(=" + recordId + ") is negative or NULL_ID -- can't be read"); + } long offset = recordIdToOffsetUnchecked(recordId); if (!AlignmentUtils.is32bAligned(offset)) { throw new IllegalArgumentException("recordId(=" + recordId + ") is invalid: recordOffsetInFile(=" + offset + ") is not 32b-aligned");