blob: 6a3a8c9a5f55f84e7685ffb51991c5305d58b972 [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 Tsai6e095992019-08-10 13:56:36 -070012 "google.golang.org/protobuf/internal/flags"
Damien Neile89e6242019-05-13 23:55:40 -070013 "google.golang.org/protobuf/proto"
Damien Neil4686e232019-04-05 13:31:40 -070014
Damien Neile89e6242019-05-13 23:55:40 -070015 testpb "google.golang.org/protobuf/internal/testprotos/test"
Joe Tsai6e095992019-08-10 13:56:36 -070016 weakpb "google.golang.org/protobuf/internal/testprotos/test/weak1"
Damien Neil4686e232019-04-05 13:31:40 -070017)
18
19func TestIsInitializedErrors(t *testing.T) {
Joe Tsai6e095992019-08-10 13:56:36 -070020 type test struct {
Damien Neil4686e232019-04-05 13:31:40 -070021 m proto.Message
22 want string
Joe Tsai6e095992019-08-10 13:56:36 -070023 skip bool
24 }
25 tests := []test{{
26 m: &testpb.TestRequired{},
27 want: `goproto.proto.test.TestRequired.required_field`,
28 }, {
29 m: &testpb.TestRequiredForeign{
30 OptionalMessage: &testpb.TestRequired{},
Damien Neil4686e232019-04-05 13:31:40 -070031 },
Joe Tsai6e095992019-08-10 13:56:36 -070032 want: `goproto.proto.test.TestRequired.required_field`,
33 }, {
34 m: &testpb.TestRequiredForeign{
35 RepeatedMessage: []*testpb.TestRequired{
36 {RequiredField: proto.Int32(1)},
37 {},
Damien Neil4686e232019-04-05 13:31:40 -070038 },
Damien Neil4686e232019-04-05 13:31:40 -070039 },
Joe Tsai6e095992019-08-10 13:56:36 -070040 want: `goproto.proto.test.TestRequired.required_field`,
41 }, {
42 m: &testpb.TestRequiredForeign{
43 MapMessage: map[int32]*testpb.TestRequired{
44 1: {},
Damien Neil4686e232019-04-05 13:31:40 -070045 },
Damien Neil4686e232019-04-05 13:31:40 -070046 },
Joe Tsai6e095992019-08-10 13:56:36 -070047 want: `goproto.proto.test.TestRequired.required_field`,
48 }, {
49 m: &testpb.TestWeak{},
50 want: `<nil>`,
51 skip: !flags.ProtoLegacy,
52 }, {
53 m: func() proto.Message {
54 m := &testpb.TestWeak{}
55 m.SetWeakMessage1(&weakpb.WeakImportMessage1{})
56 return m
57 }(),
58 want: `goproto.proto.test.weak.WeakImportMessage1.a`,
59 skip: !flags.ProtoLegacy,
60 }, {
61 m: func() proto.Message {
62 m := &testpb.TestWeak{}
63 m.SetWeakMessage1(&weakpb.WeakImportMessage1{
64 A: proto.Int32(1),
65 })
66 return m
67 }(),
68 want: `<nil>`,
69 skip: !flags.ProtoLegacy,
70 }}
71
72 for _, tt := range tests {
73 t.Run("", func(t *testing.T) {
74 if tt.skip {
75 t.SkipNow()
76 }
77
78 err := proto.IsInitialized(tt.m)
79 got := "<nil>"
80 if err != nil {
81 got = fmt.Sprintf("%q", err)
82 }
83 if !strings.Contains(got, tt.want) {
84 t.Errorf("IsInitialized(m):\n got: %v\nwant contains: %v\nMessage:\n%v", got, tt.want, marshalText(tt.m))
85 }
86 })
Damien Neil4686e232019-04-05 13:31:40 -070087 }
88}