summaryrefslogtreecommitdiffstats
path: root/tests/DumpRenderTree2/src
diff options
context:
space:
mode:
Diffstat (limited to 'tests/DumpRenderTree2/src')
-rw-r--r--tests/DumpRenderTree2/src/com/android/dumprendertree2/FileFilter.java40
-rw-r--r--tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java166
-rw-r--r--tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java6
-rw-r--r--tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java14
-rw-r--r--tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java39
-rw-r--r--tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListPreloaderThread.java10
-rw-r--r--tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/AdbUtils.java67
-rw-r--r--tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ConnectionHandler.java72
-rw-r--r--tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/Forwarder.java12
-rw-r--r--tests/DumpRenderTree2/src/com/android/dumprendertree2/ui/DirListActivity.java14
10 files changed, 224 insertions, 216 deletions
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FileFilter.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/FileFilter.java
index 4ab76e3..9bbf64a 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FileFilter.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/FileFilter.java
@@ -56,12 +56,7 @@ public class FileFilter {
private final Set<String> mFailList = new HashSet<String>();
private final Set<String> mSlowList = new HashSet<String>();
- private final String mRootDirPath;
-
- public FileFilter(String rootDirPath) {
- /** It may or may not contain a trailing slash */
- this.mRootDirPath = rootDirPath;
-
+ public FileFilter() {
loadTestExpectations();
}
@@ -287,37 +282,6 @@ public class FileFilter {
}
/**
- * Return the path to the file relative to the tests root dir
- *
- * @param filePath
- * @return
- * the path relative to the tests root dir
- */
- public String getRelativePath(String filePath) {
- File rootDir = new File(mRootDirPath);
- return filePath.replaceFirst(rootDir.getPath() + File.separator, "");
- }
-
- /**
- * Return the path to the file relative to the tests root dir
- *
- * @param filePath
- * @return
- * the path relative to the tests root dir
- */
- public String getRelativePath(File file) {
- return getRelativePath(file.getAbsolutePath());
- }
-
- public File getAbsoluteFile(String relativePath) {
- return new File(mRootDirPath, relativePath);
- }
-
- public String getAboslutePath(String relativePath) {
- return getAbsoluteFile(relativePath).getAbsolutePath();
- }
-
- /**
* If the path contains extension (e.g .foo at the end of the file) then it changes
* this (.foo) into newEnding (so it has to contain the dot if we want to preserve it).
*
@@ -336,4 +300,4 @@ public class FileFilter {
return relativePath.substring(0, dotPos) + newEnding;
}
-} \ No newline at end of file
+}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java
index 4202668..4438811 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java
@@ -20,19 +20,35 @@ import android.util.Log;
import com.android.dumprendertree2.forwarder.ForwarderManager;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.conn.scheme.PlainSocketFactory;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.params.HttpParams;
+import org.apache.http.util.EntityUtils;
+
import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.MalformedURLException;
+import java.net.SocketTimeoutException;
import java.net.URL;
-import java.net.URLConnection;
import java.util.LinkedList;
import java.util.List;
@@ -45,6 +61,29 @@ public class FsUtils {
private static final String SCRIPT_URL = ForwarderManager.getHostSchemePort(false) +
"WebKitTools/DumpRenderTree/android/get_layout_tests_dir_contents.php";
+ private static final int HTTP_TIMEOUT_MS = 5000;
+
+ private static HttpClient sHttpClient;
+
+ private static HttpClient getHttpClient() {
+ if (sHttpClient == null) {
+ HttpParams params = new BasicHttpParams();
+
+ SchemeRegistry schemeRegistry = new SchemeRegistry();
+ schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(),
+ ForwarderManager.HTTP_PORT));
+ schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(),
+ ForwarderManager.HTTPS_PORT));
+
+ ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params,
+ schemeRegistry);
+ sHttpClient = new DefaultHttpClient(connectionManager, params);
+ HttpConnectionParams.setSoTimeout(sHttpClient.getParams(), HTTP_TIMEOUT_MS);
+ HttpConnectionParams.setConnectionTimeout(sHttpClient.getParams(), HTTP_TIMEOUT_MS);
+ }
+ return sHttpClient;
+ }
+
public static void writeDataToStorage(File file, byte[] bytes, boolean append) {
Log.d(LOG_TAG, "writeDataToStorage(): " + file.getAbsolutePath());
try {
@@ -98,32 +137,34 @@ public class FsUtils {
return null;
}
- byte[] bytes = null;
- try {
- InputStream inputStream = null;
- ByteArrayOutputStream outputStream = null;
- try {
- URLConnection urlConnection = url.openConnection();
- inputStream = urlConnection.getInputStream();
- outputStream = new ByteArrayOutputStream();
-
- byte[] buffer = new byte[4096];
- int length;
- while ((length = inputStream.read(buffer)) > 0) {
- outputStream.write(buffer, 0, length);
+ HttpGet httpRequest = new HttpGet(url.toString());
+ ResponseHandler<byte[]> handler = new ResponseHandler<byte[]>() {
+ @Override
+ public byte[] handleResponse(HttpResponse response) throws IOException {
+ if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
+ return null;
}
+ HttpEntity entity = response.getEntity();
+ return (entity == null ? null : EntityUtils.toByteArray(entity));
+ }
+ };
- bytes = outputStream.toByteArray();
- } finally {
- if (inputStream != null) {
- inputStream.close();
- }
- if (outputStream != null) {
- outputStream.close();
+ byte[] bytes = null;
+ try {
+ /**
+ * TODO: Not exactly sure why some requests hang indefinitely, but adding this
+ * timeout (in static getter for http client) in loop helps.
+ */
+ boolean timedOut;
+ do {
+ timedOut = false;
+ try {
+ bytes = getHttpClient().execute(httpRequest, handler);
+ } catch (SocketTimeoutException e) {
+ timedOut = true;
+ Log.w(LOG_TAG, "Expected SocketTimeoutException: " + url, e);
}
- }
- } catch (FileNotFoundException e) {
- Log.w(LOG_TAG, "readDataFromUrl(): File not found: " + e.getMessage());
+ } while (timedOut);
} catch (IOException e) {
Log.e(LOG_TAG, "url=" + url, e);
}
@@ -135,8 +176,6 @@ public class FsUtils {
boolean mode) {
String modeString = (mode ? "folders" : "files");
- List<String> results = new LinkedList<String>();
-
URL url = null;
try {
url = new URL(SCRIPT_URL +
@@ -146,34 +185,67 @@ public class FsUtils {
} catch (MalformedURLException e) {
Log.e(LOG_TAG, "path=" + dirRelativePath + " recurse=" + recurse + " mode=" +
modeString, e);
- return results;
+ return new LinkedList<String>();
}
- try {
- InputStream inputStream = null;
- BufferedReader bufferedReader = null;
- try {
- URLConnection urlConnection = url.openConnection();
- inputStream = urlConnection.getInputStream();
- bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+ HttpGet httpRequest = new HttpGet(url.toString());
+ ResponseHandler<LinkedList<String>> handler = new ResponseHandler<LinkedList<String>>() {
+ @Override
+ public LinkedList<String> handleResponse(HttpResponse response)
+ throws IOException {
+ LinkedList<String> lines = new LinkedList<String>();
- String relativePath;
- while ((relativePath = bufferedReader.readLine()) != null) {
- results.add(relativePath);
+ if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
+ return lines;
}
- } finally {
- if (inputStream != null) {
- inputStream.close();
+ HttpEntity entity = response.getEntity();
+ if (entity == null) {
+ return lines;
}
- if (bufferedReader != null) {
- bufferedReader.close();
+
+ BufferedReader reader =
+ new BufferedReader(new InputStreamReader(entity.getContent()));
+ String line;
+ try {
+ while ((line = reader.readLine()) != null) {
+ lines.add(line);
+ }
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
}
+
+ return lines;
}
+ };
+
+ try {
+ return getHttpClient().execute(httpRequest, handler);
} catch (IOException e) {
- Log.e(LOG_TAG, "path=" + dirRelativePath + " recurse=" + recurse + " mode=" +
- modeString, e);
+ Log.e(LOG_TAG, "url=" + url, e);
}
- return results;
+ return new LinkedList<String>();
+ }
+
+ public static void closeInputStream(InputStream inputStream) {
+ try {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ } catch (IOException e) {
+ Log.e(LOG_TAG, "Couldn't close stream!", e);
+ }
+ }
+
+ public static void closeOutputStream(OutputStream outputStream) {
+ try {
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ } catch (IOException e) {
+ Log.e(LOG_TAG, "Couldn't close stream!", e);
+ }
}
} \ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java
index 0bd2302..93bb6a0 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java
@@ -73,12 +73,6 @@ public class LayoutTestsExecutor extends Activity {
}
}
- /** TODO: make it a setting */
- static final String TESTS_ROOT_DIR_PATH =
- Environment.getExternalStorageDirectory() +
- File.separator + "android" +
- File.separator + "LayoutTests";
-
private static final String LOG_TAG = "LayoutTestExecutor";
public static final String EXTRA_TESTS_LIST = "TestsList";
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java
index d9da672..9caabdb 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java
@@ -43,16 +43,8 @@ public class ManagerService extends Service {
private static final int CRASH_TIMEOUT_MS = 20 * 1000;
/** TODO: make it a setting */
- static final String TESTS_ROOT_DIR_PATH =
- Environment.getExternalStorageDirectory() +
- File.separator + "android" +
- File.separator + "LayoutTests";
-
- /** TODO: make it a setting */
static final String RESULTS_ROOT_DIR_PATH =
- Environment.getExternalStorageDirectory() +
- File.separator + "android" +
- File.separator + "LayoutTests-results";
+ Environment.getExternalStorageDirectory() + File.separator + "layout-test-results";
/** TODO: Make it a setting */
private static final List<String> EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES =
@@ -141,7 +133,7 @@ public class ManagerService extends Service {
public void onCreate() {
super.onCreate();
- mFileFilter = new FileFilter(TESTS_ROOT_DIR_PATH);
+ mFileFilter = new FileFilter();
mSummarizer = new Summarizer(mFileFilter, RESULTS_ROOT_DIR_PATH);
}
@@ -283,4 +275,4 @@ public class ManagerService extends Service {
return mLastExpectedResultPathFetched;
}
-} \ No newline at end of file
+}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java
index 0efb78e..3763bf2 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java
@@ -201,9 +201,7 @@ public class Summarizer {
private FileFilter mFileFilter;
private String mResultsRootDirPath;
-
private String mTestsRelativePath;
-
private Date mDate;
public Summarizer(FileFilter fileFilter, String resultsRootDirPath) {
@@ -243,8 +241,9 @@ public class Summarizer {
}
public void summarize() {
- createHtmlDetails();
- createTxtSummary();
+ String webKitRevision = getWebKitRevision();
+ createHtmlDetails(webKitRevision);
+ createTxtSummary(webKitRevision);
}
public void reset() {
@@ -255,7 +254,7 @@ public class Summarizer {
mDate = new Date();
}
- private void createTxtSummary() {
+ private void createTxtSummary(String webKitRevision) {
StringBuilder txt = new StringBuilder();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
@@ -263,23 +262,20 @@ public class Summarizer {
txt.append("Date: " + dateFormat.format(mDate) + "\n");
txt.append("Build fingerprint: " + Build.FINGERPRINT + "\n");
txt.append("WebKit version: " + getWebKitVersionFromUserAgentString() + "\n");
- txt.append("WebKit revision: " + getWebKitRevision() + "\n");
+ txt.append("WebKit revision: " + webKitRevision + "\n");
- txt.append("TOTAL: " + getTotalTestCount() + "\n");
- if (mCrashedTestsCount > 0) {
- txt.append("CRASHED (total among all tests): " + mCrashedTestsCount + "\n");
- txt.append("-------------");
- }
- txt.append("UNEXPECTED FAILURES: " + mUnexpectedFailures.size() + "\n");
- txt.append("UNEXPECTED PASSES: " + mUnexpectedPasses.size() + "\n");
- txt.append("EXPECTED FAILURES: " + mExpectedFailures.size() + "\n");
- txt.append("EXPECTED PASSES: " + mExpectedPasses.size() + "\n");
+ txt.append("TOTAL: " + getTotalTestCount() + "\n");
+ txt.append("CRASHED (among all tests): " + mCrashedTestsCount + "\n");
+ txt.append("UNEXPECTED FAILURES: " + mUnexpectedFailures.size() + "\n");
+ txt.append("UNEXPECTED PASSES: " + mUnexpectedPasses.size() + "\n");
+ txt.append("EXPECTED FAILURES: " + mExpectedFailures.size() + "\n");
+ txt.append("EXPECTED PASSES: " + mExpectedPasses.size() + "\n");
FsUtils.writeDataToStorage(new File(mResultsRootDirPath, TXT_SUMMARY_RELATIVE_PATH),
txt.toString().getBytes(), false);
}
- private void createHtmlDetails() {
+ private void createHtmlDetails(String webKitRevision) {
StringBuilder html = new StringBuilder();
html.append("<html><head>");
@@ -287,7 +283,7 @@ public class Summarizer {
html.append(SCRIPT);
html.append("</head><body>");
- createTopSummaryTable(html);
+ createTopSummaryTable(webKitRevision, html);
createResultsListWithDiff(html, "Unexpected failures", mUnexpectedFailures);
@@ -340,22 +336,21 @@ public class Summarizer {
return "unknown";
}
- private void createTopSummaryTable(StringBuilder html) {
+ private void createTopSummaryTable(String webKitRevision, StringBuilder html) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
html.append("<h1>" + mTestsRelativePath + "</h1>");
html.append("<h3>" + "Date: " + dateFormat.format(new Date()) + "</h3>");
html.append("<h3>" + "Build fingerprint: " + Build.FINGERPRINT + "</h3>");
html.append("<h3>" + "WebKit version: " + getWebKitVersionFromUserAgentString() + "</h3>");
- String webkitRevision = getWebKitRevision();
html.append("<h3>" + "WebKit revision: ");
- html.append("<a href=\"http://trac.webkit.org/browser/trunk?rev=" + webkitRevision +
- "\" target=\"_blank\"><span class=\"path\">" + webkitRevision + "</span></a>");
+ html.append("<a href=\"http://trac.webkit.org/browser/trunk?rev=" + webKitRevision +
+ "\" target=\"_blank\"><span class=\"path\">" + webKitRevision + "</span></a>");
html.append("</h3>");
html.append("<table class=\"summary\">");
createSummaryTableRow(html, "TOTAL", getTotalTestCount());
- createSummaryTableRow(html, "CRASHED", mCrashedTestsCount);
+ createSummaryTableRow(html, "CRASHED (among all tests)", mCrashedTestsCount);
createSummaryTableRow(html, "UNEXPECTED FAILURES", mUnexpectedFailures.size());
createSummaryTableRow(html, "UNEXPECTED PASSES", mUnexpectedPasses.size());
createSummaryTableRow(html, "EXPECTED FAILURES", mExpectedFailures.size());
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListPreloaderThread.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListPreloaderThread.java
index c714ec4..e0f1450 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListPreloaderThread.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListPreloaderThread.java
@@ -29,12 +29,6 @@ public class TestsListPreloaderThread extends Thread {
private static final String LOG_TAG = "TestsListPreloaderThread";
- /** TODO: make it a setting */
- private static final String TESTS_ROOT_DIR_PATH =
- Environment.getExternalStorageDirectory() +
- File.separator + "android" +
- File.separator + "LayoutTests";
-
/** A list containing relative paths of tests to run */
private ArrayList<String> mTestsList = new ArrayList<String>();
@@ -55,7 +49,7 @@ public class TestsListPreloaderThread extends Thread {
* @param doneMsg
*/
public TestsListPreloaderThread(String path, Message doneMsg) {
- mFileFilter = new FileFilter(TESTS_ROOT_DIR_PATH);
+ mFileFilter = new FileFilter();
mRelativePath = path;
mDoneMsg = doneMsg;
}
@@ -112,4 +106,4 @@ public class TestsListPreloaderThread extends Thread {
}
}
}
-} \ No newline at end of file
+}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/AdbUtils.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/AdbUtils.java
index d165a1a..086ff59 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/AdbUtils.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/AdbUtils.java
@@ -36,52 +36,45 @@ public class AdbUtils {
private static final int ADB_RESPONSE_SIZE = 4;
/**
- * Send an ADB command using existing socket connection
+ * Creates a new socket that can be configured to serve as a transparent proxy to a
+ * remote machine. This can be achieved by calling configureSocket()
*
- * The streams provided must be from a socket connected to adb already
+ * @return a socket that can be configured to link to remote machine
+ */
+ public static Socket createSocket() {
+ Socket socket = null;
+ try {
+ socket = new Socket(ADB_HOST, ADB_PORT);
+ } catch (IOException e) {
+ Log.e(LOG_TAG, "Creation failed.", e);
+ }
+ return socket;
+ }
+
+ /**
+ * Configures the connection to serve as a transparent proxy to a remote machine.
+ * The given streams must belong to a socket created by createSocket().
*
- * @param is input stream of the socket connection
- * @param os output stream of the socket
- * @param cmd the adb command to send
- * @return if adb gave a success response
+ * @param inputStream inputStream of the socket we want to configure
+ * @param outputStream outputStream of the socket we want to configure
+ * @param remoteAddress address of the remote machine (as you would type in a browser
+ * in a machine that the device is connected to via adb)
+ * @param remotePort port on which to connect
+ * @return if the configuration suceeded
* @throws IOException
*/
- private static boolean sendAdbCmd(InputStream is, OutputStream os, String cmd)
- throws IOException {
- byte[] buf = new byte[ADB_RESPONSE_SIZE];
-
+ public static boolean configureConnection(InputStream inputStream, OutputStream outputStream,
+ String remoteAddress, int remotePort) throws IOException {
+ String cmd = "tcp:" + remotePort + ":" + remoteAddress;
cmd = String.format("%04X", cmd.length()) + cmd;
- os.write(cmd.getBytes());
- int read = is.read(buf);
+
+ byte[] buf = new byte[ADB_RESPONSE_SIZE];
+ outputStream.write(cmd.getBytes());
+ int read = inputStream.read(buf);
if (read != ADB_RESPONSE_SIZE || !ADB_OK.equals(new String(buf))) {
Log.w(LOG_TAG, "adb cmd faild.");
return false;
}
return true;
}
-
- /**
- * Get a tcp socket connection to specified IP address and port proxied by adb
- *
- * The proxying is transparent, e.g. if a socket is returned, then it can be written to and
- * read from as if it is directly connected to the target
- *
- * @param remoteAddress IP address of the host to connect to
- * @param remotePort port of the host to connect to
- * @return a valid Socket instance if successful, null otherwise
- */
- public static Socket getSocketToRemoteMachine(String remoteAddress, int remotePort) {
- try {
- Socket socket = new Socket(ADB_HOST, ADB_PORT);
- String cmd = "tcp:" + remotePort + ":" + remoteAddress;
- if (!sendAdbCmd(socket.getInputStream(), socket.getOutputStream(), cmd)) {
- socket.close();
- return null;
- }
- return socket;
- } catch (IOException ioe) {
- Log.w(LOG_TAG, "error creating adb socket", ioe);
- return null;
- }
- }
} \ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ConnectionHandler.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ConnectionHandler.java
index 5e9f24e..4f01dae 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ConnectionHandler.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ConnectionHandler.java
@@ -18,6 +18,8 @@ package com.android.dumprendertree2.forwarder;
import android.util.Log;
+import com.android.dumprendertree2.FsUtils;
+
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -38,36 +40,25 @@ public class ConnectionHandler {
private class SocketPipeThread extends Thread {
- private Socket mInSocket, mOutSocket;
+ private InputStream mInputStream;
+ private OutputStream mOutputStream;
- public SocketPipeThread(Socket inSocket, Socket outSocket) {
- mInSocket = inSocket;
- mOutSocket = outSocket;
+ public SocketPipeThread(InputStream inputStream, OutputStream outputStream) {
+ mInputStream = inputStream;
+ mOutputStream = outputStream;
+ setName("SocketPipeThread: " + getName());
}
@Override
public void run() {
- InputStream is;
- OutputStream os;
- try {
- synchronized (this) {
- is = mInSocket.getInputStream();
- os = mOutSocket.getOutputStream();
- }
- } catch (IOException e) {
- Log.w(LOG_TAG, this.toString(), e);
- finish();
- return;
- }
-
byte[] buffer = new byte[4096];
int length;
while (true) {
try {
- if ((length = is.read(buffer)) <= 0) {
+ if ((length = mInputStream.read(buffer)) < 0) {
break;
}
- os.write(buffer, 0, length);
+ mOutputStream.write(buffer, 0, length);
} catch (IOException e) {
/** This exception means one of the streams is closed */
Log.v(LOG_TAG, this.toString(), e);
@@ -75,10 +66,6 @@ public class ConnectionHandler {
}
}
- finish();
- }
-
- private void finish() {
synchronized (mThreadsRunning) {
mThreadsRunning--;
if (mThreadsRunning == 0) {
@@ -90,7 +77,7 @@ public class ConnectionHandler {
@Override
public String toString() {
- return "SocketPipeThread:\n" + mInSocket + "\n=>\n" + mOutSocket;
+ return getName();
}
}
@@ -98,20 +85,51 @@ public class ConnectionHandler {
private Socket mFromSocket, mToSocket;
private SocketPipeThread mFromToPipe, mToFromPipe;
+ private InputStream mFromSocketInputStream, mToSocketInputStream;
+ private OutputStream mFromSocketOutputStream, mToSocketOutputStream;
+
+ private int mPort;
+ private String mRemoteMachineIpAddress;
private OnFinishedCallback mOnFinishedCallback;
- public ConnectionHandler(Socket fromSocket, Socket toSocket) {
+ public ConnectionHandler(String remoteMachineIp, int port, Socket fromSocket, Socket toSocket) {
+ mRemoteMachineIpAddress = remoteMachineIp;
+ mPort = port;
+
mFromSocket = fromSocket;
mToSocket = toSocket;
- mFromToPipe = new SocketPipeThread(mFromSocket, mToSocket);
- mToFromPipe = new SocketPipeThread(mToSocket, mFromSocket);
+
+ try {
+ mFromSocketInputStream = mFromSocket.getInputStream();
+ mToSocketInputStream = mToSocket.getInputStream();
+ mFromSocketOutputStream = mFromSocket.getOutputStream();
+ mToSocketOutputStream = mToSocket.getOutputStream();
+ if (!AdbUtils.configureConnection(mToSocketInputStream, mToSocketOutputStream,
+ mRemoteMachineIpAddress, mPort)) {
+ throw new IOException("Configuring socket failed!");
+ }
+ } catch (IOException e) {
+ Log.e(LOG_TAG, "Unable to start ConnectionHandler", e);
+ closeStreams();
+ return;
+ }
+
+ mFromToPipe = new SocketPipeThread(mFromSocketInputStream, mToSocketOutputStream);
+ mToFromPipe = new SocketPipeThread(mToSocketInputStream, mFromSocketOutputStream);
}
public void registerOnConnectionHandlerFinishedCallback(OnFinishedCallback callback) {
mOnFinishedCallback = callback;
}
+ private void closeStreams() {
+ FsUtils.closeInputStream(mFromSocketInputStream);
+ FsUtils.closeInputStream(mToSocketInputStream);
+ FsUtils.closeOutputStream(mFromSocketOutputStream);
+ FsUtils.closeOutputStream(mToSocketOutputStream);
+ }
+
public void start() {
/** We have 2 threads running, one for each pipe, that we start here. */
mThreadsRunning = 2;
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/Forwarder.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/Forwarder.java
index 31cd8ea..b361a89 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/Forwarder.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/Forwarder.java
@@ -60,19 +60,18 @@ public class Forwarder extends Thread {
@Override
public void run() {
while (true) {
- /** These sockets will be closed when Forwarder.stop() is called */
Socket localSocket;
Socket remoteSocket;
try {
localSocket = mServerSocket.accept();
- remoteSocket = AdbUtils.getSocketToRemoteMachine(mRemoteMachineIpAddress,
- mPort);
} catch (IOException e) {
/** This most likely means that mServerSocket is already closed */
Log.w(LOG_TAG, "mPort=" + mPort, e);
break;
}
+ remoteSocket = AdbUtils.createSocket();
+
if (remoteSocket == null) {
try {
localSocket.close();
@@ -86,7 +85,8 @@ public class Forwarder extends Thread {
}
final ConnectionHandler connectionHandler =
- new ConnectionHandler(localSocket, remoteSocket);
+ new ConnectionHandler(mRemoteMachineIpAddress, mPort, localSocket,
+ remoteSocket);
/**
* We have to close the sockets after the ConnectionHandler finishes, so we
@@ -98,9 +98,7 @@ public class Forwarder extends Thread {
@Override
public void onFinished() {
synchronized (this) {
- if (mConnectionHandlers.remove(connectionHandler)) {
- Log.d(LOG_TAG, "removeConnectionHandler(): removed");
- } else {
+ if (!mConnectionHandlers.remove(connectionHandler)) {
assert false : "removeConnectionHandler(): not in the collection";
}
}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ui/DirListActivity.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/ui/DirListActivity.java
index b1862ef..35de88a 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ui/DirListActivity.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/ui/DirListActivity.java
@@ -56,10 +56,6 @@ import java.util.List;
public class DirListActivity extends ListActivity {
private static final String LOG_TAG = "DirListActivity";
- private static final String ROOT_DIR_PATH =
- Environment.getExternalStorageDirectory() +
- File.separator + "android" +
- File.separator + "LayoutTests";
/** TODO: This is just a guess - think of a better way to achieve it */
private static final int MEAN_TITLE_CHAR_SIZE = 13;
@@ -82,13 +78,6 @@ public class DirListActivity extends ListActivity {
private String mCurrentDirPath;
/**
- * TODO: This should not be a constant, but rather be configurable from somewhere.
- */
- private String mRootDirPath = ROOT_DIR_PATH;
-
- private FileFilter mFileFilter;
-
- /**
* A thread responsible for loading the contents of the directory from sd card
* and sending them via Message to main thread that then loads them into
* ListView
@@ -196,7 +185,6 @@ public class DirListActivity extends ListActivity {
ForwarderManager.getForwarderManager().start();
- mFileFilter = new FileFilter(ROOT_DIR_PATH);
mListView = getListView();
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@@ -420,4 +408,4 @@ public class DirListActivity extends ListActivity {
return subDirs.toArray(new ListItem[subDirs.size()]);
}
-} \ No newline at end of file
+}