┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/tests/testdir.cpp
blob: 84e76e712faf00d92a95c02a2d74da6961133d62 (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
/*
 *   SPDX-FileCopyrightText: 2010-2011 Frank Reininghaus <[email protected]>
 *
 *   SPDX-License-Identifier: GPL-2.0-or-later
 */

#include "testdir.h"

#ifdef Q_OS_UNIX
#include <utime.h>
#elif defined(Q_OS_WIN)
#include <windows.h>
#endif

TestDir::TestDir(const QString &directoryPrefix)
    : QTemporaryDir(directoryPrefix)
{
}

TestDir::~TestDir() = default;

QUrl TestDir::url() const
{
    return QUrl::fromLocalFile(path());
}

/** The following function is taken from kdelibs/kio/tests/kiotesthelper.h, copyright (C) 2006 by David Faure */
static void setTimeStamp(const QString &path, const QDateTime &mtime)
{
#ifdef Q_OS_UNIX
    struct utimbuf utbuf;
    utbuf.actime = mtime.toSecsSinceEpoch();
    utbuf.modtime = utbuf.actime;
    utime(QFile::encodeName(path), &utbuf);
#elif defined(Q_OS_WIN)
    HANDLE h = CreateFileW(reinterpret_cast<const wchar_t *>(path.utf16()),
                           FILE_WRITE_ATTRIBUTES,
                           FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                           nullptr,
                           OPEN_EXISTING,
                           FILE_FLAG_BACKUP_SEMANTICS, // required to open directories
                           nullptr);
    if (h != INVALID_HANDLE_VALUE) {
        // Convert a Unix-epoch time in milliseconds to a Windows FILETIME, which
        // counts 100-nanosecond intervals since 1601-01-01.
        // 11644473600000: milliseconds between 1601-01-01 and the Unix epoch (1970-01-01).
        // 10000: 100-nanosecond intervals per millisecond.
        qint64 fileTime = (mtime.toMSecsSinceEpoch() + 11644473600000LL) * 10000LL;
        FILETIME ft;
        ft.dwLowDateTime = static_cast<DWORD>(fileTime & 0xFFFFFFFF);
        ft.dwHighDateTime = static_cast<DWORD>((fileTime >> 32) & 0xFFFFFFFF);
        SetFileTime(h, nullptr, nullptr, &ft);
        CloseHandle(h);
    }
#endif
}

void TestDir::createFile(const QString &path, const QByteArray &data, const QDateTime &time)
{
    QString absolutePath = path;
    makePathAbsoluteAndCreateParents(absolutePath);

    QFile f(absolutePath);
    if (!f.open(QIODevice::WriteOnly)) {
        qFatal() << "could not open" << absolutePath;
    }
    f.write(data);
    f.close();

    if (time.isValid()) {
        setTimeStamp(absolutePath, time);
    }

    Q_ASSERT(QFile::exists(absolutePath));
}

void TestDir::createFiles(const QStringList &files)
{
    for (const QString &path : files) {
        createFile(path);
    }
}

void TestDir::createDir(const QString &path, const QDateTime &time)
{
    QString absolutePath = path;
    makePathAbsoluteAndCreateParents(absolutePath);
    QDir(TestDir::path()).mkdir(absolutePath);

    if (time.isValid()) {
        setTimeStamp(absolutePath, time);
    }

    Q_ASSERT(QFile::exists(absolutePath));
}

void TestDir::removeFiles(const QStringList &files)
{
    for (const QString &path : files) {
        removeFile(path);
    }
}

void TestDir::removeFile(const QString &path)
{
    QString absolutePath = path;
    QFileInfo fileInfo(absolutePath);
    if (!fileInfo.isAbsolute()) {
        absolutePath = TestDir::path() + QLatin1Char('/') + path;
    }
    QFile::remove(absolutePath);
}

void TestDir::removeDir(const QString &path)
{
    QString absolutePath = path;
    QFileInfo fileInfo(absolutePath);
    if (!fileInfo.isAbsolute()) {
        absolutePath = TestDir::path() + QLatin1Char('/') + path;
    }
    QDir dirToRemove = QDir(absolutePath);
    dirToRemove.removeRecursively();
}

void TestDir::makePathAbsoluteAndCreateParents(QString &path)
{
    QFileInfo fileInfo(path);
    if (!fileInfo.isAbsolute()) {
        path = TestDir::path() + QLatin1Char('/') + path;
        fileInfo.setFile(path);
    }

    const QDir dir = fileInfo.dir();
    if (!dir.exists()) {
        createDir(dir.absolutePath());
    }

    Q_ASSERT(dir.exists());
}