Commit 1c8f14b5 by eguven Committed by Oliver Woodman

Add support to run actions into FakeDataSource

An actions is triggered when the reading reaches action's position. This can be
used to make sure the code is in a certain state while testing.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=159545923
parent ce863450
...@@ -49,6 +49,10 @@ import java.util.HashMap; ...@@ -49,6 +49,10 @@ import java.util.HashMap;
* until the source is closed. If the source is closed and re-opened having encountered an error, * until the source is closed. If the source is closed and re-opened having encountered an error,
* that error will not be thrown again. * that error will not be thrown again.
* *
* <p>Actions are inserted by calling {@link FakeData#appendReadAction(Runnable)}. An actions is
* triggered when the reading reaches action's position. This can be used to make sure the code is
* in a certain state while testing.
*
* <p>Example usage: * <p>Example usage:
* *
* <pre> * <pre>
...@@ -165,6 +169,9 @@ public final class FakeDataSource implements DataSource { ...@@ -165,6 +169,9 @@ public final class FakeDataSource implements DataSource {
} else { } else {
currentSegmentIndex++; currentSegmentIndex++;
} }
} else if (current.isActionSegment()) {
currentSegmentIndex++;
current.action.run();
} else { } else {
// Read at most bytesRemaining. // Read at most bytesRemaining.
readLength = (int) Math.min(readLength, bytesRemaining); readLength = (int) Math.min(readLength, bytesRemaining);
...@@ -217,21 +224,41 @@ public final class FakeDataSource implements DataSource { ...@@ -217,21 +224,41 @@ public final class FakeDataSource implements DataSource {
public final IOException exception; public final IOException exception;
public final byte[] data; public final byte[] data;
public final int length; public final int length;
public final Runnable action;
private boolean exceptionThrown; private boolean exceptionThrown;
private boolean exceptionCleared; private boolean exceptionCleared;
private int bytesRead; private int bytesRead;
public Segment(byte[] data, IOException exception) { public Segment(byte[] data) {
this.data = data; this.data = data;
this.length = data.length;
this.exception = null;
this.action = null;
}
public Segment(IOException exception) {
this.data = null;
this.length = 0;
this.exception = exception; this.exception = exception;
length = data != null ? data.length : 0; this.action = null;
}
public Segment(Runnable action) {
this.data = null;
this.length = 0;
this.exception = null;
this.action = action;
} }
public boolean isErrorSegment() { public boolean isErrorSegment() {
return exception != null; return exception != null;
} }
public boolean isActionSegment() {
return action != null;
}
} }
/** Container of fake data to be served by a {@link FakeDataSource}. */ /** Container of fake data to be served by a {@link FakeDataSource}. */
...@@ -270,7 +297,7 @@ public final class FakeDataSource implements DataSource { ...@@ -270,7 +297,7 @@ public final class FakeDataSource implements DataSource {
*/ */
public FakeData appendReadData(byte[] data) { public FakeData appendReadData(byte[] data) {
Assertions.checkState(data != null && data.length > 0); Assertions.checkState(data != null && data.length > 0);
segments.add(new Segment(data, null)); segments.add(new Segment(data));
return this; return this;
} }
...@@ -278,7 +305,15 @@ public final class FakeDataSource implements DataSource { ...@@ -278,7 +305,15 @@ public final class FakeDataSource implements DataSource {
* Appends an error in the underlying data. * Appends an error in the underlying data.
*/ */
public FakeData appendReadError(IOException exception) { public FakeData appendReadError(IOException exception) {
segments.add(new Segment(null, exception)); segments.add(new Segment(exception));
return this;
}
/**
* Appends an action.
*/
public FakeData appendReadAction(Runnable action) {
segments.add(new Segment(action));
return this; return this;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment