10 #include <QtXml/QDomDocument>
16 void 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/0.1/nemo/platform/%1/").arg(arch);
32 releaseRepos[
"mer-core"] = QString(
"https://packages.example.com/0.1/mer/%1/packages/").arg(arch);
33 releaseRepos[
"jolla"] = QString(
"https://packages.example.com/releases/0.1/jolla/%1/").arg(arch);
36 void UrlResolverTest::cleanupTestCase()
41 void UrlResolverTest::checkFlavour()
44 QCOMPARE(ssu.
flavour(), QString(
"testing"));
46 QCOMPARE(ssu.
flavour(), QString(
"release"));
48 QCOMPARE(ssu2.
flavour(), QString(
"release"));
52 void UrlResolverTest::checkRelease()
55 QCOMPARE(ssu.
release(), QString(
"0.1"));
57 QCOMPARE(ssu.
release(), QString(
"0.1"));
58 QCOMPARE(ssu.
release(
true), QString(
"0.2"));
60 QCOMPARE(ssu2.
release(), QString(
"0.1"));
61 QCOMPARE(ssu2.
release(
true), QString(
"0.2"));
65 void UrlResolverTest::checkDomain()
67 QString credentialsUrl;
72 credentialsUrl = ssu.
repoUrl(
"credentials-url");
73 QCOMPARE(credentialsUrl, QString(
"https://ssu.testing.com/ssu/device/%1/credentials.xml"));
77 credentialsUrl = ssu.
repoUrl(
"credentials-url");
78 QCOMPARE(credentialsUrl, QString(
"https://ssu.testing.com/ssu/device/%1/credentials.xml"));
81 QCOMPARE(ssu.domain(), QString(
"example"));
82 credentialsUrl = ssu.
repoUrl(
"credentials-url");
83 QCOMPARE(credentialsUrl, QString(
"https://ssu.example.com/ssu/device/%1/credentials.xml"));
84 registerUrl = ssu.
repoUrl(
"register-url");
85 QCOMPARE(registerUrl, QString(
"https://ssu.example.com/ssu/device/%1/register.xml"));
88 void UrlResolverTest::checkCleanUrl()
90 QHashIterator<QString, QString> i(rndRepos);
93 QString url = ssu.
repoUrl(i.key(),
true);
94 QVERIFY(!url.contains(
"%("));
99 void UrlResolverTest::simpleRepoUrlLookup()
101 QHashIterator<QString, QString> i(rndRepos);
102 while (i.hasNext()) {
105 url = ssu.
repoUrl(i.key(),
true);
106 QCOMPARE(url, i.value());
107 url = ssu.
repoUrl(i.key(),
false);
108 QVERIFY(url.compare(i.value()) != 0);
116 void UrlResolverTest::checkReleaseRepoUrls()
118 QHashIterator<QString, QString> i(releaseRepos);
119 while (i.hasNext()) {
122 url = ssu.
repoUrl(i.key(),
false);
123 QCOMPARE(url, i.value());
125 QCOMPARE(url, i.value());
129 void UrlResolverTest::checkRegisterDevice()
131 QDomDocument doc(
"foo");
133 QDomElement root = doc.createElement(
"foo");
134 doc.appendChild(root);
136 QDomElement certificate = doc.createElement(
"certificate");
137 root.appendChild(certificate);
139 QVERIFY2(!ssu.registerDevice(&doc),
140 "Ssu::registerDevice() should fail when 'certificate' is empty");
142 QFile certificateFile(QString(
"%1/mycert.crt").arg(LOCATE_DATA_PATH));
143 QVERIFY(certificateFile.open(QIODevice::ReadOnly));
145 certificate.appendChild(doc.createTextNode(certificateFile.readAll()));
147 QDomElement privateKey = doc.createElement(
"privateKey");
148 root.appendChild(privateKey);
150 QVERIFY2(!ssu.registerDevice(&doc),
151 "Ssu::registerDevice() should fail when 'privateKey' is empty");
153 QFile privateKeyFile(QString(
"%1/mykey.key").arg(LOCATE_DATA_PATH));
154 QVERIFY(privateKeyFile.open(QIODevice::ReadOnly));
156 privateKey.appendChild(doc.createTextNode(privateKeyFile.readAll()));
158 QDomElement user = doc.createElement(
"user");
159 root.appendChild(user);
160 user.appendChild(doc.createTextNode(
"john.doe"));
162 QSignalSpy registrationStatusChanged_spy(&ssu, SIGNAL(registrationStatusChanged()));
164 QVERIFY(ssu.registerDevice(&doc));
166 QVERIFY(registrationStatusChanged_spy.count() == 1);
171 QVERIFY(registrationStatusChanged_spy.count() == 2);
175 void UrlResolverTest::checkSetCredentials()
177 QDomDocument doc(
"foo");
179 QDomElement root = doc.createElement(
"foo");
180 doc.appendChild(root);
182 QDomElement credentials1 = doc.createElement(
"credentials");
183 root.appendChild(credentials1);
185 QVERIFY2(!ssu.setCredentials(&doc),
186 "Ssu::setCredentials() should fail when 'scope' is not defined");
188 credentials1.setAttribute(
"scope",
"utscope1");
190 QVERIFY2(!ssu.setCredentials(&doc),
191 "Ssu::setCredentials() should fail when username/password is missing");
193 QDomElement username1 = doc.createElement(
"username");
194 credentials1.appendChild(username1);
195 username1.appendChild(doc.createTextNode(
"john.doe1"));
197 QVERIFY2(!ssu.setCredentials(&doc),
198 "Ssu::setCredentials() should fail when password is missing");
200 QDomElement password1 = doc.createElement(
"password");
201 credentials1.appendChild(password1);
202 password1.appendChild(doc.createTextNode(
"SeCrEt1"));
204 QVERIFY2(ssu.setCredentials(&doc),
205 qPrintable(QString(
"setCredentials() failed: %1").arg(ssu.
lastError())));
209 "Ssu::lastCredentialsUpdate was not updated");
212 QCOMPARE(ssu.
credentials(
"utscope1").first, QString(
"john.doe1"));
213 QCOMPARE(ssu.
credentials(
"utscope1").second, QString(
"SeCrEt1"));
216 QDomElement credentials2 = doc.createElement(
"credentials");
217 root.appendChild(credentials2);
218 credentials2.setAttribute(
"scope",
"utscope2");
220 QDomElement username2 = doc.createElement(
"username");
221 credentials2.appendChild(username2);
222 username2.appendChild(doc.createTextNode(
"john.doe2"));
224 QDomElement password2 = doc.createElement(
"password");
225 credentials2.appendChild(password2);
226 password2.appendChild(doc.createTextNode(
"SeCrEt2"));
228 QVERIFY2(ssu.setCredentials(&doc),
229 qPrintable(QString(
"setCredentials() failed: %1").arg(ssu.
lastError())));
233 "Ssu::lastCredentialsUpdate was not updated");
236 QCOMPARE(ssu.
credentials(
"utscope1").first, QString(
"john.doe1"));
237 QCOMPARE(ssu.
credentials(
"utscope1").second, QString(
"SeCrEt1"));
240 QCOMPARE(ssu.
credentials(
"utscope2").first, QString(
"john.doe2"));
241 QCOMPARE(ssu.
credentials(
"utscope2").second, QString(
"SeCrEt2"));
244 void UrlResolverTest::checkStoreAuthorizedKeys()
246 QVERIFY(QDir().mkpath(Sandbox::map(QDir::homePath())));
248 QByteArray testData(
"# test data\n");
249 ssu.storeAuthorizedKeys(testData);
251 QFile authorizedKeys(Sandbox::map(QDir::home().filePath(
".ssh/authorized_keys")));
252 QVERIFY(authorizedKeys.open(QIODevice::ReadOnly));
254 QVERIFY(authorizedKeys.readAll().split(
'\n').contains(testData.trimmed()));
256 QByteArray testData2(
"# test data2\n");
257 ssu.storeAuthorizedKeys(testData2);
259 QEXPECT_FAIL(
"",
"Ssu::storeAuthorizedKeys() does not modify existing authorized_keys", Continue);
260 authorizedKeys.seek(0);
261 QVERIFY(authorizedKeys.readAll().split(
'\n').contains(testData2.trimmed()));
263 const QFile::Permissions go_rwx =
264 QFile::ReadGroup | QFile::WriteGroup | QFile::ExeGroup |
265 QFile::ReadOther | QFile::WriteOther | QFile::ExeOther;
266 QVERIFY((QFileInfo(Sandbox::map(QDir::home().filePath(
".ssh"))).permissions() & go_rwx) == 0);
269 void UrlResolverTest::checkVerifyResponse()
271 QDomDocument doc(
"foo");
273 QDomElement root = doc.createElement(
"foo");
274 doc.appendChild(root);
276 QDomElement action = doc.createElement(
"action");
277 root.appendChild(action);
278 action.appendChild(doc.createTextNode(
"register"));
280 QDomElement deviceId = doc.createElement(
"deviceId");
281 root.appendChild(deviceId);
282 deviceId.appendChild(doc.createTextNode(
"deadbeef-dead-beef-dead"));
284 QDomElement protocolVersion = doc.createElement(
"protocolVersion");
285 root.appendChild(protocolVersion);
288 protocolVersion.appendChild(protocolVersionText);
290 QVERIFY(ssu.verifyResponse(&doc));
294 QVERIFY2(!ssu.verifyResponse(&doc),
295 "Ssu::verifyResponse() should fail when protocolVersion does not match SSU_PROTOCOL_VERSION");