diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index ed94e2d78a..3848191bf7 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -21,6 +21,18 @@ jobs: - name: Run code quality check suite run: ./tools/check/check_code_quality.sh + checkScreesnhot: + name: Search for invalid screenshot files + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Python 3.9 + uses: actions/setup-python@v5 + with: + python-version: 3.9 + - name: Search for invalid screenshot files + run: ./tools/test/checkInvalidScreenshots.py + check: name: Project Check Suite runs-on: ubuntu-latest diff --git a/tools/test/checkInvalidScreenshots.py b/tools/test/checkInvalidScreenshots.py new file mode 100755 index 0000000000..ab5ae5e952 --- /dev/null +++ b/tools/test/checkInvalidScreenshots.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 + +# Copyright (c) 2024 New Vector Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +from util import compare + + +def checkInvalidScreenshots(reference): + __doc__ = "Detect invalid screenshot, by comparing to an invalid reference." + path_of_screenshots = "tests/uitests/src/test/snapshots/images/" + files = os.listdir(path_of_screenshots) + counter = 0 + for file in files: + if not compare(reference, path_of_screenshots + file): + print("Invalid screenshot detected: " + file) + counter += 1 + return counter + + +def main(): + invalid_screenshot_reference_path = "tools/test/invalid_screenshot.png" + result = checkInvalidScreenshots(invalid_screenshot_reference_path) + if result > 0: + print("%d invalid screenshot(s) detected" % result) + print("Please check that the Preview is OK in Android Studio. You may want to use a Fake Composable for the screenshot to render correctly.") + exit(1) + else: + print("No invalid screenshot detected!") + exit(0) + + +main() diff --git a/tools/test/generateAllScreenshots.py b/tools/test/generateAllScreenshots.py index 010f6931a6..6ba1ab2b67 100755 --- a/tools/test/generateAllScreenshots.py +++ b/tools/test/generateAllScreenshots.py @@ -3,6 +3,7 @@ import os import re import sys +from util import compare # Read all arguments and return a list of them, this are the languages list. def readArguments(): @@ -40,20 +41,6 @@ def detectLanguages(): return languages -def compare(file1, file2): - __doc__ = "Compare two files, return True if different, False if identical." - # Compare file size - file1_stats = os.stat(file1) - file2_stats = os.stat(file2) - if file1_stats.st_size != file2_stats.st_size: - return True - # Compare file content - with open(file1, "rb") as f1, open(file2, "rb") as f2: - content1 = f1.read() - content2 = f2.read() - return content1 != content2 - - def deleteDuplicatedScreenshots(lang): __doc__ = "Delete screenshots identical to the English version for a language" print("Deleting screenshots identical to the English version for language %s..." % lang) diff --git a/tools/test/invalid_screenshot.png b/tools/test/invalid_screenshot.png new file mode 100644 index 0000000000..8da2be99c2 Binary files /dev/null and b/tools/test/invalid_screenshot.png differ diff --git a/tools/test/util.py b/tools/test/util.py new file mode 100644 index 0000000000..ce9ffc7594 --- /dev/null +++ b/tools/test/util.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 + +# Copyright (c) 2024 New Vector Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + + +def compare(file1, file2): + __doc__ = "Compare two files, return True if different, False if identical." + # Compare file size + file1_stats = os.stat(file1) + file2_stats = os.stat(file2) + if file1_stats.st_size != file2_stats.st_size: + return True + # Compare file content + with open(file1, "rb") as f1, open(file2, "rb") as f2: + content1 = f1.read() + content2 = f2.read() + return content1 != content2