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;
   }