Skip to content

Commit 609910c

Browse files
committed
test(migration): wip! test each migration scenarion.
Signed-off-by: Camila Ayres <[email protected]>
1 parent 637a565 commit 609910c

File tree

3 files changed

+271
-0
lines changed

3 files changed

+271
-0
lines changed

src/gui/folderman.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class TestFolderStatusModel;
2626
class ShareTestHelper;
2727
class EndToEndTestHelper;
2828
class TestSyncConflictsModel;
29+
class TestMigration;
2930

3031
namespace OCC {
3132

@@ -413,6 +414,7 @@ private slots:
413414
friend class ::ShareTestHelper;
414415
friend class ::EndToEndTestHelper;
415416
friend class ::TestFolderStatusModel;
417+
friend class ::TestMigration;
416418
};
417419

418420
} // namespace OCC

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ nextcloud_add_benchmark(LargeSync)
140140
nextcloud_add_test(Account)
141141
nextcloud_add_test(FolderMan)
142142
nextcloud_add_test(RemoteWipe)
143+
nextcloud_add_test(Migration)
143144

144145
configure_file(test_journal.db "${PROJECT_BINARY_DIR}/bin/test_journal.db" COPYONLY)
145146

test/testmigration.cpp

Lines changed: 268 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,268 @@
1+
/*
2+
* This software is in the public domain, furnished "as is", without technical
3+
* support, and with no warranty, express or implied, as to its usefulness for
4+
* any purpose.
5+
*
6+
*/
7+
8+
#include <qglobal.h>
9+
#include <QTemporaryDir>
10+
#include <QtTest>
11+
#include <QtTest/qtestcase.h>
12+
13+
#include "common/utility.h"
14+
#include "folderman.h"
15+
#include "account.h"
16+
#include "accountstate.h"
17+
#include <accountmanager.h>
18+
#include "configfile.h"
19+
#include "syncenginetestutils.h"
20+
#include "testhelper.h"
21+
#include "version.h"
22+
23+
using namespace OCC;
24+
25+
class TestMigration: public QObject
26+
{
27+
Q_OBJECT
28+
29+
ConfigFile _configFile;
30+
QTemporaryDir _temporaryDir;
31+
std::unique_ptr<FolderMan> _folderMan;
32+
33+
private:
34+
static constexpr char legacyAppName[] = "ownCloud";
35+
static constexpr char standardAppName[] = "Nextcloud";
36+
static constexpr char brandedAppName[] = "Branded";
37+
static constexpr char legacyAppConfigContent[] = "[General]\n"
38+
"clientVersion=5.3.2.15463\n"
39+
"issuesWidgetFilter=FatalError, BlacklistedError, Excluded, Message, FilenameReserved\n"
40+
"logHttp=false\n"
41+
"optionalDesktopNotifications=true\n"
42+
"\n"
43+
"[Accounts]e\n"
44+
"0\\Folders\\2ba4b09a-1223-aaaa-abcd-c2df238816d8\\davUrl=@Variant(http://oc.de/remote.php/dav/files/admin/)\n"
45+
"0\\Folders\\2ba4b09a-1223-aaaa-abcd-c2df238816d8\\deployed=false\n"
46+
"0\\Folders\\2ba4b09a-1223-aaaa-abcd-c2df238816d8\\displayString=ownCloud\n"
47+
"0\\Folders\2ba4b09a-1223-aaaa-abcd-c2df238816d8\\ignoreHiddenFiles=true\n"
48+
"0\\Folders\2ba4b09a-1223-aaaa-abcd-c2df238816d8\\journalPath=.sync_journal.db\n"
49+
"0\\Folders\2ba4b09a-1223-aaaa-abcd-c2df238816d8\\localPath=/ownCloud/\n"
50+
"0\\Folders\2ba4b09a-1223-aaaa-abcd-c2df238816d8\\paused=false\n"
51+
"0\\Folders\\2ba4b09a-1223-aaaa-abcd-c2df238816d8\\priority=0\n"
52+
"0\\Folders\\2ba4b09a-1223-aaaa-abcd-c2df238816d8\\targetPath=/\n"
53+
"0\\Folders\\2ba4b09a-1223-aaaa-abcd-c2df238816d8\\version=13\n"
54+
"0\\Folders\\2ba4b09a-1223-aaaa-abcd-c2df238816d8\\virtualFilesMode=off\n"
55+
"0\\capabilities=@QVariant()\n"
56+
"0\\dav_user=admin\n"
57+
"0\\default_sync_root=/ownCloud\n"
58+
"0\\display-name=admin\n"
59+
"0\\http_CredentialVersion=1\n"
60+
"0\\http_oauth=false\n"
61+
"0\\http_user=admin\n"
62+
"0\\supportsSpaces=true\n"
63+
"0\\url=http://oc.de/\n"
64+
"0\\user=admin\n"
65+
"0\\userExplicitlySignedOut=false\n"
66+
"0\\uuid=@Variant()\n"
67+
"0\\version=13\n"
68+
"version=13\n"
69+
"\n"
70+
"[Credentials]\n"
71+
"ownCloud_credentials%oc.de%2ba4b09a-1223-aaaa-abcd-c2df238816d8\\http\\password=true";
72+
73+
private slots:
74+
void setupStandardConfigFolder()
75+
{
76+
QVERIFY(QDir(_temporaryDir.path()).mkpath(standardAppName));
77+
const auto standardConfigFolder = QString(_temporaryDir.path() + "/" + standardAppName);
78+
_configFile.setConfDir(standardConfigFolder);
79+
}
80+
81+
void setupStandarConfig(const QString &version)
82+
{
83+
setupStandardConfigFolder();
84+
QSettings settings(_configFile.configFile(), QSettings::IniFormat);
85+
_configFile.setClientVersionString(version);
86+
_configFile.setOptionalServerNotifications(true);
87+
_configFile.setShowChatNotifications(true);
88+
_configFile.setShowCallNotifications(true);
89+
_configFile.setShowInExplorerNavigationPane(true);
90+
_configFile.setShowInExplorerNavigationPane(true);
91+
_configFile.setRemotePollInterval(std::chrono::milliseconds(1000));
92+
_configFile.setAutoUpdateCheck(true, QString());
93+
_configFile.setUpdateChannel("beta");
94+
_configFile.setOverrideServerUrl("http://example.de");
95+
_configFile.setOverrideLocalDir("A");
96+
_configFile.setVfsEnabled(true);
97+
_configFile.setProxyType(0);
98+
_configFile.setVfsEnabled(true);
99+
_configFile.setUseUploadLimit(0);
100+
_configFile.setUploadLimit(1);
101+
_configFile.setUseDownloadLimit(0);
102+
_configFile.setUseDownloadLimit(1);
103+
_configFile.setNewBigFolderSizeLimit(true, 500);
104+
_configFile.setNotifyExistingFoldersOverLimit(true);
105+
_configFile.setStopSyncingExistingFoldersOverLimit(true);
106+
_configFile.setConfirmExternalStorage(true);
107+
_configFile.setMoveToTrash(true);
108+
_configFile.setForceLoginV2(true);
109+
_configFile.setPromptDeleteFiles(true);
110+
_configFile.setDeleteFilesThreshold(1);
111+
_configFile.setMonoIcons(true);
112+
_configFile.setCrashReporter(true);
113+
_configFile.setAutomaticLogDir(true);
114+
_configFile.setLogDir(_temporaryDir.path());
115+
_configFile.setLogDebug(true);
116+
_configFile.setLogExpire(72);
117+
_configFile.setLogFlush(true);
118+
_configFile.setCertificatePath(_temporaryDir.path());
119+
_configFile.setCertificatePasswd("123456");
120+
_configFile.setLaunchOnSystemStartup(true);
121+
_configFile.setServerHasValidSubscription(true);
122+
_configFile.setDesktopEnterpriseChannel("stable");
123+
_configFile.setLanguage("pt");
124+
settings.sync();
125+
QVERIFY(_configFile.exists());
126+
QScopedPointer<FakeQNAM> fakeQnam(new FakeQNAM({}));
127+
OCC::AccountPtr account = OCC::Account::create();
128+
account->setDavUser("user");
129+
account->setDavDisplayName("Nextcloud user");
130+
account->setProxyType(QNetworkProxy::ProxyType::HttpProxy);
131+
account->setProxyUser("proxyuser");
132+
account->setDownloadLimit(120);
133+
account->setUploadLimit(120);
134+
account->setDownloadLimitSetting(OCC::Account::AccountNetworkTransferLimitSetting::ManualLimit);
135+
account->setServerVersion("30");
136+
account->setCredentials(new FakeCredentials{fakeQnam.data()});
137+
account->setUrl(QUrl(("http://example.de")));
138+
const auto accountState = OCC::AccountManager::instance()->addAccount(account);
139+
OCC::AccountManager::instance()->saveAccount(accountState->account());
140+
OCC::FolderDefinition folderDefinition;
141+
folderDefinition.localPath = "/standardAppName";
142+
folderDefinition.targetPath = "/";
143+
folderDefinition.alias = standardAppName;
144+
_folderMan.reset({});
145+
_folderMan.reset(new FolderMan{});
146+
QVERIFY(_folderMan->addFolder(accountState, folderDefinition));
147+
}
148+
149+
150+
void initTestCase()
151+
{
152+
OCC::Logger::instance()->setLogFlush(true);
153+
OCC::Logger::instance()->setLogDebug(true);
154+
155+
QStandardPaths::setTestModeEnabled(true);
156+
}
157+
158+
// Upgrade - TODO: test running app with --confdir
159+
void testUpgrade()
160+
{
161+
// create Nextcloud config with older version
162+
setupStandarConfig("1.0.0");
163+
const auto oldAppVersionNumber = QVersionNumber::fromString(_configFile.clientVersionString());
164+
QVERIFY(_configFile.isUpgrade());
165+
166+
// backup old config
167+
const auto backupFilesList = _configFile.backupConfigFiles();
168+
QCOMPARE_GE(backupFilesList.size(), 1);
169+
170+
// successfully upgrade to new config
171+
const auto afterUpgradeVersionNumber = MIRALL_VERSION_STRING;
172+
_configFile.setClientVersionString(afterUpgradeVersionNumber);
173+
QVERIFY(MIRALL_VERSION_STRING == _configFile.clientVersionString());
174+
175+
QCOMPARE_GE(AccountManager::instance()->accounts().size(), 1);
176+
auto accounts = AccountManager::instance()->accounts().first()->settings();
177+
QCOMPARE_GE(accounts->childGroups().size(), 1);
178+
accounts->beginGroup(QLatin1String("Folders"));
179+
QCOMPARE_GE(accounts->childGroups().size(), 1);
180+
accounts->endGroup();
181+
}
182+
183+
// From oC client to Nextcloud
184+
void testMigrationFromOctoNextcloud()
185+
{
186+
QTemporaryDir tempDir;
187+
QVERIFY(QDir(tempDir.path()).mkpath(legacyAppName));
188+
const auto ocConfigFolder = QString(tempDir.path() + "/" + legacyAppName);
189+
const auto ocConfig = QString(ocConfigFolder + "/" + QString(legacyAppName).toLower() + ".cfg");
190+
QFile ocConfigFile(ocConfig);
191+
QVERIFY(ocConfigFile.open(QFile::WriteOnly));
192+
QCOMPARE_GE(ocConfigFile.write(legacyAppConfigContent, qstrlen(legacyAppConfigContent)), 0);
193+
ocConfigFile.close();
194+
195+
ConfigFile configFile;
196+
QVERIFY(QDir(tempDir.path()).mkpath(standardAppName));
197+
const auto standardConfigFolder = QString(tempDir.path() + "/" + standardAppName);
198+
configFile.setConfDir(standardConfigFolder);
199+
200+
// Nextcloud config file does not exist
201+
QVERIFY(!configFile.exists());
202+
203+
// owncloud config files exists
204+
configFile.findLegacyClientConfigFile();
205+
QVERIFY(!configFile.discoveredLegacyConfigFile().isEmpty());
206+
207+
// _folderMan.reset({});
208+
// _folderMan.reset(new FolderMan{});
209+
210+
// create accounts and folders from a legacy desktop client or for a new config file
211+
// QVERIFY(AccountManager::instance()->restore(configFile.configFileToRestore()) != AccountManager::AccountsRestoreFailure);
212+
// QCOMPARE_GE(FolderMan::instance()->setupFoldersMigration(), 1);
213+
// QVERIFY(configFile.configFile().contains("nextcloud"));
214+
// QCOMPARE_GE(AccountManager::instance()->accounts().size(), 1);
215+
216+
// auto accounts = AccountManager::instance()->accounts().first()->settings();
217+
// QCOMPARE_GE(accounts->childGroups().size(), 1);
218+
// accounts->beginGroup(QLatin1String("Folders"));
219+
// QCOMPARE_GE(accounts->childGroups().size(), 1);
220+
// accounts->endGroup();
221+
}
222+
223+
224+
// From the standard Nextcloud client to a branded version
225+
void testMigrationFromNextcloudToBranded()
226+
{
227+
setupStandardConfigFolder();
228+
229+
QTemporaryDir tempDir;
230+
QVERIFY(QDir(tempDir.path()).mkpath(brandedAppName));
231+
const auto brandedConfigFolder = QString(tempDir.path() + "/" + brandedAppName);
232+
const auto brandedConfig = QString(brandedConfigFolder + "/" + QString(brandedAppName).toLower() + ".cfg");
233+
234+
QFile::copy(_configFile.configFile(), QFileInfo(brandedConfig).filePath());
235+
236+
ConfigFile configFile;
237+
QVERIFY(QDir(tempDir.path()).mkpath(standardAppName));
238+
const auto standardConfigFolder = QString(tempDir.path() + "/" + standardAppName);
239+
configFile.setConfDir(standardConfigFolder);
240+
241+
// Nextcloud config file does not exist
242+
QVERIFY(!configFile.exists());
243+
244+
// owncloud config files exists
245+
configFile.findLegacyClientConfigFile();
246+
QVERIFY(!configFile.discoveredLegacyConfigFile().isEmpty());
247+
248+
// _folderMan.reset({});
249+
// _folderMan.reset(new FolderMan{});
250+
251+
// create accounts and folders from a legacy desktop client or for a new config file
252+
// QVERIFY(AccountManager::instance()->restore(configFile.configFileToRestore()) != AccountManager::AccountsRestoreFailure);
253+
// QCOMPARE_GE(FolderMan::instance()->setupFoldersMigration(), 1);
254+
// QVERIFY(configFile.configFile().contains("nextcloud"));
255+
// QCOMPARE_GE(AccountManager::instance()->accounts().size(), 1);
256+
257+
// auto accounts = AccountManager::instance()->accounts().first()->settings();
258+
// QCOMPARE_GE(accounts->childGroups().size(), 1);
259+
// accounts->beginGroup(QLatin1String("Folders"));
260+
// QCOMPARE_GE(accounts->childGroups().size(), 1);
261+
// accounts->endGroup();
262+
}
263+
264+
// TODO: Downgrade
265+
};
266+
267+
QTEST_GUILESS_MAIN(TestMigration)
268+
#include "testmigration.moc"

0 commit comments

Comments
 (0)