summaryrefslogtreecommitdiff
path: root/test/parallel/test-worker-message-port-transfer-self.js
blob: f02f06eaaea53f58f5bf898551f9c0c279cc4bd0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
'use strict';

const common = require('../common');
const assert = require('assert');
const util = require('util');
const { MessageChannel } = require('worker_threads');
const tick = require('../common/tick');

const { port1, port2 } = new MessageChannel();

assert.throws(common.mustCall(() => {
  port1.postMessage(null, [port1]);
}), common.mustCall((err) => {
  assert.strictEqual(err.name, 'DataCloneError');
  assert.strictEqual(err.message, 'Transfer list contains source port');
  assert.strictEqual(err.code, 25);
  assert.ok(err instanceof Error);

  const DOMException = err.constructor;
  assert.ok(err instanceof DOMException);
  assert.strictEqual(DOMException.name, 'DOMException');

  return true;
}));

// The failed transfer should not affect the ports in anyway.
port2.onmessage = common.mustCall((message) => {
  assert.strictEqual(message.data, 2);

  const inspectedPort1 = util.inspect(port1);
  const inspectedPort2 = util.inspect(port2);
  assert(inspectedPort1.includes('active: true'), inspectedPort1);
  assert(inspectedPort2.includes('active: true'), inspectedPort2);

  port1.close();

  tick(10, () => {
    const inspectedPort1 = util.inspect(port1);
    const inspectedPort2 = util.inspect(port2);
    assert(inspectedPort1.includes('active: false'), inspectedPort1);
    assert(inspectedPort2.includes('active: false'), inspectedPort2);
  });
});
port1.postMessage(2);