10#include <QtXml/QDomDocument>
16void UrlResolverTest::initTestCase()
23#warning "TARGET_ARCH not defined"
24#warning "In-tree tests will fail without using run-tests script"
26 rndRepos[
"nemo"] = QString(
"https://packages.example.com/nemo/latest/platform/%1/").arg(arch);
27 rndRepos[
"mer-core"] = QString(
"https://packages.example.com/mer/latest/builds/%1/packages/").arg(arch);
31 releaseRepos[
"nemo"] = QString(
"https://packages.example.com/releases/1.2.3/nemo/platform/%1/").arg(arch);
32 releaseRepos[
"mer-core"] = QString(
"https://packages.example.com/1.2.3/mer/%1/packages/").arg(arch);
33 releaseRepos[
"jolla"] = QString(
"https://packages.example.com/releases/1.2.3/jolla/%1/").arg(arch);
34 releaseRepos[
"major"] = QString(
"https://packages.example.com/releases/1/major/%1/").arg(arch);
35 releaseRepos[
"minor"] = QString(
"https://packages.example.com/releases/2/minor/%1/").arg(arch);
36 releaseRepos[
"majmin"] = QString(
"https://packages.example.com/releases/1.2/majmin/%1/").arg(arch);
39void UrlResolverTest::cleanupTestCase()
44void UrlResolverTest::checkFlavour()
46 ssu.setFlavour(
"testing");
47 QCOMPARE(ssu.flavour(), QString(
"testing"));
48 ssu.setFlavour(
"release");
49 QCOMPARE(ssu.flavour(), QString(
"release"));
51 QCOMPARE(ssu2.
flavour(), QString(
"release"));
55void UrlResolverTest::checkRelease()
57 ssu.setRelease(
"0.1");
58 QCOMPARE(ssu.release(), QString(
"0.1"));
59 ssu.setRelease(
"0.2",
true);
60 QCOMPARE(ssu.release(), QString(
"0.1"));
61 QCOMPARE(ssu.release(
true), QString(
"0.2"));
63 QCOMPARE(ssu2.
release(), QString(
"0.1"));
64 QCOMPARE(ssu2.
release(
true), QString(
"0.2"));
65 ssu.setRelease(
"latest",
true);
68void UrlResolverTest::checkDomain()
70 QString credentialsUrl;
75 credentialsUrl = ssu.repoUrl(
"credentials-url");
76 QCOMPARE(credentialsUrl, QString(
"https://ssu.testing.com/ssu/device/%1/credentials.xml"));
79 ssu.setDomain(
"nevermind");
80 credentialsUrl = ssu.repoUrl(
"credentials-url");
81 QCOMPARE(credentialsUrl, QString(
"https://ssu.testing.com/ssu/device/%1/credentials.xml"));
83 ssu.setDomain(
"example");
84 QCOMPARE(ssu.domain(), QString(
"example"));
85 credentialsUrl = ssu.repoUrl(
"credentials-url");
86 QCOMPARE(credentialsUrl, QString(
"https://ssu.example.com/ssu/device/%1/credentials.xml"));
87 registerUrl = ssu.repoUrl(
"register-url");
88 QCOMPARE(registerUrl, QString(
"https://ssu.example.com/ssu/device/%1/register.xml"));
91void UrlResolverTest::checkCleanUrl()
93 QHashIterator<QString, QString> i(rndRepos);
96 QString url = ssu.repoUrl(i.key(),
true);
97 QVERIFY(!url.contains(
"%("));
102void UrlResolverTest::simpleRepoUrlLookup()
104 QHashIterator<QString, QString> i(rndRepos);
105 while (i.hasNext()) {
108 url = ssu.repoUrl(i.key(),
true);
109 QCOMPARE(url, i.value());
110 url = ssu.repoUrl(i.key(),
false);
111 QVERIFY(url.compare(i.value()) != 0);
119void UrlResolverTest::checkReleaseRepoUrls()
121 ssu.setRelease(
"1.2.3");
122 QHashIterator<QString, QString> i(releaseRepos);
123 while (i.hasNext()) {
126 url = ssu.repoUrl(i.key(),
false);
127 QCOMPARE(url, i.value());
128 url = ssu.repoUrl(i.key());
129 QCOMPARE(url, i.value());
133void UrlResolverTest::checkRegisterDevice()
135 QDomDocument doc(
"foo");
137 QDomElement root = doc.createElement(
"foo");
138 doc.appendChild(root);
140 QDomElement certificate = doc.createElement(
"certificate");
141 root.appendChild(certificate);
143 QVERIFY2(!ssu.registerDevice(&doc),
144 "Ssu::registerDevice() should fail when 'certificate' is empty");
146 QFile certificateFile(QString(
"%1/mycert.crt").arg(LOCATE_DATA_PATH));
147 QVERIFY(certificateFile.open(QIODevice::ReadOnly));
149 certificate.appendChild(doc.createTextNode(certificateFile.readAll()));
151 QDomElement privateKey = doc.createElement(
"privateKey");
152 root.appendChild(privateKey);
154 QVERIFY2(!ssu.registerDevice(&doc),
155 "Ssu::registerDevice() should fail when 'privateKey' is empty");
157 QFile privateKeyFile(QString(
"%1/mykey.key").arg(LOCATE_DATA_PATH));
158 QVERIFY(privateKeyFile.open(QIODevice::ReadOnly));
160 privateKey.appendChild(doc.createTextNode(privateKeyFile.readAll()));
162 QDomElement user = doc.createElement(
"user");
163 root.appendChild(user);
164 user.appendChild(doc.createTextNode(
"john.doe"));
166 QSignalSpy registrationStatusChanged_spy(&ssu, SIGNAL(registrationStatusChanged()));
168 QVERIFY(ssu.registerDevice(&doc));
170 QVERIFY(registrationStatusChanged_spy.count() == 1);
171 QVERIFY(ssu.isRegistered());
175 QVERIFY(registrationStatusChanged_spy.count() == 2);
176 QVERIFY(!ssu.isRegistered());
179void UrlResolverTest::checkSetCredentials()
181 QDomDocument doc(
"foo");
183 QDomElement root = doc.createElement(
"foo");
184 doc.appendChild(root);
186 QDomElement credentials1 = doc.createElement(
"credentials");
187 root.appendChild(credentials1);
189 QVERIFY2(!ssu.setCredentials(&doc),
190 "Ssu::setCredentials() should fail when 'scope' is not defined");
192 credentials1.setAttribute(
"scope",
"utscope1");
194 QVERIFY2(!ssu.setCredentials(&doc),
195 "Ssu::setCredentials() should fail when username/password is missing");
197 QDomElement username1 = doc.createElement(
"username");
198 credentials1.appendChild(username1);
199 username1.appendChild(doc.createTextNode(
"john.doe1"));
201 QVERIFY2(!ssu.setCredentials(&doc),
202 "Ssu::setCredentials() should fail when password is missing");
204 QDomElement password1 = doc.createElement(
"password");
205 credentials1.appendChild(password1);
206 password1.appendChild(doc.createTextNode(
"SeCrEt1"));
208 QVERIFY2(ssu.setCredentials(&doc),
209 qPrintable(QString(
"setCredentials() failed: %1").arg(ssu.lastError())));
211 QVERIFY2(ssu.lastCredentialsUpdate() > QDateTime::currentDateTime().addSecs(-5) &&
212 ssu.lastCredentialsUpdate() <= QDateTime::currentDateTime(),
213 "Ssu::lastCredentialsUpdate was not updated");
216 QCOMPARE(ssu.credentials(
"utscope1").first, QString(
"john.doe1"));
217 QCOMPARE(ssu.credentials(
"utscope1").second, QString(
"SeCrEt1"));
220 QDomElement credentials2 = doc.createElement(
"credentials");
221 root.appendChild(credentials2);
222 credentials2.setAttribute(
"scope",
"utscope2");
224 QDomElement username2 = doc.createElement(
"username");
225 credentials2.appendChild(username2);
226 username2.appendChild(doc.createTextNode(
"john.doe2"));
228 QDomElement password2 = doc.createElement(
"password");
229 credentials2.appendChild(password2);
230 password2.appendChild(doc.createTextNode(
"SeCrEt2"));
232 QVERIFY2(ssu.setCredentials(&doc),
233 qPrintable(QString(
"setCredentials() failed: %1").arg(ssu.lastError())));
235 QVERIFY2(ssu.lastCredentialsUpdate() > QDateTime::currentDateTime().addSecs(-5) &&
236 ssu.lastCredentialsUpdate() <= QDateTime::currentDateTime(),
237 "Ssu::lastCredentialsUpdate was not updated");
240 QCOMPARE(ssu.credentials(
"utscope1").first, QString(
"john.doe1"));
241 QCOMPARE(ssu.credentials(
"utscope1").second, QString(
"SeCrEt1"));
244 QCOMPARE(ssu.credentials(
"utscope2").first, QString(
"john.doe2"));
245 QCOMPARE(ssu.credentials(
"utscope2").second, QString(
"SeCrEt2"));
248void UrlResolverTest::checkStoreAuthorizedKeys()
250 QVERIFY(QDir().mkpath(Sandbox::map(QDir::homePath())));
252 QByteArray testData(
"# test data\n");
253 ssu.storeAuthorizedKeys(testData);
255 QFile authorizedKeys(Sandbox::map(QDir::home().filePath(
".ssh/authorized_keys")));
256 QVERIFY(authorizedKeys.open(QIODevice::ReadOnly));
258 QVERIFY(authorizedKeys.readAll().split(
'\n').contains(testData.trimmed()));
260 QByteArray testData2(
"# test data2\n");
261 ssu.storeAuthorizedKeys(testData2);
263 QEXPECT_FAIL(
"",
"Ssu::storeAuthorizedKeys() does not modify existing authorized_keys", Continue);
264 authorizedKeys.seek(0);
265 QVERIFY(authorizedKeys.readAll().split(
'\n').contains(testData2.trimmed()));
267 const QFile::Permissions go_rwx =
268 QFile::ReadGroup | QFile::WriteGroup | QFile::ExeGroup |
269 QFile::ReadOther | QFile::WriteOther | QFile::ExeOther;
270 QVERIFY((QFileInfo(Sandbox::map(QDir::home().filePath(
".ssh"))).permissions() & go_rwx) == 0);
273void UrlResolverTest::checkVerifyResponse()
275 QDomDocument doc(
"foo");
277 QDomElement root = doc.createElement(
"foo");
278 doc.appendChild(root);
280 QDomElement action = doc.createElement(
"action");
281 root.appendChild(action);
282 action.appendChild(doc.createTextNode(
"register"));
284 QDomElement deviceId = doc.createElement(
"deviceId");
285 root.appendChild(deviceId);
286 deviceId.appendChild(doc.createTextNode(
"deadbeef-dead-beef-dead"));
288 QDomElement protocolVersion = doc.createElement(
"protocolVersion");
289 root.appendChild(protocolVersion);
292 protocolVersion.appendChild(protocolVersionText);
294 QVERIFY(ssu.verifyResponse(&doc));
298 QVERIFY2(!ssu.verifyResponse(&doc),
299 "Ssu::verifyResponse() should fail when protocolVersion does not match SSU_PROTOCOL_VERSION");
Q_INVOKABLE QString flavour()
See SsuCoreConfig::flavour.
Q_INVOKABLE QString release(bool rnd=false)
See SsuCoreConfig::release.
#define SSU_PROTOCOL_VERSION
The ssu protocol version used by the ssu client libraries.