function runTest(config, qualifier)
{
    var testname = testnamePrefix(qualifier, config.keysystem) + ' test MediaKeySession closed event.';

    var configuration = {
        initDataTypes: [config.initDataType],
        audioCapabilities: [{
            contentType: config.audioType
        }],
        videoCapabilities: [{
            contentType: config.videoType
        }],
        sessionTypes: ['temporary']
    };

    promise_test(function (test) {
        var initDataType;
        var initData;
        var mediaKeySession;

        return navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function (access) {
            initDataType = access.getConfiguration().initDataTypes[0];
            return access.createMediaKeys();
        }).then(function (mediaKeys) {
            mediaKeySession = mediaKeys.createSession();
            if(config.initData) {
                initData = config.initData;
            } else {
                initData = stringToUint8Array(atob(config.content.keys[0].initData));
            }
            return mediaKeySession.generateRequest(initDataType, initData);
        }).then(function() {
            // close() should result in the closed promise being
            // fulfilled.
            return mediaKeySession.close();
        }).then(function (result) {
            assert_equals(result, undefined);
            // Wait for the session to be closed.
            return mediaKeySession.closed;
        }).then(function (result) {
            assert_equals(result, undefined);
            // Now that the session is closed, verify that the
            // closed attribute immediately returns a fulfilled
            // promise.
            return mediaKeySession.closed;
        }).then(function (result) {
            assert_equals(result, undefined);
        }).catch(function(error) {
            assert_unreached('Error: ' + error.name);
        });
    }, testname);
}