Add an API for Detox to check if there are any timers expiring in a certain range (#27539)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/27539

Detox currently relies on reflection to inspect the private timers queue in the Timing module to check if React Native is idle or not. This broke when I renamed TimingModule and moved the queue to JavaTimerManager in D17260848 and D17282187. A better solution to this problem is for us to expose a public API for checking the timers queue from TimingModule, so that Detox doesn't need to access private fields.

Using similar logic to Detox's TimersIdlingResource: https://github.com/wix/Detox/blob/4f81a77baee4e4542a693922bcbde621d9d8c1a5/detox/android/detox/src/main/java/com/wix/detox/reactnative/idlingresources/TimersIdlingResource.kt#L95

Changelog: [Android] [Added] Added an API for checking if there are busy timers to TimingModule

Reviewed By: makovkastar

Differential Revision: D19128786

fbshipit-source-id: 835ae214eba58879c8343255bba680a81801ce03
This commit is contained in:
Emily Janzer
2020-01-07 15:36:37 -08:00
committed by Facebook Github Bot
parent 80cfa9c8ee
commit 22764e6cdc
4 changed files with 40 additions and 0 deletions
@@ -373,4 +373,23 @@ public class JavaTimerManager {
}
});
}
/**
* Returns a bool representing whether there are any active timers that will be fired within a
* certain period of time. Disregards repeating timers (setInterval). Used for testing to
* determine if RN is idle.
*
* @param rangeMs The time range, in ms, to check
* @return True if there are pending timers within the given range; false otherwise
*/
/* package */ boolean hasActiveTimersInRange(long rangeMs) {
synchronized (mTimerGuard) {
for (Timer timer : mTimers) {
if (!timer.mRepeat && timer.mInterval < rangeMs) {
return true;
}
}
}
return false;
}
}
@@ -11,6 +11,7 @@ import com.facebook.fbreact.specs.NativeTimingSpec;
import com.facebook.react.bridge.LifecycleEventListener;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.common.annotations.VisibleForTesting;
import com.facebook.react.devsupport.interfaces.DevSupportManager;
import com.facebook.react.jstasks.HeadlessJsTaskContext;
import com.facebook.react.jstasks.HeadlessJsTaskEventListener;
@@ -134,4 +135,9 @@ public final class TimingModule extends NativeTimingSpec
headlessJsTaskContext.removeTaskEventListener(this);
mJavaTimerManager.onInstanceDestroy();
}
@VisibleForTesting
public boolean hasActiveTimersInRange(long rangeMs) {
return mJavaTimerManager.hasActiveTimersInRange(rangeMs);
}
}