• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright Joyent, Inc. and other Node contributors.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a
4// copy of this software and associated documentation files (the
5// "Software"), to deal in the Software without restriction, including
6// without limitation the rights to use, copy, modify, merge, publish,
7// distribute, sublicense, and/or sell copies of the Software, and to permit
8// persons to whom the Software is furnished to do so, subject to the
9// following conditions:
10//
11// The above copyright notice and this permission notice shall be included
12// in all copies or substantial portions of the Software.
13//
14// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20// USE OR OTHER DEALINGS IN THE SOFTWARE.
21
22'use strict';
23const common = require('../common');
24const assert = require('assert');
25
26/*
27 * This test makes sure that non-integer timer delays do not make the process
28 * hang. See https://github.com/joyent/node/issues/8065 and
29 * https://github.com/joyent/node/issues/8068 which have been fixed by
30 * https://github.com/joyent/node/pull/8073.
31 *
32 * If the process hangs, this test will make the tests suite timeout,
33 * otherwise it will exit very quickly (after 50 timers with a short delay
34 * fire).
35 *
36 * We have to set at least several timers with a non-integer delay to
37 * reproduce the issue. Sometimes, a timer with a non-integer delay will
38 * expire correctly. 50 timers has always been more than enough to reproduce
39 * it 100%.
40 */
41
42const TIMEOUT_DELAY = 1.1;
43let N = 50;
44
45const interval = setInterval(common.mustCall(() => {
46  if (--N === 0) {
47    clearInterval(interval);
48  }
49}, N), TIMEOUT_DELAY);
50
51// Test non-integer delay ordering
52{
53  const ordering = [];
54
55  setTimeout(common.mustCall(() => {
56    ordering.push(1);
57  }), 1);
58
59  setTimeout(common.mustCall(() => {
60    ordering.push(2);
61  }), 1.8);
62
63  setTimeout(common.mustCall(() => {
64    ordering.push(3);
65  }), 1.1);
66
67  setTimeout(common.mustCall(() => {
68    ordering.push(4);
69  }), 1);
70
71  setTimeout(common.mustCall(() => {
72    const expected = [1, 2, 3, 4];
73
74    assert.deepStrictEqual(
75      ordering,
76      expected,
77      `Non-integer delay ordering should be ${expected}, but got ${ordering}`
78    );
79
80    // 2 should always be last of these delays due to ordering guarantees by
81    // the implementation.
82  }), 2);
83}
84