From 37ab1c884414d682cc879077367743112bd4db78 Mon Sep 17 00:00:00 2001 From: Felix Oghina Date: Fri, 19 Aug 2016 06:57:41 -0700 Subject: [PATCH] Remove dependency on launcher from instrumentation tests Reviewed By: bestander Differential Revision: D3736847 fbshipit-source-id: d39a227fe8753f3766521fd23440933adba9e8c7 --- ReactAndroid/build.gradle | 1 + .../java/com/facebook/react/testing/BUCK | 1 + .../react/testing/ReactTestAppShell.java | 39 ++++++++++++++++++ .../testing/ReactTestApplicationImpl.java | 24 +++++++++++ .../java/buck-android-support/BUCK | 14 +++++++ .../buck-android-support.jar | Bin 0 -> 12616 bytes 6 files changed, 79 insertions(+) create mode 100644 ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactTestAppShell.java create mode 100644 ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactTestApplicationImpl.java create mode 100644 ReactAndroid/src/main/third-party/java/buck-android-support/BUCK create mode 100644 ReactAndroid/src/main/third-party/java/buck-android-support/buck-android-support.jar diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index cb8fbbb9c..5d90a0f2a 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -287,6 +287,7 @@ dependencies { testCompile "org.easytesting:fest-assert-core:${FEST_ASSERT_CORE_VERSION}" testCompile "org.robolectric:robolectric:${ROBOLECTRIC_VERSION}" + androidTestCompile fileTree(dir: 'src/main/third-party/java/buck-android-support/', include: ['*.jar']) androidTestCompile 'com.android.support.test:runner:0.3' androidTestCompile "org.mockito:mockito-core:${MOCKITO_CORE_VERSION}" } diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/BUCK b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/BUCK index 6f4d57fa6..22336f925 100644 --- a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/BUCK +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/BUCK @@ -6,6 +6,7 @@ android_library( deps = [ react_native_dep('libraries/soloader/java/com/facebook/soloader:soloader'), react_native_dep('third-party/android/support/v4:lib-support-v4'), + react_native_dep('third-party/java/buck-android-support:buck-android-support'), react_native_dep('third-party/java/infer-annotations:infer-annotations'), react_native_dep('third-party/java/jsr-305:jsr-305'), react_native_dep('third-party/java/junit:junit'), diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactTestAppShell.java b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactTestAppShell.java new file mode 100644 index 000000000..7f5d2cd6c --- /dev/null +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactTestAppShell.java @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2014-present, Facebook, Inc. + * All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +package com.facebook.react.testing; + +import com.facebook.buck.android.support.exopackage.ApplicationLike; +import com.facebook.buck.android.support.exopackage.ExopackageApplication; +import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.soloader.SoLoader; + +/** + * Application class for the Catalyst Launcher to allow it to work as an exopackage. + * + * Any app-specific code that should run before secondary dex files are loaded + * (like setting up crash reporting) should go in onBaseContextAttached. + * Anything that should run after secondary dex should go in CatalystApplicationImpl.onCreate. + */ +public class ReactTestAppShell extends ExopackageApplication { + + public ReactTestAppShell() { + super("com.facebook.react.testing.ReactTestApplicationImpl", ReactBuildConfig.EXOPACKAGE_FLAGS); + } + + @Override + protected void onBaseContextAttached() { + // This is a terrible hack. Don't copy it. + // It's unfortunate that Instagram does the same thing. + // We need to do this here because internal apps use SoLoader, + // and Open Source Buck uses ExopackageSoLoader. + // If you feel the need to copy this, we should refactor it + // into an FB-specific subclass of ExopackageApplication. + SoLoader.init(this, (ReactBuildConfig.EXOPACKAGE_FLAGS & 2) != 0); + } +} diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactTestApplicationImpl.java b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactTestApplicationImpl.java new file mode 100644 index 000000000..6f58924f6 --- /dev/null +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactTestApplicationImpl.java @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2014-present, Facebook, Inc. + * All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +package com.facebook.react.testing; + +import android.app.Application; + +import com.facebook.buck.android.support.exopackage.DefaultApplicationLike; + +public class ReactTestApplicationImpl extends DefaultApplicationLike { + + public ReactTestApplicationImpl() { + super(); + } + + public ReactTestApplicationImpl(Application application) { + super(application); + } +} diff --git a/ReactAndroid/src/main/third-party/java/buck-android-support/BUCK b/ReactAndroid/src/main/third-party/java/buck-android-support/BUCK new file mode 100644 index 000000000..67307130b --- /dev/null +++ b/ReactAndroid/src/main/third-party/java/buck-android-support/BUCK @@ -0,0 +1,14 @@ +include_defs('//ReactAndroid/DEFS') + +# this lib was compiled by buck version : 6cbf2709778ea352a169d1c84e3ef2894dfa39ec +prebuilt_jar( + name = 'buck-android-support', + binary_jar = 'buck-android-support.jar', + visibility = [ + react_native_integration_tests_target('...'), + ], +) + +project_config( + src_target = ':buck-android-support', +) diff --git a/ReactAndroid/src/main/third-party/java/buck-android-support/buck-android-support.jar b/ReactAndroid/src/main/third-party/java/buck-android-support/buck-android-support.jar new file mode 100644 index 0000000000000000000000000000000000000000..52c8d8f438cc7f9c167b240fea625b278835a1ef GIT binary patch literal 12616 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 literal 0 HcmV?d00001