All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.squareup.spoon.SpoonDeviceLogger Maven / Gradle / Ivy

There is a newer version: 1.7.1
Show newest version
package com.squareup.spoon;

import com.android.ddmlib.IDevice;
import com.android.ddmlib.logcat.LogCatListener;
import com.android.ddmlib.logcat.LogCatMessage;
import com.android.ddmlib.logcat.LogCatReceiverTask;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

final class SpoonDeviceLogger implements LogCatListener {
  private static final String TEST_RUNNER = "TestRunner";
  private static final Pattern MESSAGE_START = Pattern.compile("started: ([^(]+)\\(([^)]+)\\)");
  private static final Pattern MESSAGE_END = Pattern.compile("finished: [^(]+\\([^)]+\\)");

  private final List messages;
  private final LogCatReceiverTask logCatReceiverTask;

  public SpoonDeviceLogger(IDevice device) {
    messages = new ArrayList();
    logCatReceiverTask = new LogCatReceiverTask(device);
    logCatReceiverTask.addLogCatListener(this);

    // Start a background thread to monitor the device logs. This will exit when we call stop below.
    new Thread(logCatReceiverTask).start();
  }

  @Override public void log(List msgList) {
    synchronized (messages) {
      messages.addAll(msgList);
    }
  }

  public Map> getParsedLogs() {
    logCatReceiverTask.stop();

    Map> logs = new HashMap>();
    DeviceTest current = null;
    int pid = -1;
    synchronized (messages) {
      for (LogCatMessage message : messages) {
        if (current == null) {
          Matcher match = MESSAGE_START.matcher(message.getMessage());
          if (match.matches() && TEST_RUNNER.equals(message.getTag())) {
            current = new DeviceTest(match.group(2), match.group(1));
            pid = message.getPid();

            List deviceLogMessages = new ArrayList();
            deviceLogMessages.add(message);
            logs.put(current, deviceLogMessages);
          }
        } else {
          // Only log messages from the same PID.
          if (pid == message.getPid()) {
            logs.get(current).add(message);
          }

          Matcher match = MESSAGE_END.matcher(message.getMessage());
          if (match.matches() && TEST_RUNNER.equals(message.getTag())) {
            current = null;
            pid = -1;
          }
        }
      }
    }
    return logs;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy