all: tests, tweaks for lazy extension decoding
Add a test to confirm that extensions are lazily decoded when we expect.
Drop the UnmarshalDefaultResolver flag. I added it thinking for some
reason that internal/impl couldn't depend on protoregistry; since it can
(and does), it's simpler to just test if the resolver is the expected
value.
Use a default set of options when lazily unmarshaling extensions.
Change-Id: Ied7666ffdc3bf90630260a80c9568d9a945048bc
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/218038
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/impl/lazy_test.go b/internal/impl/lazy_test.go
new file mode 100644
index 0000000..3a52f87
--- /dev/null
+++ b/internal/impl/lazy_test.go
@@ -0,0 +1,52 @@
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package impl_test
+
+import (
+ "testing"
+
+ "google.golang.org/protobuf/internal/flags"
+ "google.golang.org/protobuf/internal/impl"
+ "google.golang.org/protobuf/internal/protobuild"
+ "google.golang.org/protobuf/proto"
+
+ testpb "google.golang.org/protobuf/internal/testprotos/test"
+)
+
+func TestLazyExtensions(t *testing.T) {
+ checkLazy := func(when string, m *testpb.TestAllExtensions, want bool) {
+ xd := testpb.E_OptionalNestedMessage.TypeDescriptor()
+ if got := impl.IsLazy(m.ProtoReflect(), xd); got != want {
+ t.Errorf("%v: m.optional_nested_message lazy=%v, want %v", when, got, want)
+ }
+ e := proto.GetExtension(m, testpb.E_OptionalNestedMessage).(*testpb.TestAllExtensions_NestedMessage).Corecursive
+ if got := impl.IsLazy(e.ProtoReflect(), xd); got != want {
+ t.Errorf("%v: m.optional_nested_message.corecursive.optional_nested_message lazy=%v, want %v", when, got, want)
+ }
+ }
+
+ m1 := &testpb.TestAllExtensions{}
+ protobuild.Message{
+ "optional_nested_message": protobuild.Message{
+ "a": 1,
+ "corecursive": protobuild.Message{
+ "optional_nested_message": protobuild.Message{
+ "a": 2,
+ },
+ },
+ },
+ }.Build(m1.ProtoReflect())
+ checkLazy("before unmarshal", m1, false)
+
+ w, err := proto.Marshal(m1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ m := &testpb.TestAllExtensions{}
+ if err := proto.Unmarshal(w, m); err != nil {
+ t.Fatal(err)
+ }
+ checkLazy("after unmarshal", m, flags.LazyUnmarshalExtensions)
+}