mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-20 16:07:11 +08:00
41 lines
1.4 KiB
JavaScript
41 lines
1.4 KiB
JavaScript
const assert = require('node:assert/strict');
|
|
const { test } = require('node:test');
|
|
const {
|
|
ClusterControlAvailabilityFence,
|
|
} = require('@qinglong/cluster-control/availability');
|
|
|
|
test('signals one bound listener exactly once without a retry path', async () => {
|
|
const fence = new ClusterControlAvailabilityFence();
|
|
const reasons = [];
|
|
const unsubscribe = fence.subscribe(async (error) => {
|
|
reasons.push(error.message);
|
|
});
|
|
|
|
assert.equal(fence.status, 'available');
|
|
assert.equal(await fence.signal(new Error('connection lost')), 'signaled');
|
|
assert.equal(fence.status, 'unavailable');
|
|
assert.equal(
|
|
await fence.signal(new Error('second connection lost')),
|
|
'already_unavailable',
|
|
);
|
|
assert.deepEqual(reasons, ['connection lost']);
|
|
unsubscribe();
|
|
unsubscribe();
|
|
fence.dispose();
|
|
assert.equal(fence.status, 'disposed');
|
|
assert.equal(await fence.signal(new Error('after dispose')), 'disposed');
|
|
});
|
|
|
|
test('delivers an early signal when the single application listener binds', async () => {
|
|
const fence = new ClusterControlAvailabilityFence();
|
|
assert.equal(await fence.signal(new Error('early failure')), 'signaled');
|
|
let reason;
|
|
fence.subscribe((error) => {
|
|
reason = error.message;
|
|
});
|
|
await Promise.resolve();
|
|
assert.equal(reason, 'early failure');
|
|
assert.throws(() => fence.subscribe(() => {}), /already bound/);
|
|
await assert.rejects(() => fence.signal('invalid'), /error is invalid/);
|
|
});
|