Index: components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/TestUtils.java |
diff --git a/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/TestUtils.java b/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/TestUtils.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7d22423beda402592bf77f925cb80b8dcc3d78a8 |
--- /dev/null |
+++ b/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/TestUtils.java |
@@ -0,0 +1,86 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.components.devtools_bridge; |
+ |
+import android.net.LocalSocket; |
+import android.net.LocalSocketAddress; |
+ |
+import java.io.IOException; |
+import java.util.concurrent.Callable; |
+import java.util.concurrent.ExecutorService; |
+import java.util.concurrent.Executors; |
+import java.util.concurrent.Future; |
+ |
+/** |
+ * Utilities to testing a socket tunnel. |
+ */ |
+public class TestUtils { |
+ private static final String CHARSET = "UTF8"; |
mnaganov (inactive)
2014/09/15 16:35:22
nit: I think "UTF-8" is more standard spelling. "U
SeRya
2014/09/15 18:16:21
Done.
|
+ |
+ // Sends |request| string to UNIX socket socketName on another thread and returns |
+ // Future<String> for obtainings response. |
+ public static Future<String> asyncRequest(final String socketName, final String request) { |
+ |
+ final ExecutorService executor = Executors.newSingleThreadExecutor(); |
+ |
+ return executor.submit(new Callable<String>() { |
+ @Override |
+ public String call() throws Exception { |
+ LocalSocket socket = new LocalSocket(); |
+ socket.connect(new LocalSocketAddress(socketName)); |
+ writeAndShutdown(socket, request); |
+ |
+ String response = readAll(socket); |
+ socket.close(); |
+ |
+ executor.shutdown(); |
+ return response; |
+ } |
+ }); |
+ } |
+ |
+ public static void writeAndShutdown(LocalSocket socket, String data) throws IOException { |
+ socket.getOutputStream().write(data.getBytes(CHARSET)); |
+ socket.getOutputStream().flush(); |
+ socket.shutdownOutput(); |
+ } |
+ |
+ // Reads all bytes from socket input stream until EOF and converts it to UTF-8 string. |
+ public static String readAll(LocalSocket socket) throws IOException { |
+ byte[] buffer = new byte[1000]; |
+ int position = 0; |
+ while (true) { |
+ int count = socket.getInputStream().read(buffer, position, buffer.length - position); |
+ if (count == -1) |
+ break; |
+ position += count; |
+ } |
+ return new String(buffer, 0, position, CHARSET); |
+ } |
+ |
+ /** |
+ * Utility class for thread synchronization. Allow to track moving through series of steps. |
+ */ |
+ public static class StateBarrier<T> { |
+ private T mState; |
+ |
+ public StateBarrier(T initialState) { |
+ mState = initialState; |
+ } |
+ |
+ // Waits until state |from| reached and change state to |to|. |
+ public synchronized void advance(T from, T to) { |
+ while (mState.equals(from)) { |
+ try { |
+ wait(); |
+ } catch (InterruptedException e) { |
+ throw new RuntimeException(e); |
+ } |
+ } |
+ mState = to; |
+ notifyAll(); |
+ } |
+ } |
+} |