diff --git a/Library/Homebrew/test/os/mac/sdk_spec.rb b/Library/Homebrew/test/os/mac/sdk_spec.rb new file mode 100644 index 0000000000..55c18aa221 --- /dev/null +++ b/Library/Homebrew/test/os/mac/sdk_spec.rb @@ -0,0 +1,97 @@ +# typed: false +# frozen_string_literal: true + +describe OS::Mac::CLTSDKLocator do + subject(:locator) { described_class.new } + + let(:big_sur_sdk) { OS::Mac::SDK.new(OS::Mac::Version.new("11"), "/some/path/MacOSX.sdk", :clt) } + let(:catalina_sdk) { OS::Mac::SDK.new(OS::Mac::Version.new("10.15"), "/some/path/MacOSX10.15.sdk", :clt) } + + specify "#sdk_for" do + allow(locator).to receive(:all_sdks).and_return([big_sur_sdk, catalina_sdk]) + + expect(locator.sdk_for(OS::Mac::Version.new("11"))).to eq(big_sur_sdk) + expect(locator.sdk_for(OS::Mac::Version.new("10.15"))).to eq(catalina_sdk) + expect { locator.sdk_for(OS::Mac::Version.new("10.14")) }.to raise_error(described_class::NoSDKError) + end + + describe "#sdk_if_applicable" do + before do + allow(locator).to receive(:all_sdks).and_return([big_sur_sdk, catalina_sdk]) + end + + it "returns the requested SDK" do + expect(locator.sdk_if_applicable(OS::Mac::Version.new("11"))).to eq(big_sur_sdk) + expect(locator.sdk_if_applicable(OS::Mac::Version.new("10.15"))).to eq(catalina_sdk) + end + + it "returns the latest SDK if the requested version is not found" do + expect(locator.sdk_if_applicable(OS::Mac::Version.new("10.14"))).to eq(big_sur_sdk) + expect(locator.sdk_if_applicable(OS::Mac::Version.new("12"))).to eq(big_sur_sdk) + end + + it "returns the SDK matching the OS version if no version is specified" do + allow(OS::Mac).to receive(:version).and_return(OS::Mac::Version.new("10.15")) + expect(locator.sdk_if_applicable).to eq(catalina_sdk) + end + + it "returns the latest SDK on older OS versions when there's no matching SDK" do + allow(OS::Mac).to receive(:version).and_return(OS::Mac::Version.new("10.14")) + expect(locator.sdk_if_applicable).to eq(big_sur_sdk) + end + + it "returns nil if the OS is newer than all SDKs" do + allow(OS::Mac).to receive(:version).and_return(OS::Mac::Version.new("12")) + expect(locator.sdk_if_applicable).to be_nil + end + end + + describe "#all_sdks" do + let(:big_sur_sdk_prefix) { TEST_FIXTURE_DIR/"sdks/big_sur" } + let(:mojave_broken_sdk_prefix) { TEST_FIXTURE_DIR/"sdks/mojave_broken" } + let(:high_sierra_sdk_prefix) { TEST_FIXTURE_DIR/"sdks/high_sierra" } + let(:malformed_sdk_prefix) { TEST_FIXTURE_DIR/"sdks/malformed" } + + it "reads the SDKSettings.json version of unversioned SDKs folders" do + allow(locator).to receive(:sdk_prefix).and_return(big_sur_sdk_prefix.to_s) + + sdks = locator.all_sdks + expect(sdks.count).to eq(1) + + sdk = sdks.first + expect(sdk.path).to eq(big_sur_sdk_prefix/"MacOSX.sdk") + expect(sdk.version).to eq(OS::Mac::Version.new("11")) + expect(sdk.source).to eq(:clt) + end + + it "reads the SDKSettings.json version of versioned SDKs folders" do + allow(locator).to receive(:sdk_prefix).and_return(mojave_broken_sdk_prefix.to_s) + + sdks = locator.all_sdks + expect(sdks.count).to eq(1) + + sdk = sdks.first + expect(sdk.path).to eq(mojave_broken_sdk_prefix/"MacOSX10.14.sdk") + expect(sdk.version).to eq(OS::Mac::Version.new("10.15")) + expect(sdk.source).to eq(:clt) + end + + it "reads the SDKSettings.plist version" do + allow(locator).to receive(:sdk_prefix).and_return(high_sierra_sdk_prefix.to_s) + + sdks = locator.all_sdks + expect(sdks.count).to eq(1) + + sdk = sdks.first + expect(sdk.path).to eq(high_sierra_sdk_prefix/"MacOSX10.13.sdk") + expect(sdk.version).to eq(OS::Mac::Version.new("10.13")) + expect(sdk.source).to eq(:clt) + end + + it "rejects malformed sdks" do + allow(locator).to receive(:sdk_prefix).and_return(malformed_sdk_prefix.to_s) + + expect(locator.all_sdks).to be_empty + end + end +end diff --git a/Library/Homebrew/test/support/fixtures/sdks/big_sur/MacOSX.sdk/SDKSettings.json b/Library/Homebrew/test/support/fixtures/sdks/big_sur/MacOSX.sdk/SDKSettings.json new file mode 100644 index 0000000000..3e9fb27234 --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/sdks/big_sur/MacOSX.sdk/SDKSettings.json @@ -0,0 +1 @@ +{"Version":"11.1"} diff --git a/Library/Homebrew/test/support/fixtures/sdks/high_sierra/MacOSX10.13.sdk/SDKSettings.plist b/Library/Homebrew/test/support/fixtures/sdks/high_sierra/MacOSX10.13.sdk/SDKSettings.plist new file mode 100644 index 0000000000..7e57e7b081 --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/sdks/high_sierra/MacOSX10.13.sdk/SDKSettings.plist @@ -0,0 +1,8 @@ + + + + + Version + 10.13 + + diff --git a/Library/Homebrew/test/support/fixtures/sdks/malformed/MacOSX10.15.sdk/SDKSettings.json b/Library/Homebrew/test/support/fixtures/sdks/malformed/MacOSX10.15.sdk/SDKSettings.json new file mode 100644 index 0000000000..8613898c19 --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/sdks/malformed/MacOSX10.15.sdk/SDKSettings.json @@ -0,0 +1 @@ +{"Version":"broken"} diff --git a/Library/Homebrew/test/support/fixtures/sdks/mojave_broken/MacOSX10.14.sdk/SDKSettings.json b/Library/Homebrew/test/support/fixtures/sdks/mojave_broken/MacOSX10.14.sdk/SDKSettings.json new file mode 100644 index 0000000000..62938d457a --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/sdks/mojave_broken/MacOSX10.14.sdk/SDKSettings.json @@ -0,0 +1 @@ +{"Version":"10.15.6"}