Class FakeExtractorInput
- java.lang.Object
-
- com.google.android.exoplayer2.testutil.FakeExtractorInput
-
- All Implemented Interfaces:
ExtractorInput
,DataReader
public final class FakeExtractorInput extends Object implements ExtractorInput
A fakeExtractorInput
capable of simulating various scenarios.Read, skip and peek errors can be simulated using
FakeExtractorInput.Builder.setSimulateIOErrors(boolean)
. When enabled each read and skip will throw aFakeExtractorInput.SimulatedIOException
unless one has already been thrown from the current position. Each peek will throwFakeExtractorInput.SimulatedIOException
unless one has already been thrown from the current peek position. When aFakeExtractorInput.SimulatedIOException
is thrown the read position is left unchanged and the peek position is reset back to the read position.Partial reads and skips can be simulated using
FakeExtractorInput.Builder.setSimulatePartialReads(boolean)
. When enabled,read(byte[], int, int)
andskip(int)
calls will only read or skip a single byte unless a partial read or skip has already been performed that had the same target position. For example, a first read request for 10 bytes will be partially satisfied by reading a single byte and advancing the position to 1. If the following read request attempts to read 9 bytes then it will be fully satisfied, since it has the same target position of 10.Unknown data length can be simulated using
FakeExtractorInput.Builder.setSimulateUnknownLength(boolean)
. When enabledgetLength()
will returnC.LENGTH_UNSET
rather than the length of the data.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
FakeExtractorInput.Builder
Builder ofFakeExtractorInput
instances.static class
FakeExtractorInput.SimulatedIOException
Thrown when simulating anIOException
.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
advancePeekPosition(int length)
Advances the peek position bylength
bytes.boolean
advancePeekPosition(int length, boolean allowEndOfInput)
Advances the peek position bylength
bytes.long
getLength()
Returns the length of the source stream, orC.LENGTH_UNSET
if it is unknown.long
getPeekPosition()
Returns the current peek position (byte offset) in the stream.long
getPosition()
Returns the current read position (byte offset) in the stream.int
peek(byte[] target, int offset, int length)
Peeks up tolength
bytes from the peek position.void
peekFully(byte[] target, int offset, int length)
Equivalent topeekFully(target, offset, length, false)
.boolean
peekFully(byte[] target, int offset, int length, boolean allowEndOfInput)
LikeExtractorInput.peek(byte[], int, int)
, but peeks the requestedlength
in full.int
read(byte[] buffer, int offset, int length)
Reads up tolength
bytes from the input and resets the peek position.void
readFully(byte[] target, int offset, int length)
Equivalent toreadFully(target, offset, length, false)
.boolean
readFully(byte[] target, int offset, int length, boolean allowEndOfInput)
LikeExtractorInput.read(byte[], int, int)
, but reads the requestedlength
in full.void
reset()
Resets the input to its initial state.void
resetPeekPosition()
Resets the peek position to equal the current read position.void
setPosition(int position)
Sets the read and peek positions.<E extends Throwable>
voidsetRetryPosition(long position, E e)
Called when reading fails and the required retry position is different from the last position.int
skip(int length)
LikeExtractorInput.read(byte[], int, int)
, except the data is skipped instead of read.void
skipFully(int length)
LikeExtractorInput.readFully(byte[], int, int)
, except the data is skipped instead of read.boolean
skipFully(int length, boolean allowEndOfInput)
LikeExtractorInput.readFully(byte[], int, int, boolean)
, except the data is skipped instead of read.
-
-
-
Method Detail
-
reset
public void reset()
Resets the input to its initial state.
-
setPosition
public void setPosition(int position)
Sets the read and peek positions.- Parameters:
position
- The position to set.
-
read
public int read(byte[] buffer, int offset, int length) throws IOException
Description copied from interface:ExtractorInput
Reads up tolength
bytes from the input and resets the peek position.This method blocks until at least one byte of data can be read, the end of the input is detected, or an exception is thrown.
- Specified by:
read
in interfaceDataReader
- Specified by:
read
in interfaceExtractorInput
- Parameters:
buffer
- A target array into which data should be written.offset
- The offset into the target array at which to write.length
- The maximum number of bytes to read from the input.- Returns:
- The number of bytes read, or
C.RESULT_END_OF_INPUT
if the input has ended. - Throws:
IOException
- If an error occurs reading from the input.
-
readFully
public boolean readFully(byte[] target, int offset, int length, boolean allowEndOfInput) throws IOException
Description copied from interface:ExtractorInput
LikeExtractorInput.read(byte[], int, int)
, but reads the requestedlength
in full.- Specified by:
readFully
in interfaceExtractorInput
- Parameters:
target
- A target array into which data should be written.offset
- The offset into the target array at which to write.length
- The number of bytes to read from the input.allowEndOfInput
- True if encountering the end of the input having read no data is allowed, and should result infalse
being returned. False if it should be considered an error, causing anEOFException
to be thrown. See note in class Javadoc.- Returns:
- True if the read was successful. False if
allowEndOfInput=true
and the end of the input was encountered having read no data. - Throws:
EOFException
- If the end of input was encountered having partially satisfied the read (i.e. having read at least one byte, but fewer thanlength
), or if no bytes were read andallowEndOfInput
is false.IOException
- If an error occurs reading from the input.
-
readFully
public void readFully(byte[] target, int offset, int length) throws IOException
Description copied from interface:ExtractorInput
Equivalent toreadFully(target, offset, length, false)
.- Specified by:
readFully
in interfaceExtractorInput
- Parameters:
target
- A target array into which data should be written.offset
- The offset into the target array at which to write.length
- The number of bytes to read from the input.- Throws:
EOFException
- If the end of input was encountered.IOException
- If an error occurs reading from the input.
-
skip
public int skip(int length) throws IOException
Description copied from interface:ExtractorInput
LikeExtractorInput.read(byte[], int, int)
, except the data is skipped instead of read.- Specified by:
skip
in interfaceExtractorInput
- Parameters:
length
- The maximum number of bytes to skip from the input.- Returns:
- The number of bytes skipped, or
C.RESULT_END_OF_INPUT
if the input has ended. - Throws:
IOException
- If an error occurs reading from the input.
-
skipFully
public boolean skipFully(int length, boolean allowEndOfInput) throws IOException
Description copied from interface:ExtractorInput
LikeExtractorInput.readFully(byte[], int, int, boolean)
, except the data is skipped instead of read.- Specified by:
skipFully
in interfaceExtractorInput
- Parameters:
length
- The number of bytes to skip from the input.allowEndOfInput
- True if encountering the end of the input having skipped no data is allowed, and should result infalse
being returned. False if it should be considered an error, causing anEOFException
to be thrown. See note in class Javadoc.- Returns:
- True if the skip was successful. False if
allowEndOfInput=true
and the end of the input was encountered having skipped no data. - Throws:
EOFException
- If the end of input was encountered having partially satisfied the skip (i.e. having skipped at least one byte, but fewer thanlength
), or if no bytes were skipped andallowEndOfInput
is false.IOException
- If an error occurs reading from the input.
-
skipFully
public void skipFully(int length) throws IOException
Description copied from interface:ExtractorInput
LikeExtractorInput.readFully(byte[], int, int)
, except the data is skipped instead of read.Encountering the end of input is always considered an error, and will result in an
EOFException
being thrown.- Specified by:
skipFully
in interfaceExtractorInput
- Parameters:
length
- The number of bytes to skip from the input.- Throws:
EOFException
- If the end of input was encountered.IOException
- If an error occurs reading from the input.
-
peek
public int peek(byte[] target, int offset, int length) throws IOException
Description copied from interface:ExtractorInput
Peeks up tolength
bytes from the peek position. The current read position is left unchanged.This method blocks until at least one byte of data can be peeked, the end of the input is detected, or an exception is thrown.
Calling
ExtractorInput.resetPeekPosition()
resets the peek position to equal the current read position, so the caller can peek the same data again. Reading or skipping also resets the peek position.- Specified by:
peek
in interfaceExtractorInput
- Parameters:
target
- A target array into which data should be written.offset
- The offset into the target array at which to write.length
- The maximum number of bytes to peek from the input.- Returns:
- The number of bytes peeked, or
C.RESULT_END_OF_INPUT
if the input has ended. - Throws:
IOException
- If an error occurs peeking from the input.
-
peekFully
public boolean peekFully(byte[] target, int offset, int length, boolean allowEndOfInput) throws IOException
Description copied from interface:ExtractorInput
LikeExtractorInput.peek(byte[], int, int)
, but peeks the requestedlength
in full.- Specified by:
peekFully
in interfaceExtractorInput
- Parameters:
target
- A target array into which data should be written.offset
- The offset into the target array at which to write.length
- The number of bytes to peek from the input.allowEndOfInput
- True if encountering the end of the input having peeked no data is allowed, and should result infalse
being returned. False if it should be considered an error, causing anEOFException
to be thrown. See note in class Javadoc.- Returns:
- True if the peek was successful. False if
allowEndOfInput=true
and the end of the input was encountered having peeked no data. - Throws:
EOFException
- If the end of input was encountered having partially satisfied the peek (i.e. having peeked at least one byte, but fewer thanlength
), or if no bytes were peeked andallowEndOfInput
is false.IOException
- If an error occurs peeking from the input.
-
peekFully
public void peekFully(byte[] target, int offset, int length) throws IOException
Description copied from interface:ExtractorInput
Equivalent topeekFully(target, offset, length, false)
.- Specified by:
peekFully
in interfaceExtractorInput
- Parameters:
target
- A target array into which data should be written.offset
- The offset into the target array at which to write.length
- The number of bytes to peek from the input.- Throws:
EOFException
- If the end of input was encountered.IOException
- If an error occurs peeking from the input.
-
advancePeekPosition
public boolean advancePeekPosition(int length, boolean allowEndOfInput) throws IOException
Description copied from interface:ExtractorInput
Advances the peek position bylength
bytes. LikeExtractorInput.peekFully(byte[], int, int, boolean)
except the data is skipped instead of read.- Specified by:
advancePeekPosition
in interfaceExtractorInput
- Parameters:
length
- The number of bytes by which to advance the peek position.allowEndOfInput
- True if encountering the end of the input before advancing is allowed, and should result infalse
being returned. False if it should be considered an error, causing anEOFException
to be thrown. See note in class Javadoc.- Returns:
- True if advancing the peek position was successful. False if
allowEndOfInput=true
and the end of the input was encountered before advancing over any data. - Throws:
EOFException
- If the end of input was encountered having partially advanced (i.e. having advanced by at least one byte, but fewer thanlength
), or if the end of input was encountered before advancing andallowEndOfInput
is false.IOException
- If an error occurs advancing the peek position.
-
advancePeekPosition
public void advancePeekPosition(int length) throws IOException
Description copied from interface:ExtractorInput
Advances the peek position bylength
bytes. LikeExtractorInput.peekFully(byte[], int, int)
except the data is skipped instead of read.- Specified by:
advancePeekPosition
in interfaceExtractorInput
- Parameters:
length
- The number of bytes to peek from the input.- Throws:
EOFException
- If the end of input was encountered.IOException
- If an error occurs peeking from the input.
-
resetPeekPosition
public void resetPeekPosition()
Description copied from interface:ExtractorInput
Resets the peek position to equal the current read position.- Specified by:
resetPeekPosition
in interfaceExtractorInput
-
getPeekPosition
public long getPeekPosition()
Description copied from interface:ExtractorInput
Returns the current peek position (byte offset) in the stream.- Specified by:
getPeekPosition
in interfaceExtractorInput
- Returns:
- The peek position (byte offset) in the stream.
-
getPosition
public long getPosition()
Description copied from interface:ExtractorInput
Returns the current read position (byte offset) in the stream.- Specified by:
getPosition
in interfaceExtractorInput
- Returns:
- The read position (byte offset) in the stream.
-
getLength
public long getLength()
Description copied from interface:ExtractorInput
Returns the length of the source stream, orC.LENGTH_UNSET
if it is unknown.- Specified by:
getLength
in interfaceExtractorInput
- Returns:
- The length of the source stream, or
C.LENGTH_UNSET
.
-
setRetryPosition
public <E extends Throwable> void setRetryPosition(long position, E e) throws E extends Throwable
Description copied from interface:ExtractorInput
Called when reading fails and the required retry position is different from the last position. After setting the retry position it throws the givenThrowable
.- Specified by:
setRetryPosition
in interfaceExtractorInput
- Type Parameters:
E
- Type ofThrowable
to be thrown.- Parameters:
position
- The required retry position.e
-Throwable
to be thrown.- Throws:
E
- The givenThrowable
object.E extends Throwable
-
-