From adb7c602d7e5762bd385cb0282dec3b323de25ac Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Thu, 25 Apr 2024 15:13:10 +0300 Subject: [PATCH] [#77] protogen: Initial implementation Signed-off-by: Evgenii Stratonikov --- Makefile | 11 +- accounting/grpc/service.go | 46 -- accounting/grpc/service.pb.go | Bin 18996 -> 0 bytes accounting/grpc/service_frostfs.pb.go | Bin 0 -> 18600 bytes accounting/grpc/service_frostfs_fuzz.go | 45 ++ accounting/grpc/service_frostfs_test.go | 31 + accounting/grpc/types.go | 11 - accounting/grpc/types.pb.go | Bin 6048 -> 0 bytes accounting/grpc/types_frostfs.pb.go | Bin 0 -> 3764 bytes accounting/grpc/types_frostfs_fuzz.go | 26 + accounting/grpc/types_frostfs_test.go | 21 + acl/convert.go | 2 +- acl/grpc/types.go | 193 ------ acl/grpc/types.pb.go | Bin 44095 -> 0 bytes acl/grpc/types_frostfs.pb.go | Bin 0 -> 45693 bytes acl/grpc/types_frostfs_fuzz.go | 64 ++ acl/grpc/types_frostfs_test.go | 41 ++ ape/grpc/types.go | 21 - ape/grpc/types.pb.go | Bin 9385 -> 0 bytes ape/grpc/types_frostfs.pb.go | Bin 0 -> 8262 bytes ape/grpc/types_frostfs_fuzz.go | 45 ++ ape/grpc/types_frostfs_test.go | 31 + apemanager/grpc/service.go | 106 --- apemanager/grpc/service.pb.go | Bin 46394 -> 0 bytes apemanager/grpc/service_frostfs.pb.go | Bin 0 -> 56057 bytes apemanager/grpc/service_frostfs_fuzz.go | 121 ++++ apemanager/grpc/service_frostfs_test.go | 71 ++ container/grpc/service.go | 234 ------- container/grpc/service.pb.go | Bin 79297 -> 0 bytes container/grpc/service_frostfs.pb.go | Bin 0 -> 96320 bytes container/grpc/service_frostfs_fuzz.go | 197 ++++++ container/grpc/service_frostfs_test.go | 111 ++++ container/grpc/types.go | 46 -- container/grpc/types.pb.go | Bin 13491 -> 0 bytes container/grpc/types_frostfs.pb.go | Bin 0 -> 11604 bytes container/grpc/types_frostfs_fuzz.go | 26 + container/grpc/types_frostfs_test.go | 21 + go.mod | 3 + go.sum | 6 + lock/grpc/types.go | 8 - lock/grpc/types.pb.go | Bin 5770 -> 0 bytes lock/grpc/types_frostfs.pb.go | Bin 0 -> 3844 bytes lock/grpc/types_frostfs_fuzz.go | 26 + lock/grpc/types_frostfs_test.go | 21 + netmap/grpc/service.go | 116 ---- netmap/grpc/service.pb.go | Bin 46017 -> 0 bytes netmap/grpc/service_frostfs.pb.go | Bin 0 -> 54189 bytes netmap/grpc/service_frostfs_fuzz.go | 121 ++++ netmap/grpc/service_frostfs_test.go | 71 ++ netmap/grpc/types.go | 212 ------ netmap/grpc/types.pb.go | Bin 47747 -> 0 bytes netmap/grpc/types_frostfs.pb.go | Bin 0 -> 53375 bytes netmap/grpc/types_frostfs_fuzz.go | 159 +++++ netmap/grpc/types_frostfs_test.go | 91 +++ object/convert.go | 2 +- object/grpc/service.go | 610 ------------------ object/grpc/service.pb.go | Bin 167583 -> 0 bytes object/grpc/service_frostfs.pb.go | Bin 0 -> 217679 bytes object/grpc/service_frostfs_fuzz.go | 387 +++++++++++ object/grpc/service_frostfs_test.go | 211 ++++++ object/grpc/service_grpc.pb.go | Bin 46612 -> 46612 bytes object/grpc/status.pb.go | Bin 8502 -> 0 bytes object/grpc/types.go | 197 ------ object/grpc/types.pb.go | Bin 52664 -> 0 bytes object/grpc/types_frostfs.pb.go | Bin 0 -> 60923 bytes object/grpc/types_frostfs_fuzz.go | 102 +++ object/grpc/types_frostfs_test.go | 61 ++ refs/grpc/types.go | 97 --- refs/grpc/types.pb.go | Bin 27241 -> 0 bytes refs/grpc/types_frostfs.pb.go | Bin 0 -> 28706 bytes refs/grpc/types_frostfs_fuzz.go | 159 +++++ refs/grpc/types_frostfs_test.go | 91 +++ rpc/client/client.go | 2 + rpc/message/encoding.go | 20 +- rpc/netmap.go | 1 - session/convert.go | 2 +- session/grpc/service.go | 55 -- session/grpc/service.pb.go | Bin 18263 -> 0 bytes session/grpc/service_frostfs.pb.go | Bin 0 -> 19354 bytes session/grpc/service_frostfs_fuzz.go | 45 ++ session/grpc/service_frostfs_test.go | 31 + session/grpc/types.go | 246 ------- session/grpc/types.pb.go | Bin 57288 -> 0 bytes session/grpc/types_frostfs.pb.go | Bin 0 -> 66825 bytes session/grpc/types_frostfs_fuzz.go | 159 +++++ session/grpc/types_frostfs_test.go | 91 +++ status/grpc/types.go | 26 - status/grpc/types.pb.go | Bin 24204 -> 0 bytes status/grpc/types_frostfs.pb.go | Bin 0 -> 13491 bytes status/grpc/types_frostfs_fuzz.go | 26 + status/grpc/types_frostfs_test.go | 21 + tombstone/grpc/types.go | 20 - tombstone/grpc/types.pb.go | Bin 7276 -> 0 bytes tombstone/grpc/types_frostfs.pb.go | Bin 0 -> 5309 bytes tombstone/grpc/types_frostfs_fuzz.go | 26 + tombstone/grpc/types_frostfs_test.go | 21 + util/pool/marshal.go | 7 + util/proto/encoding/compat.go | 22 + util/proto/encoding/json.go | 48 ++ util/proto/encoding/proto.go | 57 ++ util/proto/marshal.go | 13 +- util/proto/marshal_test.go | 103 +-- util/proto/test/custom/test_frostfs.pb.go | Bin 0 -> 19076 bytes util/proto/test/test_frostfs.pb.go | Bin 3980 -> 0 bytes util/protogen/internalgengo/file.go | 250 +++++++ util/protogen/internalgengo/fuzz.go | 69 ++ util/protogen/internalgengo/getter.go | 14 + util/protogen/internalgengo/json.go | 230 +++++++ util/protogen/internalgengo/options.go | 7 + util/protogen/internalgengo/proto.go | 201 ++++++ .../internalgengo/proto_field_type.go | 56 ++ .../internalgengo/proto_stable_compat.go | 124 ++++ util/protogen/internalgengo/writer.go | 30 + util/protogen/main.go | 265 +------- util/signature/data.go | 18 +- 115 files changed, 4012 insertions(+), 2566 deletions(-) delete mode 100644 accounting/grpc/service.go delete mode 100644 accounting/grpc/service.pb.go create mode 100644 accounting/grpc/service_frostfs.pb.go create mode 100644 accounting/grpc/service_frostfs_fuzz.go create mode 100644 accounting/grpc/service_frostfs_test.go delete mode 100644 accounting/grpc/types.go delete mode 100644 accounting/grpc/types.pb.go create mode 100644 accounting/grpc/types_frostfs.pb.go create mode 100644 accounting/grpc/types_frostfs_fuzz.go create mode 100644 accounting/grpc/types_frostfs_test.go delete mode 100644 acl/grpc/types.go delete mode 100644 acl/grpc/types.pb.go create mode 100644 acl/grpc/types_frostfs.pb.go create mode 100644 acl/grpc/types_frostfs_fuzz.go create mode 100644 acl/grpc/types_frostfs_test.go delete mode 100644 ape/grpc/types.go delete mode 100644 ape/grpc/types.pb.go create mode 100644 ape/grpc/types_frostfs.pb.go create mode 100644 ape/grpc/types_frostfs_fuzz.go create mode 100644 ape/grpc/types_frostfs_test.go delete mode 100644 apemanager/grpc/service.go delete mode 100644 apemanager/grpc/service.pb.go create mode 100644 apemanager/grpc/service_frostfs.pb.go create mode 100644 apemanager/grpc/service_frostfs_fuzz.go create mode 100644 apemanager/grpc/service_frostfs_test.go delete mode 100644 container/grpc/service.go delete mode 100644 container/grpc/service.pb.go create mode 100644 container/grpc/service_frostfs.pb.go create mode 100644 container/grpc/service_frostfs_fuzz.go create mode 100644 container/grpc/service_frostfs_test.go delete mode 100644 container/grpc/types.go delete mode 100644 container/grpc/types.pb.go create mode 100644 container/grpc/types_frostfs.pb.go create mode 100644 container/grpc/types_frostfs_fuzz.go create mode 100644 container/grpc/types_frostfs_test.go delete mode 100644 lock/grpc/types.go delete mode 100644 lock/grpc/types.pb.go create mode 100644 lock/grpc/types_frostfs.pb.go create mode 100644 lock/grpc/types_frostfs_fuzz.go create mode 100644 lock/grpc/types_frostfs_test.go delete mode 100644 netmap/grpc/service.go delete mode 100644 netmap/grpc/service.pb.go create mode 100644 netmap/grpc/service_frostfs.pb.go create mode 100644 netmap/grpc/service_frostfs_fuzz.go create mode 100644 netmap/grpc/service_frostfs_test.go delete mode 100644 netmap/grpc/types.go delete mode 100644 netmap/grpc/types.pb.go create mode 100644 netmap/grpc/types_frostfs.pb.go create mode 100644 netmap/grpc/types_frostfs_fuzz.go create mode 100644 netmap/grpc/types_frostfs_test.go delete mode 100644 object/grpc/service.go delete mode 100644 object/grpc/service.pb.go create mode 100644 object/grpc/service_frostfs.pb.go create mode 100644 object/grpc/service_frostfs_fuzz.go create mode 100644 object/grpc/service_frostfs_test.go delete mode 100644 object/grpc/status.pb.go delete mode 100644 object/grpc/types.go delete mode 100644 object/grpc/types.pb.go create mode 100644 object/grpc/types_frostfs.pb.go create mode 100644 object/grpc/types_frostfs_fuzz.go create mode 100644 object/grpc/types_frostfs_test.go delete mode 100644 refs/grpc/types.go delete mode 100644 refs/grpc/types.pb.go create mode 100644 refs/grpc/types_frostfs.pb.go create mode 100644 refs/grpc/types_frostfs_fuzz.go create mode 100644 refs/grpc/types_frostfs_test.go delete mode 100644 session/grpc/service.go delete mode 100644 session/grpc/service.pb.go create mode 100644 session/grpc/service_frostfs.pb.go create mode 100644 session/grpc/service_frostfs_fuzz.go create mode 100644 session/grpc/service_frostfs_test.go delete mode 100644 session/grpc/types.go delete mode 100644 session/grpc/types.pb.go create mode 100644 session/grpc/types_frostfs.pb.go create mode 100644 session/grpc/types_frostfs_fuzz.go create mode 100644 session/grpc/types_frostfs_test.go delete mode 100644 status/grpc/types.go delete mode 100644 status/grpc/types.pb.go create mode 100644 status/grpc/types_frostfs.pb.go create mode 100644 status/grpc/types_frostfs_fuzz.go create mode 100644 status/grpc/types_frostfs_test.go delete mode 100644 tombstone/grpc/types.go delete mode 100644 tombstone/grpc/types.pb.go create mode 100644 tombstone/grpc/types_frostfs.pb.go create mode 100644 tombstone/grpc/types_frostfs_fuzz.go create mode 100644 tombstone/grpc/types_frostfs_test.go create mode 100644 util/pool/marshal.go create mode 100644 util/proto/encoding/compat.go create mode 100644 util/proto/encoding/json.go create mode 100644 util/proto/encoding/proto.go create mode 100644 util/proto/test/custom/test_frostfs.pb.go delete mode 100644 util/proto/test/test_frostfs.pb.go create mode 100644 util/protogen/internalgengo/file.go create mode 100644 util/protogen/internalgengo/fuzz.go create mode 100644 util/protogen/internalgengo/getter.go create mode 100644 util/protogen/internalgengo/json.go create mode 100644 util/protogen/internalgengo/options.go create mode 100644 util/protogen/internalgengo/proto.go create mode 100644 util/protogen/internalgengo/proto_field_type.go create mode 100644 util/protogen/internalgengo/proto_stable_compat.go create mode 100644 util/protogen/internalgengo/writer.go diff --git a/Makefile b/Makefile index 19b3138..7ed6954 100755 --- a/Makefile +++ b/Makefile @@ -61,12 +61,13 @@ protoc: make protoc-install; \ fi # Protoc generate - @for f in `find . -type f -name '*.proto' -not -path './bin/*'`; do \ + @for f in `find . -type f -name '*.proto' -not -path './bin/*' -not -path './util/proto/test/*'`; do \ echo "⇒ Processing $$f "; \ $(PROTOC_DIR)/bin/protoc \ --proto_path=.:$(PROTOC_DIR)/include:/usr/local/include \ - --plugin=protoc-gen-go=$(PROTOC_GEN_GO_DIR)/protoc-gen-go \ - --go_out=. --go_opt=paths=source_relative \ + --plugin=protoc-gen-go-frostfs=$(abspath ./bin/protogen) \ + --go-frostfs_out=fuzz=true:. \ + --go-frostfs_opt=paths=source_relative \ --go-grpc_opt=require_unimplemented_servers=false \ --go-grpc_out=. --go-grpc_opt=paths=source_relative $$f; \ done @@ -79,7 +80,9 @@ protogen: protoc-test: protoc protogen @$(PROTOC_DIR)/bin/protoc \ --plugin=protoc-gen-go-frostfs=$(abspath $(BIN)/protogen) \ - --go-frostfs_out=. --go-frostfs_opt=paths=source_relative \ + --go-frostfs_opt=Mutil/proto/test/test.proto=git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/proto/test/custom \ + --go-frostfs_opt=module=git.frostfs.info/TrueCloudLab/frostfs-api-go/v2 \ + --go-frostfs_out=. --go-frostfs_opt=paths=import \ ./util/proto/test/test.proto # Run Unit Test with go test diff --git a/accounting/grpc/service.go b/accounting/grpc/service.go deleted file mode 100644 index fa292bf..0000000 --- a/accounting/grpc/service.go +++ /dev/null @@ -1,46 +0,0 @@ -package accounting - -import ( - refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc" - session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session/grpc" -) - -// SetOwnerId sets identifier of the account owner. -func (m *BalanceRequest_Body) SetOwnerId(v *refs.OwnerID) { - m.OwnerId = v -} - -// SetBody sets body of the request. -func (m *BalanceRequest) SetBody(v *BalanceRequest_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the request. -func (m *BalanceRequest) SetMetaHeader(v *session.RequestMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (m *BalanceRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - m.VerifyHeader = v -} - -// SetBalance sets balance value of the response. -func (m *BalanceResponse_Body) SetBalance(v *Decimal) { - m.Balance = v -} - -// SetBody sets body of the response. -func (m *BalanceResponse) SetBody(v *BalanceResponse_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the response. -func (m *BalanceResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (m *BalanceResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - m.VerifyHeader = v -} diff --git a/accounting/grpc/service.pb.go b/accounting/grpc/service.pb.go deleted file mode 100644 index b66bb7a734180741951721c0c74c2469ab5ad97e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18996 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 WhH!ouk!E_o;|wAA4Nr8 zR#EATlQ-h^oA=_y$?1E)-=75Ghu}hrAPnj#xzaOWQyr_iN@BLZknHb0{%*PlR z(Z@l*7p0XL;D7k@qL_qYa1mF&SwGIAeDuDU%I8Tw9ls3DM|$K@Fo_|^X!dwi$fz6< zsb1k|_a#bMmT{h$RVI0!?7qmfijxtMLJro}b(bJbV-2II&sk<<7NPZm@~W2Wa(eEE zc{=(j4y(L~gIBUD;;n>qaNbSw_YxW4*yBK{!0$AerA4*uwW z>i1_sK@Rr2Fx&Otk`iA9MR^${kV=TB!aL|-H}tYN8MaA(%u-9dk(4CzU1s2?{@ae! zWo9Th2n-F5M&hgr&J%eS|5u7aR?{LYMRh4fNe}W!EJU2CgL^)WM3fh4Q2C%!q@?C) zAxkljt4l=}q*6q&OvYjsBru7%3}&((I*+rUfQ7KU-;btQD7=N})T$$yHxwQV6lc|t z%o>wmPoD}Xo<8=JMDLdjRbl0Vt8F%qpdvRW1VYWDy17#;q-_?~Th!{PNrRRV9b|H*G5w$Jhm;LG2iC z>C-=Do!-w@VzjjwR1t$E!_O~=kJ5K$-PbM-O>y3Ly zwBb+M$o9w>4Xrn`oergMZD>nmcz9(IT2p(nC_Z1r8qhkI7~VQ6Yp_Q1&1R4 zK#mOxZI%-}C5L8lA7GT_TqEezL{=@Rl2Y?w$yhWT0R0Tw$>iK~F9E}k)B|bkRKIO9 zl6v^pmLj_Zw2~c*@8(b)R%b?}Dg48a4mOBfaKrWI3g=wQ4_|NIV9*f9K*z9pVY`uC zxt-PAW=(GFoOWI4a@Gu!|2}*3dim@u-Dg`L7#)RZNs9U^D6$^)A(@l4bf)0{%n8Fs zsC8lD*9)X5O#N^U&1cw7Bri!Y&lzFJfst*?OZ5>BA9GCTkUla?G9Yd%A)1_eDYGxWI}Ei zXZ~r48>ry>7YC3ZyoOoft7JENR8!EC9;P6Im(x^^ImTfZ^z7_IJmJrdFW~WsOyX2K z0>%3W%t1eeg_z3+d8MWKF)M>es=$lH%Zq}flu!q8_&La`=XsK6%%(%wh8Q(Pn(AN- zCq(%*l~|61)`6awvx`!IH|{t%#sv15l2^gk>(OS6o)~Ds#8zUOUxXi&nRxLSJ%{3OILuS zsdh=TL}gDWt4>p{r21+Lnc==`7;;Z|`sRw~F;zUZ(``lbglJp`1eK1nPO0<`4t^G2 zWO7WA8VOmFl!9s|E(uE>;qcAXB$bZhG@=Pqyda&uK;amd_^YJaD#*aIUXH6ZT+~S3 z3<>52Ns`0w<=7OW?{wiBWLK1NA#PHI2J}c4K%VB8F%r~qjNBGUE)mZKp$K%TQmM-~ z5pWEYc$G}9Sj0CNDCTh~4;xjn78_TETGWz5Dq6CVnUTp>oI4c9jYzEkJ+B8_6-eVWV2omwS`i?v7mu^*-&WP*@6zbTX^b54KF@X?a82TMqyXMboQ1 z@+VUtcjScHE8U&zl+Bi1Sb_YAv+liC_`_xJ;I0<;Lvhn}Jzu77QBMyVKI&HVJh&u6 zcRA0ckQ3cZxy!&o9rRXma;B{3_gKLPik}-98yww%l{_1h)^mOG#XyUpuotgAICmef z*a4~_pQ9v`u7the6vU(fQqTjP9CsisxOIEvaTciHgV8n=$$SGS1p_ya8Mvv>#ol#N zvubFje(V$v9Z7UcM>SzxTUeLANliUrO}VFe@49lCHMHdpbm@!78x=!KZ|)NN(;R9w z{ODVIEfO{qHks*sOF(%K&c?z7V5&@QHlR-P)|>!<5rqfztLqpNtA(%6Dj{Giz&jSX z_CEvNb$IPs;p-K4P!_gO)6qr<@$BHtID%Ucz+E_B$saI zmasi{8%fxa*$v>?8OCXln1+~h)k||d%-CU7qq)sa z30t(_Ms1+EowQrx$E#^wb{2i!!1rs!lHDEd9Z^;;0B_c5v;*}nVQR~-e4Do3GIwh1 zZHd7hM9v!9S%P&wyD!EZ+XjTD?6neS(llQ~Ura+c_H5d!{7wT+&fa!`o0ReBn%OVn zq~ki@QFPf*A*-Gt4pV20z6f|i18dUm)i&1+fhdp$KO3L`N4p9TP*PD9YHqN#IDneI zGbaKBG$)kOMnxJ2PysIp+c#dy{QBzDSdd(bHE3Y2LTV7}!&POHqA^kmBF}ZJUg7RhvxQ zE6aWAK literal 0 HcmV?d00001 diff --git a/accounting/grpc/service_frostfs_fuzz.go b/accounting/grpc/service_frostfs_fuzz.go new file mode 100644 index 0000000..69e7174 --- /dev/null +++ b/accounting/grpc/service_frostfs_fuzz.go @@ -0,0 +1,45 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package accounting + +func DoFuzzProtoBalanceRequest(data []byte) int { + msg := new(BalanceRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONBalanceRequest(data []byte) int { + msg := new(BalanceRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoBalanceResponse(data []byte) int { + msg := new(BalanceResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONBalanceResponse(data []byte) int { + msg := new(BalanceResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} diff --git a/accounting/grpc/service_frostfs_test.go b/accounting/grpc/service_frostfs_test.go new file mode 100644 index 0000000..b97a13e --- /dev/null +++ b/accounting/grpc/service_frostfs_test.go @@ -0,0 +1,31 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package accounting + +import ( + testing "testing" +) + +func FuzzProtoBalanceRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoBalanceRequest(data) + }) +} +func FuzzJSONBalanceRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONBalanceRequest(data) + }) +} +func FuzzProtoBalanceResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoBalanceResponse(data) + }) +} +func FuzzJSONBalanceResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONBalanceResponse(data) + }) +} diff --git a/accounting/grpc/types.go b/accounting/grpc/types.go deleted file mode 100644 index 1c1bac9..0000000 --- a/accounting/grpc/types.go +++ /dev/null @@ -1,11 +0,0 @@ -package accounting - -// SetValue sets value of the decimal number. -func (m *Decimal) SetValue(v int64) { - m.Value = v -} - -// SetPrecision sets precision of the decimal number. -func (m *Decimal) SetPrecision(v uint32) { - m.Precision = v -} diff --git a/accounting/grpc/types.pb.go b/accounting/grpc/types.pb.go deleted file mode 100644 index 8be14bc55f8a0b938c02ae018306c084fd30867e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6048 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 literal 0 HcmV?d00001 diff --git a/ape/grpc/types_frostfs_fuzz.go b/ape/grpc/types_frostfs_fuzz.go new file mode 100644 index 0000000..b7bf367 --- /dev/null +++ b/ape/grpc/types_frostfs_fuzz.go @@ -0,0 +1,45 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package ape + +func DoFuzzProtoChainTarget(data []byte) int { + msg := new(ChainTarget) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONChainTarget(data []byte) int { + msg := new(ChainTarget) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoChain(data []byte) int { + msg := new(Chain) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONChain(data []byte) int { + msg := new(Chain) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} diff --git a/ape/grpc/types_frostfs_test.go b/ape/grpc/types_frostfs_test.go new file mode 100644 index 0000000..93d7eea --- /dev/null +++ b/ape/grpc/types_frostfs_test.go @@ -0,0 +1,31 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package ape + +import ( + testing "testing" +) + +func FuzzProtoChainTarget(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoChainTarget(data) + }) +} +func FuzzJSONChainTarget(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONChainTarget(data) + }) +} +func FuzzProtoChain(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoChain(data) + }) +} +func FuzzJSONChain(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONChain(data) + }) +} diff --git a/apemanager/grpc/service.go b/apemanager/grpc/service.go deleted file mode 100644 index bd77db0..0000000 --- a/apemanager/grpc/service.go +++ /dev/null @@ -1,106 +0,0 @@ -package apemanager - -import ( - ape "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape/grpc" - session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session/grpc" -) - -func (rb *AddChainRequest_Body) SetTarget(t *ape.ChainTarget) { - rb.Target = t -} - -func (rb *AddChainRequest_Body) SetChain(chain *ape.Chain) { - rb.Chain = chain -} - -func (r *AddChainRequest) SetBody(rb *AddChainRequest_Body) { - r.Body = rb -} - -func (r *AddChainRequest) SetMetaHeader(mh *session.RequestMetaHeader) { - r.MetaHeader = mh -} - -func (r *AddChainRequest) SetVerifyHeader(vh *session.RequestVerificationHeader) { - r.VerifyHeader = vh -} - -func (rb *AddChainResponse_Body) SetChainId(chainID []byte) { - rb.ChainId = chainID -} - -func (r *AddChainResponse) SetBody(rb *AddChainResponse_Body) { - r.Body = rb -} - -func (r *AddChainResponse) SetMetaHeader(mh *session.ResponseMetaHeader) { - r.MetaHeader = mh -} - -func (r *AddChainResponse) SetVerifyHeader(vh *session.ResponseVerificationHeader) { - r.VerifyHeader = vh -} - -func (rb *RemoveChainRequest_Body) SetTarget(t *ape.ChainTarget) { - rb.Target = t -} - -func (rb *RemoveChainRequest_Body) SetChainId(chainID []byte) { - rb.ChainId = chainID -} - -func (r *RemoveChainRequest) SetBody(rb *RemoveChainRequest_Body) { - r.Body = rb -} - -func (r *RemoveChainRequest) SetMetaHeader(mh *session.RequestMetaHeader) { - r.MetaHeader = mh -} - -func (r *RemoveChainRequest) SetVerifyHeader(vh *session.RequestVerificationHeader) { - r.VerifyHeader = vh -} - -func (r *RemoveChainResponse) SetBody(rb *RemoveChainResponse_Body) { - r.Body = rb -} - -func (r *RemoveChainResponse) SetMetaHeader(mh *session.ResponseMetaHeader) { - r.MetaHeader = mh -} - -func (r *RemoveChainResponse) SetVerifyHeader(vh *session.ResponseVerificationHeader) { - r.VerifyHeader = vh -} - -func (r *ListChainsRequest_Body) SetTarget(t *ape.ChainTarget) { - r.Target = t -} - -func (r *ListChainsRequest) SetBody(rb *ListChainsRequest_Body) { - r.Body = rb -} - -func (r *ListChainsRequest) SetMetaHeader(mh *session.RequestMetaHeader) { - r.MetaHeader = mh -} - -func (r *ListChainsRequest) SetVerifyHeader(vh *session.RequestVerificationHeader) { - r.VerifyHeader = vh -} - -func (rb *ListChainsResponse_Body) SetChains(chains []*ape.Chain) { - rb.Chains = chains -} - -func (r *ListChainsResponse) SetBody(rb *ListChainsResponse_Body) { - r.Body = rb -} - -func (r *ListChainsResponse) SetMetaHeader(mh *session.ResponseMetaHeader) { - r.MetaHeader = mh -} - -func (r *ListChainsResponse) SetVerifyHeader(vh *session.ResponseVerificationHeader) { - r.VerifyHeader = vh -} diff --git a/apemanager/grpc/service.pb.go b/apemanager/grpc/service.pb.go deleted file mode 100644 index 3baf193044d1b17f811f898a2e6ec89eb0747b34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46394 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 diff --git a/apemanager/grpc/service_frostfs.pb.go b/apemanager/grpc/service_frostfs.pb.go new file mode 100644 index 0000000000000000000000000000000000000000..380ba305252d2fc739b36825734cbfd2541006fe GIT binary patch literal 56057 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 literal 0 HcmV?d00001 diff --git a/apemanager/grpc/service_frostfs_fuzz.go b/apemanager/grpc/service_frostfs_fuzz.go new file mode 100644 index 0000000..08af63e --- /dev/null +++ b/apemanager/grpc/service_frostfs_fuzz.go @@ -0,0 +1,121 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package apemanager + +func DoFuzzProtoAddChainRequest(data []byte) int { + msg := new(AddChainRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONAddChainRequest(data []byte) int { + msg := new(AddChainRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoAddChainResponse(data []byte) int { + msg := new(AddChainResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONAddChainResponse(data []byte) int { + msg := new(AddChainResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoRemoveChainRequest(data []byte) int { + msg := new(RemoveChainRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONRemoveChainRequest(data []byte) int { + msg := new(RemoveChainRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoRemoveChainResponse(data []byte) int { + msg := new(RemoveChainResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONRemoveChainResponse(data []byte) int { + msg := new(RemoveChainResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoListChainsRequest(data []byte) int { + msg := new(ListChainsRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONListChainsRequest(data []byte) int { + msg := new(ListChainsRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoListChainsResponse(data []byte) int { + msg := new(ListChainsResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONListChainsResponse(data []byte) int { + msg := new(ListChainsResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} diff --git a/apemanager/grpc/service_frostfs_test.go b/apemanager/grpc/service_frostfs_test.go new file mode 100644 index 0000000..5c4653c --- /dev/null +++ b/apemanager/grpc/service_frostfs_test.go @@ -0,0 +1,71 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package apemanager + +import ( + testing "testing" +) + +func FuzzProtoAddChainRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoAddChainRequest(data) + }) +} +func FuzzJSONAddChainRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONAddChainRequest(data) + }) +} +func FuzzProtoAddChainResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoAddChainResponse(data) + }) +} +func FuzzJSONAddChainResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONAddChainResponse(data) + }) +} +func FuzzProtoRemoveChainRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoRemoveChainRequest(data) + }) +} +func FuzzJSONRemoveChainRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONRemoveChainRequest(data) + }) +} +func FuzzProtoRemoveChainResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoRemoveChainResponse(data) + }) +} +func FuzzJSONRemoveChainResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONRemoveChainResponse(data) + }) +} +func FuzzProtoListChainsRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoListChainsRequest(data) + }) +} +func FuzzJSONListChainsRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONListChainsRequest(data) + }) +} +func FuzzProtoListChainsResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoListChainsResponse(data) + }) +} +func FuzzJSONListChainsResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONListChainsResponse(data) + }) +} diff --git a/container/grpc/service.go b/container/grpc/service.go deleted file mode 100644 index d19add1..0000000 --- a/container/grpc/service.go +++ /dev/null @@ -1,234 +0,0 @@ -package container - -import ( - acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl/grpc" - refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc" - session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session/grpc" -) - -// SetContainer sets container of the request. -func (m *PutRequest_Body) SetContainer(v *Container) { - m.Container = v -} - -// SetSignature sets signature of the container structure. -func (m *PutRequest_Body) SetSignature(v *refs.SignatureRFC6979) { - m.Signature = v -} - -// SetBody sets body of the request. -func (m *PutRequest) SetBody(v *PutRequest_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the request. -func (m *PutRequest) SetMetaHeader(v *session.RequestMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (m *PutRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - m.VerifyHeader = v -} - -// SetContainerId sets identifier of the container. -func (m *PutResponse_Body) SetContainerId(v *refs.ContainerID) { - m.ContainerId = v -} - -// SetBody sets body of the response. -func (m *PutResponse) SetBody(v *PutResponse_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the response. -func (m *PutResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (m *PutResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - m.VerifyHeader = v -} - -// SetContainerId sets identifier of the container. -func (m *DeleteRequest_Body) SetContainerId(v *refs.ContainerID) { - m.ContainerId = v -} - -// SetSignature sets signature of the container identifier. -func (m *DeleteRequest_Body) SetSignature(v *refs.SignatureRFC6979) { - m.Signature = v -} - -// SetBody sets body of the request. -func (m *DeleteRequest) SetBody(v *DeleteRequest_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the request. -func (m *DeleteRequest) SetMetaHeader(v *session.RequestMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (m *DeleteRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - m.VerifyHeader = v -} - -// SetBody sets body of the response. -func (m *DeleteResponse) SetBody(v *DeleteResponse_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the response. -func (m *DeleteResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (m *DeleteResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - m.VerifyHeader = v -} - -// SetContainerId sets identifier of the container. -func (m *GetRequest_Body) SetContainerId(v *refs.ContainerID) { - m.ContainerId = v -} - -// SetBody sets body of the request. -func (m *GetRequest) SetBody(v *GetRequest_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the request. -func (m *GetRequest) SetMetaHeader(v *session.RequestMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (m *GetRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - m.VerifyHeader = v -} - -// SetContainer sets the container structure. -func (m *GetResponse_Body) SetContainer(v *Container) { - m.Container = v -} - -// SetSessionToken sets token of the session within which requested -// container was created. -func (m *GetResponse_Body) SetSessionToken(v *session.SessionToken) { - m.SessionToken = v -} - -// SetSignature sets signature of the container structure. -func (m *GetResponse_Body) SetSignature(v *refs.SignatureRFC6979) { - m.Signature = v -} - -// SetBody sets body of the response. -func (m *GetResponse) SetBody(v *GetResponse_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the response. -func (m *GetResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (m *GetResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - m.VerifyHeader = v -} - -// SetOwnerId sets identifier of the container owner. -func (m *ListRequest_Body) SetOwnerId(v *refs.OwnerID) { - m.OwnerId = v -} - -// SetBody sets body of the request. -func (m *ListRequest) SetBody(v *ListRequest_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the request. -func (m *ListRequest) SetMetaHeader(v *session.RequestMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (m *ListRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - m.VerifyHeader = v -} - -// SetContainerIds sets list of the container identifiers. -func (m *ListResponse_Body) SetContainerIds(v []*refs.ContainerID) { - m.ContainerIds = v -} - -// SetBody sets body of the response. -func (m *ListResponse) SetBody(v *ListResponse_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the response. -func (m *ListResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (m *ListResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - m.VerifyHeader = v -} - -// SetContainerId sets identifier of the container. -func (m *GetExtendedACLRequest_Body) SetContainerId(v *refs.ContainerID) { - m.ContainerId = v -} - -// SetBody sets body of the request. -func (m *GetExtendedACLRequest) SetBody(v *GetExtendedACLRequest_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the request. -func (m *GetExtendedACLRequest) SetMetaHeader(v *session.RequestMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (m *GetExtendedACLRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - m.VerifyHeader = v -} - -// SetEacl sets eACL table structure. -func (m *GetExtendedACLResponse_Body) SetEacl(v *acl.EACLTable) { - m.Eacl = v -} - -// SetSignature sets signature of the eACL table structure. -func (m *GetExtendedACLResponse_Body) SetSignature(v *refs.SignatureRFC6979) { - m.Signature = v -} - -// SetSessionToken sets token of the session within which requested -// eACl table was set. -func (m *GetExtendedACLResponse_Body) SetSessionToken(v *session.SessionToken) { - m.SessionToken = v -} - -// SetBody sets body of the response. -func (m *GetExtendedACLResponse) SetBody(v *GetExtendedACLResponse_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the response. -func (m *GetExtendedACLResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (m *GetExtendedACLResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - m.VerifyHeader = v -} diff --git a/container/grpc/service.pb.go b/container/grpc/service.pb.go deleted file mode 100644 index 3bf1e14be30ad1959aa12c7ee5358f4076906c51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79297 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 diff --git a/container/grpc/service_frostfs.pb.go b/container/grpc/service_frostfs.pb.go new file mode 100644 index 0000000000000000000000000000000000000000..7590435353ba794e63359706e4ff60159b8d3e21 GIT binary patch literal 96320 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 P-!XlTdX}RWt(Og@*_q`)#;q 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 literal 0 HcmV?d00001 diff --git a/container/grpc/types_frostfs_fuzz.go b/container/grpc/types_frostfs_fuzz.go new file mode 100644 index 0000000..5551978 --- /dev/null +++ b/container/grpc/types_frostfs_fuzz.go @@ -0,0 +1,26 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package container + +func DoFuzzProtoContainer(data []byte) int { + msg := new(Container) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONContainer(data []byte) int { + msg := new(Container) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} diff --git a/container/grpc/types_frostfs_test.go b/container/grpc/types_frostfs_test.go new file mode 100644 index 0000000..64d840e --- /dev/null +++ b/container/grpc/types_frostfs_test.go @@ -0,0 +1,21 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package container + +import ( + testing "testing" +) + +func FuzzProtoContainer(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoContainer(data) + }) +} +func FuzzJSONContainer(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONContainer(data) + }) +} diff --git a/go.mod b/go.mod index e00f012..13fa1b7 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,8 @@ go 1.20 require ( git.frostfs.info/TrueCloudLab/frostfs-crypto v0.6.0 + github.com/VictoriaMetrics/easyproto v0.1.4 + github.com/mailru/easyjson v0.7.7 github.com/stretchr/testify v1.8.3 golang.org/x/sync v0.6.0 google.golang.org/grpc v1.63.2 @@ -13,6 +15,7 @@ require ( require ( git.frostfs.info/TrueCloudLab/rfc6979 v0.4.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/kr/pretty v0.1.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect diff --git a/go.sum b/go.sum index 6ce46f7..620642f 100644 --- a/go.sum +++ b/go.sum @@ -2,15 +2,21 @@ git.frostfs.info/TrueCloudLab/frostfs-crypto v0.6.0 h1:FxqFDhQYYgpe41qsIHVOcdzSV git.frostfs.info/TrueCloudLab/frostfs-crypto v0.6.0/go.mod h1:RUIKZATQLJ+TaYQa60X2fTDwfuhMfm8Ar60bQ5fr+vU= git.frostfs.info/TrueCloudLab/rfc6979 v0.4.0 h1:M2KR3iBj7WpY3hP10IevfIB9MURr4O9mwVfJ+SjT3HA= git.frostfs.info/TrueCloudLab/rfc6979 v0.4.0/go.mod h1:okpbKfVYf/BpejtfFTfhZqFP+sZ8rsHrP8Rr/jYPNRc= +github.com/VictoriaMetrics/easyproto v0.1.4 h1:r8cNvo8o6sR4QShBXQd1bKw/VVLSQma/V2KhTBPf+Sc= +github.com/VictoriaMetrics/easyproto v0.1.4/go.mod h1:QlGlzaJnDfFd8Lk6Ci/fuLxfTo3/GThPs2KH23mv710= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/lock/grpc/types.go b/lock/grpc/types.go deleted file mode 100644 index 9d5719f..0000000 --- a/lock/grpc/types.go +++ /dev/null @@ -1,8 +0,0 @@ -package lock - -import refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc" - -// SetMembers sets `members` field. -func (x *Lock) SetMembers(ids []*refs.ObjectID) { - x.Members = ids -} diff --git a/lock/grpc/types.pb.go b/lock/grpc/types.pb.go deleted file mode 100644 index 38b62fe0ea28e424bed65282158fd993975464ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5770 zcmbtY>rdlI68{|k6}@~IC8N-Bp4{fdO0$q*Bf$_6IL#eG!ExH57snm>kx3Tif8Tnv z6K8;gyF*~??t1>Js$Jz;O`MsD5>pka*h|$!j8|eFo7DKnuy#B(Qk-9lZ`Ze?ciz91 zPOT;uDo(VCk}f`!c8JBIE}Kp17IuXFS+r&2L^g0IF10 zaps=?>`fJIJC2^sO`M9dQ$k8{G}WmLVw0pnB6Sp)+HIVvv(RLdOK)7WJICH!gYC6N zqZX?mAtgr++X@Sz@>7sx%rsPTYCmMBtwu1U z;a1RfP<#ogAk6qr06ii5=*APF22f0}*@F1a#8~NQDkdsakg!tRK0&VNKq2Tz>!Co* zEz5;=hkB+lyA${yda+22h}AU1+gz)TkneFc8vc8D+q)W#dfx~An=iNh>u;mp;QH*3 zM^T2|Z@ufU!?!j;%S6p%TY-|p1g$;YB|?Xbr2Y#=Ei@L zqMxF*fRsrRJq{Hb%8ru29k&+R6W0XUP{j-FD|t?kh?~Kg@VzjU4%QXxPSQAoqrN?)o+I-k`l?kp;h-4`@m+D*~NV15ZhF;lZKB(j(x7jQtZQ?T&y zrgw37`Q_$Opua$VW$Er8KI5Sw8KwTYc+4xjdo*69Dyi11v6@#SZ>CPI@G6lskHnve ziMmJms=@q01CJh^wc`XC6mNMcK4aom#EnW+TCO0xpO;X7xcahoN;)V&cNZmIpn8!9 zah)J(X{JT@RD23_s78p#2(2B_VK^c)Mzdski)Z7#`+)Qb(r<(DU0xM}b{&+rTLYt` zRK?|G1u7dDT$`Syg&T|@Q%B~E)#|MW>L#V@BK(jiCSe?=5@0H~M7n-npv zh|{g?_fZGfOF5>q1f#Hd(z)LoNFn#nH|I)M+$CJmvWOj2e&WY^4lx!Q-XqGJNSmWJ z7Fz0cH150E94wl>0hQZe>^ppc9I^atgNWqonqN}vms+6n|+uWAtD3E=HS z!75*Z?^NJLL?BX_SPM9*zrI^1yP1P@TYs7NuwziR3=0_OE?uuG+-1Fu*N#uufUZrt zj`7;yl@q)_Y0%ZBU83RLlNPQ2TG(w@QNallK@i}c*jPk|gfbi7*GaTXlpVgZSwz|3 zl@7_tWs(9~Y7(<0ddH7?!B=YpD<}%x^_3KS%vtm=x9gy<4Klas5kwpVmk?~dXFD@6 zMC6A{@#sttkPiF7_e8@h;N><3^?x9#TgPjId~(@dUZ+qqj7(|4JQN93z@#UyBJnQD zB(%j?v%Tb#^@Ggf)M))m9<&IYHoN~Z$1w&Zs6||D@~=&5n(PzHVFj#hC&}0@PSb)# zonp4IAj*21vb4(y&6Uw^aSTY@2?vU)pm=I1udZikQG z>&RCEry+@VAK^InQV$O8!=iD!z^g7JU3<3fL#u}+7B~X+o|E9 zrun-(Gc%YTl7vk7m;`L#;P1olZq%9wWsiou=>%|R-m`*kVQXih+o_6rh2G11L`@B~ zuk>!EhBWYe^|A(#%G{Wg;r$NX#O4RO9k(kYWhBh^i-x2z0o!Th*lFe~mK8YaMGoj6 zlTF7D-eTvl$3mFd`jcgnTi9%XZBQ-m+9B;k(8V@=gp-3f{;go}u6ir#zTT}r;ADs6 zN|KF_X|9FI97dY-$xMXF(s`Cr>z}JX$fKi=v#4dNBK!hCBNCZ?SkIP;?j{P#5^5fx zxp&|5C%|d2pd|14b);!P+7}8-vp!g?xiIP^zrNoU78-r75o#=<`}}2_(66VmJ;{<+ z28?5}x5N)qD#jxSOMd~KH#~BJSB1vMN^y;jhEnoFr~Z>z;3T(@whI0U=X!$Sv;Hr;*6W5*NX`j*XlQ8r7ue5|n=+0m~ao`$dH)X>pC@ z7krvou_Sy?ve>f^8DW4^(L_c5st^B`3gqr#v_}#$7LHr81$6FV%+nJ%*OG8A!|MTq i^7iKiNL`4iM1qgJ>42P4WRC^g^ZpR!_S{9vwevUmIU(Qx diff --git a/lock/grpc/types_frostfs.pb.go b/lock/grpc/types_frostfs.pb.go new file mode 100644 index 0000000000000000000000000000000000000000..30121113af4b33cbfa686b1133950109160d5380 GIT binary patch literal 3844 zcmbtWZExE)5dJLvimQOOa^^_QK6=Q2HOYn+X;Lid`XLQgTBZ^<5^0c>?JUTD-yKOw zmhGf_3D71Y@AbLo?wIFrq-Gp$xa68yK7;8!%(b$r*vGT|8?|3*Wo&6OI6jB7^Gi56 zes`J0@thTR?1n?7in}-#^;~HSX&iksNDD% z6#tKzyfs4hn7Qxcx^1Req3Zk(QCOt~`@pRhg~>Z9)c98M71z#xD_%2E>BdPB^0^lw z*`*ftd%|8OiAQm4@8=v&v9@5WZVC$zarA-LQ?3nMUGGsPvh(RTUf6fX@RfW`lG@)V zU*pF(UNB8`_!HU`vyTMa2d2#}t1uFPLrC|?#VD1c8g0vdl65D&ElWPLb#rLZ|2!eP zZmt#Gi~%#xbGWcy!K+)g;QiH9NT%Z_{!(ciy7U?#ry3My=e} z|08|<#%+qB&UlIZ+HwD}v1yG0tL&r}wv9Ti5gcQ1n00JQM`Q+l9|B%_5>hO98bH7g z!eFCXL$fvPb?v(4;+YbDzkpQwwxU=bc;Q*_>eb*l>v@diL76v>CzyU91FCKyQD?u* z=UmPLAn5@CLA8Gj74Mp;Meq5Vcj8!(r>ovcwMJ8;i>~e|*BbDj(hf5kEM);bvcFPi z9Vz70%6j5gT#|(m{2Wrok1?6RdX@zeer27K6T+Va&(Tj?Sno=y%Vh#DmxwN!bx=?Oj*hJoPCumPMjzrJ z2x%knx7HQn=w|0yy+c=b39Zk&ogOZF4~s1ij;Eb1M0qism+vpm&o=vJW1T(SEMXjx z4O$6)Iy!(tgDeUEuV8{th`slGpeHae*AVM*uuOD7xj70oGNu0-X zdEQ4Y5B+lO`sYcybQ1q;y1JrM4|by!y9(b42(Rl||5(gU=~eka z(`N!C?YPsq>e)jL8Q7yeO>kOmwc@rS4$QrESDq*4Qq52Kf>*>|A+vV|x0iPNoT@+v zXGj*LJh6d}dJQ^>Pz0BNX=*-mQta=1(3zGii@hrKEGSBiKP0y+&P!@s8BCLN*-DQP5#^kaI_T zS{W_LlL-pAeuyHs2x0gXr(1VX3HNf^aoZ>FJHYqAAb%vLbB(r2Y_jc*;M_!OBfevW zkc0~UxB$BSLSJJj!(9hj2Z8UR!Db>AXQ~g_HH-%-RM%r4%-~rsOMSG1CMdAZ5_;DB E4Ghb}WB>pF literal 0 HcmV?d00001 diff --git a/lock/grpc/types_frostfs_fuzz.go b/lock/grpc/types_frostfs_fuzz.go new file mode 100644 index 0000000..cb55151 --- /dev/null +++ b/lock/grpc/types_frostfs_fuzz.go @@ -0,0 +1,26 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package lock + +func DoFuzzProtoLock(data []byte) int { + msg := new(Lock) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONLock(data []byte) int { + msg := new(Lock) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} diff --git a/lock/grpc/types_frostfs_test.go b/lock/grpc/types_frostfs_test.go new file mode 100644 index 0000000..7c69064 --- /dev/null +++ b/lock/grpc/types_frostfs_test.go @@ -0,0 +1,21 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package lock + +import ( + testing "testing" +) + +func FuzzProtoLock(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoLock(data) + }) +} +func FuzzJSONLock(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONLock(data) + }) +} diff --git a/netmap/grpc/service.go b/netmap/grpc/service.go deleted file mode 100644 index 882db6b..0000000 --- a/netmap/grpc/service.go +++ /dev/null @@ -1,116 +0,0 @@ -package netmap - -import ( - refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc" - session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session/grpc" -) - -// SetBody sets body of the request. -func (m *LocalNodeInfoRequest) SetBody(v *LocalNodeInfoRequest_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the request. -func (m *LocalNodeInfoRequest) SetMetaHeader(v *session.RequestMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (m *LocalNodeInfoRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - m.VerifyHeader = v -} - -// SetVersion sets version of response body. -func (m *LocalNodeInfoResponse_Body) SetVersion(v *refs.Version) { - m.Version = v -} - -// SetNodeInfo sets node info of response body. -func (m *LocalNodeInfoResponse_Body) SetNodeInfo(v *NodeInfo) { - m.NodeInfo = v -} - -// SetBody sets body of the response. -func (m *LocalNodeInfoResponse) SetBody(v *LocalNodeInfoResponse_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the response. -func (m *LocalNodeInfoResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (m *LocalNodeInfoResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - m.VerifyHeader = v -} - -// SetBody sets body of the request. -func (x *NetworkInfoRequest) SetBody(v *NetworkInfoRequest_Body) { - x.Body = v -} - -// SetMetaHeader sets meta header of the request. -func (x *NetworkInfoRequest) SetMetaHeader(v *session.RequestMetaHeader) { - x.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (x *NetworkInfoRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - x.VerifyHeader = v -} - -// SetNetworkInfo sets information about the network. -func (x *NetworkInfoResponse_Body) SetNetworkInfo(v *NetworkInfo) { - x.NetworkInfo = v -} - -// SetBody sets body of the response. -func (x *NetworkInfoResponse) SetBody(v *NetworkInfoResponse_Body) { - x.Body = v -} - -// SetMetaHeader sets meta header of the response. -func (x *NetworkInfoResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - x.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (x *NetworkInfoResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - x.VerifyHeader = v -} - -// SetBody sets body of the request. -func (x *NetmapSnapshotRequest) SetBody(v *NetmapSnapshotRequest_Body) { - x.Body = v -} - -// SetMetaHeader sets meta header of the request. -func (x *NetmapSnapshotRequest) SetMetaHeader(v *session.RequestMetaHeader) { - x.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (x *NetmapSnapshotRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - x.VerifyHeader = v -} - -// SetNetmap sets current Netmap. -func (x *NetmapSnapshotResponse_Body) SetNetmap(v *Netmap) { - x.Netmap = v -} - -// SetBody sets body of the response. -func (x *NetmapSnapshotResponse) SetBody(v *NetmapSnapshotResponse_Body) { - x.Body = v -} - -// SetMetaHeader sets meta header of the response. -func (x *NetmapSnapshotResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - x.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (x *NetmapSnapshotResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - x.VerifyHeader = v -} diff --git a/netmap/grpc/service.pb.go b/netmap/grpc/service.pb.go deleted file mode 100644 index eb9186260cbe07e97af8a5e9cb61f03e3f1939cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46017 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 Ov*WVjQ_vmJhW-yFn?C9Q literal 0 HcmV?d00001 diff --git a/netmap/grpc/service_frostfs_fuzz.go b/netmap/grpc/service_frostfs_fuzz.go new file mode 100644 index 0000000..ebb59bc --- /dev/null +++ b/netmap/grpc/service_frostfs_fuzz.go @@ -0,0 +1,121 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package netmap + +func DoFuzzProtoLocalNodeInfoRequest(data []byte) int { + msg := new(LocalNodeInfoRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONLocalNodeInfoRequest(data []byte) int { + msg := new(LocalNodeInfoRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoLocalNodeInfoResponse(data []byte) int { + msg := new(LocalNodeInfoResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONLocalNodeInfoResponse(data []byte) int { + msg := new(LocalNodeInfoResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoNetworkInfoRequest(data []byte) int { + msg := new(NetworkInfoRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONNetworkInfoRequest(data []byte) int { + msg := new(NetworkInfoRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoNetworkInfoResponse(data []byte) int { + msg := new(NetworkInfoResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONNetworkInfoResponse(data []byte) int { + msg := new(NetworkInfoResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoNetmapSnapshotRequest(data []byte) int { + msg := new(NetmapSnapshotRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONNetmapSnapshotRequest(data []byte) int { + msg := new(NetmapSnapshotRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoNetmapSnapshotResponse(data []byte) int { + msg := new(NetmapSnapshotResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONNetmapSnapshotResponse(data []byte) int { + msg := new(NetmapSnapshotResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} diff --git a/netmap/grpc/service_frostfs_test.go b/netmap/grpc/service_frostfs_test.go new file mode 100644 index 0000000..5c9035f --- /dev/null +++ b/netmap/grpc/service_frostfs_test.go @@ -0,0 +1,71 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package netmap + +import ( + testing "testing" +) + +func FuzzProtoLocalNodeInfoRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoLocalNodeInfoRequest(data) + }) +} +func FuzzJSONLocalNodeInfoRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONLocalNodeInfoRequest(data) + }) +} +func FuzzProtoLocalNodeInfoResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoLocalNodeInfoResponse(data) + }) +} +func FuzzJSONLocalNodeInfoResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONLocalNodeInfoResponse(data) + }) +} +func FuzzProtoNetworkInfoRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoNetworkInfoRequest(data) + }) +} +func FuzzJSONNetworkInfoRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONNetworkInfoRequest(data) + }) +} +func FuzzProtoNetworkInfoResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoNetworkInfoResponse(data) + }) +} +func FuzzJSONNetworkInfoResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONNetworkInfoResponse(data) + }) +} +func FuzzProtoNetmapSnapshotRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoNetmapSnapshotRequest(data) + }) +} +func FuzzJSONNetmapSnapshotRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONNetmapSnapshotRequest(data) + }) +} +func FuzzProtoNetmapSnapshotResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoNetmapSnapshotResponse(data) + }) +} +func FuzzJSONNetmapSnapshotResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONNetmapSnapshotResponse(data) + }) +} diff --git a/netmap/grpc/types.go b/netmap/grpc/types.go deleted file mode 100644 index f4e90f8..0000000 --- a/netmap/grpc/types.go +++ /dev/null @@ -1,212 +0,0 @@ -package netmap - -// SetReplicas of placement policy. -func (m *PlacementPolicy) SetReplicas(v []*Replica) { - m.Replicas = v -} - -// SetContainerBackupFactor of placement policy. -func (m *PlacementPolicy) SetContainerBackupFactor(v uint32) { - m.ContainerBackupFactor = v -} - -// SetSelectors of placement policy. -func (m *PlacementPolicy) SetSelectors(v []*Selector) { - m.Selectors = v -} - -// SetFilters of placement policy. -func (m *PlacementPolicy) SetFilters(v []*Filter) { - m.Filters = v -} - -// SetUnique of placement policy. -func (m *PlacementPolicy) SetUnique(unique bool) { - m.Unique = unique -} - -// SetName of placement filter. -func (m *Filter) SetName(v string) { - m.Name = v -} - -// SetKey of placement filter. -func (m *Filter) SetKey(v string) { - m.Key = v -} - -// SetOperation of placement filter. -func (m *Filter) SetOp(v Operation) { - m.Op = v -} - -// SetValue of placement filter. -func (m *Filter) SetValue(v string) { - m.Value = v -} - -// SetFilters sets sub-filters of placement filter. -func (m *Filter) SetFilters(v []*Filter) { - m.Filters = v -} - -// SetName of placement selector. -func (m *Selector) SetName(v string) { - m.Name = v -} - -// SetCount of nodes of placement selector. -func (m *Selector) SetCount(v uint32) { - m.Count = v -} - -// SetAttribute of nodes of placement selector. -func (m *Selector) SetAttribute(v string) { - m.Attribute = v -} - -// SetFilter of placement selector. -func (m *Selector) SetFilter(v string) { - m.Filter = v -} - -// SetClause of placement selector. -func (m *Selector) SetClause(v Clause) { - m.Clause = v -} - -// SetCount of object replica. -func (m *Replica) SetCount(v uint32) { - m.Count = v -} - -// SetSelector of object replica. -func (m *Replica) SetSelector(v string) { - m.Selector = v -} - -// SetKey sets key to the node attribute. -func (m *NodeInfo_Attribute) SetKey(v string) { - m.Key = v -} - -// SetValue sets value of the node attribute. -func (m *NodeInfo_Attribute) SetValue(v string) { - m.Value = v -} - -// SetParent sets value of the node parents. -func (m *NodeInfo_Attribute) SetParents(v []string) { - m.Parents = v -} - -// SetAddress sets node network address. -// -// Deprecated: use SetAddresses. -func (m *NodeInfo) SetAddress(v string) { - m.SetAddresses([]string{v}) -} - -// SetAddresses sets list of network addresses of the node. -func (m *NodeInfo) SetAddresses(v []string) { - m.Addresses = v -} - -// SetPublicKey sets node public key in a binary format. -func (m *NodeInfo) SetPublicKey(v []byte) { - m.PublicKey = v -} - -// SetAttributes sets list of the node attributes. -func (m *NodeInfo) SetAttributes(v []*NodeInfo_Attribute) { - m.Attributes = v -} - -// SetState sets node state. -func (m *NodeInfo) SetState(v NodeInfo_State) { - m.State = v -} - -// SetCurrentEpoch sets number of the current epoch. -func (x *NetworkInfo) SetCurrentEpoch(v uint64) { - x.CurrentEpoch = v -} - -// SetMagicNumber sets magic number of the sidechain. -func (x *NetworkInfo) SetMagicNumber(v uint64) { - x.MagicNumber = v -} - -// SetMsPerBlock sets MillisecondsPerBlock network parameter. -func (x *NetworkInfo) SetMsPerBlock(v int64) { - x.MsPerBlock = v -} - -// SetNetworkConfig sets NeoFS network configuration. -func (x *NetworkInfo) SetNetworkConfig(v *NetworkConfig) { - x.NetworkConfig = v -} - -// FromString parses Clause from a string representation, -// It is a reverse action to String(). -// -// Returns true if s was parsed successfully. -func (x *Clause) FromString(s string) bool { - i, ok := Clause_value[s] - if ok { - *x = Clause(i) - } - - return ok -} - -// FromString parses Operation from a string representation, -// It is a reverse action to String(). -// -// Returns true if s was parsed successfully. -func (x *Operation) FromString(s string) bool { - i, ok := Operation_value[s] - if ok { - *x = Operation(i) - } - - return ok -} - -// FromString parses NodeInfo_State from a string representation, -// It is a reverse action to String(). -// -// Returns true if s was parsed successfully. -func (x *NodeInfo_State) FromString(s string) bool { - i, ok := NodeInfo_State_value[s] - if ok { - *x = NodeInfo_State(i) - } - - return ok -} - -// SetKey sets parameter key. -func (x *NetworkConfig_Parameter) SetKey(v []byte) { - x.Key = v -} - -// SetValue sets parameter value. -func (x *NetworkConfig_Parameter) SetValue(v []byte) { - x.Value = v -} - -// SetParameters sets NeoFS network parameters. -func (x *NetworkConfig) SetParameters(v []*NetworkConfig_Parameter) { - x.Parameters = v -} - -// SetEpoch sets revision number of the Netmap. -func (x *Netmap) SetEpoch(v uint64) { - x.Epoch = v -} - -// SetNodes sets nodes presented in the Netmap. -func (x *Netmap) SetNodes(v []*NodeInfo) { - x.Nodes = v -} diff --git a/netmap/grpc/types.pb.go b/netmap/grpc/types.pb.go deleted file mode 100644 index ae1f55f5671b6f95094e098256c130f03ed290c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47747 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 CRII`P diff --git a/netmap/grpc/types_frostfs.pb.go b/netmap/grpc/types_frostfs.pb.go new file mode 100644 index 0000000000000000000000000000000000000000..3bab0790337dfdb7312c09c868c8839eb8792305 GIT binary patch literal 53375 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

t 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 XlTDY743BByCcH+Akjin32=@O6dSmL{ literal 0 HcmV?d00001 diff --git a/object/grpc/service_frostfs_fuzz.go b/object/grpc/service_frostfs_fuzz.go new file mode 100644 index 0000000..f58ee01 --- /dev/null +++ b/object/grpc/service_frostfs_fuzz.go @@ -0,0 +1,387 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package object + +func DoFuzzProtoGetRequest(data []byte) int { + msg := new(GetRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONGetRequest(data []byte) int { + msg := new(GetRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoGetResponse(data []byte) int { + msg := new(GetResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONGetResponse(data []byte) int { + msg := new(GetResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoPutRequest(data []byte) int { + msg := new(PutRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONPutRequest(data []byte) int { + msg := new(PutRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoPutResponse(data []byte) int { + msg := new(PutResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONPutResponse(data []byte) int { + msg := new(PutResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoDeleteRequest(data []byte) int { + msg := new(DeleteRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONDeleteRequest(data []byte) int { + msg := new(DeleteRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoDeleteResponse(data []byte) int { + msg := new(DeleteResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONDeleteResponse(data []byte) int { + msg := new(DeleteResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoHeadRequest(data []byte) int { + msg := new(HeadRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONHeadRequest(data []byte) int { + msg := new(HeadRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoHeaderWithSignature(data []byte) int { + msg := new(HeaderWithSignature) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONHeaderWithSignature(data []byte) int { + msg := new(HeaderWithSignature) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoHeadResponse(data []byte) int { + msg := new(HeadResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONHeadResponse(data []byte) int { + msg := new(HeadResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoSearchRequest(data []byte) int { + msg := new(SearchRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONSearchRequest(data []byte) int { + msg := new(SearchRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoSearchResponse(data []byte) int { + msg := new(SearchResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONSearchResponse(data []byte) int { + msg := new(SearchResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoRange(data []byte) int { + msg := new(Range) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONRange(data []byte) int { + msg := new(Range) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoGetRangeRequest(data []byte) int { + msg := new(GetRangeRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONGetRangeRequest(data []byte) int { + msg := new(GetRangeRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoGetRangeResponse(data []byte) int { + msg := new(GetRangeResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONGetRangeResponse(data []byte) int { + msg := new(GetRangeResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoGetRangeHashRequest(data []byte) int { + msg := new(GetRangeHashRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONGetRangeHashRequest(data []byte) int { + msg := new(GetRangeHashRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoGetRangeHashResponse(data []byte) int { + msg := new(GetRangeHashResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONGetRangeHashResponse(data []byte) int { + msg := new(GetRangeHashResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoPutSingleRequest(data []byte) int { + msg := new(PutSingleRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONPutSingleRequest(data []byte) int { + msg := new(PutSingleRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoPutSingleResponse(data []byte) int { + msg := new(PutSingleResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONPutSingleResponse(data []byte) int { + msg := new(PutSingleResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoPatchRequest(data []byte) int { + msg := new(PatchRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONPatchRequest(data []byte) int { + msg := new(PatchRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoPatchResponse(data []byte) int { + msg := new(PatchResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONPatchResponse(data []byte) int { + msg := new(PatchResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} diff --git a/object/grpc/service_frostfs_test.go b/object/grpc/service_frostfs_test.go new file mode 100644 index 0000000..cb4baeb --- /dev/null +++ b/object/grpc/service_frostfs_test.go @@ -0,0 +1,211 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package object + +import ( + testing "testing" +) + +func FuzzProtoGetRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoGetRequest(data) + }) +} +func FuzzJSONGetRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONGetRequest(data) + }) +} +func FuzzProtoGetResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoGetResponse(data) + }) +} +func FuzzJSONGetResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONGetResponse(data) + }) +} +func FuzzProtoPutRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoPutRequest(data) + }) +} +func FuzzJSONPutRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONPutRequest(data) + }) +} +func FuzzProtoPutResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoPutResponse(data) + }) +} +func FuzzJSONPutResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONPutResponse(data) + }) +} +func FuzzProtoDeleteRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoDeleteRequest(data) + }) +} +func FuzzJSONDeleteRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONDeleteRequest(data) + }) +} +func FuzzProtoDeleteResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoDeleteResponse(data) + }) +} +func FuzzJSONDeleteResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONDeleteResponse(data) + }) +} +func FuzzProtoHeadRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoHeadRequest(data) + }) +} +func FuzzJSONHeadRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONHeadRequest(data) + }) +} +func FuzzProtoHeaderWithSignature(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoHeaderWithSignature(data) + }) +} +func FuzzJSONHeaderWithSignature(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONHeaderWithSignature(data) + }) +} +func FuzzProtoHeadResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoHeadResponse(data) + }) +} +func FuzzJSONHeadResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONHeadResponse(data) + }) +} +func FuzzProtoSearchRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoSearchRequest(data) + }) +} +func FuzzJSONSearchRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONSearchRequest(data) + }) +} +func FuzzProtoSearchResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoSearchResponse(data) + }) +} +func FuzzJSONSearchResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONSearchResponse(data) + }) +} +func FuzzProtoRange(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoRange(data) + }) +} +func FuzzJSONRange(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONRange(data) + }) +} +func FuzzProtoGetRangeRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoGetRangeRequest(data) + }) +} +func FuzzJSONGetRangeRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONGetRangeRequest(data) + }) +} +func FuzzProtoGetRangeResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoGetRangeResponse(data) + }) +} +func FuzzJSONGetRangeResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONGetRangeResponse(data) + }) +} +func FuzzProtoGetRangeHashRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoGetRangeHashRequest(data) + }) +} +func FuzzJSONGetRangeHashRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONGetRangeHashRequest(data) + }) +} +func FuzzProtoGetRangeHashResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoGetRangeHashResponse(data) + }) +} +func FuzzJSONGetRangeHashResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONGetRangeHashResponse(data) + }) +} +func FuzzProtoPutSingleRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoPutSingleRequest(data) + }) +} +func FuzzJSONPutSingleRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONPutSingleRequest(data) + }) +} +func FuzzProtoPutSingleResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoPutSingleResponse(data) + }) +} +func FuzzJSONPutSingleResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONPutSingleResponse(data) + }) +} +func FuzzProtoPatchRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoPatchRequest(data) + }) +} +func FuzzJSONPatchRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONPatchRequest(data) + }) +} +func FuzzProtoPatchResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoPatchResponse(data) + }) +} +func FuzzJSONPatchResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONPatchResponse(data) + }) +} diff --git a/object/grpc/service_grpc.pb.go b/object/grpc/service_grpc.pb.go index 2494be9d9e9abd2b5f904981d7a93226e1fd58c2..687df9973e3b6536a5bc1ef015bd8557c943f6f4 100644 GIT binary patch delta 37 lcmbR8hH1(hrVT0flcTEFZ;lfdW8AFixZ5AWTRACP82~tX51#-4 delta 45 pcmbR8hH1(hrVT0fll6IcCW{*^-W(?^#<*G2akoFJ$jV9C$^e9t5FY>l diff --git a/object/grpc/status.pb.go b/object/grpc/status.pb.go deleted file mode 100644 index 034fa1bada29d6d8bcc387976a865cabe0310ccf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8502 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 F^M8aC-p&93 literal 0 HcmV?d00001 diff --git a/object/grpc/types_frostfs_fuzz.go b/object/grpc/types_frostfs_fuzz.go new file mode 100644 index 0000000..8491638 --- /dev/null +++ b/object/grpc/types_frostfs_fuzz.go @@ -0,0 +1,102 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package object + +func DoFuzzProtoShortHeader(data []byte) int { + msg := new(ShortHeader) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONShortHeader(data []byte) int { + msg := new(ShortHeader) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoHeader(data []byte) int { + msg := new(Header) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONHeader(data []byte) int { + msg := new(Header) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoObject(data []byte) int { + msg := new(Object) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONObject(data []byte) int { + msg := new(Object) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoSplitInfo(data []byte) int { + msg := new(SplitInfo) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONSplitInfo(data []byte) int { + msg := new(SplitInfo) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoECInfo(data []byte) int { + msg := new(ECInfo) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONECInfo(data []byte) int { + msg := new(ECInfo) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} diff --git a/object/grpc/types_frostfs_test.go b/object/grpc/types_frostfs_test.go new file mode 100644 index 0000000..11825be --- /dev/null +++ b/object/grpc/types_frostfs_test.go @@ -0,0 +1,61 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package object + +import ( + testing "testing" +) + +func FuzzProtoShortHeader(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoShortHeader(data) + }) +} +func FuzzJSONShortHeader(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONShortHeader(data) + }) +} +func FuzzProtoHeader(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoHeader(data) + }) +} +func FuzzJSONHeader(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONHeader(data) + }) +} +func FuzzProtoObject(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoObject(data) + }) +} +func FuzzJSONObject(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONObject(data) + }) +} +func FuzzProtoSplitInfo(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoSplitInfo(data) + }) +} +func FuzzJSONSplitInfo(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONSplitInfo(data) + }) +} +func FuzzProtoECInfo(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoECInfo(data) + }) +} +func FuzzJSONECInfo(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONECInfo(data) + }) +} diff --git a/refs/grpc/types.go b/refs/grpc/types.go deleted file mode 100644 index cdb69aa..0000000 --- a/refs/grpc/types.go +++ /dev/null @@ -1,97 +0,0 @@ -package refs - -// SetValue sets container identifier in a binary format. -func (x *ContainerID) SetValue(v []byte) { - x.Value = v -} - -// SetValue sets object identifier in a binary format. -func (x *ObjectID) SetValue(v []byte) { - x.Value = v -} - -// SetValue sets owner identifier in a binary format. -func (x *OwnerID) SetValue(v []byte) { - x.Value = v -} - -// SetContainerId sets container identifier of the address. -func (x *Address) SetContainerId(v *ContainerID) { - x.ContainerId = v -} - -// SetObjectId sets object identifier of the address. -func (x *Address) SetObjectId(v *ObjectID) { - x.ObjectId = v -} - -// SetType in generic checksum structure. -func (x *Checksum) SetType(v ChecksumType) { - x.Type = v -} - -// SetSum in generic checksum structure. -func (x *Checksum) SetSum(v []byte) { - x.Sum = v -} - -// SetMajor sets major version number. -func (x *Version) SetMajor(v uint32) { - x.Major = v -} - -// SetMinor sets minor version number. -func (x *Version) SetMinor(v uint32) { - x.Minor = v -} - -// SetKey sets public key in a binary format. -func (x *Signature) SetKey(v []byte) { - x.Key = v -} - -// SetSign sets signature. -func (x *Signature) SetSign(v []byte) { - x.Sign = v -} - -// SetScheme sets signature scheme. -func (x *Signature) SetScheme(s SignatureScheme) { - x.Scheme = s -} - -// SetKey sets public key in a binary format. -func (x *SignatureRFC6979) SetKey(v []byte) { - x.Key = v -} - -// SetSign sets signature. -func (x *SignatureRFC6979) SetSign(v []byte) { - x.Sign = v -} - -// FromString parses SignatureScheme from a string representation, -// It is a reverse action to String(). -// -// Returns true if s was parsed successfully. -func (x *SignatureScheme) FromString(s string) bool { - i, ok := SignatureScheme_value[s] - if ok { - *x = SignatureScheme(i) - } - - return ok -} - -// FromString parses ChecksumType from a string representation, -// It is a reverse action to String(). -// -// Returns true if s was parsed successfully. -func (x *ChecksumType) FromString(s string) bool { - i, ok := ChecksumType_value[s] - if ok { - *x = ChecksumType(i) - } - - return ok -} diff --git a/refs/grpc/types.pb.go b/refs/grpc/types.pb.go deleted file mode 100644 index ab3ae423130140bf0afab6d9a903c851958dc468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27241 zcmeHQ>vG#hmi{e1MUS^C5nU2Qk(A_U%UhL^mW(PI7;{F$69Hyx!(4AJ+I^R82xj-<8}AEF7>4GEExp* zCJ9FA)@3psY-P98AoUnkt2Olp@BGVvyIZYrGL4hWtha;`V8+29GmkFg_;MV0m+{z- zF1EM4yjZ?N)05eK3;{ z@9#kpj&4nMCNHc?sj{_ObV)NDW5-Rwa_IhTU#i~-L8Lm-t- z%tD8CdKhFuG6|zF&BB4H(CY5&7PMYIJ21Q7?R~e95(ZE|Q6#`R#qIl1oTVh=Km74H z$PVHtqGj>@$uW!wI{Y!fY-Cq~@yC~O0_9A|0H`7LC&7lfn2~V?W)h?+EjG->1ok=% zM`^Wb`{dDx|?BK=o=SK&x=7`i)3pt8r6Lam4XQ1d$Q=a+?1+R7O z!yf9CBQT8l0Nfj%{z0wC;emsTlZ^#E?fk$TA`q)6?lxGG+L^*`o!ck0NAMy*l+H4{tUyRmo zyhC;t(=1Nb+Z*EE)X(zB=d;O0kgVUd+Xd+=o5saaM^W@T9F4+pa0Wu@8HJ!T4nb$^ z>dpc%_=-Z(o6g%3dkq}WcnHo2T=uEmq592|WD81jW>Qr$hnn;_^lJR%>Ldzq6oVyf+74R{T1fo&gye_c zj!(!Q81zHuqq2K&6%5{`a3+OcqnXoiVS8EWb7IBo=v@@Qk391{&J4w%)|v})cJSlT z!QW0_|9tl9*OQ~O*UwK+jt-8W9UmPUcUT@AUWMavIJnyUEtnvbUBwgpmrSn^C@2CM zT8SCrc7@2R->TTe@l*6dV5p4NXi=fx8D*H^#g&Q$nQe_5i^ z=qwl0*f-)LL8ImntuqzJsHEqPs<}g#wZa#=tz@3LBXm3N@PehG=2N-AGS$+utF8H> zcey24_`mH%{;y1arOt2rt?T^CgdWoKxs)2*o;yqosZj4qecrb9c`q)0M{bwG|C;AP z{Or{D$nE^$FhTAn6&o_SFhM03Wqyc4?)cF7(a;Fo@gY@hoThVhMu-YhR31LLCKHd$ z`S*hAoH9h;pp>C-fP`NAHI@evRWCzAbnZ|(XHw^u);V(jaX1OJl>Bzqq-l)5o0{AY0B50JFdA2xCxb!yvNYcuih&%$6l zOr0U>_ocnX334ui35U=|I0}OVt~XcV&^#`F9GY{chw5_w5rwpLV|yc>W*g*5pAIb0 zSvcJIJ&mKH<@j)e0eg=Ob?iSXjg3i9lWBJQ=$v^HC6*Xcy@DI7;W{hbf|Zy}CFeta z)|ePWoBkI-#^yhmw}&>W~M$l#L4vVmWMzsIa85dn&9!{oj0JZp>eh(T8K1 zivO!>K?BXy-Op?3_$gP0e%F*Wj0nNqHcD zEIDZ1o_^r+TRra(6I^l}m{@4BG##pi8?SIMNJOD6?ZC9T5wH*pl++6_8U21pbG(p- z1(-tsI+u7NW6UfH{}%;%;SW6xAqWeIIN@Y6%V>SG$0tVyzq#q#IK+E{#~F4M{3ta} zKzNTVnSwxsZ3eJOyAJ19s3U^p+#qe{-&6l~3@ba=aoB*6kmaD^;MD74gA%b~97mTF ziQY&K_;&p&%ckl6*47|R1|IF!U}x}pYdX6?g3ggF-5Lg%qw&@#oTgjbPdZzDe2x5Z zTaxv7MEHoAn0@HCkil|^*f1V$nD@x+uQn(QhZ(x59^RmENmDO-E1dQtqyi0L%Q2~V zRx0s8a0E^uCh=IJ3qK8Zo)i*gaXe1FFvv!{%XyVe##_V0A7z`96kDUw?WRC%cDik& zL0ao?OYgr=Up&{{7oLm@?9lm{pO5w_?rWHrT_r^1Xy_-{4hA>7ePWDJ(~c8wwM{Ya z_>p?%2%Ad?oirI1s+sv@H0ba4pZrIPqy{O*X1@(HVEETBf7+xlazFT;wsM)XNXUrG zE&7PD(`C7p%xN$PrpQk;9nl4H_?hz&U4zBqBRliW1xz%#)$O^~+TVE#P0H$eBH-jC zTzpk>4{2Kz@~s}~G2iyAHs~YGfB2wpS#K{{mo-NH0$EeouZ&u0+$WvEg>nYLx$o=9 zO}oC1xNjA>bl|rD?eaF@>UN)`63ZihK@S0$S0sYIuF0lQ%tM>va9$jgVsM@%sE5LH zmN@~LeBRucOdaKd?UO`O!~&!Wn-f1tujmoQ&_>E2u@4<=c=~rZ{1b)4+}f~-fRx}* zR-w-cig;GV3(Ky+bM}t&D|Ly0JRq;grEO7EbktD~j85ljV`KMI#72kvm4wF^9sdXmY_P7hu!pK2C=btkc7BM^&dSTHzZ%Nu0NwY$SrEzX4mD8Qouc*y)D%Zn|Lv!`yT zXdHz%Jf658#p7}OUUq?TJcRcqNeicgWSad*PoZchxL)U2A(s^P z)rVZw-_qeW*Y^YMNB7F1HYc~TFpI-vdD!6tdpH~Fn+Q(pAVe(xJBVUpVZO zQ=0g{BSz!Y2@VKtnDbwYjxdrfMd{O>K6`ZW^OiL~Gt-W4TWiuZ;{z-1t{x7=q0N2N z$P!n!^`y-$VCVoK4u?WFWis5fkc{&f5eFXQq)LX{Tr%#%F4b+_L2Jiq9d!RwIOtp? zv2yJ3NFGCvTjrcB|wjr>#}WqxTq32=lR&Kvn2KPyyMT8#R<&h&&I z@KJfk$N9KsOXa9}Ywd4nUE)y*oj@;d2~msd=*XYu63eOJg@_$5N{q;P5cHe}R6QExU8{`;JD(yRE#?f`i-|G_ywEdZJ}x~()TGo^XAE?i%HAAob;d}Yp&8fn3NH z6bQNf=SY`|3gyu&4GyHs|3AS&6?y*{ki*IJ`9);W{>qh1v_C&vh= zsV1;=2$L-c7{)CJsA94MaauAB#v=qFytcKd9&^j4*`!(~p~c1Sh8#?O+ZD;L;()0z6oiu~!Zq1wDieTD|bu`(HyVvL5@Ay-C zcktpikjfyuD~s>kp=21TfbH`4ZARVUk-PFKtZ;8vT3ogQA;3*N29`k!<=`<-n2F9d zF(lG=Sh7C1?6Ms42|Of$C`9CtPvNx394U$cq1$CyMH-Pn0zJBCtrCE+UzgZJuzQ6>%*r{jRJ7UMqXDw)qpv zCjzo2=V+e+RK6w9sWd#{%ESc|Xs}|Mv?YwVK|WT|VgW(m56Z^`SbPz1np6Tr5B*%9NF_ z%H)wd;<^QDPa>KG3RaE=Zb#SRFIBS=e8eRPB5~j{o{?6R$#cM{RStLcEsp<_$}FZY-0=$I>J_q6sk#+&p!SfBB~SbK)0b(bn31N z*6$x&6RaZkEt&*61}dm4B9n?5CEh7ZMg&|F>@@!!CW^$C>$@4FD_zH*4980FJ7ghYpn)YaH+W@9Tx(9F+{cy zNep`O-BlecP>E^k$kZh7>@P!%(JkXJz#L8T9PSu}^2k~i7bZ?Zxa&GAzbg{YV~z-v zRB<2fpzAxCV+myTnIj?AXDiZA@uO_MG9Nly3?;5YKOG5VH9&46&|$8{?1VsW1K@FG z3r*+U4IS)flwYwQhsQoAETWU6ZUd(c_L7vA74edL1uINj@2N?u64E%rQr?B_SiKU_`Qe0S7>9SR6I; zs~(rhly+)*tRmgekZ!hU1z;4KPjIhfqOy0SUXz({3qLgqwnL033ACGe5!2Kpo`H2M zY94oxV-9oTomiRJeIf!PY*#u&d`Z9fvy@ax3lp9bKe$&ED2lQKSS>x)wQ7*+AGK%kN2<%`i4suuxYhxHpkB2w8 z9rn7gK*S|rt(%(8wwJ$7hO5f-~CIt37a8wQX^wEm{ENFKgz$suB&_Tv(6 zzKO2M7Ind+@dBig&#)ZVfJ4N|6jg@<&J1)0{~qud~`#1+v9CY zglr0x*EnX6pW?@H(G>k`yKNjw*HRp08C;obx-akAEBx($0)nWo4e;hJ79V}Jk?@;q z5APJyHHzB3UF$BcQPd&b>X6d)iiBwxjQrU+D~+QkwCMVX5Bl5SIC53smeCcd!mjQ1 z7psfz%5>ql&M#LTy_KoMz90F;T1J0ms<64s7psb$m8l|+-e2w#*qX`4DIImB`wmMN=~5Q?*I78mH7S%GP_nZxC#1N{rlV0#_u3Ef ziTndRCw_Lt|40v?q9QDGTkD69ZSUmWC3WI@ev0%j<--0Xq<_L;zbQM@tNj`3`D{XU zbE>zu(-!{P8XC0-=62e&=EftNd!m`Pr?~MnNUp;{z$3ZwBlY|sRk3?1d_xMNH8cUr zab#Rxa(f&NgB!xz0H{R|0owAP8R0^=2{7MDAW)~`x6lnVZN3D^j~-9iI<`7!KIi{C h7Dy{$41E4=nOz$U=iIGoP&+NIY2eZl6*Cq|gQR5Vf_(S; z&Fq7_e8`e5*;Zh~O~U2u%MIf;w(+_r2i0Y4?iRi zhiQ`K!>lKEUyJ?MhhlH{#bK}AKJ)vh{)a%M!7yvL!{{tYbK$jHAG0JDognTfgE0QE zL64nwYZ&FCgFo=kvm_ab&WAAXY0P0fOg0YFaj-K=#)Fss@rHWy&_4^o!p3B4W1NSh z4eCl5h`+0%puWJN8N3df4UL5G`Prv}uaog{ub)I4zlZ%iNkjitkf&ik+b~e*@o^Mf z1S!+k;E^AW(lJAk+%_Z#!JemKei^WY0d$t9{Un}CLTkSTWGge;d{n6ge?!mL8gI}Kgu(>4~eoB4BQ}L+XDm5xZzdhf1^5Z{$ zB!pW(JSpQV^#P*I*$^H5@$BWxy~CrO*Zcc>JBO7~J{4Oefr+1zftJV|#Xbb_R7C#S zI~K=#NDY?zx!r0#+7=yK1f6v>Zkk4SIQ(*};bnVWt7hGZqt;k9q(?vgh9OB#r$1MVxz(%9HQWZ(VFY>bAcarq)Wz z?TY7V5-H9y#aUMzQwX|*Ki0*&tl(_z0#;JO?@hV|&p9HP&GyhAWdWFzuD5d%^iQ*K zbVz>4TDAPnetER>%ihkf2X9{;9sc*t-qG9rgExCSFP^{H+Z8sL^fSBV=(kM>CCWA-w`LDn6hkC4E7W zu7#?2fX&*a=5GTp$@Xm$a~Qte?Wo@BZIC%k{@GxV1{u5ExSx~5?IdyThe$PE48&UT zuq*zi`EI)dH&^d>JAb!Zua7?l{T#6PSyKZ z#F9N4oVU3yE_#I#44{n5J8e-XZ5QaFrwAY<8-VzfYFPIqA*7}w_C`T>K;|)FiJIFn-ItYd^!kYJQ#<>>(;G(w| zg}G+ji+Zo%J;8ZeBBNouV-^mJn*F#}MNK#9_p zq$EwqxU1I1bR#n0Q14VTGJqPdm!*AUNM4Yp0{7m!@`*ED)h&}#5 z#6Y2f2cpimS!Z2zRA}fxHKdzXhEUT#A%aY7e;l!%`+gP(B+GC~%gKr6z|Vc17NVC@ z_AXkh+8dRaubSdwXEt6 zGxDjyJus>9D-QK5#hx`s{^#KJemS(2(wnLAOifILhLQt0BeIRF7VIU`5B={aLHV_qb`@@eBAV*2e zWNMgo*eH5Lk(z*E-FX<(Y6df{CU_#whDZ~;ZReeB0J4p?TAZ~wagyG(h7EIWYgo)B zMweks11UKN5Dcl6q{tIzN1J^Od1dIk4sG2ikxwVAJ;kP~^e3gOWQDducjPZMh5!KD z4!)32@oKDQhysWzkbmbDKp9ANmCIGzTqUkXJZp_xg)hwlre>8TbOXHcEUvXxA1aDV z@OP-pHJmM|&gI#vsBT%EFbWlzsJvAXwNz1-XW@CO)M5-Jq^nb=7DFgiY1gb%sX)5u zNi9&8B`eTKmzgrR;B^SCDfUhz8W!;+>d$2Z)t%f=Q|zuAiD02*q)tkZHzgMUVv^W=MJ zojQh8D}qJl$c4yEkhtL_xrPIyw)-sE$^5tmyfjN@gR3T}GP0QL6d9rw1+Ac9GF}9j zN}i6ktLL7`NcB$3!qZO+_pBLcZI|guXmc0iJ>@*K+T{+VqBe6YoQ*oeSlNWs8O2wc zlR9HGKC{wksWqgpB{Q{#wCLp2L47m%sYCL%Q`9=Q??+_D}gufz~8#kkDCm>7aQveT&cJAoFD^C=L8MNZJ{w#vA6=d5y z1{_6D)6cY{2ui{Q+DG>BM}ri(wnREnNcm);cC69~X48vUp%Ki;3W3@qY-WX#mRV7< zTFj9MGlttv`^$`&4DuG!{)ocqj0Yl=t1450al_R3JZR%t=!g_K1v@zi9knPhQwNEe z+Ho|S_Qk#L7J16TsKJEd8?Gg)3>ZteuO+TfORx=B&sfNiNzu1Or;l+|LYWzdWeUlh zN>q*&v(a7!or+q^JF{UvKDVlqUvVfKKkBHOIj5^Wkj0U0s#2(9Gf<{4g<#M=UkqVL zsf!{MzKq|_RofU$vsO1X9j4beO&yGXmn)odhdWf`6s#?%%HeZGMUew@f%&^7P65K1 zFtJd9*^9>!V|lzzpEy3=!m(Ou8uZ=dQja%VB3apT$Qr|93nF>InY3C{6Uj4We7sre z9TPTkY}tp^+}O#s1lg;k^_resPkXfnvZSiY6033cm9DGIfaa*IpxT;JM(UoYx@(nH z!0r@PcrH#5^$N3lVM}x4vvER@vyBg|FxnC?)TU0rn~!~| zjc=-AsYscF9n&mZ=zBDncm3IXZ3%^toHEp);{7K@VN#}`s$)fNQOEQx+P7VmR#`FC z$Su~Tr@^Nwbz}1}eV8@;4H}y_3+`tqJ_;aapJf?|V-#9YSUuNs8d%SMXqc3aa$I|LMVeI7LIzOh}qRC>? zcqJWwtnqGAT=_<{Y+kAp{Dd!nBe-MSmvYM7QTU-BBBU-90S|q;!R`$W3?A>{)#jsh z@py}(41T~Df!a5-P;1=7Wh;C1Sv*}1qhM7Y;n13mOIGi2l=!$kPYL9bj*_Gt5UrwE z;7ngvfws;G8k{>OjJB(Pt76PVU1(Td{!oh_HESO3o5HT=xi73teeQJ(#dXnd#^sFq zekNcyu4=gb?&9Kx=J2-HIBsU$!i;wHmoLmvR&f=hbd`x-D7fB--IeH2{c?OIKkzP( z>wZCE<=4bUF(%Wxtx(-(-92Qz;X97z+U?auieksT$;kK=su#K$stP~7IBI~m(V9K*8vJ*t z7&0SSP!VKyXtCd?R})Fqv_Ct2zjsV`4==S8D#p69B~USh#g;yfsv0*{YjjF0DrPSi zDy-=%_Wk+)Y z-RNxU6_`<8Fy@JaS#9Uh8?fqZe->S-?ioijmOUh4jK6+wx4=o&4se!tK3QUmIpEyMz@ep)%(X;nNlKA7@PFTP zBRRZ?q7pex(E?TF;mo;w=Q<-!PfpaiKhbKYJsmiao~WC9wG8~oA0NZm@yxf?#cTD; z>v!tK#pOHOIyq5m9fYp$g(Li{I-=EF3J@e;|H?#d}Xq!Yjwt!MAr5TfCxYbiU@hL+g8WM(^sx1 zPg+(Z$2iEV@fB{_aoil|Ka;$0SuOs*3zO?WsV7T(AgWBUy*!R?Sv(!U)VF600b1ypZD1@g{2G19i`j zlrx=TB*psajUKPigrMOo9XZ10nHb3!DyZ2_)m*^J>sylW2(>)J0Vb8x-kiA$gf)hg zJ7y2dfbk9kjQJ&CL_Q(utfE_pFkGe~5H%=00oB3M_(u#*;IH5@0t5auzN2SjKL`LC z4=fJTi5OwHa4GcxKoA8G<2i_EP^6Sc1*m!{RHW2>1}q*bg)2MT1nj}GrYp!s&5g=B zWlO!$p^lm@jI3uH$SfJ3{rq4x+-W8@LT9R9c+SlnTng4S7Oondsi#wSuCFEUUt=PN zKPc~ClS5xG!r42B>hOL011<`2Q5u!M*{_V~eLZcakFI>zi*(T3v>=1QLi=sx2U@0M zR%tF=c=BLX==e4YAj5!?kVP=nfZTzOR)JS80?q*$Hm#Iq9GE%>Wxf)=bNZJ=V90%?aoB>i_7(qI*#mDouN@oK6&G#QL z?;ff5AHc83?Zp*#d2rx-LP{_HeR41EVzgBD-QnuHu%i-H#__Gf8mR6ZokNa z+Y1$)Ezz7uC|2EXS*%h`TIzrW%OqQ;XcgukzHlL|f11LT;<i!8mo+8nyiia~eSuq=ae$%ZoGMP~e3Mxlcil#AGb#rc zFjXua{NQ`29hVb4+?={_6ikQLp8f=9z`PqxHqKV#assCzcq(Eh<-+MSR0Z0bC1=wx zVCG;f0avS=xjUwML}$);zAyW8t0DE_pHQr}u`^15EW3u<#??p$V0lgsbEYX!Sy3=- zv%M-9lOCZg^uA?TFjP5cUC7X_Qy7X14qq7%**{HXFaX`VG#G0iw>EUP)`pA-kghMW zE=XFaO4FAUGd*uR7R^&nQ%^lE>HHFI(5|YVs(tXC9z)WbwM;-p2DQ{@J3UAB#VYmeL=aUQYP)o3>Rq-W4G5eu8L&;?*{|9Y zl($cai(wf+GNYK6MotZQhy0XhvXRA5Bq@7BkI)o0>?cfu?P2KDA<)`Hw96v$cOJhX zBa4R+PgXf`GIY4F^D%@-j8+UK!uP-su?GDufH2nWYS3tHpYQ;XQG@mk#U7bd{Fg}( znx~9AVaiVjG(O-tM2KBL>_H3?dyp5!1_8vy9<=x%_CN+n)B%HPdsMh%vXRDfIW~CC4EmUmqN6|be!eOLMgS} z7@Z|&Ib!g2p_HI6da&0~3;{D_P~UW?mEZ^it`-C=ScNnw#PA-bCRi%0f(*D&)FH}s z`;`30OoiJbA5teW;NX%4?52d{km`h)_&8$4Ls)Ne&5E3g3^-LVn+_4pc>`FO7;u8fC=sTqlfn&pl-65} z8;X@;3nTX6zG!FRt{}wmk&uI#+%hK>BDI0UGbcXEBuU{$288=Ic_pj}mRwXJ12bKB zsST-VKw!)>S>96nkp^rK`Yg#yWbjf0qGns{msIa^h=dKZEK9;jniJoyMhzK=iFTE5 zAi8h$?hUCPNW@Y+Z%YI0Ep3uo=5ro3%M@1*(l{|SY9J+rG!Siyi)o}oh?^6<9hJ@$i>gJAB^h~(|MUyY*b!M2(Sv=ADVSL~rb!wYu6AlpC0HaT z8EfMyTZPk!Fry&N)d^x?IwDEIi`h_L8FU6jWeVm(iJ9eO#5n~KlfWbf{FoSIwo~M| z+>dtI`3P}#3dv3cuV~46j9^Ss2r?+mAsALPRlI_2U|6fBHpn1RCnZ|h!bmWZe%xtu z8#&+xl0@P90YV@HIUVBQA{j+?B9S>eVu)B9{!Xw+YfNiTX%&~@p)|jQKAUbpfx`>n zF&dB-^m&{t!5xE~*)i_hg(D-gS$IRr24{#!Qmzo9KAV)aB+_C(L+^~6$f01-fV6;# zin7d-MCnn4=Tbsqzg$H@4IJ(`Ii1nsKI6*}vD7re{gRMi&}a_FzcdD{4TIKUBeV5s zsyH73bxKn6c7w+=iKNnr*-q^NF{nNb?E#MPV-z0y!Y!woC%><~F}%JCmxpZpR(sh6 zUimnyd%TR7bLfZEnnLl*&&D}@&2^}Pec?Be7o5PuVRl^@L?8O)k?t4$W}o{DcuPDC zNtl`fAQ`+R0RQgyx;HM2jkk+ee8&OsUpRLferHd`HeQ}TQvFt~-vDMlU74WY0O%6L z)EVo~4}e}X`#yQA2|t9uJL#E!;OE%(2<}?>He94zcWwEZ)IK-wRhgvtN0TyIK&n$k zidUMnj3483vH`7b6)jpR@4u&Nnm_1d2?D)d6+K>=5G=eHU(go__R9zsR-(Q#SbS40 zAq(VAE65dBGFcWoeWfm;CpHGMgL1O@l_tF+x0o)_8&=UPu0*=#dmJ&Pj1wxL``n}p zH($c|RWyjJIzNR?^zw4D3F9#6bs+#Cy94Fj{%zyy86&(;c#T)=)bZbTMTB??)Ma2$ z>GkZXi}W_zE<6E`H zd!lPQZ3HN~T7QLg*hDtQ4qWnTkML{U*gaj_bVWRQ+$lUx?|=)1ZhlJUZa7k!=&7@s zN11u}_6a zXT}8!hLf36>}e(*V>BM{<0bD2g)9-@m3L$tiL2p$wf5kp;PL$>{AZ(q_^#E`edB6l z4@*)3_g$;wEio*Au*nup*n*>>D*k5yP%6OGHqNSj?g48k9q$q--BZ_^p6)$x`h)d< Dk8Br= diff --git a/session/grpc/service_frostfs.pb.go b/session/grpc/service_frostfs.pb.go new file mode 100644 index 0000000000000000000000000000000000000000..cfec4d6983b32a3ea7660efec40ad05286839aef GIT binary patch literal 19354 zcmeHOS(6*L5q>6r1;i@LLuEzkaQR_VN>y|?*+f@qCHuj4*|Q{OcdR*>nc=Zf>A&ae z1_r15G>`^jCBj6#&9iwR zf;5Z$Vgx!xN_R5PWGId^=BD|Go z)2JhuHxwSrgF76O34|oqqelWtryqMtaB;8S``GXC%D+5PLXTd;g5>m+tp}2xg0FY~ zNUXHgOmS&df_EomD7@|gt+O_SrJ4~@ki9^C`oh>wNJDT)k&Ifi%*2qg5ucxMQ43gJH)t^Cgo7lvgNjDNDG0 z+m4N_S;Km;;2s-_p{X4>9{qhblgU({+q+Nag)K1~YXNqnxTJW;e#L8=%13P==3SQR z?KTm!95=SDkr4uBpa)q#6hz+9Gh!WhgNdIcX#pqWPep<)w3mQ; z`6eG6i9yq=4sZ!{3%wlfWpY8hneWSa%(pr5b1Cj03p_&|6o~cIFZ?5szNa?<3Vo$d zF-mWNrM-n&7PCXndFi^foJvT|hb3dt@OJbVl#|G%=Z2(`A87~Dn5CoUjgi#Dzc%#P zCZLh*SbVdD=CC_6B2BSM9g;ed9eK&_$^Tc!3mOR{~P2abN?bnpWV zVO0i_XGlPq`t}m`sPAz(dOQyhw(w6FO&=rR<=*f}ER{Riq!%rd**TpT;!ahB)(C@j zqc{E%=>lp9Z;;HRh|O9F#aE-3kVM|MAHIder^@34IrC$7D{M!GvAOTt z0B@u&sE9(~7{D zy%>5TEw_vX?j>_N*eq_Hx|Yk_vT|#wh{`ElyPlycrWzLoy8ln)R9v0j(KT~rP!Vdf z*eoaFA7vH>mzumJ=D~2nb+ew*#0zKn{uT3H#j+);g{e|4__t9f*NDsmXI*K+bwr_A1ZDlmqJl4{-qIpOqwQF^t(tg@0s^7q#Ps8&>PRY|F0gs|wP<72P zL(Vho{u!YlI6|BRw1DbdR4?ZMBf=d2%c%G{D&i^3;xhR#Xv1!vl{VaO@uDk$9lFB z*$kI8H-v615QoAnFL(d)k*OU( zDY7`qHz^n#43Q!x73hTqbY9(r)DUiaC0@sf6u*k*HIc|y3rE>Uad4GbRu#qAVXdA< zvfR*)C9(C0G3Be&(L;vp+(&$HExF7pdU7YKn&O#CWzf)=OMEz;p#Z~g9i+RU#Gx>m zOWUVRl;fZbUX}iqs#p{H)$`q!51=?A00`GoyK#}OLJ%~%9zbMqtcA(UVW8f9we%FPOp5ftiK$aFDoiYZs7Kn`v^3lPH{2730vvgl5 zcHtl;8`-(Wx1QmjgUdQO+jT;+ju^&3Z_wBZ2+1EhY(!(}X*IFXmJmhxh5=;PB#s+k zS$dsto;6I?zPlDV8lk2lMq`%KjSW)R$J>;}eU|H`;rCccbK0b8uG&UA_pQ6~!F@IG zc8q;G%$(2Q5oNuJO7%}M1gcPwvLz~<5-xnI`s@A;V81%88}Bf&7yj!AW3kyPGGb~G z1XUNCZ6)0f3tms^GBZGOH`mV)7k1BgMd&bp;L2DaH%px~`=sm&#(}NH;1%c;ngBoz z5!S%7s{qF;r>^b)rPi&N;cAnJ;S7^~N)4s&Fs2bw+W&+yDf~+&F>t zl+C+8aNko!Pv-fWn*2*{d~%Mq1ITnTrQlS9nAEj$Ji>ME-`#UEtsn!48m61a=`^y2 zazIfmlZr@o*op=t#_w))z)?0A-6!}czKnHUpa7|Rx6M&rWAlaiv;n)*YlOJ1I6z%6 zd%*1kwCnc})DqVPwliArt1FKyC)SSq+Kc2ip-d%mjiqup?I5UN{9O*U<*^GNPCyB*4hFiDuWyof`+sd2Dh<`7ao38!-ZTwS-ULw8e3P^RQ(j5akh*nF7KtH4 zv0cgJhK3!Tjv9DXeU&pdJ$Oyn79FZe1~-N|f;6W&1=%2n-OL4hl{5<%;%vauMxJK8 Wswk+GtGR3&`P>-gN_d5E^#1_3{av2` literal 0 HcmV?d00001 diff --git a/session/grpc/service_frostfs_fuzz.go b/session/grpc/service_frostfs_fuzz.go new file mode 100644 index 0000000..759361c --- /dev/null +++ b/session/grpc/service_frostfs_fuzz.go @@ -0,0 +1,45 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package session + +func DoFuzzProtoCreateRequest(data []byte) int { + msg := new(CreateRequest) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONCreateRequest(data []byte) int { + msg := new(CreateRequest) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoCreateResponse(data []byte) int { + msg := new(CreateResponse) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONCreateResponse(data []byte) int { + msg := new(CreateResponse) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} diff --git a/session/grpc/service_frostfs_test.go b/session/grpc/service_frostfs_test.go new file mode 100644 index 0000000..fc8664e --- /dev/null +++ b/session/grpc/service_frostfs_test.go @@ -0,0 +1,31 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package session + +import ( + testing "testing" +) + +func FuzzProtoCreateRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoCreateRequest(data) + }) +} +func FuzzJSONCreateRequest(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONCreateRequest(data) + }) +} +func FuzzProtoCreateResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoCreateResponse(data) + }) +} +func FuzzJSONCreateResponse(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONCreateResponse(data) + }) +} diff --git a/session/grpc/types.go b/session/grpc/types.go deleted file mode 100644 index 857c45e..0000000 --- a/session/grpc/types.go +++ /dev/null @@ -1,246 +0,0 @@ -package session - -import ( - acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl/grpc" - refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc" - status "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status/grpc" -) - -// SetKey sets key to the X-Header. -func (m *XHeader) SetKey(v string) { - m.Key = v -} - -// SetValue sets value of the X-Header. -func (m *XHeader) SetValue(v string) { - m.Value = v -} - -// SetExp sets epoch number of the token expiration. -func (m *SessionToken_Body_TokenLifetime) SetExp(v uint64) { - m.Exp = v -} - -// SetNbf sets starting epoch number of the token. -func (m *SessionToken_Body_TokenLifetime) SetNbf(v uint64) { - m.Nbf = v -} - -// SetIat sets the number of the epoch in which the token was issued. -func (m *SessionToken_Body_TokenLifetime) SetIat(v uint64) { - m.Iat = v -} - -// SetId sets identifier of the session token. -func (m *SessionToken_Body) SetId(v []byte) { - m.Id = v -} - -// SetOwnerId sets identifier of the session token owner. -func (m *SessionToken_Body) SetOwnerId(v *refs.OwnerID) { - m.OwnerId = v -} - -// SetLifetime sets lifetime of the session token. -func (m *SessionToken_Body) SetLifetime(v *SessionToken_Body_TokenLifetime) { - m.Lifetime = v -} - -// SetSessionKey sets public session key in a binary format. -func (m *SessionToken_Body) SetSessionKey(v []byte) { - m.SessionKey = v -} - -// SetObjectAddressContext sets object context of the session token. -func (m *SessionToken_Body) SetObject(v *ObjectSessionContext) { - m.Context = &SessionToken_Body_Object{ - Object: v, - } -} - -// SetContainer sets container context of the session token. -func (m *SessionToken_Body) SetContainer(v *ContainerSessionContext) { - m.Context = &SessionToken_Body_Container{ - Container: v, - } -} - -// SetTarget specifies objects involved in the object session. -func (m *ObjectSessionContext) SetTarget(tgt *ObjectSessionContext_Target) { - m.Target = tgt -} - -// SetVerb sets type of request for which the token is issued. -func (m *ObjectSessionContext) SetVerb(v ObjectSessionContext_Verb) { - m.Verb = v -} - -// SetVerb sets type of request for which the token is issued. -func (x *ContainerSessionContext) SetVerb(v ContainerSessionContext_Verb) { - x.Verb = v -} - -// SetWildcard sets wildcard flag of the container session. -func (x *ContainerSessionContext) SetWildcard(v bool) { - x.Wildcard = v -} - -// SetContainerId sets identifier of the container related to the session. -func (x *ContainerSessionContext) SetContainerId(v *refs.ContainerID) { - x.ContainerId = v -} - -// SetBody sets session token body. -func (m *SessionToken) SetBody(v *SessionToken_Body) { - m.Body = v -} - -// SetSignature sets session token signature. -func (m *SessionToken) SetSignature(v *refs.Signature) { - m.Signature = v -} - -// SetVersion sets client protocol version. -func (m *RequestMetaHeader) SetVersion(v *refs.Version) { - m.Version = v -} - -// SetEpoch sets client local epoch. -func (m *RequestMetaHeader) SetEpoch(v uint64) { - m.Epoch = v -} - -// SetTtl sets request TTL. -func (m *RequestMetaHeader) SetTtl(v uint32) { - m.Ttl = v -} - -// SetXHeaders sets request X-Headers. -func (m *RequestMetaHeader) SetXHeaders(v []*XHeader) { - m.XHeaders = v -} - -// SetSessionToken sets session token of the request. -func (m *RequestMetaHeader) SetSessionToken(v *SessionToken) { - m.SessionToken = v -} - -// SetBearerToken sets bearer token of the request. -func (m *RequestMetaHeader) SetBearerToken(v *acl.BearerToken) { - m.BearerToken = v -} - -// SetOrigin sets origin request meta header. -func (m *RequestMetaHeader) SetOrigin(v *RequestMetaHeader) { - m.Origin = v -} - -// GetNetworkMagic returns NeoFS network magic. -func (m *RequestMetaHeader) GetNetworkMagic() uint64 { - if m != nil { - return m.MagicNumber - } - - return 0 -} - -// SetMagicNumber sets NeoFS network magic. -func (m *RequestMetaHeader) SetMagicNumber(v uint64) { - m.MagicNumber = v -} - -// SetVersion sets server protocol version. -func (m *ResponseMetaHeader) SetVersion(v *refs.Version) { - m.Version = v -} - -// SetEpoch sets server local epoch. -func (m *ResponseMetaHeader) SetEpoch(v uint64) { - m.Epoch = v -} - -// SetTtl sets response TTL. -func (m *ResponseMetaHeader) SetTtl(v uint32) { - m.Ttl = v -} - -// SetXHeaders sets response X-Headers. -func (m *ResponseMetaHeader) SetXHeaders(v []*XHeader) { - m.XHeaders = v -} - -// SetOrigin sets origin response meta header. -func (m *ResponseMetaHeader) SetOrigin(v *ResponseMetaHeader) { - m.Origin = v -} - -// SetStatus sets response status. -func (m *ResponseMetaHeader) SetStatus(v *status.Status) { - m.Status = v -} - -// SetBodySignature sets signature of the request body. -func (m *RequestVerificationHeader) SetBodySignature(v *refs.Signature) { - m.BodySignature = v -} - -// SetMetaSignature sets signature of the request meta. -func (m *RequestVerificationHeader) SetMetaSignature(v *refs.Signature) { - m.MetaSignature = v -} - -// SetOriginSignature sets signature of the origin verification header of the request. -func (m *RequestVerificationHeader) SetOriginSignature(v *refs.Signature) { - m.OriginSignature = v -} - -// SetOrigin sets origin verification header of the request. -func (m *RequestVerificationHeader) SetOrigin(v *RequestVerificationHeader) { - m.Origin = v -} - -// SetBodySignature sets signature of the response body. -func (m *ResponseVerificationHeader) SetBodySignature(v *refs.Signature) { - m.BodySignature = v -} - -// SetMetaSignature sets signature of the response meta. -func (m *ResponseVerificationHeader) SetMetaSignature(v *refs.Signature) { - m.MetaSignature = v -} - -// SetOriginSignature sets signature of the origin verification header of the response. -func (m *ResponseVerificationHeader) SetOriginSignature(v *refs.Signature) { - m.OriginSignature = v -} - -// SetOrigin sets origin verification header of the response. -func (m *ResponseVerificationHeader) SetOrigin(v *ResponseVerificationHeader) { - m.Origin = v -} - -// FromString parses ObjectSessionContext_Verb from a string representation, -// It is a reverse action to String(). -// -// Returns true if s was parsed successfully. -func (x *ObjectSessionContext_Verb) FromString(s string) bool { - i, ok := ObjectSessionContext_Verb_value[s] - if ok { - *x = ObjectSessionContext_Verb(i) - } - - return ok -} - -// FromString parses ContainerSessionContext_Verb from a string representation, -// It is a reverse action to String(). -// -// Returns true if s was parsed successfully. -func (x *ContainerSessionContext_Verb) FromString(s string) bool { - i, ok := ContainerSessionContext_Verb_value[s] - if ok { - *x = ContainerSessionContext_Verb(i) - } - - return ok -} diff --git a/session/grpc/types.pb.go b/session/grpc/types.pb.go deleted file mode 100644 index 9f517436ffd99ca94731c6fa95afdcf5e1b2691a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57288 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ℑ!RcU97TA#b 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 SP>y2V^LXDP*-77TtN#szzzHh= diff --git a/status/grpc/types_frostfs.pb.go b/status/grpc/types_frostfs.pb.go new file mode 100644 index 0000000000000000000000000000000000000000..a12ab55d9f4c5ec1e00657a9b8abc82653cb69d3 GIT binary patch literal 13491 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 literal 0 HcmV?d00001 diff --git a/status/grpc/types_frostfs_fuzz.go b/status/grpc/types_frostfs_fuzz.go new file mode 100644 index 0000000..ce9d84e --- /dev/null +++ b/status/grpc/types_frostfs_fuzz.go @@ -0,0 +1,26 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package status + +func DoFuzzProtoStatus(data []byte) int { + msg := new(Status) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONStatus(data []byte) int { + msg := new(Status) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} diff --git a/status/grpc/types_frostfs_test.go b/status/grpc/types_frostfs_test.go new file mode 100644 index 0000000..dfc5631 --- /dev/null +++ b/status/grpc/types_frostfs_test.go @@ -0,0 +1,21 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package status + +import ( + testing "testing" +) + +func FuzzProtoStatus(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoStatus(data) + }) +} +func FuzzJSONStatus(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONStatus(data) + }) +} diff --git a/tombstone/grpc/types.go b/tombstone/grpc/types.go deleted file mode 100644 index 9b4b744..0000000 --- a/tombstone/grpc/types.go +++ /dev/null @@ -1,20 +0,0 @@ -package tombstone - -import ( - refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc" -) - -// SetExpirationEpoch sets number of tombstone expiration epoch. -func (x *Tombstone) SetExpirationEpoch(v uint64) { - x.ExpirationEpoch = v -} - -// SetSplitId sets identifier of split object hierarchy. -func (x *Tombstone) SetSplitId(v []byte) { - x.SplitId = v -} - -// SetMembers sets list of objects to be deleted. -func (x *Tombstone) SetMembers(v []*refs.ObjectID) { - x.Members = v -} diff --git a/tombstone/grpc/types.pb.go b/tombstone/grpc/types.pb.go deleted file mode 100644 index 7d416fe1cfaa732b5b2f65242342421308e067ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7276 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 R!QVL)Qr+pWG%1&$e*%18BdP!Z diff --git a/util/protogen/internalgengo/file.go b/util/protogen/internalgengo/file.go new file mode 100644 index 0000000..b5b351c --- /dev/null +++ b/util/protogen/internalgengo/file.go @@ -0,0 +1,250 @@ +package internalgengo + +import ( + "fmt" + "sort" + "strconv" + "strings" + + "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/reflect/protoreflect" +) + +var ( + strconvPackage = protogen.GoImportPath("strconv") + fmtPackage = protogen.GoImportPath("fmt") + jsonPackage = protogen.GoImportPath("encoding/json") + easyprotoPackage = protogen.GoImportPath("github.com/VictoriaMetrics/easyproto") + mpPackage = protogen.GoImportPath("git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/pool") + protoPackage = protogen.GoImportPath("git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/proto") + encodingPackage = protogen.GoImportPath("git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/proto/encoding") + + mp = mpPackage.Ident("MarshalerPool") +) + +// GenerateFile generates a *.pb.go file enforcing field-order serialization. +func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.GeneratedFile { + filename := file.GeneratedFilenamePrefix + "_frostfs.pb.go" + g := gen.NewGeneratedFile(filename, file.GoImportPath) + + g.P("// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.") + g.P() + g.P("package ", file.GoPackageName) + g.P() + g.Import(encodingPackage) + + // Doesn't work for multiple files in a single package, use external pool. + // g.P("var mp ", easyprotoPackage.Ident("MarshalerPool")) + + for _, e := range file.Enums { + emitEnum(g, e) + } + for _, msg := range file.Messages { + emitEasyProto(g, msg) + } + return g +} + +func emitEnum(g *protogen.GeneratedFile, e *protogen.Enum) { + g.P("type " + e.GoIdent.GoName + " int32") + g.P("const (") + for _, ev := range e.Values { + g.P(ev.GoIdent.GoName, " ", e.GoIdent.GoName, " = ", ev.Desc.Number()) + } + g.P(")") + + g.P("var (") + g.P(e.GoIdent.GoName+"_name", " = map[int32]string{") + for _, value := range e.Values { + g.P(value.Desc.Number(), ": ", strconv.Quote(string(value.Desc.Name())), ",") + } + g.P("}") + g.P(e.GoIdent.GoName+"_value", " = map[string]int32{") + for _, value := range e.Values { + g.P(strconv.Quote(string(value.Desc.Name())), ": ", value.Desc.Number(), ",") + } + g.P("}") + g.P(")") + g.P() + + g.P("func (x ", e.GoIdent.GoName, ") String() string {") + g.P("if v, ok := ", e.GoIdent.GoName+"_name[int32(x)]; ok {") + g.P("return v") + g.P("}") + g.P("return ", strconvPackage.Ident("FormatInt"), "(int64(x), 10)") + g.P("}") + + g.P("func (x *", e.GoIdent.GoName, ") FromString(s string) bool {") + g.P("if v, ok := ", e.GoIdent.GoName+"_value[s]; ok {") + g.P("*x = ", e.GoIdent.GoName, "(v)") + g.P("return true") + g.P("}") + g.P("return false") + g.P("}") +} + +func emitEasyProto(g *protogen.GeneratedFile, msg *protogen.Message) { + for _, e := range msg.Enums { + emitEnum(g, e) + } + for _, m := range msg.Messages { + emitEasyProto(g, m) + } + + g.P("type " + msg.GoIdent.GoName + " struct {") + emitMessageFields(g, msg) + g.P("}") + + g.P("var (") + g.P("_ ", encodingPackage.Ident("ProtoMarshaler"), " = (*", msg.GoIdent.GoName, ")(nil)") + g.P("_ ", encodingPackage.Ident("ProtoUnmarshaler"), " = (*", msg.GoIdent.GoName, ")(nil)") + g.P("_ ", jsonPackage.Ident("Marshaler"), " = (*", msg.GoIdent.GoName, ")(nil)") + g.P("_ ", jsonPackage.Ident("Unmarshaler"), " = (*", msg.GoIdent.GoName, ")(nil)") + g.P(")") + + emitStableSize(g, msg) + if strings.HasSuffix(msg.GoIdent.GoName, "Request") || strings.HasSuffix(msg.GoIdent.GoName, "Response") { + emitSignatureMethods(g, msg) + } + + emitProtoMethods(g, msg) + emitGettersSetters(g, msg) + emitJSONMethods(g, msg) + + for _, f := range msg.Fields { + if isFirstOneof(f) { + genOneof(g, f) + } + } +} + +func isFirstOneof(f *protogen.Field) bool { + return f.Oneof != nil && f == f.Oneof.Fields[0] +} + +func emitOneofGettersSetters(g *protogen.GeneratedFile, msg *protogen.Message, ff *protogen.Field) { + // For some reason protoc generates different code for oneof message/non-message fields: + // 1. For message we have 2 level struct wrapping and setters use inner type. + // 2. For other types we also have 2 level wrapping, but setters use outer type. + if ff.Desc.Kind() == protoreflect.MessageKind { + ft := fieldType(g, ff) + + g.P("func (x *", msg.GoIdent.GoName, ") Get", ff.GoName, "() ", ft, " {") + g.P("if xx, ok := x.Get", ff.Oneof.GoName, "().(*", ff.GoIdent, "); ok { return xx.", ff.GoName, " }") + g.P("return nil") + g.P("}") + + g.P("func (x *", msg.GoIdent.GoName, ") Set", ff.GoName, "(v ", ft, ") {") + g.P("x.", ff.Oneof.GoName, " = &", ff.GoIdent, "{", ff.GoName, ": v}") + g.P("}") + } else { + g.P("func (x *", msg.GoIdent.GoName, ") Get", ff.GoName, "() *", ff.GoIdent, " {") + g.P("if xx, ok := x.Get", ff.Oneof.GoName, "().(*", ff.GoIdent, "); ok { return xx }") + g.P("return nil") + g.P("}") + + g.P("func (x *", msg.GoIdent.GoName, ") Set", ff.GoName, "(v *", ff.GoIdent, ") {") + g.P("x.", ff.Oneof.GoName, " = v") + g.P("}") + + ft := fieldType(g, ff) + emitGetterSetter(g, ff.GoIdent.GoName, ff.GoName, ft.String(), "nil") + } +} + +func emitGettersSetters(g *protogen.GeneratedFile, msg *protogen.Message) { + for _, f := range msg.Fields { + if f.Oneof != nil { + if f.Oneof.Fields[0] == f { + emitGetterSetter(g, msg.GoIdent.GoName, f.Oneof.GoName, oneOfDescriptor(f.Oneof), "nil") + for _, ff := range f.Oneof.Fields { + emitOneofGettersSetters(g, msg, ff) + } + } + continue + } + + ft := fieldType(g, f) + emitGetterSetter(g, msg.GoIdent.GoName, f.GoName, ft.String(), fieldDefaultValue(f)) + } +} + +func emitMessageFields(g *protogen.GeneratedFile, msg *protogen.Message) { + for _, field := range msg.Fields { + genMessageField(g, field) + } +} + +func genMessageField(g *protogen.GeneratedFile, field *protogen.Field) { + if field.Oneof != nil { + if field.Oneof.Fields[0] == field { + g.P(field.Oneof.GoName, " ", oneOfDescriptor(field.Oneof)) + } + return + } + + typ := fieldType(g, field) + g.P(field.GoName, " ", typ, fmt.Sprintf(" `json:%q`", fieldJSONName(field))) +} + +func oneOfDescriptor(oneof *protogen.Oneof) string { + return "is" + oneof.GoIdent.GoName +} + +func genOneof(g *protogen.GeneratedFile, field *protogen.Field) { + ifName := oneOfDescriptor(field.Oneof) + g.P("type ", ifName, " interface {") + g.P(ifName, "()") + g.P("}") + g.P() + for _, field := range field.Oneof.Fields { + g.P("type ", field.GoIdent, " struct {") + + ft := fieldType(g, field) + g.P(field.GoName, " ", ft) + g.P("}") + g.P() + } + for _, field := range field.Oneof.Fields { + g.P("func (*", field.GoIdent, ") ", ifName, "() {}") + g.P() + } +} + +func fieldDefaultValue(field *protogen.Field) string { + if field.Desc.Cardinality() == protoreflect.Repeated { + return "nil" + } + + switch field.Desc.Kind() { + case protoreflect.MessageKind, protoreflect.BytesKind: + return "nil" + case protoreflect.BoolKind: + return "false" + case protoreflect.StringKind: + return `""` + default: + return "0" + } +} + +func castFieldName(f *protogen.Field) string { + if f.Oneof != nil { + return "x." + f.Oneof.GoName + } + + name := "x." + f.GoName + if f.Desc.Kind() != protoreflect.EnumKind { + return name + } + return "int32(" + name + ")" +} + +func sortFields(fs []*protogen.Field) []*protogen.Field { + res := make([]*protogen.Field, len(fs)) + copy(res, fs) + sort.Slice(res, func(i, j int) bool { + return res[i].Desc.Number() < res[j].Desc.Number() + }) + return res +} diff --git a/util/protogen/internalgengo/fuzz.go b/util/protogen/internalgengo/fuzz.go new file mode 100644 index 0000000..ec99692 --- /dev/null +++ b/util/protogen/internalgengo/fuzz.go @@ -0,0 +1,69 @@ +package internalgengo + +import ( + "google.golang.org/protobuf/compiler/protogen" +) + +var testingPackage = protogen.GoImportPath("testing") + +func GenerateFuzzTests(gen *protogen.Plugin, file *protogen.File) { + { + filename := file.GeneratedFilenamePrefix + "_frostfs_fuzz.go" + g := gen.NewGeneratedFile(filename, file.GoImportPath) + + g.P("//go:build gofuzz") + g.P("// +build gofuzz") + g.P("// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.") + g.P() + g.P("package ", file.GoPackageName) + g.P() + + for _, msg := range file.Messages { + emitFuzzWrappers(g, msg) + } + } + { + filename := file.GeneratedFilenamePrefix + "_frostfs_test.go" + g := gen.NewGeneratedFile(filename, file.GoImportPath) + + g.P("//go:build gofuzz") + g.P("// +build gofuzz") + g.P("// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.") + g.P() + g.P("package ", file.GoPackageName) + g.P() + + for _, msg := range file.Messages { + emitFuzzTests(g, msg) + } + } +} + +func emitFuzzWrappers(g *protogen.GeneratedFile, msg *protogen.Message) { + g.P("func DoFuzzProto", msg.GoIdent.GoName, "(data []byte) int {") + g.P("msg := new(", msg.GoIdent.GoName, ")") + g.P("if err := msg.UnmarshalProtobuf(data); err != nil { return 0 }") + g.P("_ = msg.MarshalProtobuf(nil)") + g.P("return 1") + g.P("}") + + g.P("func DoFuzzJSON", msg.GoIdent.GoName, "(data []byte) int {") + g.P("msg := new(", msg.GoIdent.GoName, ")") + g.P("if err := msg.UnmarshalJSON(data); err != nil { return 0 }") + g.P("_, err := msg.MarshalJSON()") + g.P("if err != nil { panic(err) }") + g.P("return 1") + g.P("}") +} + +func emitFuzzTests(g *protogen.GeneratedFile, msg *protogen.Message) { + g.P("func FuzzProto", msg.GoIdent.GoName, "(f *", testingPackage.Ident("F"), ") {") + g.P("f.Fuzz(func(t *", testingPackage.Ident("T"), ", data []byte) {") + g.P("DoFuzzProto", msg.GoIdent.GoName, "(data)") + g.P("})}") + + g.P("func FuzzJSON", msg.GoIdent.GoName, "(f *", testingPackage.Ident("F"), ") {") + g.P("f.Fuzz(func(t *", testingPackage.Ident("T"), ", data []byte) {") + g.P("DoFuzzJSON", msg.GoIdent.GoName, "(data)") + g.P("})}") +} diff --git a/util/protogen/internalgengo/getter.go b/util/protogen/internalgengo/getter.go new file mode 100644 index 0000000..78deef7 --- /dev/null +++ b/util/protogen/internalgengo/getter.go @@ -0,0 +1,14 @@ +package internalgengo + +import "google.golang.org/protobuf/compiler/protogen" + +func emitGetterSetter(g *protogen.GeneratedFile, typeName string, fieldName string, fieldType string, defaultValue string) { + g.P("func (x *", typeName, ") Get", fieldName, "() ", fieldType, " {") + g.P("if x != nil { return x.", fieldName, "}") + g.P("return ", defaultValue) + g.P("}") + + g.P("func (x *", typeName, ") Set", fieldName, "(v ", fieldType, ") {") + g.P("x.", fieldName, " = v") + g.P("}") +} diff --git a/util/protogen/internalgengo/json.go b/util/protogen/internalgengo/json.go new file mode 100644 index 0000000..ad43fc8 --- /dev/null +++ b/util/protogen/internalgengo/json.go @@ -0,0 +1,230 @@ +package internalgengo + +import ( + "fmt" + + "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/reflect/protoreflect" +) + +var ( + jwriterPackage = protogen.GoImportPath("github.com/mailru/easyjson/jwriter") + jlexerPackage = protogen.GoImportPath("github.com/mailru/easyjson/jlexer") +) + +func emitJSONMethods(g *protogen.GeneratedFile, msg *protogen.Message) { + emitJSONMarshal(g, msg) + emitJSONUnmarshal(g, msg) +} + +func emitJSONUnmarshal(g *protogen.GeneratedFile, msg *protogen.Message) { + g.P("// UnmarshalJSON implements the json.Unmarshaler interface.") + g.P("func (x *", msg.GoIdent.GoName, ") UnmarshalJSON(data []byte) error {") + g.P("r := ", jlexerPackage.Ident("Lexer"), "{Data: data}") + g.P("x.UnmarshalEasyJSON(&r)") + g.P("return r.Error()") + g.P("}") + + g.P("func (x *", msg.GoIdent.GoName, ") UnmarshalEasyJSON(in *", jlexerPackage.Ident("Lexer"), ") {") + + g.P("isTopLevel := in.IsStart()") + g.P("if in.IsNull() {") + g.P("if isTopLevel { in.Consumed() }") + g.P("in.Skip()") + g.P("return") + g.P("}") + + g.P("in.Delim('{')") + g.P("for !in.IsDelim('}') {") + + g.P("key := in.UnsafeFieldName(false)") + g.P("in.WantColon()") + g.P("if in.IsNull() { in.Skip(); in.WantComma(); continue }") + g.P("switch key {") + for _, f := range msg.Fields { + g.P(`case "`, fieldJSONName(f), `":`) + if f.Oneof != nil { + g.P("xx := new(", f.GoIdent, ")") + g.P("x." + f.Oneof.GoName + " = xx") + emitJSONFieldRead(g, f, "xx") + continue + } + emitJSONFieldRead(g, f, "x") + } + g.P("}") + g.P("in.WantComma()") + g.P("}") + g.P("in.Delim('}')") + g.P("if isTopLevel { in.Consumed() }") + g.P("}") +} + +func emitJSONFieldRead(g *protogen.GeneratedFile, f *protogen.Field, name string) { + g.P("{") + defer g.P("}") + + if f.Desc.IsList() { + g.P("var f ", fieldType(g, f)[2:]) + g.P("var list ", fieldType(g, f)) + g.P("in.Delim('[')") + defer g.P("in.Delim(']')") + + g.P("for !in.IsDelim(']') {") + } else { + g.P("var f ", fieldType(g, f)) + } + + var template string + switch f.Desc.Kind() { + case protoreflect.BoolKind: + template = "%s = in.Bool()" + case protoreflect.EnumKind: + g.Import(strconvPackage) + + enumType := fieldType(g, f).String() + g.P("var parsedValue " + enumType) + g.P(`switch v := in.Interface().(type) { + case string: + if vv, ok := `+enumType+`_value[v]; ok { + parsedValue = `+enumType+`(vv) + break + } + vv, err := `, strconvPackage.Ident("ParseInt"), `(v, 10, 32) + if err != nil { + in.AddError(err) + return + } + parsedValue = `+enumType+`(vv) + case float64: + parsedValue = `+enumType+`(v) + }`) + template = "%s = parsedValue" + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: + template = "%s = in.Int32()" + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: + template = "%s = in.Uint32()" + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: + template = "%s = in.Int64()" + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: + template = "%s = in.Uint64()" + case protoreflect.FloatKind: + template = "%s = in.Float32()" + case protoreflect.DoubleKind: + template = "%s = in.Float64()" + case protoreflect.StringKind: + template = "%s = in.String()" + case protoreflect.BytesKind: + template = "%s = in.Bytes()" + case protoreflect.MessageKind: + if f.Desc.IsList() { + g.P("f = new(", fieldType(g, f)[3:], ")") + } else { + g.P("f = new(", fieldType(g, f)[1:], ")") + } + template = "%s.UnmarshalEasyJSON(in)" + case protoreflect.GroupKind: + panic("unimplemented") + } + g.P(fmt.Sprintf(template, "f")) + if f.Desc.IsList() { + g.P("list = append(list, f)") + g.P("in.WantComma()") + g.P("}") + g.P(name, ".", f.GoName, " = list") + } else { + g.P(name, ".", f.GoName, " = f") + } +} + +func emitJSONMarshal(g *protogen.GeneratedFile, msg *protogen.Message) { + g.P("// MarshalJSON implements the json.Marshaler interface.") + g.P("func (x *", msg.GoIdent.GoName, ") MarshalJSON() ([]byte, error) {") + g.P("w := ", jwriterPackage.Ident("Writer"), "{}") + g.P("x.MarshalEasyJSON(&w)") + g.P("return w.Buffer.BuildBytes(), w.Error") + g.P("}") + + g.P("func (x *", msg.GoIdent.GoName, ") MarshalEasyJSON(out *", jwriterPackage.Ident("Writer"), ") {") + g.P(`if x == nil { out.RawString("null"); return }`) + + g.P("out.RawByte('{')") + for i, f := range msg.Fields { + if f.Oneof != nil { + if f.Oneof.Fields[0] != f { + continue + } + + g.P("switch xx := x.", f.Oneof.GoName, ".(type) {") + for _, ff := range f.Oneof.Fields { + g.P("case *", ff.GoIdent, ":") + emitJSONFieldWrite(g, ff, "xx", i == 0) + } + g.P("default:") + g.P(`out.RawString("null")`) + g.P("}") + continue + } + emitJSONFieldWrite(g, f, "x", i == 0) + } + g.P("out.RawByte('}')") + g.P("}") +} + +func emitJSONFieldWrite(g *protogen.GeneratedFile, f *protogen.Field, name string, first bool) { + g.P("{") + defer g.P("}") + + g.P("const prefix string = ", `",\"`, fieldJSONName(f), `\":"`) + if first { + g.P("out.RawString(prefix[1:])") + } else { + g.P("out.RawString(prefix)") + } + + selector := name + "." + f.GoName + if f.Desc.IsList() { + selector += "[i]" + g.P("out.RawByte('[')") + defer g.P("out.RawByte(']')") + + g.P("for i := range ", name, ".", f.GoName, " {") + g.P("if i != 0 { out.RawByte(',') }") + defer g.P("}") + } + + var template string + switch f.Desc.Kind() { + case protoreflect.BoolKind: + template = "out.Bool(%s)" + case protoreflect.EnumKind: + template = "out.Int32(int32(%s))" + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: + template = "out.Int32(%s)" + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: + template = "out.Uint32(%s)" + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: + template = "out.Int64(%s)" + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: + template = "out.Uint64(%s)" + case protoreflect.FloatKind: + template = "out.Float32(%s)" + case protoreflect.DoubleKind: + template = "out.Float64(%s)" + case protoreflect.StringKind: + template = "out.String(%s)" + case protoreflect.BytesKind: + template = "out.Base64Bytes(%s)" + case protoreflect.MessageKind: + template = "%s.MarshalEasyJSON(out)" + case protoreflect.GroupKind: + panic("unimplemented") + } + g.P(fmt.Sprintf(template, selector)) +} + +func fieldJSONName(f *protogen.Field) string { + if f.Desc.HasJSONName() { + return f.Desc.JSONName() + } + return string(f.Desc.Name()) +} diff --git a/util/protogen/internalgengo/options.go b/util/protogen/internalgengo/options.go new file mode 100644 index 0000000..8aab8f0 --- /dev/null +++ b/util/protogen/internalgengo/options.go @@ -0,0 +1,7 @@ +package internalgengo + +type Options struct { + Fuzz bool `yaml:"fuzz"` + JSON bool `yaml:"json"` + MessageData []string `yaml:"message_data"` +} diff --git a/util/protogen/internalgengo/proto.go b/util/protogen/internalgengo/proto.go new file mode 100644 index 0000000..8e5e967 --- /dev/null +++ b/util/protogen/internalgengo/proto.go @@ -0,0 +1,201 @@ +package internalgengo + +import ( + "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/reflect/protoreflect" +) + +func emitProtoMethods(g *protogen.GeneratedFile, msg *protogen.Message) { + emitMarshalProtobuf(g, msg) + emitUnmarshalProtobuf(g, msg) +} + +func emitUnmarshalProtobuf(g *protogen.GeneratedFile, msg *protogen.Message) { + g.P("// UnmarshalProtobuf implements the encoding.ProtoUnmarshaler interface.") + g.P("func (x *", msg.GoIdent.GoName, ") UnmarshalProtobuf(src []byte) (err error) {") + g.P("var fc ", easyprotoPackage.Ident("FieldContext")) + g.P("for len(src) > 0 {") + { + g.P("src, err = fc.NextField(src)") + g.P("if err != nil { return ", fmtPackage.Ident("Errorf"), `("cannot read next field in %s", "`, msg.GoIdent.GoName, `")}`) + g.P("switch fc.FieldNum {") + { + for _, f := range msg.Fields { + g.P("case ", f.Desc.Number(), ":", " // ", f.GoName) + emitFieldUnmarshal(g, f) + } + } + g.P("}") + } + g.P("}") + + g.P("return nil") + g.P("}") +} + +func emitFieldUnmarshal(g *protogen.GeneratedFile, f *protogen.Field) { + name := castFieldName(f) + if f.Desc.Kind() == protoreflect.MessageKind { + g.P("data, ok := fc.MessageData()") + g.P(`if !ok { return fmt.Errorf("cannot unmarshal field %s", "`, f.GoName, `") }`) + if f.Desc.IsList() { + g.P(name, " = append(", name, ", new(", fieldType(g, f)[3:], "))") + g.P("ff := ", name, "[len(", name, ")-1]") + name = "ff" + } else if f.Oneof != nil { + const tmp = "oneofField" + g.P(tmp, " := &", f.GoIdent, "{", f.GoName, ": ", "new(", fieldType(g, f)[1:], ")}") + defer g.P(name, " = ", tmp) + + name = tmp + "." + f.GoName + } else { + g.P(name, " = new(", fieldType(g, f)[1:], ")") + } + + g.P(`if err := `, name, `.UnmarshalProtobuf(data); err != nil { return fmt.Errorf("unmarshal: %w", err)}`) + return + } + + getter, _ := easyprotoKindInfo(f.Desc.Kind()) + + if f.Desc.IsList() && (f.Desc.Kind() == protoreflect.BytesKind || f.Desc.Kind() == protoreflect.StringKind || f.Desc.Kind() == protoreflect.Uint64Kind && !f.Desc.IsPacked()) { + g.P("data, ok := fc.", getter, "()") + g.P(`if !ok { return fmt.Errorf("cannot unmarshal field %s", "`, f.GoName, `") }`) + g.P(name, " = append(", name, ", data)") + return + } + + if f.Desc.IsList() { + g.P("data, ok := fc.Unpack", getter, "s(nil)") + } else { + g.P("data, ok := fc.", getter, "()") + } + + g.P(`if !ok { return fmt.Errorf("cannot unmarshal field %s", "`, f.GoName, `") }`) + value := "data" + if f.Desc.Kind() == protoreflect.EnumKind { + value = fieldType(g, f).String() + "(data)" + } + + if f.Oneof == nil { + g.P("x.", f.GoName, " = ", value) + } else { + g.P("x.", f.Oneof.GoName, " = &", f.GoIdent, "{", f.GoName, ": data}") + } +} + +func emitMarshalProtobuf(g *protogen.GeneratedFile, msg *protogen.Message) { + g.P("// MarshalProtobuf implements the encoding.ProtoMarshaler interface.") + g.P("func (x *", msg.GoIdent.GoName, ") MarshalProtobuf(dst []byte) []byte {") + g.P("m := ", mp, ".Get()") + g.P("defer ", mp, ".Put(m)") + g.P("x.EmitProtobuf(m.MessageMarshaler())") + g.P("dst = m.Marshal(dst)") + g.P("return dst") + g.P("}\n") + + g.P("func (x *", msg.GoIdent.GoName, ") EmitProtobuf(mm *", easyprotoPackage.Ident("MessageMarshaler"), ") {") + if len(msg.Fields) != 0 { + fs := sortFields(msg.Fields) + + g.P("if x == nil { return }") + for _, f := range fs { + emitFieldMarshal(g, f) + } + } + g.P("}") +} + +func emitMarshalOneof(g *protogen.GeneratedFile, f *protogen.Field) { + name := "x." + f.Oneof.GoName + g.P("if inner, ok := ", name, ".(*", f.GoIdent.GoName, "); ok {") + defer g.P("}") + emitMarshalRaw(g, f, "inner."+f.GoName) +} + +// easyprotoKindInfo returns string name for kind, used in easyproto methods. +// The second return value is a condition to test for the default value of kind. +func easyprotoKindInfo(kind protoreflect.Kind) (string, func(string) string) { + switch kind { + case protoreflect.BoolKind: + return "Bool", identity + case protoreflect.EnumKind: + return "Int32", notZero + case protoreflect.Int32Kind: + return "Int32", notZero + case protoreflect.Sint32Kind: + return "Sint32", notZero + case protoreflect.Uint32Kind: + return "Uint32", notZero + case protoreflect.Int64Kind: + return "Int64", notZero + case protoreflect.Sint64Kind: + return "Sint64", notZero + case protoreflect.Uint64Kind: + return "Uint64", notZero + case protoreflect.Sfixed32Kind: + return "Sfixed32", notZero + case protoreflect.Fixed32Kind: + return "Fixed32", notZero + case protoreflect.FloatKind: + return "Float", notZero + case protoreflect.Sfixed64Kind: + return "Sfixed64", notZero + case protoreflect.Fixed64Kind: + return "Fixed64", notZero + case protoreflect.DoubleKind: + return "Double", notZero + case protoreflect.StringKind: + return "String", notEmpty + case protoreflect.BytesKind: + return "Bytes", notEmpty + case protoreflect.GroupKind: + panic("unimplemented") + default: + panic("unreachable") + } +} + +func emitFieldMarshal(g *protogen.GeneratedFile, f *protogen.Field) { + if f.Oneof != nil { + emitMarshalOneof(g, f) + return + } + + emitMarshalRaw(g, f, castFieldName(f)) +} + +func emitMarshalRaw(g *protogen.GeneratedFile, f *protogen.Field, name string) { + if f.Desc.Kind() == protoreflect.MessageKind { + if f.Desc.IsList() { + g.P("for i := range ", name, " {") + defer g.P("}") + + name += "[i]" + } + + g.P("if ", notNil(name), " && ", name, ".StableSize() != 0 {") + g.P(name, ".EmitProtobuf(mm.AppendMessage(", f.Desc.Number(), "))") + g.P("}") + return + } + + method, cond := easyprotoKindInfo(f.Desc.Kind()) + method = "Append" + method + if f.Desc.IsList() && !f.Desc.IsPacked() { + g.P("for j := range ", name, " {") + g.P("mm.", method, "(", f.Desc.Number(), ", ", name, "[j])") + g.P("}") + return + } + + if f.Desc.IsList() { + method += "s" + g.P("if ", notEmpty(name), "{") + } else { + g.P("if ", cond(name), " {") + } + + g.P("mm.", method, "(", f.Desc.Number(), ", ", name, ")") + g.P("}") +} diff --git a/util/protogen/internalgengo/proto_field_type.go b/util/protogen/internalgengo/proto_field_type.go new file mode 100644 index 0000000..09f6884 --- /dev/null +++ b/util/protogen/internalgengo/proto_field_type.go @@ -0,0 +1,56 @@ +package internalgengo + +import ( + "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/reflect/protoreflect" +) + +type structField string + +func (f structField) String() string { + return string(f) +} + +func (f structField) PointerTo() structField { + return "*" + f +} + +func (f structField) SliceOf() structField { + return "[]" + f +} + +func fieldType(g *protogen.GeneratedFile, field *protogen.Field) structField { + var typ structField + switch field.Desc.Kind() { + case protoreflect.BoolKind: + typ = "bool" + case protoreflect.EnumKind: + typ = structField(g.QualifiedGoIdent(field.Enum.GoIdent)) + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: + typ = "int32" + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: + typ = "uint32" + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: + typ = "int64" + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: + typ = "uint64" + case protoreflect.FloatKind: + typ = "float32" + case protoreflect.DoubleKind: + typ = "float64" + case protoreflect.StringKind: + typ = "string" + case protoreflect.BytesKind: + typ = "[]byte" + case protoreflect.MessageKind: + typ = structField(g.QualifiedGoIdent(field.Message.GoIdent)).PointerTo() + case protoreflect.GroupKind: + panic("unimplemented") + } + + if field.Desc.IsList() { + typ = "[]" + typ + } + + return typ +} diff --git a/util/protogen/internalgengo/proto_stable_compat.go b/util/protogen/internalgengo/proto_stable_compat.go new file mode 100644 index 0000000..c27b9d8 --- /dev/null +++ b/util/protogen/internalgengo/proto_stable_compat.go @@ -0,0 +1,124 @@ +package internalgengo + +import ( + "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/reflect/protoreflect" +) + +var protowirePackage = protogen.GoImportPath("google.golang.org/protobuf/encoding/protowire") + +func emitStableSize(g *protogen.GeneratedFile, msg *protogen.Message) { + fs := sortFields(msg.Fields) + + g.P("// StableSize returns the size of x in protobuf format.") + g.P("//") + g.P("// Structures with the same field values have the same binary size.") + g.P("func (x *", msg.GoIdent.GoName, ") StableSize() (size int) {") + g.P("if x == nil { return 0 }") + if len(fs) != 0 { + for _, f := range fs { + if f.Desc.IsList() && marshalers[f.Desc.Kind()].RepeatedDouble && !(f.Desc.Kind() == protoreflect.Uint64Kind && !f.Desc.IsPacked()) { + g.P("var n int") + break + } + } + for _, f := range fs { + emitFieldSize(g, f) + } + } + g.P("return size") + g.P("}\n") +} + +func emitSignatureMethods(g *protogen.GeneratedFile, msg *protogen.Message) { + // SignedDataSize implementation (only for requests and responses). + g.P("// ReadSignedData fills buf with signed data of x.") + g.P("// If buffer length is less than x.SignedDataSize(), new buffer is allocated.") + g.P("//") + g.P("// Returns any error encountered which did not allow writing the data completely.") + g.P("// Otherwise, returns the buffer in which the data is written.") + g.P("//") + g.P("// Structures with the same field values have the same signed data.") + g.P("func (x *", msg.GoIdent.GoName, ") SignedDataSize() int {") + g.P("return x.GetBody().StableSize()") + g.P("}\n") + + // ReadSignedData implementation (only for requests and responses). + g.P("// SignedDataSize returns size of the request signed data in bytes.") + g.P("//") + g.P("// Structures with the same field values have the same signed data size.") + g.P("func (x *", msg.GoIdent.GoName, ") ReadSignedData(buf []byte) ([]byte, error) {") + g.P("return x.GetBody().MarshalProtobuf(buf), nil") + g.P("}\n") +} + +func emitFieldSize(g *protogen.GeneratedFile, f *protogen.Field) { + m := marshalers[f.Desc.Kind()] + if m.Prefix == "" { + g.P("// FIXME missing field marshaler: ", f.GoName, " of type ", f.Desc.Kind().String()) + g.P(`panic("unimplemented")`) + return + } + + name := castFieldName(f) + if f.Oneof != nil { + name = "x." + f.Oneof.GoName + g.P("if inner, ok := ", name, ".(*", f.GoIdent.GoName, "); ok {") + defer g.P("}") + name = "inner." + f.GoName + } + + switch { + case f.Desc.IsList() && (f.Desc.Kind() == protoreflect.MessageKind || f.Desc.Kind() == protoreflect.Uint64Kind && !f.Desc.IsPacked()): + g.P("for i := range ", name, "{") + if f.Desc.Kind() == protoreflect.MessageKind { + g.P("size += ", protoPackage.Ident("NestedStructureSize"), "(", f.Desc.Number(), ", ", name, "[i])") + } else { + if f.Desc.Kind() != protoreflect.Uint64Kind { + panic("only uint64 unpacked primitive is supported") + } + + g.P("size += ", protowirePackage.Ident("SizeGroup"), "(", + protowirePackage.Ident("Number"), "(", f.Desc.Number(), "), ", + protowirePackage.Ident("SizeVarint"), "(", name, "[i]))") + } + g.P("}") + + case f.Desc.IsList(): + if m.RepeatedDouble { + g.P("n, _ = ", protoPackage.Ident("Repeated"+m.Prefix+"Size"), "(", f.Desc.Number(), ", ", name, ")") + g.P("size += n") + } else { + g.P("size += ", protoPackage.Ident("Repeated"+m.Prefix+"Size"), "(", f.Desc.Number(), ", ", name, ")") + } + default: + g.P("size += ", protoPackage.Ident(m.Prefix+"Size"), "(", f.Desc.Number(), ", ", name, ")") + } +} + +type marshalerDesc struct { + Prefix string + RepeatedDouble bool +} + +// Unused kinds are commented. +var marshalers = map[protoreflect.Kind]marshalerDesc{ + protoreflect.BoolKind: {Prefix: "Bool"}, + protoreflect.EnumKind: {Prefix: "Enum"}, + protoreflect.Int32Kind: {Prefix: "Int32", RepeatedDouble: true}, + // protoreflect.Sint32Kind: "", + protoreflect.Uint32Kind: {Prefix: "UInt32", RepeatedDouble: true}, + protoreflect.Int64Kind: {Prefix: "Int64", RepeatedDouble: true}, + // protoreflect.Sint64Kind: "", + protoreflect.Uint64Kind: {Prefix: "UInt64", RepeatedDouble: true}, + // protoreflect.Sfixed32Kind: "", + protoreflect.Fixed32Kind: {Prefix: "Fixed32", RepeatedDouble: true}, + // protoreflect.FloatKind: "", + // protoreflect.Sfixed64Kind: "", + protoreflect.Fixed64Kind: {Prefix: "Fixed64", RepeatedDouble: true}, + protoreflect.DoubleKind: {Prefix: "Float64"}, + protoreflect.StringKind: {Prefix: "String"}, + protoreflect.BytesKind: {Prefix: "Bytes"}, + protoreflect.MessageKind: {Prefix: "NestedStructure"}, + // protoreflect.GroupKind: "", +} diff --git a/util/protogen/internalgengo/writer.go b/util/protogen/internalgengo/writer.go new file mode 100644 index 0000000..7b0d4f1 --- /dev/null +++ b/util/protogen/internalgengo/writer.go @@ -0,0 +1,30 @@ +package internalgengo + +import ( + "fmt" +) + +type condition = func(string) string + +var ( + _ condition = notZero + _ condition = notEmpty + _ condition = identity + _ condition = notNil +) + +func notZero(name string) string { + return fmt.Sprintf("%s != 0", name) +} + +func notEmpty(name string) string { + return fmt.Sprintf("len(%s) != 0", name) +} + +func identity(name string) string { + return name +} + +func notNil(name string) string { + return fmt.Sprintf("%s != nil", name) +} diff --git a/util/protogen/main.go b/util/protogen/main.go index 0f2a7ca..bfce1bf 100644 --- a/util/protogen/main.go +++ b/util/protogen/main.go @@ -1,258 +1,37 @@ package main import ( - "sort" - "strings" + "flag" + "fmt" + "os" + "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/protogen/internalgengo" "google.golang.org/protobuf/compiler/protogen" - "google.golang.org/protobuf/reflect/protoreflect" -) - -var ( - protowirePackage = protogen.GoImportPath("google.golang.org/protobuf/encoding/protowire") - binaryPackage = protogen.GoImportPath("encoding/binary") ) func main() { - protogen.Options{}.Run(func(gen *protogen.Plugin) error { + var flags flag.FlagSet + genFuzz := flags.Bool("fuzz", false, "generate fuzz tests") + yamlConfigPath := flags.String("config", "", "path to the configuration") + + protogen.Options{ + ParamFunc: flags.Set, + }.Run(func(gen *protogen.Plugin) error { + if *yamlConfigPath != "" { + s, e := os.Getwd() + fmt.Fprintln(os.Stderr, s, e) + data, err := os.ReadFile(*yamlConfigPath) + fmt.Fprintln(os.Stderr, string(data), err) + } + for _, f := range gen.Files { if f.Generate { - generateFile(gen, f) + internalgengo.GenerateFile(gen, f) + if *genFuzz { + internalgengo.GenerateFuzzTests(gen, f) + } } } return nil }) } - -// generateFile generates a *.pb.go file enforcing field-order serialization. -func generateFile(gen *protogen.Plugin, file *protogen.File) *protogen.GeneratedFile { - filename := file.GeneratedFilenamePrefix + "_frostfs.pb.go" - g := gen.NewGeneratedFile(filename, file.GoImportPath) - g.P("// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.") - g.P() - g.P("package ", file.GoPackageName) - g.P() - g.P(`import "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/proto"`) - - //for _, e := range file.Enums { - // g.P("type " + e.GoIdent.GoName + " int32") - // g.P("const (") - // for _, ev := range e.Values { - // g.P(ev.GoIdent.GoName, " = ", ev.Desc.Number()) - // } - // g.P(")") - //} - for _, msg := range file.Messages { - emitMessage(g, msg) - } - return g -} - -func emitMessage(g *protogen.GeneratedFile, msg *protogen.Message) { - for _, inner := range msg.Messages { - emitMessage(g, inner) - } - - fs := sortFields(msg.Fields) - - // StableSize implementation. - g.P("// StableSize returns the size of x in protobuf format.") - g.P("//") - g.P("// Structures with the same field values have the same binary size.") - g.P("func (x *", msg.GoIdent.GoName, ") StableSize() (size int) {") - g.P("if x == nil { return 0 }") - if len(fs) != 0 { - for _, f := range fs { - if f.Desc.IsList() && marshalers[f.Desc.Kind()].RepeatedDouble && !(f.Desc.Kind() == protoreflect.Uint64Kind && !f.Desc.IsPacked()) { - g.P("var n int") - break - } - } - for _, f := range fs { - emitFieldSize(g, f) - } - } - g.P("return size") - g.P("}\n") - - // StableMarshal implementation. - g.P("// StableMarshal marshals x in protobuf binary format with stable field order.") - g.P("//") - g.P("// If buffer length is less than x.StableSize(), new buffer is allocated.") - g.P("//") - g.P("// Returns any error encountered which did not allow writing the data completely.") - g.P("// Otherwise, returns the buffer in which the data is written.") - g.P("//") - g.P("// Structures with the same field values have the same binary format.") - g.P("func (x *", msg.GoIdent.GoName, ") StableMarshal(buf []byte) []byte {") - if len(fs) != 0 { - g.P("if x == nil { return []byte{} }") - g.P("if buf == nil { buf = make([]byte, x.StableSize()) }") - g.P("var offset int") - for _, f := range fs { - emitFieldMarshal(g, f) - } - } - g.P("return buf") - g.P("}\n") - - if strings.HasSuffix(msg.GoIdent.GoName, "Request") || strings.HasSuffix(msg.GoIdent.GoName, "Response") { - // SignedDataSize implementation (only for requests and responses). - g.P("// ReadSignedData fills buf with signed data of x.") - g.P("// If buffer length is less than x.SignedDataSize(), new buffer is allocated.") - g.P("//") - g.P("// Returns any error encountered which did not allow writing the data completely.") - g.P("// Otherwise, returns the buffer in which the data is written.") - g.P("//") - g.P("// Structures with the same field values have the same signed data.") - g.P("func (x *", msg.GoIdent.GoName, ") SignedDataSize() int {") - g.P("return x.GetBody().StableSize()") - g.P("}\n") - - // ReadSignedData implementation (only for requests and responses). - g.P("// SignedDataSize returns size of the request signed data in bytes.") - g.P("//") - g.P("// Structures with the same field values have the same signed data size.") - g.P("func (x *", msg.GoIdent.GoName, ") ReadSignedData(buf []byte) ([]byte, error) {") - g.P("return x.GetBody().StableMarshal(buf), nil") - g.P("}\n") - - // Signature setters and getters. - g.P("func (x *", msg.GoIdent.GoName, ") SetSignature(sig *Signature) {") - g.P("x.Signature = sig") - g.P("}\n") - } -} - -func emitFieldSize(g *protogen.GeneratedFile, f *protogen.Field) { - m := marshalers[f.Desc.Kind()] - if m.Prefix == "" { - g.P("// FIXME missing field marshaler: ", f.GoName, " of type ", f.Desc.Kind().String()) - g.P(`panic("unimplemented")`) - return - } - - name := castFieldName(f) - if f.Oneof != nil { - name = "x." + f.Oneof.GoName - g.P("if inner, ok := ", name, ".(*", f.GoIdent.GoName, "); ok {") - defer g.P("}") - name = "inner." + f.GoName - } - - switch { - case f.Desc.IsList() && (f.Desc.Kind() == protoreflect.MessageKind || f.Desc.Kind() == protoreflect.Uint64Kind && !f.Desc.IsPacked()): - g.P("for i := range ", name, "{") - if f.Desc.Kind() == protoreflect.MessageKind { - g.P("size += proto.NestedStructureSize(", f.Desc.Number(), ", ", name, "[i])") - } else { - if f.Desc.Kind() != protoreflect.Uint64Kind { - panic("only uint64 unpacked primitive is supported") - } - - g.P("size += ", protowirePackage.Ident("SizeGroup"), "(", - protowirePackage.Ident("Number"), "(", f.Desc.Number(), "), ", - protowirePackage.Ident("SizeVarint"), "(", name, "[i]))") - } - g.P("}") - case f.Desc.IsList(): - if m.RepeatedDouble { - g.P("n, _ = proto.Repeated", m.Prefix, "Size(", f.Desc.Number(), ", ", name, ")") - g.P("size += n") - } else { - g.P("size += proto.Repeated", m.Prefix, "Size(", f.Desc.Number(), ", ", name, ")") - } - default: - g.P("size += proto.", m.Prefix, "Size(", f.Desc.Number(), ", ", name, ")") - } -} - -func emitFieldMarshal(g *protogen.GeneratedFile, f *protogen.Field) { - m := marshalers[f.Desc.Kind()] - if m.Prefix == "" { - g.P("// FIXME missing field marshaler: ", f.GoName, " of type ", f.Desc.Kind().String()) - g.P(`panic("unimplemented")`) - return - } - - name := castFieldName(f) - if f.Oneof != nil { - name = "x." + f.Oneof.GoName - g.P("if inner, ok := ", name, ".(*", f.GoIdent.GoName, "); ok {") - defer g.P("}") - name = "inner." + f.GoName - } - - prefix := m.Prefix - if f.Desc.IsList() { - prefix = "Repeated" + m.Prefix - } - switch { - case f.Desc.IsList() && (f.Desc.Kind() == protoreflect.MessageKind || f.Desc.Kind() == protoreflect.Uint64Kind && !f.Desc.IsPacked()): - g.P("for i := range ", name, "{") - if f.Desc.Kind() == protoreflect.MessageKind { - g.P("offset += proto.NestedStructureMarshal(", f.Desc.Number(), ", buf[offset:], ", name, "[i])") - } else { - if f.Desc.Kind() != protoreflect.Uint64Kind { - panic("only uint64 unpacked primitive is supported") - } - g.P("{") - g.P("prefix := ", protowirePackage.Ident("EncodeTag"), "(", - protowirePackage.Ident("Number"), "(", f.Desc.Number(), "), ", - protowirePackage.Ident("VarintType"), ")") - g.P("offset += ", binaryPackage.Ident("PutUvarint"), "(buf[offset:], uint64(prefix))") - g.P("offset += ", binaryPackage.Ident("PutUvarint"), "(buf[offset:], ", name, "[i])") - g.P("}") - } - g.P("}") - case f.Desc.IsList(): - g.P("offset += proto.Repeated", m.Prefix, "Marshal(", f.Desc.Number(), ", buf[offset:], ", name, ")") - default: - g.P("offset += proto.", prefix, "Marshal(", f.Desc.Number(), ", buf[offset:], ", name, ")") - } -} - -func castFieldName(f *protogen.Field) string { - name := "x." + f.GoName - if f.Desc.Kind() != protoreflect.EnumKind { - return name - } - return "int32(" + name + ")" -} - -type marshalerDesc struct { - Prefix string - RepeatedDouble bool -} - -// Unused kinds are commented. -var marshalers = map[protoreflect.Kind]marshalerDesc{ - protoreflect.BoolKind: {Prefix: "Bool"}, - protoreflect.EnumKind: {Prefix: "Enum"}, - - protoreflect.Int32Kind: {Prefix: "Int32", RepeatedDouble: true}, - // protoreflect.Sint32Kind: "", - protoreflect.Uint32Kind: {Prefix: "UInt32", RepeatedDouble: true}, - protoreflect.Int64Kind: {Prefix: "Int64", RepeatedDouble: true}, - // protoreflect.Sint64Kind: "", - protoreflect.Uint64Kind: {Prefix: "UInt64", RepeatedDouble: true}, - // protoreflect.Sfixed32Kind: "", - protoreflect.Fixed32Kind: {Prefix: "Fixed32", RepeatedDouble: true}, - // protoreflect.FloatKind: "", - // protoreflect.Sfixed64Kind: "", - protoreflect.Fixed64Kind: {Prefix: "Fixed64", RepeatedDouble: true}, - protoreflect.DoubleKind: {Prefix: "Float64"}, - protoreflect.StringKind: {Prefix: "String"}, - protoreflect.BytesKind: {Prefix: "Bytes"}, - protoreflect.MessageKind: {Prefix: "NestedStructure"}, - // protoreflect.GroupKind: "", -} - -func sortFields(fs []*protogen.Field) []*protogen.Field { - res := make([]*protogen.Field, len(fs)) - copy(res, fs) - sort.Slice(res, func(i, j int) bool { - return res[i].Desc.Number() < res[j].Desc.Number() - }) - return res -} diff --git a/util/signature/data.go b/util/signature/data.go index 5e7c310..62c3eaf 100644 --- a/util/signature/data.go +++ b/util/signature/data.go @@ -63,12 +63,6 @@ func SignDataWithHandler(key *ecdsa.PrivateKey, src DataSource, handler KeySigna } func VerifyDataWithSource(dataSrc DataSource, sigSrc KeySignatureSource, opts ...SignOption) error { - cfg := defaultCfg() - - for i := range opts { - opts[i](cfg) - } - buffer := buffersPool.Get(uint32(dataSrc.SignedDataSize())) defer buffersPool.Put(buffer) @@ -77,7 +71,7 @@ func VerifyDataWithSource(dataSrc DataSource, sigSrc KeySignatureSource, opts .. return err } - return verify(cfg, data, sigSrc()) + return VerifyDataSlice(data, sigSrc, opts...) } func SignData(key *ecdsa.PrivateKey, v DataWithSignature, opts ...SignOption) error { @@ -87,3 +81,13 @@ func SignData(key *ecdsa.PrivateKey, v DataWithSignature, opts ...SignOption) er func VerifyData(src DataWithSignature, opts ...SignOption) error { return VerifyDataWithSource(src, src.GetSignature, opts...) } + +func VerifyDataSlice(data []byte, sigSrc KeySignatureSource, opts ...SignOption) error { + cfg := defaultCfg() + + for i := range opts { + opts[i](cfg) + } + + return verify(cfg, data, sigSrc()) +}