1
0
mirror of https://github.com/certbot/certbot.git synced 2026-01-27 19:42:53 +03:00
Files
certbot/tests/modification-check.py
Adrien Ferrand b3d2ac5161 Fail-fast in test/cover/lint scripts (#6487)
After #6485 and #6435, it appears that there is no good reason to not fail fast when test, cover or linting scripts are executed.

This PR ensures to fail fast by invoking commands throught subprocess.check_call instead of subprocess.call, and by removing the handling of non-zero exit code at the end of theses scripts.

As now coverage on Windows is executed with thresholds, I added specific thresholds for this platform. Because some portions of code that are done for Unix platform will not be executed on Windows.

Note that coverage reports from Travis and AppVeyor are accumulated on Codecov. So if a file is covered up to 50 % on Linux, and all other parts are covered on Windows, then coverage is 100 % for Codecov.

Note: that PR also fixes the ability of coverage tests to fail if thresholds are exceeded.

* Use check_call to fail fast in all scripts related to tests/lint/coverage/deploy

* Make specific coverage threshold for windows
2018-11-14 13:57:40 -08:00

125 lines
4.5 KiB
Python
Executable File

#!/usr/bin/env python
from __future__ import print_function
import os
import subprocess
import sys
import tempfile
import shutil
try:
from urllib.request import urlretrieve
except ImportError:
from urllib import urlretrieve
def find_repo_path():
return os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
# We do not use filecmp.cmp to take advantage of universal newlines
# handling in open() for Python 3.x and be insensitive to CRLF/LF when run on Windows.
# As a consequence, this function will not work correctly if executed by Python 2.x on Windows.
# But it will work correctly on Linux for any version, because every file tested will be LF.
def compare_files(path_1, path_2):
l1 = l2 = True
with open(path_1, 'r') as f1, open(path_2, 'r') as f2:
line = 1
while l1 and l2:
line += 1
l1 = f1.readline()
l2 = f2.readline()
if l1 != l2:
print('---')
print((
'While comparing {0} (1) and {1} (2), a difference was found at line {2}:'
.format(os.path.basename(path_1), os.path.basename(path_2), line)))
print('(1): {0}'.format(repr(l1)))
print('(2): {0}'.format(repr(l2)))
print('---')
return False
return True
def validate_scripts_content(repo_path, temp_cwd):
errors = False
if not compare_files(
os.path.join(repo_path, 'certbot-auto'),
os.path.join(repo_path, 'letsencrypt-auto')):
print('Root certbot-auto and letsencrypt-auto differ.')
errors = True
else:
shutil.copyfile(
os.path.join(repo_path, 'certbot-auto'),
os.path.join(temp_cwd, 'local-auto'))
shutil.copy(os.path.normpath(os.path.join(
repo_path,
'letsencrypt-auto-source/pieces/fetch.py')), temp_cwd)
# Compare file against current version in the target branch
branch = os.environ.get('TRAVIS_BRANCH', 'master')
url = (
'https://raw.githubusercontent.com/certbot/certbot/{0}/certbot-auto'
.format(branch))
urlretrieve(url, os.path.join(temp_cwd, 'certbot-auto'))
if compare_files(
os.path.join(temp_cwd, 'certbot-auto'),
os.path.join(temp_cwd, 'local-auto')):
print('Root *-auto were unchanged')
else:
# Compare file against the latest released version
latest_version = subprocess.check_output(
[sys.executable, 'fetch.py', '--latest-version'], cwd=temp_cwd)
subprocess.check_call(
[sys.executable, 'fetch.py', '--le-auto-script',
'v{0}'.format(latest_version.decode().strip())], cwd=temp_cwd)
if compare_files(
os.path.join(temp_cwd, 'letsencrypt-auto'),
os.path.join(temp_cwd, 'local-auto')):
print('Root *-auto were updated to the latest version.')
else:
print('Root *-auto have unexpected changes.')
errors = True
return errors
def main():
repo_path = find_repo_path()
temp_cwd = tempfile.mkdtemp()
errors = False
try:
errors = validate_scripts_content(repo_path, temp_cwd)
shutil.copyfile(
os.path.normpath(os.path.join(repo_path, 'letsencrypt-auto-source/letsencrypt-auto')),
os.path.join(temp_cwd, 'original-lea')
)
subprocess.check_call([sys.executable, os.path.normpath(os.path.join(
repo_path, 'letsencrypt-auto-source/build.py'))])
shutil.copyfile(
os.path.normpath(os.path.join(repo_path, 'letsencrypt-auto-source/letsencrypt-auto')),
os.path.join(temp_cwd, 'build-lea')
)
shutil.copyfile(
os.path.join(temp_cwd, 'original-lea'),
os.path.normpath(os.path.join(repo_path, 'letsencrypt-auto-source/letsencrypt-auto'))
)
if not compare_files(
os.path.join(temp_cwd, 'original-lea'),
os.path.join(temp_cwd, 'build-lea')):
print('Script letsencrypt-auto-source/letsencrypt-auto '
'doesn\'t match output of build.py.')
errors = True
else:
print('Script letsencrypt-auto-source/letsencrypt-auto matches output of build.py.')
finally:
shutil.rmtree(temp_cwd)
return errors
if __name__ == '__main__':
if main():
sys.exit(1)