test: Asterisk upgrade check
verified.ts records what the code relies on Asterisk doing and the version it was measured on; pnpm test fails while the Dockerfile pins another one. pnpm test:asterisk-upgrade boots the image next to a TLS provider and lists every behaviour that moved and what depends on it.
This commit is contained in:
1 parent
678d45e4f9
commit
a0121d4975
5 files changed
+416
-1
No files matched your search
@@ -0,0 +1,68 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
// What the code relies on Asterisk doing, as last measured by upgrade-test.ts, and on which
|
||||
// version. asterisk-version.test.ts fails when asterisk/Dockerfile pins another version: run
|
||||
// `pnpm test:asterisk-upgrade` on the new image, act on each change it lists, then update this.
|
||||
import { readFileSync } from 'node:fs';
|
||||
|
||||
export const VERIFIED_ASTERISK = '24.0.0-rc2';
|
||||
|
||||
/** The version asterisk/Dockerfile builds. */
|
||||
export function pinnedAsterisk(): string {
|
||||
const file = readFileSync(new URL('../../../../asterisk/Dockerfile', import.meta.url), 'utf8');
|
||||
const v = /^ARG ASTERISK_VERSION=(\S+)$/m.exec(file)?.[1];
|
||||
if (!v) throw new Error('asterisk/Dockerfile has no ARG ASTERISK_VERSION');
|
||||
return v;
|
||||
}
|
||||
|
||||
/** `expect`: the answer on VERIFIED_ASTERISK. `where`: what depends on it, to change if it moves. */
|
||||
export const FACTS = {
|
||||
riskyModulesGone: {
|
||||
expect: true,
|
||||
what: 'app_system, func_shell, app_disa, res_agi and app_externalivr are not loaded',
|
||||
where: 'asterisk/conf/modules.conf noload lines (08 §6): a renamed module would load again',
|
||||
},
|
||||
mwiSubscribeReplaces: {
|
||||
expect: true,
|
||||
what: 'endpoints take mwi_subscribe_replaces_unsolicited',
|
||||
where: 'generator/pjsip.ts: without it a phone that SUBSCRIBEs for MWI gets a 500 (03 §5.2)',
|
||||
},
|
||||
setVarKeepsUnderscores: {
|
||||
expect: true,
|
||||
what: 'set_var = __SP_DIRECTION=… loads as "__SP_DIRECTION"',
|
||||
where: 'generator/pjsip.ts set_var lines; dialplan reads SP_DIRECTION on dialed legs (03 §5.2)',
|
||||
},
|
||||
staticContactsInShowContacts: {
|
||||
expect: false,
|
||||
what: 'PJSIPShowContacts lists static (contact =) AOR contacts',
|
||||
where: 'live/state.ts reads trunk reachability from PJSIPShowEndpoint instead (04 §5.1)',
|
||||
},
|
||||
endpointShowsContactStatus: {
|
||||
expect: true,
|
||||
what: 'PJSIPShowEndpoint has a ContactStatusDetail for a static contact',
|
||||
where: 'live/state.ts trunk reachability (04 §5.1)',
|
||||
},
|
||||
voicemailMoveRemove: {
|
||||
expect: true,
|
||||
what: 'the AMI actions VoicemailMove and VoicemailRemove exist',
|
||||
where: 'services/voicemail.ts mark read and delete (04 §5.6)',
|
||||
},
|
||||
cdrLinkedId: {
|
||||
expect: true,
|
||||
what: 'Cdr AMI events carry LinkedID (cdr_manager.conf mapping)',
|
||||
where: 'services/cdr.ts groups a call by it (01 §3.15, 04 §5.4)',
|
||||
},
|
||||
cdrTimesUtcNoZone: {
|
||||
expect: true,
|
||||
what: 'Cdr StartTime is "YYYY-MM-DD HH:MM:SS" in UTC, no zone',
|
||||
where: 'services/cdr.ts utc() adds the Z itself',
|
||||
},
|
||||
tlsQualifyByHostname: {
|
||||
expect: false,
|
||||
what: 'a qualify OPTIONS over TLS checks the certificate against the host name, not the IP',
|
||||
where:
|
||||
'generator/pjsip.ts sets qualify_frequency = 0 on TLS trunks because of this (08 §2.1); ' +
|
||||
'24.0.0-rc3 says it fixes it ("Preserve target hostname for qualified OPTIONS destination")',
|
||||
},
|
||||
} as const;
|
||||
|
||||
export type Fact = keyof typeof FACTS;
|
||||
Reference in new issue
Block a user