Skip to content

Commit

Permalink
Remove Rosetta install for macOS on M1 since JDK 17 for arm64 exists
Browse files Browse the repository at this point in the history
  • Loading branch information
rmartin16 committed May 13, 2023
1 parent 429082a commit 532b9d6
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 151 deletions.
33 changes: 5 additions & 28 deletions src/briefcase/integrations/java.py
Expand Up @@ -29,11 +29,11 @@ def __init__(self, tools: ToolCache, java_home: Path):
@property
def OpenJDK_download_url(self):
arch = {
"AMD64": "x64",
"arm64": "aarch64",
"x86_64": "x64",
"aarch64": "aarch64",
"armv6l": "arm",
"x86_64": "x64", # Linux\macOS x86-64
"aarch64": "aarch64", # Linux arm64
"armv6l": "arm", # Linux arm
"arm64": "aarch64", # macOS arm64
"AMD64": "x64", # Windows x86-64
}.get(self.tools.host_arch)

platform = {
Expand Down Expand Up @@ -79,10 +79,6 @@ def verify(cls, tools: ToolCache, install=True):
java_home = tools.os.environ.get("JAVA_HOME", "")
install_message = None

if tools.host_arch == "arm64" and tools.host_os == "Darwin":
# Java is not available for macOS on ARM64, so we will require Rosetta.
cls.verify_rosetta(tools)

# macOS has a helpful system utility to determine JAVA_HOME. Try it.
if not java_home and tools.host_os == "Darwin":
try:
Expand Down Expand Up @@ -297,22 +293,3 @@ def upgrade(self):

self.uninstall()
self.install()

@classmethod
def verify_rosetta(cls, tools):
try:
tools.subprocess.check_output(["arch", "-x86_64", "true"])
except subprocess.CalledProcessError:
tools.logger.info(
"""\
This command requires Rosetta, but it does not appear to be installed.
Briefcase will attempt to install it now.
"""
)
try:
tools.subprocess.run(
["softwareupdate", "--install-rosetta", "--agree-to-license"],
check=True,
)
except subprocess.CalledProcessError as e:
raise BriefcaseCommandError("Failed to install Rosetta") from e
123 changes: 0 additions & 123 deletions tests/integrations/java/test_JDK__verify.py
Expand Up @@ -2,7 +2,6 @@
import shutil
import subprocess
from pathlib import Path
from subprocess import CalledProcessError
from unittest import mock

import pytest
Expand All @@ -11,11 +10,6 @@
from briefcase.integrations.java import JDK

CALL_JAVA_HOME = mock.call(["/usr/libexec/java_home"])
CALL_ROSETTA_CHECK = mock.call(["arch", "-x86_64", "true"])
CALL_ROSETTA_INSTALL = mock.call(
["softwareupdate", "--install-rosetta", "--agree-to-license"],
check=True,
)


def test_short_circuit(mock_tools):
Expand All @@ -33,9 +27,6 @@ def test_macos_tool_java_home(mock_tools, capsys):
# Mock being on macOS
mock_tools.host_os = "Darwin"

# Prevent Rosetta check.
mock_tools.host_arch = "x86_64"

# Mock 2 calls to check_output.
mock_tools.subprocess.check_output.side_effect = [
"/path/to/java",
Expand Down Expand Up @@ -65,9 +56,6 @@ def test_macos_tool_failure(mock_tools, tmp_path, capsys):
# Mock being on macOS
mock_tools.host_os = "Darwin"

# Prevent Rosetta check.
mock_tools.host_arch = "x86_64"

# Mock a failed call on the libexec tool
mock_tools.subprocess.check_output.side_effect = subprocess.CalledProcessError(
returncode=1, cmd="/usr/libexec/java_home"
Expand Down Expand Up @@ -95,9 +83,6 @@ def test_macos_provided_overrides_tool_java_home(mock_tools, capsys):
# Mock being on macOS
mock_tools.host_os = "Darwin"

# Prevent Rosetta check.
mock_tools.host_arch = "x86_64"

# Setup explicit JAVA_HOME
mock_tools.os.environ = {"JAVA_HOME": "/path/to/java"}

Expand All @@ -123,8 +108,6 @@ def test_macos_provided_overrides_tool_java_home(mock_tools, capsys):

def test_valid_provided_java_home(mock_tools, capsys):
"""If a valid JAVA_HOME is provided, it is used."""
# Prevent Rosetta check.
mock_tools.host_arch = "x86_64"

# Setup explicit JAVA_HOME
mock_tools.os.environ = {"JAVA_HOME": "/path/to/java"}
Expand Down Expand Up @@ -163,9 +146,6 @@ def test_invalid_jdk_version(mock_tools, host_os, java_home, tmp_path, capsys):
# Mock os
mock_tools.host_os = host_os

# Prevent Rosetta check.
mock_tools.host_arch = "x86_64"

# Setup explicit JAVA_HOME
mock_tools.os.environ = {"JAVA_HOME": "/path/to/java"}

Expand Down Expand Up @@ -209,9 +189,6 @@ def test_no_javac(mock_tools, host_os, java_home, error_type, tmp_path, capsys):
# Mock os
mock_tools.host_os = host_os

# Prevent Rosetta check.
mock_tools.host_arch = "x86_64"

# Setup explicit JAVA_HOME
mock_tools.os.environ = {"JAVA_HOME": "/path/to/nowhere"}

Expand Down Expand Up @@ -254,9 +231,6 @@ def test_javac_error(mock_tools, host_os, java_home, tmp_path, capsys):
# Mock os
mock_tools.host_os = host_os

# Prevent Rosetta check.
mock_tools.host_arch = "x86_64"

# Setup explicit JAVA_HOME
mock_tools.os.environ = {"JAVA_HOME": "/path/to/nowhere"}

Expand Down Expand Up @@ -298,9 +272,6 @@ def test_unparseable_javac_version(mock_tools, host_os, java_home, tmp_path, cap
# Mock os
mock_tools.host_os = host_os

# Prevent Rosetta check.
mock_tools.host_arch = "x86_64"

# Setup explicit JAVA_HOME
mock_tools.os.environ = {"JAVA_HOME": "/path/to/nowhere"}

Expand Down Expand Up @@ -470,97 +441,3 @@ def test_invalid_jdk_archive(mock_tools, tmp_path):
)
# The original archive was not deleted
assert archive.unlink.call_count == 0


def test_rosetta_host_os(mock_tools, tmp_path):
"""On an OS other than macOS, the Rosetta check does not occur."""
mock_tools.host_os = "Linux"
mock_tools.host_arch = "arm64"

# Create a mock of a previously installed Java version.
(tmp_path / "tools" / "java17" / "bin").mkdir(parents=True)

JDK.verify(mock_tools)
mock_tools.subprocess.check_output.assert_not_called()
mock_tools.subprocess.run.assert_not_called()


def test_rosetta_host_arch(mock_tools, tmp_path):
"""On an architecture other than ARM64, the Rosetta check does not occur."""
mock_tools.host_os = "Darwin"
mock_tools.host_arch = "x86_64"

mock_tools.subprocess.check_output.side_effect = [
CalledProcessError(1, "java_home")
]

# Create a mock of a previously installed Java version.
(tmp_path / "tools" / "java17" / "Contents" / "Home" / "bin").mkdir(parents=True)

JDK.verify(mock_tools)
assert mock_tools.subprocess.check_output.mock_calls == [CALL_JAVA_HOME]
mock_tools.subprocess.run.assert_not_called()


def test_rosetta_already_installed(mock_tools, tmp_path):
"""On an ARM Mac, the Rosetta check occurs before calling any other Java
commands."""
mock_tools.host_os = "Darwin"
mock_tools.host_arch = "arm64"

mock_tools.subprocess.check_output.side_effect = [
None, # Rosetta check succeeds.
CalledProcessError(1, "java_home"),
]

# Create a mock of a previously installed Java version.
(tmp_path / "tools" / "java17" / "Contents" / "Home" / "bin").mkdir(parents=True)

JDK.verify(mock_tools)
assert mock_tools.subprocess.check_output.mock_calls == [
CALL_ROSETTA_CHECK,
CALL_JAVA_HOME,
]
mock_tools.subprocess.run.assert_not_called()


def test_rosetta_install_success(mock_tools, tmp_path):
"""Rosetta is installed if necessary."""
mock_tools.host_os = "Darwin"
mock_tools.host_arch = "arm64"

mock_tools.subprocess.check_output.side_effect = [
CalledProcessError(1, "arch"),
CalledProcessError(1, "java_home"),
]

# Create a mock of a previously installed Java version.
(tmp_path / "tools" / "java17" / "Contents" / "Home" / "bin").mkdir(parents=True)

JDK.verify(mock_tools)
assert mock_tools.subprocess.check_output.mock_calls == [
CALL_ROSETTA_CHECK,
CALL_JAVA_HOME,
]
assert mock_tools.subprocess.run.mock_calls == [CALL_ROSETTA_INSTALL]


def test_rosetta_install_failure(mock_tools, tmp_path):
"""If Rosetta install fails, no Java commands are called."""
mock_tools.host_os = "Darwin"
mock_tools.host_arch = "arm64"

mock_tools.subprocess.check_output.side_effect = [
CalledProcessError(1, "arch"),
]
mock_tools.subprocess.run.side_effect = [
CalledProcessError(1, "softwareupdate"),
]

# Create a mock of a previously installed Java version.
(tmp_path / "tools" / "java17" / "Contents" / "Home" / "bin").mkdir(parents=True)

with pytest.raises(BriefcaseCommandError, match="Failed to install Rosetta"):
JDK.verify(mock_tools)
assert mock_tools.subprocess.check_output.mock_calls == [CALL_ROSETTA_CHECK]
assert mock_tools.subprocess.run.mock_calls == [CALL_ROSETTA_INSTALL]

0 comments on commit 532b9d6

Please sign in to comment.