gecko/services/sync/tests/unit/test_service_wipeServer.js
2010-08-12 17:03:58 +02:00

195 lines
7.4 KiB
JavaScript

Cu.import("resource://services-sync/util.js");
Cu.import("resource://services-sync/service.js");
Cu.import("resource://services-sync/base_records/crypto.js");
Cu.import("resource://services-sync/base_records/keys.js");
Cu.import("resource://services-sync/resource.js");
function FakeCollection() {
this.deleted = false;
}
FakeCollection.prototype = {
handler: function() {
let self = this;
return function(request, response) {
let body = "";
if (request.method == "DELETE") {
body = JSON.stringify(Date.now() / 1000);
self.deleted = true;
}
response.setStatusLine(request.httpVersion, 200, "OK");
response.bodyOutputStream.write(body, body.length);
};
}
};
function serviceUnavailable(request, response) {
let body = "Service Unavailable";
response.setStatusLine(request.httpVersion, 503, "Service Unavailable");
response.bodyOutputStream.write(body, body.length);
}
function createAndUploadKeypair() {
let keys = PubKeys.createKeypair(ID.get("WeaveCryptoID"),
PubKeys.defaultKeyUri,
PrivKeys.defaultKeyUri);
PubKeys.uploadKeypair(keys);
}
function createAndUploadSymKey(url) {
let symkey = Svc.Crypto.generateRandomKey();
let pubkey = PubKeys.getDefaultKey();
let meta = new CryptoMeta(url);
meta.addUnwrappedKey(pubkey, symkey);
let res = new Resource(meta.uri);
res.put(meta);
CryptoMetas.set(url, meta);
}
function setUpTestFixtures() {
let cryptoService = new FakeCryptoService();
Weave.Service.clusterURL = "http://localhost:8080/";
Weave.Service.username = "johndoe";
Weave.Service.passphrase = "secret";
createAndUploadKeypair();
createAndUploadSymKey("http://localhost:8080/1.0/johndoe/storage/crypto/steam");
createAndUploadSymKey("http://localhost:8080/1.0/johndoe/storage/crypto/petrol");
createAndUploadSymKey("http://localhost:8080/1.0/johndoe/storage/crypto/diesel");
}
function test_withCollectionList_failOnCrypto() {
_("Weave.Service.wipeServer() deletes collections given as argument and aborts if a collection delete fails.");
let steam_coll = new FakeCollection();
let petrol_coll = new FakeCollection();
let diesel_coll = new FakeCollection();
let crypto_steam = new ServerWBO('steam');
let crypto_diesel = new ServerWBO('diesel');
let server = httpd_setup({
"/1.0/johndoe/storage/keys/pubkey": (new ServerWBO('pubkey')).handler(),
"/1.0/johndoe/storage/keys/privkey": (new ServerWBO('privkey')).handler(),
"/1.0/johndoe/storage/steam": steam_coll.handler(),
"/1.0/johndoe/storage/petrol": petrol_coll.handler(),
"/1.0/johndoe/storage/diesel": diesel_coll.handler(),
"/1.0/johndoe/storage/crypto/steam": crypto_steam.handler(),
"/1.0/johndoe/storage/crypto/petrol": serviceUnavailable,
"/1.0/johndoe/storage/crypto/diesel": crypto_diesel.handler()
});
do_test_pending();
try {
setUpTestFixtures();
_("Confirm initial environment.");
do_check_false(steam_coll.deleted);
do_check_false(petrol_coll.deleted);
do_check_false(diesel_coll.deleted);
do_check_true(crypto_steam.payload != undefined);
do_check_true(crypto_diesel.payload != undefined);
do_check_true(CryptoMetas.contains("http://localhost:8080/1.0/johndoe/storage/crypto/steam"));
do_check_true(CryptoMetas.contains("http://localhost:8080/1.0/johndoe/storage/crypto/petrol"));
do_check_true(CryptoMetas.contains("http://localhost:8080/1.0/johndoe/storage/crypto/diesel"));
_("wipeServer() will happily ignore the non-existent collection, delete the 'steam' collection and abort after an receiving an error on the 'petrol' collection's symkey.");
let error;
try {
Weave.Service.wipeServer(["non-existent", "steam", "petrol", "diesel"]);
} catch(ex) {
error = ex;
}
_("wipeServer() threw this exception: " + error);
do_check_true(error != undefined);
_("wipeServer stopped deleting after encountering an error with the 'petrol' collection's symkey, thus only 'steam' and 'petrol' have been deleted.");
do_check_true(steam_coll.deleted);
do_check_true(petrol_coll.deleted);
do_check_false(diesel_coll.deleted);
do_check_true(crypto_steam.payload == undefined);
do_check_true(crypto_diesel.payload != undefined);
do_check_false(CryptoMetas.contains("http://localhost:8080/1.0/johndoe/storage/crypto/steam"));
do_check_false(CryptoMetas.contains("http://localhost:8080/1.0/johndoe/storage/crypto/petrol"));
do_check_true(CryptoMetas.contains("http://localhost:8080/1.0/johndoe/storage/crypto/diesel"));
} finally {
server.stop(do_test_finished);
Svc.Prefs.resetBranch("");
CryptoMetas.clearCache();
}
}
function test_withCollectionList_failOnCollection() {
_("Weave.Service.wipeServer() deletes collections given as argument.");
let steam_coll = new FakeCollection();
let diesel_coll = new FakeCollection();
let crypto_steam = new ServerWBO('steam');
let crypto_petrol = new ServerWBO('petrol');
let crypto_diesel = new ServerWBO('diesel');
let server = httpd_setup({
"/1.0/johndoe/storage/keys/pubkey": (new ServerWBO('pubkey')).handler(),
"/1.0/johndoe/storage/keys/privkey": (new ServerWBO('privkey')).handler(),
"/1.0/johndoe/storage/steam": steam_coll.handler(),
"/1.0/johndoe/storage/petrol": serviceUnavailable,
"/1.0/johndoe/storage/diesel": diesel_coll.handler(),
"/1.0/johndoe/storage/crypto/steam": crypto_steam.handler(),
"/1.0/johndoe/storage/crypto/petrol": crypto_petrol.handler(),
"/1.0/johndoe/storage/crypto/diesel": crypto_diesel.handler()
});
do_test_pending();
try {
setUpTestFixtures();
_("Confirm initial environment.");
do_check_false(steam_coll.deleted);
do_check_false(diesel_coll.deleted);
do_check_true(crypto_steam.payload != undefined);
do_check_true(crypto_petrol.payload != undefined);
do_check_true(crypto_diesel.payload != undefined);
do_check_true(CryptoMetas.contains("http://localhost:8080/1.0/johndoe/storage/crypto/steam"));
do_check_true(CryptoMetas.contains("http://localhost:8080/1.0/johndoe/storage/crypto/petrol"));
do_check_true(CryptoMetas.contains("http://localhost:8080/1.0/johndoe/storage/crypto/diesel"));
_("wipeServer() will happily ignore the non-existent collection, delete the 'steam' collection and abort after an receiving an error on the 'petrol' collection.");
let error;
try {
Weave.Service.wipeServer(["non-existent", "steam", "petrol", "diesel"]);
} catch(ex) {
error = ex;
}
_("wipeServer() threw this exception: " + error);
do_check_true(error != undefined);
_("wipeServer stopped deleting after encountering an error with the 'petrol' collection, thus only 'steam' has been deleted.");
do_check_true(steam_coll.deleted);
do_check_false(diesel_coll.deleted);
do_check_true(crypto_steam.payload == undefined);
do_check_true(crypto_petrol.payload != undefined);
do_check_true(crypto_diesel.payload != undefined);
do_check_false(CryptoMetas.contains("http://localhost:8080/1.0/johndoe/storage/crypto/steam"));
do_check_true(CryptoMetas.contains("http://localhost:8080/1.0/johndoe/storage/crypto/petrol"));
do_check_true(CryptoMetas.contains("http://localhost:8080/1.0/johndoe/storage/crypto/diesel"));
} finally {
server.stop(do_test_finished);
Svc.Prefs.resetBranch("");
CryptoMetas.clearCache();
}
}
function run_test() {
test_withCollectionList_failOnCollection();
test_withCollectionList_failOnCrypto();
}