mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-02-08 11:12:01 +01:00
![John McLear](/assets/img/avatar_default.png)
Also add symlinks from the old `bin/` and `tests/` locations to avoid breaking scripts and other tools. Motivations: * Scripts and tests no longer have to do dubious things like: require('ep_etherpad-lite/node_modules/foo') to access packages installed as dependencies in `src/package.json`. * Plugins can access the backend test helper library in a non-hacky way: require('ep_etherpad-lite/tests/backend/common') * We can delete the top-level `package.json` without breaking our ability to lint the files in `bin/` and `tests/`. Deleting the top-level `package.json` has downsides: It will cause `npm` to print warnings whenever plugins are installed, npm will no longer be able to enforce a plugin's peer dependency on ep_etherpad-lite, and npm will keep deleting the `node_modules/ep_etherpad-lite` symlink that points to `../src`. But there are significant upsides to deleting the top-level `package.json`: It will drastically speed up plugin installation because `npm` doesn't have to recursively walk the dependencies in `src/package.json`. Also, deleting the top-level `package.json` avoids npm's horrible dependency hoisting behavior (where it moves stuff from `src/node_modules/` to the top-level `node_modules/` directory). Dependency hoisting causes numerous mysterious problems such as silent failures in `npm outdated` and `npm update`. Dependency hoisting also breaks plugins that do: require('ep_etherpad-lite/node_modules/foo')
85 lines
2.8 KiB
JavaScript
85 lines
2.8 KiB
JavaScript
const assert = require('assert').strict;
|
|
const promises = require('../../../node/utils/promises');
|
|
|
|
describe(__filename, function () {
|
|
describe('promises.timesLimit', function () {
|
|
let wantIndex = 0;
|
|
const testPromises = [];
|
|
const makePromise = (index) => {
|
|
// Make sure index increases by one each time.
|
|
assert.equal(index, wantIndex++);
|
|
// Save the resolve callback (so the test can trigger resolution)
|
|
// and the promise itself (to wait for resolve to take effect).
|
|
const p = {};
|
|
const promise = new Promise((resolve) => {
|
|
p.resolve = resolve;
|
|
});
|
|
p.promise = promise;
|
|
testPromises.push(p);
|
|
return p.promise;
|
|
};
|
|
|
|
const total = 11;
|
|
const concurrency = 7;
|
|
const timesLimitPromise = promises.timesLimit(total, concurrency, makePromise);
|
|
|
|
it('honors concurrency', async function () {
|
|
assert.equal(wantIndex, concurrency);
|
|
});
|
|
|
|
it('creates another when one completes', async function () {
|
|
const {promise, resolve} = testPromises.shift();
|
|
resolve();
|
|
await promise;
|
|
assert.equal(wantIndex, concurrency + 1);
|
|
});
|
|
|
|
it('creates the expected total number of promises', async function () {
|
|
while (testPromises.length > 0) {
|
|
// Resolve them in random order to ensure that the resolution order doesn't matter.
|
|
const i = Math.floor(Math.random() * Math.floor(testPromises.length));
|
|
const {promise, resolve} = testPromises.splice(i, 1)[0];
|
|
resolve();
|
|
await promise;
|
|
}
|
|
assert.equal(wantIndex, total);
|
|
});
|
|
|
|
it('resolves', async function () {
|
|
await timesLimitPromise;
|
|
});
|
|
|
|
it('does not create too many promises if total < concurrency', async function () {
|
|
wantIndex = 0;
|
|
assert.equal(testPromises.length, 0);
|
|
const total = 7;
|
|
const concurrency = 11;
|
|
const timesLimitPromise = promises.timesLimit(total, concurrency, makePromise);
|
|
while (testPromises.length > 0) {
|
|
const {promise, resolve} = testPromises.pop();
|
|
resolve();
|
|
await promise;
|
|
}
|
|
await timesLimitPromise;
|
|
assert.equal(wantIndex, total);
|
|
});
|
|
|
|
it('accepts total === 0, concurrency > 0', async function () {
|
|
wantIndex = 0;
|
|
assert.equal(testPromises.length, 0);
|
|
await promises.timesLimit(0, concurrency, makePromise);
|
|
assert.equal(wantIndex, 0);
|
|
});
|
|
|
|
it('accepts total === 0, concurrency === 0', async function () {
|
|
wantIndex = 0;
|
|
assert.equal(testPromises.length, 0);
|
|
await promises.timesLimit(0, 0, makePromise);
|
|
assert.equal(wantIndex, 0);
|
|
});
|
|
|
|
it('rejects total > 0, concurrency === 0', async function () {
|
|
await assert.rejects(promises.timesLimit(total, 0, makePromise), RangeError);
|
|
});
|
|
});
|
|
});
|