ByteRangeInputStream extends FSInputStream { @Override public synchronized int available() throws IOException{ getInputStream(); if(fileLength != null){ long remaining = fileLength - currentPos; return remaining <= Integer.MAX_VALUE ? (int) remaining : Integer.MAX_VALUE; }else { return Integer.MAX_VALUE; } } ByteRangeInputStream(URLOpener o, URLOpener r); @Override int read(); @Override int read(@Nonnull byte b[], int off, int len); @Override void seek(long pos); @Override int read(long position, byte[] buffer, int offset, int length); @Override void readFully(long position, byte[] buffer, int offset, int length); @Override long getPos(); @Override boolean seekToNewSource(long targetPos); @Override void close(); @Override synchronized int available();  }
@Test public void testAvailable() throws IOException { ByteRangeInputStream bris = mock(ByteRangeInputStream.class, CALLS_REAL_METHODS); InputStreamAndFileLength mockStream = new InputStreamAndFileLength(65535L, mock(InputStream.class)); doReturn(mockStream).when(bris).openInputStream(Mockito.anyLong()); Whitebox.setInternalState(bris, "status", ByteRangeInputStream.StreamStatus.SEEK); assertEquals("Before read or seek, available should be same as filelength", 65535, bris.available()); verify(bris, times(1)).openInputStream(Mockito.anyLong()); bris.seek(10); assertEquals("Seek 10 bytes, available should return filelength - 10" , 65525, bris.available()); bris.seek(65535); assertEquals("Seek till end of file, available should return 0 bytes", 0, bris.available()); bris.seek(0); bris.read(); assertEquals("Read 1 byte, available must return filelength - 1", 65534, bris.available()); bris.read(); assertEquals("Read another 1 byte, available must return filelength - 2", 65533, bris.available()); bris.seek(100); bris.read(); assertEquals("Seek to offset 100 and read 1 byte, available should return filelength - 101", 65434, bris.available()); bris.close(); }