blob: 13a2c6d5bad0ee58148b4fb3fedcf38ef163f196 [file] [log] [blame]
Joe Tsai62517cc2018-12-04 14:00:01 -08001// Copyright 2018 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
Joe Tsai21ade492019-05-22 13:42:54 -04005package impl_test
Joe Tsai62517cc2018-12-04 14:00:01 -08006
7import (
Joe Tsai0fc49f82019-05-01 12:29:25 -07008 "reflect"
Joe Tsai62517cc2018-12-04 14:00:01 -08009 "testing"
10
Damien Neile89e6242019-05-13 23:55:40 -070011 pimpl "google.golang.org/protobuf/internal/impl"
Damien Neile89e6242019-05-13 23:55:40 -070012 ptype "google.golang.org/protobuf/internal/prototype"
13 pref "google.golang.org/protobuf/reflect/protoreflect"
14 piface "google.golang.org/protobuf/runtime/protoiface"
Joe Tsai62517cc2018-12-04 14:00:01 -080015
Damien Neile89e6242019-05-13 23:55:40 -070016 proto2_20180125 "google.golang.org/protobuf/internal/testprotos/legacy/proto2.v1.0.0-20180125-92554152"
Joe Tsai62517cc2018-12-04 14:00:01 -080017)
18
Joe Tsai21ade492019-05-22 13:42:54 -040019type legacyExtendedMessage struct {
Joe Tsai4fddeba2019-03-20 18:29:32 -070020 XXX_unrecognized []byte
Joe Tsai00e50dc2019-04-16 12:39:41 -070021 XXX_InternalExtensions map[int32]pimpl.ExtensionFieldV1
Joe Tsai62517cc2018-12-04 14:00:01 -080022}
23
Joe Tsai21ade492019-05-22 13:42:54 -040024func (*legacyExtendedMessage) Reset() {}
25func (*legacyExtendedMessage) String() string { return "" }
26func (*legacyExtendedMessage) ProtoMessage() {}
27func (*legacyExtendedMessage) ExtensionRangeArray() []piface.ExtensionRangeV1 {
Joe Tsai4fddeba2019-03-20 18:29:32 -070028 return []piface.ExtensionRangeV1{{Start: 10000, End: 20000}}
Joe Tsai62517cc2018-12-04 14:00:01 -080029}
30
31func mustMakeExtensionType(x *ptype.StandaloneExtension, v interface{}) pref.ExtensionType {
32 xd, err := ptype.NewExtension(x)
33 if err != nil {
Joe Tsai0fc49f82019-05-01 12:29:25 -070034 panic(err)
Joe Tsai62517cc2018-12-04 14:00:01 -080035 }
Joe Tsai21ade492019-05-22 13:42:54 -040036 return pimpl.LegacyExtensionTypeOf(xd, reflect.TypeOf(v))
Joe Tsai62517cc2018-12-04 14:00:01 -080037}
38
39var (
Joe Tsai21ade492019-05-22 13:42:54 -040040 extParentDesc = pimpl.Export{}.MessageDescriptorOf((*legacyExtendedMessage)(nil))
41 extMessageV1Desc = pimpl.Export{}.MessageDescriptorOf((*proto2_20180125.Message_ChildMessage)(nil))
Joe Tsai62517cc2018-12-04 14:00:01 -080042
43 wantType = mustMakeExtensionType(&ptype.StandaloneExtension{
44 FullName: "fizz.buzz.optional_message_v1",
45 Number: 10007,
46 Cardinality: pref.Optional,
47 Kind: pref.MessageKind,
Joe Tsai21ade492019-05-22 13:42:54 -040048 MessageType: extMessageV1Desc,
49 ExtendedType: extParentDesc,
Joe Tsai62517cc2018-12-04 14:00:01 -080050 }, (*proto2_20180125.Message_ChildMessage)(nil))
Joe Tsai4fddeba2019-03-20 18:29:32 -070051 wantDesc = &piface.ExtensionDescV1{
Joe Tsai21ade492019-05-22 13:42:54 -040052 ExtendedType: (*legacyExtendedMessage)(nil),
Joe Tsai62517cc2018-12-04 14:00:01 -080053 ExtensionType: (*proto2_20180125.Message_ChildMessage)(nil),
54 Field: 10007,
55 Name: "fizz.buzz.optional_message_v1",
56 Tag: "bytes,10007,opt,name=optional_message_v1",
57 }
58)
59
60func BenchmarkConvert(b *testing.B) {
61 b.ReportAllocs()
62 for i := 0; i < b.N; i++ {
Joe Tsai21ade492019-05-22 13:42:54 -040063 xd := pimpl.Export{}.ExtensionDescFromType(wantType)
64 gotType := pimpl.Export{}.ExtensionTypeFromDesc(xd)
Joe Tsai62517cc2018-12-04 14:00:01 -080065 if gotType != wantType {
66 b.Fatalf("ExtensionType mismatch: got %p, want %p", gotType, wantType)
67 }
68
Joe Tsai21ade492019-05-22 13:42:54 -040069 xt := pimpl.Export{}.ExtensionTypeFromDesc(wantDesc)
70 gotDesc := pimpl.Export{}.ExtensionDescFromType(xt)
Joe Tsai62517cc2018-12-04 14:00:01 -080071 if gotDesc != wantDesc {
72 b.Fatalf("ExtensionDesc mismatch: got %p, want %p", gotDesc, wantDesc)
73 }
74 }
75}