Restarting event reader after reaching the end of stream

This should'n happen, but happens. The best we can do is to re-run the
logcat command.

Change-Id: I471d9f0188243c81585b75f81dd03450c1f7ad9b
This commit is contained in:
vadimt
2020-05-06 11:58:51 -07:00
parent e93d6d615c
commit 3e089e8a26
@@ -85,18 +85,27 @@ public class LogEventChecker {
}
private void onRun() {
while (true) readEvents();
}
private void readEvents() {
try {
// Note that we use Runtime.exec to start the log reading process instead of running
// it via UIAutomation, so that we can directly access the "Process" object and
// ensure that the instrumentation is not stuck forever.
final String cmd = "logcat -s " + TestProtocol.TAPL_EVENTS_TAG;
final Process logcatProcess = Runtime.getRuntime().exec(cmd);
try (BufferedReader reader = new BufferedReader(new InputStreamReader(
Runtime.getRuntime().exec(cmd).getInputStream()))) {
for (; ; ) {
logcatProcess.getInputStream()))) {
while (true) {
// Skip everything before the next start command.
for (; ; ) {
final String event = reader.readLine();
if (event == null) {
Log.d(SKIP_EVENTS_TAG, "Read a null line while waiting for start");
return;
}
if (event.contains(mStartCommand)) {
Log.d(SKIP_EVENTS_TAG, "Read start: " + event);
break;
@@ -106,6 +115,12 @@ public class LogEventChecker {
// Store all actual events until the finish command.
for (; ; ) {
final String event = reader.readLine();
if (event == null) {
Log.d(SKIP_EVENTS_TAG, "Read a null line after waiting for start");
mEventsCounter.drainPermits();
mEvents.clear();
return;
}
if (event.contains(mFinishCommand)) {
mFinished.countDown();
Log.d(SKIP_EVENTS_TAG, "Read finish: " + event);
@@ -122,6 +137,8 @@ public class LogEventChecker {
}
}
}
} finally {
logcatProcess.destroyForcibly();
}
} catch (IOException e) {
throw new RuntimeException(e);