aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/qmlnetwork/qqmlsslconfiguration_cpp/tst_qqmlsslconfiguration_cpp.cpp
blob: 4ed199b7afe89c4be3663985bfae697bc42dc707 (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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

#include <QTest>
#include <QSsl>
#include <private/qqmlsslconfiguration_p.h>

class tst_QQmlSslConfiguration : public QObject
{
    Q_OBJECT

    enum class ConfType : quint8
    {
        DefaultSsl,
        DefaultDtls,
    };
private Q_SLOTS:
    void sslOptionsInSync_data();
    void sslOptionsInSync();

    void sslOptionFlags_data();
    void sslOptionFlags();

public:
    // Keep in sync with QSsl::SslOptions!
    static constexpr
    std::array<QSsl::SslOption, 8> AllOptions { QSsl::SslOptionDisableEmptyFragments,
                                                QSsl::SslOptionDisableSessionTickets,
                                                QSsl::SslOptionDisableCompression,
                                                QSsl::SslOptionDisableServerNameIndication,
                                                QSsl::SslOptionDisableLegacyRenegotiation,
                                                QSsl::SslOptionDisableSessionSharing,
                                                QSsl::SslOptionDisableSessionPersistence,
                                                QSsl::SslOptionDisableServerCipherPreference };
};

static QList<QSsl::SslOption> getSslOptionsFromConfig(const QSslConfiguration &c)
{
    QList<QSsl::SslOption> result;
    for (auto opt : tst_QQmlSslConfiguration::AllOptions) {
        if (c.testSslOption(opt))
            result.append(opt);
    }

    // return a sorted list
    std::sort(result.begin(), result.end());
    return result;
}

static QSsl::SslOptions getSslOptionsAsFlags(const QSslConfiguration &c)
{
    QSsl::SslOptions options{};
    for (auto opt : tst_QQmlSslConfiguration::AllOptions) {
        if (c.testSslOption(opt))
            options |= opt;
    }
    return options;
}

void tst_QQmlSslConfiguration::sslOptionsInSync_data()
{
    QTest::addColumn<ConfType>("type");

    QTest::newRow("DefaultSslConfiguration") << ConfType::DefaultSsl;
    QTest::newRow("DefaultDtlsConfiguration") << ConfType::DefaultDtls;
}

void tst_QQmlSslConfiguration::sslOptionsInSync()
{
#if QT_REMOVAL_QT7_DEPRECATED_SINCE(6, 11)
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
    QFETCH(ConfType, type);
    std::unique_ptr<QQmlSslConfiguration> conf;

    if (type == ConfType::DefaultSsl)
        conf.reset(new QQmlSslDefaultConfiguration);
    else
        conf.reset(new QQmlSslDefaultDtlsConfiguration);

    // Default config has some options, and originally they're in sync
    auto opts = conf->sslOptions();
    std::sort(opts.begin(), opts.end());
    QCOMPARE_EQ(opts, getSslOptionsFromConfig(conf->configuration()));

    // set new options
    QList<QSsl::SslOption> newOptions { QSsl::SslOptionDisableCompression,
                                        QSsl::SslOptionDisableServerCipherPreference };
    conf->setSslOptions(newOptions);

    std::sort(newOptions.begin(), newOptions.end());

    opts = conf->sslOptions();
    std::sort(opts.begin(), opts.end());
    // reading back the correct value
    QCOMPARE_EQ(opts, newOptions);

    // reading the values from the underlying configuration
    QEXPECT_FAIL("", "QTBUG-137900", Continue);
    QCOMPARE_EQ(getSslOptionsFromConfig(conf->configuration()), newOptions);
QT_WARNING_POP
#else
    QSKIP("This test should be removed in Qt 7!")
#endif // QT_REMOVAL_QT7_DEPRECATED_SINCE(6, 11)
}

void tst_QQmlSslConfiguration::sslOptionFlags_data()
{
    QTest::addColumn<ConfType>("type");

    QTest::newRow("DefaultSslConfiguration") << ConfType::DefaultSsl;
    QTest::newRow("DefaultDtlsConfiguration") << ConfType::DefaultDtls;
}

void tst_QQmlSslConfiguration::sslOptionFlags()
{
    QFETCH(const ConfType, type);

    std::unique_ptr<QQmlSslConfiguration> conf;
    QSsl::SslOptions defaultOptions;

    if (type == ConfType::DefaultSsl) {
        conf.reset(new QQmlSslDefaultConfiguration);
        defaultOptions = getSslOptionsAsFlags(QSslConfiguration::defaultConfiguration());
    } else {
        conf.reset(new QQmlSslDefaultDtlsConfiguration);
#if QT_CONFIG(dtls)
        defaultOptions = getSslOptionsAsFlags(QSslConfiguration::defaultDtlsConfiguration());
#else
        defaultOptions = getSslOptionsAsFlags(QSslConfiguration::defaultConfiguration());
#endif // QT_CONFIG(dtls)
    }

    // check default options
    QCOMPARE_EQ(conf->sslOptionFlags(), defaultOptions);
    // check the underlying configuration
    QCOMPARE_EQ(getSslOptionsAsFlags(conf->configuration()), defaultOptions);

    // update to some new value
    QSsl::SslOptions options = QSsl::SslOptionDisableCompression
                                | QSsl::SslOptionDisableServerCipherPreference;

    conf->setSslOptionFlags(options);
    QCOMPARE_EQ(conf->sslOptionFlags(), options);
    // check the underlying configuration
    QCOMPARE_EQ(getSslOptionsAsFlags(conf->configuration()), options);
}

QTEST_MAIN(tst_QQmlSslConfiguration)

#include "tst_qqmlsslconfiguration_cpp.moc"