signal-desktop/ts/test-node/Proto_unknown_field_test.ts

142 lines
3.6 KiB
TypeScript
Raw Normal View History

2021-07-13 18:54:53 +00:00
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { assert } from 'chai';
import { Root } from 'protobufjs';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const { Partial, Full } = (Root as any).fromJSON({
nested: {
test: {
nested: {
Partial: {
fields: {
a: {
type: 'string',
id: 1,
},
c: {
type: 'int32',
id: 3,
},
},
},
Full: {
fields: {
a: {
type: 'string',
id: 1,
},
b: {
type: 'bool',
id: 2,
},
c: {
type: 'int32',
id: 3,
},
d: {
type: 'bytes',
id: 4,
},
},
},
},
},
},
}).nested.test;
describe('Proto#$unknownFields', () => {
2021-07-13 18:54:53 +00:00
it('should encode and decode with unknown fields', () => {
const full = Full.encode({
a: 'hello',
b: true,
c: 42,
d: Buffer.from('ohai'),
}).finish();
const partial = Partial.decode(full);
assert.strictEqual(partial.a, 'hello');
assert.strictEqual(partial.c, 42);
assert.strictEqual(partial.$unknownFields.length, 2);
2021-07-13 18:54:53 +00:00
assert.strictEqual(
Buffer.from(partial.$unknownFields[0]).toString('hex'),
2021-07-13 18:54:53 +00:00
'1001'
);
assert.strictEqual(
Buffer.from(partial.$unknownFields[1]).toString('hex'),
2021-07-13 18:54:53 +00:00
'22046f686169'
);
const encoded = Partial.encode({
a: partial.a,
c: partial.c,
$unknownFields: partial.$unknownFields,
2021-07-13 18:54:53 +00:00
}).finish();
const decoded = Full.decode(encoded);
assert.strictEqual(decoded.a, 'hello');
assert.strictEqual(decoded.b, true);
assert.strictEqual(decoded.c, 42);
assert.strictEqual(Buffer.from(decoded.d).toString(), 'ohai');
const concat = Partial.encode({
a: partial.a,
c: partial.c,
$unknownFields: [Buffer.concat(partial.$unknownFields)],
2021-07-13 18:54:53 +00:00
}).finish();
const decodedConcat = Full.decode(concat);
assert.strictEqual(decodedConcat.a, 'hello');
assert.isTrue(decodedConcat.b);
2021-07-13 18:54:53 +00:00
assert.strictEqual(decodedConcat.c, 42);
assert.strictEqual(Buffer.from(decodedConcat.d).toString(), 'ohai');
});
it('should decode unknown fields before reencoding them', () => {
const full = Full.encode({
a: 'hello',
b: true,
c: 42,
d: Buffer.from('ohai'),
}).finish();
const partial = Partial.decode(full);
assert.isUndefined(partial.b);
const encoded = Full.encode({
...partial,
b: false,
}).finish();
const decoded = Full.decode(encoded);
assert.strictEqual(decoded.a, 'hello');
assert.isFalse(decoded.b);
assert.strictEqual(decoded.c, 42);
assert.strictEqual(Buffer.from(decoded.d).toString(), 'ohai');
});
2024-09-04 18:06:06 +00:00
it('should not set unknown fields if all fields were known', () => {
const encoded = Partial.encode({
a: 'hello',
c: 42,
}).finish();
const decoded = Full.decode(encoded);
assert.strictEqual(decoded.a, 'hello');
assert.strictEqual(decoded.c, 42);
assert.isUndefined(decoded.$unknownFields);
const encodedWithEmptyArray = Partial.encode({
a: 'hi',
c: 69,
$unkownFields: [],
}).finish();
const decodedWithEmptyArray = Full.decode(encodedWithEmptyArray);
assert.strictEqual(decodedWithEmptyArray.a, 'hi');
assert.strictEqual(decodedWithEmptyArray.c, 69);
assert.isUndefined(decodedWithEmptyArray.$unknownFields);
});
2021-07-13 18:54:53 +00:00
});