<body>
<video id="localVideo" autoplay playsInline></video>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>

promise_test(async() => {
    if (!window.internals)
       return Promise.reject("Test requires internals API");

    if (!window.internals.supportsAudioSession)
        return;

    internals.settings.setShouldManageAudioSessionCategory(true);

    const defaultCategory = internals.audioSessionCategory();

    let stream = await navigator.mediaDevices.getUserMedia({audio : true});

    localVideo.srcObject = stream;
    await localVideo.play();

    assert_equals(internals.audioSessionCategory(), "PlayAndRecord");

    stream.getAudioTracks()[0].enabled = false;
    await new Promise(resolve => setTimeout(resolve, 10));
    assert_equals(internals.audioSessionCategory(), "PlayAndRecord");

    const audioTrack = stream.getAudioTracks()[0];
    stream.removeTrack(audioTrack);
    await new Promise(resolve => setTimeout(resolve, 10));
    assert_equals(internals.audioSessionCategory(), "PlayAndRecord");

    audioTrack.stop();
    const maxTries = 100;
    let counter = 0;
    while (++counter < maxTries) {
        if (internals.audioSessionCategory() != "PlayAndRecord")
            break;
        await new Promise(resolve => setTimeout(resolve, 10));
    }
    assert_less_than(counter, maxTries);
    assert_equals(internals.audioSessionCategory(), defaultCategory);
}, "Check audio session state in case of disabled and stopped audio tracks");
</script>
</body>
