From b4fbcaf1ddf85fc6b79b2824aa9e2aba3861a864 Mon Sep 17 00:00:00 2001 From: Antoine Pietri Date: Tue, 4 Aug 2026 06:06:57 -0700 Subject: [PATCH] Add unit test for cel::Value::WrapField with dynamic message extension fields. Adds TEST(Value, WrapDynamicExtensionMessageField) to value_test.cc to verify that wrapping a dynamic extension message field on a compiled C++ GeneratedMessage using cel::Value::WrapField succeeds when message_factory is passed to GetMessage. PiperOrigin-RevId: 958977840 --- common/BUILD | 1 + common/value_test.cc | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/common/BUILD b/common/BUILD index 937a27f45..eb08dfcc3 100644 --- a/common/BUILD +++ b/common/BUILD @@ -885,6 +885,7 @@ cc_test( "@com_google_absl//absl/strings:string_view", "@com_google_absl//absl/time", "@com_google_absl//absl/types:optional", + "@com_google_cel_spec//proto/cel/expr/conformance/proto2:test_all_types_cc_proto", "@com_google_cel_spec//proto/cel/expr/conformance/proto3:test_all_types_cc_proto", "@com_google_protobuf//:protobuf", "@com_google_protobuf//:struct_cc_proto", diff --git a/common/value_test.cc b/common/value_test.cc index 40ca590b0..56cd5252b 100644 --- a/common/value_test.cc +++ b/common/value_test.cc @@ -28,9 +28,11 @@ #include "internal/testing.h" #include "internal/testing_descriptor_pool.h" #include "internal/testing_message_factory.h" +#include "cel/expr/conformance/proto2/test_all_types.pb.h" #include "cel/expr/conformance/proto3/test_all_types.pb.h" #include "google/protobuf/arena.h" #include "google/protobuf/descriptor.h" +#include "google/protobuf/dynamic_message.h" #include "google/protobuf/generated_enum_reflection.h" namespace cel { @@ -973,6 +975,43 @@ TEST(Value, NumericHeterogeneousEquality) { EXPECT_NE(DoubleValue(1), UintValue(2)); } +TEST(Value, WrapDynamicExtensionMessageField) { + google::protobuf::DescriptorPool pool(google::protobuf::DescriptorPool::generated_pool()); + google::protobuf::FileDescriptorProto file_proto; + file_proto.set_name("dynamic_extension.proto"); + file_proto.set_package("cel.expr.conformance.proto2"); + file_proto.add_dependency( + cel::expr::conformance::proto2::TestAllTypes::descriptor() + ->file() + ->name()); + + auto* msg_type = file_proto.add_message_type(); + msg_type->set_name("DynamicExtensionMessage"); + + auto* ext = file_proto.add_extension(); + ext->set_name("dynamic_ext"); + ext->set_number(1000); + ext->set_label(google::protobuf::FieldDescriptorProto::LABEL_OPTIONAL); + ext->set_type(google::protobuf::FieldDescriptorProto::TYPE_MESSAGE); + ext->set_type_name(".cel.expr.conformance.proto2.DynamicExtensionMessage"); + ext->set_extendee( + cel::expr::conformance::proto2::TestAllTypes::descriptor()->full_name()); + + const google::protobuf::FileDescriptor* file_desc = pool.BuildFile(file_proto); + ASSERT_NE(file_desc, nullptr); + + const google::protobuf::FieldDescriptor* ext_desc = + pool.FindExtensionByName("cel.expr.conformance.proto2.dynamic_ext"); + ASSERT_NE(ext_desc, nullptr); + + google::protobuf::DynamicMessageFactory dynamic_factory(&pool); + google::protobuf::Arena arena; + cel::expr::conformance::proto2::TestAllTypes test_msg; + Value val = + Value::WrapField(&test_msg, ext_desc, &pool, &dynamic_factory, &arena); + EXPECT_TRUE(val.IsMessage()); +} + using ValueIteratorTest = common_internal::ValueTest<>; TEST_F(ValueIteratorTest, Empty) {