commit 31a2564086f1ad6e6d898c9c817fbdc147377cdc
parent 69ce816b345284c10bbaab6217c66e6e5c8db354
Author: Florian Dold <dold@taler.net>
Date: Tue, 21 Jul 2026 00:40:41 +0200
util: test version compatibility
Diffstat:
1 file changed, 31 insertions(+), 0 deletions(-)
diff --git a/packages/taler-util/src/libtool-version.test.ts b/packages/taler-util/src/libtool-version.test.ts
@@ -49,3 +49,34 @@ test("version comparison", (t) => {
assert.ok(LibtoolVersion.compare("42:0:1", "41:0:0")?.compatible);
assert.ok(LibtoolVersion.compare("41:0:0", "42:0:1")?.compatible);
});
+
+test("isCompatible reports incompatibility", (t) => {
+ // compare() returns an object on incompatibility, which is truthy -- so a
+ // bare truthiness test on it only ever detects an unparseable version.
+ // Resolved dynamically so that this file still compiles before the helper
+ // exists.
+ const isCompatible = (LibtoolVersion as any).isCompatible as (
+ a: string,
+ b: string,
+ ) => boolean;
+ assert.strictEqual(typeof isCompatible, "function");
+ assert.strictEqual(isCompatible("41:0:0", "0:0:0"), false);
+ assert.strictEqual(isCompatible("4:0:0", "99:0:0"), false);
+ assert.strictEqual(isCompatible("1:0:1", "1:0:0"), true);
+ // Unparseable input is not compatible either.
+ assert.strictEqual(isCompatible("4:0:0", "bogus"), false);
+});
+
+test("parseVersion requires plain decimal components", (t) => {
+ // The C reference uses sscanf("%u:%u:%u%c") and requires exactly three
+ // conversions, so none of these are valid protocol versions.
+ assert.strictEqual(LibtoolVersion.parseVersion("3:0:1garbage"), undefined);
+ assert.strictEqual(LibtoolVersion.parseVersion("0x10:0:0"), undefined);
+ assert.strictEqual(LibtoolVersion.parseVersion("1.9:0:0"), undefined);
+ assert.strictEqual(LibtoolVersion.parseVersion("-1:0:0"), undefined);
+ assert.deepStrictEqual(LibtoolVersion.parseVersion("3:0:1"), {
+ current: 3,
+ revision: 0,
+ age: 1,
+ });
+});