summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rodríguez <[email protected]>2025-06-18 11:22:54 +0200
committerHiroshi SHIBATA <[email protected]>2025-06-23 11:06:57 +0900
commit7c115b8633cd32def0f6b4bd4e33b4b2db864b62 ()
tree502fb3f40ef4309d6fde57ffacf5073093573ee4
parent353fa6f0bab278d9bd5bd8bd073b31f586116600 (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.rb97
-rw-r--r--spec/bundler/support/artifice/compact_index_mirror_down.rb21
-rw-r--r--spec/bundler/support/artifice/helpers/endpoint.rb2
-rw-r--r--spec/bundler/support/hax.rb14
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