<!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_equals(stream.getTracks()[0].getSettings().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');
</script>
