2121#include < vector>
2222
2323#include " google/protobuf/api.pb.h"
24+ #include " google/protobuf/empty.pb.h"
2425#include " google/protobuf/arena.h"
2526#include " absl/status/status.h"
2627#include " absl/strings/escaping.h"
3637#include " eval/public/cel_value.h"
3738#include " eval/public/containers/container_backed_list_impl.h"
3839#include " eval/public/containers/container_backed_map_impl.h"
40+ #include " eval/public/message_wrapper.h"
3941#include " eval/public/structs/cel_proto_wrapper.h"
42+ #include " eval/public/structs/trivial_legacy_type_info.h"
4043#include " eval/public/unknown_set.h"
4144#include " extensions/protobuf/memory_manager.h"
4245#include " extensions/protobuf/type_provider.h"
@@ -49,6 +52,7 @@ namespace {
4952using ::google::api::expr::runtime::CelProtoWrapper;
5053using ::google::api::expr::runtime::CelValue;
5154using ::google::api::expr::runtime::ContainerBackedListImpl;
55+ using ::google::api::expr::runtime::MessageWrapper;
5256using ::google::api::expr::runtime::UnknownSet;
5357using testing::Eq;
5458using testing::HasSubstr;
@@ -763,6 +767,38 @@ TEST(ValueInterop, StructFromLegacy) {
763767 value_wrapper.legacy_type_info ());
764768}
765769
770+ TEST (ValueInterop, StructFromLegacyMessageLite) {
771+ google::protobuf::Arena arena;
772+ extensions::ProtoMemoryManager memory_manager (&arena);
773+ TypeFactory type_factory (memory_manager);
774+ TypeManager type_manager (type_factory, TypeProvider::Builtin ());
775+ ValueFactory value_factory (type_manager);
776+ google::protobuf::Empty opaque;
777+ MessageWrapper wrapper (
778+ static_cast <const google::protobuf::MessageLite*>(&opaque),
779+ google::api::expr::runtime::TrivialTypeInfo::GetInstance ());
780+ CelValue legacy_value = CelValue::CreateMessageWrapper (wrapper);
781+ ASSERT_OK_AND_ASSIGN (auto value, FromLegacyValue (&arena, legacy_value));
782+ EXPECT_EQ (value->kind (), Kind::kStruct );
783+ EXPECT_EQ (value->type ()->kind (), Kind::kStruct );
784+ EXPECT_EQ (value->type ()->name (), " opaque type" );
785+ EXPECT_THAT (
786+ value.As <StructValue>()->HasFieldByName (
787+ StructValue::HasFieldContext (type_manager), " name" ),
788+ StatusIs (absl::StatusCode::kNotFound , HasSubstr (" no_such_field" )));
789+ EXPECT_THAT (value.As <StructValue>()->HasFieldByNumber (
790+ StructValue::HasFieldContext (type_manager), 1 ),
791+ StatusIs (absl::StatusCode::kUnimplemented ));
792+ EXPECT_EQ (value.As <StructValue>()->DebugString (), " opaque type" );
793+ auto value_wrapper = LegacyStructValueAccess::ToMessageWrapper (
794+ *value.As <base_internal::LegacyStructValue>());
795+ auto legacy_value_wrapper = legacy_value.MessageWrapperOrDie ();
796+ EXPECT_EQ (legacy_value_wrapper.HasFullProto (), value_wrapper.HasFullProto ());
797+ EXPECT_EQ (legacy_value_wrapper.message_ptr (), value_wrapper.message_ptr ());
798+ EXPECT_EQ (legacy_value_wrapper.legacy_type_info (),
799+ value_wrapper.legacy_type_info ());
800+ }
801+
766802TEST (ValueInterop, LegacyStructRoundtrip) {
767803 google::protobuf::Arena arena;
768804 extensions::ProtoMemoryManager memory_manager (&arena);
0 commit comments