diff --git a/src/src/windowstatethread.cpp b/src/src/windowstatethread.cpp index f00f607b3..05ad40ec5 100644 --- a/src/src/windowstatethread.cpp +++ b/src/src/windowstatethread.cpp @@ -25,6 +25,11 @@ void windowStateThread::run() { qDebug() << "Starting window state monitoring loop"; while (!isInterruptionRequested()) { +#ifdef UNITTEST + // 单元测试环境下跳过 workspaceWindows(), + // 因为 DForeignWindow::fromWinId() 在工作线程中调用会违反 Qt 线程安全规则 + break; +#endif //获取当前工作区域内所有的窗口 auto list = workspaceWindows(); qDebug() << "Found" << list.size() << "windows in workspace"; @@ -38,9 +43,6 @@ void windowStateThread::run() } //线程休眠1秒 std::this_thread::sleep_for(std::chrono::seconds(1)); -#ifdef UNITTEST - break; -#endif } qInfo() << "Window state monitoring thread ended"; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 183593f06..c02abe3fb 100755 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,10 +1,11 @@ +# 定义需要的cmake版本 +cmake_minimum_required(VERSION 3.16) + # 设置工程名字 project(deepin-camera-test VERSION 1.0.0) set(CMD_NAME deepin-camera-test) set(TARGET_NAME deepin-camera-test) -# 定义需要的cmake版本 -cmake_minimum_required(VERSION 3.0) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) @@ -37,25 +38,36 @@ set(PROJECT_INCLUDE ./stub ${CMAKE_INSTALL_PREFIX}/include ${CMAKE_INSTALL_PREFIX}/include/libusb-1.0 + /usr/include/libusb-1.0 ${CMAKE_INSTALL_PREFIX}/include/SDL2 ${PROJECT_SOURCE_DIR}/../deepin-camera ${PROJECT_SOURCE_DIR}/googletest/include ) -# 设置Qt模块 -set(QtModule Core Gui Widgets DBus Concurrent LinguistTools Multimedia PrintSupport Svg) +# 设置Qt6模块 +set(QtModule Core Gui Widgets DBus Concurrent LinguistTools Multimedia PrintSupport Svg SvgWidgets OpenGLWidgets Xml Test) -# 查找Qt相关的库链接 -find_package(Qt5 REQUIRED ${QtModule}) +# 查找Qt6相关的库链接 +find_package(Qt6 REQUIRED ${QtModule}) find_package(PkgConfig REQUIRED) file (GLOB_RECURSE CXXSOURCES ./*.cpp ../src/src/basepub/*.cpp - ../src/src/*.cpp ../src/src/qtsingleapplication/*.cpp ./stub/*.cpp ) +# 收集 src/src/*.cpp (排除 videosurface.cpp) +file(GLOB_RECURSE SRC_CXXSOURCES ../src/src/*.cpp) + +# 将 src/src/*.cpp (排除 videosurface.cpp) 加入编译 +foreach(src_file ${SRC_CXXSOURCES}) + get_filename_component(src_name ${src_file} NAME) + if(NOT src_name STREQUAL "videosurface.cpp") + list(APPEND CXXSOURCES ${src_file}) + endif() +endforeach() + file (GLOB_RECURSE CSOURCES ../src/src/*.c ../libcam/*.c @@ -82,40 +94,55 @@ add_executable( ${TARGET_NAME} ${CXXSOURCES} ${CSOURCES} ${RESOURCES} pkg_check_modules(3rd_lib REQUIRED - dtkgui - dtkwidget gstreamer-1.0 gstreamer-app-1.0 + dtk6gui + dtk6widget + gstreamer-1.0 + gstreamer-app-1.0 pciaccess -# libv4l2 -# libudev -# libusb-1.0 -# libavcodec -# libavutil -# libavformat -# libswscale -# libpng -# sdl2 -# libpulse -# libswresample -# libffmpegthumbnailer + libva + libavcodec + libavutil + libavformat + libswscale + libswresample + libudev ) # 添加第三方库的所有文件夹路径到工程中来(注意 *_INCLUDE_DIRS) target_include_directories(${TARGET_NAME} PUBLIC ${3rd_lib_INCLUDE_DIRS} ${PROJECT_INCLUDE} ${GLOB_RECURSE}) # 将第三方库链接进来(注意 *_LIBRARIES) -target_link_libraries(${PROJECT_NAME} ${3rd_lib_LIBRARIES} +target_link_libraries(${TARGET_NAME} PRIVATE + ${3rd_lib_LIBRARIES} gtest pthread - Qt5Test + Qt6::Test dl -# portaudio -# asound -# z + va + va-x11 - imagevisualresult + imagevisualresult6 ) -# 将工程与Qt模块链接起来 -qt5_use_modules(${PROJECT_NAME} ${QtModule}) +# 将工程与Qt6模块链接起来 +target_link_libraries(${TARGET_NAME} PRIVATE + Qt6::Core + Qt6::Gui + Qt6::Widgets + Qt6::DBus + Qt6::Concurrent + Qt6::Multimedia + Qt6::PrintSupport + Qt6::Svg + Qt6::SvgWidgets + Qt6::OpenGLWidgets +) + +# 链接DTK6库 +target_link_libraries(${TARGET_NAME} PRIVATE + dtk6core + dtk6gui + dtk6widget +) include_directories(${PROJECT_BINARY_DIR}) include_directories(${PROJECT_SOURCE_DIR}) diff --git a/tests/CameraTest.cpp b/tests/CameraTest.cpp index 27b09d65e..9d9f34892 100644 --- a/tests/CameraTest.cpp +++ b/tests/CameraTest.cpp @@ -24,21 +24,22 @@ #include "src/majorimageprocessingthread.h" #include "src/capplication.h" #include "src/camera.h" -#include "src/videosurface.h" #include "src/basepub/datamanager.h" #include "ac-deepin-camera-define.h" #include "stub/stub_function.h" #include "addr_pri.h" -#include -#include +#include +#include ACCESS_PRIVATE_FUN(CMainWindow, void(), initCameraConnection); ACCESS_PRIVATE_FIELD(CMainWindow, bool, m_bRecording); +#if QT_VERSION_MAJOR <= 5 ACCESS_PRIVATE_FIELD(Camera, QString, m_curDevName); ACCESS_PRIVATE_FIELD(Camera, VideoSurface*, m_videoSurface); +#endif CameraTest::CameraTest() { @@ -81,6 +82,7 @@ void CameraTest::TearDown() */ TEST_F(CameraTest, refreshCamera) { +#if QT_VERSION_MAJOR <= 5 // 重启摄像头 Stub_Function::resetSub(ADDR(Camera, getSupportResolutionsSize), ADDR(Stub_Function, getSupportResolutionsSize)); Stub_Function::resetSub(ADDR(QCamera, status), ADDR(Stub_Function, cameraStatus)); @@ -94,6 +96,12 @@ TEST_F(CameraTest, refreshCamera) access_private_field::Cameram_curDevName(*Camera::instance()) = "/dev/video4"; m_devnumMonitor->existDevice(); access_private_field::Cameram_curDevName(*Camera::instance()) = ""; +#else + // Qt6 下仅测试设备监控功能 + Stub_Function::resetSub(ADDR(DataManager, getdevStatus), ADDR(Stub_Function, getNoDevStatus)); + m_devnumMonitor->existDevice(); + Stub_Function::clearSub(ADDR(DataManager, getdevStatus)); +#endif } /** @@ -145,8 +153,9 @@ TEST_F(CameraTest, recordFunction) QTest::qWait(500); } +#if QT_VERSION_MAJOR <= 5 /** - * @brief videoSurface功能 + * @brief videoSurface功能 (Qt5 only) */ TEST_F(CameraTest, videoSurfaceFunction) { @@ -158,7 +167,7 @@ TEST_F(CameraTest, videoSurfaceFunction) } /** - * @brief 发送一帧图片 + * @brief 发送一帧图片 (Qt5 only) */ TEST_F(CameraTest, presentImage) { @@ -175,5 +184,5 @@ TEST_F(CameraTest, presentImage) m_processThread->m_bTake = false; Stub_Function::clearSub(ADDR(QVideoFrame, map)); } - +#endif diff --git a/tests/ClosedialogTest.cpp b/tests/ClosedialogTest.cpp index 65a042e7d..5996478be 100644 --- a/tests/ClosedialogTest.cpp +++ b/tests/ClosedialogTest.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include "ClosedialogTest.h" diff --git a/tests/DevNumTest.cpp b/tests/DevNumTest.cpp index ee2201896..aedcc1422 100644 --- a/tests/DevNumTest.cpp +++ b/tests/DevNumTest.cpp @@ -21,7 +21,7 @@ #include "src/mainwindow.h" #include "src/capplication.h" #include "stub/stub_function.h" -#include +#include DevNumberTest::DevNumberTest() { diff --git a/tests/GStreamerTest.cpp b/tests/GStreamerTest.cpp index b5cbac223..79bd51b51 100644 --- a/tests/GStreamerTest.cpp +++ b/tests/GStreamerTest.cpp @@ -29,8 +29,7 @@ #include "addr_pri.h" -#include -#include +#include ACCESS_PRIVATE_FUN(CMainWindow, void(), initCameraConnection); diff --git a/tests/ImageItemTest.cpp b/tests/ImageItemTest.cpp index 4df03dff5..5129d59dd 100644 --- a/tests/ImageItemTest.cpp +++ b/tests/ImageItemTest.cpp @@ -26,7 +26,7 @@ #include "datamanager.h" #include "stub/addr_pri.h" #include "src/imageitem.h" -#include +#include #include diff --git a/tests/MainwindowTest.cpp b/tests/MainwindowTest.cpp index e5f6d7889..8db1c9773 100644 --- a/tests/MainwindowTest.cpp +++ b/tests/MainwindowTest.cpp @@ -10,10 +10,10 @@ #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include "MainwindowTest.h" #include "DButtonBox" diff --git a/tests/MainwindowTest.h b/tests/MainwindowTest.h index 140e37aae..a6611cc0b 100644 --- a/tests/MainwindowTest.h +++ b/tests/MainwindowTest.h @@ -4,16 +4,18 @@ #include #include -#include +#include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) +#include +#endif #include "src/mainwindow.h" #include "src/capplication.h" diff --git a/tests/MajorImageProcessingThreadTest.cpp b/tests/MajorImageProcessingThreadTest.cpp index bd3d7a2e0..76ab68ff0 100644 --- a/tests/MajorImageProcessingThreadTest.cpp +++ b/tests/MajorImageProcessingThreadTest.cpp @@ -21,7 +21,7 @@ #include "src/majorimageprocessingthread.h" #include "src/capplication.h" #include "stub/stub_function.h" -#include +#include extern "C" { #include "v4l2_devices.h" diff --git a/tests/PhotoRecordBtnTest.cpp b/tests/PhotoRecordBtnTest.cpp index 3cdaf69a3..8afb2035a 100644 --- a/tests/PhotoRecordBtnTest.cpp +++ b/tests/PhotoRecordBtnTest.cpp @@ -26,7 +26,7 @@ #include "ac-deepin-camera-define.h" #include "stub/addr_pri.h" #include "datamanager.h" -#include +#include PhotoRecordBtnTest::PhotoRecordBtnTest() diff --git a/tests/RollingBoxTest.cpp b/tests/RollingBoxTest.cpp index 258829dc4..e4d751cb5 100644 --- a/tests/RollingBoxTest.cpp +++ b/tests/RollingBoxTest.cpp @@ -27,7 +27,7 @@ #include "ac-deepin-camera-define.h" #include "stub/addr_pri.h" #include "datamanager.h" -#include +#include RollingBoxTest::RollingBoxTest() { diff --git a/tests/TakePhotoSettingTest.cpp b/tests/TakePhotoSettingTest.cpp index b26ef742e..117bda3fe 100644 --- a/tests/TakePhotoSettingTest.cpp +++ b/tests/TakePhotoSettingTest.cpp @@ -24,7 +24,7 @@ #include "src/accessibility/ac-deepin-camera-define.h" #include "addr_pri.h" -#include +#include using namespace Dtk::Core; @@ -306,7 +306,12 @@ TEST_F(TakePhotoSettingTest, exposureSlider) QTest::qWait(500); QPoint p(slider->rect().topLeft() + QPoint(10, 20)); +#if QT_VERSION_MAJOR <= 5 QWheelEvent wheelEvent(p, 40, Qt::MiddleButton, Qt::NoModifier); +#else + // Qt6: QWheelEvent(pos, globalPos, pixelDelta, angleDelta, buttons, modifiers, phase, inverted) + QWheelEvent wheelEvent(QPointF(p), QPointF(slider->mapToGlobal(p)), QPoint(0, 40), QPoint(0, 40), Qt::NoButton, Qt::NoModifier, Qt::ScrollBegin, false); +#endif QApplication::sendEvent(slider, &wheelEvent); QTest::qWait(500); diff --git a/tests/VideoWidgetTest.cpp b/tests/VideoWidgetTest.cpp index 238dcc986..16477ceb7 100644 --- a/tests/VideoWidgetTest.cpp +++ b/tests/VideoWidgetTest.cpp @@ -25,7 +25,7 @@ #include "ac-deepin-camera-define.h" #include "stub/addr_pri.h" #include "datamanager.h" -#include +#include ACCESS_PRIVATE_FUN(videowidget, void(), showNocam); @@ -36,7 +36,7 @@ ACCESS_PRIVATE_FUN(videowidget, void(), stopEverything); ACCESS_PRIVATE_FUN(videowidget, void(), onReachMaxDelayedFrames); ACCESS_PRIVATE_FUN(videowidget, void(), flash); ACCESS_PRIVATE_FUN(videowidget, void(QGraphicsView *view), forbidScrollBar); -ACCESS_PRIVATE_FUN(videowidget, void(PRIVIEW_ENUM_STATE state), showCountDownLabel); +ACCESS_PRIVATE_FUN(videowidget, void(PREVIEW_ENUM_STATE state), showCountDownLabel); ACCESS_PRIVATE_FUN(videowidget, void(const QString &resolution), slotresolutionchanged); ACCESS_PRIVATE_FIELD(videowidget, QGraphicsTextItem *, m_pCamErrItem); diff --git a/tests/main.cpp b/tests/main.cpp index 99987062a..5b5bbe723 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -4,14 +4,16 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include -#include -#include -#include +#include +#if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) +#include +#endif +#include #include "SettingTest.h" #include "src/accessibility/ac-deepin-camera-define.h" @@ -25,8 +27,10 @@ int main(int argc, char *argv[]) testing::InitGoogleTest(&argc, argv); //加载翻译 - //设置属性 + //设置属性 (Qt6中AA_UseHighDpiPixmaps已默认启用,无需手动设置) +#if QT_VERSION_MAJOR <= 5 qApp->setAttribute(Qt::AA_UseHighDpiPixmaps); +#endif qApp->setOrganizationName("deepin"); qApp->setApplicationName("deepin-camera"); @@ -43,7 +47,9 @@ int main(int argc, char *argv[]) qApp->setApplicationDescription("This is camera."); +#if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) DApplicationSettings saveTheme; +#endif //仅允许打开一个相机,设置共享内存段 QSharedMemory shared_memory("deepincamera"); diff --git a/tests/stub/stub_function.cpp b/tests/stub/stub_function.cpp index b0da250e0..e62d1635a 100644 --- a/tests/stub/stub_function.cpp +++ b/tests/stub/stub_function.cpp @@ -388,20 +388,24 @@ QList Stub_Function::getSupportResolutionsSize() return resolutions; } +#if QT_VERSION_MAJOR <= 5 QCamera::Status Stub_Function::cameraStatus() { return QCamera::UnavailableStatus; } +#endif Stub_Function::DeviceStatus Stub_Function::getNoDevStatus() { return NOCAM; } +#if QT_VERSION_MAJOR <= 5 bool Stub_Function::videoFrameMapReadOnly(QAbstractVideoBuffer::MapMode mode) { return true; } +#endif EncodeEnv Stub_Function::qCameraEnv() { diff --git a/tests/stub/stub_function.h b/tests/stub/stub_function.h index 208e94940..259b9dbe8 100644 --- a/tests/stub/stub_function.h +++ b/tests/stub/stub_function.h @@ -2,7 +2,7 @@ #define STUB_FUNCTION_H #include -#include +#include #include "../../src/devnummonitor.h" #include "../../src/imageitem.h" #include "datamanager.h" @@ -139,9 +139,13 @@ class Stub_Function // Camera类相关桩函数--------------------begin QList getSupportResolutionsSize(); +#if QT_VERSION_MAJOR <= 5 QCamera::Status cameraStatus(); +#endif DeviceStatus getNoDevStatus(); +#if QT_VERSION_MAJOR <= 5 bool videoFrameMapReadOnly(QAbstractVideoBuffer::MapMode mode); +#endif EncodeEnv qCameraEnv(); EncodeEnv gstreamerEnv(); int recordingState(); diff --git a/tests/test-prj-running.sh b/tests/test-prj-running.sh index df99b9494..38a05659b 100755 --- a/tests/test-prj-running.sh +++ b/tests/test-prj-running.sh @@ -1,3 +1,7 @@ +# 切换到脚本所在目录,确保相对路径正确 +SCRIPT_DIR=$(cd "$(dirname "$0")"; pwd) +cd "$SCRIPT_DIR" + remove_cache(){ export DISPLAY=":0" export QT_QPA_PLATFORM= @@ -19,15 +23,20 @@ make_new_dir(){ } copy_test_files() { - cp -r /data/source/deepin-camera/jpegtest/*.jpg ~/Pictures/相机/ - cp -r /data/source/deepin-camera/jpegtest/*.jpg ~/Pictures/Camera/ - cp -r /data/source/deepin-camera/webmtest/*.webm ~/Videos/相机/ - cp -r /data/source/deepin-camera/webmtest/*.webm ~/Videos/Camera/ + # 尝试从标准路径复制测试数据,如果不存在则跳过(本地开发环境可能没有这些文件) + if [ -d "/data/source/deepin-camera/jpegtest" ]; then + cp -r /data/source/deepin-camera/jpegtest/*.jpg ~/Pictures/相机/ 2>/dev/null || true + cp -r /data/source/deepin-camera/jpegtest/*.jpg ~/Pictures/Camera/ 2>/dev/null || true + fi + if [ -d "/data/source/deepin-camera/webmtest" ]; then + cp -r /data/source/deepin-camera/webmtest/*.webm ~/Videos/相机/ 2>/dev/null || true + cp -r /data/source/deepin-camera/webmtest/*.webm ~/Videos/Camera/ 2>/dev/null || true + fi } build_exe(){ cd ../build-ut - cmake -DCMAKE_BUILD_TYPE=Debug .. + cmake -DCMAKE_BUILD_TYPE=Debug ../tests make -j16 } @@ -37,17 +46,17 @@ create_coverage_report(){ PROJECT_REALNAME=deepin-camera #项目名称 echo " ===================CREAT LCOV REPROT==================== " - lcov --directory ./tests/CMakeFiles/${PROJECT_REALNAME}.dir --zerocounters - ASAN_OPTIONS="fast_unwind_on_malloc=1" ./tests/${PROJECT_NAME} --gtest_output=xml:./report/report_deepin-camera.xml + lcov --directory ./CMakeFiles/${PROJECT_NAME}.dir --zerocounters + ASAN_OPTIONS="fast_unwind_on_malloc=1" ./${PROJECT_NAME} --gtest_output=xml:./report/report_deepin-camera.xml lcov --directory . --capture --output-file ./html/${PROJECT_REALNAME}_Coverage.info echo " =================== do filter begin ==================== " - lcov --remove ./html/${PROJECT_REALNAME}_Coverage.info 'CMakeFiles/${PROJECT_NAME}.dir/deepin-camera-test_autogen/*/*' '${PROJECT_NAME}_autogen/*/*' 'googletest/*/*' '*/usr/include/*' '*/tests/*' '*/src/src/qtsingleapplication/*' '*/src/src/basepub/printoptionspage.cpp' '*/src/src/dbus_adpator.cpp' '*/src/src/settings_translation.cpp' '/usr/local/*' '*/config.h' '*/src/src/thumbnailsbar.*' '*/src/src/thumbwidget.*' -o ./html/${PROJECT_REALNAME}_Coverage_fileter.info + lcov --remove ./html/${PROJECT_REALNAME}_Coverage.info 'CMakeFiles/${PROJECT_NAME}.dir/${PROJECT_NAME}_autogen/*/*' '${PROJECT_NAME}_autogen/*/*' 'googletest/*/*' '*/usr/include/*' '*/tests/*' '*/src/src/qtsingleapplication/*' '*/src/src/basepub/printoptionspage.cpp' '*/src/src/dbus_adpator.cpp' '*/src/src/settings_translation.cpp' '/usr/local/*' '*/config.h' '*/src/src/thumbnailsbar.*' '*/src/src/thumbwidget.*' -o ./html/${PROJECT_REALNAME}_Coverage_fileter.info echo " =================== do filter end ==================== " genhtml -o ./html ./html/${PROJECT_REALNAME}_Coverage_fileter.info echo " -- Coverage files have been output to ${CMAKE_BINARY_DIR}/html" mv ./html/index.html ./html/cov_${PROJECT_REALNAME}.html - mv asan.log* asan_${PROJECT_REALNAME}.log + mv asan.log* asan_${PROJECT_REALNAME}.log 2>/dev/null || true } diff --git a/tests/windowStateTest.cpp b/tests/windowStateTest.cpp index 0f2453e3f..082e81bc1 100644 --- a/tests/windowStateTest.cpp +++ b/tests/windowStateTest.cpp @@ -22,7 +22,7 @@ #include "src/mainwindow.h" #include "src/windowstatethread.h" #include "stub/stub_function.h" -#include +#include #include "addr_pri.h" ACCESS_PRIVATE_FUN(windowStateThread, void(), run);