package vogar;
-import vogar.target.Runner;
-
import java.io.File;
+import vogar.target.Runner;
/**
* A named job such as a test or benchmark run. This class tracks the resource
package vogar;
-import vogar.commands.Aapt;
-import vogar.commands.Command;
-import vogar.commands.Dx;
-import vogar.commands.Mkdir;
-import vogar.commands.Rm;
-
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.logging.Logger;
+import vogar.commands.Aapt;
+import vogar.commands.Command;
+import vogar.commands.Dx;
+import vogar.commands.Mkdir;
+import vogar.commands.Rm;
/**
* Runs an action in the context of an android.app.Activity on a device
package vogar;
+import java.io.File;
import vogar.target.CaliperRunner;
import vogar.target.Runner;
-import java.io.File;
-
/**
* Create {@link Action}s for {@code .java} files with Caliper benchmarks in
* them.
package vogar;
-import vogar.target.Runner;
-
import java.io.File;
import java.util.Set;
+import vogar.target.Runner;
/**
* A strategy for finding runnable things in a directory.
}
/**
- * Formats an alternating sequence of regular log messages and messages
- * streamed from a foreign process.
+ * Formats a sequence of regular log messages with the output streamed from
+ * a foreign process.
*/
private String logRecordToString(LogRecord logRecord) {
String message = logRecord.getMessage();
package vogar;
-import vogar.commands.Dx;
-
import java.io.File;
import java.util.List;
import java.util.logging.Logger;
+import vogar.commands.Dx;
/**
* Execute actions on a Dalvik VM using an Android device or emulator.
package vogar;
-import vogar.commands.Command;
-import vogar.commands.Mkdir;
-
import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Logger;
+import vogar.commands.Command;
+import vogar.commands.Mkdir;
/**
* Compiles, installs, runs and reports on actions.
package vogar;
-import vogar.commands.Rm;
-
import java.io.File;
import java.util.logging.Logger;
+import vogar.commands.Rm;
/**
* A target runtime environment such as a remote device or the local host
package vogar;
-import vogar.commands.Adb;
-
import java.io.File;
+import vogar.commands.Adb;
class EnvironmentDevice extends Environment {
final Adb adb = new Adb();
package vogar;
+import java.io.File;
import vogar.commands.Command;
import vogar.commands.Mkdir;
-import java.io.File;
-
class EnvironmentHost extends Environment {
EnvironmentHost(boolean cleanBefore, boolean cleanAfter,
package vogar;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.net.ConnectException;
import java.net.Socket;
-import java.util.Arrays;
import java.util.Collections;
import java.util.logging.Level;
import java.util.logging.Logger;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
/**
* Connects to a target process to monitor its action.
public boolean monitor(int port, Handler handler) {
Socket socket;
InputStream in;
- try {
- int attempt = 0;
- do {
+ int attempt = 0;
+ do {
+ try {
socket = new Socket("localhost", port);
in = new BufferedInputStream(socket.getInputStream());
if (checkStream(in)) {
- logger.fine("action monitor connected to " + socket.getRemoteSocketAddress());
break;
}
-
- if (attempt++ == MAX_CONNECT_ATTEMPTS) {
- throw new IOException("Exceeded max connection attempts!");
- }
- logger.fine("connection " + attempt + " to localhost:" + port + " is dead; retrying...");
in.close();
socket.close();
- try {
- Thread.sleep(CONNECTION_ATTEMPT_DELAY_MILLIS);
- } catch (InterruptedException e) {
- }
- } while (true);
- } catch (IOException e) {
- logger.log(Level.WARNING, "Failed to connect to localhost:" + port, e);
- return false;
- }
+ } catch (ConnectException recoverable) {
+ } catch (IOException e) {
+ logger.log(Level.WARNING, "Failed to connect to localhost:" + port, e);
+ return false;
+ }
+
+ if (attempt++ == MAX_CONNECT_ATTEMPTS) {
+ logger.warning("Exceeded " + MAX_CONNECT_ATTEMPTS
+ + " attempts to connect to localhost:" + port);
+ return false;
+ }
+
+ logger.fine("connection " + attempt + " to localhost:" + port
+ + " failed; retrying in " + CONNECTION_ATTEMPT_DELAY_MILLIS + "ms");
+ try {
+ Thread.sleep(CONNECTION_ATTEMPT_DELAY_MILLIS);
+ } catch (InterruptedException e) {
+ }
+ } while (true);
+
+ logger.fine("action monitor connected to " + socket.getRemoteSocketAddress());
try {
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
* Our XML wire format looks like this:
*
* <?xml version='1.0' encoding='UTF-8' ?>
- * <vogar>
+ * <vogar-monitor>
* <outcome name="java.util.FormatterTest" action="java.util.FormatterTest">
* test output
* more test output
* <result value="SUCCESS" />
* </outcome>
- * </vogar>
+ * </vogar-monitor>
*/
@Override public void startElement(String uri, String localName,
currentResult = Result.valueOf(attributes.getValue("value"));
return;
- } else if (!qName.equals("vogar")) {
+ } else if (!qName.equals("vogar-monitor")) {
throw new IllegalArgumentException("Unrecognized: " + qName);
}
}
package vogar;
+import java.io.File;
import vogar.target.JUnitRunner;
import vogar.target.Runner;
-import java.io.File;
-
/**
* Create {@link Action}s for {@code .java} files with JUnit tests in them.
*/
package vogar;
-import vogar.commands.Command;
-
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
+import vogar.commands.Command;
/**
* A javac command.
import com.sun.javatest.TestSuite;
import com.sun.javatest.WorkDirectory;
import com.sun.javatest.regtest.RegressionTestSuite;
-import vogar.commands.Mkdir;
-import vogar.target.JtregRunner;
-import vogar.target.Runner;
-
import java.io.File;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.logging.Logger;
+import vogar.commands.Mkdir;
+import vogar.target.JtregRunner;
+import vogar.target.Runner;
/**
* Create {@link Action}s for {@code .java} files with jtreg tests in them.
package vogar;
+import java.io.File;
import vogar.target.MainRunner;
import vogar.target.Runner;
-import java.io.File;
-
/**
* Create {@link Action}s for {@code .java} files with main methods in them.
*/
package vogar;
-import vogar.commands.Command;
-import vogar.commands.Mkdir;
-
import java.io.File;
import java.io.FileInputStream;
import java.security.MessageDigest;
import java.util.logging.Logger;
+import vogar.commands.Command;
+import vogar.commands.Mkdir;
/**
* Caches content by MD5.
package vogar;
-import vogar.commands.Command;
-import vogar.commands.CommandFailedException;
-import vogar.commands.Mkdir;
-
import java.io.File;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.util.Set;
import java.util.logging.Logger;
import java.util.regex.Pattern;
+import vogar.commands.Command;
+import vogar.commands.CommandFailedException;
+import vogar.commands.Mkdir;
/**
* A Mode for running actions. Examples including running in a virtual machine
// TODO: we should be able to work with a shipping SDK, not depend on out/...
// dalvik/libcore/**/test/ for junit
// TODO: jar up just the junit classes and drop the jar in our lib/ directory.
+ new File("out/host/common/obj/JAVA_LIBRARIES/kxml2-2.3.0_intermediates/javalib.jar").getAbsoluteFile(),
new File("out/target/common/obj/JAVA_LIBRARIES/core-tests-luni_intermediates/classes.jar").getAbsoluteFile());
Mode(Environment environment, File sdkJar, List<String> javacArgs, int monitorPort) {
package vogar;
-import vogar.commands.Command;
-import vogar.target.TestRunner;
-
import java.io.File;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import vogar.commands.Command;
+import vogar.target.TestRunner;
/**
* A Java-like virtual machine for compiling and running tests.
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
-import java.util.Random;
import java.util.Set;
import java.util.UUID;
Console console = new Console(options.stream, options.indent, options.color);
console.configureJavaLogging(options.verbose);
- int monitorPort = 8787;
+ int monitorPort;
Mode mode;
if (options.mode.equals(Options.MODE_DEVICE)) {
+ monitorPort = 8787;
mode = new DeviceDalvikVm(
options.debugPort,
options.sdkJar,
options.cleanAfter,
options.deviceRunnerDir);
} else if (options.mode.equals(Options.MODE_HOST)) {
+ monitorPort = 8788;
mode = new JavaVm(
options.debugPort,
options.sdkJar,
options.cleanAfter
);
} else if (options.mode.equals(Options.MODE_ACTIVITY)) {
+ monitorPort = 8787;
mode = new ActivityMode(
options.debugPort,
options.sdkJar,
package vogar;
-import org.kxml2.io.KXmlSerializer;
-
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
+import org.kxml2.io.KXmlSerializer;
/**
package vogar.commands;
-import vogar.Strings;
-import vogar.Threads;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.logging.Logger;
+import vogar.Strings;
+import vogar.Threads;
/**
* An out of process executable.
package vogar.commands;
+import java.io.File;
+import java.util.logging.Logger;
import vogar.Classpath;
import vogar.Md5Cache;
import vogar.Strings;
-import java.io.File;
-import java.util.logging.Logger;
-
/**
* A dx command.
*/
package vogar.target;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import junit.framework.AssertionFailedError;
import junit.framework.Test;
import junit.framework.TestResult;
import junit.textui.ResultPrinter;
import vogar.Result;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
/**
* Adapts a JUnit test for use by vogar.
*/
package vogar.target;
-import vogar.Result;
-
import java.lang.reflect.Method;
+import vogar.Result;
/**
* Runs a jtreg test.
package vogar.target;
-import vogar.Result;
-
import java.lang.reflect.Method;
+import vogar.Result;
/**
* Runs a Java class with a main method.
package vogar.target;
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import vogar.Result;
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-
/**
* Accepts a connection for a host process to monitor this action.
*/
serializer = XmlPullParserFactory.newInstance().newSerializer();
serializer.setOutput(socket.getOutputStream(), "UTF-8");
serializer.startDocument("UTF-8", null);
- serializer.startTag(ns, "vogar");
+ serializer.startTag(ns, "vogar-monitor");
} catch (IOException e) {
throw new RuntimeException("Failed to accept a monitor on localhost:" + port, e);
} catch (XmlPullParserException e) {
public void close() {
try {
- serializer.endTag(ns, "vogar");
+ serializer.endTag(ns, "vogar-monitor");
serializer.endDocument();
socket.close();
serverSocket.close();
package vogar.target;
-import vogar.TestProperties;
-
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Properties;
+import vogar.TestProperties;
/**
* Runs an action, in process on the target.