mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
a68c418082
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/35038 React-jsi provides JSI to allow React Native to interface with JavaScriptCore. The hermes-engine Pod provides a second copy of JSI, as Hermes is built and linked statically with JSI. This second copy of JSI would lead to an [ODR Violation](https://en.cppreference.com/w/cpp/language/definition). To resolve this, when Hermes is enabled: - React-hermes and hermes-engine are installed. - React-jsc is not installed. - React-jsi continues to be installed. - React-jsi will not build JSI. - React-jsi will declare a dependency on hermes-engine. The result is that the JSI dependency for React Native is satisfied by hermes-engine, and there is no duplicate JSI library in the project. When Hermes is disabled: - React-jsi and React-jsc are installed. - React-hermes and hermes-engine are not installed. - React-jsi will build JSI. Changelog: [iOS][Changed] Resolve JSI ODR violation, make hermes-engine the JSI provider when Hermes is enabled Reviewed By: cipolleschi Differential Revision: D40334913 fbshipit-source-id: 409407a193a35cbd21b0e8778537b3627e4c54a2
123 lines
4.3 KiB
Ruby
123 lines
4.3 KiB
Ruby
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
#
|
|
# This source code is licensed under the MIT license found in the
|
|
# LICENSE file in the root directory of this source tree.
|
|
|
|
require "test/unit"
|
|
require_relative "../jsengine.rb"
|
|
require_relative "./test_utils/podSpy.rb"
|
|
require_relative "./test_utils/PodMock.rb"
|
|
require_relative "./test_utils/Open3Mock.rb"
|
|
|
|
class JSEngineTests < Test::Unit::TestCase
|
|
|
|
:react_native_path
|
|
|
|
def setup
|
|
@react_native_path = "../.."
|
|
podSpy_cleanUp()
|
|
end
|
|
|
|
def teardown
|
|
Open3.reset()
|
|
Pod::Config.reset()
|
|
Pod::UI.reset()
|
|
podSpy_cleanUp()
|
|
ENV['USE_HERMES'] = '1'
|
|
end
|
|
|
|
# =============== #
|
|
# TEST - setupJsc #
|
|
# =============== #
|
|
def test_setupJsc_installsPods
|
|
# Arrange
|
|
fabric_enabled = false
|
|
|
|
# Act
|
|
setup_jsc!(:react_native_path => @react_native_path, :fabric_enabled => fabric_enabled)
|
|
|
|
# Assert
|
|
assert_equal($podInvocationCount, 2)
|
|
assert_equal($podInvocation["React-jsi"][:path], "../../ReactCommon/jsi")
|
|
assert_equal($podInvocation["React-jsc"][:path], "../../ReactCommon/jsi")
|
|
end
|
|
|
|
def test_setupJsc_installsPods_installsFabricSubspecWhenFabricEnabled
|
|
# Arrange
|
|
fabric_enabled = true
|
|
|
|
# Act
|
|
setup_jsc!(:react_native_path => @react_native_path, :fabric_enabled => fabric_enabled)
|
|
|
|
# Assert
|
|
assert_equal($podInvocationCount, 3)
|
|
assert_equal($podInvocation["React-jsi"][:path], "../../ReactCommon/jsi")
|
|
assert_equal($podInvocation["React-jsc"][:path], "../../ReactCommon/jsi")
|
|
assert_equal($podInvocation["React-jsc/Fabric"][:path], "../../ReactCommon/jsi")
|
|
end
|
|
|
|
# ================== #
|
|
# TEST - setupHermes #
|
|
# ================== #
|
|
def test_setupHermes_whenHermesScriptFails_abort
|
|
# Arrange
|
|
fabric_enabled = false
|
|
Pod::Config.instance.installation_root.set_installation_root("Pods/")
|
|
Open3.set_returned_status(1)
|
|
Open3.set_returned_text("This test\nshould fail")
|
|
|
|
# Act
|
|
assert_raises {
|
|
setup_hermes!(:react_native_path => @react_native_path, :fabric_enabled => fabric_enabled)
|
|
}
|
|
|
|
# Assert
|
|
assert_equal(Open3.collected_commands, ["node scripts/hermes/prepare-hermes-for-build"])
|
|
assert_equal(Open3.collected_dirs, ["Pods/../.."])
|
|
assert_equal(Pod::UI.collected_infoes, ["This test", "should fail"])
|
|
assert_equal($podInvocationCount, 0)
|
|
assert_equal($podInvocation, {})
|
|
end
|
|
|
|
def test_setupHermes_whenHermesScriptSucceeds_installsPods
|
|
# Arrange
|
|
fabric_enabled = false
|
|
Pod::Config.instance.installation_root.set_installation_root("Pods/")
|
|
Open3.set_returned_status(0)
|
|
Open3.set_returned_text("This is\nthe text\nreturned by\nprepare-hermes-for-build")
|
|
|
|
# Act
|
|
setup_hermes!(:react_native_path => @react_native_path, :fabric_enabled => fabric_enabled)
|
|
|
|
# Assert
|
|
assert_equal(Open3.collected_commands, ["node scripts/hermes/prepare-hermes-for-build"])
|
|
assert_equal(Open3.collected_dirs, ["Pods/../.."])
|
|
assert_equal(Pod::UI.collected_infoes, [
|
|
"This is",
|
|
"the text",
|
|
"returned by",
|
|
"prepare-hermes-for-build",
|
|
])
|
|
assert_equal($podInvocationCount, 4)
|
|
assert_equal($podInvocation["React-jsi"][:path], "../../ReactCommon/jsi")
|
|
assert_equal($podInvocation["React-hermes"][:path], "../../ReactCommon/hermes")
|
|
assert_equal($podInvocation["libevent"][:version], "~> 2.1.12")
|
|
assert_equal($podInvocation["hermes-engine"][:podspec], "../../sdks/hermes/hermes-engine.podspec")
|
|
end
|
|
|
|
def test_setupHermes_installsPods_installsFabricSubspecWhenFabricEnabled
|
|
# Arrange
|
|
fabric_enabled = true
|
|
|
|
# Act
|
|
setup_hermes!(:react_native_path => @react_native_path, :fabric_enabled => fabric_enabled)
|
|
|
|
# Assert
|
|
assert_equal($podInvocationCount, 4)
|
|
assert_equal($podInvocation["React-jsi"][:path], "../../ReactCommon/jsi")
|
|
assert_equal($podInvocation["hermes-engine"][:podspec], "../../sdks/hermes/hermes-engine.podspec")
|
|
assert_equal($podInvocation["React-hermes"][:path], "../../ReactCommon/hermes")
|
|
assert_equal($podInvocation["libevent"][:version], "~> 2.1.12")
|
|
end
|
|
end
|