Files
folderscope/tests/search_cache_test.cpp
forust c24d0dd84d
ci-release / publish-linux-amd64 (push) Failing after 1m55s
ci-release / verify (push) Successful in 2m32s
feat(search): optimize duplicate detection
2026-07-26 16:27:33 +02:00

113 lines
3.3 KiB
C++

#include "search_cache.h"
#include <QDataStream>
#include <QFile>
#include <QTemporaryDir>
#include <QtTest>
class SearchCacheTest final : public QObject {
Q_OBJECT
private:
static FileRecord record()
{
FileRecord value;
value.path = QStringLiteral("/tmp/cache-test.bin");
value.size = 1234;
value.modifiedNs = 5678;
value.device = 9;
value.inode = 10;
return value;
}
private slots:
void storesAndReloadsBothHashes()
{
QTemporaryDir directory;
QVERIFY(directory.isValid());
const QString path = directory.filePath(QStringLiteral("cache.dat"));
const FileRecord value = record();
const QByteArray sample("sample");
const QByteArray full("full");
const QByteArray query("query");
{
SearchCache cache(path);
cache.storeSampleHash(value, sample);
cache.storeHash(value, full);
cache.storeContent(value, query, true);
cache.save();
}
SearchCache cache(path);
QByteArray digest;
QVERIFY(cache.findSampleHash(value, digest));
QCOMPARE(digest, sample);
QVERIFY(cache.findHash(value, digest));
QCOMPARE(digest, full);
QCOMPARE(cache.findContent(value, query), std::optional<bool>(true));
}
void invalidatesEverySignatureField()
{
QTemporaryDir directory;
QVERIFY(directory.isValid());
SearchCache cache(directory.filePath(QStringLiteral("cache.dat")));
const FileRecord value = record();
cache.storeSampleHash(value, QByteArray("sample"));
cache.storeHash(value, QByteArray("full"));
const auto misses = [&cache](FileRecord changed) {
QByteArray digest;
return !cache.findSampleHash(changed, digest)
&& !cache.findHash(changed, digest);
};
FileRecord changed = value;
++changed.size;
QVERIFY(misses(changed));
changed = value;
++changed.modifiedNs;
QVERIFY(misses(changed));
changed = value;
++changed.device;
QVERIFY(misses(changed));
changed = value;
++changed.inode;
QVERIFY(misses(changed));
}
void ignoresVersionOneData()
{
QTemporaryDir directory;
QVERIFY(directory.isValid());
const QString path = directory.filePath(QStringLiteral("cache.dat"));
QFile file(path);
QVERIFY(file.open(QIODevice::WriteOnly));
QDataStream stream(&file);
stream.setVersion(QDataStream::Qt_6_0);
stream << quint32(0x46534348) << quint32(1) << quint32(0);
file.close();
SearchCache cache(path);
QByteArray digest;
QVERIFY(!cache.findHash(record(), digest));
cache.storeHash(record(), QByteArray("full"));
cache.save();
QFile saved(path);
QVERIFY(saved.open(QIODevice::ReadOnly));
QDataStream savedStream(&saved);
savedStream.setVersion(QDataStream::Qt_6_0);
quint32 magic = 0;
quint32 version = 0;
savedStream >> magic >> version;
QCOMPARE(magic, quint32(0x46534348));
QCOMPARE(version, quint32(2));
}
};
QTEST_GUILESS_MAIN(SearchCacheTest)
#include "search_cache_test.moc"