From e8f93e38debf4f46dbda4de198b9dd475df42d5c Mon Sep 17 00:00:00 2001 From: Eirik Aavitsland Date: Mon, 15 Nov 2021 13:36:48 +0100 Subject: [PATCH] Rename and restructure the baseline (lancelot) testing code In preparation for addition of new baseline tests, establish a new test category, "baseline". This is similar to the category "benchmarks" in that it contains tests that use the QTest framework, but conceptually are not unit tests, in contrast to those under auto/. Move the existing QPainter baseline test, tst_lancelot, into this new category, and rename it accordingly. Baseline tests use the QBaselineTest extension to QTest. Move that extension too into the tests/baseline directory, allowing the clean out of the baselineserver directory. Pick-to: 6.2 Change-Id: I1b527f5867c953b1d22be73798fcf7d1494712ea Reviewed-by: Qt CI Bot Reviewed-by: Eirik Aavitsland Reviewed-by: Volker Hilsheimer --- .../QtBuildInternalsConfig.cmake | 3 + tests/auto/other/CMakeLists.txt | 1 - tests/baseline/CMakeLists.txt | 3 + .../lancelot => baseline/painting}/.gitignore | 0 .../painting}/CMakeLists.txt | 27 +- .../lancelot => baseline/painting}/images.qrc | 0 .../painting}/images/alpha.png | Bin .../painting}/images/alpha2x2.png | Bin .../painting}/images/bitmap.png | Bin .../painting}/images/border.png | Bin .../painting}/images/borderimage.png | Bin .../painting}/images/dome_argb32.png | Bin .../painting}/images/dome_indexed.png | Bin .../painting}/images/dome_indexed_mask.png | Bin .../painting}/images/dome_mono.png | Bin .../painting}/images/dome_mono_128.png | Bin .../painting}/images/dome_mono_palette.png | Bin .../painting}/images/dome_rgb32.png | Bin .../painting}/images/dot.png | Bin .../painting}/images/face.png | Bin .../painting}/images/gam030.png | Bin .../painting}/images/gam045.png | Bin .../painting}/images/gam056.png | Bin .../painting}/images/gam100.png | Bin .../painting}/images/gam200.png | Bin .../painting}/images/image.png | Bin .../painting}/images/mask.png | Bin .../painting}/images/mask_100.png | Bin .../painting}/images/masked.png | Bin .../painting}/images/sign.png | Bin .../painting}/images/solid.png | Bin .../painting}/images/solid2x2.png | Bin .../painting}/images/struct-image-01.jpg | Bin .../painting}/images/struct-image-01.png | Bin .../painting}/images/zebra.png | Bin .../painting}/paintcommands.cpp | 0 .../painting}/paintcommands.h | 0 .../painting}/scripts/aliasing.qps | 0 .../painting}/scripts/arcs.qps | 0 .../painting}/scripts/arcs2.qps | 0 .../painting}/scripts/background.qps | 0 .../painting}/scripts/background_brush.qps | 0 .../painting}/scripts/beziers.qps | 0 .../painting}/scripts/bitmaps.qps | 0 .../painting}/scripts/borderimage.qps | 0 .../painting}/scripts/brush_pens.qps | 0 .../painting}/scripts/brushes.qps | 0 .../scripts/clippath_antialiasing.qps | 0 .../painting}/scripts/clippaths.qps | 0 .../painting}/scripts/clipping.qps | 0 .../painting}/scripts/clipping_state.qps | 0 .../painting}/scripts/cliprects.qps | 0 .../painting}/scripts/conical_gradients.qps | 0 .../conical_gradients_perspectives.qps | 0 .../painting}/scripts/cosmetic.qps | 0 .../painting}/scripts/dashes.qps | 0 .../painting}/scripts/degeneratebeziers.qps | 0 .../painting}/scripts/deviceclipping.qps | 0 .../painting}/scripts/drawpoints.qps | 0 .../painting}/scripts/ellipses.qps | 0 .../painting}/scripts/fillrect.qps | 0 .../painting}/scripts/fillrect_aa.qps | 0 .../painting}/scripts/filltest.qps | 0 .../painting}/scripts/glyphruns.qps | 0 .../painting}/scripts/gradients.qps | 0 .../scripts/gradientxform_device.qps | 0 .../scripts/gradientxform_logical.qps | 0 .../scripts/gradientxform_object.qps | 0 .../painting}/scripts/hinting.qps | 0 .../painting}/scripts/image_dpr.qps | 0 .../painting}/scripts/image_formats.qps | 0 .../painting}/scripts/images.qps | 0 .../painting}/scripts/images2.qps | 0 .../painting}/scripts/join_cap_styles.qps | 0 ...in_cap_styles_duplicate_control_points.qps | 0 .../painting}/scripts/linear_gradients.qps | 0 .../scripts/linear_gradients_perspectives.qps | 0 .../scripts/linear_resolving_gradients.qps | 0 .../painting}/scripts/lineconsistency.qps | 0 .../painting}/scripts/linedashes.qps | 0 .../painting}/scripts/linedashes2.qps | 0 .../painting}/scripts/linedashes2_aa.qps | 0 .../painting}/scripts/lines.qps | 0 .../painting}/scripts/lines2.qps | 0 .../painting}/scripts/lines3.qps | 0 .../painting}/scripts/pathfill.qps | 0 .../painting}/scripts/paths.qps | 0 .../painting}/scripts/paths_aa.qps | 0 .../painting}/scripts/pens.qps | 0 .../painting}/scripts/pens_aa.qps | 0 .../painting}/scripts/pens_cosmetic.qps | 0 .../painting}/scripts/perspectives.qps | 0 .../painting}/scripts/perspectives2.qps | 0 .../painting}/scripts/pixmap_rotation.qps | 0 .../painting}/scripts/pixmap_rotation2.qps | 0 .../painting}/scripts/pixmap_scaling.qps | 0 .../painting}/scripts/pixmap_subpixel.qps | 0 .../painting}/scripts/pixmaps.qps | 0 .../painting}/scripts/porter_duff.qps | 0 .../painting}/scripts/porter_duff2.qps | 0 .../painting}/scripts/primitives.qps | 0 .../painting}/scripts/radial_gradients.qps | 0 .../scripts/radial_gradients_perspectives.qps | 0 .../painting}/scripts/rasterops.qps | 0 .../painting}/scripts/richtext.qps | 0 .../painting}/scripts/sizes.qps | 0 .../painting}/scripts/smallcaps_path.qps | 0 .../painting}/scripts/statictext.qps | 0 .../painting}/scripts/text.qps | 0 .../painting}/scripts/text_perspectives.qps | 0 .../painting}/scripts/thinlines.qps | 0 .../painting}/scripts/tiled_pixmap.qps | 0 .../painting}/scripts/tinydashes.qps | 0 .../painting/tst_baseline_painting.cpp} | 2 +- .../shared/baselineprotocol.cpp | 0 .../shared/baselineprotocol.h | 0 .../shared/baselineprotocol.pri | 0 .../shared/lookup3.cpp | 0 .../shared/qbaselinetest.cpp | 0 .../shared/qbaselinetest.h | 0 .../shared/qbaselinetest.pri | 0 tests/baselineserver/.gitignore | 2 - tests/baselineserver/bin/runserver | 13 - tests/baselineserver/src/baselineserver.cpp | 853 ------------------ tests/baselineserver/src/baselineserver.h | 151 ---- tests/baselineserver/src/baselineserver.pro | 24 - tests/baselineserver/src/baselineserver.qrc | 5 - tests/baselineserver/src/main.cpp | 57 -- tests/baselineserver/src/report.cpp | 503 ----------- tests/baselineserver/src/report.h | 98 -- tests/baselineserver/src/templates/view.html | 84 -- .../gui/painting/lancebench/CMakeLists.txt | 10 +- .../painting/lancebench/tst_lancebench.cpp | 2 +- tests/manual/lance/CMakeLists.txt | 64 +- tests/manual/lance/lance.pro | 2 +- 135 files changed, 55 insertions(+), 1849 deletions(-) create mode 100644 tests/baseline/CMakeLists.txt rename tests/{auto/other/lancelot => baseline/painting}/.gitignore (100%) rename tests/{auto/other/lancelot => baseline/painting}/CMakeLists.txt (62%) rename tests/{auto/other/lancelot => baseline/painting}/images.qrc (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/alpha.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/alpha2x2.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/bitmap.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/border.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/borderimage.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/dome_argb32.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/dome_indexed.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/dome_indexed_mask.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/dome_mono.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/dome_mono_128.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/dome_mono_palette.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/dome_rgb32.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/dot.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/face.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/gam030.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/gam045.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/gam056.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/gam100.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/gam200.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/image.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/mask.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/mask_100.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/masked.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/sign.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/solid.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/solid2x2.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/struct-image-01.jpg (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/struct-image-01.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/images/zebra.png (100%) rename tests/{auto/other/lancelot => baseline/painting}/paintcommands.cpp (100%) rename tests/{auto/other/lancelot => baseline/painting}/paintcommands.h (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/aliasing.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/arcs.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/arcs2.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/background.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/background_brush.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/beziers.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/bitmaps.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/borderimage.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/brush_pens.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/brushes.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/clippath_antialiasing.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/clippaths.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/clipping.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/clipping_state.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/cliprects.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/conical_gradients.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/conical_gradients_perspectives.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/cosmetic.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/dashes.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/degeneratebeziers.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/deviceclipping.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/drawpoints.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/ellipses.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/fillrect.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/fillrect_aa.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/filltest.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/glyphruns.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/gradients.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/gradientxform_device.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/gradientxform_logical.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/gradientxform_object.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/hinting.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/image_dpr.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/image_formats.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/images.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/images2.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/join_cap_styles.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/join_cap_styles_duplicate_control_points.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/linear_gradients.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/linear_gradients_perspectives.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/linear_resolving_gradients.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/lineconsistency.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/linedashes.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/linedashes2.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/linedashes2_aa.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/lines.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/lines2.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/lines3.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/pathfill.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/paths.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/paths_aa.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/pens.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/pens_aa.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/pens_cosmetic.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/perspectives.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/perspectives2.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/pixmap_rotation.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/pixmap_rotation2.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/pixmap_scaling.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/pixmap_subpixel.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/pixmaps.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/porter_duff.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/porter_duff2.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/primitives.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/radial_gradients.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/radial_gradients_perspectives.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/rasterops.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/richtext.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/sizes.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/smallcaps_path.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/statictext.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/text.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/text_perspectives.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/thinlines.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/tiled_pixmap.qps (100%) rename tests/{auto/other/lancelot => baseline/painting}/scripts/tinydashes.qps (100%) rename tests/{auto/other/lancelot/tst_lancelot.cpp => baseline/painting/tst_baseline_painting.cpp} (99%) rename tests/{baselineserver => baseline}/shared/baselineprotocol.cpp (100%) rename tests/{baselineserver => baseline}/shared/baselineprotocol.h (100%) rename tests/{baselineserver => baseline}/shared/baselineprotocol.pri (100%) rename tests/{baselineserver => baseline}/shared/lookup3.cpp (100%) rename tests/{baselineserver => baseline}/shared/qbaselinetest.cpp (100%) rename tests/{baselineserver => baseline}/shared/qbaselinetest.h (100%) rename tests/{baselineserver => baseline}/shared/qbaselinetest.pri (100%) delete mode 100644 tests/baselineserver/.gitignore delete mode 100755 tests/baselineserver/bin/runserver delete mode 100644 tests/baselineserver/src/baselineserver.cpp delete mode 100644 tests/baselineserver/src/baselineserver.h delete mode 100644 tests/baselineserver/src/baselineserver.pro delete mode 100644 tests/baselineserver/src/baselineserver.qrc delete mode 100644 tests/baselineserver/src/main.cpp delete mode 100644 tests/baselineserver/src/report.cpp delete mode 100644 tests/baselineserver/src/report.h delete mode 100644 tests/baselineserver/src/templates/view.html diff --git a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake index b8c41882377..632bbdc67b5 100644 --- a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake +++ b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake @@ -639,6 +639,9 @@ macro(qt_build_tests) add_subdirectory(auto) endif() if(NOT QT_BUILD_MINIMAL_STATIC_TESTS) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/baseline/CMakeLists.txt") + add_subdirectory(baseline) + endif() if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/benchmarks/CMakeLists.txt" AND QT_BUILD_BENCHMARKS) add_subdirectory(benchmarks) endif() diff --git a/tests/auto/other/CMakeLists.txt b/tests/auto/other/CMakeLists.txt index f0cdeec0f2b..8255406bb5a 100644 --- a/tests/auto/other/CMakeLists.txt +++ b/tests/auto/other/CMakeLists.txt @@ -11,7 +11,6 @@ if(TARGET Qt::Widgets) # add_subdirectory(windowsmobile) <- does not exist # special case endif() if(TARGET Qt::Network AND TARGET Qt::Widgets) - add_subdirectory(lancelot) add_subdirectory(qnetworkaccessmanager_and_qprogressdialog) endif() if(MACOS AND TARGET Qt::Gui AND TARGET Qt::Widgets) diff --git a/tests/baseline/CMakeLists.txt b/tests/baseline/CMakeLists.txt new file mode 100644 index 00000000000..935df36ef99 --- /dev/null +++ b/tests/baseline/CMakeLists.txt @@ -0,0 +1,3 @@ +if(TARGET Qt::Network) + add_subdirectory(painting) +endif() diff --git a/tests/auto/other/lancelot/.gitignore b/tests/baseline/painting/.gitignore similarity index 100% rename from tests/auto/other/lancelot/.gitignore rename to tests/baseline/painting/.gitignore diff --git a/tests/auto/other/lancelot/CMakeLists.txt b/tests/baseline/painting/CMakeLists.txt similarity index 62% rename from tests/auto/other/lancelot/CMakeLists.txt rename to tests/baseline/painting/CMakeLists.txt index a4598ab65aa..95a006da756 100644 --- a/tests/auto/other/lancelot/CMakeLists.txt +++ b/tests/baseline/painting/CMakeLists.txt @@ -1,7 +1,5 @@ -# Generated from lancelot.pro. - ##################################################################### -## tst_lancelot Test: +## tst_baseline_painting Test: ##################################################################### # Collect test data @@ -10,17 +8,14 @@ file(GLOB_RECURSE test_data_glob scripts/*) list(APPEND test_data ${test_data_glob}) -qt_internal_add_test(tst_lancelot +qt_internal_add_test(tst_baseline_painting SOURCES - ../../../baselineserver/shared/baselineprotocol.cpp ../../../baselineserver/shared/baselineprotocol.h - ../../../baselineserver/shared/lookup3.cpp - ../../../baselineserver/shared/qbaselinetest.cpp ../../../baselineserver/shared/qbaselinetest.h + ../shared/baselineprotocol.cpp ../shared/baselineprotocol.h ../shared/lookup3.cpp + ../shared/qbaselinetest.cpp ../shared/qbaselinetest.h paintcommands.cpp paintcommands.h - tst_lancelot.cpp - DEFINES - QMAKESPEC=\\\"\\\" + tst_baseline_painting.cpp INCLUDE_DIRECTORIES - ../../../baselineserver/shared + ../shared PUBLIC_LIBRARIES Qt::Gui Qt::GuiPrivate @@ -61,7 +56,7 @@ set(images_resource_files "images/zebra.png" ) -qt_internal_add_resource(tst_lancelot "images" +qt_internal_add_resource(tst_baseline_painting "images" PREFIX "/" FILES @@ -72,13 +67,7 @@ qt_internal_add_resource(tst_lancelot "images" ## Scopes: ##################################################################### -qt_internal_extend_target(tst_lancelot CONDITION QT_FEATURE_opengl +qt_internal_extend_target(tst_baseline_painting CONDITION QT_FEATURE_opengl PUBLIC_LIBRARIES Qt::OpenGL ) - -#### Keys ignored in scope 4:.:../../../baselineserver/shared:../../../baselineserver/shared/qbaselinetest.pri:WIN32: -# MKSPEC = "$$replace(QMAKESPEC, \\\\, /)" - -#### Keys ignored in scope 5:.:../../../baselineserver/shared:../../../baselineserver/shared/qbaselinetest.pri:else: -# MKSPEC = "$$QMAKESPEC" diff --git a/tests/auto/other/lancelot/images.qrc b/tests/baseline/painting/images.qrc similarity index 100% rename from tests/auto/other/lancelot/images.qrc rename to tests/baseline/painting/images.qrc diff --git a/tests/auto/other/lancelot/images/alpha.png b/tests/baseline/painting/images/alpha.png similarity index 100% rename from tests/auto/other/lancelot/images/alpha.png rename to tests/baseline/painting/images/alpha.png diff --git a/tests/auto/other/lancelot/images/alpha2x2.png b/tests/baseline/painting/images/alpha2x2.png similarity index 100% rename from tests/auto/other/lancelot/images/alpha2x2.png rename to tests/baseline/painting/images/alpha2x2.png diff --git a/tests/auto/other/lancelot/images/bitmap.png b/tests/baseline/painting/images/bitmap.png similarity index 100% rename from tests/auto/other/lancelot/images/bitmap.png rename to tests/baseline/painting/images/bitmap.png diff --git a/tests/auto/other/lancelot/images/border.png b/tests/baseline/painting/images/border.png similarity index 100% rename from tests/auto/other/lancelot/images/border.png rename to tests/baseline/painting/images/border.png diff --git a/tests/auto/other/lancelot/images/borderimage.png b/tests/baseline/painting/images/borderimage.png similarity index 100% rename from tests/auto/other/lancelot/images/borderimage.png rename to tests/baseline/painting/images/borderimage.png diff --git a/tests/auto/other/lancelot/images/dome_argb32.png b/tests/baseline/painting/images/dome_argb32.png similarity index 100% rename from tests/auto/other/lancelot/images/dome_argb32.png rename to tests/baseline/painting/images/dome_argb32.png diff --git a/tests/auto/other/lancelot/images/dome_indexed.png b/tests/baseline/painting/images/dome_indexed.png similarity index 100% rename from tests/auto/other/lancelot/images/dome_indexed.png rename to tests/baseline/painting/images/dome_indexed.png diff --git a/tests/auto/other/lancelot/images/dome_indexed_mask.png b/tests/baseline/painting/images/dome_indexed_mask.png similarity index 100% rename from tests/auto/other/lancelot/images/dome_indexed_mask.png rename to tests/baseline/painting/images/dome_indexed_mask.png diff --git a/tests/auto/other/lancelot/images/dome_mono.png b/tests/baseline/painting/images/dome_mono.png similarity index 100% rename from tests/auto/other/lancelot/images/dome_mono.png rename to tests/baseline/painting/images/dome_mono.png diff --git a/tests/auto/other/lancelot/images/dome_mono_128.png b/tests/baseline/painting/images/dome_mono_128.png similarity index 100% rename from tests/auto/other/lancelot/images/dome_mono_128.png rename to tests/baseline/painting/images/dome_mono_128.png diff --git a/tests/auto/other/lancelot/images/dome_mono_palette.png b/tests/baseline/painting/images/dome_mono_palette.png similarity index 100% rename from tests/auto/other/lancelot/images/dome_mono_palette.png rename to tests/baseline/painting/images/dome_mono_palette.png diff --git a/tests/auto/other/lancelot/images/dome_rgb32.png b/tests/baseline/painting/images/dome_rgb32.png similarity index 100% rename from tests/auto/other/lancelot/images/dome_rgb32.png rename to tests/baseline/painting/images/dome_rgb32.png diff --git a/tests/auto/other/lancelot/images/dot.png b/tests/baseline/painting/images/dot.png similarity index 100% rename from tests/auto/other/lancelot/images/dot.png rename to tests/baseline/painting/images/dot.png diff --git a/tests/auto/other/lancelot/images/face.png b/tests/baseline/painting/images/face.png similarity index 100% rename from tests/auto/other/lancelot/images/face.png rename to tests/baseline/painting/images/face.png diff --git a/tests/auto/other/lancelot/images/gam030.png b/tests/baseline/painting/images/gam030.png similarity index 100% rename from tests/auto/other/lancelot/images/gam030.png rename to tests/baseline/painting/images/gam030.png diff --git a/tests/auto/other/lancelot/images/gam045.png b/tests/baseline/painting/images/gam045.png similarity index 100% rename from tests/auto/other/lancelot/images/gam045.png rename to tests/baseline/painting/images/gam045.png diff --git a/tests/auto/other/lancelot/images/gam056.png b/tests/baseline/painting/images/gam056.png similarity index 100% rename from tests/auto/other/lancelot/images/gam056.png rename to tests/baseline/painting/images/gam056.png diff --git a/tests/auto/other/lancelot/images/gam100.png b/tests/baseline/painting/images/gam100.png similarity index 100% rename from tests/auto/other/lancelot/images/gam100.png rename to tests/baseline/painting/images/gam100.png diff --git a/tests/auto/other/lancelot/images/gam200.png b/tests/baseline/painting/images/gam200.png similarity index 100% rename from tests/auto/other/lancelot/images/gam200.png rename to tests/baseline/painting/images/gam200.png diff --git a/tests/auto/other/lancelot/images/image.png b/tests/baseline/painting/images/image.png similarity index 100% rename from tests/auto/other/lancelot/images/image.png rename to tests/baseline/painting/images/image.png diff --git a/tests/auto/other/lancelot/images/mask.png b/tests/baseline/painting/images/mask.png similarity index 100% rename from tests/auto/other/lancelot/images/mask.png rename to tests/baseline/painting/images/mask.png diff --git a/tests/auto/other/lancelot/images/mask_100.png b/tests/baseline/painting/images/mask_100.png similarity index 100% rename from tests/auto/other/lancelot/images/mask_100.png rename to tests/baseline/painting/images/mask_100.png diff --git a/tests/auto/other/lancelot/images/masked.png b/tests/baseline/painting/images/masked.png similarity index 100% rename from tests/auto/other/lancelot/images/masked.png rename to tests/baseline/painting/images/masked.png diff --git a/tests/auto/other/lancelot/images/sign.png b/tests/baseline/painting/images/sign.png similarity index 100% rename from tests/auto/other/lancelot/images/sign.png rename to tests/baseline/painting/images/sign.png diff --git a/tests/auto/other/lancelot/images/solid.png b/tests/baseline/painting/images/solid.png similarity index 100% rename from tests/auto/other/lancelot/images/solid.png rename to tests/baseline/painting/images/solid.png diff --git a/tests/auto/other/lancelot/images/solid2x2.png b/tests/baseline/painting/images/solid2x2.png similarity index 100% rename from tests/auto/other/lancelot/images/solid2x2.png rename to tests/baseline/painting/images/solid2x2.png diff --git a/tests/auto/other/lancelot/images/struct-image-01.jpg b/tests/baseline/painting/images/struct-image-01.jpg similarity index 100% rename from tests/auto/other/lancelot/images/struct-image-01.jpg rename to tests/baseline/painting/images/struct-image-01.jpg diff --git a/tests/auto/other/lancelot/images/struct-image-01.png b/tests/baseline/painting/images/struct-image-01.png similarity index 100% rename from tests/auto/other/lancelot/images/struct-image-01.png rename to tests/baseline/painting/images/struct-image-01.png diff --git a/tests/auto/other/lancelot/images/zebra.png b/tests/baseline/painting/images/zebra.png similarity index 100% rename from tests/auto/other/lancelot/images/zebra.png rename to tests/baseline/painting/images/zebra.png diff --git a/tests/auto/other/lancelot/paintcommands.cpp b/tests/baseline/painting/paintcommands.cpp similarity index 100% rename from tests/auto/other/lancelot/paintcommands.cpp rename to tests/baseline/painting/paintcommands.cpp diff --git a/tests/auto/other/lancelot/paintcommands.h b/tests/baseline/painting/paintcommands.h similarity index 100% rename from tests/auto/other/lancelot/paintcommands.h rename to tests/baseline/painting/paintcommands.h diff --git a/tests/auto/other/lancelot/scripts/aliasing.qps b/tests/baseline/painting/scripts/aliasing.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/aliasing.qps rename to tests/baseline/painting/scripts/aliasing.qps diff --git a/tests/auto/other/lancelot/scripts/arcs.qps b/tests/baseline/painting/scripts/arcs.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/arcs.qps rename to tests/baseline/painting/scripts/arcs.qps diff --git a/tests/auto/other/lancelot/scripts/arcs2.qps b/tests/baseline/painting/scripts/arcs2.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/arcs2.qps rename to tests/baseline/painting/scripts/arcs2.qps diff --git a/tests/auto/other/lancelot/scripts/background.qps b/tests/baseline/painting/scripts/background.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/background.qps rename to tests/baseline/painting/scripts/background.qps diff --git a/tests/auto/other/lancelot/scripts/background_brush.qps b/tests/baseline/painting/scripts/background_brush.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/background_brush.qps rename to tests/baseline/painting/scripts/background_brush.qps diff --git a/tests/auto/other/lancelot/scripts/beziers.qps b/tests/baseline/painting/scripts/beziers.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/beziers.qps rename to tests/baseline/painting/scripts/beziers.qps diff --git a/tests/auto/other/lancelot/scripts/bitmaps.qps b/tests/baseline/painting/scripts/bitmaps.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/bitmaps.qps rename to tests/baseline/painting/scripts/bitmaps.qps diff --git a/tests/auto/other/lancelot/scripts/borderimage.qps b/tests/baseline/painting/scripts/borderimage.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/borderimage.qps rename to tests/baseline/painting/scripts/borderimage.qps diff --git a/tests/auto/other/lancelot/scripts/brush_pens.qps b/tests/baseline/painting/scripts/brush_pens.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/brush_pens.qps rename to tests/baseline/painting/scripts/brush_pens.qps diff --git a/tests/auto/other/lancelot/scripts/brushes.qps b/tests/baseline/painting/scripts/brushes.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/brushes.qps rename to tests/baseline/painting/scripts/brushes.qps diff --git a/tests/auto/other/lancelot/scripts/clippath_antialiasing.qps b/tests/baseline/painting/scripts/clippath_antialiasing.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/clippath_antialiasing.qps rename to tests/baseline/painting/scripts/clippath_antialiasing.qps diff --git a/tests/auto/other/lancelot/scripts/clippaths.qps b/tests/baseline/painting/scripts/clippaths.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/clippaths.qps rename to tests/baseline/painting/scripts/clippaths.qps diff --git a/tests/auto/other/lancelot/scripts/clipping.qps b/tests/baseline/painting/scripts/clipping.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/clipping.qps rename to tests/baseline/painting/scripts/clipping.qps diff --git a/tests/auto/other/lancelot/scripts/clipping_state.qps b/tests/baseline/painting/scripts/clipping_state.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/clipping_state.qps rename to tests/baseline/painting/scripts/clipping_state.qps diff --git a/tests/auto/other/lancelot/scripts/cliprects.qps b/tests/baseline/painting/scripts/cliprects.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/cliprects.qps rename to tests/baseline/painting/scripts/cliprects.qps diff --git a/tests/auto/other/lancelot/scripts/conical_gradients.qps b/tests/baseline/painting/scripts/conical_gradients.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/conical_gradients.qps rename to tests/baseline/painting/scripts/conical_gradients.qps diff --git a/tests/auto/other/lancelot/scripts/conical_gradients_perspectives.qps b/tests/baseline/painting/scripts/conical_gradients_perspectives.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/conical_gradients_perspectives.qps rename to tests/baseline/painting/scripts/conical_gradients_perspectives.qps diff --git a/tests/auto/other/lancelot/scripts/cosmetic.qps b/tests/baseline/painting/scripts/cosmetic.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/cosmetic.qps rename to tests/baseline/painting/scripts/cosmetic.qps diff --git a/tests/auto/other/lancelot/scripts/dashes.qps b/tests/baseline/painting/scripts/dashes.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/dashes.qps rename to tests/baseline/painting/scripts/dashes.qps diff --git a/tests/auto/other/lancelot/scripts/degeneratebeziers.qps b/tests/baseline/painting/scripts/degeneratebeziers.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/degeneratebeziers.qps rename to tests/baseline/painting/scripts/degeneratebeziers.qps diff --git a/tests/auto/other/lancelot/scripts/deviceclipping.qps b/tests/baseline/painting/scripts/deviceclipping.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/deviceclipping.qps rename to tests/baseline/painting/scripts/deviceclipping.qps diff --git a/tests/auto/other/lancelot/scripts/drawpoints.qps b/tests/baseline/painting/scripts/drawpoints.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/drawpoints.qps rename to tests/baseline/painting/scripts/drawpoints.qps diff --git a/tests/auto/other/lancelot/scripts/ellipses.qps b/tests/baseline/painting/scripts/ellipses.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/ellipses.qps rename to tests/baseline/painting/scripts/ellipses.qps diff --git a/tests/auto/other/lancelot/scripts/fillrect.qps b/tests/baseline/painting/scripts/fillrect.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/fillrect.qps rename to tests/baseline/painting/scripts/fillrect.qps diff --git a/tests/auto/other/lancelot/scripts/fillrect_aa.qps b/tests/baseline/painting/scripts/fillrect_aa.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/fillrect_aa.qps rename to tests/baseline/painting/scripts/fillrect_aa.qps diff --git a/tests/auto/other/lancelot/scripts/filltest.qps b/tests/baseline/painting/scripts/filltest.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/filltest.qps rename to tests/baseline/painting/scripts/filltest.qps diff --git a/tests/auto/other/lancelot/scripts/glyphruns.qps b/tests/baseline/painting/scripts/glyphruns.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/glyphruns.qps rename to tests/baseline/painting/scripts/glyphruns.qps diff --git a/tests/auto/other/lancelot/scripts/gradients.qps b/tests/baseline/painting/scripts/gradients.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/gradients.qps rename to tests/baseline/painting/scripts/gradients.qps diff --git a/tests/auto/other/lancelot/scripts/gradientxform_device.qps b/tests/baseline/painting/scripts/gradientxform_device.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/gradientxform_device.qps rename to tests/baseline/painting/scripts/gradientxform_device.qps diff --git a/tests/auto/other/lancelot/scripts/gradientxform_logical.qps b/tests/baseline/painting/scripts/gradientxform_logical.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/gradientxform_logical.qps rename to tests/baseline/painting/scripts/gradientxform_logical.qps diff --git a/tests/auto/other/lancelot/scripts/gradientxform_object.qps b/tests/baseline/painting/scripts/gradientxform_object.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/gradientxform_object.qps rename to tests/baseline/painting/scripts/gradientxform_object.qps diff --git a/tests/auto/other/lancelot/scripts/hinting.qps b/tests/baseline/painting/scripts/hinting.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/hinting.qps rename to tests/baseline/painting/scripts/hinting.qps diff --git a/tests/auto/other/lancelot/scripts/image_dpr.qps b/tests/baseline/painting/scripts/image_dpr.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/image_dpr.qps rename to tests/baseline/painting/scripts/image_dpr.qps diff --git a/tests/auto/other/lancelot/scripts/image_formats.qps b/tests/baseline/painting/scripts/image_formats.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/image_formats.qps rename to tests/baseline/painting/scripts/image_formats.qps diff --git a/tests/auto/other/lancelot/scripts/images.qps b/tests/baseline/painting/scripts/images.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/images.qps rename to tests/baseline/painting/scripts/images.qps diff --git a/tests/auto/other/lancelot/scripts/images2.qps b/tests/baseline/painting/scripts/images2.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/images2.qps rename to tests/baseline/painting/scripts/images2.qps diff --git a/tests/auto/other/lancelot/scripts/join_cap_styles.qps b/tests/baseline/painting/scripts/join_cap_styles.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/join_cap_styles.qps rename to tests/baseline/painting/scripts/join_cap_styles.qps diff --git a/tests/auto/other/lancelot/scripts/join_cap_styles_duplicate_control_points.qps b/tests/baseline/painting/scripts/join_cap_styles_duplicate_control_points.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/join_cap_styles_duplicate_control_points.qps rename to tests/baseline/painting/scripts/join_cap_styles_duplicate_control_points.qps diff --git a/tests/auto/other/lancelot/scripts/linear_gradients.qps b/tests/baseline/painting/scripts/linear_gradients.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/linear_gradients.qps rename to tests/baseline/painting/scripts/linear_gradients.qps diff --git a/tests/auto/other/lancelot/scripts/linear_gradients_perspectives.qps b/tests/baseline/painting/scripts/linear_gradients_perspectives.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/linear_gradients_perspectives.qps rename to tests/baseline/painting/scripts/linear_gradients_perspectives.qps diff --git a/tests/auto/other/lancelot/scripts/linear_resolving_gradients.qps b/tests/baseline/painting/scripts/linear_resolving_gradients.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/linear_resolving_gradients.qps rename to tests/baseline/painting/scripts/linear_resolving_gradients.qps diff --git a/tests/auto/other/lancelot/scripts/lineconsistency.qps b/tests/baseline/painting/scripts/lineconsistency.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/lineconsistency.qps rename to tests/baseline/painting/scripts/lineconsistency.qps diff --git a/tests/auto/other/lancelot/scripts/linedashes.qps b/tests/baseline/painting/scripts/linedashes.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/linedashes.qps rename to tests/baseline/painting/scripts/linedashes.qps diff --git a/tests/auto/other/lancelot/scripts/linedashes2.qps b/tests/baseline/painting/scripts/linedashes2.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/linedashes2.qps rename to tests/baseline/painting/scripts/linedashes2.qps diff --git a/tests/auto/other/lancelot/scripts/linedashes2_aa.qps b/tests/baseline/painting/scripts/linedashes2_aa.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/linedashes2_aa.qps rename to tests/baseline/painting/scripts/linedashes2_aa.qps diff --git a/tests/auto/other/lancelot/scripts/lines.qps b/tests/baseline/painting/scripts/lines.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/lines.qps rename to tests/baseline/painting/scripts/lines.qps diff --git a/tests/auto/other/lancelot/scripts/lines2.qps b/tests/baseline/painting/scripts/lines2.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/lines2.qps rename to tests/baseline/painting/scripts/lines2.qps diff --git a/tests/auto/other/lancelot/scripts/lines3.qps b/tests/baseline/painting/scripts/lines3.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/lines3.qps rename to tests/baseline/painting/scripts/lines3.qps diff --git a/tests/auto/other/lancelot/scripts/pathfill.qps b/tests/baseline/painting/scripts/pathfill.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/pathfill.qps rename to tests/baseline/painting/scripts/pathfill.qps diff --git a/tests/auto/other/lancelot/scripts/paths.qps b/tests/baseline/painting/scripts/paths.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/paths.qps rename to tests/baseline/painting/scripts/paths.qps diff --git a/tests/auto/other/lancelot/scripts/paths_aa.qps b/tests/baseline/painting/scripts/paths_aa.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/paths_aa.qps rename to tests/baseline/painting/scripts/paths_aa.qps diff --git a/tests/auto/other/lancelot/scripts/pens.qps b/tests/baseline/painting/scripts/pens.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/pens.qps rename to tests/baseline/painting/scripts/pens.qps diff --git a/tests/auto/other/lancelot/scripts/pens_aa.qps b/tests/baseline/painting/scripts/pens_aa.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/pens_aa.qps rename to tests/baseline/painting/scripts/pens_aa.qps diff --git a/tests/auto/other/lancelot/scripts/pens_cosmetic.qps b/tests/baseline/painting/scripts/pens_cosmetic.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/pens_cosmetic.qps rename to tests/baseline/painting/scripts/pens_cosmetic.qps diff --git a/tests/auto/other/lancelot/scripts/perspectives.qps b/tests/baseline/painting/scripts/perspectives.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/perspectives.qps rename to tests/baseline/painting/scripts/perspectives.qps diff --git a/tests/auto/other/lancelot/scripts/perspectives2.qps b/tests/baseline/painting/scripts/perspectives2.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/perspectives2.qps rename to tests/baseline/painting/scripts/perspectives2.qps diff --git a/tests/auto/other/lancelot/scripts/pixmap_rotation.qps b/tests/baseline/painting/scripts/pixmap_rotation.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/pixmap_rotation.qps rename to tests/baseline/painting/scripts/pixmap_rotation.qps diff --git a/tests/auto/other/lancelot/scripts/pixmap_rotation2.qps b/tests/baseline/painting/scripts/pixmap_rotation2.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/pixmap_rotation2.qps rename to tests/baseline/painting/scripts/pixmap_rotation2.qps diff --git a/tests/auto/other/lancelot/scripts/pixmap_scaling.qps b/tests/baseline/painting/scripts/pixmap_scaling.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/pixmap_scaling.qps rename to tests/baseline/painting/scripts/pixmap_scaling.qps diff --git a/tests/auto/other/lancelot/scripts/pixmap_subpixel.qps b/tests/baseline/painting/scripts/pixmap_subpixel.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/pixmap_subpixel.qps rename to tests/baseline/painting/scripts/pixmap_subpixel.qps diff --git a/tests/auto/other/lancelot/scripts/pixmaps.qps b/tests/baseline/painting/scripts/pixmaps.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/pixmaps.qps rename to tests/baseline/painting/scripts/pixmaps.qps diff --git a/tests/auto/other/lancelot/scripts/porter_duff.qps b/tests/baseline/painting/scripts/porter_duff.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/porter_duff.qps rename to tests/baseline/painting/scripts/porter_duff.qps diff --git a/tests/auto/other/lancelot/scripts/porter_duff2.qps b/tests/baseline/painting/scripts/porter_duff2.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/porter_duff2.qps rename to tests/baseline/painting/scripts/porter_duff2.qps diff --git a/tests/auto/other/lancelot/scripts/primitives.qps b/tests/baseline/painting/scripts/primitives.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/primitives.qps rename to tests/baseline/painting/scripts/primitives.qps diff --git a/tests/auto/other/lancelot/scripts/radial_gradients.qps b/tests/baseline/painting/scripts/radial_gradients.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/radial_gradients.qps rename to tests/baseline/painting/scripts/radial_gradients.qps diff --git a/tests/auto/other/lancelot/scripts/radial_gradients_perspectives.qps b/tests/baseline/painting/scripts/radial_gradients_perspectives.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/radial_gradients_perspectives.qps rename to tests/baseline/painting/scripts/radial_gradients_perspectives.qps diff --git a/tests/auto/other/lancelot/scripts/rasterops.qps b/tests/baseline/painting/scripts/rasterops.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/rasterops.qps rename to tests/baseline/painting/scripts/rasterops.qps diff --git a/tests/auto/other/lancelot/scripts/richtext.qps b/tests/baseline/painting/scripts/richtext.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/richtext.qps rename to tests/baseline/painting/scripts/richtext.qps diff --git a/tests/auto/other/lancelot/scripts/sizes.qps b/tests/baseline/painting/scripts/sizes.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/sizes.qps rename to tests/baseline/painting/scripts/sizes.qps diff --git a/tests/auto/other/lancelot/scripts/smallcaps_path.qps b/tests/baseline/painting/scripts/smallcaps_path.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/smallcaps_path.qps rename to tests/baseline/painting/scripts/smallcaps_path.qps diff --git a/tests/auto/other/lancelot/scripts/statictext.qps b/tests/baseline/painting/scripts/statictext.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/statictext.qps rename to tests/baseline/painting/scripts/statictext.qps diff --git a/tests/auto/other/lancelot/scripts/text.qps b/tests/baseline/painting/scripts/text.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/text.qps rename to tests/baseline/painting/scripts/text.qps diff --git a/tests/auto/other/lancelot/scripts/text_perspectives.qps b/tests/baseline/painting/scripts/text_perspectives.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/text_perspectives.qps rename to tests/baseline/painting/scripts/text_perspectives.qps diff --git a/tests/auto/other/lancelot/scripts/thinlines.qps b/tests/baseline/painting/scripts/thinlines.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/thinlines.qps rename to tests/baseline/painting/scripts/thinlines.qps diff --git a/tests/auto/other/lancelot/scripts/tiled_pixmap.qps b/tests/baseline/painting/scripts/tiled_pixmap.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/tiled_pixmap.qps rename to tests/baseline/painting/scripts/tiled_pixmap.qps diff --git a/tests/auto/other/lancelot/scripts/tinydashes.qps b/tests/baseline/painting/scripts/tinydashes.qps similarity index 100% rename from tests/auto/other/lancelot/scripts/tinydashes.qps rename to tests/baseline/painting/scripts/tinydashes.qps diff --git a/tests/auto/other/lancelot/tst_lancelot.cpp b/tests/baseline/painting/tst_baseline_painting.cpp similarity index 99% rename from tests/auto/other/lancelot/tst_lancelot.cpp rename to tests/baseline/painting/tst_baseline_painting.cpp index 0f136d4938a..a5d787f6ceb 100644 --- a/tests/auto/other/lancelot/tst_lancelot.cpp +++ b/tests/baseline/painting/tst_baseline_painting.cpp @@ -486,4 +486,4 @@ int main(int argc, char *argv[]) return _realmain(argc, argv); } -#include "tst_lancelot.moc" +#include "tst_baseline_painting.moc" diff --git a/tests/baselineserver/shared/baselineprotocol.cpp b/tests/baseline/shared/baselineprotocol.cpp similarity index 100% rename from tests/baselineserver/shared/baselineprotocol.cpp rename to tests/baseline/shared/baselineprotocol.cpp diff --git a/tests/baselineserver/shared/baselineprotocol.h b/tests/baseline/shared/baselineprotocol.h similarity index 100% rename from tests/baselineserver/shared/baselineprotocol.h rename to tests/baseline/shared/baselineprotocol.h diff --git a/tests/baselineserver/shared/baselineprotocol.pri b/tests/baseline/shared/baselineprotocol.pri similarity index 100% rename from tests/baselineserver/shared/baselineprotocol.pri rename to tests/baseline/shared/baselineprotocol.pri diff --git a/tests/baselineserver/shared/lookup3.cpp b/tests/baseline/shared/lookup3.cpp similarity index 100% rename from tests/baselineserver/shared/lookup3.cpp rename to tests/baseline/shared/lookup3.cpp diff --git a/tests/baselineserver/shared/qbaselinetest.cpp b/tests/baseline/shared/qbaselinetest.cpp similarity index 100% rename from tests/baselineserver/shared/qbaselinetest.cpp rename to tests/baseline/shared/qbaselinetest.cpp diff --git a/tests/baselineserver/shared/qbaselinetest.h b/tests/baseline/shared/qbaselinetest.h similarity index 100% rename from tests/baselineserver/shared/qbaselinetest.h rename to tests/baseline/shared/qbaselinetest.h diff --git a/tests/baselineserver/shared/qbaselinetest.pri b/tests/baseline/shared/qbaselinetest.pri similarity index 100% rename from tests/baselineserver/shared/qbaselinetest.pri rename to tests/baseline/shared/qbaselinetest.pri diff --git a/tests/baselineserver/.gitignore b/tests/baselineserver/.gitignore deleted file mode 100644 index cc513e0df25..00000000000 --- a/tests/baselineserver/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -storage -bin/baselineserver diff --git a/tests/baselineserver/bin/runserver b/tests/baselineserver/bin/runserver deleted file mode 100755 index 48c5c1d0869..00000000000 --- a/tests/baselineserver/bin/runserver +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -logfile=baselineserver.log - -while true; do - echo >> $logfile - echo -n "***RESTARTING*** " >> $logfile - date >> $logfile - - ./baselineserver 2>&1 | tee -a $logfile - - sleep 2 -done diff --git a/tests/baselineserver/src/baselineserver.cpp b/tests/baselineserver/src/baselineserver.cpp deleted file mode 100644 index c6e12dc09cf..00000000000 --- a/tests/baselineserver/src/baselineserver.cpp +++ /dev/null @@ -1,853 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#define QT_USE_FAST_CONCATENATION -#define QT_USE_FAST_OPERATOR_PLUS - -#include "baselineserver.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// extra fields, for use in image metadata storage -const QString PI_ImageChecksum(QLS("ImageChecksum")); -const QString PI_RunId(QLS("RunId")); -const QString PI_CreationDate(QLS("CreationDate")); - -QString BaselineServer::storage; -QString BaselineServer::url; -QStringList BaselineServer::pathKeys; - -BaselineServer::BaselineServer(QObject *parent) - : QTcpServer(parent), lastRunIdIdx(0) -{ - QFileInfo me(QCoreApplication::applicationFilePath()); - meLastMod = me.lastModified(); - heartbeatTimer = new QTimer(this); - connect(heartbeatTimer, SIGNAL(timeout()), this, SLOT(heartbeat())); - heartbeatTimer->start(HEARTBEAT*1000); -} - -QString BaselineServer::storagePath() -{ - if (storage.isEmpty()) { - storage = QLS(qgetenv("QT_LANCELOT_DIR")); - if (storage.isEmpty()) - storage = QLS("/var/www"); - } - return storage; -} - -QString BaselineServer::baseUrl() -{ - if (url.isEmpty()) { - url = QLS("http://") - + QHostInfo::localHostName().toLatin1() + '.' - + QHostInfo::localDomainName().toLatin1() + '/'; - } - return url; -} - -QStringList BaselineServer::defaultPathKeys() -{ - if (pathKeys.isEmpty()) - pathKeys << PI_QtVersion << PI_QMakeSpec << PI_HostName; - return pathKeys; -} - -void BaselineServer::incomingConnection(qintptr socketDescriptor) -{ - QString runId = QDateTime::currentDateTime().toString(QLS("MMMdd-hhmmss")); - if (runId == lastRunId) { - runId += QLC('-') + QString::number(++lastRunIdIdx); - } else { - lastRunId = runId; - lastRunIdIdx = 0; - } - qDebug() << "Server: New connection! RunId:" << runId; - BaselineThread *thread = new BaselineThread(runId, socketDescriptor, this); - connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); - thread->start(); -} - -void BaselineServer::heartbeat() -{ - // The idea is to exit to be restarted when modified, as soon as not actually serving - QFileInfo me(QCoreApplication::applicationFilePath()); - if (me.lastModified() == meLastMod) - return; - if (!me.exists() || !me.isExecutable()) - return; - - //# (could close() here to avoid accepting new connections, to avoid livelock) - //# also, could check for a timeout to force exit, to avoid hung threads blocking - bool isServing = false; - foreach(BaselineThread *thread, findChildren()) { - if (thread->isRunning()) { - isServing = true; - break; - } - } - - if (!isServing) - QCoreApplication::exit(); -} - -BaselineThread::BaselineThread(const QString &runId, int socketDescriptor, QObject *parent) - : QThread(parent), runId(runId), socketDescriptor(socketDescriptor) -{ -} - -void BaselineThread::run() -{ - BaselineHandler handler(runId, socketDescriptor); - exec(); -} - - -BaselineHandler::BaselineHandler(const QString &runId, int socketDescriptor) - : QObject(), runId(runId), connectionEstablished(false), settings(0), fuzzLevel(0) -{ - idleTimer = new QTimer(this); - idleTimer->setSingleShot(true); - idleTimer->setInterval(IDLE_CLIENT_TIMEOUT * 1000); - connect(idleTimer, SIGNAL(timeout()), this, SLOT(idleClientTimeout())); - idleTimer->start(); - - if (socketDescriptor == -1) - return; - - connect(&proto.socket, SIGNAL(readyRead()), this, SLOT(receiveRequest())); - connect(&proto.socket, SIGNAL(disconnected()), this, SLOT(receiveDisconnect())); - proto.socket.setSocketDescriptor(socketDescriptor); - proto.socket.setSocketOption(QAbstractSocket::KeepAliveOption, 1); -} - -const char *BaselineHandler::logtime() -{ - return 0; - //return QTime::currentTime().toString(QLS("mm:ss.zzz")); -} - -QString BaselineHandler::projectPath(bool absolute) const -{ - QString p = clientInfo.value(PI_Project); - return absolute ? BaselineServer::storagePath() + QLC('/') + p : p; -} - -bool BaselineHandler::checkClient(QByteArray *errMsg, bool *dryRunMode) -{ - if (!errMsg) - return false; - if (clientInfo.value(PI_Project).isEmpty() || clientInfo.value(PI_TestCase).isEmpty()) { - *errMsg = "No Project and/or TestCase specified in client info."; - return false; - } - - // Determine ad-hoc state ### hardcoded for now - if (clientInfo.value(PI_TestCase) == QLS("tst_Lancelot")) { - //### Todo: push this stuff out in a script - if (!clientInfo.isAdHocRun()) { - // ### comp. with earlier versions still running (4.8) (?) - clientInfo.setAdHocRun(clientInfo.value(PI_PulseGitBranch).isEmpty() && clientInfo.value(PI_PulseTestrBranch).isEmpty()); - } - } - else { - // TBD - } - - if (clientInfo.isAdHocRun()) { - if (dryRunMode) - *dryRunMode = false; - return true; - } - - // Not ad hoc: filter the client - settings->beginGroup("ClientFilters"); - bool matched = false; - bool dryRunReq = false; - foreach (const QString &rule, settings->childKeys()) { - //qDebug() << " > RULE" << rule; - dryRunReq = false; - QString ruleMode = settings->value(rule).toString().toLower(); - if (ruleMode == QLS("dryrun")) - dryRunReq = true; - else if (ruleMode != QLS("enabled")) - continue; - settings->beginGroup(rule); - bool ruleMatched = true; - foreach (const QString &filterKey, settings->childKeys()) { - //qDebug() << " > FILTER" << filterKey; - QString filter = settings->value(filterKey).toString(); - if (filter.isEmpty()) - continue; - QString platVal = clientInfo.value(filterKey); - if (!platVal.contains(filter)) { - ruleMatched = false; - break; - } - } - if (ruleMatched) { - ruleName = rule; - matched = true; - break; - } - settings->endGroup(); - } - - if (!matched && errMsg) - *errMsg = "Non-adhoc client did not match any filter rule in " + settings->fileName().toLatin1(); - - if (matched && dryRunMode) - *dryRunMode = dryRunReq; - - // NB! Must reset the settings object before returning - while (!settings->group().isEmpty()) - settings->endGroup(); - - return matched; -} - -bool BaselineHandler::establishConnection() -{ - if (!proto.acceptConnection(&clientInfo)) { - qWarning() << runId << logtime() << "Accepting new connection from" << proto.socket.peerAddress().toString() << "failed." << proto.errorMessage(); - proto.sendBlock(BaselineProtocol::Abort, proto.errorMessage().toLatin1()); // In case the client can hear us, tell it what's wrong. - proto.socket.disconnectFromHost(); - return false; - } - QString logMsg; - foreach (QString key, clientInfo.keys()) { - if (key != PI_HostName && key != PI_HostAddress) - logMsg += key + QLS(": '") + clientInfo.value(key) + QLS("', "); - } - qDebug() << runId << logtime() << "Connection established with" << clientInfo.value(PI_HostName) - << '[' << qPrintable(clientInfo.value(PI_HostAddress)) << ']' << logMsg - << "Overrides:" << clientInfo.overrides() << "AdHoc-Run:" << clientInfo.isAdHocRun(); - - // ### Hardcoded backwards compatibility: add project field for certain existing clients that lack it - if (clientInfo.value(PI_Project).isEmpty()) { - QString tc = clientInfo.value(PI_TestCase); - if (tc == QLS("tst_Lancelot")) - clientInfo.insert(PI_Project, QLS("Raster")); - else if (tc == QLS("tst_Scenegraph")) - clientInfo.insert(PI_Project, QLS("SceneGraph")); - else - clientInfo.insert(PI_Project, QLS("Other")); - } - - QString settingsFile = projectPath() + QLS("/config.ini"); - settings = new QSettings(settingsFile, QSettings::IniFormat, this); - - QByteArray errMsg; - bool dryRunMode = false; - if (!checkClient(&errMsg, &dryRunMode)) { - qDebug() << runId << logtime() << "Rejecting connection:" << errMsg; - proto.sendBlock(BaselineProtocol::Abort, errMsg); - proto.socket.disconnectFromHost(); - return false; - } - - fuzzLevel = qBound(0, settings->value("FuzzLevel").toInt(), 100); - if (!clientInfo.isAdHocRun()) { - qDebug() << runId << logtime() << "Client matches filter rule" << ruleName - << "Dryrun:" << dryRunMode - << "FuzzLevel:" << fuzzLevel - << "ReportMissingResults:" << settings->value("ReportMissingResults").toBool(); - } - - proto.sendBlock(dryRunMode ? BaselineProtocol::DoDryRun : BaselineProtocol::Ack, QByteArray()); - report.init(this, runId, clientInfo, settings); - return true; -} - -void BaselineHandler::receiveRequest() -{ - idleTimer->start(); // Restart idle client timeout - - if (!connectionEstablished) { - connectionEstablished = establishConnection(); - return; - } - - QByteArray block; - BaselineProtocol::Command cmd; - if (!proto.receiveBlock(&cmd, &block)) { - qWarning() << runId << logtime() << "Command reception failed. "<< proto.errorMessage(); - QThread::currentThread()->exit(1); - return; - } - - switch(cmd) { - case BaselineProtocol::RequestBaselineChecksums: - provideBaselineChecksums(block); - break; - case BaselineProtocol::AcceptMatch: - recordMatch(block); - break; - case BaselineProtocol::AcceptNewBaseline: - storeImage(block, true); - break; - case BaselineProtocol::AcceptMismatch: - storeImage(block, false); - break; - default: - qWarning() << runId << logtime() << "Unknown command received. " << proto.errorMessage(); - proto.sendBlock(BaselineProtocol::UnknownError, QByteArray()); - } -} - - -void BaselineHandler::provideBaselineChecksums(const QByteArray &itemListBlock) -{ - ImageItemList itemList; - QDataStream ds(itemListBlock); - ds >> itemList; - qDebug() << runId << logtime() << "Received request for checksums for" << itemList.count() - << "items in test function" << itemList.at(0).testFunction; - - for (ImageItemList::iterator i = itemList.begin(); i != itemList.end(); ++i) { - i->imageChecksums.clear(); - i->status = ImageItem::BaselineNotFound; - QString prefix = pathForItem(*i, true); - PlatformInfo itemData = fetchItemMetadata(prefix); - if (itemData.contains(PI_ImageChecksum)) { - bool ok = false; - quint64 checksum = itemData.value(PI_ImageChecksum).toULongLong(&ok, 16); - if (ok) { - i->imageChecksums.prepend(checksum); - i->status = ImageItem::Ok; - } - } - } - - // Find and mark blacklisted items - QString context = pathForItem(itemList.at(0), true, false).section(QLC('/'), 0, -2); - if (itemList.count() > 0) { - QFile file(BaselineServer::storagePath() + QLC('/') + context + QLS("/BLACKLIST")); - if (file.open(QIODevice::ReadOnly)) { - QTextStream in(&file); - do { - QString itemName = in.readLine(); - if (!itemName.isNull()) { - for (ImageItemList::iterator i = itemList.begin(); i != itemList.end(); ++i) { - if (i->itemName == itemName) - i->status = ImageItem::IgnoreItem; - } - } - } while (!in.atEnd()); - } - } - - QByteArray block; - QDataStream ods(&block, QIODevice::WriteOnly); - ods << itemList; - proto.sendBlock(BaselineProtocol::Ack, block); - report.addItems(itemList); -} - - -void BaselineHandler::recordMatch(const QByteArray &itemBlock) -{ - QDataStream ds(itemBlock); - ImageItem item; - ds >> item; - report.addResult(item); - proto.sendBlock(BaselineProtocol::Ack, QByteArray()); -} - - -void BaselineHandler::storeImage(const QByteArray &itemBlock, bool isBaseline) -{ - QDataStream ds(itemBlock); - ImageItem item; - ds >> item; - - if (isBaseline && !clientInfo.overrides().isEmpty()) { - qDebug() << runId << logtime() << "Received baseline from client with override info, ignoring. Item:" << item.itemName; - proto.sendBlock(BaselineProtocol::UnknownError, "New baselines not accepted from client with override info."); - return; - } - - QString blPrefix = pathForItem(item, true); - QString mmPrefix = pathForItem(item, false); - QString prefix = isBaseline ? blPrefix : mmPrefix; - - qDebug() << runId << logtime() << "Received" << (isBaseline ? "baseline" : "mismatched") << "image for:" << item.itemName << "Storing in" << prefix; - - // Reply to the client - QString msg; - if (isBaseline) - msg = QLS("New baseline image stored: ") + blPrefix + QLS(FileFormat); - else - msg = BaselineServer::baseUrl() + report.filePath(); - - if (isBaseline || !fuzzLevel) - proto.sendBlock(BaselineProtocol::Ack, msg.toLatin1()); // Do early reply if possible: don't make the client wait longer than necessary - - // Store the image - QString dir = prefix.section(QLC('/'), 0, -2); - QDir cwd; - if (!cwd.exists(dir)) - cwd.mkpath(dir); - item.image.save(prefix + QLS(FileFormat), FileFormat); - - PlatformInfo itemData = clientInfo; - itemData.insert(PI_ImageChecksum, QString::number(item.imageChecksums.at(0), 16)); //# Only the first is stored. TBD: get rid of list - itemData.insert(PI_RunId, runId); - itemData.insert(PI_CreationDate, QDateTime::currentDateTime().toString()); - storeItemMetadata(itemData, prefix); - - if (!isBaseline) { - // Do fuzzy matching - bool fuzzyMatch = false; - if (fuzzLevel) { - BaselineProtocol::Command cmd = BaselineProtocol::Ack; - fuzzyMatch = fuzzyCompare(blPrefix, mmPrefix); - if (fuzzyMatch) { - msg.prepend(QString("Fuzzy match at fuzzlevel %1%. Report: ").arg(fuzzLevel)); - cmd = BaselineProtocol::FuzzyMatch; - } - proto.sendBlock(cmd, msg.toLatin1()); // We didn't reply earlier - } - - // Add to report - item.status = fuzzyMatch ? ImageItem::FuzzyMatch : ImageItem::Mismatch; - report.addResult(item); - } -} - - -void BaselineHandler::storeItemMetadata(const PlatformInfo &metadata, const QString &path) -{ - QFile file(path + QLS(MetadataFileExt)); - if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { - qWarning() << runId << logtime() << "ERROR: could not write to file" << file.fileName(); - return; - } - QTextStream out(&file); - PlatformInfo::const_iterator it = metadata.constBegin(); - while (it != metadata.constEnd()) { - out << it.key() << ": " << it.value() << endl; - ++it; - } - file.close(); -} - - -PlatformInfo BaselineHandler::fetchItemMetadata(const QString &path) -{ - PlatformInfo res; - QFile file(path + QLS(MetadataFileExt)); - if (!file.open(QIODevice::ReadOnly) || !QFile::exists(path + QLS(FileFormat))) - return res; - QTextStream in(&file); - do { - QString line = in.readLine(); - int idx = line.indexOf(QLS(": ")); - if (idx > 0) - res.insert(line.left(idx), line.mid(idx+2)); - } while (!in.atEnd()); - return res; -} - - -void BaselineHandler::idleClientTimeout() -{ - qWarning() << runId << logtime() << "Idle client timeout: no request received for" << IDLE_CLIENT_TIMEOUT << "seconds, terminating connection."; - proto.socket.disconnectFromHost(); -} - - -void BaselineHandler::receiveDisconnect() -{ - qDebug() << runId << logtime() << "Client disconnected."; - report.end(); - if (report.reportProduced() && !clientInfo.isAdHocRun()) - issueMismatchNotification(); - if (settings && settings->value("ProcessXmlResults").toBool() && !clientInfo.isAdHocRun()) { - // ### TBD: actually execute the processing command. For now, just generate the xml files. - QString xmlDir = report.writeResultsXmlFiles(); - } - QThread::currentThread()->exit(0); -} - - -PlatformInfo BaselineHandler::mapPlatformInfo(const PlatformInfo& orig) const -{ - PlatformInfo mapped; - foreach (const QString &key, orig.uniqueKeys()) { - QString val = orig.value(key).simplified(); - val.replace(QLC('/'), QLC('_')); - val.replace(QLC(' '), QLC('_')); - mapped.insert(key, QUrl::toPercentEncoding(val, "+")); - //qDebug() << "MAPPED" << key << "FROM" << orig.value(key) << "TO" << mapped.value(key); - } - - // Special fixup for OS version - if (mapped.value(PI_OSName) == QLS("MacOS")) { - int ver = mapped.value(PI_OSVersion).toInt(); - if (ver > 1) - mapped.insert(PI_OSVersion, QString("MV_10_%1").arg(ver-2)); - } - else if (mapped.value(PI_OSName) == QLS("Windows")) { - // TBD: map windows version numbers to names - } - - // Special fixup for hostname - QString host = mapped.value(PI_HostName).section(QLC('.'), 0, 0); // Filter away domain, if any - if (host.isEmpty() || host == QLS("localhost")) { - host = orig.value(PI_HostAddress); - } else { - if (!orig.isAdHocRun()) { // i.e. CI system run, so remove index postfix typical of vm hostnames - host.remove(QRegularExpression(QLS("\\d+$"))); - if (host.endsWith(QLC('-'))) - host.chop(1); - } - } - if (host.isEmpty()) - host = QLS("UNKNOWN-HOST"); - if (mapped.value(PI_OSName) == QLS("MacOS")) // handle multiple os versions on same host - host += QLC('-') + mapped.value(PI_OSVersion); - mapped.insert(PI_HostName, host); - - // Special fixup for Qt version - QString ver = mapped.value(PI_QtVersion); - if (!ver.isEmpty()) - mapped.insert(PI_QtVersion, ver.prepend(QLS("Qt-"))); - - return mapped; -} - - -QString BaselineHandler::pathForItem(const ImageItem &item, bool isBaseline, bool absolute) const -{ - if (mappedClientInfo.isEmpty()) { - mappedClientInfo = mapPlatformInfo(clientInfo); - PlatformInfo oraw = clientInfo; - // ### simplify: don't map if no overrides! - for (int i = 0; i < clientInfo.overrides().size()-1; i+=2) - oraw.insert(clientInfo.overrides().at(i), clientInfo.overrides().at(i+1)); - overriddenMappedClientInfo = mapPlatformInfo(oraw); - } - - const PlatformInfo& mapped = isBaseline ? overriddenMappedClientInfo : mappedClientInfo; - - QString itemName = safeName(item.itemName); - itemName.append(QLC('_') + QString::number(item.itemChecksum, 16).rightJustified(4, QLC('0'))); - - QStringList path; - path += projectPath(absolute); - path += mapped.value(PI_TestCase); - path += QLS(isBaseline ? "baselines" : "mismatches"); - path += item.testFunction; - QStringList itemPathKeys; - if (settings) - itemPathKeys = settings->value("ItemPathKeys").toStringList(); - if (itemPathKeys.isEmpty()) - itemPathKeys = BaselineServer::defaultPathKeys(); - foreach (const QString &key, itemPathKeys) - path += mapped.value(key, QLS("UNSET-")+key); - if (!isBaseline) - path += runId; - path += itemName + QLC('.'); - - return path.join(QLS("/")); -} - - -QString BaselineHandler::view(const QString &baseline, const QString &rendered, const QString &compared) -{ - QFile f(":/templates/view.html"); - f.open(QIODevice::ReadOnly); - return QString::fromLatin1(f.readAll()).arg('/'+baseline, '/'+rendered, '/'+compared, diffstats(baseline, rendered)); -} - -QString BaselineHandler::diffstats(const QString &baseline, const QString &rendered) -{ - QImage blImg(BaselineServer::storagePath() + QLC('/') + baseline); - QImage mmImg(BaselineServer::storagePath() + QLC('/') + rendered); - if (blImg.isNull() || mmImg.isNull()) - return QLS("Could not compute diffstats: image loading failed."); - - // ### TBD: cache the results - return computeMismatchScore(blImg, mmImg); -} - -QString BaselineHandler::clearAllBaselines(const QString &context) -{ - int tot = 0; - int failed = 0; - QDirIterator it(BaselineServer::storagePath() + QLC('/') + context, - QStringList() << QLS("*.") + QLS(FileFormat) - << QLS("*.") + QLS(MetadataFileExt) - << QLS("*.") + QLS(ThumbnailExt)); - while (it.hasNext()) { - bool counting = !it.next().endsWith(QLS(ThumbnailExt)); - if (counting) - tot++; - if (!QFile::remove(it.filePath()) && counting) - failed++; - } - return QString(QLS("%1 of %2 baselines cleared from context ")).arg((tot-failed)/2).arg(tot/2) + context; -} - -QString BaselineHandler::updateBaselines(const QString &context, const QString &mismatchContext, const QString &itemFile) -{ - int tot = 0; - int failed = 0; - QString storagePrefix = BaselineServer::storagePath() + QLC('/'); - // If itemId is set, update just that one, otherwise, update all: - QString filter = itemFile.isEmpty() ? QLS("*_????.") : itemFile; - QDirIterator it(storagePrefix + mismatchContext, - QStringList() << filter + QLS(FileFormat) - << filter + QLS(MetadataFileExt) - << filter + QLS(ThumbnailExt)); - while (it.hasNext()) { - bool counting = !it.next().endsWith(QLS(ThumbnailExt)); - if (counting) - tot++; - QString oldFile = storagePrefix + context + QLC('/') + it.fileName(); - QFile::remove(oldFile); // Remove existing baseline file - if (!QFile::copy(it.filePath(), oldFile) && counting) // and replace it with the mismatch - failed++; - } - return QString(QLS("%1 of %2 baselines updated in context %3 from context %4")).arg((tot-failed)/2).arg(tot/2).arg(context, mismatchContext); -} - -QString BaselineHandler::blacklistTest(const QString &context, const QString &itemId, bool removeFromBlacklist) -{ - QFile file(BaselineServer::storagePath() + QLC('/') + context + QLS("/BLACKLIST")); - QStringList blackList; - if (file.open(QIODevice::ReadWrite)) { - while (!file.atEnd()) - blackList.append(file.readLine().trimmed()); - - if (removeFromBlacklist) - blackList.removeAll(itemId); - else if (!blackList.contains(itemId)) - blackList.append(itemId); - - file.resize(0); - foreach (QString id, blackList) - file.write(id.toLatin1() + '\n'); - file.close(); - return QLS(removeFromBlacklist ? "Whitelisted " : "Blacklisted ") + itemId + QLS(" in context ") + context; - } else { - return QLS("Unable to update blacklisted tests, failed to open ") + file.fileName(); - } -} - - -void BaselineHandler::testPathMapping() -{ - qDebug() << "Storage prefix:" << BaselineServer::storagePath(); - - QStringList hosts; - hosts << QLS("bq-ubuntu910-x86-01") - << QLS("bq-ubuntu910-x86-15") - << QLS("osl-mac-master-5.test.qt-project.org") - << QLS("osl-mac-master-6.test.qt-project.org") - << QLS("sv-xp-vs-010") - << QLS("sv-xp-vs-011") - << QLS("sv-solaris-sparc-008") - << QLS("macbuilder-02.test.troll.no") - << QLS("bqvm1164") - << QLS("chimera") - << QLS("localhost") - << QLS(""); - - ImageItem item; - item.testFunction = QLS("testPathMapping"); - item.itemName = QLS("arcs.qps"); - item.imageChecksums << 0x0123456789abcdefULL; - item.itemChecksum = 0x0123; - - clientInfo.insert(PI_QtVersion, QLS("5.0.0")); - clientInfo.insert(PI_QMakeSpec, QLS("linux-g++")); - clientInfo.insert(PI_PulseGitBranch, QLS("somebranch")); - clientInfo.setAdHocRun(false); - foreach(const QString& host, hosts) { - mappedClientInfo.clear(); - clientInfo.insert(PI_HostName, host); - qDebug() << "Baseline from" << host << "->" << pathForItem(item, true); - qDebug() << "Mismatch from" << host << "->" << pathForItem(item, false); - } -} - - -QString BaselineHandler::computeMismatchScore(const QImage &baseline, const QImage &rendered) -{ - if (baseline.size() != rendered.size() || baseline.format() != rendered.format()) - return QLS("[No diffstats, incomparable images.]"); - if (baseline.depth() != 32) - return QLS("[Diffstats computation not implemented for format.]"); - - int w = baseline.width(); - int h = baseline.height(); - - uint ncd = 0; // number of differing color pixels - uint nad = 0; // number of differing alpha pixels - uint scd = 0; // sum of color pixel difference - uint sad = 0; // sum of alpha pixel difference - uint mind = 0; // minimum difference - uint maxd = 0; // maximum difference - - for (int y=0; y maxd) - maxd = ds; - } - if (da) { - nad++; - sad += da; - } - } - } - } - - - double pcd = 100.0 * ncd / (w*h); // percent of pixels that differ - double acd = ncd ? double(scd) / (ncd) : 0; // avg. difference -/* - if (baseline.hasAlphaChannel()) { - double pad = 100.0 * nad / (w*h); // percent of pixels that differ - double aad = nad ? double(sad) / (3*nad) : 0; // avg. difference - } -*/ - QString res = "\n"; - QString item = "\n"; - res += item.arg("Number of mismatching pixels").arg(ncd); - res += item.arg("Percentage mismatching pixels").arg(pcd, 0, 'g', 2); - res += item.arg("Minimum pixel distance").arg(mind); - res += item.arg("Maximum pixel distance").arg(maxd); - if (acd >= 10.0) - res += item.arg("Average pixel distance").arg(qRound(acd)); - else - res += item.arg("Average pixel distance").arg(acd, 0, 'g', 2); - - if (baseline.hasAlphaChannel()) - res += item.arg("Number of mismatching alpha values").arg(nad); - - res += "
%1%2
\n"; - res += "

(Distances are normalized to the range 0-255)

\n"; - return res; -} - - -bool BaselineHandler::fuzzyCompare(const QString &baselinePath, const QString &mismatchPath) -{ - QProcess compareProc; - QStringList args; - args << "-fuzz" << QString("%1%").arg(fuzzLevel) << "-metric" << "AE"; - args << baselinePath + QLS(FileFormat) << mismatchPath + QLS(FileFormat) << "/dev/null"; // TBD: Should save output image, so report won't have to regenerate it - - compareProc.setProcessChannelMode(QProcess::MergedChannels); - compareProc.start("compare", args, QIODevice::ReadOnly); - if (compareProc.waitForFinished(3000) && compareProc.error() == QProcess::UnknownError) { - bool ok = false; - int metric = compareProc.readAll().trimmed().toInt(&ok); - if (ok && metric == 0) - return true; - } - return false; -} - - -void BaselineHandler::issueMismatchNotification() -{ - // KISS: hardcoded use of the "sendemail" utility. Make this configurable if and when demand arises. - if (!settings) - return; - - settings->beginGroup("Notification"); - QStringList receivers = settings->value("Receivers").toStringList(); - QString sender = settings->value("Sender").toString(); - QString server = settings->value("SMTPserver").toString(); - settings->endGroup(); - if (receivers.isEmpty() || sender.isEmpty() || server.isEmpty()) - return; - - QString msg = QString("\nResult summary for test run %1:\n").arg(runId); - msg += report.summary(); - msg += "\nReport: " + BaselineServer::baseUrl() + report.filePath() + "\n"; - - msg += "\nTest run platform properties:\n------------------\n"; - foreach (const QString &key, clientInfo.keys()) - msg += key + ": " + clientInfo.value(key) + '\n'; - msg += "\nCheers,\n- Your friendly Lancelot Baseline Server\n"; - - QProcess proc; - QString cmd = "sendemail"; - QStringList args; - args << "-s" << server << "-f" << sender << "-t" << receivers; - args << "-u" << "[Lancelot] Mismatch report for project " + clientInfo.value(PI_Project) + ", test case " + clientInfo.value(PI_TestCase); - args << "-m" << msg; - - //proc.setProcessChannelMode(QProcess::MergedChannels); - proc.start(cmd, args); - if (!proc.waitForFinished(10 * 1000) || (proc.exitStatus() != QProcess::NormalExit) || proc.exitCode()) { - qWarning() << "FAILED to issue notification. Command:" << cmd << args.mid(0, args.size()-2); - qWarning() << " Command standard output:" << proc.readAllStandardOutput(); - qWarning() << " Command error output:" << proc.readAllStandardError(); - } -} - - -// Make an identifer safer for use as filename and URL -QString safeName(const QString& name) -{ - QString res = name.simplified(); - res.replace(QLC(' '), QLC('_')); - res.replace(QLC('.'), QLC('_')); - res.replace(QLC('/'), QLC('^')); - return res; -} diff --git a/tests/baselineserver/src/baselineserver.h b/tests/baselineserver/src/baselineserver.h deleted file mode 100644 index 25ef17f0230..00000000000 --- a/tests/baselineserver/src/baselineserver.h +++ /dev/null @@ -1,151 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef BASELINESERVER_H -#define BASELINESERVER_H - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "baselineprotocol.h" -#include "report.h" - -// #seconds between checks for update of the executable -#define HEARTBEAT 10 -// Timeout if no activity received from client, #seconds -#define IDLE_CLIENT_TIMEOUT 3*60 - -#define MetadataFileExt "metadata" -#define ThumbnailExt "thumbnail.jpg" - - -class BaselineServer : public QTcpServer -{ - Q_OBJECT - -public: - BaselineServer(QObject *parent = nullptr); - - static QString storagePath(); - static QString baseUrl(); - static QStringList defaultPathKeys(); - -protected: - void incomingConnection(qintptr socketDescriptor); - -private slots: - void heartbeat(); - -private: - QTimer *heartbeatTimer; - QDateTime meLastMod; - QString lastRunId; - int lastRunIdIdx; - static QString storage; - static QString url; - static QStringList pathKeys; -}; - - - -class BaselineThread : public QThread -{ - Q_OBJECT - -public: - BaselineThread(const QString &runId, int socketDescriptor, QObject *parent); - void run(); - -private: - QString runId; - int socketDescriptor; -}; - - -class BaselineHandler : public QObject -{ - Q_OBJECT - -public: - BaselineHandler(const QString &runId, int socketDescriptor = -1); - QString projectPath(bool absolute = true) const; - QString pathForItem(const ImageItem &item, bool isBaseline = true, bool absolute = true) const; - - // CGI callbacks: - static QString view(const QString &baseline, const QString &rendered, const QString &compared); - static QString diffstats(const QString &baseline, const QString &rendered); - static QString clearAllBaselines(const QString &context); - static QString updateBaselines(const QString &context, const QString &mismatchContext, const QString &itemFile); - static QString blacklistTest(const QString &context, const QString &itemId, bool removeFromBlacklist = false); - - // for debugging - void testPathMapping(); - -private slots: - void receiveRequest(); - void receiveDisconnect(); - void idleClientTimeout(); - -private: - bool checkClient(QByteArray *errMsg, bool *dryRunMode = nullptr); - bool establishConnection(); - void provideBaselineChecksums(const QByteArray &itemListBlock); - void recordMatch(const QByteArray &itemBlock); - void storeImage(const QByteArray &itemBlock, bool isBaseline); - void storeItemMetadata(const PlatformInfo &metadata, const QString &path); - PlatformInfo fetchItemMetadata(const QString &path); - PlatformInfo mapPlatformInfo(const PlatformInfo& orig) const; - const char *logtime(); - void issueMismatchNotification(); - bool fuzzyCompare(const QString& baselinePath, const QString& mismatchPath); - - static QString computeMismatchScore(const QImage& baseline, const QImage& rendered); - - BaselineProtocol proto; - PlatformInfo clientInfo; - mutable PlatformInfo mappedClientInfo; - mutable PlatformInfo overriddenMappedClientInfo; - QString runId; - bool connectionEstablished; - Report report; - QSettings *settings; - QString ruleName; - int fuzzLevel; - QTimer *idleTimer; -}; - - -// Make an identifer safer for use as filename and URL -QString safeName(const QString& name); - -#endif // BASELINESERVER_H diff --git a/tests/baselineserver/src/baselineserver.pro b/tests/baselineserver/src/baselineserver.pro deleted file mode 100644 index 2d8438cb514..00000000000 --- a/tests/baselineserver/src/baselineserver.pro +++ /dev/null @@ -1,24 +0,0 @@ -QT += core network - -# gui needed for QImage -# QT -= gui - -TARGET = baselineserver -DESTDIR = ../bin -CONFIG += cmdline - -TEMPLATE = app - -include(../shared/baselineprotocol.pri) - -SOURCES += main.cpp \ - baselineserver.cpp \ - report.cpp - -HEADERS += \ - baselineserver.h \ - report.h - -RESOURCES += \ - baselineserver.qrc -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/baselineserver/src/baselineserver.qrc b/tests/baselineserver/src/baselineserver.qrc deleted file mode 100644 index b5cd6afadbf..00000000000 --- a/tests/baselineserver/src/baselineserver.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - templates/view.html - - diff --git a/tests/baselineserver/src/main.cpp b/tests/baselineserver/src/main.cpp deleted file mode 100644 index dfc9b83da8f..00000000000 --- a/tests/baselineserver/src/main.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include -#include "baselineserver.h" - -int main(int argc, char *argv[]) -{ - QCoreApplication a(argc, argv); - - QString queryString(qgetenv("QUERY_STRING")); - if (!queryString.isEmpty()) { - // run as CGI script - Report::handleCGIQuery(queryString); - return 0; - } - - if (a.arguments().contains(QLatin1String("-testmapping"))) { - BaselineHandler h(QLS("SomeRunId")); - h.testPathMapping(); - return 0; - } - - BaselineServer server; - if (!server.listen(QHostAddress::Any, BaselineProtocol::ServerPort)) { - qWarning("Failed to listen!"); - return 1; - } - - qDebug() << "\n*****" << argv[0] << "started, ready to serve on port" << BaselineProtocol::ServerPort - << "with baseline protocol version" << BaselineProtocol::ProtocolVersion << "*****\n"; - return a.exec(); -} diff --git a/tests/baselineserver/src/report.cpp b/tests/baselineserver/src/report.cpp deleted file mode 100644 index 748d76ebfef..00000000000 --- a/tests/baselineserver/src/report.cpp +++ /dev/null @@ -1,503 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "report.h" -#include "baselineprotocol.h" -#include "baselineserver.h" -#include -#include -#include -#include -#include -#include - -Report::Report() - : initialized(false), handler(0), written(false), numItems(0), numMismatches(0), settings(0), - hasStats(false) -{ -} - -Report::~Report() -{ - end(); -} - -QString Report::filePath() -{ - return path; -} - -int Report::numberOfMismatches() -{ - return numMismatches; -} - -bool Report::reportProduced() -{ - return written; -} - -void Report::init(const BaselineHandler *h, const QString &r, const PlatformInfo &p, const QSettings *s) -{ - handler = h; - runId = r; - plat = p; - settings = s; - rootDir = BaselineServer::storagePath() + QLC('/'); - baseDir = handler->pathForItem(ImageItem(), true, false).remove(QRegularExpression("/baselines/.*$")); - QString dir = baseDir + (plat.isAdHocRun() ? QLS("/adhoc-reports") : QLS("/auto-reports")); - QDir cwd; - if (!cwd.exists(rootDir + dir)) - cwd.mkpath(rootDir + dir); - path = dir + QLS("/Report_") + runId + QLS(".html"); - hasOverride = !plat.overrides().isEmpty(); - initialized = true; -} - -void Report::addItems(const ImageItemList &items) -{ - if (items.isEmpty()) - return; - numItems += items.size(); - QString func = items.at(0).testFunction; - if (!testFunctions.contains(func)) - testFunctions.append(func); - ImageItemList list = items; - if (settings->value("ReportMissingResults").toBool()) { - for (ImageItemList::iterator it = list.begin(); it != list.end(); ++it) { - if (it->status == ImageItem::Ok) - it->status = ImageItem::Error; // Status should be set by report from client, else report as error - } - } - itemLists[func] += list; -} - -void Report::addResult(const ImageItem &item) -{ - if (!testFunctions.contains(item.testFunction)) { - qWarning() << "Report::addResult: unknown testfunction" << item.testFunction; - return; - } - bool found = false; - ImageItemList &list = itemLists[item.testFunction]; - for (ImageItemList::iterator it = list.begin(); it != list.end(); ++it) { - if (it->itemName == item.itemName && it->itemChecksum == item.itemChecksum) { - it->status = item.status; - found = true; - break; - } - } - if (found) { - if (item.status == ImageItem::Mismatch) - numMismatches++; - } else { - qWarning() << "Report::addResult: unknown item" << item.itemName << "in testfunction" << item.testFunction; - } -} - -void Report::end() -{ - if (!initialized || written) - return; - // Make report iff (#mismatches>0) || (#fuzzymatches>0) || (#errors>0 && settings say report errors) - bool doReport = (numMismatches > 0); - if (!doReport) { - bool reportErrors = settings->value("ReportMissingResults").toBool(); - computeStats(); - foreach (const QString &func, itemLists.keys()) { - FuncStats stat = stats.value(func); - if (stat.value(ImageItem::FuzzyMatch) > 0) { - doReport = true; - break; - } - foreach (const ImageItem &item, itemLists.value(func)) { - if (reportErrors && item.status == ImageItem::Error) { - doReport = true; - break; - } - } - if (doReport) - break; - } - } - if (!doReport) - return; - write(); - written = true; -} - -void Report::computeStats() -{ - if (hasStats) - return; - foreach (const QString &func, itemLists.keys()) { - FuncStats funcStat; - funcStat[ImageItem::Ok] = 0; - funcStat[ImageItem::BaselineNotFound] = 0; - funcStat[ImageItem::IgnoreItem] = 0; - funcStat[ImageItem::Mismatch] = 0; - funcStat[ImageItem::FuzzyMatch] = 0; - funcStat[ImageItem::Error] = 0; - foreach (const ImageItem &item, itemLists.value(func)) { - funcStat[item.status]++; - } - stats[func] = funcStat; - } - hasStats = true; -} - -QString Report::summary() -{ - computeStats(); - QString res; - foreach (const QString &func, itemLists.keys()) { - FuncStats stat = stats.value(func); - QString s = QString("%1 %3 mismatch(es), %4 error(s), %5 fuzzy match(es)\n"); - s = s.arg(QString("%1() [%2 items]:").arg(func).arg(itemLists.value(func).size()).leftJustified(40)); - s = s.arg(stat.value(ImageItem::Mismatch)); - s = s.arg(stat.value(ImageItem::Error)); - s = s.arg(stat.value(ImageItem::FuzzyMatch)); - res += s; - } -#if 0 - qDebug() << "***************************** Summary *************************"; - qDebug() << res; - qDebug() << "***************************************************************"; -#endif - return res; -} - -void Report::write() -{ - QFile file(rootDir + path); - if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { - qWarning() << "Failed to open report file" << file.fileName(); - return; - } - out.setDevice(&file); - - writeHeader(); - foreach(const QString &func, testFunctions) { - writeFunctionResults(itemLists.value(func)); - } - writeFooter(); - file.close(); - updateLatestPointer(); -} - - -void Report::writeHeader() -{ - QString title = plat.value(PI_Project) + QLC(':') + plat.value(PI_TestCase) + QLS(" Lancelot Test Report"); - out << "\n" - << "" << title << "\n" - << "

" << title << "

\n" - << "

Note: This is a static page, generated at " << QDateTime::currentDateTime().toString() - << " for the test run with id " << runId << "

\n" - << "

Summary: " << numMismatches << " of " << numItems << " items reported mismatching

\n"; - out << "
\n" << summary() << "
\n\n"; - out << "

Testing Client Platform Info:

\n" - << "\n"; - foreach (QString key, plat.keys()) - out << "\n"; - out << "
" << key << ":" << plat.value(key) << "
\n\n"; - if (hasOverride) { - out << "

Note! Override Platform Info:

\n" - << "

The client's output has been compared to baselines created on a different platform. Differences:

\n" - << "\n"; - for (int i = 0; i < plat.overrides().size()-1; i+=2) - out << "\n"; - out << "
" << plat.overrides().at(i) << ":" << plat.overrides().at(i+1) << "
\n\n"; - } -} - - -void Report::writeFunctionResults(const ImageItemList &list) -{ - QString testFunction = list.at(0).testFunction; - QString pageUrl = BaselineServer::baseUrl() + path; - QString ctx = handler->pathForItem(list.at(0), true, false).section(QLC('/'), 0, -2); - QString misCtx = handler->pathForItem(list.at(0), false, false).section(QLC('/'), 0, -2); - - - out << "\n

 

Test function: " << testFunction << "

\n"; - if (!hasOverride) { - out << "

Clear all baselines for this testfunction (They will be recreated by the next run)

\n"; - out << "

Let these mismatching images be the new baselines for this testfunction

\n\n"; - } - - out << "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n\n"; - - foreach (const ImageItem &item, list) { - QString mmPrefix = handler->pathForItem(item, false, false); - QString blPrefix = handler->pathForItem(item, true, false); - - // Make hard links to the current baseline, so that the report is static even if the baseline changes - generateThumbnail(blPrefix + QLS(FileFormat), rootDir); // Make sure baseline thumbnail is up to date - QString lnPrefix = mmPrefix + QLS("baseline."); - QByteArray blPrefixBa = (rootDir + blPrefix).toLatin1(); - QByteArray lnPrefixBa = (rootDir + lnPrefix).toLatin1(); - ::link((blPrefixBa + FileFormat).constData(), (lnPrefixBa + FileFormat).constData()); - ::link((blPrefixBa + MetadataFileExt).constData(), (lnPrefixBa + MetadataFileExt).constData()); - ::link((blPrefixBa + ThumbnailExt).constData(), (lnPrefixBa + ThumbnailExt).constData()); - - QString baseline = lnPrefix + QLS(FileFormat); - QString metadata = lnPrefix + QLS(MetadataFileExt); - out << "\n"; - out << "\n"; - if (item.status == ImageItem::Mismatch || item.status == ImageItem::FuzzyMatch) { - QString rendered = mmPrefix + QLS(FileFormat); - QString itemFile = mmPrefix.section(QLC('/'), -1); - writeItem(baseline, rendered, item, itemFile, ctx, misCtx, metadata); - } - else { - out << "\n" - << "\n" - << "\n"; - } - out << "\n\n"; - } - - out << "
ItemBaselineRenderedComparison (diffs are RED)Info/Action
" << item.itemName << "image infon/a"; - switch (item.status) { - case ImageItem::BaselineNotFound: - out << "Baseline not found/regenerated"; - break; - case ImageItem::IgnoreItem: - out << "Blacklisted "; - if (!hasOverride) { - out << "Whitelist this item"; - } - break; - case ImageItem::Error: - out << "Error: No result reported!"; - break; - case ImageItem::Ok: - out << "No mismatch reported"; - break; - default: - out << '?'; - break; - } - out << "
\n"; -} - -void Report::writeItem(const QString &baseline, const QString &rendered, const ImageItem &item, - const QString &itemFile, const QString &ctx, const QString &misCtx, const QString &metadata) -{ - QString compared = generateCompared(baseline, rendered); - QString pageUrl = BaselineServer::baseUrl() + path; - - QStringList images = QStringList() << baseline << rendered << compared; - foreach (const QString& img, images) - out << "\n"; - - out << "\n"; - if (item.status == ImageItem::FuzzyMatch) - out << "

Fuzzy match

\n"; - else - out << "

Mismatch reported

\n"; - out << "

Baseline Info\n"; - if (!hasOverride) { - out << "

Let this be the new baseline

\n" - << "

Blacklist this item

\n"; - } - out << "

Inspect

\n"; - -#if 0 - out << "

Diffstats

\n"; -#endif - - out << "\n"; -} - -void Report::writeFooter() -{ - out << "\n\n"; -} - - -QString Report::generateCompared(const QString &baseline, const QString &rendered, bool fuzzy) -{ - QString res = rendered; - QFileInfo fi(res); - res.chop(fi.suffix().length()); - res += QLS(fuzzy ? "fuzzycompared.png" : "compared.png"); - QStringList args; - if (fuzzy) - args << QLS("-fuzz") << QLS("5%"); - args << rootDir+baseline << rootDir+rendered << rootDir+res; - QProcess::execute(QLS("compare"), args); - return res; -} - - -QString Report::generateThumbnail(const QString &image, const QString &rootDir) -{ - QString res = image; - QFileInfo imgFI(rootDir+image); - if (!imgFI.exists()) - return res; - res.chop(imgFI.suffix().length()); - res += ThumbnailExt; - QFileInfo resFI(rootDir+res); - if (resFI.exists() && resFI.lastModified() > imgFI.lastModified()) - return res; - QStringList args; - args << rootDir+image << QLS("-resize") << QLS("240x240>") << QLS("-quality") << QLS("50") << rootDir+res; - QProcess::execute(QLS("convert"), args); - return res; -} - - -QString Report::writeResultsXmlFiles() -{ - if (!itemLists.size()) - return QString(); - QString dir = rootDir + baseDir + QLS("/xml-reports/") + runId; - QDir cwd; - if (!cwd.exists(dir)) - cwd.mkpath(dir); - foreach (const QString &func, itemLists.keys()) { - QFile f(dir + QLatin1Char('/') + func + "-results.xml"); - if (!f.open(QIODevice::WriteOnly)) - continue; - QXmlStreamWriter s(&f); - s.setAutoFormatting(true); - s.writeStartDocument(); - foreach (QString key, plat.keys()) { - QString cmt = QLatin1Char(' ') + key + "=\"" + plat.value(key) +"\" "; - s.writeComment(cmt.replace("--", "[-]")); - } - s.writeStartElement("testsuite"); - s.writeAttribute("name", func); - foreach (const ImageItem &item, itemLists.value(func)) { - QString res; - switch (item.status) { - case ImageItem::Ok: - case ImageItem::FuzzyMatch: - res = "pass"; - break; - case ImageItem::Mismatch: - case ImageItem::Error: - res = "fail"; - break; - case ImageItem::BaselineNotFound: - case ImageItem::IgnoreItem: - default: - res = "skip"; - } - s.writeStartElement("testcase"); - s.writeAttribute("name", item.itemName); - s.writeAttribute("result", res); - s.writeEndElement(); - } - s.writeEndElement(); - s.writeEndDocument(); - } - return dir; -} - - - -void Report::updateLatestPointer() -{ - QString linkPath = rootDir + baseDir + QLS("/latest_report.html"); - QString reportPath = path.mid(baseDir.size()+1); - QFile::remove(linkPath); // possible race with another thread, yada yada yada - QFile::link(reportPath, linkPath); - -#if 0 - QByteArray fwd = "\n"; - fwd.replace("%1", filePath().prepend(QLC('/')).toLatin1()); - - QFile file(rootDir + baseDir + "/latest_report.html"); - if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) - file.write(fwd); -#endif -} - - -void Report::handleCGIQuery(const QString &query) -{ - QUrl cgiUrl(QLS("http://dummy/cgi-bin/dummy.cgi?") + query); - QTextStream s(stdout); - s << "Content-Type: text/html\r\n\r\n" - << "\n\n\n"; // Lancelot blue - - QString command(cgiUrl.queryItemValue("cmd")); - - if (command == QLS("view")) { - s << BaselineHandler::view(cgiUrl.queryItemValue(QLS("baseline")), - cgiUrl.queryItemValue(QLS("rendered")), - cgiUrl.queryItemValue(QLS("compared"))); - } -#if 0 - else if (command == QLS("diffstats")) { - s << BaselineHandler::diffstats(cgiUrl.queryItemValue(QLS("baseline")), - cgiUrl.queryItemValue(QLS("rendered"))); - } -#endif - else if (command == QLS("updateSingleBaseline")) { - s << BaselineHandler::updateBaselines(cgiUrl.queryItemValue(QLS("context")), - cgiUrl.queryItemValue(QLS("mismatchContext")), - cgiUrl.queryItemValue(QLS("itemFile"))); - } else if (command == QLS("updateAllBaselines")) { - s << BaselineHandler::updateBaselines(cgiUrl.queryItemValue(QLS("context")), - cgiUrl.queryItemValue(QLS("mismatchContext")), - QString()); - } else if (command == QLS("clearAllBaselines")) { - s << BaselineHandler::clearAllBaselines(cgiUrl.queryItemValue(QLS("context"))); - } else if (command == QLS("blacklist")) { - // blacklist a test - s << BaselineHandler::blacklistTest(cgiUrl.queryItemValue(QLS("context")), - cgiUrl.queryItemValue(QLS("itemId"))); - } else if (command == QLS("whitelist")) { - // whitelist a test - s << BaselineHandler::blacklistTest(cgiUrl.queryItemValue(QLS("context")), - cgiUrl.queryItemValue(QLS("itemId")), true); - } else { - s << "Unknown query:
" << query << "
"; - } - s << "

Back to report\n"; - s << "\n"; -} diff --git a/tests/baselineserver/src/report.h b/tests/baselineserver/src/report.h deleted file mode 100644 index c568e7ab8dc..00000000000 --- a/tests/baselineserver/src/report.h +++ /dev/null @@ -1,98 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef REPORT_H -#define REPORT_H - -#include "baselineprotocol.h" -#include -#include -#include -#include -#include - -class BaselineHandler; - -class Report -{ -public: - Report(); - ~Report(); - - void init(const BaselineHandler *h, const QString &r, const PlatformInfo &p, const QSettings *s); - void addItems(const ImageItemList& items); - void addResult(const ImageItem& item); - void end(); - - bool reportProduced(); - - int numberOfMismatches(); - QString summary(); - - QString filePath(); - - QString writeResultsXmlFiles(); - - static void handleCGIQuery(const QString &query); - - static QString generateThumbnail(const QString &image, const QString &rootDir = QString()); - -private: - void write(); - void writeFunctionResults(const ImageItemList &list); - void writeItem(const QString &baseline, const QString &rendered, const ImageItem &item, - const QString &itemFile, const QString &ctx, const QString &misCtx, const QString &metadata); - void writeHeader(); - void writeFooter(); - QString generateCompared(const QString &baseline, const QString &rendered, bool fuzzy = false); - - void updateLatestPointer(); - - void computeStats(); - - bool initialized; - const BaselineHandler *handler; - QString runId; - PlatformInfo plat; - QString rootDir; - QString baseDir; - QString path; - QStringList testFunctions; - QMap itemLists; - bool written; - int numItems; - int numMismatches; - QTextStream out; - bool hasOverride; - const QSettings *settings; - - typedef QMap FuncStats; - QMap stats; - bool hasStats; -}; - -#endif // REPORT_H diff --git a/tests/baselineserver/src/templates/view.html b/tests/baselineserver/src/templates/view.html deleted file mode 100644 index f0971010f24..00000000000 --- a/tests/baselineserver/src/templates/view.html +++ /dev/null @@ -1,84 +0,0 @@ -

Lancelot Viewer

- -

-Zoom: -1x -2x -4x -

- -

- - - - - - - - - - - - -
Baseline%1
Rendered%2
Differences

- - -

- - -
- - -%4 -

- - diff --git a/tests/benchmarks/gui/painting/lancebench/CMakeLists.txt b/tests/benchmarks/gui/painting/lancebench/CMakeLists.txt index e278f0ddc07..f417bcc61a8 100644 --- a/tests/benchmarks/gui/painting/lancebench/CMakeLists.txt +++ b/tests/benchmarks/gui/painting/lancebench/CMakeLists.txt @@ -6,8 +6,10 @@ qt_internal_add_benchmark(tst_bench_lancebench SOURCES - ../../../../auto/other/lancelot/paintcommands.cpp ../../../../auto/other/lancelot/paintcommands.h + ../../../../baseline/painting/paintcommands.cpp ../../../../baseline/painting/paintcommands.h tst_lancebench.cpp + INCLUDE_DIRECTORIES + ../../../../baseline/painting PUBLIC_LIBRARIES Qt::Gui Qt::GuiPrivate @@ -47,13 +49,13 @@ set(images_resource_files "images/zebra.png" ) -list(TRANSFORM images_resource_files PREPEND "../../../../auto/other/lancelot/") +list(TRANSFORM images_resource_files PREPEND "../../../../baseline/painting/") qt_internal_add_resource(tst_bench_lancebench "images" PREFIX "/" BASE - "../../../../auto/other/lancelot" + "../../../../baseline/painting" FILES ${images_resource_files} ) @@ -61,7 +63,7 @@ qt_internal_add_resource(tst_bench_lancebench "images" #### Keys ignored in scope 1:.:.:lancebench.pro:: # TEMPLATE = "app" -# TESTDATA = "../../../../auto/other/lancelot/scripts/*" +# TESTDATA = "../../../../baseline/painting/scripts/*" ## Scopes: ##################################################################### diff --git a/tests/benchmarks/gui/painting/lancebench/tst_lancebench.cpp b/tests/benchmarks/gui/painting/lancebench/tst_lancebench.cpp index 418f0623b33..b6f7d693b90 100644 --- a/tests/benchmarks/gui/painting/lancebench/tst_lancebench.cpp +++ b/tests/benchmarks/gui/painting/lancebench/tst_lancebench.cpp @@ -26,7 +26,7 @@ ** ****************************************************************************/ -#include "../../../../auto/other/lancelot/paintcommands.h" +#include "paintcommands.h" #include #include diff --git a/tests/manual/lance/CMakeLists.txt b/tests/manual/lance/CMakeLists.txt index 02b7273be4c..edf2faa9295 100644 --- a/tests/manual/lance/CMakeLists.txt +++ b/tests/manual/lance/CMakeLists.txt @@ -6,13 +6,13 @@ qt_internal_add_manual_test(lance SOURCES - ../../auto/other/lancelot/paintcommands.cpp ../../auto/other/lancelot/paintcommands.h + ../../baseline/painting/paintcommands.cpp ../../baseline/painting/paintcommands.h interactivewidget.cpp interactivewidget.h main.cpp widgets.h INCLUDE_DIRECTORIES . - ../../auto/other/lancelot + ../../baseline/painting PUBLIC_LIBRARIES Qt::CorePrivate Qt::Gui @@ -35,41 +35,41 @@ qt_internal_add_resource(lance "icons" ${icons_resource_files} ) set(images_resource_files - "../../auto/other/lancelot/images/alpha.png" - "../../auto/other/lancelot/images/alpha2x2.png" - "../../auto/other/lancelot/images/bitmap.png" - "../../auto/other/lancelot/images/border.png" - "../../auto/other/lancelot/images/borderimage.png" - "../../auto/other/lancelot/images/dome_argb32.png" - "../../auto/other/lancelot/images/dome_indexed.png" - "../../auto/other/lancelot/images/dome_indexed_mask.png" - "../../auto/other/lancelot/images/dome_mono.png" - "../../auto/other/lancelot/images/dome_mono_128.png" - "../../auto/other/lancelot/images/dome_mono_palette.png" - "../../auto/other/lancelot/images/dome_rgb32.png" - "../../auto/other/lancelot/images/dot.png" - "../../auto/other/lancelot/images/face.png" - "../../auto/other/lancelot/images/gam030.png" - "../../auto/other/lancelot/images/gam045.png" - "../../auto/other/lancelot/images/gam056.png" - "../../auto/other/lancelot/images/gam100.png" - "../../auto/other/lancelot/images/gam200.png" - "../../auto/other/lancelot/images/image.png" - "../../auto/other/lancelot/images/mask.png" - "../../auto/other/lancelot/images/mask_100.png" - "../../auto/other/lancelot/images/masked.png" - "../../auto/other/lancelot/images/sign.png" - "../../auto/other/lancelot/images/solid.png" - "../../auto/other/lancelot/images/solid2x2.png" - "../../auto/other/lancelot/images/struct-image-01.jpg" - "../../auto/other/lancelot/images/struct-image-01.png" - "../../auto/other/lancelot/images/zebra.png" + "../../baseline/painting/images/alpha.png" + "../../baseline/painting/images/alpha2x2.png" + "../../baseline/painting/images/bitmap.png" + "../../baseline/painting/images/border.png" + "../../baseline/painting/images/borderimage.png" + "../../baseline/painting/images/dome_argb32.png" + "../../baseline/painting/images/dome_indexed.png" + "../../baseline/painting/images/dome_indexed_mask.png" + "../../baseline/painting/images/dome_mono.png" + "../../baseline/painting/images/dome_mono_128.png" + "../../baseline/painting/images/dome_mono_palette.png" + "../../baseline/painting/images/dome_rgb32.png" + "../../baseline/painting/images/dot.png" + "../../baseline/painting/images/face.png" + "../../baseline/painting/images/gam030.png" + "../../baseline/painting/images/gam045.png" + "../../baseline/painting/images/gam056.png" + "../../baseline/painting/images/gam100.png" + "../../baseline/painting/images/gam200.png" + "../../baseline/painting/images/image.png" + "../../baseline/painting/images/mask.png" + "../../baseline/painting/images/mask_100.png" + "../../baseline/painting/images/masked.png" + "../../baseline/painting/images/sign.png" + "../../baseline/painting/images/solid.png" + "../../baseline/painting/images/solid2x2.png" + "../../baseline/painting/images/struct-image-01.jpg" + "../../baseline/painting/images/struct-image-01.png" + "../../baseline/painting/images/zebra.png" ) qt_internal_add_resource(lance "images" PREFIX "/" BASE - "../../auto/other/lancelot" + "../../baseline/painting" FILES ${images_resource_files} ) diff --git a/tests/manual/lance/lance.pro b/tests/manual/lance/lance.pro index 4437cb45391..f6c6210998c 100644 --- a/tests/manual/lance/lance.pro +++ b/tests/manual/lance/lance.pro @@ -1,4 +1,4 @@ -LANCELOT_DIR = $$PWD/../../auto/other/lancelot +LANCELOT_DIR = $$PWD/../../baseline/painting CONFIG += cmdline moc TEMPLATE = app INCLUDEPATH += . $$LANCELOT_DIR