1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
import subprocess
import pytest
from briefcase.exceptions import BriefcaseCommandError
from briefcase.integrations.xcode import XcodeCliTools
def test_license_accepted(capsys, mock_tools):
"""If the Xcode license has been accepted, pass without comment."""
# Check passes without an error...
XcodeCliTools.confirm_xcode_license_accepted(mock_tools)
# ... clang was invoked ...
mock_tools.subprocess.check_output.assert_called_once_with(
["/usr/bin/clang", "--version"],
quiet=1,
)
# ... and the user is none the wiser
out = capsys.readouterr().out
assert len(out) == 0
def test_unknown_error(capsys, mock_tools):
"""If an unexpected problem occurred accepting the license, warn the user."""
mock_tools.subprocess.check_output.side_effect = subprocess.CalledProcessError(
cmd=["/usr/bin/clang", "--version"],
returncode=1,
output="Can't invoke clang\n",
)
# Check passes without an error...
XcodeCliTools.confirm_xcode_license_accepted(mock_tools)
# ... clang was invoked ...
mock_tools.subprocess.check_output.assert_called_once_with(
["/usr/bin/clang", "--version"],
quiet=1,
)
# ...but stdout contains a warning
out = capsys.readouterr().out
assert "************" in out
def test_accept_license(mock_tools):
"""If the user accepts the license, continue without error."""
mock_tools.subprocess.check_output.side_effect = subprocess.CalledProcessError(
cmd=["/usr/bin/clang", "--version"],
returncode=69,
)
# Check passes without an error...
XcodeCliTools.confirm_xcode_license_accepted(mock_tools)
# ... clang *and* xcodebuild were invoked ...
mock_tools.subprocess.check_output.assert_called_once_with(
["/usr/bin/clang", "--version"],
quiet=1,
)
mock_tools.subprocess.run.assert_called_once_with(
["sudo", "xcodebuild", "-license"],
check=True,
stream_output=False,
)
def test_sudo_fail(mock_tools):
"""If the sudo call fails, an exception is raised."""
mock_tools.subprocess.check_output.side_effect = subprocess.CalledProcessError(
cmd=["/usr/bin/clang", "--version"],
returncode=69,
)
mock_tools.subprocess.run.side_effect = subprocess.CalledProcessError(
cmd=["sudo", "xcodebuild", "-license"],
returncode=1,
)
# Check raises an error:
with pytest.raises(
BriefcaseCommandError,
match=r"Briefcase was unable to run the Xcode licensing tool.",
):
XcodeCliTools.confirm_xcode_license_accepted(mock_tools)
# ... clang *and* xcodebuild were invoked ...
mock_tools.subprocess.check_output.assert_called_once_with(
["/usr/bin/clang", "--version"],
quiet=1,
)
mock_tools.subprocess.run.assert_called_once_with(
["sudo", "xcodebuild", "-license"],
check=True,
stream_output=False,
)
def test_license_not_accepted(mock_tools):
"""If the sudo call fails, an exception is raised."""
mock_tools.subprocess.check_output.side_effect = subprocess.CalledProcessError(
cmd=["/usr/bin/clang", "--version"],
returncode=69,
)
mock_tools.subprocess.run.side_effect = subprocess.CalledProcessError(
cmd=["sudo", "xcodebuild", "-license"],
returncode=69,
)
# Check raises an error:
with pytest.raises(
BriefcaseCommandError, match=r"Xcode license has not been accepted."
):
XcodeCliTools.confirm_xcode_license_accepted(mock_tools)
# ... clang *and* xcodebuild were invoked ...
mock_tools.subprocess.check_output.assert_called_once_with(
["/usr/bin/clang", "--version"],
quiet=1,
)
mock_tools.subprocess.run.assert_called_once_with(
["sudo", "xcodebuild", "-license"],
check=True,
stream_output=False,
)
def test_license_status_unknown(capsys, mock_tools):
"""If we get an unusual response from the license, warn but continue."""
mock_tools.subprocess.check_output.side_effect = subprocess.CalledProcessError(
cmd=["/usr/bin/clang", "--version"],
returncode=69,
)
mock_tools.subprocess.run.side_effect = subprocess.CalledProcessError(
cmd=["sudo", "xcodebuild", "-license"],
returncode=42,
)
# Check passes without error...
XcodeCliTools.confirm_xcode_license_accepted(mock_tools)
# ... clang *and* xcodebuild were invoked ...
mock_tools.subprocess.check_output.assert_called_once_with(
["/usr/bin/clang", "--version"],
quiet=1,
)
mock_tools.subprocess.run.assert_called_once_with(
["sudo", "xcodebuild", "-license"],
check=True,
stream_output=False,
)
# ...but stdout contains a warning
out = capsys.readouterr().out
assert "************" in out
|