diff options
author | David RodrÃguez <[email protected]> | 2025-06-18 11:22:54 +0200 |
---|---|---|
committer | Hiroshi SHIBATA <[email protected]> | 2025-06-23 11:06:57 +0900 |
commit | 7c115b8633cd32def0f6b4bd4e33b4b2db864b62 () | |
tree | 502fb3f40ef4309d6fde57ffacf5073093573ee4 | |
parent | 353fa6f0bab278d9bd5bd8bd073b31f586116600 (diff) |
[rubygems/rubygems] Fix flaky test failures in mirror probing specs
The mirror probing spec file was moved to our regular suite, which runs in parallel, recently. These specs rely on starting and stopping actual servers in localhost, but this does not play nice with parallelization, because a spec may kill the webserver another spec has created. This commit moves mirror probing specs to not need to start servers in localhost and do something more similar to what the other specs do. https://.com/rubygems/rubygems/commit/ca9a19706f
-rw-r--r-- | spec/bundler/install/gems/mirror_probe_spec.rb | 97 | ||||
-rw-r--r-- | spec/bundler/support/artifice/compact_index_mirror_down.rb | 21 | ||||
-rw-r--r-- | spec/bundler/support/artifice/helpers/endpoint.rb | 2 | ||||
-rw-r--r-- | spec/bundler/support/hax.rb | 14 |
4 files changed, 54 insertions, 80 deletions
@@ -1,33 +1,23 @@ # frozen_string_literal: true RSpec.describe "fetching dependencies with a not available mirror" do - let(:host) { "127.0.0.1" } - before do - require_rack_test - setup_server - setup_mirror - end - after do - Artifice.deactivate - @server_thread.kill - @server_thread.join end context "with a specific fallback timeout" do before do - global_config("BUNDLE_MIRROR__HTTP://127__0__0__1:#{@server_port}/__FALLBACK_TIMEOUT/" => "true", - "BUNDLE_MIRROR__HTTP://127__0__0__1:#{@server_port}/" => @mirror_uri) end it "install a gem using the original uri when the mirror is not responding" do - gemfile <<-G - source "#{@server_uri}" - gem 'weakling' - G - - bundle :install, artifice: nil expect(out).to include("Installing weakling") expect(out).to include("Bundle complete") @@ -38,16 +28,11 @@ RSpec.describe "fetching dependencies with a not available mirror" do context "with a global fallback timeout" do before do global_config("BUNDLE_MIRROR__ALL__FALLBACK_TIMEOUT/" => "1", - "BUNDLE_MIRROR__ALL" => @mirror_uri) end it "install a gem using the original uri when the mirror is not responding" do - gemfile <<-G - source "#{@server_uri}" - gem 'weakling' - G - - bundle :install, artifice: nil expect(out).to include("Installing weakling") expect(out).to include("Bundle complete") @@ -57,73 +42,27 @@ RSpec.describe "fetching dependencies with a not available mirror" do context "with a specific mirror without a fallback timeout" do before do - global_config("BUNDLE_MIRROR__HTTP://127__0__0__1:#{@server_port}/" => @mirror_uri) end it "fails to install the gem with a timeout error when the mirror is not responding" do - gemfile <<-G - source "#{@server_uri}" - gem 'weakling' - G - bundle :install, artifice: nil, raise_on_error: false - - expect(out).to include("Fetching source index from #{@mirror_uri}") - - err_lines = err.split("\n") - expect(err_lines).to include(%r{\ARetrying fetcher due to error \(2/4\): Bundler::HTTPError Could not fetch specs from #{@mirror_uri}/ due to underlying error <}) - expect(err_lines).to include(%r{\ARetrying fetcher due to error \(3/4\): Bundler::HTTPError Could not fetch specs from #{@mirror_uri}/ due to underlying error <}) - expect(err_lines).to include(%r{\ARetrying fetcher due to error \(4/4\): Bundler::HTTPError Could not fetch specs from #{@mirror_uri}/ due to underlying error <}) - expect(err_lines).to include(%r{\ACould not fetch specs from #{@mirror_uri}/ due to underlying error <}) end end context "with a global mirror without a fallback timeout" do before do - global_config("BUNDLE_MIRROR__ALL" => @mirror_uri) end it "fails to install the gem with a timeout error when the mirror is not responding" do - gemfile <<-G - source "#{@server_uri}" - gem 'weakling' - G - - bundle :install, artifice: nil, raise_on_error: false - - expect(out).to include("Fetching source index from #{@mirror_uri}") - err_lines = err.split("\n") - expect(err_lines).to include(%r{\ARetrying fetcher due to error \(2/4\): Bundler::HTTPError Could not fetch specs from #{@mirror_uri}/ due to underlying error <}) - expect(err_lines).to include(%r{\ARetrying fetcher due to error \(3/4\): Bundler::HTTPError Could not fetch specs from #{@mirror_uri}/ due to underlying error <}) - expect(err_lines).to include(%r{\ARetrying fetcher due to error \(4/4\): Bundler::HTTPError Could not fetch specs from #{@mirror_uri}/ due to underlying error <}) - expect(err_lines).to include(%r{\ACould not fetch specs from #{@mirror_uri}/ due to underlying error <}) end end - - def setup_server - @server_port = find_unused_port - @server_uri = "http://#{host}:#{@server_port}" - - require_relative "../../support/artifice/compact_index" - require_relative "../../support/silent_logger" - - require "rackup/server" - - @server_thread = Thread.new do - Rackup::Server.start(app: CompactIndexAPI, - Host: host, - Port: @server_port, - server: "webrick", - AccessLog: [], - Logger: Spec::SilentLogger.new) - end.run - - wait_for_server(host, @server_port) - end - - def setup_mirror - @mirror_port = find_unused_port - @mirror_uri = "http://#{host}:#{@mirror_port}" - end end @@ -0,0 +1,21 @@ @@ -27,7 +27,7 @@ class Endpoint < Sinatra::Base set :raise_errors, true set :show_exceptions, false - set :host_authorization, permitted_hosts: [".example.org", ".local", ".repo", ".repo1", ".repo2", ".repo3", ".repo4", ".rubygems.org", ".security", ".source", ".test", "127.0.0.1"] def call!(*) super.tap do @@ -51,4 +51,18 @@ module Gem File.singleton_class.prepend ReadOnly end end |