summaryrefslogtreecommitdiff
path: root/base/test/android/java/src/org/chromium/base/TestUiThread.java
diff options
context:
space:
mode:
Diffstat (limited to 'base/test/android/java/src/org/chromium/base/TestUiThread.java')
-rw-r--r--base/test/android/java/src/org/chromium/base/TestUiThread.java51
1 files changed, 51 insertions, 0 deletions
diff --git a/base/test/android/java/src/org/chromium/base/TestUiThread.java b/base/test/android/java/src/org/chromium/base/TestUiThread.java
new file mode 100644
index 0000000000..237c0ec64b
--- /dev/null
+++ b/base/test/android/java/src/org/chromium/base/TestUiThread.java
@@ -0,0 +1,51 @@
+// Copyright 2015 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.base;
+
+import android.os.Looper;
+
+import org.chromium.base.annotations.CalledByNative;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.annotation.concurrent.ThreadSafe;
+
+/**
+ * Set up a thread as the Chromium UI Thread, and run its looper. This is is intended for C++ unit
+ * tests (e.g. the net unit tests) that don't run with the UI thread as their main looper, but test
+ * code that, on Android, uses UI thread events, so need a running UI thread.
+ */
+@ThreadSafe
+public class TestUiThread {
+ private static final AtomicBoolean sStarted = new AtomicBoolean(false);
+ private static final String TAG = "cr.TestUiThread";
+
+ @CalledByNative
+ private static void loop() {
+ // @{link ThreadUtils#setUiThread(Looper)} can only be called once in a test run, so do this
+ // once, and leave it running.
+ if (sStarted.getAndSet(true)) return;
+
+ final CountDownLatch startLatch = new CountDownLatch(1);
+ new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ Looper.prepare();
+ ThreadUtils.setUiThread(Looper.myLooper());
+ startLatch.countDown();
+ Looper.loop();
+ }
+
+ }).start();
+
+ try {
+ startLatch.await();
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Failed to set UI Thread");
+ }
+ }
+}