diff options
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.java | 51 |
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"); + } + } +} |