function runTest(config) {
    var expectedInitData = [];
    expectedInitData.push(stringToUint8Array(atob(config.keys[0].initData)));
    expectedInitData.push(stringToUint8Array(atob(config.keys[1].initData)));

    // Will get 2 identical events, one for audio, one for video.
    var expectedEvents = 2;
    var currentData;

    async_test(function (test) {
        var video = config.video,
            mediaSource,
            onEncrypted = function (event) {
                currentData = new Uint8Array(event.initData);
                assert_equals(event.target, config.video);
                assert_true(event instanceof window.MediaEncryptedEvent);
                assert_equals(event.type, 'encrypted');
                assert_equals(event.initDataType, 'cenc');
                // At this point we do not know if the event is related to audio or video. So check for both expected init data
                assert_true(checkInitData(currentData, expectedInitData[0]) || checkInitData(currentData, expectedInitData[1]));

                if (--expectedEvents === 0) {
                    test.done();
                }
            };

        waitForEventAndRunStep('encrypted', video, onEncrypted, test);
        return testmediasource(config).then(function (source) {
            mediaSource = source;
            config.video.src = URL.createObjectURL(mediaSource);
            return source.done;
        }).then(function(){
            video.play();
        });
    }, 'encrypted fired on encrypted media file.');
}

function checkInitData(data, expectedData) {
    if (data.length !== expectedData.length) {
        return false;
    }
    for (var i = 0; i < data.length; i++) {
        if (data[i] !== expectedData[i]) {
            return false;
        }
    }
    return true;
}
