blob: dca63e9b067ecd16c595e1ed55c8886cc28f046d [file] [log] [blame]
require File.expand_path('../../../spec_helper', __FILE__)
module Pod
describe AggregateTarget do
describe 'In general' do
before do
@target_definition = Podfile::TargetDefinition.new('Pods', nil)
@target_definition.abstract = false
@target = AggregateTarget.new(@target_definition, config.sandbox)
end
it 'returns the target_definition that generated it' do
@target.target_definition.should == @target_definition
end
it 'is initialized with empty archs' do
@target.archs.should == []
end
it 'returns the label of the target definition' do
@target.label.should == 'Pods'
end
it 'returns its name' do
@target.name.should == 'Pods'
end
it 'returns the name of its product' do
@target.product_name.should == 'libPods.a'
end
it 'returns the user targets' do
project_path = SpecHelper.fixture('SampleProject/SampleProject.xcodeproj')
@target.user_project = Xcodeproj::Project.open(project_path)
@target.user_target_uuids = ['A346496C14F9BE9A0080D870']
targets = @target.user_targets
targets.count.should == 1
targets.first.class.should == Xcodeproj::Project::PBXNativeTarget
end
end
describe 'Support files' do
before do
@target_definition = Podfile::TargetDefinition.new('Pods', nil)
@target_definition.abstract = false
@target = AggregateTarget.new(@target_definition, config.sandbox)
@target.client_root = config.sandbox.root.dirname
end
it 'returns the absolute path of the xcconfig file' do
@target.xcconfig_path('Release').to_s.should.include?('Pods/Target Support Files/Pods/Pods.release.xcconfig')
end
it 'returns the absolute path of the resources script' do
@target.copy_resources_script_path.to_s.should.include?('Pods/Target Support Files/Pods/Pods-resources.sh')
end
it 'returns the absolute path of the frameworks script' do
@target.embed_frameworks_script_path.to_s.should.include?('Pods/Target Support Files/Pods/Pods-frameworks.sh')
end
it 'returns the absolute path of the bridge support file' do
@target.bridge_support_path.to_s.should.include?('Pods/Target Support Files/Pods/Pods.bridgesupport')
end
it 'returns the absolute path of the acknowledgements files without extension' do
@target.acknowledgements_basepath.to_s.should.include?('Pods/Target Support Files/Pods/Pods-acknowledgements')
end
it 'returns the path of the resources script relative to the user project' do
@target.copy_resources_script_relative_path.should == '${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh'
end
it 'returns the path of the frameworks script relative to the user project' do
@target.embed_frameworks_script_relative_path.should == '${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh'
end
it 'returns the path of the xcconfig file relative to the user project' do
@target.xcconfig_relative_path('Release').should == 'Pods/Target Support Files/Pods/Pods.release.xcconfig'
end
it 'returns the path of output file for the check pod manifest file script' do
@target.check_manifest_lock_script_output_file_path.should == '$(DERIVED_FILE_DIR)/Pods-checkManifestLockResult.txt'
end
end
describe 'Pod targets' do
before do
@spec = fixture_spec('banana-lib/BananaLib.podspec')
@target_definition = Podfile::TargetDefinition.new('Pods', nil)
@target_definition.abstract = false
@pod_target = PodTarget.new([@spec], [@target_definition], config.sandbox)
@target = AggregateTarget.new(@target_definition, config.sandbox)
@target.stubs(:platform).returns(:ios)
@target.pod_targets = [@pod_target]
end
describe 'with configuration dependent pod targets' do
before do
@pod_target_release = PodTarget.new([@spec], [@target_definition], config.sandbox)
@pod_target_release.expects(:include_in_build_config?).with(@target_definition, 'Debug').returns(false)
@pod_target_release.expects(:include_in_build_config?).with(@target_definition, 'Release').returns(true)
@target.pod_targets = [@pod_target, @pod_target_release]
@target.user_build_configurations = {
'Debug' => :debug,
'Release' => :release,
}
end
it 'returns pod targets for given build configuration' do
@target.pod_targets_for_build_configuration('Debug').should == [@pod_target]
@target.pod_targets_for_build_configuration('Release').should == [@pod_target, @pod_target_release]
end
it 'returns pod target specs by build configuration' do
@target.specs_by_build_configuration.should == {
'Debug' => @pod_target.specs,
'Release' => (@pod_target.specs + @pod_target_release.specs),
}
end
end
describe 'frameworks by config and input output paths' do
before do
@coconut_spec = fixture_spec('coconut-lib/CoconutLib.podspec')
@pod_target_release = PodTarget.new([@coconut_spec], [@target_definition], config.sandbox)
@target.pod_targets = [@pod_target]
@target.user_build_configurations = {
'Debug' => :debug,
'Release' => :release,
}
end
it 'returns non vendored framework input and output paths by config' do
@pod_target.stubs(:should_build?).returns(true)
@pod_target.stubs(:requires_frameworks?).returns(true)
@target.framework_paths_by_config['Debug'].should == [
{ :name => 'BananaLib.framework',
:input_path => '${BUILT_PRODUCTS_DIR}/BananaLib/BananaLib.framework',
:output_path => '${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BananaLib.framework' },
]
@target.framework_paths_by_config['Release'].should == [
{ :name => 'BananaLib.framework',
:input_path => '${BUILT_PRODUCTS_DIR}/BananaLib/BananaLib.framework',
:output_path => '${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BananaLib.framework' },
]
end
it 'checks resource paths are empty for dynamic frameworks' do
@pod_target.stubs(:should_build?).returns(true)
@pod_target.stubs(:requires_frameworks?).returns(true)
@pod_target.stubs(:static_framework?).returns(false)
@pod_target.stubs(:resource_paths).returns(['MyResources.bundle'])
@target.stubs(:bridge_support_file).returns(nil)
resource_paths_by_config = @target.resource_paths_by_config
resource_paths_by_config['Debug'].should.be.empty
resource_paths_by_config['Release'].should.be.empty
end
it 'checks resource paths are included for static frameworks' do
@pod_target.stubs(:should_build?).returns(true)
@pod_target.stubs(:requires_frameworks?).returns(true)
@pod_target.stubs(:static_framework?).returns(true)
@pod_target.stubs(:resource_paths).returns(['MyResources.bundle'])
@target.stubs(:bridge_support_file).returns(nil)
resource_paths_by_config = @target.resource_paths_by_config
resource_paths_by_config['Debug'].should == ['MyResources.bundle']
resource_paths_by_config['Release'].should == ['MyResources.bundle']
end
it 'returns non vendored frameworks by config with different release and debug targets' do
@pod_target_release.stubs(:should_build?).returns(true)
@pod_target_release.stubs(:requires_frameworks?).returns(true)
@pod_target_release.expects(:include_in_build_config?).with(@target_definition, 'Debug').returns(false)
@pod_target_release.expects(:include_in_build_config?).with(@target_definition, 'Release').returns(true)
@pod_target.stubs(:should_build?).returns(true)
@pod_target.stubs(:requires_frameworks?).returns(true)
@target.pod_targets = [@pod_target, @pod_target_release]
framework_paths_by_config = @target.framework_paths_by_config
framework_paths_by_config['Debug'].should == [
{ :name => 'BananaLib.framework',
:input_path => '${BUILT_PRODUCTS_DIR}/BananaLib/BananaLib.framework',
:output_path => '${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BananaLib.framework' },
]
framework_paths_by_config['Release'].should == [
{ :name => 'BananaLib.framework',
:input_path => '${BUILT_PRODUCTS_DIR}/BananaLib/BananaLib.framework',
:output_path => '${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BananaLib.framework' },
{ :name => 'CoconutLib.framework',
:input_path => '${BUILT_PRODUCTS_DIR}/CoconutLib/CoconutLib.framework',
:output_path => '${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CoconutLib.framework' },
]
end
it 'returns vendored frameworks by config' do
path_list = Sandbox::PathList.new(fixture('banana-lib'))
file_accessor = Sandbox::FileAccessor.new(path_list, @spec.consumer(:ios))
@pod_target.file_accessors = [file_accessor]
@pod_target.file_accessors.first.stubs(:vendored_dynamic_artifacts).returns(
[Pathname('/some/absolute/path/to/FrameworkA.framework')],
)
@target.framework_paths_by_config['Debug'].should == [
{ :name => 'FrameworkA.framework',
:input_path => '${PODS_ROOT}/../../../../../../../some/absolute/path/to/FrameworkA.framework',
:output_path => '${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FrameworkA.framework' },
]
end
it 'returns correct input and output paths for non vendored frameworks' do
@pod_target.stubs(:should_build?).returns(true)
@pod_target.stubs(:requires_frameworks?).returns(true)
@target.framework_paths_by_config['Debug'].should == [
{ :name => 'BananaLib.framework',
:input_path => '${BUILT_PRODUCTS_DIR}/BananaLib/BananaLib.framework',
:output_path => '${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BananaLib.framework' },
]
@target.framework_paths_by_config['Release'].should == [
{ :name => 'BananaLib.framework',
:input_path => '${BUILT_PRODUCTS_DIR}/BananaLib/BananaLib.framework',
:output_path => '${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BananaLib.framework' },
]
end
it 'returns correct input and output paths for vendored frameworks' do
path_list = Sandbox::PathList.new(fixture('banana-lib'))
file_accessor = Sandbox::FileAccessor.new(path_list, @spec.consumer(:ios))
@pod_target.file_accessors = [file_accessor]
@pod_target.file_accessors.first.stubs(:vendored_dynamic_artifacts).returns(
[Pathname('/absolute/path/to/FrameworkA.framework')],
)
@target.framework_paths_by_config['Debug'].should == [
{ :name => 'FrameworkA.framework',
:input_path => '${PODS_ROOT}/../../../../../../../absolute/path/to/FrameworkA.framework',
:output_path => '${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FrameworkA.framework' },
]
end
end
it 'returns the specs of the Pods used by this aggregate target' do
@target.specs.map(&:name).should == ['BananaLib']
end
it 'returns the specs of the Pods used by this aggregate target' do
@target.specs.map(&:name).should == ['BananaLib']
end
it 'returns the spec consumers for the pod targets' do
consumer_reps = @target.spec_consumers.map { |consumer| [consumer.spec.name, consumer.platform_name] }
consumer_reps.should == [['BananaLib', :ios]]
end
end
describe 'Product type dependent helpers' do
describe 'With libraries' do
before do
@pod_target = fixture_pod_target('banana-lib/BananaLib.podspec')
@target = AggregateTarget.new(@pod_target.target_definitions.first, config.sandbox)
@target.pod_targets = [@pod_target]
end
it 'returns that it does not use swift' do
@target.uses_swift?.should == false
end
describe 'Host requires frameworks' do
before do
@target.host_requires_frameworks = true
end
it 'returns the product name' do
@target.product_name.should == 'Pods.framework'
end
it 'returns the framework name' do
@target.framework_name.should == 'Pods.framework'
end
it 'returns the library name' do
@target.static_library_name.should == 'libPods.a'
end
it 'returns :framework as product type' do
@target.product_type.should == :framework
end
it 'returns that it requires being built as framework' do
@target.requires_frameworks?.should == true
end
end
describe 'Host does not requires frameworks' do
it 'returns the product name' do
@target.product_name.should == 'libPods.a'
end
it 'returns the framework name' do
@target.framework_name.should == 'Pods.framework'
end
it 'returns the library name' do
@target.static_library_name.should == 'libPods.a'
end
it 'returns :static_library as product type' do
@target.product_type.should == :static_library
end
it 'returns that it does not require being built as framework' do
@target.requires_frameworks?.should == false
end
end
describe 'Target might require a host target' do
before do
target_definition = Podfile::TargetDefinition.new('Pods', nil)
target_definition.abstract = false
@target = AggregateTarget.new(target_definition, config.sandbox)
project_path = SpecHelper.fixture('SampleProject/SampleProject.xcodeproj')
@target.user_project = Xcodeproj::Project.open(project_path)
@target.user_target_uuids = ['A346496C14F9BE9A0080D870']
end
it 'requires a host target for app extension targets' do
@target.user_targets.first.stubs(:symbol_type).returns(:app_extension)
@target.requires_host_target?.should == true
end
it 'requires a host target for watch extension targets' do
@target.user_targets.first.stubs(:symbol_type).returns(:watch_extension)
@target.requires_host_target?.should == true
end
it 'requires a host target for framework targets' do
@target.user_targets.first.stubs(:symbol_type).returns(:framework)
@target.requires_host_target?.should == true
end
it 'requires a host target for messages extension targets' do
@target.user_targets.first.stubs(:symbol_type).returns(:messages_extension)
@target.requires_host_target?.should == true
end
it 'requires a host target for XPC service targets' do
@target.user_targets.first.stubs(:symbol_type).returns(:xpc_service)
@target.requires_host_target?.should == true
end
it 'does not require a host target for watch 2 extension targets' do
@target.user_targets.first.stubs(:symbol_type).returns(:watch2_extension)
@target.requires_host_target?.should == false
end
it 'does not require a host target for application targets' do
@target.user_targets.first.stubs(:symbol_type).returns(:application)
@target.requires_host_target?.should == false
end
it 'does not require a host target, if there is no user project (manual integration)' do
@target.user_project = nil
@target.user_target_uuids = []
@target.requires_host_target?.should == false
end
it 'raises an exception if more than one kind of user_target is found' do
@target.user_target_uuids << '51075D491521D0C100E39B41'
@target.user_targets.first.stubs(:symbol_type).returns(:app_extension)
@target.user_targets.last.stubs(:symbol_type).returns(:watch_extension)
should.raise ArgumentError do
@target.requires_host_target?
end.message.should.equal 'Expected single kind of user_target for Pods. Found app_extension, watch_extension.'
end
end
end
describe 'Target might be a library target' do
before do
target_definition = Podfile::TargetDefinition.new('Pods', nil)
target_definition.abstract = false
@target = AggregateTarget.new(target_definition, config.sandbox)
project_path = SpecHelper.fixture('SampleProject/SampleProject.xcodeproj')
@target.user_project = Xcodeproj::Project.open(project_path)
@target.user_target_uuids = ['A346496C14F9BE9A0080D870']
end
it 'is a library target if the user_target is a framework' do
@target.user_targets.first.stubs(:symbol_type).returns(:framework)
@target.library?.should == true
end
it 'is a library target if the user_target is a static library' do
@target.user_targets.first.stubs(:symbol_type).returns(:static_library)
@target.library?.should == true
end
it 'is a library target if the user_target is a dynamic library' do
@target.user_targets.first.stubs(:symbol_type).returns(:dynamic_library)
@target.library?.should == true
end
it 'is not a library target if the user_target is an application' do
@target.user_targets.first.stubs(:symbol_type).returns(:application)
@target.library?.should == false
end
it 'is not a library target if the user_target is an app extension' do
@target.user_targets.first.stubs(:symbol_type).returns(:app_extension)
@target.library?.should == false
end
end
describe 'With frameworks' do
before do
@pod_target = fixture_pod_target('orange-framework/OrangeFramework.podspec', [fixture_target_definition('iOS Example')])
@target = AggregateTarget.new(@pod_target.target_definitions.first, config.sandbox)
@target.stubs(:requires_frameworks?).returns(true)
@target.pod_targets = [@pod_target]
end
it 'returns that it uses swift' do
@target.uses_swift?.should == true
end
it 'returns the product module name' do
@target.product_module_name.should == 'Pods_iOS_Example'
end
it 'returns the product name' do
@target.product_name.should == 'Pods_iOS_Example.framework'
end
it 'returns the framework name' do
@target.framework_name.should == 'Pods_iOS_Example.framework'
end
it 'returns the library name' do
@target.static_library_name.should == 'libPods-iOS Example.a'
end
it 'returns :framework as product type' do
@target.product_type.should == :framework
end
it 'returns that it requires being built as framework' do
@target.requires_frameworks?.should == true
end
end
end
end
end