66
77module Cibuildgem
88 class CLITest < Minitest ::Test
9+ TEST_CONTENT_ADDRESSABLE_ENV = "CIBUILDGEM_CONTENT_ADDRESSABLE"
10+
911 def setup
1012 super
1113
@@ -14,6 +16,7 @@ def setup
1416
1517 def teardown
1618 ENV . delete ( "RUBY_CC_VERSION" )
19+ ENV . delete ( TEST_CONTENT_ADDRESSABLE_ENV )
1720
1821 super
1922 end
@@ -303,69 +306,42 @@ def test_package_when_a_rakefile_defines_an_extension_task
303306 assert_predicate ( $CHILD_STATUS, :success? )
304307 end
305308
306- def test_package_single_abi_runs_rake_tasks_for_each_ruby_version
309+ def test_package_single_abi_enables_content_addressable_packaging_for_one_rake_run
307310 cli = CLI . new ( [ ] , { "include-single-abi" => true } )
308- compilation_task = Struct . new ( :ruby_cc_version , :ruby_versions ) . new ( "3.3.8:3.2.8" , [
309- Gem ::Version . new ( "3.3.8" ) ,
310- Gem ::Version . new ( "3.2.8" ) ,
311- ] )
311+ compilation_task = Struct . new ( :ruby_cc_version ) . new ( "3.3.8:3.2.8" )
312312 rake_calls = [ ]
313- gem_globs = [ ]
314313 run_rake_tasks = proc do |*tasks |
315- rake_calls << [ ENV . fetch ( "RUBY_CC_VERSION" ) , tasks ]
316- end
317- find_built_gems = proc do | glob |
318- gem_globs << glob
319- [ glob . sub ( "*" , "built" ) ]
314+ rake_calls << [
315+ ENV . fetch ( "RUBY_CC_VERSION" ) ,
316+ ENV . fetch ( TEST_CONTENT_ADDRESSABLE_ENV ) ,
317+ tasks ,
318+ ]
320319 end
321320
322321 cli . stub ( :compilation_task , compilation_task ) do
323322 cli . stub ( :run_rake_tasks! , run_rake_tasks ) do
324- Dir . stub ( :glob , find_built_gems ) do
325- cli . package
326- end
323+ cli . package
327324 end
328325 end
329326
330- expected_tasks = [ "cibuildgem:setup" , :cross , :native , :gem ]
331327 assert_equal (
332- [
333- [ "3.3.8:3.2.8" , expected_tasks ] ,
334- [ "3.3.8" , expected_tasks ] ,
335- [ "3.2.8" , expected_tasks ] ,
336- ] ,
328+ [ [ "3.3.8:3.2.8" , "true" , [ "cibuildgem:setup" , :cross , :native , :gem ] ] ] ,
337329 rake_calls ,
338330 )
339- assert_equal ( [ "pkg/3.3/*.gem" , "pkg/3.2/*.gem" ] , gem_globs )
331+ assert_nil ( ENV [ TEST_CONTENT_ADDRESSABLE_ENV ] )
340332 end
341333
342- def test_package_single_abi_fails_when_no_single_abi_gem_is_built
343- cli = CLI . new ( [ ] , { "include-single-abi" => true } )
344- compilation_task = Struct . new ( :ruby_cc_version , :ruby_versions ) . new (
345- "3.3.8" ,
346- [ Gem ::Version . new ( "3.3.8" ) ] ,
347- )
348-
349- error = cli . stub ( :compilation_task , compilation_task ) do
350- cli . stub ( :run_rake_tasks! , nil ) do
351- Dir . stub ( :glob , [ ] ) do
352- assert_raises ( RuntimeError ) { cli . package }
353- end
354- end
355- end
356-
357- assert_equal (
358- "Could not build a single-ABI gem for Ruby 3.3. Ensure RubyGems and rake-compiler support content-addressable gems." ,
359- error . message ,
360- )
361- end
362-
363- def test_package_defaults_to_multi_abi
334+ def test_package_defaults_to_multi_abi_and_preserves_ruby_cc_version_from_environment
335+ ENV [ "RUBY_CC_VERSION" ] = "3.1.6"
364336 cli = CLI . new
365337 compilation_task = Struct . new ( :ruby_cc_version ) . new ( "3.3.8:3.2.8" )
366338 rake_calls = [ ]
367339 run_rake_tasks = proc do |*tasks |
368- rake_calls << [ ENV . fetch ( "RUBY_CC_VERSION" ) , tasks ]
340+ rake_calls << [
341+ ENV . fetch ( "RUBY_CC_VERSION" ) ,
342+ ENV . fetch ( TEST_CONTENT_ADDRESSABLE_ENV ) ,
343+ tasks ,
344+ ]
369345 end
370346
371347 cli . stub ( :compilation_task , compilation_task ) do
@@ -375,27 +351,56 @@ def test_package_defaults_to_multi_abi
375351 end
376352
377353 assert_equal (
378- [ [ "3.3.8:3.2.8 " , [ "cibuildgem:setup" , :cross , :native , :gem ] ] ] ,
354+ [ [ "3.1.6" , "false ", [ "cibuildgem:setup" , :cross , :native , :gem ] ] ] ,
379355 rake_calls ,
380356 )
381357 end
382358
383- def test_package_multi_abi_preserves_ruby_cc_version_from_environment
384- ENV [ "RUBY_CC_VERSION" ] = "3.1.6"
385- cli = CLI . new
386- compilation_task = Struct . new ( :ruby_cc_version ) . new ( "3.3.8:3.2.8" )
387- ruby_cc_versions_used = [ ]
388- run_rake_tasks = proc do |*|
389- ruby_cc_versions_used << ENV . fetch ( "RUBY_CC_VERSION" )
359+ def test_compilation_task_enables_content_addressable_extension_task
360+ require "cibuildgem/extension_patch"
361+
362+ extension_task = Class . new do
363+ attr_accessor :config_script , :content_addressable , :cross_compile , :cross_platform , :ext_dir , :gem_spec ,
364+ :lib_dir , :name , :no_native
365+
366+ def define ; end
367+ end . new
368+ original_current = Rake ::ExtensionTask . current
369+
370+ Dir . chdir ( "test/fixtures/with_ext" ) do
371+ Rake ::ExtensionTask . current = extension_task
372+ CompilationTasks . new ( false , nil , content_addressable : true ) . setup
390373 end
391374
392- cli . stub ( :compilation_task , compilation_task ) do
393- cli . stub ( :run_rake_tasks! , run_rake_tasks ) do
394- cli . package
375+ assert_equal ( true , extension_task . content_addressable )
376+ ensure
377+ Rake ::ExtensionTask . current = original_current if Rake ::ExtensionTask . respond_to? ( :current= )
378+ Rake ::Task . clear
379+ end
380+
381+ def test_compilation_task_warns_when_rake_compiler_does_not_support_content_addressable
382+ require "cibuildgem/extension_patch"
383+
384+ extension_task = Class . new do
385+ attr_accessor :config_script , :cross_compile , :cross_platform , :ext_dir , :gem_spec ,
386+ :lib_dir , :name , :no_native
387+
388+ def define ; end
389+ end . new
390+ original_current = Rake ::ExtensionTask . current
391+
392+ _ , err = capture_io do
393+ Dir . chdir ( "test/fixtures/with_ext" ) do
394+ Rake ::ExtensionTask . current = extension_task
395+ CompilationTasks . new ( false , nil , content_addressable : true ) . setup
395396 end
396397 end
397398
398- assert_equal ( [ "3.1.6" ] , ruby_cc_versions_used )
399+ assert_includes ( err , "content-addressable packaging was requested" )
400+ assert_includes ( err , "Upgrade rake-compiler" )
401+ ensure
402+ Rake ::ExtensionTask . current = original_current if Rake ::ExtensionTask . respond_to? ( :current= )
403+ Rake ::Task . clear
399404 end
400405
401406 def test_keep_the_extension_task_config_defined_by_the_gem
0 commit comments