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;
|
|
|
|
|
2023-07-12 17:54:37 +00:00
|
|
|
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);
|
2023-07-12 17:54:37 +00:00
|
|
|
assert.strictEqual(partial.$unknownFields.length, 2);
|
2021-07-13 18:54:53 +00:00
|
|
|
assert.strictEqual(
|
2023-07-12 17:54:37 +00:00
|
|
|
Buffer.from(partial.$unknownFields[0]).toString('hex'),
|
2021-07-13 18:54:53 +00:00
|
|
|
'1001'
|
|
|
|
);
|
|
|
|
assert.strictEqual(
|
2023-07-12 17:54:37 +00:00
|
|
|
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,
|
2023-07-12 17:54:37 +00:00
|
|
|
$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,
|
2023-07-12 17:54:37 +00:00
|
|
|
$unknownFields: [Buffer.concat(partial.$unknownFields)],
|
2021-07-13 18:54:53 +00:00
|
|
|
}).finish();
|
|
|
|
const decodedConcat = Full.decode(concat);
|
|
|
|
|
|
|
|
assert.strictEqual(decodedConcat.a, 'hello');
|
2021-07-28 23:44:58 +00:00
|
|
|
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');
|
|
|
|
});
|
2021-07-28 23:44:58 +00:00
|
|
|
|
|
|
|
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
|
|
|
});
|