Skip to content

Commit

Permalink
More tests
Browse files Browse the repository at this point in the history
  • Loading branch information
osa1 committed Jul 4, 2023
1 parent 8a316a1 commit 5e5265b
Showing 1 changed file with 87 additions and 28 deletions.
115 changes: 87 additions & 28 deletions protoc_plugin/test/message_set_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:typed_data';

import 'package:fixnum/fixnum.dart';
import 'package:protobuf/protobuf.dart';
import 'package:test/test.dart';
Expand Down Expand Up @@ -144,55 +146,58 @@ void main() {
// Generate a message set encoding using unknown fields. Message set item
// will have extra tags.

final itemFieldGroup = UnknownFieldSet();
final encoded = encodeMessageSetWithExtraItemTags(Encoding.group);

final registry = ExtensionRegistry()..add(TestMessage.ext1);
final decodedMsg = MessageSet.fromBuffer(encoded, registry);
final extensionValue =
decodedMsg.getExtension(TestMessage.ext1) as ExtensionMessage1;

expect(extensionValue.a, 123456);
expect(extensionValue.b, 'test');
expect(decodedMsg.unknownFields.isEmpty, true);
});

test('Ignore extra tags in items (length delimited encoding)', () {
// Same as above, but tests length delimited encoding.

// Invalid field with tag 1.
itemFieldGroup.addField(
1, UnknownFieldSetField()..addLengthDelimited([1, 2, 3]));
final encoded = encodeMessageSetWithExtraItemTags(Encoding.lengthDelimited);

// Extension field.
itemFieldGroup.addField(
3,
UnknownFieldSetField()
..addLengthDelimited((ExtensionMessage1()
..a = 123456
..b = 'test')
.writeToBuffer()));
final registry = ExtensionRegistry()..add(TestMessage.ext1);
final decodedMsg = MessageSet.fromBuffer(encoded, registry);
final extensionValue =
decodedMsg.getExtension(TestMessage.ext1) as ExtensionMessage1;

// Invalid field with tag 3.
itemFieldGroup.addField(
4, UnknownFieldSetField()..addVarint(Int64(123456)));
expect(extensionValue.a, 123456);
expect(extensionValue.b, 'test');
expect(decodedMsg.unknownFields.isEmpty, true);
});

// Type id field.
itemFieldGroup.addField(
2, UnknownFieldSetField()..addVarint(Int64(1758024)));
test('Ignore invalid tags in repeated items', () {
// Extra fields other than `repeated Item items = 1` in the outer message.

final messageSetUnknownFields = UnknownFieldSet();
messageSetUnknownFields.addField(
1, UnknownFieldSetField()..addGroup(itemFieldGroup));
2, UnknownFieldSetField()..addVarint(Int64(987)));

final messageSetEncoded = CodedBufferWriter();
messageSetUnknownFields.writeToCodedBufferWriter(messageSetEncoded);

final encoded = (Empty()
..unknownFields.addField(
1,
123,
UnknownFieldSetField()
..lengthDelimited.add(messageSetEncoded.toBuffer())))
.writeToBuffer();

final registry = ExtensionRegistry()..add(TestMessage.ext1);
final msg = TestMessage.fromBuffer(encoded, registry);
final extensionValue =
msg.info.getExtension(TestMessage.ext1) as ExtensionMessage1;

expect(extensionValue.a, 123456);
expect(extensionValue.b, 'test');
expect(msg.unknownFields.isEmpty, true);
expect(msg.info.hasExtension(TestMessage.ext1), false);
});

test('Ignore invalid tags in repeated items', () {
// Extra fields other than `repeated Item items = 1` in the outer message.
test('Encode message set as length prefixed', () {
// Message sets are generally encoded as groups, but we support length
// delimited as well.

final messageSetUnknownFields = UnknownFieldSet();
messageSetUnknownFields.addField(
Expand All @@ -213,3 +218,57 @@ void main() {
expect(msg.info.hasExtension(TestMessage.ext1), false);
});
}

enum Encoding {
lengthDelimited,
group,
}

/// Generate a message set encoding with one extension. Extension will have
/// extra tags.
Uint8List encodeMessageSetWithExtraItemTags(Encoding encoding) {
final itemFieldGroup = UnknownFieldSet();

// Invalid field with tag 1.
itemFieldGroup.addField(
1, UnknownFieldSetField()..addLengthDelimited([1, 2, 3]));

// Extension field.
itemFieldGroup.addField(
3,
UnknownFieldSetField()
..addLengthDelimited((ExtensionMessage1()
..a = 123456
..b = 'test')
.writeToBuffer()));

// Invalid field with tag 3.
itemFieldGroup.addField(4, UnknownFieldSetField()..addVarint(Int64(123456)));

// Type id field.
itemFieldGroup.addField(2, UnknownFieldSetField()..addVarint(Int64(1758024)));

final messageSet = Empty();
final messageSetUnknownFields = messageSet.unknownFields;

switch (encoding) {
case Encoding.lengthDelimited:
final writer = CodedBufferWriter();
itemFieldGroup.writeToCodedBufferWriter(writer);
messageSetUnknownFields.addField(
1, UnknownFieldSetField()..addLengthDelimited(writer.toBuffer()));
break;
case Encoding.group:
messageSetUnknownFields.addField(
1, UnknownFieldSetField()..addGroup(itemFieldGroup));
break;
}

messageSetUnknownFields.addField(
1, UnknownFieldSetField()..addGroup(itemFieldGroup));

final messageSetEncoded = CodedBufferWriter();
messageSetUnknownFields.writeToCodedBufferWriter(messageSetEncoded);

return messageSet.writeToBuffer();
}

0 comments on commit 5e5265b

Please sign in to comment.