<!doctype html>
<title>MediaStreamTrack GetSettings</title>
<p class="instructions">When prompted, accept to share your video stream.</p>
<meta name=timeout content=long>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
  'use strict'

  // https://w3c.github.io/mediacapture-main/archives/20170605/getusermedia.html

  async function createTrackAndGetSettings(t, kind) {
    const constraints = {};
    constraints[kind] = true;
    const stream = await navigator.mediaDevices.getUserMedia(constraints);
    assert_equals(stream.getTracks().length, 1);
    t.add_cleanup(() => stream.getTracks()[0].stop());
    return stream.getTracks()[0].getSettings();
  }

  promise_test(async t => {
    const mediaStream1 = await navigator.mediaDevices.getUserMedia({
      video: true,
      audio: false,
    });
    t.add_cleanup(() => mediaStream1.getVideoTracks()[0].stop());
    const settings1 = mediaStream1.getVideoTracks()[0].getSettings();

    const mediaStream2 = await navigator.mediaDevices.getUserMedia({
      video: {
        deviceId: {exact: settings1.deviceId},
      },
      audio: false
    });
    t.add_cleanup(() => mediaStream2.getVideoTracks()[0].stop());
    const settings2 = mediaStream2.getVideoTracks()[0].getSettings();

    assert_equals(settings1.deviceId, settings2.deviceId);
  }, 'A device can be opened twice and have the same device ID');

  promise_test(async t => {
    const mediaStream1 = await navigator.mediaDevices.getUserMedia({
      video: true,
      audio: false,
    });
    t.add_cleanup(() => mediaStream1.getVideoTracks()[0].stop());
    const settings1 = mediaStream1.getVideoTracks()[0].getSettings();

    const mediaStream2 = await navigator.mediaDevices.getUserMedia({
      video: {
        deviceId: {exact: settings1.deviceId},
        width: {
          ideal: settings1.width / 2,
        },
      },
      audio: false
    });
    t.add_cleanup(() => mediaStream2.getVideoTracks()[0].stop());
    const settings2 = mediaStream2.getVideoTracks()[0].getSettings();

    assert_equals(settings1.deviceId, settings2.deviceId);
    assert_between_inclusive(settings2.width, settings1.width / 2, settings1.width);
  }, 'A device can be opened twice with different resolutions requested');

  promise_test(async t => {
    const devices = await navigator.mediaDevices.enumerateDevices();
    const inputDevices = devices.filter(d => d.kind != "audiooutput");
    assert_greater_than(inputDevices.length, 0);
    for (const device of inputDevices) {
      const device_id_constraint = {deviceId: {exact: device.deviceId}};
      const constraints = device.kind == "audioinput"
        ? {audio: device_id_constraint}
        : {video: device_id_constraint};

      const stream = await navigator.mediaDevices.getUserMedia(constraints);
      assert_true(stream.getTracks()[0].getSettings().groupId === device.groupId, "device groupId");
      assert_greater_than(device.groupId.length, 0);
    }
  }, 'groupId is correctly reported by getSettings() for all input devices');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "audio");
    assert_equals(typeof(settings.deviceId), "string",
                  "deviceId should exist and it should be a string.");
  }, 'deviceId is reported by getSettings() for getUserMedia() audio tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "audio");
    assert_equals(typeof(settings.groupId), "string",
                  "groupId should exist and it should be a string.");
  }, 'groupId is reported by getSettings() for getUserMedia() audio tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "audio");
    assert_equals(typeof(settings.sampleRate), "number",
                  "sampleRate should exist and it should be a number.");
    assert_greater_than(settings.sampleRate, 0);
  }, 'sampleRate is reported by getSettings() for getUserMedia() audio tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "audio");
    assert_equals(typeof(settings.sampleSize), "number",
                  "sampleSize should exist and it should be a number.");
    assert_greater_than(settings.sampleSize, 0);
  }, 'sampleSize is reported by getSettings() for getUserMedia() audio tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "audio");
    assert_equals(typeof(settings.echoCancellation), "boolean",
                  "echoCancellation should exist and it should be a boolean.");
  }, 'echoCancellation is reported by getSettings() for getUserMedia() audio tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "audio");
    assert_equals(typeof(settings.autoGainControl), "boolean",
                  "autoGainControl should exist and it should be a boolean.");
  }, 'autoGainControl is reported by getSettings() for getUserMedia() audio tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "audio");
    assert_equals(typeof(settings.noiseSuppression), "boolean",
                  "noiseSuppression should exist and it should be a boolean.");
  }, 'noiseSuppression is reported by getSettings() for getUserMedia() audio tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "audio");
    assert_equals(typeof(settings.latency), "number",
                  "latency should exist and it should be a number.");
    assert_greater_than_equal(settings.latency,0);
  }, 'latency is reported by getSettings() for getUserMedia() audio tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "audio");
    assert_equals(typeof(settings.channelCount), "number",
                  "channelCount should exist and it should be a number.");
    assert_greater_than(settings.channelCount, 0);
  }, 'channelCount is reported by getSettings() for getUserMedia() audio tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "video");
    assert_equals(typeof(settings.deviceId), "string",
                  "deviceId should exist and it should be a string.");
  }, 'deviceId is reported by getSettings() for getUserMedia() video tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "video");
    assert_equals(typeof(settings.groupId), "string",
                  "groupId should exist and it should be a string.");
  }, 'groupId is reported by getSettings() for getUserMedia() video tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "video");
    assert_equals(typeof(settings.width), "number",
                  "width should exist and it should be a number.");
    assert_true(Number.isInteger(settings.width), "width should be an integer.");
    assert_greater_than_equal(settings.width, 0);;
  }, 'width is reported by getSettings() for getUserMedia() video tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "video");
    assert_equals(typeof(settings.height), "number",
                  "height should exist and it should be a number.");
    assert_true(Number.isInteger(settings.height), "height should be an integer.");
    assert_greater_than_equal(settings.height, 0);
  }, 'height is reported by getSettings() for getUserMedia() video tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "video");
    assert_equals(typeof(settings.aspectRatio), "number",
                  "aspectRatio should exist and it should be a number.");
    assert_greater_than_equal(settings.aspectRatio, 0);
  }, 'aspectRatio is reported by getSettings() for getUserMedia() video tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "video");
    assert_equals(typeof(settings.frameRate), "number",
                  "frameRate should exist and it should be a number.");
    assert_greater_than_equal(settings.frameRate, 0);
  }, 'frameRate is reported by getSettings() for getUserMedia() video tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "video");
    // facingMode not treated as mandatory because not all platforms provide
    // this information.
    if (settings.facingMode) {
      assert_equals(typeof(settings.facingMode), "string",
                  "If facingMode is provided it should be a string.");
      assert_in_array(settings.facingMode,
                  ['user', 'environment', 'left', 'right']);
    }
  }, 'facingMode is reported by getSettings() for getUserMedia() video tracks');

  promise_test(async t => {
    const settings = await createTrackAndGetSettings(t, "video");
    assert_equals(typeof(settings.resizeMode), "string",
                "resizeMode should exist and it should be a string.");
    assert_in_array(settings.resizeMode, ['none', 'crop-and-scale']);
  }, 'resizeMode is reported by getSettings() for getUserMedia() video tracks');

  promise_test(async t => {
    const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video : true});
    const audioTrack = stream.getAudioTracks()[0];
    const videoTrack = stream.getVideoTracks()[0];

    const audioDeviceId = audioTrack.getSettings().deviceId;
    const videoDeviceId = videoTrack.getSettings().deviceId;
    const audioGroupId = audioTrack.getSettings().groupId;
    const videoGroupId = videoTrack.getSettings().groupId;

    audioTrack.stop();
    videoTrack.stop();

    assert_equals(audioTrack.getSettings().deviceId, audioDeviceId, "audio track deviceId");
    assert_equals(videoTrack.getSettings().deviceId, videoDeviceId, "video track deviceId");
    assert_equals(audioTrack.getSettings().groupId, audioGroupId, "audio track groupId");
    assert_equals(videoTrack.getSettings().groupId, videoGroupId, "video track groupId");
  }, 'Stopped tracks should expose deviceId/groupId');
</script>
