<!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) => {
        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>
