feat: 任务栏gtest单元测试框架添加

任务栏gtest单元测试框架添加

Log: 任务栏gtest单元测试框架添加
Task: https://pms.uniontech.com/zentao/task-view-44498.html
Change-Id: Ifaf67e4d019c21bd00af6645deeb57a81b343afb
This commit is contained in:
liuxing 2020-11-19 18:11:06 +08:00
parent a19ecbe757
commit 2b4f2ba456
6 changed files with 94 additions and 69 deletions

3
debian/control vendored
View File

@ -23,7 +23,8 @@ Build-Depends: debhelper (>= 8.0.0),
cmake, cmake,
libdde-network-utils-dev, libdde-network-utils-dev,
libdbusmenu-qt5-dev, libdbusmenu-qt5-dev,
libdtkgui-dev libdtkgui-dev,
libgtest-dev
Standards-Version: 3.9.8 Standards-Version: 3.9.8
Homepage: http://www.deepin.org/ Homepage: http://www.deepin.org/

17
gen_report.sh Executable file
View File

@ -0,0 +1,17 @@
#!/bin/bash
# 需要先安装lcov打开./unittest/CMakeLists.txt 测试覆盖率的编译条件
# 将该脚本放置到dde-dock-unit_test二进制文件同级目录运行
lcov -c -i -d ./ -o init.info
./dde_dock_unit_test
lcov -c -d ./ -o cover.info
lcov -a init.info -a cover.info -o total.info
lcov --remove total.info '*/usr/include/*' '*/usr/lib/*' '*/usr/lib64/*' '*/usr/local/include/*' '*/usr/local/lib/*' '*/usr/local/lib64/*' '*/third/*' 'testa.cpp' -o final.info
# 生成报告
genhtml -o cover_report --legend --title "lcov" --prefix=./ final.info
#打开报告
nohup x-www-browser ./cover_report/index.html &
exit 0

View File

@ -8,9 +8,13 @@ set(CMAKE_AUTOMOC ON)
# #
file(GLOB_RECURSE SRCS "*.h" "*.cpp") file(GLOB_RECURSE SRCS "*.h" "*.cpp")
#
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -lgcov")
# #
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
find_package(Qt5 COMPONENTS Test DBus REQUIRED) find_package(Qt5 COMPONENTS Widgets Test DBus REQUIRED)
find_package(GTest REQUIRED)
pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus)
pkg_check_modules(QGSettings REQUIRED gsettings-qt) pkg_check_modules(QGSettings REQUIRED gsettings-qt)
@ -27,4 +31,8 @@ target_link_libraries(${BIN_NAME} PRIVATE
${Qt5DBus_LIBRARIES} ${Qt5DBus_LIBRARIES}
${DFrameworkDBus_LIBRARIES} ${DFrameworkDBus_LIBRARIES}
${QGSettings_LIBRARIES} ${QGSettings_LIBRARIES}
${Qt5Widgets_LIBRARIES}
${GTEST_LIBRARIES}
-lpthread
-lm
) )

View File

