|
504 | 504 |
|
505 | 505 | assert_equals(sender.transport.iceTransport.getRemoteCandidates().length, 0); |
506 | 506 | }, 'RTCIceTransport does not expose remote peer-reflexive candidates.'); |
| 507 | + |
| 508 | + promise_test(async t => { |
| 509 | + const pc1 = new RTCPeerConnection(); |
| 510 | + t.add_cleanup(() => pc1.close()); |
| 511 | + const pc2 = new RTCPeerConnection(); |
| 512 | + t.add_cleanup(() => pc2.close()); |
| 513 | + const {sender} = pc1.addTransceiver('audio'); |
| 514 | + |
| 515 | + await pc1.setLocalDescription(); |
| 516 | + const {iceTransport: iceTransport1} = sender.transport; |
| 517 | + assert_equals(iceTransport1.role, 'unknown', 'offerer role should be unknown after setLocalDescription'); |
| 518 | + |
| 519 | + await pc2.setRemoteDescription(pc1.localDescription); |
| 520 | + await pc2.setLocalDescription(); |
| 521 | + const {iceTransport: iceTransport2} = pc2.getTransceivers()[0].sender.transport; |
| 522 | + assert_equals(iceTransport2.role, 'controlled', 'answerer role should be controlled after setLocalDescription(answer)'); |
| 523 | + assert_equals(iceTransport1.role, 'unknown', 'offerer role should still be unknown before setRemoteDescription(answer)'); |
| 524 | + |
| 525 | + await pc1.setRemoteDescription(pc2.localDescription); |
| 526 | + assert_equals(iceTransport1.role, 'controlling', 'offerer role should be controlling after setRemoteDescription(answer)'); |
| 527 | + }, 'RTCIceTransport.role should be "unknown" before the answer is applied'); |
| 528 | + |
| 529 | + promise_test(async t => { |
| 530 | + const pc1 = new RTCPeerConnection(); |
| 531 | + t.add_cleanup(() => pc1.close()); |
| 532 | + const pc2 = new RTCPeerConnection(); |
| 533 | + t.add_cleanup(() => pc2.close()); |
| 534 | + const {sender} = pc1.addTransceiver('audio'); |
| 535 | + |
| 536 | + await pc1.setLocalDescription(); |
| 537 | + const {iceTransport: iceTransport1} = sender.transport; |
| 538 | + await pc2.setRemoteDescription(pc1.localDescription); |
| 539 | + await pc2.setLocalDescription(); |
| 540 | + const {iceTransport: iceTransport2} = pc2.getTransceivers()[0].sender.transport; |
| 541 | + await pc1.setRemoteDescription(pc2.localDescription); |
| 542 | + |
| 543 | + assert_equals(iceTransport1.role, 'controlling'); |
| 544 | + assert_equals(iceTransport2.role, 'controlled'); |
| 545 | + |
| 546 | + // ICE restart initiated by the answerer; pc2 becomes the new offerer |
| 547 | + pc2.restartIce(); |
| 548 | + await pc2.setLocalDescription(); |
| 549 | + await pc1.setRemoteDescription(pc2.localDescription); |
| 550 | + await pc1.setLocalDescription(); |
| 551 | + await pc2.setRemoteDescription(pc1.localDescription); |
| 552 | + |
| 553 | + assert_equals(iceTransport1.role, 'controlling', 'offerer role should not change after answerer-initiated ICE restart'); |
| 554 | + assert_equals(iceTransport2.role, 'controlled', 'answerer role should not change after answerer-initiated ICE restart'); |
| 555 | + }, 'RTCIceTransport.role should not change when the answerer initiates an ICE restart'); |
507 | 556 | } |
508 | 557 |
|
509 | 558 | </script> |
0 commit comments