Tests: Add a large sync benchmark

This simulates a ~50k files sync that can be used to measure memory
usage without having to wait for a server.
Esse commit está contido em:
Jocelyn Turcotte
2017-01-16 17:13:52 +01:00
commit 605a18ff73
4 arquivos alterados com 84 adições e 12 exclusões
+1
Ver Arquivo
@@ -50,6 +50,7 @@ if(HAVE_QT5 AND NOT BUILD_WITH_QT4)
owncloud_add_test(SyncFileStatusTracker "syncenginetestutils.h")
owncloud_add_test(ChunkingNg "syncenginetestutils.h")
owncloud_add_test(UploadReset "syncenginetestutils.h")
owncloud_add_benchmark(LargeSync "syncenginetestutils.h")
endif(HAVE_QT5 AND NOT BUILD_WITH_QT4)
SET(FolderMan_SRC ../src/gui/folderman.cpp)
+43
Ver Arquivo
@@ -0,0 +1,43 @@
/*
* This software is in the public domain, furnished "as is", without technical
* support, and with no warranty, express or implied, as to its usefulness for
* any purpose.
*
*/
#include "syncenginetestutils.h"
#include <syncengine.h>
using namespace OCC;
int numDirs = 0;
int numFiles = 0;
template<int filesPerDir, int dirPerDir, int maxDepth>
void addBunchOfFiles(int depth, const QString &path, FileModifier &fi) {
for (int fileNum = 1; fileNum <= filesPerDir; ++fileNum) {
QString name = QStringLiteral("file") + QString::number(fileNum);
fi.insert(path.isEmpty() ? name : path + "/" + name);
numFiles++;
}
if (depth >= maxDepth)
return;
for (char dirNum = 1; dirNum <= dirPerDir; ++dirNum) {
QString name = QStringLiteral("dir") + QString::number(dirNum);
QString subPath = path.isEmpty() ? name : path + "/" + name;
fi.mkdir(subPath);
numDirs++;
addBunchOfFiles<filesPerDir, dirPerDir, maxDepth>(depth + 1, subPath, fi);
}
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
FakeFolder fakeFolder{FileInfo{}};
addBunchOfFiles<10, 8, 4>(0, "", fakeFolder.localModifier());
qDebug() << "NUMFILES" << numFiles;
qDebug() << "NUMDIRS" << numDirs;
return fakeFolder.syncOnce() ? 0 : -1;
}
+27
Ver Arquivo
@@ -24,3 +24,30 @@ macro(owncloud_add_test test_class additional_cpp)
add_definitions(-DOWNCLOUD_BIN_PATH=${CMAKE_BINARY_DIR}/bin)
add_test(NAME ${OWNCLOUD_TEST_CLASS}Test COMMAND ${OWNCLOUD_TEST_CLASS}Test)
endmacro()
macro(owncloud_add_benchmark test_class additional_cpp)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}
${QT_INCLUDES}
"${PROJECT_SOURCE_DIR}/src/gui"
"${PROJECT_SOURCE_DIR}/src/libsync"
"${CMAKE_BINARY_DIR}/src/libsync"
"${CMAKE_CURRENT_BINARY_DIR}"
)
set(CMAKE_AUTOMOC TRUE)
set(OWNCLOUD_TEST_CLASS ${test_class})
string(TOLOWER "${OWNCLOUD_TEST_CLASS}" OWNCLOUD_TEST_CLASS_LOWERCASE)
add_executable(${OWNCLOUD_TEST_CLASS}Bench benchmarks/bench${OWNCLOUD_TEST_CLASS_LOWERCASE}.cpp ${additional_cpp})
qt5_use_modules(${OWNCLOUD_TEST_CLASS}Bench Test Sql Xml Network)
target_link_libraries(${OWNCLOUD_TEST_CLASS}Bench
updater
${APPLICATION_EXECUTABLE}sync
${QT_QTTEST_LIBRARY}
${QT_QTCORE_LIBRARY}
)
add_definitions(-DOWNCLOUD_TEST)
add_definitions(-DOWNCLOUD_BIN_PATH=${CMAKE_BINARY_DIR}/bin)
endmacro()
+13 -12
Ver Arquivo
@@ -267,6 +267,15 @@ public:
return (parentPath.isEmpty() ? QString() : (parentPath + '/')) + name;
}
void fixupParentPathRecursively() {
auto p = path();
for (auto it = children.begin(); it != children.end(); ++it) {
Q_ASSERT(it.key() == it->name);
it->parentPath = p;
it->fixupParentPathRecursively();
}
}
QString name;
bool isDir = true;
bool isShared = false;
@@ -285,15 +294,6 @@ private:
return find(pathComponents, true);
}
void fixupParentPathRecursively() {
auto p = path();
for (auto it = children.begin(); it != children.end(); ++it) {
Q_ASSERT(it.key() == it->name);
it->parentPath = p;
it->fixupParentPathRecursively();
}
}
friend inline QDebug operator<<(QDebug dbg, const FileInfo& fi) {
return dbg << "{ " << fi.path() << ": " << fi.children;
}
@@ -791,6 +791,7 @@ public:
QDir rootDir{_tempDir.path()};
FileInfo rootTemplate;
fromDisk(rootDir, rootTemplate);
rootTemplate.fixupParentPathRecursively();
return rootTemplate;
}
@@ -834,7 +835,7 @@ public:
bool execUntilFinished() {
QSignalSpy spy(_syncEngine.get(), SIGNAL(finished(bool)));
bool ok = spy.wait(60000);
bool ok = spy.wait(3600000);
Q_ASSERT(ok && "Sync timed out");
return spy[0][0].toBool();
}
@@ -867,8 +868,8 @@ private:
if (diskChild.isDir()) {
QDir subDir = dir;
subDir.cd(diskChild.fileName());
templateFi.children.insert(diskChild.fileName(), FileInfo{diskChild.fileName()});
fromDisk(subDir, templateFi.children.last());
FileInfo &subFi = templateFi.children[diskChild.fileName()] = FileInfo{diskChild.fileName()};
fromDisk(subDir, subFi);
} else {
QFile f{diskChild.filePath()};
f.open(QFile::ReadOnly);