| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package org.chromium.base.test.util; |
| |
| import org.chromium.base.ThreadUtils; |
| |
| import java.util.concurrent.ExecutionException; |
| import java.util.concurrent.FutureTask; |
| |
| /** Helper methods to deal with threading related tasks in tests. */ |
| public class TestThreadUtils { |
| /** |
| * Since PostTask goes through c++, and order is not guaranteed between c++ and Java Handler |
| * tasks, in many cases it's not sufficient to PostTask to the UI thread to check if UI |
| * properties like visibility are updated in response to a click, as UI updates go through a |
| * Java Handler and may run after the posted PostTask task. |
| * |
| * You should strongly prefer to wait on the signal you care about (eg. use Espresso to wait for |
| * a view to be displayed) instead of flushing tasks. |
| */ |
| public static void flushNonDelayedLooperTasks() { |
| if (ThreadUtils.runningOnUiThread()) return; |
| var task = new FutureTask<Void>(() -> {}, null); |
| ThreadUtils.getUiThreadHandler().post(task); |
| try { |
| task.get(); |
| } catch (InterruptedException | ExecutionException e) { |
| } |
| } |
| } |