From f5d2d30f5bb13a673ca279b66572231458924a61 Mon Sep 17 00:00:00 2001 From: Douglas Eichelberger Date: Mon, 3 Feb 2025 06:40:13 -0800 Subject: [PATCH] Add test for concurrent fetching --- Library/Homebrew/test/cmd/fetch_spec.rb | 22 ++++++++++++++++++ .../fixtures/tarballs/testball2-0.1-linux.tbz | Bin 0 -> 3253 bytes .../tarballs/testball2-0.1-patches.tgz | Bin 0 -> 368 bytes .../fixtures/tarballs/testball2-0.1.tbz | Bin 0 -> 1318 bytes .../spec/shared_context/integration_test.rb | 6 +++-- 5 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball2-0.1-linux.tbz create mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball2-0.1-patches.tgz create mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball2-0.1.tbz diff --git a/Library/Homebrew/test/cmd/fetch_spec.rb b/Library/Homebrew/test/cmd/fetch_spec.rb index 7b0cc3de7a..c264a66147 100644 --- a/Library/Homebrew/test/cmd/fetch_spec.rb +++ b/Library/Homebrew/test/cmd/fetch_spec.rb @@ -14,4 +14,26 @@ RSpec.describe Homebrew::Cmd::FetchCmd do expect(HOMEBREW_CACHE/"testball--0.1.tbz").to be_a_symlink expect(HOMEBREW_CACHE/"testball--0.1.tbz").to exist end + + it "concurrently downloads formula URLs", :integration_test do + setup_test_formula "testball1" + setup_test_formula "testball2" + + expect { brew "fetch", "testball1", "testball2", "--concurrency=2" }.to be_a_success + + expect(HOMEBREW_CACHE/"testball1--0.1.tbz").to be_a_symlink + expect(HOMEBREW_CACHE/"testball1--0.1.tbz").to exist + expect(HOMEBREW_CACHE/"testball2--0.1.tbz").to be_a_symlink + expect(HOMEBREW_CACHE/"testball2--0.1.tbz").to exist + end + + it "errors when concurrently downloading to the same destination", :integration_test do + # This test will fail if the fetch is not performed concurrently. + # N.B. this test relies on how we set up test formulae, see the `integration_test` shared context. + setup_test_formula "testball1" + setup_test_formula "testball3" + + expect { brew "fetch", "testball1", "testball3", "--concurrency=2" }.to be_a_failure + .and output(/Error:.*process has already locked/).to_stderr + end end diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball2-0.1-linux.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball2-0.1-linux.tbz new file mode 100644 index 0000000000000000000000000000000000000000..5ca2be071ffdf1e8ea0ac84e7de32eaaa1025bb6 GIT binary patch literal 3253 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 literal 0 HcmV?d00001 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 1d7edccdea..8c5c1740d2 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 @@ -134,10 +134,12 @@ RSpec.shared_context "integration test" do # rubocop:disable RSpec/ContextWordin bottle_block: nil, tab_attributes: nil) case name when /^testball/ + # Use a different tarball for testball2 to avoid lock errors when writing concurrency tests + prefix = (name == "testball2") ? "testball2" : "testball" tarball = if OS.linux? - TEST_FIXTURE_DIR/"tarballs/testball-0.1-linux.tbz" + TEST_FIXTURE_DIR/"tarballs/#{prefix}-0.1-linux.tbz" else - TEST_FIXTURE_DIR/"tarballs/testball-0.1.tbz" + TEST_FIXTURE_DIR/"tarballs/#{prefix}-0.1.tbz" end content = <<~RUBY desc "Some test"