mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-19 23:40:09 +08:00
Add Fabric integration test
Reviewed By: fkgozali Differential Revision: D7207630 fbshipit-source-id: 69cc10d7d45031eec9f3d934b981a5e4bb62a0ef
This commit is contained in:
committed by
Facebook Github Bot
parent
304db5cb65
commit
d678058402
@@ -27,6 +27,8 @@ rn_android_library(
|
||||
react_native_target("java/com/facebook/react/bridge:bridge"),
|
||||
react_native_target("java/com/facebook/react/common:common"),
|
||||
react_native_target("java/com/facebook/react/devsupport:interfaces"),
|
||||
react_native_target("java/com/facebook/react/fabric:fabric"),
|
||||
react_native_target("java/com/facebook/react/fabric/jsc:jsc"),
|
||||
react_native_target("java/com/facebook/react/module/annotations:annotations"),
|
||||
react_native_target("java/com/facebook/react/module/model:model"),
|
||||
react_native_target("java/com/facebook/react/modules/core:core"),
|
||||
|
||||
@@ -7,19 +7,17 @@
|
||||
|
||||
package com.facebook.react.testing;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.graphics.Bitmap;
|
||||
import android.test.ActivityInstrumentationTestCase2;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.facebook.infer.annotation.Assertions;
|
||||
import com.facebook.react.bridge.ReactContext;
|
||||
import com.facebook.react.testing.idledetection.IdleWaiter;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* Base class for instrumentation tests that runs React based react application in UI mode
|
||||
@@ -35,6 +33,9 @@ public abstract class ReactAppInstrumentationTestCase extends
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra(ReactAppTestActivity.EXTRA_IS_FABRIC_TEST, isFabricTest());
|
||||
setActivityIntent(intent);
|
||||
final ReactAppTestActivity activity = getActivity();
|
||||
try {
|
||||
runTestOnUiThread(new Runnable() {
|
||||
@@ -144,6 +145,10 @@ public abstract class ReactAppInstrumentationTestCase extends
|
||||
return false;
|
||||
}
|
||||
|
||||
protected boolean isFabricTest() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Override this method to provide extra native modules to be loaded before the app starts
|
||||
*/
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
package com.facebook.react.testing;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.graphics.Bitmap;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.FragmentActivity;
|
||||
@@ -17,8 +18,16 @@ import com.facebook.infer.annotation.Assertions;
|
||||
import com.facebook.react.ReactInstanceManager;
|
||||
import com.facebook.react.ReactInstanceManagerBuilder;
|
||||
import com.facebook.react.ReactRootView;
|
||||
import com.facebook.react.bridge.JSIModule;
|
||||
import com.facebook.react.bridge.JSIModuleHolder;
|
||||
import com.facebook.react.bridge.JSIModulesProvider;
|
||||
import com.facebook.react.bridge.JavaScriptContextHolder;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContext;
|
||||
import com.facebook.react.bridge.UIManager;
|
||||
import com.facebook.react.common.LifecycleState;
|
||||
import com.facebook.react.fabric.FabricUIManager;
|
||||
import com.facebook.react.fabric.jsc.FabricJSCBinding;
|
||||
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
|
||||
import com.facebook.react.modules.core.PermissionAwareActivity;
|
||||
import com.facebook.react.modules.core.PermissionListener;
|
||||
@@ -26,6 +35,10 @@ import com.facebook.react.shell.MainReactPackage;
|
||||
import com.facebook.react.testing.idledetection.ReactBridgeIdleSignaler;
|
||||
import com.facebook.react.testing.idledetection.ReactIdleDetectionUtil;
|
||||
import com.facebook.react.uimanager.UIImplementationProvider;
|
||||
import com.facebook.react.uimanager.ViewManager;
|
||||
import com.facebook.react.uimanager.ViewManagerRegistry;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import javax.annotation.Nullable;
|
||||
@@ -33,6 +46,8 @@ import javax.annotation.Nullable;
|
||||
public class ReactAppTestActivity extends FragmentActivity
|
||||
implements DefaultHardwareBackBtnHandler, PermissionAwareActivity {
|
||||
|
||||
public static final String EXTRA_IS_FABRIC_TEST = "is_fabric_test";
|
||||
|
||||
private static final String DEFAULT_BUNDLE_NAME = "AndroidTestBundle.js";
|
||||
private static final int ROOT_VIEW_ID = 8675309;
|
||||
// we need a bigger timeout for CI builds because they run on a slow emulator
|
||||
@@ -62,6 +77,11 @@ public class ReactAppTestActivity extends FragmentActivity
|
||||
rootView.addView(mScreenshotingFrameLayout);
|
||||
|
||||
mReactRootView = new ReactRootView(this);
|
||||
Intent intent = getIntent();
|
||||
if (intent != null && intent.getBooleanExtra(EXTRA_IS_FABRIC_TEST, false)) {
|
||||
mReactRootView.setIsFabric(true);
|
||||
}
|
||||
|
||||
mScreenshotingFrameLayout.addView(mReactRootView);
|
||||
}
|
||||
|
||||
@@ -179,6 +199,36 @@ public class ReactAppTestActivity extends FragmentActivity
|
||||
.setUseDeveloperSupport(useDevSupport)
|
||||
.setBridgeIdleDebugListener(mBridgeIdleSignaler)
|
||||
.setInitialLifecycleState(mLifecycleState)
|
||||
.setJSIModulesProvider(
|
||||
new JSIModulesProvider() {
|
||||
@Override
|
||||
public List<JSIModuleHolder> getJSIModules(
|
||||
final ReactApplicationContext reactApplicationContext,
|
||||
final JavaScriptContextHolder jsContext) {
|
||||
|
||||
List<JSIModuleHolder> modules = new ArrayList<>();
|
||||
modules.add(
|
||||
new JSIModuleHolder() {
|
||||
|
||||
@Override
|
||||
public Class<? extends JSIModule> getJSIModuleClass() {
|
||||
return UIManager.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FabricUIManager getJSIModule() {
|
||||
List<ViewManager> viewManagers =
|
||||
getReactInstanceManager().getOrCreateViewManagers(reactApplicationContext);
|
||||
FabricUIManager fabricUIManager =
|
||||
new FabricUIManager(
|
||||
reactApplicationContext, new ViewManagerRegistry(viewManagers));
|
||||
new FabricJSCBinding().installFabric(jsContext, fabricUIManager);
|
||||
return fabricUIManager;
|
||||
}
|
||||
});
|
||||
|
||||
return modules;
|
||||
}})
|
||||
.setUIImplementationProvider(uiImplementationProvider);
|
||||
|
||||
mReactInstanceManager = builder.build();
|
||||
@@ -195,6 +245,10 @@ public class ReactAppTestActivity extends FragmentActivity
|
||||
.startReactApplication(mReactInstanceManager, appKey, initialProps);
|
||||
}
|
||||
|
||||
private ReactInstanceManager getReactInstanceManager() {
|
||||
return mReactInstanceManager;
|
||||
}
|
||||
|
||||
public boolean waitForLayout(long millis) throws InterruptedException {
|
||||
return mLayoutEvent.await(millis, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user