From fa384b03faac221d9a98a64a5d998c652fc45aca Mon Sep 17 00:00:00 2001 From: Rylan Polster Date: Sat, 23 Jul 2022 02:00:28 +0200 Subject: [PATCH] Simplify `SimulateSystem` usage --- Library/Homebrew/extend/on_system.rb | 16 +-- Library/Homebrew/simulate_system.rb | 24 +++- Library/Homebrew/test/simulate_system_spec.rb | 118 ++++++++++++++++++ 3 files changed, 140 insertions(+), 18 deletions(-) create mode 100644 Library/Homebrew/test/simulate_system_spec.rb diff --git a/Library/Homebrew/extend/on_system.rb b/Library/Homebrew/extend/on_system.rb index 5ec59cbdfa..d151e26ddd 100644 --- a/Library/Homebrew/extend/on_system.rb +++ b/Library/Homebrew/extend/on_system.rb @@ -15,8 +15,7 @@ module OnSystem def arch_condition_met?(arch) raise ArgumentError, "Invalid arch condition: #{arch.inspect}" if ARCH_OPTIONS.exclude?(arch) - current_arch = Homebrew::SimulateSystem.arch || Hardware::CPU.type - arch == current_arch + arch == Homebrew::SimulateSystem.current_arch end sig { params(os_name: Symbol, or_condition: T.nilable(Symbol)).returns(T::Boolean) } @@ -26,14 +25,7 @@ module OnSystem return true if [:macos, *MacOSVersions::SYMBOLS.keys].include?(os_name) end - if BASE_OS_OPTIONS.include?(os_name) - if Homebrew::SimulateSystem.none? - return OS.linux? if os_name == :linux - return OS.mac? if os_name == :macos - end - - return Homebrew::SimulateSystem.send("#{os_name}?") - end + return Homebrew::SimulateSystem.send("treat_as_#{os_name}?") if BASE_OS_OPTIONS.include?(os_name) raise ArgumentError, "Invalid OS condition: #{os_name.inspect}" unless MacOSVersions::SYMBOLS.key?(os_name) @@ -41,10 +33,10 @@ module OnSystem raise ArgumentError, "Invalid OS `or_*` condition: #{or_condition.inspect}" end - return false if Homebrew::SimulateSystem.linux? || (Homebrew::SimulateSystem.none? && OS.linux?) + return false if Homebrew::SimulateSystem.treat_as_linux? base_os = MacOS::Version.from_symbol(os_name) - current_os = MacOS::Version.from_symbol(Homebrew::SimulateSystem.os || MacOS.version.to_sym) + current_os = MacOS::Version.from_symbol(Homebrew::SimulateSystem.current_os) return current_os >= base_os if or_condition == :or_newer return current_os <= base_os if or_condition == :or_older diff --git a/Library/Homebrew/simulate_system.rb b/Library/Homebrew/simulate_system.rb index d52a2af752..c93791afb9 100644 --- a/Library/Homebrew/simulate_system.rb +++ b/Library/Homebrew/simulate_system.rb @@ -32,19 +32,31 @@ module Homebrew end sig { returns(T::Boolean) } - def none? - @os.nil? && @arch.nil? - end + def treat_as_macos? + return OS.mac? if @os.blank? - sig { returns(T::Boolean) } - def macos? [:macos, *MacOSVersions::SYMBOLS.keys].include?(@os) end sig { returns(T::Boolean) } - def linux? + def treat_as_linux? + return OS.linux? if @os.blank? + @os == :linux end + + sig { returns(Symbol) } + def current_arch + @arch || Hardware::CPU.type + end + + sig { returns(Symbol) } + def current_os + return @os if @os.present? + return :linux if OS.linux? + + MacOS.version.to_sym + end end end end diff --git a/Library/Homebrew/test/simulate_system_spec.rb b/Library/Homebrew/test/simulate_system_spec.rb new file mode 100644 index 0000000000..9994b71fea --- /dev/null +++ b/Library/Homebrew/test/simulate_system_spec.rb @@ -0,0 +1,118 @@ +# typed: false +# frozen_string_literal: true + +require "settings" + +describe Homebrew::SimulateSystem do + after do + described_class.clear + end + + describe "::treat_as_macos?" do + it "returns true on macOS", :needs_macos do + described_class.clear + expect(described_class.treat_as_macos?).to be true + end + + it "returns false on Linux", :needs_linux do + described_class.clear + expect(described_class.treat_as_macos?).to be false + end + + it "returns false on macOS when simulating Linux", :needs_macos do + described_class.clear + described_class.os = :linux + expect(described_class.treat_as_macos?).to be false + end + + it "returns true on Linux when simulating a generic macOS version", :needs_linux do + described_class.clear + described_class.os = :macos + expect(described_class.treat_as_macos?).to be true + end + + it "returns true on Linux when simulating a specific macOS version", :needs_linux do + described_class.clear + described_class.os = :monterey + expect(described_class.treat_as_macos?).to be true + end + end + + describe "::treat_as_linux?" do + it "returns true on Linux", :needs_linux do + described_class.clear + expect(described_class.treat_as_linux?).to be true + end + + it "returns false on macOS", :needs_macos do + described_class.clear + expect(described_class.treat_as_linux?).to be false + end + + it "returns true on macOS when simulating Linux", :needs_macos do + described_class.clear + described_class.os = :linux + expect(described_class.treat_as_linux?).to be true + end + + it "returns false on Linux when simulating a generic macOS version", :needs_linux do + described_class.clear + described_class.os = :macos + expect(described_class.treat_as_linux?).to be false + end + + it "returns false on Linux when simulating a specific macOS version", :needs_linux do + described_class.clear + described_class.os = :monterey + expect(described_class.treat_as_linux?).to be false + end + end + + describe "::current_arch" do + it "returns the current architecture" do + described_class.clear + expect(described_class.current_arch).to eq Hardware::CPU.type + end + + it "returns the simulated architecture" do + described_class.clear + simulated_arch = if Hardware::CPU.arm? + :intel + else + :arm + end + described_class.arch = simulated_arch + expect(described_class.current_arch).to eq simulated_arch + end + end + + describe "::current_os" do + it "returns the current macOS version on macOS", :needs_macos do + described_class.clear + expect(described_class.current_os).to eq MacOS.version.to_sym + end + + it "returns `:linux` on Linux", :needs_linux do + described_class.clear + expect(described_class.current_os).to eq :linux + end + + it "returns `:linux` when simulating Linux on macOS", :needs_macos do + described_class.clear + described_class.os = :linux + expect(described_class.current_os).to eq :linux + end + + it "returns `:macos` when simulating a generic macOS version on Linux", :needs_linux do + described_class.clear + described_class.os = :macos + expect(described_class.current_os).to eq :macos + end + + it "returns `:macos` when simulating a specific macOS version on Linux", :needs_linux do + described_class.clear + described_class.os = :monterey + expect(described_class.current_os).to eq :monterey + end + end +end