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// Flags: --expose-internals 23 24'use strict'; 25require('../common'); 26const assert = require('assert'); 27const { internalBinding } = require('internal/test/binding'); 28const { getLibuvNow } = internalBinding('timers'); 29 30const N = 30; 31 32let last_i = 0; 33let last_ts = 0; 34 35function f(i) { 36 if (i <= N) { 37 // check order 38 assert.strictEqual(i, last_i + 1, `order is broken: ${i} != ${last_i} + 1`); 39 last_i = i; 40 41 // Check that this iteration is fired at least 1ms later than the previous 42 const now = getLibuvNow(); 43 assert(now >= last_ts + 1, 44 `current ts ${now} < prev ts ${last_ts} + 1`); 45 last_ts = now; 46 47 // Schedule next iteration 48 setTimeout(f, 1, i + 1); 49 } 50} 51setTimeout(f, 1, 1); 52