@ -35,16 +35,20 @@
#define SLEEP1 QThread::sleep(1); #define SLEEP1 QThread::sleep(1);
DockUnitTest::DockUnitTest() DockUnitTest::DockUnitTest()
: m_dockInter(new QDBusInterface("com.deepin.dde.Dock", "/com/deepin/dde/Dock", "org.freedesktop.DBus.Properties"))
, m_daemonDockInter(new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this))
{ {
qDBusRegisterMetaType<ScreenRect>(); qDBusRegisterMetaType<ScreenRect>();
} }
DockUnitTest::~DockUnitTest() DockUnitTest::~DockUnitTest()
{ {
delete m_dockInter; }
delete m_daemonDockInter;
void DockUnitTest::SetUp()
{
}
void DockUnitTest::TearDown()
{
} }
const DockRect DockUnitTest::dockGeometry() const DockRect DockUnitTest::dockGeometry()
@ -72,7 +76,8 @@ const DockRect DockUnitTest::frontendWindowRect()
void DockUnitTest::setPosition(Dock::Position pos) void DockUnitTest::setPosition(Dock::Position pos)
{ {
m_daemonDockInter->setPosition(pos); DBusDock daemonDockInter("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this);
daemonDockInter.setPosition(pos);
} }
/** /**
@ -83,31 +88,31 @@ void DockUnitTest::setPosition(Dock::Position pos)
* 2. * 2.
* 3. * 3.
*/ */
void DockUnitTest::dock_defaultGsettings_check() TEST_F(DockUnitTest, dock_defaultGsettings_check)
{ {
QGSettings setting("com.deepin.dde.dock", "/com/deepin/dde/dock/"); QGSettings setting("com.deepin.dde.dock", "/com/deepin/dde/dock/");
if (setting.keys().contains("displayMode")) { if (setting.keys().contains("displayMode")) {
QString currentDisplayMode = setting.get("display-mode").toString(); QString currentDisplayMode = setting.get("display-mode").toString();
QString defaultDisplayMode = "efficient"; QString defaultDisplayMode = "efficient";
QCOMPARE(currentDisplayMode, defaultDisplayMode); ASSERT_EQ(currentDisplayMode, defaultDisplayMode);
} }
if (setting.keys().contains("hideMode")) { if (setting.keys().contains("hideMode")) {
QString currentHideMode = setting.get("hide-mode").toString(); QString currentHideMode = setting.get("hide-mode").toString();
QString defaultHideMode = "keep-showing"; QString defaultHideMode = "keep-showing";
QCOMPARE(currentHideMode, defaultHideMode); ASSERT_EQ(currentHideMode, defaultHideMode);
} }
if (setting.keys().contains("position")) { if (setting.keys().contains("position")) {
QString currentPosition = setting.get("position").toString(); QString currentPosition = setting.get("position").toString();
QString defaultPosition = "bottom"; QString defaultPosition = "bottom";
QCOMPARE(currentPosition, defaultPosition); ASSERT_EQ(currentPosition, defaultPosition);
} }
} }
/** /**
* @brief DockUnitTest::dock_geometry_test * @brief DockUnitTest::dock_geometry_test
*/ */
void DockUnitTest::dock_geometry_check() TEST_F(DockUnitTest, dock_geometry_check)
{ {
ScreenRect daemonDockRect, dockRect; ScreenRect daemonDockRect, dockRect;
@ -141,12 +146,12 @@ void DockUnitTest::dock_geometry_check()
qDebug() << dockRect; qDebug() << dockRect;
} }
QCOMPARE(daemonDockRect, dockRect); ASSERT_EQ(daemonDockRect, dockRect);
} }
/** /**
* @brief DockUnitTest::dock_position_check Dbus和QGSettings获取的坐标信息是否一致 * @brief DockUnitTest::dock_position_check Dbus和QGSettings获取的坐标信息是否一致
*/ */
void DockUnitTest::dock_position_check() TEST_F(DockUnitTest, dock_position_check)
{ {
DBusDock *dockInter = new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this); DBusDock *dockInter = new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this);
int nPos = dockInter->position(); int nPos = dockInter->position();
@ -173,13 +178,13 @@ void DockUnitTest::dock_position_check()
QGSettings *setting = new QGSettings("com.deepin.dde.dock"); QGSettings *setting = new QGSettings("com.deepin.dde.dock");
if (setting->keys().contains("position")) { if (setting->keys().contains("position")) {
qDebug() << setting->get("position"); qDebug() << setting->get("position");
QCOMPARE(postion,setting->get("position").toString()); ASSERT_EQ(postion, setting->get("position").toString());
} }
} }
/** /**
* @brief DockUnitTest::dock_displayMode_check Dbus和QGSettings获取的显示模式是否一致 * @brief DockUnitTest::dock_displayMode_check Dbus和QGSettings获取的显示模式是否一致
*/ */
void DockUnitTest::dock_displayMode_check() TEST_F(DockUnitTest, dock_displayMode_check)
{ {
DBusDock *dockInter = new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this); DBusDock *dockInter = new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this);
int nMode = dockInter->displayMode(); int nMode = dockInter->displayMode();
@ -203,11 +208,11 @@ void DockUnitTest::dock_displayMode_check()
QGSettings *setting = new QGSettings("com.deepin.dde.dock"); QGSettings *setting = new QGSettings("com.deepin.dde.dock");
if (setting->keys().contains("displayMode")) { if (setting->keys().contains("displayMode")) {
qDebug() << setting->get("displayMode"); qDebug() << setting->get("displayMode");
QCOMPARE(displayMode,setting->get("displayMode").toString()); ASSERT_EQ(displayMode, setting->get("displayMode").toString());
} }
} }
void DockUnitTest::dock_appItemCount_check() TEST_F(DockUnitTest, dock_appItemCount_check)
{ {
DBusDock *dockInter = new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this); DBusDock *dockInter = new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this);
qDebug() << dockInter->entries().size(); qDebug() << dockInter->entries().size();
@ -224,36 +229,36 @@ void DockUnitTest::dock_appItemCount_check()
* 5.3.0.25.3.0.5 * 5.3.0.25.3.0.5
* Bug: https://pms.uniontech.com/zentao/bug-view-42095.html * Bug: https://pms.uniontech.com/zentao/bug-view-42095.html
*/ */
void DockUnitTest::dock_frontWindowRect_check() TEST_F(DockUnitTest, dock_frontWindowRect_check)
{ {
setPosition(Dock::Position::Top); setPosition(Dock::Position::Top);
SLEEP1; SLEEP1;
QVERIFY(dockGeometry() == frontendWindowRect()); ASSERT_EQ(dockGeometry(), frontendWindowRect());
setPosition(Dock::Position::Right); setPosition(Dock::Position::Right);
SLEEP1; SLEEP1;
QVERIFY(dockGeometry() == frontendWindowRect()); ASSERT_EQ(dockGeometry(), frontendWindowRect());
setPosition(Dock::Position::Bottom); setPosition(Dock::Position::Bottom);
SLEEP1; SLEEP1;
QVERIFY(dockGeometry() == frontendWindowRect()); ASSERT_EQ(dockGeometry(), frontendWindowRect());
setPosition(Dock::Position::Left); setPosition(Dock::Position::Left);
SLEEP1; SLEEP1;
QVERIFY(dockGeometry() == frontendWindowRect()); ASSERT_EQ(dockGeometry(), frontendWindowRect());
} }
/** /**
* @brief DockUnitTest::dock_multi_process * @brief DockUnitTest::dock_multi_process
* dde-dock是否在没进程存在时能否正常启动dde-dock进程存在时能否正常退出 * dde-dock是否在没进程存在时能否正常启动dde-dock进程存在时能否正常退出
*/ */
void DockUnitTest::dock_multi_process() TEST_F(DockUnitTest, dock_multi_process)
{ {
QProcess *dockProc = new QProcess(); QProcess *dockProc = new QProcess();
dockProc->start("dde-dock"); dockProc->start("dde-dock");
connect(dockProc, static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, [=](int exitCode, QProcess::ExitStatus exitStatus) { connect(dockProc, static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, [=](int exitCode, QProcess::ExitStatus exitStatus) {
QCOMPARE(exitCode, 255); ASSERT_EQ(exitCode, 255);
QCOMPARE(exitStatus, QProcess::ExitStatus::NormalExit); ASSERT_EQ(exitStatus, QProcess::ExitStatus::NormalExit);
}); });
connect(dockProc, &QProcess::errorOccurred, this, [=](QProcess::ProcessError error) { connect(dockProc, &QProcess::errorOccurred, this, [=](QProcess::ProcessError error) {
qDebug() << "dde-dock error occurred: " << error; qDebug() << "dde-dock error occurred: " << error;
@ -270,7 +275,7 @@ void DockUnitTest::dock_multi_process()
* *
* *
*/ */
void DockUnitTest::dock_defaultVolume_Check(float defaultVolume) TEST_F(DockUnitTest, dock_defaultVolume_Check)
{ {
float volume = 0; float volume = 0;
QDBusInterface audioInterface("com.deepin.daemon.Audio", "/com/deepin/daemon/Audio", "com.deepin.daemon.Audio", QDBusConnection::sessionBus(), this); QDBusInterface audioInterface("com.deepin.daemon.Audio", "/com/deepin/daemon/Audio", "com.deepin.daemon.Audio", QDBusConnection::sessionBus(), this);
@ -282,14 +287,14 @@ void DockUnitTest::dock_defaultVolume_Check(float defaultVolume)
QDBusInterface sinkInterface("com.deepin.daemon.Audio", defaultPath.path(), "com.deepin.daemon.Audio.Sink", QDBusConnection::sessionBus(), this); QDBusInterface sinkInterface("com.deepin.daemon.Audio", defaultPath.path(), "com.deepin.daemon.Audio.Sink", QDBusConnection::sessionBus(), this);
volume = sinkInterface.property("Volume").toFloat() * 100.0f; volume = sinkInterface.property("Volume").toFloat() * 100.0f;
} }
QCOMPARE(volume, defaultVolume); ASSERT_EQ(volume, 50.0f);
} }
/** /**
* @brief DockUnitTest::dock_coreDump_check * @brief DockUnitTest::dock_coreDump_check
* dock是不是同一个pid, * dock是不是同一个pid,
* *
*/ */
void DockUnitTest::dock_coreDump_check() TEST_F(DockUnitTest, dock_coreDump_check)
{ {
auto process = new QProcess(); auto process = new QProcess();
process->start("pidof -s dde-dock"); process->start("pidof -s dde-dock");
@ -304,7 +309,7 @@ void DockUnitTest::dock_coreDump_check()
QByteArray pid2 = process->readAllStandardOutput(); QByteArray pid2 = process->readAllStandardOutput();
process->close(); process->close();
QCOMPARE(pid,pid2); ASSERT_EQ(pid, pid2);
delete process; delete process;
} }
@ -313,20 +318,20 @@ void DockUnitTest::dock_coreDump_check()
* @brief DockUnitTest::dock_appIconSize_check * @brief DockUnitTest::dock_appIconSize_check
* dbus和gsettings获取的任务栏图标大小是否一致 * dbus和gsettings获取的任务栏图标大小是否一致
*/ */
void DockUnitTest::dock_appIconSize_check() TEST_F(DockUnitTest, dock_appIconSize_check)
{ {
DBusDock *dockInter = new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this); DBusDock *dockInter = new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this);
QGSettings *setting = new QGSettings("com.deepin.dde.dock"); QGSettings *setting = new QGSettings("com.deepin.dde.dock");
unsigned int iconSize = dockInter->iconSize(); unsigned int iconSize = dockInter->iconSize();
qDebug() << "Please check the size of icons:" << iconSize; qDebug() << "Please check the size of icons:" << iconSize;
QCOMPARE(iconSize, setting->get("icon-size").toUInt()); ASSERT_EQ(iconSize, setting->get("icon-size").toUInt());
} }
/** /**
* @brief dock_appDockUndock_check * @brief dock_appDockUndock_check
* , undock , dock * , undock , dock
*/ */
void DockUnitTest::dock_appDockUndock_check() TEST_F(DockUnitTest, dock_appDockUndock_check)
{ {
const QString service_name = "com.deepin.dde.daemon.Dock"; const QString service_name = "com.deepin.dde.daemon.Dock";
const QString dock_path = "/com/deepin/dde/daemon/Dock"; const QString dock_path = "/com/deepin/dde/daemon/Dock";
@ -346,8 +351,8 @@ void DockUnitTest::dock_appDockUndock_check()
const QString appDockPath = appEntries[appIndex].path(); const QString appDockPath = appEntries[appIndex].path();
// get DesktopFile // get DesktopFile
QDBusInterface appPropertyInter(service_name,appDockPath, "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus(), this); QDBusInterface appPropertyInter(service_name, appDockPath, "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus(), this);
QDBusInterface appSlotInter(service_name,appDockPath, "com.deepin.dde.daemon.Dock.Entry", QDBusConnection::sessionBus(), this); QDBusInterface appSlotInter(service_name, appDockPath, "com.deepin.dde.daemon.Dock.Entry", QDBusConnection::sessionBus(), this);
QDBusReply<QVariant> replyDesktopFile = appPropertyInter.call("Get", "com.deepin.dde.daemon.Dock.Entry", "DesktopFile"); QDBusReply<QVariant> replyDesktopFile = appPropertyInter.call("Get", "com.deepin.dde.daemon.Dock.Entry", "DesktopFile");
QString desktopFile = QVariant(replyDesktopFile).toString(); // desktopFile QString desktopFile = QVariant(replyDesktopFile).toString(); // desktopFile
@ -361,14 +366,14 @@ void DockUnitTest::dock_appDockUndock_check()
// check if app still dock // check if app still dock
appDesktopFiles=dockInter.GetDockedAppsDesktopFiles(); appDesktopFiles=dockInter.GetDockedAppsDesktopFiles();
QCOMPARE(appDesktopFiles.contains(desktopFile), false); ASSERT_EQ(appDesktopFiles.contains(desktopFile), false);
// dock app // dock app
dockInter.RequestDock(desktopFile, appIndex); dockInter.RequestDock(desktopFile, appIndex);
QThread::msleep(100); // must QThread::msleep(100); // must
// check if app is docked // check if app is docked
QCOMPARE(dockInter.IsDocked(desktopFile), true); ASSERT_EQ(dockInter.IsDocked(desktopFile), true);
} }
/** /**
@ -376,7 +381,7 @@ void DockUnitTest::dock_appDockUndock_check()
* *
* 41907 * 41907
*/ */
void DockUnitTest::dock_switchModeState_check() TEST_F(DockUnitTest, dock_switchModeState_check)
{ {
QProcess process; QProcess process;
process.start("/usr/lib/deepin-daemon/desktop-toggle"); process.start("/usr/lib/deepin-daemon/desktop-toggle");
@ -386,17 +391,14 @@ void DockUnitTest::dock_switchModeState_check()
return; return;
} }
m_daemonDockInter->setSync(true); DBusDock daemonDockInter("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this);
m_daemonDockInter->setHideMode(Dock::HideMode::SmartHide); daemonDockInter.setSync(true);
m_daemonDockInter->setDisplayMode(Dock::DisplayMode::Fashion); daemonDockInter.setHideMode(Dock::HideMode::SmartHide);
m_daemonDockInter->setDisplayMode(Dock::DisplayMode::Efficient); daemonDockInter.setDisplayMode(Dock::DisplayMode::Fashion);
daemonDockInter.setDisplayMode(Dock::DisplayMode::Efficient);
QThread::sleep(2); QThread::sleep(2);
int state = m_daemonDockInter->hideState(); int state = daemonDockInter.hideState();
QCOMPARE(state, Dock::HideState::Show); ASSERT_EQ(state, Dock::HideState::Show);
} }
QTEST_APPLESS_MAIN(DockUnitTest)
#include "dock_unit_test.moc"

View File

@ -26,38 +26,24 @@
#include "../interfaces/constants.h" #include "../interfaces/constants.h"
#include <gtest/gtest.h>
using DBusDock = com::deepin::dde::daemon::Dock; using DBusDock = com::deepin::dde::daemon::Dock;
class DockUnitTest : public QObject class DockUnitTest : public QObject, public ::testing::Test
{ {
Q_OBJECT Q_OBJECT
public: public:
DockUnitTest(); DockUnitTest();
~DockUnitTest(); virtual ~DockUnitTest();
virtual void SetUp();
virtual void TearDown();
private: public:
QDBusInterface *m_dockInter;
DBusDock *m_daemonDockInter;
private:
const DockRect dockGeometry(); // 获取任务栏实际位置 const DockRect dockGeometry(); // 获取任务栏实际位置
const DockRect frontendWindowRect(); // 后端记录的任务栏前端界面位置(和实际位置不一定对应) const DockRect frontendWindowRect(); // 后端记录的任务栏前端界面位置(和实际位置不一定对应)
void setPosition(Dock::Position pos); void setPosition(Dock::Position pos);
private slots:
void dock_defaultGsettings_check(); // 默认配置项检查
void dock_geometry_check(); // 显示区域
void dock_position_check(); // 位置检查
void dock_displayMode_check(); // 显示模式检查
void dock_appItemCount_check(); // 应用显示数量检查
void dock_defaultVolume_Check(float defaultVolume = 50.0f); // 设备默认音量检查
void dock_frontWindowRect_check(); // 检查FrontendWindowRect接口数据是否正确
void dock_multi_process(); // 检查是否正常启动
void dock_coreDump_check(); // dock是否一直崩溃
void dock_appIconSize_check(); // 图标大小检查
void dock_appDockUndock_check(); // 任务栏上的应用移除和加载检测
void dock_switchModeState_check(); // 显示桌面智能隐藏时切换任务栏模式,检查任务栏状态
}; };
#endif // DOCK_UNIT_TEST_H #endif // DOCK_UNIT_TEST_H

11
unittest/main.cpp Normal file
View File

@ -0,0 +1,11 @@
#include <QApplication>
#include <gtest/gtest.h>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}