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