diff --git a/README.md b/README.md index 60d53dd..eb5bc63 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![Travis build status](https://travis-ci.org/bernardladenthin/streambuffer.svg)](https://travis-ci.org/bernardladenthin/streambuffer) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.ladenthin/streambuffer/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.ladenthin/streambuffer) -[![Coverage Status](https://coveralls.io/repos/bernardladenthin/streambuffer/badge.svg)](https://coveralls.io/r/bernardladenthin/streambuffer) +[![Coverage Status](https://coveralls.io/repos/github/bernardladenthin/streambuffer/badge.svg)](https://coveralls.io/github/bernardladenthin/streambuffer) [![Codecov](https://codecov.io/github/bernardladenthin/streambuffer/coverage.png)](https://codecov.io/gh/bernardladenthin/streambuffer) [![Coverity Scan Build Status](https://scan.coverity.com/projects/5453/badge.svg)](https://scan.coverity.com/projects/5453) [![Known Vulnerabilities](https://snyk.io/test/github/bernardladenthin/streambuffer/badge.svg?targetFile=pom.xml)](https://snyk.io/test/github/bernardladenthin/streambuffer?targetFile=pom.xml) diff --git a/src/test/java/net/ladenthin/streambuffer/StreamBufferTest.java b/src/test/java/net/ladenthin/streambuffer/StreamBufferTest.java index 48e58b3..b3db5e0 100644 --- a/src/test/java/net/ladenthin/streambuffer/StreamBufferTest.java +++ b/src/test/java/net/ladenthin/streambuffer/StreamBufferTest.java @@ -2188,4 +2188,51 @@ public void available_afterPartialReadFromSingleEntry_returnsRemainingCount() th assertThat(sb.getInputStream().available(), is(5)); } // + + // + + // Extracts the OLD capping formula from the guarded if-block (pre-cb66b68) + private static int capMissingBytesOld(long maximumAvailableBytes, int missingBytes) { + if (maximumAvailableBytes < missingBytes) { + return (int) Math.min(maximumAvailableBytes, Integer.MAX_VALUE); + } + return missingBytes; + } + + // Extracts the NEW capping formula (unconditional Math.min, post-cb66b68) + private static int capMissingBytesNew(long maximumAvailableBytes, int missingBytes) { + return (int) Math.min(maximumAvailableBytes, (long) missingBytes); + } + + @DataProvider + public static Object[][] capMissingBytesInputs() { + return new Object[][] { + // Case A: maxAvail < missingBytes (old if-branch fires, new Math.min picks maxAvail) + { 1L, 5 }, // trivially small + { 3L, 5 }, // standard small case + { (long) Integer.MAX_VALUE - 1, Integer.MAX_VALUE }, // one below INT_MAX + + // Case B: maxAvail == missingBytes (boundary: old skips if, new Math.min picks either) + { 5L, 5 }, // small equality + { (long) Integer.MAX_VALUE, Integer.MAX_VALUE }, // equality at INT_MAX + + // Case C: maxAvail > missingBytes (old skips if, new Math.min picks missingBytes) + { 9L, 3 }, // standard: more available than needed + { (long) Integer.MAX_VALUE + 1L, Integer.MAX_VALUE }, // maxAvail just above INT_MAX + { (long) Integer.MAX_VALUE + 1L, 5 }, // maxAvail > INT_MAX, small missing + { 3_000_000_000L, 100 }, // large long, small int + { Long.MAX_VALUE, 1 }, // extreme: largest possible long + }; + } + + @Test + @UseDataProvider("capMissingBytesInputs") + public void capMissingBytes_oldAndNewFormula_returnSameResult( + long maximumAvailableBytes, int missingBytes) { + int oldResult = capMissingBytesOld(maximumAvailableBytes, missingBytes); + int newResult = capMissingBytesNew(maximumAvailableBytes, missingBytes); + assertThat(newResult, is(oldResult)); + } + + // }