1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-22 07:28:10 +00:00

tests/ui: success html file

This commit is contained in:
Tomas Susanka 2020-01-07 14:42:55 +00:00
parent 75c96f6b0a
commit 96ec85686e
4 changed files with 114 additions and 75 deletions

View File

@ -54,7 +54,8 @@ core unix device ui test:
paths: paths:
- trezor.log - trezor.log
- ci/ui_test_records/ - ci/ui_test_records/
- tests/ui_tests/fixtures/*/diff.html - tests/ui_tests/fixtures/*/failure_diff.html
- tests/ui_tests/fixtures/*/success.html
- tests/junit.xml - tests/junit.xml
when: always when: always
expire_in: 1 week expire_in: 1 week

View File

@ -2,12 +2,11 @@ import hashlib
import re import re
import shutil import shutil
from contextlib import contextmanager from contextlib import contextmanager
from distutils.dir_util import copy_tree
from pathlib import Path from pathlib import Path
import pytest import pytest
from . import html from . import report
def _get_test_dirname(node): def _get_test_dirname(node):
@ -67,21 +66,21 @@ def _process_tested(fixture_test_path, test_name):
_rename_records(actual_path) _rename_records(actual_path)
if actual_hash != expected_hash: if actual_hash != expected_hash:
diff_file = html.diff_file( file_path = report.failure(
fixture_test_path, test_name, actual_hash, expected_hash fixture_test_path, test_name, actual_hash, expected_hash
) )
if (fixture_test_path / "success.html").exists():
(fixture_test_path / "success.html").unlink()
pytest.fail( pytest.fail(
"Hash of {} differs.\nExpected: {}\nActual: {}\nDiff file: {}".format( "Hash of {} differs.\nExpected: {}\nActual: {}\nDiff file: {}".format(
test_name, expected_hash, actual_hash, diff_file test_name, expected_hash, actual_hash, file_path
) )
) )
else: else:
copy_tree( report.success(fixture_test_path, test_name, actual_hash)
str(fixture_test_path / "actual"), str(fixture_test_path / "recorded") if (fixture_test_path / "failure_diff.html").exists():
) (fixture_test_path / "failure_diff.html").unlink()
if (fixture_test_path / "diff.html").exists():
(fixture_test_path / "diff.html").unlink()
@contextmanager @contextmanager

View File

@ -1,65 +0,0 @@
import base64
import filecmp
from itertools import zip_longest
import dominate
from dominate.tags import div, h1, hr, i, img, p, table, td, th, tr
from . import download
def _image(src):
with td():
if src:
# open image file
image = open(src, "rb")
# encode image as base64
image = base64.b64encode(image.read())
# convert output to str
image = image.decode()
# img(src=src.relative_to(fixture_test_path))
img(src="data:image/png;base64, " + image)
else:
i("missing")
def diff_file(fixture_test_path, test_name, actual_hash, expected_hash):
doc = dominate.document(title=test_name)
recorded_path = fixture_test_path / "recorded"
actual_path = fixture_test_path / "actual"
if not recorded_path.exists():
recorded_path.mkdir()
download.fetch_recorded(expected_hash, recorded_path)
recorded = sorted(recorded_path.iterdir())
actual = sorted(actual_path.iterdir())
if not recorded:
return
with doc:
h1(test_name)
with div():
p("This test failed on UI comparison.")
p("Expected: ", expected_hash)
p("Actual: ", actual_hash)
hr()
with table(border=1, width=600):
with tr():
th("Expected")
th("Actual")
for r, a in zip_longest(recorded, actual):
if r and a and filecmp.cmp(a, r):
background = "white"
else:
background = "red"
with tr(bgcolor=background):
_image(r)
_image(a)
(fixture_test_path / "diff.html").write_text(doc.render())
return fixture_test_path / "diff.html"

104
tests/ui_tests/report.py Normal file
View File

@ -0,0 +1,104 @@
import base64
import filecmp
from distutils.dir_util import copy_tree
from itertools import zip_longest
import dominate
from dominate.tags import div, h1, hr, i, img, p, table, td, th, tr
from . import download
def _image(src):
with td():
if src:
# open image file
image = open(src, "rb")
# encode image as base64
image = base64.b64encode(image.read())
# convert output to str
image = image.decode()
# img(src=src.relative_to(fixture_test_path))
img(src="data:image/png;base64, " + image)
else:
i("missing")
def _header(test_name, expected_hash, actual_hash):
h1(test_name)
with div():
if actual_hash == expected_hash:
p(
"This test succeeded on UI comparison.",
style="color: green; font-weight: bold;",
)
else:
p(
"This test failed on UI comparison.",
style="color: red; font-weight: bold;",
)
p("Expected: ", expected_hash)
p("Actual: ", actual_hash)
hr()
def _write(fixture_test_path, doc, filename):
(fixture_test_path / filename).write_text(doc.render())
return fixture_test_path / filename
def failure(fixture_test_path, test_name, actual_hash, expected_hash):
doc = dominate.document(title=test_name)
recorded_path = fixture_test_path / "recorded"
actual_path = fixture_test_path / "actual"
if not recorded_path.exists():
recorded_path.mkdir()
download.fetch_recorded(expected_hash, recorded_path)
recorded = sorted(recorded_path.iterdir())
actual = sorted(actual_path.iterdir())
if not recorded:
return
with doc:
_header(test_name, expected_hash, actual_hash)
with table(border=1, width=600):
with tr():
th("Expected")
th("Actual")
for r, a in zip_longest(recorded, actual):
if r and a and filecmp.cmp(a, r):
background = "white"
else:
background = "red"
with tr(bgcolor=background):
_image(r)
_image(a)
return _write(fixture_test_path, doc, "failure_diff.html")
def success(fixture_test_path, test_name, actual_hash):
copy_tree(str(fixture_test_path / "actual"), str(fixture_test_path / "recorded"))
doc = dominate.document(title=test_name)
actual_path = fixture_test_path / "actual"
actual = sorted(actual_path.iterdir())
with doc:
_header(test_name, actual_hash, actual_hash)
with table(border=1):
with tr():
th("Recorded")
for a in actual:
with tr():
_image(a)
return _write(fixture_test_path, doc, "success.html")