<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Testing description getters after connection is closed</title>
        <script src="../resources/testharness.js"></script>
        <script src="../resources/testharnessreport.js"></script>
        <script src="routines.js"></script>
    </head>
    <body>
        <script>
function closedConnection()
{
    return new Promise((resolve, reject) => {
        var localConnection = new RTCPeerConnection();
        localConnection.close();
        setTimeout(() => resolve(localConnection), 100);
    });
}

promise_test(() => {
    return closedConnection().then((localConnection) => {
        assert_equals(localConnection.currentLocalDescription, localConnection.localDescription);
        assert_equals(localConnection.pendingLocalDescription, localConnection.localDescription);

        assert_equals(localConnection.currentRemoteDescription, localConnection.remoteDescription);
        assert_equals(localConnection.pendingRemoteDescription, localConnection.remoteDescription);
    });
}, "Ensuring closed connection getters do not crash");

promise_test((test) => {
    return closedConnection().then((connection) => {
        return promise_rejects(test, 'InvalidStateError', connection.createOffer());
    });
}, "Ensuring closed connection createOffer does not crash");

promise_test(() => {
    return closedConnection().then((connection) => {
        assert_throws("InvalidStateError", () => {  connection.createDataChannel("test"); });
    });
}, "Ensuring closed connection createDataChannel does not crash");

promise_test(() => {
    return closedConnection().then((connection) => {
        assert_throws("InvalidStateError", () => { connection.addTransceiver("video"); });
    });
}, "Ensuring closed connection addTransceiver does not crash");

promise_test(() => {
    return closedConnection().then((connection) => {
        return navigator.mediaDevices.getUserMedia({video: true}).then((stream) => {
            assert_throws("InvalidStateError", () => { connection.addTrack(stream.getVideoTracks()[0], stream); });
        });
    });
}, "Ensuring closed connection addTrack does not crash");

promise_test((test) => {
    var connection;
    return closedConnection().then((pc) => {
        connection = pc;
        var pc2 = new RTCPeerConnection();
        pc2.createDataChannel("test");
        return pc2.createOffer();
    }).then((sdp) => {
        return promise_rejects(test, 'InvalidStateError', connection.setRemoteDescription(sdp));
    });
}, "Ensuring closed connection setRemoteDescription does not crash");

promise_test((test) => {
    var localConnection = new RTCPeerConnection();
    return localConnection.createOffer().then((sdp) => {
        localConnection.close();
        return new Promise((resolve, reject) => {
            setTimeout(() => resolve(sdp), 100);
        });
    }).then((sdp) => {
        return promise_rejects(test, 'InvalidStateError', localConnection.setLocalDescription(sdp));
    });
}, "Ensuring closed connection setLocalDescription does not crash");

promise_test((test) => {
    var localConnection = new RTCPeerConnection();
    var remoteConnection = new RTCPeerConnection();
    remoteConnection.createDataChannel("test");
    return remoteConnection.createOffer().then((sdp) => {
        return localConnection.setRemoteDescription(sdp);
    }).then(() => {
        localConnection.close();
    }).then(() => {
        return promise_rejects(test, 'InvalidStateError', localConnection.createAnswer());
    });
}, "Ensuring closed connection createAnswer does not crash");

        </script>
    </body>
</html>
