~webapps/unity-js-scopes/node.js

« back to all changes in this revision

Viewing changes to test/parallel/test-cluster-worker-exit.js

  • Committer: Marcus Tomlinson
  • Date: 2015-11-13 07:59:04 UTC
  • Revision ID: marcus.tomlinson@canonical.com-20151113075904-h0swczmoq1rvstfc
Node v4 (stable)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
'use strict';
 
2
// test-cluster-worker-exit.js
 
3
// verifies that, when a child process exits (by calling `process.exit(code)`)
 
4
// - the parent receives the proper events in the proper order, no duplicates
 
5
// - the exitCode and signalCode are correct in the 'exit' event
 
6
// - the worker.suicide flag, and worker.state are correct
 
7
// - the worker process actually goes away
 
8
 
 
9
var common = require('../common');
 
10
var assert = require('assert');
 
11
var cluster = require('cluster');
 
12
 
 
13
var EXIT_CODE = 42;
 
14
 
 
15
if (cluster.isWorker) {
 
16
  var http = require('http');
 
17
  var server = http.Server(function() { });
 
18
 
 
19
  server.once('listening', function() {
 
20
    process.exit(EXIT_CODE);
 
21
  });
 
22
  server.listen(common.PORT, '127.0.0.1');
 
23
 
 
24
} else if (cluster.isMaster) {
 
25
 
 
26
  var expected_results = {
 
27
      cluster_emitDisconnect: [1, "the cluster did not emit 'disconnect'"],
 
28
      cluster_emitExit: [1, "the cluster did not emit 'exit'"],
 
29
      cluster_exitCode: [EXIT_CODE, 'the cluster exited w/ incorrect exitCode'],
 
30
      cluster_signalCode: [null, 'the cluster exited w/ incorrect signalCode'],
 
31
      worker_emitDisconnect: [1, "the worker did not emit 'disconnect'"],
 
32
      worker_emitExit: [1, "the worker did not emit 'exit'"],
 
33
      worker_state: ['disconnected', 'the worker state is incorrect'],
 
34
      worker_suicideMode: [false, 'the worker.suicide flag is incorrect'],
 
35
      worker_died: [true, 'the worker is still running'],
 
36
      worker_exitCode: [EXIT_CODE, 'the worker exited w/ incorrect exitCode'],
 
37
      worker_signalCode: [null, 'the worker exited w/ incorrect signalCode']
 
38
  };
 
39
  var results = {
 
40
      cluster_emitDisconnect: 0,
 
41
      cluster_emitExit: 0,
 
42
      worker_emitDisconnect: 0,
 
43
      worker_emitExit: 0
 
44
  };
 
45
 
 
46
 
 
47
  // start worker
 
48
  var worker = cluster.fork();
 
49
 
 
50
  worker.once('listening', function() {
 
51
    // the worker is up and running...
 
52
  });
 
53
 
 
54
 
 
55
  // Check cluster events
 
56
  cluster.on('disconnect', function() {
 
57
    results.cluster_emitDisconnect += 1;
 
58
  });
 
59
  cluster.on('exit', function(worker) {
 
60
    results.cluster_exitCode = worker.process.exitCode;
 
61
    results.cluster_signalCode = worker.process.signalCode;
 
62
    results.cluster_emitExit += 1;
 
63
    assert.ok(results.cluster_emitDisconnect,
 
64
        "cluster: 'exit' event before 'disconnect' event");
 
65
  });
 
66
 
 
67
  // Check worker events and properties
 
68
  worker.on('disconnect', function() {
 
69
    results.worker_emitDisconnect += 1;
 
70
    results.worker_suicideMode = worker.suicide;
 
71
    results.worker_state = worker.state;
 
72
  });
 
73
 
 
74
  // Check that the worker died
 
75
  worker.once('exit', function(exitCode, signalCode) {
 
76
    results.worker_exitCode = exitCode;
 
77
    results.worker_signalCode = signalCode;
 
78
    results.worker_emitExit += 1;
 
79
    results.worker_died = !alive(worker.process.pid);
 
80
    assert.ok(results.worker_emitDisconnect,
 
81
        "worker: 'exit' event before 'disconnect' event");
 
82
 
 
83
    process.nextTick(function() { finish_test(); });
 
84
  });
 
85
 
 
86
  var finish_test = function() {
 
87
    try {
 
88
      checkResults(expected_results, results);
 
89
    } catch (exc) {
 
90
      console.error('FAIL: ' + exc.message);
 
91
      if (exc.name != 'AssertionError') {
 
92
        console.trace(exc);
 
93
      }
 
94
 
 
95
      process.exit(1);
 
96
      return;
 
97
    }
 
98
    process.exit(0);
 
99
  };
 
100
}
 
101
 
 
102
// some helper functions ...
 
103
 
 
104
function checkResults(expected_results, results) {
 
105
  for (var k in expected_results) {
 
106
    var actual = results[k],
 
107
        expected = expected_results[k];
 
108
 
 
109
    var msg = (expected[1] || '') +
 
110
        (' [expected: ' + expected[0] + ' / actual: ' + actual + ']');
 
111
 
 
112
    if (expected && expected.length) {
 
113
      assert.equal(actual, expected[0], msg);
 
114
    } else {
 
115
      assert.equal(actual, expected, msg);
 
116
    }
 
117
  }
 
118
}
 
119
 
 
120
function alive(pid) {
 
121
  try {
 
122
    process.kill(pid, 'SIGCONT');
 
123
    return true;
 
124
  } catch (e) {
 
125
    return false;
 
126
  }
 
127
}