52 lines
2.5 KiB
Python
52 lines
2.5 KiB
Python
"""Maven failures must survive tee without overriding project analysis policy."""
|
|
import os
|
|
from pathlib import Path
|
|
import subprocess
|
|
import tempfile
|
|
import unittest
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
SCRIPTS = [('mvn_spotbugs.sh', 'SPOTBUGS_FAIL_ON_ERROR', 'spotbugs.failOnError'),
|
|
('mvn_pmd.sh', 'PMD_FAIL_ON_VIOLATION', 'pmd.failOnViolation')]
|
|
|
|
|
|
class StaticAnalysisExitTests(unittest.TestCase):
|
|
def invoke(self, script, variable, setting, status):
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
root = Path(directory)
|
|
binary = root / 'mvn'
|
|
binary.write_text('#!/bin/sh\nprintf "%s\\n" "$@" > "$ARGUMENT_FILE"\necho analysis-output\nexit "$FAKE_MAVEN_EXIT"\n')
|
|
binary.chmod(0o755)
|
|
env = dict(os.environ, PATH=str(root) + os.pathsep + os.environ['PATH'],
|
|
ARGUMENT_FILE=str(root / 'arguments'), FAKE_MAVEN_EXIT=str(status))
|
|
env.pop(variable, None)
|
|
if setting is not None:
|
|
env[variable] = setting
|
|
result = subprocess.run(['bash', str(ROOT / 'src/scripts' / script)], cwd=root,
|
|
env=env, text=True, capture_output=True, timeout=15)
|
|
return result, (root / 'arguments').read_text().splitlines()
|
|
|
|
def test_maven_failure_is_never_hidden_by_successful_tee(self):
|
|
for script, variable, _ in SCRIPTS:
|
|
for setting in ('true', 'false'):
|
|
with self.subTest(script=script, setting=setting):
|
|
result, _ = self.invoke(script, variable, setting, 17)
|
|
self.assertEqual(17, result.returncode)
|
|
self.assertIn('analysis-output', result.stdout)
|
|
|
|
def test_success_preserves_explicit_flag_and_project_defaults(self):
|
|
for script, variable, property_name in SCRIPTS:
|
|
for setting in ('true', 'false', None):
|
|
with self.subTest(script=script, setting=setting):
|
|
result, arguments = self.invoke(script, variable, setting, 0)
|
|
self.assertEqual(0, result.returncode, result.stderr)
|
|
if setting == 'true':
|
|
self.assertIn('-D' + property_name + '=true', arguments)
|
|
else:
|
|
self.assertFalse(any(arg.startswith('-D' + property_name + '=') for arg in arguments))
|
|
self.assertIn('-DskipTests', arguments)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|