forked from qt-creator/qt-creator
Add TestStringTable scenario
This scenario is used for testing against regression in StringTable.
If the scenario went OK, the creator finishes and doesn't crash.
Later, this scenario will be invoked from additional test, so that
the second instance of creator will run and the test will
check if the subprocess finished OK. So it's going to be combined
with autotests in the follow up patch.
In order to test it, run creator with the following command line:
"-settingspath ~/.config -scenario TestStringTable". Make sure,
that you point settingspath to creator settings which have
proper kit with a toolchain and Qt setup.
The regression may be tested by restoring the
src/plugins/cpptools/stringtable.cpp to the parent of
f4ab1279fd
and by applying on top of it
this patch (simple conflict may need to be resolved). In this case
running this scenario ends up with a crash (so, it confirms this test
fails on the old code form before the fix).
Change-Id: Icbb56233495047fd68bfb605fcd088f352a16323
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
@@ -80,5 +80,7 @@ add_qtc_plugin(AutoTest
|
||||
|
||||
extend_qtc_plugin(AutoTest
|
||||
CONDITION WITH_TESTS
|
||||
SOURCES autotestunittests.cpp autotestunittests.h
|
||||
SOURCES
|
||||
autotestunittests.cpp autotestunittests.h
|
||||
loadprojectscenario.cpp loadprojectscenario.h
|
||||
)
|
||||
|
@@ -156,7 +156,7 @@ FORMS += \
|
||||
testsettingspage.ui
|
||||
|
||||
equals(TEST, 1) {
|
||||
HEADERS += autotestunittests.h
|
||||
SOURCES += autotestunittests.cpp
|
||||
HEADERS += autotestunittests.h loadprojectscenario.h
|
||||
SOURCES += autotestunittests.cpp loadprojectscenario.cpp
|
||||
RESOURCES += autotestunittests.qrc
|
||||
}
|
||||
|
@@ -133,6 +133,8 @@ QtcPlugin {
|
||||
"autotestunittests.cpp",
|
||||
"autotestunittests.h",
|
||||
"autotestunittests.qrc",
|
||||
"loadprojectscenario.cpp",
|
||||
"loadprojectscenario.h",
|
||||
]
|
||||
}
|
||||
|
||||
|
@@ -79,6 +79,7 @@
|
||||
|
||||
#ifdef WITH_TESTS
|
||||
#include "autotestunittests.h"
|
||||
#include "loadprojectscenario.h"
|
||||
#endif
|
||||
|
||||
using namespace Core;
|
||||
@@ -111,6 +112,9 @@ public:
|
||||
TestTreeModel m_testTreeModel{&m_testCodeParser};
|
||||
TestRunner m_testRunner;
|
||||
TestFrameworkManager m_frameworkManager;
|
||||
#ifdef WITH_TESTS
|
||||
LoadProjectScenario m_loadProjectScenario{&m_testTreeModel};
|
||||
#endif
|
||||
};
|
||||
|
||||
static AutotestPluginPrivate *dd = nullptr;
|
||||
@@ -273,6 +277,10 @@ bool AutotestPlugin::initialize(const QStringList &arguments, QString *errorStri
|
||||
Q_UNUSED(errorString)
|
||||
|
||||
dd = new AutotestPluginPrivate;
|
||||
#ifdef WITH_TESTS
|
||||
ExtensionSystem::PluginManager::registerScenario("TestStringTable",
|
||||
[this]() { return dd->m_loadProjectScenario(); });
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
100
src/plugins/autotest/loadprojectscenario.cpp
Normal file
100
src/plugins/autotest/loadprojectscenario.cpp
Normal file
@@ -0,0 +1,100 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2021 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of Qt Creator.
|
||||
**
|
||||
** 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.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "loadprojectscenario.h"
|
||||
|
||||
#include <cpptools/cpptoolstestcase.h>
|
||||
#include <cpptools/projectinfo.h>
|
||||
|
||||
#include <qtsupport/qtkitinformation.h>
|
||||
|
||||
#include <utils/algorithm.h>
|
||||
|
||||
using namespace Core;
|
||||
using namespace ProjectExplorer;
|
||||
using namespace Utils;
|
||||
|
||||
namespace Autotest {
|
||||
namespace Internal {
|
||||
|
||||
LoadProjectScenario::LoadProjectScenario(TestTreeModel *model, QObject *parent)
|
||||
: QObject(parent),
|
||||
m_model(model)
|
||||
{
|
||||
}
|
||||
|
||||
LoadProjectScenario::~LoadProjectScenario()
|
||||
{
|
||||
delete m_tmpDir;
|
||||
}
|
||||
|
||||
bool LoadProjectScenario::operator()()
|
||||
{
|
||||
return init() && loadProject();
|
||||
}
|
||||
|
||||
bool LoadProjectScenario::init()
|
||||
{
|
||||
const QList<Kit *> allKits = KitManager::kits();
|
||||
if (allKits.count() == 0) {
|
||||
qWarning() << "This scenario requires at least one kit to be present";
|
||||
return false;
|
||||
}
|
||||
|
||||
m_kit = findOr(allKits, nullptr, [](Kit *k) {
|
||||
return k->isValid() && QtSupport::QtKitAspect::qtVersion(k) != nullptr;
|
||||
});
|
||||
if (!m_kit) {
|
||||
qWarning() << "The scenario requires at least one valid kit with a valid Qt";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!QtSupport::QtKitAspect::qtVersion(m_kit)) {
|
||||
qWarning() << "Could not figure out which Qt version is used for default kit.";
|
||||
return false;
|
||||
}
|
||||
|
||||
const ToolChain * const toolchain = ToolChainKitAspect::cxxToolChain(m_kit);
|
||||
if (!toolchain) {
|
||||
qWarning() << "This test requires that there is a kit with a toolchain.";
|
||||
return false;
|
||||
}
|
||||
|
||||
m_tmpDir = new CppTools::Tests::TemporaryCopiedDir(":/unit_test");
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LoadProjectScenario::loadProject()
|
||||
{
|
||||
const QString projectFilePath = m_tmpDir->path() + "/plain/plain.pro";
|
||||
|
||||
CppTools::Tests::ProjectOpenerAndCloser projectManager;
|
||||
// This code must trigger a call to PluginManager::finishScenario() at some later point.
|
||||
const CppTools::ProjectInfo projectInfo = projectManager.open(projectFilePath, true, m_kit);
|
||||
return projectInfo.isValid();
|
||||
}
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Autotest
|
58
src/plugins/autotest/loadprojectscenario.h
Normal file
58
src/plugins/autotest/loadprojectscenario.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2021 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of Qt Creator.
|
||||
**
|
||||
** 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.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
|
||||
namespace CppTools { namespace Tests { class TemporaryCopiedDir; } }
|
||||
namespace ProjectExplorer { class Kit; }
|
||||
|
||||
namespace Autotest {
|
||||
|
||||
class TestTreeModel;
|
||||
|
||||
namespace Internal {
|
||||
|
||||
class LoadProjectScenario : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit LoadProjectScenario(TestTreeModel *model, QObject *parent = nullptr);
|
||||
~LoadProjectScenario();
|
||||
|
||||
bool operator()();
|
||||
|
||||
private:
|
||||
bool init();
|
||||
bool loadProject();
|
||||
|
||||
TestTreeModel *m_model = nullptr;
|
||||
CppTools::Tests::TemporaryCopiedDir *m_tmpDir = nullptr;
|
||||
ProjectExplorer::Kit *m_kit = nullptr;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Autotest
|
@@ -35,6 +35,10 @@
|
||||
#include <QThreadPool>
|
||||
#include <QTimer>
|
||||
|
||||
#ifdef WITH_TESTS
|
||||
#include <extensionsystem/pluginmanager.h>
|
||||
#endif
|
||||
|
||||
using namespace CppTools::Internal;
|
||||
|
||||
enum {
|
||||
@@ -145,6 +149,13 @@ static inline bool isQStringInUse(const QString &string)
|
||||
|
||||
void StringTablePrivate::GC(QFutureInterface<void> &futureInterface)
|
||||
{
|
||||
#ifdef WITH_TESTS
|
||||
if (ExtensionSystem::PluginManager::isScenarioRunning("TestStringTable")) {
|
||||
if (ExtensionSystem::PluginManager::finishScenario())
|
||||
QThread::currentThread()->sleep(5);
|
||||
}
|
||||
#endif
|
||||
|
||||
int initialSize = 0;
|
||||
QElapsedTimer timer;
|
||||
if (DebugStringTable) {
|
||||
|
Reference in New Issue
Block a user