aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/autotest/ctest/ctesttreeitem.cpp
blob: f5ac7bc13b421cb419df4776c59eb8c201436e06 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0

#include "ctesttreeitem.h"

#include "ctestconfiguration.h"
#include "ctestsettings.h"

#include "../autotestplugin.h"
#include "../itestframework.h"
#include "../testsettings.h"

#include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/buildsystem.h>
#include <projectexplorer/environmentaspect.h>
#include <projectexplorer/project.h>
#include <projectexplorer/session.h>
#include <projectexplorer/target.h>

#include <utils/link.h>
#include  <utils/qtcassert.h>

namespace Autotest {
namespace Internal {

CTestTreeItem::CTestTreeItem(ITestBase *testBase, const QString &name,
                             const Utils::FilePath &filepath, Type type)
    : ITestTreeItem(testBase, name, filepath, type)
{
}

QList<ITestConfiguration *> CTestTreeItem::getAllTestConfigurations() const
{
    return testConfigurationsFor({});
}

QList<ITestConfiguration *> CTestTreeItem::getSelectedTestConfigurations() const
{
    QStringList selectedTests;
    forFirstLevelChildren([&selectedTests](ITestTreeItem *it) {
        if (it->checked())
            selectedTests.append(it->name());
    });

    return selectedTests.isEmpty() ? QList<ITestConfiguration *>()
                                   : testConfigurationsFor(selectedTests);
}

QList<ITestConfiguration *> CTestTreeItem::getFailedTestConfigurations() const
{
    QStringList selectedTests;
    forFirstLevelChildren([&selectedTests](ITestTreeItem *it) {
        if (it->data(0, FailedRole).toBool())
            selectedTests.append(it->name());
    });

    return selectedTests.isEmpty() ? QList<ITestConfiguration *>()
                                   : testConfigurationsFor(selectedTests);
}

ITestConfiguration *CTestTreeItem::testConfiguration() const
{
    return testConfigurationsFor({name()}).value(0);
}

QVariant CTestTreeItem::data(int column, int role) const
{
    if (role == Qt::CheckStateRole)
        return checked();
    if (role == LinkRole) {
        QVariant itemLink;
        itemLink.setValue(Utils::Link(filePath(), line()));
        return itemLink;
    }
    return ITestTreeItem::data(column, role);
}

QList<ITestConfiguration *> CTestTreeItem::testConfigurationsFor(const QStringList &selected) const
{
    ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject();
    if (!project)
        return {};

    const ProjectExplorer::Target *target = project->targets().value(0);
    if (!target)
        return {};

    const ProjectExplorer::BuildSystem *buildSystem = target->buildSystem();
    QStringList options{"--timeout", QString::number(AutotestPlugin::settings()->timeout / 1000)};
    auto ctestSettings = static_cast<CTestSettings *>(testBase()->testSettings());
    options << ctestSettings->activeSettingsAsOptions();
    Utils::CommandLine command = buildSystem->commandLineForTests(selected, options);
    if (command.executable().isEmpty())
        return {};

    CTestConfiguration *config = new CTestConfiguration(testBase());
    config->setProject(project);
    config->setCommandLine(command);
    const ProjectExplorer::RunConfiguration *runConfig = target->activeRunConfiguration();
    Utils::Environment env = Utils::Environment::systemEnvironment();
    if (QTC_GUARD(runConfig)) {
        if (auto envAspect = runConfig->aspect<ProjectExplorer::EnvironmentAspect>())
            env = envAspect->environment();
    }
    if (Utils::HostOsInfo::isWindowsHost()) {
        env.set("QT_FORCE_STDERR_LOGGING", "1");
        env.set("QT_LOGGING_TO_CONSOLE", "1");
    }
    config->setEnvironment(env);
    const ProjectExplorer::BuildConfiguration *buildConfig = target->activeBuildConfiguration();
    if (QTC_GUARD(buildConfig))
        config->setWorkingDirectory(buildConfig->buildDirectory());

    if (selected.isEmpty())
        config->setTestCaseCount(testBase()->asTestTool()->rootNode()->childCount());
    else
        config->setTestCaseCount(selected.size());
    return {config};
}

} // namespace Internal
} // namespace Autotest