11cb0ef41Sopenharmony_ci// META: global=window,worker 21cb0ef41Sopenharmony_ci// META: script=../resources/recording-streams.js 31cb0ef41Sopenharmony_ci'use strict'; 41cb0ef41Sopenharmony_ci 51cb0ef41Sopenharmony_ciconst error1 = new Error('error1!'); 61cb0ef41Sopenharmony_cierror1.name = 'error1'; 71cb0ef41Sopenharmony_ci 81cb0ef41Sopenharmony_cipromise_test(() => { 91cb0ef41Sopenharmony_ci 101cb0ef41Sopenharmony_ci const rs = recordingReadableStream(); 111cb0ef41Sopenharmony_ci 121cb0ef41Sopenharmony_ci const ws = recordingWritableStream(); 131cb0ef41Sopenharmony_ci const writer = ws.getWriter(); 141cb0ef41Sopenharmony_ci writer.close(); 151cb0ef41Sopenharmony_ci writer.releaseLock(); 161cb0ef41Sopenharmony_ci 171cb0ef41Sopenharmony_ci return rs.pipeTo(ws).then( 181cb0ef41Sopenharmony_ci () => assert_unreached('the promise must not fulfill'), 191cb0ef41Sopenharmony_ci err => { 201cb0ef41Sopenharmony_ci assert_equals(err.name, 'TypeError', 'the promise must reject with a TypeError'); 211cb0ef41Sopenharmony_ci 221cb0ef41Sopenharmony_ci assert_array_equals(rs.eventsWithoutPulls, ['cancel', err]); 231cb0ef41Sopenharmony_ci assert_array_equals(ws.events, ['close']); 241cb0ef41Sopenharmony_ci 251cb0ef41Sopenharmony_ci return Promise.all([ 261cb0ef41Sopenharmony_ci rs.getReader().closed, 271cb0ef41Sopenharmony_ci ws.getWriter().closed 281cb0ef41Sopenharmony_ci ]); 291cb0ef41Sopenharmony_ci } 301cb0ef41Sopenharmony_ci ); 311cb0ef41Sopenharmony_ci 321cb0ef41Sopenharmony_ci}, 'Closing must be propagated backward: starts closed; preventCancel omitted; fulfilled cancel promise'); 331cb0ef41Sopenharmony_ci 341cb0ef41Sopenharmony_cipromise_test(t => { 351cb0ef41Sopenharmony_ci 361cb0ef41Sopenharmony_ci // Our recording streams do not deal well with errors generated by the system, so give them some help 371cb0ef41Sopenharmony_ci let recordedError; 381cb0ef41Sopenharmony_ci const rs = recordingReadableStream({ 391cb0ef41Sopenharmony_ci cancel(cancelErr) { 401cb0ef41Sopenharmony_ci recordedError = cancelErr; 411cb0ef41Sopenharmony_ci throw error1; 421cb0ef41Sopenharmony_ci } 431cb0ef41Sopenharmony_ci }); 441cb0ef41Sopenharmony_ci 451cb0ef41Sopenharmony_ci const ws = recordingWritableStream(); 461cb0ef41Sopenharmony_ci const writer = ws.getWriter(); 471cb0ef41Sopenharmony_ci writer.close(); 481cb0ef41Sopenharmony_ci writer.releaseLock(); 491cb0ef41Sopenharmony_ci 501cb0ef41Sopenharmony_ci return promise_rejects_exactly(t, error1, rs.pipeTo(ws), 'pipeTo must reject with the same error').then(() => { 511cb0ef41Sopenharmony_ci assert_equals(recordedError.name, 'TypeError', 'the cancel reason must be a TypeError'); 521cb0ef41Sopenharmony_ci 531cb0ef41Sopenharmony_ci assert_array_equals(rs.eventsWithoutPulls, ['cancel', recordedError]); 541cb0ef41Sopenharmony_ci assert_array_equals(ws.events, ['close']); 551cb0ef41Sopenharmony_ci 561cb0ef41Sopenharmony_ci return Promise.all([ 571cb0ef41Sopenharmony_ci rs.getReader().closed, 581cb0ef41Sopenharmony_ci ws.getWriter().closed 591cb0ef41Sopenharmony_ci ]); 601cb0ef41Sopenharmony_ci }); 611cb0ef41Sopenharmony_ci 621cb0ef41Sopenharmony_ci}, 'Closing must be propagated backward: starts closed; preventCancel omitted; rejected cancel promise'); 631cb0ef41Sopenharmony_ci 641cb0ef41Sopenharmony_cifor (const falsy of [undefined, null, false, +0, -0, NaN, '']) { 651cb0ef41Sopenharmony_ci const stringVersion = Object.is(falsy, -0) ? '-0' : String(falsy); 661cb0ef41Sopenharmony_ci 671cb0ef41Sopenharmony_ci promise_test(() => { 681cb0ef41Sopenharmony_ci 691cb0ef41Sopenharmony_ci const rs = recordingReadableStream(); 701cb0ef41Sopenharmony_ci 711cb0ef41Sopenharmony_ci const ws = recordingWritableStream(); 721cb0ef41Sopenharmony_ci const writer = ws.getWriter(); 731cb0ef41Sopenharmony_ci writer.close(); 741cb0ef41Sopenharmony_ci writer.releaseLock(); 751cb0ef41Sopenharmony_ci 761cb0ef41Sopenharmony_ci return rs.pipeTo(ws, { preventCancel: falsy }).then( 771cb0ef41Sopenharmony_ci () => assert_unreached('the promise must not fulfill'), 781cb0ef41Sopenharmony_ci err => { 791cb0ef41Sopenharmony_ci assert_equals(err.name, 'TypeError', 'the promise must reject with a TypeError'); 801cb0ef41Sopenharmony_ci 811cb0ef41Sopenharmony_ci assert_array_equals(rs.eventsWithoutPulls, ['cancel', err]); 821cb0ef41Sopenharmony_ci assert_array_equals(ws.events, ['close']); 831cb0ef41Sopenharmony_ci 841cb0ef41Sopenharmony_ci return Promise.all([ 851cb0ef41Sopenharmony_ci rs.getReader().closed, 861cb0ef41Sopenharmony_ci ws.getWriter().closed 871cb0ef41Sopenharmony_ci ]); 881cb0ef41Sopenharmony_ci } 891cb0ef41Sopenharmony_ci ); 901cb0ef41Sopenharmony_ci 911cb0ef41Sopenharmony_ci }, `Closing must be propagated backward: starts closed; preventCancel = ${stringVersion} (falsy); fulfilled cancel ` + 921cb0ef41Sopenharmony_ci `promise`); 931cb0ef41Sopenharmony_ci} 941cb0ef41Sopenharmony_ci 951cb0ef41Sopenharmony_cifor (const truthy of [true, 'a', 1, Symbol(), { }]) { 961cb0ef41Sopenharmony_ci promise_test(t => { 971cb0ef41Sopenharmony_ci 981cb0ef41Sopenharmony_ci const rs = recordingReadableStream(); 991cb0ef41Sopenharmony_ci 1001cb0ef41Sopenharmony_ci const ws = recordingWritableStream(); 1011cb0ef41Sopenharmony_ci const writer = ws.getWriter(); 1021cb0ef41Sopenharmony_ci writer.close(); 1031cb0ef41Sopenharmony_ci writer.releaseLock(); 1041cb0ef41Sopenharmony_ci 1051cb0ef41Sopenharmony_ci return promise_rejects_js(t, TypeError, rs.pipeTo(ws, { preventCancel: truthy })).then(() => { 1061cb0ef41Sopenharmony_ci assert_array_equals(rs.eventsWithoutPulls, []); 1071cb0ef41Sopenharmony_ci assert_array_equals(ws.events, ['close']); 1081cb0ef41Sopenharmony_ci 1091cb0ef41Sopenharmony_ci return ws.getWriter().closed; 1101cb0ef41Sopenharmony_ci }); 1111cb0ef41Sopenharmony_ci 1121cb0ef41Sopenharmony_ci }, `Closing must be propagated backward: starts closed; preventCancel = ${String(truthy)} (truthy)`); 1131cb0ef41Sopenharmony_ci} 1141cb0ef41Sopenharmony_ci 1151cb0ef41Sopenharmony_cipromise_test(t => { 1161cb0ef41Sopenharmony_ci 1171cb0ef41Sopenharmony_ci const rs = recordingReadableStream(); 1181cb0ef41Sopenharmony_ci 1191cb0ef41Sopenharmony_ci const ws = recordingWritableStream(); 1201cb0ef41Sopenharmony_ci const writer = ws.getWriter(); 1211cb0ef41Sopenharmony_ci writer.close(); 1221cb0ef41Sopenharmony_ci writer.releaseLock(); 1231cb0ef41Sopenharmony_ci 1241cb0ef41Sopenharmony_ci return promise_rejects_js(t, TypeError, rs.pipeTo(ws, { preventCancel: true, preventAbort: true })) 1251cb0ef41Sopenharmony_ci .then(() => { 1261cb0ef41Sopenharmony_ci assert_array_equals(rs.eventsWithoutPulls, []); 1271cb0ef41Sopenharmony_ci assert_array_equals(ws.events, ['close']); 1281cb0ef41Sopenharmony_ci 1291cb0ef41Sopenharmony_ci return ws.getWriter().closed; 1301cb0ef41Sopenharmony_ci }); 1311cb0ef41Sopenharmony_ci 1321cb0ef41Sopenharmony_ci}, 'Closing must be propagated backward: starts closed; preventCancel = true, preventAbort = true'); 1331cb0ef41Sopenharmony_ci 1341cb0ef41Sopenharmony_cipromise_test(t => { 1351cb0ef41Sopenharmony_ci 1361cb0ef41Sopenharmony_ci const rs = recordingReadableStream(); 1371cb0ef41Sopenharmony_ci 1381cb0ef41Sopenharmony_ci const ws = recordingWritableStream(); 1391cb0ef41Sopenharmony_ci const writer = ws.getWriter(); 1401cb0ef41Sopenharmony_ci writer.close(); 1411cb0ef41Sopenharmony_ci writer.releaseLock(); 1421cb0ef41Sopenharmony_ci 1431cb0ef41Sopenharmony_ci return promise_rejects_js(t, TypeError, 1441cb0ef41Sopenharmony_ci rs.pipeTo(ws, { preventCancel: true, preventAbort: true, preventClose: true })) 1451cb0ef41Sopenharmony_ci .then(() => { 1461cb0ef41Sopenharmony_ci assert_array_equals(rs.eventsWithoutPulls, []); 1471cb0ef41Sopenharmony_ci assert_array_equals(ws.events, ['close']); 1481cb0ef41Sopenharmony_ci 1491cb0ef41Sopenharmony_ci return ws.getWriter().closed; 1501cb0ef41Sopenharmony_ci }); 1511cb0ef41Sopenharmony_ci 1521cb0ef41Sopenharmony_ci}, 'Closing must be propagated backward: starts closed; preventCancel = true, preventAbort = true, preventClose ' + 1531cb0ef41Sopenharmony_ci '= true'); 154