Skip to content

Commit

Permalink
Merge pull request #14442 from haberman/23-cherrypick
Browse files Browse the repository at this point in the history
Cherry-picked Python tests and updated upb dep
  • Loading branch information
haberman authored Oct 17, 2023
2 parents 0eea866 + 953aec6 commit b2bc5de
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 2 deletions.
4 changes: 2 additions & 2 deletions protobuf_deps.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ def protobuf_deps():
_github_archive(
name = "upb",
repo = "https://github.com/protocolbuffers/upb",
commit = "455cfdb8ae60a1763e6d924e36851c6897a781bb",
sha256 = "2c8b4e961c38fcc7c58e8aca807cc3cc5190f42afdf39551ce49812b130493de",
commit = "5afd8ccb253d408483782ec19f0090a82d10ba1d",
sha256 = "0e3ce017e0636023fe9cd67c6fb513dfd534bad5d43b3a16a9141c3b58822435",
patches = ["@com_google_protobuf//build_defs:upb.patch"],
)
1 change: 1 addition & 0 deletions python/google/protobuf/internal/factory_test1.proto
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ message Factory1Message {
optional NestedFactory1Message nested_factory_1_message = 3;
optional int32 scalar_value = 4;
repeated string list_value = 5;
map<string, string> map_field = 6;

extensions 1000 to max;
}
Expand Down
25 changes: 25 additions & 0 deletions python/google/protobuf/internal/message_factory_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
__author__ = '[email protected] (Matt Toia)'

import unittest
import gc

from google.protobuf import descriptor_pb2
from google.protobuf.internal import api_implementation
Expand Down Expand Up @@ -285,5 +286,29 @@ def FindFileByName(self, name):
self.assertEqual(345, m.Extensions[ext2].setting)


def testOndemandCreateMetaClass(self):
def loadFile():
f = descriptor_pb2.FileDescriptorProto.FromString(
factory_test1_pb2.DESCRIPTOR.serialized_pb)
return message_factory.GetMessages([f])

messages = loadFile()
data = factory_test1_pb2.Factory1Message()
data.map_field['hello'] = 'welcome'
# Force GC to collect. UPB python will clean up the map entry class.
# cpp extension and pure python will still keep the map entry class.
gc.collect()
message = messages['google.protobuf.python.internal.Factory1Message']()
message.ParseFromString(data.SerializeToString())
value = message.map_field
values = [
# The entry class will be created on demand in upb python.
value.GetEntryClass()(key=k, value=value[k]) for k in sorted(value)
]
gc.collect()
self.assertEqual(1, len(values))
self.assertEqual('hello', values[0].key)
self.assertEqual('welcome', values[0].value)

if __name__ == '__main__':
unittest.main()

0 comments on commit b2bc5de

Please sign in to comment.