@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;
    }
  }
@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());

    //no more bytes available
    bris.seek(65535);
    assertEquals("Seek till end of file, available should return 0 bytes", 0,
            bris.available());

    //test reads, seek back to 0 and start reading
    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());

    //seek and read
    bris.seek(100);
    bris.read();
    assertEquals("Seek to offset 100 and read 1 byte, available should return filelength - 101",
            65434, bris.available());
    bris.close();
  }