From 19134b300574a2e1553c8a655b76f22740dfc6c7 Mon Sep 17 00:00:00 2001 From: thibhero Date: Sat, 31 May 2025 12:54:53 -0400 Subject: [PATCH] making tests more robust with bottles to verify the whole hierarchy oh dependencies and dependants is upgraded as expected --- Library/Homebrew/test/cmd/install_spec.rb | 9 +- Library/Homebrew/test/cmd/upgrade_spec.rb | 84 ++++++++++++++++++- .../spec/shared_context/integration_test.rb | 43 +++++++--- 3 files changed, 117 insertions(+), 19 deletions(-) diff --git a/Library/Homebrew/test/cmd/install_spec.rb b/Library/Homebrew/test/cmd/install_spec.rb index ef74f06cc3..d9768624f1 100644 --- a/Library/Homebrew/test/cmd/install_spec.rb +++ b/Library/Homebrew/test/cmd/install_spec.rb @@ -97,10 +97,13 @@ RSpec.describe Homebrew::Cmd::InstallCmd do end it "installs with asking for user prompts with installed dependent checks", :integration_test do + setup_test_formula "testball-parent", <<~RUBY + depends_on "testball1" + RUBY + setup_test_formula "testball1", <<~RUBY depends_on "testball5" - # should work as its not building but test doesnt pass if dependant - # depends_on "build" => :build + depends_on "testball-build" => :build depends_on "installed" RUBY setup_test_formula "installed" @@ -109,7 +112,7 @@ RSpec.describe Homebrew::Cmd::InstallCmd do RUBY setup_test_formula "testball4", "" setup_test_formula "hiop" - setup_test_formula "build" + setup_test_formula "testball-build", "" # Mock `Formula#any_version_installed?` by creating the tab in a plausible keg directory keg_dir = HOMEBREW_CELLAR/"installed"/"1.0" diff --git a/Library/Homebrew/test/cmd/upgrade_spec.rb b/Library/Homebrew/test/cmd/upgrade_spec.rb index 59918aaf02..fa50430084 100644 --- a/Library/Homebrew/test/cmd/upgrade_spec.rb +++ b/Library/Homebrew/test/cmd/upgrade_spec.rb @@ -29,11 +29,11 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do expect(HOMEBREW_CELLAR/"testball/0.0.1").not_to exist end - it "upgrades with asking for user prompts with dependants checks", :integration_test do + it "upgrades dependencies with asking for user prompts", :integration_test do setup_test_formula "testball", <<~RUBY depends_on "testball5" # should work as its not building but test doesnt pass if dependant - # depends_on "build" => :build + depends_on "testball-build" => :build depends_on "installed" RUBY setup_test_formula "installed" @@ -42,7 +42,7 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do RUBY setup_test_formula "testball4" setup_test_formula "hiop" - setup_test_formula "build" + setup_test_formula "testball-build" (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath (HOMEBREW_CELLAR/"testball5/0.0.1/foo").mkpath @@ -72,4 +72,82 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do expect(HOMEBREW_CELLAR/"testball4/0.1").to be_a_directory expect(HOMEBREW_CELLAR/"testball4/0.0.1").not_to exist end + + it "upgrades only the ‘testball’ formula, prompts for dependent checks, and verifies that other fields are updated", + :integration_test do + content = <<~RUBY + version "0.1" + depends_on "testball-parent" + RUBY + setup_test_formula "testball-parent-parent", content, testball_bottle: true + content = <<~RUBY + version "0.1" + depends_on "testball" + RUBY + setup_test_formula "testball-parent", content, testball_bottle: true + + content = <<~RUBY + depends_on "testball5" + # should work as its not building but test doesnt pass if dependant + # depends_on "build" => :build + depends_on "installed" + version "0.1" + RUBY + setup_test_formula "testball", content, testball_bottle: true + setup_test_formula "installed" + + content = <<~RUBY + version "0.1" + depends_on "testball4" + RUBY + setup_test_formula "testball5", content, testball_bottle: true + content = <<~RUBY + version "0.1" + RUBY + setup_test_formula "testball4", content, testball_bottle: true + setup_test_formula "hiop" + setup_test_formula "build" + + (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath + (HOMEBREW_CELLAR/"testball5/0.0.1/foo").mkpath + (HOMEBREW_CELLAR/"testball4/0.0.1/foo").mkpath + (HOMEBREW_CELLAR/"testball-parent/0.0.1/foo").mkpath + (HOMEBREW_CELLAR/"testball-parent-parent/0.0.1/foo").mkpath + + keg_dir = HOMEBREW_CELLAR/"installed"/"1.0" + keg_dir.mkpath + touch keg_dir/AbstractTab::FILENAME + + regex = / + Formulae\s*\(5\):\s* + (testball|testball5|testball4|testball-parent|testball-parent-parent) + \s*,\s* + ((?!\1)testball|testball5|testball4|testball-parent|testball-parent-parent) + \s*,\s* + ((?!\1|\2)testball|testball5|testball4|testball-parent|testball-parent-parent) + \s*,\s* + ((?!\1|\2|\3)testball|testball5|testball4|testball-parent|testball-parent-parent) + \s*,\s* + ((?!\1|\2|\3|\4)testball|testball5|testball4|testball-parent|testball-parent-parent) + /x + expect do + brew "upgrade", "--ask", "testball" + end.to output(regex) + .to_stdout.and not_to_output.to_stderr + + expect(HOMEBREW_CELLAR/"testball/0.1").to be_a_directory + expect(HOMEBREW_CELLAR/"testball/0.0.1").not_to exist + expect(HOMEBREW_CELLAR/"testball5/0.1").to be_a_directory + expect(HOMEBREW_CELLAR/"testball4/0.1").to be_a_directory + expect(HOMEBREW_CELLAR/"testball-parent/0.1").to be_a_directory + expect(HOMEBREW_CELLAR/"testball-parent/0.0.1").not_to exist + expect(HOMEBREW_CELLAR/"testball-parent-parent/0.1").to be_a_directory + expect(HOMEBREW_CELLAR/"testball-parent-parent/0.0.1").not_to exist + + # Those directories shouldn't exist anymore + # brew upgrade testball remove testball directory but not the following one + # Cleanup isn't applied on the dependencies + # expect(HOMEBREW_CELLAR/"testball5/0.0.1").not_to exist + # expect(HOMEBREW_CELLAR/"testball4/0.0.1").not_to exist + end end diff --git a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb index f8f3b0f60a..707831b799 100644 --- a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb +++ b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb @@ -130,33 +130,50 @@ RSpec.shared_context "integration test" do # rubocop:disable RSpec/ContextWordin end end - def setup_test_formula(name, content = nil, tap: CoreTap.instance, + def setup_test_formula(name, content = nil, testball_bottle: false, tap: CoreTap.instance, bottle_block: nil, tab_attributes: nil) case name when /^testball/ - case name - when "testball4", "testball5" - prefix = name - program_name = name - when "testball2" - prefix = name - program_name = "test" + name_to_prog = { + "testball4" => "testball4", + "testball5" => "testball5", + "testball-build" => "testball-build", + "testball-parent" => "testball-parent", + "testball-parent-parent" => "testball-parent-parent", + "testball2" => "test", + } + + if (prog = name_to_prog[name]) + prefix = name + program_name = prog else - prefix = "testball" + prefix = "testball" program_name = "test" end - tarball_name = "#{prefix}-0.1#{"-linux" if OS.linux?}.tbz" + tarball_name = "#{prefix}-0.1.tbz" tarball = TEST_FIXTURE_DIR / "tarballs/#{tarball_name}" content = <<~RUBY desc "Some test" homepage "https://brew.sh/#{name}" url "file://#{tarball}" - sha256 "#{tarball.sha256}" - + #{ unless testball_bottle + <<~SHA_BLOCK + sha256 "#{tarball.sha256}" + SHA_BLOCK + end } option "with-foo", "Build with foo" - #{bottle_block} + #{ if testball_bottle + tarball_bottle_name = "#{prefix}-0.1.all.bottle.tar.gz" + tarball_bottle = TEST_FIXTURE_DIR / "tarballs/#{tarball_bottle_name}" + <<~BOTTLE_BLOCK + bottle do + root_url "file://#{TEST_FIXTURE_DIR}/tarballs" + sha256 cellar: :any, all: "#{tarball_bottle.sha256}" + end + BOTTLE_BLOCK + end }#{bottle_block} def install (prefix/"foo"/"#{program_name}").write("#{program_name}") if build.with? "foo" prefix.install Dir["*"]