Fix QFile autotest not to require elevated privilege to pass
authorShane Kearns <ext-shane.2.kearns@nokia.com>
Wed, 1 Feb 2012 13:57:24 +0000 (13:57 +0000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 7 Feb 2012 19:03:43 +0000 (20:03 +0100)
The open test case tests opening a device path on windows.
As this requires privilege elevation, the test fails when running
nmake check from a console.
As the CI machines appear to run tests with admin privileges, first
check opening the device using the windows API. If that succeeds, then
opening using QFile should succeed. If that fails, the opening using
QFile should fail.
(Since Windows vista, members of the "administrators" group do not run
at elevated privilege all the time. The user needs to opt in via a
UAC prompt or "run as administrator". This is similar to using the
sudo command on unix)

Ran the test as administrator and normally. Now passes in both cases.

Change-Id: Ibd7682eceb61e35d4912fa0392df536f4331f6ed
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
tests/auto/corelib/io/qfile/tst_qfile.cpp

index 00e4535..67a4f71 100644 (file)
@@ -53,7 +53,9 @@
 #include <QHostInfo>
 #endif
 #include <QProcess>
-#ifndef Q_OS_WIN
+#ifdef Q_OS_WIN
+# include <qt_windows.h>
+#else
 # include <sys/types.h>
 # include <unistd.h>
 #endif
@@ -476,8 +478,16 @@ void tst_QFile::open_data()
     QTest::newRow("noreadfile") << QString("noreadfile") << int(QIODevice::ReadOnly)
                                 << false << QFile::OpenError;
 #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
-    QTest::newRow("//./PhysicalDrive0") << QString("//./PhysicalDrive0") << int(QIODevice::ReadOnly)
-                                        << true << QFile::NoError;
+    //opening devices requires administrative privileges (and elevation).
+    HANDLE hTest = CreateFile(_T("\\\\.\\PhysicalDrive0"), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
+    if (hTest != INVALID_HANDLE_VALUE) {
+        CloseHandle(hTest);
+        QTest::newRow("//./PhysicalDrive0") << QString("//./PhysicalDrive0") << int(QIODevice::ReadOnly)
+                                            << true << QFile::NoError;
+    } else {
+        QTest::newRow("//./PhysicalDrive0") << QString("//./PhysicalDrive0") << int(QIODevice::ReadOnly)
+                                            << false << QFile::OpenError;
+    }
     QTest::newRow("uncFile") << "//" + QtNetworkSettings::winServerName() + "/testshare/test.pri" << int(QIODevice::ReadOnly)
                              << true << QFile::NoError;
 #endif