Skip to content

Commit

Permalink
Move Flipper to dedicated flipper.rb
Browse files Browse the repository at this point in the history
Summary:
This Diff moves all the Flipper.rb related setup in the cocoapods scripts to a dedicated script.

It also removes the not needed dummy files and add tests for flipper.

## Changelog

[iOS][Internal] - Extract Flipper setup in a separate file and add tests

Reviewed By: cortinico

Differential Revision: D36129808

fbshipit-source-id: 5446203a69b527146c893aa9611e98688e20b778
  • Loading branch information
Riccardo Cipolleschi authored and facebook-github-bot committed May 9, 2022
1 parent 0d9e054 commit d96806b
Show file tree
Hide file tree
Showing 9 changed files with 374 additions and 104 deletions.
12 changes: 0 additions & 12 deletions scripts/cocoapods/__tests__/dummy_test-test.rb

This file was deleted.

12 changes: 0 additions & 12 deletions scripts/cocoapods/__tests__/dummy_test2-test.rb

This file was deleted.

162 changes: 162 additions & 0 deletions scripts/cocoapods/__tests__/flipper-test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
# 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 "../flipper.rb"
require_relative "./test_utils/podSpy.rb"
require_relative "./test_utils/InstallerMock.rb"

class FlipperTests < Test::Unit::TestCase
def setup
podSpy_cleanUp()
end

# =========================== #
# TEST - Install Dependencies #
# =========================== #
def test_installFlipperDependencies_whenProductionIsFalse_installDependencies
# Act
install_flipper_dependencies(false, '../..')

# Assert
assert_equal($podInvocationCount, 1)
assert_equal($podInvocation['React-Core/DevSupport'][:path], "../../" )
end

def test_installFlipperDependencies_whenProductionIsTrue_skipDependencies
# Act
install_flipper_dependencies(true, '../..')

# Assert
assert_equal($podInvocationCount, 0)
assert_true($podInvocation.empty?)
end

# ======================= #
# TEST - Use Flipper Pods #
# ======================= #

def test_UseFlipperPods_WithDefaultValues_InstallsPods
# Arrange
configurations = ['Debug']

# Act
use_flipper_pods()

# Assert
check_all_flipper_pods($flipper_default_versions, configurations)
# the number of times the `pod` function has been invoked to install a dependency
assert_equal($podInvocationCount, 22)
end

def test_UseFlipperPods_WithCustomValues_InstallsPods
# Arrange
versions = {
"Flipper" => "1.0.0",
"Flipper-Boost-iOSX" => "1.1.0",
"Flipper-DoubleConversion" => "1.1.1",
"Flipper-Fmt" => "1.2.1",
"Flipper-Folly" => "2.1.1",
"Flipper-Glog" => "0.1.2",
"Flipper-PeerTalk" => "0.0.1",
"Flipper-RSocket" => "0.1.4",
"OpenSSL-Universal" => "2.2.2200",
}
configurations = ['Debug', 'CI']

# Act
use_flipper_pods(versions, :configurations => configurations)

# Assert
check_all_flipper_pods(versions, configurations)
# the number of times the `pod` function has been invoked to install a dependency
assert_equal($podInvocationCount, 22)
end

# ================= #
# Test Post Install #
# ================= #

def test_postInstall_updatesThePodCorrectly
# Arrange
installer = prepare_mocked_installer

# Act
flipper_post_install(installer)

# Assert
yoga_target = installer.target_with_name("YogaKit")
yoga_target.build_configurations.each do |config|
assert_equal(config.build_settings['SWIFT_VERSION'], '4.1')
end

reactCore_target = installer.target_with_name("React-Core")
reactCore_target.build_configurations.each do |config|
if config.name == 'Debug' then
assert_equal(config.build_settings['OTHER_CFLAGS'], "$(inherited) -DFB_SONARKIT_ENABLED=1")
else
assert_true(config.build_settings.empty?)
end
end
end

# ======= #
# HELPERS #
# ======= #

