From eb2a83b0be4658654fc6ca6f4671e45f1898798d Mon Sep 17 00:00:00 2001 From: Christoph Purrer <chpurrer@fb.com> Date: Thu, 28 Apr 2022 07:48:54 -0700 Subject: [PATCH] Allow ReactInstrumentationTest to use custom JSIModules Summary: Update ReactInstrumentationTest to allow passing in custom JSIModules Also: 'Fixed' some improper ordering of Nullable annotations Changelog: Internal Reviewed By: cortinico Differential Revision: D35961806 fbshipit-source-id: aa1513bee34e04ac3aae37f794d9d2771e7cc501 --- .../react/testing/ReactAppTestActivity.java | 9 ++++++-- .../testing/ReactInstanceSpecForTest.java | 21 ++++++++++++++++++- .../testing/ReactInstrumentationTest.java | 9 +++++++- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactAppTestActivity.java b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactAppTestActivity.java index 7d89ab5b2ec369..0134b1057734f9 100644 --- a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactAppTestActivity.java +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactAppTestActivity.java @@ -37,7 +37,7 @@ import com.facebook.react.testing.idledetection.ReactBridgeIdleSignaler; import com.facebook.react.testing.idledetection.ReactIdleDetectionUtil; import com.facebook.react.uimanager.ViewManagerRegistry; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -250,7 +250,8 @@ public void loadBundle( public List<JSIModuleSpec> getJSIModules( final ReactApplicationContext reactApplicationContext, final JavaScriptContextHolder jsContext) { - return Arrays.<JSIModuleSpec>asList( + List<JSIModuleSpec> packages = new ArrayList<>(); + packages.add( new JSIModuleSpec() { @Override public JSIModuleType getJSIModuleType() { @@ -276,6 +277,10 @@ public UIManager get() { }; } }); + if (spec.getJSIModuleBuilder() != null) { + packages.addAll(spec.getJSIModuleBuilder().build(reactApplicationContext)); + } + return packages; } }); diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactInstanceSpecForTest.java b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactInstanceSpecForTest.java index 8422eb53729e74..6b96c8232b9da9 100644 --- a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactInstanceSpecForTest.java +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactInstanceSpecForTest.java @@ -11,10 +11,12 @@ import androidx.annotation.Nullable; import com.facebook.react.ReactPackage; import com.facebook.react.ReactPackageTurboModuleManagerDelegate; +import com.facebook.react.bridge.JSIModuleSpec; import com.facebook.react.bridge.JavaScriptExecutorFactory; import com.facebook.react.bridge.JavaScriptModule; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.NativeModuleCallExceptionHandler; +import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.ArrayList; import java.util.Arrays; @@ -28,6 +30,11 @@ @SuppressLint("JavatestsIncorrectFolder") public class ReactInstanceSpecForTest { + public abstract static class JSIModuleBuilder { + @Nullable + protected abstract List<JSIModuleSpec> build(ReactApplicationContext context); + } + private final List<NativeModule> mNativeModules = new ArrayList<NativeModule>(Arrays.asList(new FakeWebSocketModule())); private final List<Class<? extends JavaScriptModule>> mJSModuleSpecs = new ArrayList<>(); @@ -37,6 +44,7 @@ public class ReactInstanceSpecForTest { @Nullable private FabricUIManagerFactory mFabricUIManagerFactory = null; @Nullable private JavaScriptExecutorFactory mJavaScriptExecutorFactory = null; @Nullable private ReactPackageTurboModuleManagerDelegate.Builder mTMMDelegateBuilder = null; + @Nullable private JSIModuleBuilder mJSIModuleBuilder = null; public ReactInstanceSpecForTest addNativeModule(NativeModule module) { mNativeModules.add(module); @@ -85,11 +93,22 @@ public ReactInstanceSpecForTest setReactPackageTurboModuleManagerDelegateBuilder return this; } - protected @Nullable ReactPackageTurboModuleManagerDelegate.Builder + @Nullable + protected ReactPackageTurboModuleManagerDelegate.Builder getReactPackageTurboModuleManagerDelegateBuilder() { return mTMMDelegateBuilder; } + public ReactInstanceSpecForTest setJSIModuleBuilder(@Nullable JSIModuleBuilder builder) { + mJSIModuleBuilder = builder; + return this; + } + + @Nullable + protected JSIModuleBuilder getJSIModuleBuilder() { + return mJSIModuleBuilder; + } + public ReactInstanceSpecForTest addPackages(List<ReactPackage> reactPackages) { mReactPackages.addAll(reactPackages); return this; diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactInstrumentationTest.java b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactInstrumentationTest.java index 40699a74e4f4b6..a5ac40a93d9ec9 100644 --- a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactInstrumentationTest.java +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactInstrumentationTest.java @@ -96,11 +96,17 @@ protected <T extends JavaScriptModule> T getJSModule(Class<T> jsInterface) { return getReactContext().getJSModule(jsInterface); } - protected @Nullable ReactPackageTurboModuleManagerDelegate.Builder + @Nullable + protected ReactPackageTurboModuleManagerDelegate.Builder getReactPackageTurboModuleManagerDelegateBuilder() { return null; } + @Nullable + protected ReactInstanceSpecForTest.JSIModuleBuilder getJSIModuleBuilder() { + return null; + } + /** Override this method to provide extra native modules to be loaded before the app starts */ protected ReactInstanceSpecForTest createReactInstanceSpecForTest() { ReactInstanceSpecForTest reactInstanceSpecForTest = @@ -113,6 +119,7 @@ protected ReactInstanceSpecForTest createReactInstanceSpecForTest() { } reactInstanceSpecForTest.setReactPackageTurboModuleManagerDelegateBuilder( getReactPackageTurboModuleManagerDelegateBuilder()); + reactInstanceSpecForTest.setJSIModuleBuilder(getJSIModuleBuilder()); return reactInstanceSpecForTest; }