blob: e38b76d27bd91c181f981150fe8ca28a665e7c6b [file] [log] [blame]
Damien Neil4686e232019-04-05 13:31:40 -07001// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style.
3// license that can be found in the LICENSE file.
4
5package proto_test
6
7import (
8 "fmt"
Joe Tsai09217f02019-09-06 16:57:46 -07009 "strings"
Damien Neil4686e232019-04-05 13:31:40 -070010 "testing"
11
Joe Tsai74b14602020-01-06 15:44:09 -080012 "google.golang.org/protobuf/encoding/prototext"
Joe Tsai6e095992019-08-10 13:56:36 -070013 "google.golang.org/protobuf/internal/flags"
Damien Neile89e6242019-05-13 23:55:40 -070014 "google.golang.org/protobuf/proto"
Damien Neil4686e232019-04-05 13:31:40 -070015
Damien Neile89e6242019-05-13 23:55:40 -070016 testpb "google.golang.org/protobuf/internal/testprotos/test"
Joe Tsai6e095992019-08-10 13:56:36 -070017 weakpb "google.golang.org/protobuf/internal/testprotos/test/weak1"
Damien Neil4686e232019-04-05 13:31:40 -070018)
19
20func TestIsInitializedErrors(t *testing.T) {
Joe Tsai6e095992019-08-10 13:56:36 -070021 type test struct {
Damien Neil4686e232019-04-05 13:31:40 -070022 m proto.Message
23 want string
Joe Tsai6e095992019-08-10 13:56:36 -070024 skip bool
25 }
26 tests := []test{{
27 m: &testpb.TestRequired{},
28 want: `goproto.proto.test.TestRequired.required_field`,
29 }, {
30 m: &testpb.TestRequiredForeign{
31 OptionalMessage: &testpb.TestRequired{},
Damien Neil4686e232019-04-05 13:31:40 -070032 },
Joe Tsai6e095992019-08-10 13:56:36 -070033 want: `goproto.proto.test.TestRequired.required_field`,
34 }, {
35 m: &testpb.TestRequiredForeign{
36 RepeatedMessage: []*testpb.TestRequired{
37 {RequiredField: proto.Int32(1)},
38 {},
Damien Neil4686e232019-04-05 13:31:40 -070039 },
Damien Neil4686e232019-04-05 13:31:40 -070040 },
Joe Tsai6e095992019-08-10 13:56:36 -070041 want: `goproto.proto.test.TestRequired.required_field`,
42 }, {
43 m: &testpb.TestRequiredForeign{
44 MapMessage: map[int32]*testpb.TestRequired{
45 1: {},
Damien Neil4686e232019-04-05 13:31:40 -070046 },
Damien Neil4686e232019-04-05 13:31:40 -070047 },
Joe Tsai6e095992019-08-10 13:56:36 -070048 want: `goproto.proto.test.TestRequired.required_field`,
49 }, {
50 m: &testpb.TestWeak{},
51 want: `<nil>`,
52 skip: !flags.ProtoLegacy,
53 }, {
54 m: func() proto.Message {
55 m := &testpb.TestWeak{}
56 m.SetWeakMessage1(&weakpb.WeakImportMessage1{})
57 return m
58 }(),
59 want: `goproto.proto.test.weak.WeakImportMessage1.a`,
60 skip: !flags.ProtoLegacy,
61 }, {
62 m: func() proto.Message {
63 m := &testpb.TestWeak{}
64 m.SetWeakMessage1(&weakpb.WeakImportMessage1{
65 A: proto.Int32(1),
66 })
67 return m
68 }(),
69 want: `<nil>`,
70 skip: !flags.ProtoLegacy,
71 }}
72
73 for _, tt := range tests {
74 t.Run("", func(t *testing.T) {
75 if tt.skip {
76 t.SkipNow()
77 }
78
79 err := proto.IsInitialized(tt.m)
80 got := "<nil>"
81 if err != nil {
82 got = fmt.Sprintf("%q", err)
83 }
84 if !strings.Contains(got, tt.want) {
Joe Tsai74b14602020-01-06 15:44:09 -080085 t.Errorf("IsInitialized(m):\n got: %v\nwant contains: %v\nMessage:\n%v", got, tt.want, prototext.Format(tt.m))
Joe Tsai6e095992019-08-10 13:56:36 -070086 }
87 })
Damien Neil4686e232019-04-05 13:31:40 -070088 }
89}