def check_all_flipper_pods(versions, configurations)
check_flipper_pod('Flipper', versions['Flipper'], configurations)
check_flipper_pod('FlipperKit', versions['Flipper'], configurations)
check_flipper_pod('FlipperKit/FlipperKitLayoutPlugin', versions['Flipper'], configurations)
check_flipper_pod('FlipperKit/SKIOSNetworkPlugin', versions['Flipper'], configurations)
check_flipper_pod('FlipperKit/FlipperKitUserDefaultsPlugin', versions['Flipper'], configurations)
check_flipper_pod('FlipperKit/FlipperKitReactPlugin', versions['Flipper'], configurations)
check_flipper_pod('FlipperKit/Core', versions['Flipper'], configurations)
check_flipper_pod('FlipperKit/CppBridge', versions['Flipper'], configurations)
check_flipper_pod('FlipperKit/FBCxxFollyDynamicConvert', versions['Flipper'], configurations)
check_flipper_pod('FlipperKit/FBDefines', versions['Flipper'], configurations)
check_flipper_pod('FlipperKit/FKPortForwarding', versions['Flipper'], configurations)
check_flipper_pod('FlipperKit/FlipperKitHighlightOverlay', versions['Flipper'], configurations)
check_flipper_pod('FlipperKit/FlipperKitLayoutTextSearchable', versions['Flipper'], configurations)
check_flipper_pod('FlipperKit/FlipperKitNetworkPlugin', versions['Flipper'], configurations)
check_flipper_pod('Flipper-Boost-iOSX', versions['Flipper-Boost-iOSX'], configurations)
check_flipper_pod('Flipper-DoubleConversion', versions['Flipper-DoubleConversion'], configurations)
check_flipper_pod('Flipper-Fmt', versions['Flipper-Fmt'], configurations)
check_flipper_pod('Flipper-Folly', versions['Flipper-Folly'], configurations)
check_flipper_pod('Flipper-Glog', versions['Flipper-Glog'], configurations)
check_flipper_pod('Flipper-PeerTalk', versions['Flipper-PeerTalk'], configurations)
check_flipper_pod('Flipper-RSocket', versions['Flipper-RSocket'], configurations)
check_flipper_pod('OpenSSL-Universal', versions['OpenSSL-Universal'], configurations)
end

def check_flipper_pod(name, expectedVersion, expectedConfigurations)
params = $podInvocation[name]
assert_equal(params[:version], expectedVersion)
assert_equal(params[:configurations], expectedConfigurations)
end

def prepare_mocked_installer
return InstallerMock.new(
PodsProjectMock.new([
TargetMock.new(
"YogaKit",
[
BuildConfigurationMock.new("Debug"),
BuildConfigurationMock.new("Release"),
]
),
TargetMock.new(
"React-Core",
[
BuildConfigurationMock.new("Debug"),
BuildConfigurationMock.new("Release"),
]
)
]
)
)
end

end
12 changes: 0 additions & 12 deletions scripts/cocoapods/__tests__/subfolder/dummy_test3-test.rb

This file was deleted.

79 changes: 79 additions & 0 deletions scripts/cocoapods/__tests__/test_utils/InstallerMock.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# 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.


# This file replicate the structure of the Installer used Cocoapods in the post_install step.
#
# To use it, add `require_relative path/to/InstallerMock.rb` into your test file
#
# ## Initialization
# You can create a new mock with the `InstallerMock.new` statement. In this case, you will
# create an empty mock.
#
# It's possible to create complex with the initializer. To create an Installer with a pod, for example, we can
# use the following code:
#
# ```ruby
# installer = Installer.new(
# PodsProjectMock.new([
# TargetMock.new(
# "MyPod",
# [
# BuildConfigurationMock.new("Debug"),
# ]
# )
# )
# )
# ```
#
# ## Assert
# All the properties of these objects are accessible in read mode.
# To access the target's list, for example, you can use the following line:
#
# ```ruby
# targets = installer.pods_project.targets
# ```

class InstallerMock
attr_reader :pods_project

def initialize(pods_project = PodsProjectMock.new)
@pods_project = pods_project
end

def target_with_name(name)
return @pods_project.targets
.select { |target| target.name == name }
.first
end
end

class PodsProjectMock
attr_reader :targets

def initialize(targets = [])
@targets = targets
end
end

class TargetMock
attr_reader :name
attr_reader :build_configurations

def initialize(name, build_configurations = [])
@name = name
@build_configurations = build_configurations
end
end

class BuildConfigurationMock
attr_reader :name
attr_reader :build_settings

def initialize(name, build_settings = {})
@name = name
@build_settings = build_settings
end
end
36 changes: 36 additions & 0 deletions scripts/cocoapods/__tests__/test_utils/podSpy.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# 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.

# This file contains the utilities required to mock properly the
# usage of the `pod` function.
#
# To use this file, just add `require_relative "path/to/podSpy.rb"` to your test file.
#
# Remember to invoke `podSpy_cleanUp` in your setup/teardown method, to start from a clean situation.
#
# Whenever your ruby script uses the `pod` function, the invocation is recorded in the `$podInvocation` global
# variable. A $podInvocationCount counter is increased as well.
#
# You can assert against these variables to check:
# * The `pod` function has been invoked X times: `assert_equal($podInvocationCount, X)`
# * A specific pod has been installed: `assert_equal($podInvocation["MyPod"][:version], "15.4.6")`


$podInvocation = {}
$podInvocationCount = 0

def podSpy_cleanUp
$podInvocation = {}
$podInvocationCount = 0
end

def pod(name, version = nil, path: nil, configurations: nil)
$podInvocationCount += 1
params = {}
if version != nil then params[:version] = version end
if path != nil then params[:path] = path end
if configurations != nil then params[:configurations] = configurations end
$podInvocation[name] = params
end
Loading

0 comments on commit d96806b

Please sign in to comment.