function checkRegistration(registration, expected, name)
{
    if (registration === expected) {
        log("PASS: " + name + " is as expected");
        return;
    }
    if (registration === null) {
        log("FAIL: " + name + " is null");
        return;
    }

    if (expected === null) {
        log("FAIL: " + name + " is not null");
        return;
    }
    log("FAIL: " + name + " is not as expected. Its scope is " + registration.scope + " expected scope is " + expected.scope);
}

async function test()
{
    try {
        log("Registering service worker 0");
        var newRegistration0 = await navigator.serviceWorker.register("resources/service-worker-getRegistration-worker.js", { scope: "/workers/service/resources/test1" });
        log("Service worker 0 registered with scope " + newRegistration0.scope);

        var registration0 = await navigator.serviceWorker.getRegistration();
        checkRegistration(registration0, undefined, "registration0");

        var registration1 = await navigator.serviceWorker.getRegistration("/workers/service/resources/test1");
        checkRegistration(registration1, newRegistration0, "registration1");

        var registration2 = await navigator.serviceWorker.getRegistration("/workers/service/resources/test");
        checkRegistration(registration2, undefined, "registration2");

        var registration3 = await navigator.serviceWorker.getRegistration("/workers/service/resources/test1/test2/test3");
        checkRegistration(registration3, newRegistration0, "registration3");

        log("Registering service worker 1");
        var newRegistration1 = await navigator.serviceWorker.register("resources/service-worker-getRegistration-worker.js", { scope: "/workers/service/resources/test1/test2" });
        log("Service worker 1 registered with scope " + newRegistration1.scope);

        log("Registering service worker 2");
        var newRegistration2 = await navigator.serviceWorker.register("resources/service-worker-getRegistration-worker.js", { scope: "/workers/service/resources/" });
        log("Service worker 2 registered with scope " + newRegistration2.scope);

        var registration4 = await navigator.serviceWorker.getRegistration("/workers/service/resources/test1/test2");
        checkRegistration(registration4, newRegistration1, "registration4");

        var registration5 = await navigator.serviceWorker.getRegistration("/workers/service/resources/test1/test2-test3");
        checkRegistration(registration5, newRegistration1, "registration5");

        var registration6 = await navigator.serviceWorker.getRegistration("/workers/service/resources/");
        checkRegistration(registration6, newRegistration2, "registration6");

        var registration7 = await navigator.serviceWorker.getRegistration("/workers/service/resources/");
        checkRegistration(registration7, newRegistration2, "registration7");

        var registration8 = await navigator.serviceWorker.getRegistration("/workers/service/resources/foo");
        checkRegistration(registration8, newRegistration2, "registration8");

        await newRegistration1.unregister();
        var registration9 = await navigator.serviceWorker.getRegistration("/workers/service/resources/test1/test2");
        checkRegistration(registration9, newRegistration0, "registration9");
    } catch(e) {
        log("Got exception: " + e);
    }
    finishSWTest();
}

test();
