google / google/protobuf.dart

`mergeFromJsonMap` message-field merge behavior is incorrect or inconsistent with other merge methods

Open
#726 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
Dart
Stars
572
Forks
196
Avg merge
1h 59m
Merged PRs (30d)
2

Description

When merging a message-field all merge methods (binary, proto3 JSON, merging from another message) recursively merge fields of the message being merged to the message-field.

But `mergeFromJsonMap` overwrites the message-field. Repro, as a test case added to `protoc_plugin/test/merge_test.dart`:

```dart
test('nested message merges recursively merges message-fields', () {
pb.Outer newMessage() => pb.Outer()
..inner = (pb.Inner()
..value = 'test'
..id = Int64(123));

void checkUpdatedMessage(pb.Outer msg) {
expect(msg.inner.value, 'test');
expect(msg.inner.id, Int64(100));
}

{
final msg = newMessage();
msg.mergeFromBuffer([
(4 << 3) | 2, // tag = 4, type = length delimited
2, // length
(2 << 3) | 0, // tag = 2, type = varint
100, // int64 id = 100
]);
checkUpdatedMessage(msg);
}

{
final msg = newMessage();
msg.mergeFromJsonMap({'4': {'2': 100}});
checkUpdatedMessage(msg);
}

{
final msg = newMessage();
msg.mergeFromMessage(pb.Outer()..inner = (pb.Inner()..id = Int64(100)));
checkUpdatedMessage(msg);
}

{
final msg = newMessage();
msg.mergeFromProto3Json({'inner': {'id': 100}});
checkUpdatedMessage(msg);
}
});
```

`checkUpdatedMessage` after `mergeFromJsonMap` fails, because `mergeFromJsonMap` overwrites the `inner` field and effectively clears `inner.value`.

Contributor guide

Open the contributing guide

Research direction

Start with the repro in protoc_plugin/test/merge_test.dart and trace the mergeFromJsonMap entry point. Compare its nested message behavior with mergeFromBuffer, mergeFromMessage, and mergeFromProto3Json; done means the test passes while preserving inner.value during a partial nested merge.

Written by the indexing model from the issue text.

Assessment

Tech stack
dart
Domain
backend-api-design
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.