diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2015-11-17 11:42:06 -0800 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2017-08-04 11:19:13 +0000 |
commit | b12fd1fa9d0b64e3cb66fa68c85392dbde8e175b (patch) | |
tree | 4ba59c7d4cff41eba27ac8eca2ba38f14f182f38 /tests/auto/corelib/global/qgetputenv | |
parent | 1f4fd599a8c7eaaf5373af19bf94c208d42707b2 (diff) |
Long live qEnvironmentVariable()
[ChangeLog][QtCore] Added qEnvironmentVariable, which returns the value
of an environment variable in a QString, while qgetenv continues to be
used to return it in a QByteArray. For Unix, since most environment
variables seem to contain path names, qEnvironmentVariable will do the
same as QFile::decodeName, which means NFC/NFD conversion on Apple OSes.
I opted not to #include <qfile.h> from qglobal.cpp to implement that
QFile::decodeName functionality, so qglobal.cpp doesn't depend on
corelib/io and to avoid possible recursions.
Task-number: QTBUG-41006
Change-Id: I14839ba5678944c2864bffff141794b8aaa7aa28
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests/auto/corelib/global/qgetputenv')
-rw-r--r-- | tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp | 67 |
1 files changed, 64 insertions, 3 deletions
diff --git a/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp b/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp index 09abb953ba..f02e902468 100644 --- a/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp +++ b/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2016 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -30,12 +31,16 @@ #include <QtTest/QtTest> #include <qglobal.h> +#ifdef Q_OS_WIN +#include <qt_windows.h> +#endif class tst_QGetPutEnv : public QObject { Q_OBJECT private slots: void getSetCheck(); + void encoding(); void intValue_data(); void intValue(); }; @@ -53,7 +58,11 @@ void tst_QGetPutEnv::getSetCheck() QCOMPARE(qEnvironmentVariableIntValue(varName, &ok), 0); QVERIFY(!ok); QByteArray result = qgetenv(varName); - QCOMPARE(result, QByteArray()); + QVERIFY(result.isNull()); + QString sresult = qEnvironmentVariable(varName); + QVERIFY(sresult.isNull()); + sresult = qEnvironmentVariable(varName, "hello"); + QCOMPARE(sresult, QString("hello")); #ifndef Q_OS_WIN QVERIFY(qputenv(varName, "")); // deletes varName instead of making it empty, on Windows @@ -64,6 +73,16 @@ void tst_QGetPutEnv::getSetCheck() QCOMPARE(qEnvironmentVariableIntValue(varName), 0); QCOMPARE(qEnvironmentVariableIntValue(varName, &ok), 0); QVERIFY(!ok); + + result = qgetenv(varName); + QVERIFY(!result.isNull()); + QCOMPARE(result, QByteArray()); + sresult = qEnvironmentVariable(varName); + QVERIFY(!sresult.isNull()); + QCOMPARE(sresult, QString()); + sresult = qEnvironmentVariable(varName, "hello"); + QVERIFY(!sresult.isNull()); + QCOMPARE(sresult, QString()); #endif QVERIFY(qputenv(varName, QByteArray("supervalue"))); @@ -76,19 +95,61 @@ void tst_QGetPutEnv::getSetCheck() QVERIFY(!ok); result = qgetenv(varName); QCOMPARE(result, QByteArrayLiteral("supervalue")); + sresult = qEnvironmentVariable(varName); + QCOMPARE(sresult, QString("supervalue")); + sresult = qEnvironmentVariable(varName, "hello"); + QCOMPARE(sresult, QString("supervalue")); qputenv(varName,QByteArray()); // Now test qunsetenv QVERIFY(qunsetenv(varName)); - QVERIFY(!qEnvironmentVariableIsSet(varName)); + QVERIFY(!qEnvironmentVariableIsSet(varName)); // note: might fail on some systems! QVERIFY(qEnvironmentVariableIsEmpty(varName)); ok = true; QCOMPARE(qEnvironmentVariableIntValue(varName), 0); QCOMPARE(qEnvironmentVariableIntValue(varName, &ok), 0); QVERIFY(!ok); + result = qgetenv(varName); - QCOMPARE(result, QByteArray()); + QVERIFY(result.isNull()); + sresult = qEnvironmentVariable(varName); + QVERIFY(sresult.isNull()); + sresult = qEnvironmentVariable(varName, "hello"); + QCOMPARE(sresult, QString("hello")); +} + +void tst_QGetPutEnv::encoding() +{ + // The test string is: + // U+0061 LATIN SMALL LETTER A + // U+00E1 LATIN SMALL LETTER A WITH ACUTE + // U+03B1 GREEK SMALL LETTER ALPHA + // U+0430 CYRILLIC SMALL LETTER A + // This has letters in three different scripts, so no locale besides + // UTF-8 is able handle them all. + // The LATIN SMALL LETTER A WITH ACUTE is NFC for NFD: + // U+0061 U+0301 LATIN SMALL LETTER A + COMBINING ACUTE ACCENT + + const char varName[] = "should_not_exist"; + static const wchar_t rawvalue[] = { 'a', 0x00E1, 0x03B1, 0x0430, 0 }; + QString value = QString::fromWCharArray(rawvalue); + +#if defined(Q_OS_WINRT) + QSKIP("Test cannot be run on this platform"); +#elif defined(Q_OS_WIN) + const wchar_t wvarName[] = L"should_not_exist"; + _wputenv_s(wvarName, rawvalue); +#else + // confirm the locale is UTF-8 + if (value.toLocal8Bit() != "a\xc3\xa1\xce\xb1\xd0\xb0") + QSKIP("Locale is not UTF-8, cannot test"); + + qputenv(varName, QFile::encodeName(value)); +#endif + + QVERIFY(qEnvironmentVariableIsSet(varName)); + QCOMPARE(qEnvironmentVariable(varName), value); } void tst_QGetPutEnv::intValue_data() |