<!doctype html>
<meta charset=utf-8>
<title>RTCPeerConnection.prototype.setRemoteDescription - replaceTrack</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-helper.js"></script>
<script>
  'use strict';

  // The following helper functions are called from RTCPeerConnection-helper.js:
  //   getUserMediaTracksAndStreams

  async_test(t => {
    const caller = new RTCPeerConnection();
    t.add_cleanup(() => caller.close());
    return getUserMediaTracksAndStreams(2)
    .then(t.step_func(([tracks, streams]) => {
      const sender = caller.addTrack(tracks[0], streams[0]);
      return sender.replaceTrack(tracks[1])
      .then(t.step_func(() => {
        assert_equals(sender.track, tracks[1]);
        t.done();
      }));
    }))
    .catch(t.step_func(reason => {
      assert_unreached(reason);
    }));
  }, 'replaceTrack() sets the track attribute to a new track.');

  async_test(t => {
    const caller = new RTCPeerConnection();
    t.add_cleanup(() => caller.close());
    return getUserMediaTracksAndStreams(1)
    .then(t.step_func(([tracks, streams]) => {
      const sender = caller.addTrack(tracks[0], streams[0]);
      return sender.replaceTrack(null)
      .then(t.step_func(() => {
        assert_equals(sender.track, null);
        t.done();
      }));
    }))
    .catch(t.step_func(reason => {
      assert_unreached(reason);
    }));
  }, 'replaceTrack() sets the track attribute to null.');

  async_test(t => {
    const caller = new RTCPeerConnection();
    t.add_cleanup(() => caller.close());
    return getUserMediaTracksAndStreams(2)
    .then(t.step_func(([tracks, streams]) => {
      const sender = caller.addTrack(tracks[0], streams[0]);
      assert_equals(sender.track, tracks[0]);
      sender.replaceTrack(tracks[1]);
      // replaceTrack() is asynchronous, there should be no synchronously
      // observable effects.
      assert_equals(sender.track, tracks[0]);
      t.done();
    }))
    .catch(t.step_func(reason => {
      assert_unreached(reason);
    }));
  }, 'replaceTrack() does not set the track synchronously.');

  async_test(t => {
    const expectedException = 'InvalidStateError';
    const caller = new RTCPeerConnection();
    t.add_cleanup(() => caller.close());
    return getUserMediaTracksAndStreams(2)
    .then(t.step_func(([tracks, streams]) => {
      const sender = caller.addTrack(tracks[0], streams[0]);
      caller.close();
      return sender.replaceTrack(tracks[1])
      .then(t.step_func(() => {
        assert_unreached('Expected replaceTrack() to be rejected with ' +
                         expectedException + ' but the promise was resolved.');
      }),
      t.step_func(e => {
        assert_equals(e.name, expectedException);
        t.done();
      }));
    }))
    .catch(t.step_func(reason => {
      assert_unreached(reason);
    }));
  }, 'replaceTrack() rejects when the peer connection is closed.');

  promise_test(async t => {
    const caller = new RTCPeerConnection();
    t.add_cleanup(() => caller.close());
    const [tracks, streams] = await getUserMediaTracksAndStreams(2);
    const sender = caller.addTrack(tracks[0], streams[0]);
    caller.removeTrack(sender);
    await sender.replaceTrack(tracks[1]);
    assert_equals(sender.track, tracks[1], "Make sure track gets updated");
  }, 'replaceTrack() does not reject when invoked after removeTrack().');


  promise_test(async t => {
    const caller = new RTCPeerConnection();
    t.add_cleanup(() => caller.close());
    const [tracks, streams] = await getUserMediaTracksAndStreams(2);
    const sender = caller.addTrack(tracks[0], streams[0]);
    let p = sender.replaceTrack(tracks[1])
    caller.removeTrack(sender);
    await p;
    assert_equals(sender.track, tracks[1], "Make sure track gets updated");
  }, 'replaceTrack() does not reject after a subsequent removeTrack().');

  // TODO(hbos): Verify that replaceTrack() changes what media is received on
  // the remote end of two connected peer connections. For video tracks, this
  // requires Chromium's video tag to update on receiving frames when running
  // content_shell. https://crbug.com/793808

</script>
