summaryrefslogtreecommitdiff
path: root/test/parallel/test-child-process-send-returns-boolean.js
blob: 8c3ef46438379c4601187f38da24178b2ce192c9 (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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
'use strict';
const common = require('../common');

// subprocess.send() will return false if the channel has closed or when the
// backlog of unsent messages exceeds a threshold that makes it unwise to send
// more. Otherwise, the method returns true.

const assert = require('assert');
const net = require('net');
const { fork, spawn } = require('child_process');
const fixtures = require('../common/fixtures');

// Just a script that stays alive (does not listen to `process.on('message')`).
const subScript = fixtures.path('child-process-persistent.js');

{
  // Test `send` return value on `fork` that opens and IPC by default.
  const n = fork(subScript);
  // `subprocess.send` should always return `true` for the first send.
  const rv = n.send({ h: 'w' }, assert.ifError);
  assert.strictEqual(rv, true);
  n.kill('SIGKILL');
}

{
  // Test `send` return value on `spawn` and saturate backlog with handles.
  // Call `spawn` with options that open an IPC channel.
  const spawnOptions = { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] };
  const s = spawn(process.execPath, [subScript], spawnOptions);

  const server = net.createServer(common.mustNotCall()).listen(0, () => {
    const handle = server._handle;

    // Sending a handle and not giving the tickQueue time to acknowledge should
    // create the internal backlog, but leave it empty.
    const rv1 = s.send('one', handle, (err) => { if (err) assert.fail(err); });
    assert.strictEqual(rv1, true);
    // Since the first `send` included a handle (should be unacknowledged),
    // we can safely queue up only one more message.
    const rv2 = s.send('two', (err) => { if (err) assert.fail(err); });
    assert.strictEqual(rv2, true);
    // The backlog should now be indicate to backoff.
    const rv3 = s.send('three', (err) => { if (err) assert.fail(err); });
    assert.strictEqual(rv3, false);
    const rv4 = s.send('four', (err) => {
      if (err) assert.fail(err);
      // `send` queue should have been drained.
      const rv5 = s.send('5', handle, (err) => { if (err) assert.fail(err); });
      assert.strictEqual(rv5, true);

      // End test and cleanup.
      s.kill();
      handle.close();
      server.close();
    });
    assert.strictEqual(rv4, false);
  });
}