From bf048fe8d491b0a3612317fed74b6f7c21fe98d4 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 -> 43676 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 -> 7833 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 -> 52066 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 -> 216486 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 -> 60092 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 -> 27843 bytes refs/grpc/types_frostfs_fuzz.go | 159 +++++ refs/grpc/types_frostfs_test.go | 91 +++ rpc/client/client.go | 2 + rpc/message/encoding.go | 35 +- 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 -> 65595 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 -> 13281 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 -> 18666 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 | 211 ++++++ 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, 4008 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 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 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 zcmd^o{c{sZlJ?KiU(x4_*s%#)_#4I-yb+8stmDAuu-V%H*xKj=`?6yF0j^iyc`_Jx`-ygz*68Vx=D@Q1K|5NJ z&z0s{v)P7BNF-SNTQcfi-ACh_c#My376`a4^2U>Fa&^^hcay=mcOOlL8{>4N0}ZsA zjf?1+>OfGpjs{mL#07{V_0{doXd`(0raQ1VYt2Rp@uLd-`cap2_An7z49@@p}+oN~S&yP<} zF5aJI&VaKEYD74yQtCMsbO|?8ZDzw~Y%U7cW+89B5 z$sh##>b%f+r_eYZMM;^CS4HT%?C?6tvMJE7i=g-NmQ`?H7vb(}>-4(Yj(gGRyO8G7 zcLkcC6q-Iic@eh7*Fxi`g~o&Ano16Ph;#7zg6aOu9&h4t`zFbvVLXNy3nF}d{O?8D zw>Hg)js}x{bQ||3Nd(W3MX>xFbgOwAkHiUhWEX?Dp8zA;exPZ6%*Lbc;QH5Qqp^7q zMJtuYv$BrYTk`toKlt~y{C#r7zjx&CSLghDmw)T?J^A~!KHulx`uvIfefo~=pUU5m zAHV!8UmzNO*#b2y!nS<-8gih_Dho>dM{*)8%pm_D+7u3idf=G;x5c;Mr}FJK--5%+ zw>$cFM&Dh&g%m3L?&;eZefRkmlB(?cgl|Q5Rj;4&tq8N~?azu=q+9WNON8}R?CWX* zcfER-8`N4P_O`kfJ@OV6LGHuo;2A>CmsS51uJzFnc6KLWU_2QOqG9uECBQS5Bf8_)vpoLp%1y^!d8!RUKIAAga6xO0idA2vT0NUOvyEx|6khD6Kr0OMa4Mww$N zXv&08fl1#4xTa|F0u#ks0M`x=h1A}L_}@m!=Zki6AM?SrKXVyfk_zT7X-o;M~X!%16~`ZDnPp!MbKrh ztO3d+3SUcfDmZJ!pL=TkE6aBpjZ=0+d{>XWo~W^@;4(yq!^z8`!Zq+bRKsM+ux!s(BHs8F2Wd)^**Z{gPrw8n{K z{3RWI4gj5=ygtU1X9|YRkhFa?8N|17w-;ab3}6W1<;!XiI(2#zBLpM^i40R*ym@|n za(;C3{N%8Lf}I+tS0vXvzvAP0PB4(6_kJo4@BdDfH-5)tU?m{fTw)1jt!oSsI-h6= z&F!f(bXfJF=I9~jgGe&-f@ds}k$cGE^Ma==zM7NOmKsMt%5#?S=0372&&=OG+=Fh< z@}OlBmh4Hl3!b!$?0b6DBCZ23^BKae`N|UWe_CJq_`FR^ysIkpTvWVAmZV$ zhmw%6CXEHsmzxw$eKODv=$VVK6+K76G95;}|5`e&974p#Um?RUpXe>lEh`9xa(J;976HNi9+@^u#U?Hu~&w65 z8$G~6bz23OVZQrF{|p7Cs@_{4B|}xUnp;*P);$f$4GJ;_crAK|d~FPGh2i_?4h0-V z_$w-K-K)aL%i^o#XduZ>M;bT!T`2<9S1tP4wFCyKlSq$DdgP<|@2xk1V?doJfAuz% z{75T0(y?`hd46KeB{^K}cM+VKceY2)~_t9}iV7{jSCn^3_)%?y}nG)vnJ0?n=49Nq8lRQJ}4x;q(pR!&&?8WV* zFD1DQUy%?kKjZi-sxc^Mqm17g%u1v7@-*s-DPRe+Jq*!?an-44 zIyZ4|mYtoTZukAO6G!~of@Ol*{3Hifm!XteEjdRKsr~756eq%kvlQ21t+?vA%mpwl zxB5IK$GFT)r2v(l7!lcgaa}lO(=Zrs7Se|zSb9vrRkv81v1pSJus*3+>za+wJI=+j z7T-KXTgqGt45?#W47j$PhKwMk^({$JEG%QLClv}=kVI^nuJB0uVvB|rDbi6ZI+iMs zq%E1xK$7t~>l>pKyL>F+K`}yd7>R)~)=7tHmUX41traA<_{b8+<-LHjwNtACq2@2N zNhtaqvm2jPlqH7PHJps+CKEyFWbtG|lKoCDU6()-Bf_WZtl4lTGBa8SnT%6aDP;P` zVbGL(=0!Y)=x^c?>SQFm**I#;Lyki?V1xW%I&VqZ7uZ!7Unt*FD|(jXAWDQ38<(kh ziz3b#6{He9`gjgSLCOLoLqaOj6o8qgs?Z^%D@-lSR;M!yd$H`q0%h#)pICUN&c40w z;bGOK6~#tN&MHJ?fBLM#B)D)=;U)gvY9HIhQkqAIl!D`SDZxL4>YUd6SJ4H^=qCM|0unBQWFM|M}s+Dw8)`gC%A!_o%!5oJSceA5j^etQm62mqG-=ED@h zp4+F8F>u91HkMEDDzkjxtt%nC)uz91Uhpm#Ch9o8^i$3fuz^ZzA5nspDQt$~z606& zCDjt_wuVSGyf+(W1}x9p-(hvaEyavneI9=>c`L;%|2Pa*g2&gCqDyS@pA4g`n7iCW zrK7Z```bE6GPJD|x>|=)6$qEzz|7l7aV$H`2Uys;RfFmd+P#Tvt(R?Wp@nFwr)DOp zk`=XnA^w+&ez7`?^}JBhFO>9kCKVoG2(}~?-=+khEF&8#&Mk1buyP}rum=L$FLIW* zM{Uu4nO5FTzPOTE>Reu4$)A@=bL&Ag9Jd}cRd4hC7h3Jv%?Z-tNtqn?v`ozVLHED0 zQ~atIU)uyhL^9Y&Zq0xl9Bv9R za=CXFi;%Iv1KPLRx{K=(CM>qT;#03GOqD@ou|%n|Yly#?mQ`VQzTK9Q+}B!8U8BNE z<|3?WC1)8cR<#mUZwwLAAJ^63v}GuQ{!~N+ew)gUPuI9X* zTq0$Pu&Kmt?Foox4eYWzh)39*#B8?N&<^SoAgRkymxb=3PVFReQrA6hw&5(dN>ur{ zrPx!VU#AOiL79u7jDi_^oQmMwx}kOq?IKL9T%YNT%Dq{3Dz*C~QYlCLQgWyqSY7f| zYPIC7Nu>6t&zhVF7fzR4hwqpt?H2Q-93v7WA4r%XF_hFrTHibjw&k3mfWU_bB7n=3 zDOeo}-(hhS-ir}Om3OQ~=({hBk4yH2Jsa+5q8DODHb5qmqAzzv1&FHBp?F;RYI!ILZpQNLz!2E7d~HhaM}AI!Npiw z!V(IM0d~3;)drTZ&62~4$m`D^Rw%&5gNn)fyDgvWl|qW)LqOr^hikO)U*{6pG<1o@ zd9E`o0ObfTI``Tb!uBELe21i^uy&*kx%O4}dZO2qcn>Rn1(R~T`JElDtF2Kx!4>= zwKtSnhOCcD0vBJVld(IVthfpuQQH2_{xIJt#&xgBh_@*)Wt5aq9v1vN*7mdwLye0` z(?yCPCv9to3j(!;yZ}ZiaV)kD-KAu$Z(>}%6s*DueNx(K-(de)sgz{`Z?KQ?IWvb2 zHc<5i$Azx+D!F{35K7b*+D;LROGCQY1&>pY+1q6FOD}DIc1bp_Y;pm}DnZq3u#RPk zd9(2*hcjz35FCH&XBRj%cX26rjS=6!%tzR?%tyfhWNkDE@Qp&Cj2;!g26mydhM;z3 zOksnTz*G9{nY#26iKX@-k)^4HjCvVbGsCF7Ty_wB@&kjYGPj(WMlP&5(~VNYC5KND z-~W~HDe8M@@Klw5x7o*&%FwAu5jaDizt~J9>=6dasR>DLR=^Xu>c!9m9Ug$idqE&k zKUx>@bEmsFih>&imXcqrLs#e;V$5e;&pUnWokHa=#-6GTw{6?6T$CfkHm@ zD_4uH{NrF{9iJdm4U<&B53Q(ftf;HpJ2DjA%18xFC1OqUC(AWs4|P=RP! ztpnK;Z+~Koc;%bnPw>!BGv3oGcOi5pRD~0&Z3RpOio0h)sKz~41PpJCR-a{{UW-jn=nPmQ_cx+Y6PWZ=+}`GD4ADRKpASMHpm3# zRWF5BsSh}0m*7(*BHb7Umd*x*XYss(ih{v5S8Q#>R1aHM zDg2G-{mI7b(?bm5T%cy`*GYOkiibCtz#t=6Bkppvh|)g1KY6SjKd#=4$HVO4@#8OF zzO*LT9gy(aU_j_xOEwqqbx)_V>wX+Z}a&A(x%@5+2uCXU~u#S6XaH}}>V)|28>!!&r_VLolV61M3wIcxS zdAqo<3(vycCR_p%^LPgdqjn+cyTpF-NhSk8UTp6pv|`$dmodgZKW+sILh-XUhy`$>~w7{4q}GP#jQ!c#PKWlfaaR^I2W`~Y|WN1hq&=c ziTZ@x1eX;VsS&(#ur!wsti=b^c6lHvi5rpPn;H`J0+5kXGdy(EKZLk%5uVp4Dg_7| zk_7s3V%`?{rM=-8kK65Z)S)G-6Z~+7Q8U=c0pK`)();Mt=zVat*Ye%|Rm(z!LGNHZ z*jXLjaj5iU!QKHeb}&Y98AG@tIkhmRC1|VwVb|BoL=#A-6zei_( zJ$?WBh2*0$qVefBiAk>E4sQBxZ)9_qNK&e6NUS9kZ)Azou4H(-{bPMx{MFs?prpHy z|B{gzedWR*1TEgbEOk+YQ67@Wld9ZvBYjISGT=r?qQHUXFcyY#c^EvAT`M78P771# zsQ!r@dePYsc>wPFr`xl`BqBeV#|9g_blxG$UEBsG(U<=aDed-Xe{vpdF8jJMnNVro zTuLPC@6HMesz|6ywJ~`T7R01f`Zr!&H3O5rv^;F8N*5GEnTVFK>9aDvw>lXEDVWyi z{Gde>NbX`D6Ov%?=@6MJrkr9`6HL-D5&ZNnxrR|7cn|cH46a1MT^ytPPuPf{KzM=CD#;1rsCE7 zuzo)XuORz#T!A(1-xe<|R_NioRT%yKlYWQ#H05g%YJl*MD43aRswhu^(j$AvWy@#KZRGXy*wrbGnJmt69dBQ4Iod4F~;e$;9UwgcP6 z;In(&u;0)7=no3XtpCxY=M&t<`7%i!J<78ud_`mI-PU{PIq8?;AuqL$aAh)P8a9nQ z=5>YdBqsM0xe?2!4V2sg(u481muw`6+n7+;yc$1sq%{uQ)N37tmS5tm+ddv3!${sC z=!PU6qADa2Gps*cTM1qDI;B2bE?8rNQ+9Ki+0R`gccaS4^BGvLE>lRp|@ zNaR`5Z{Xw5oqT-W>&DqE;R>~qmUcw7di@u&@3#CJj^sxsd;d-;{TA_hvg#b^g3<)_8j$P|DwL)JoF2j+G(z$~97CQ=V9e;zN^1LTE z({`q0hU$!7iH2Gw%X&graMd=(GWZckB7<7|OXa|OsL1fES*O&3Tm&2vg%{mEe)UK$ z4i;SvZ|>o4SVIy5U|(u|szbTh*IQj!DvdO$ewb(bPaI_F;AcoGv`6)b3Z>8~Z7_!c zb%>C1XK~<#W%epJ+0kQtoBr;O4qv#-U8+QsS32oe?IIQ-^5`%qt!v%Y~QC3h|kshW>5F+K?NX?IQ%DBLRH9#m$i{wc- zC6Xy)j`3C|kM6SLS@0h`O)N~is%2g=_o{BV>3$g?pP9{~!B5Z3CDcu9O4GBcBTY3pm@#nz#YCwN3!7F< zo^UiqE+U`#3v5~yKv7kGysITG^Od)xJ;U=l1}J-3+KUA{u?JAodB= zQ1b6Bg2qqu2@wHV+HzZ;$S(&1K?rnTI_$8sH3~Y<^4UeRp3M)AvEPcWolID zcwWG8b@UiP1Zo7S{?r;T$$=@2kLD^(XjBlC`;&PClU6kCZB%Is@L?L7%{LLKG^sSB zj(`8mQC%4N50K_%N5acITy)T^hCo>FDDK(Q- zK2#sHy^==|1O+cdeVAmmvkF89(KI*`u@m|t)tvUyaj>rgjh$5og)yNvQ|~rrTcB{@ zgTq5j5bZ1Com$``9GIYrEDO+C9IMXM_SAK2$g~brks6tWN%c$YrVbzsL<>3(3 zT@OX0RFg|HaphP)je}WXQvC^)KgZsSKt+rWCdYx=4{6!v=Ti>-!WiZg)r$Fg+LZ#b zc&>`2By8~NKnuP3LW77PDtM|IL*$@#5N)YF=qH61juqoT2Ov49@Fp1LbKMt?XBvdC=U^lGG%tnMswuravrf3w%?tBcvpTj4~>dA z(algQXQ7QNA5)xJcB>7B!+6EZm<&^@*5Dk=m4i2%zY zmKhw|7*dYO2Q(@OHrc@tXb2=48xtxJN0A^1!i)7%?zOKv9+G17108ic1Y}mE=BU!- zbCdEE2(u`HGcyT?p(@!jYTAaSFr;EBDGYU>G^(koC{z>FilSNE3l)Z><)(`ZfkN8} z4A*9Mf$~EQL4f2y)k4*orz9X7pQ?#a?G&bkAaZFf)oBMUZ5)`{5l|`VfX&RxIkw1m z=zUAHi@jOEnWBAn0jh0gSEM%|B}%Sk*E&93m`0-qIb`3y!kf)BQzHAZW~z3ga@XM& z=s=xgs7o_eo9REWvkK70KV@y>zbc6rGd27=8rZ==O#4ofQZe$`vQngiz+TXb6|_E? zJ9`nEnKANx^?(D7GM(nb2nveqfUzLJ;igfO?=nOhYu{8j+HNdYSTV80a@c`%#Vq z5({%|%}pz8pQ6wlN#FivP0&nLviiAfP2>o)NMk;7ie;1dBEq3ocAc{k1e>((-==Ew zU34Bcl4$g^3$vuXLM!3eE`kv6#J7fwYByw7`Blp$Xq!M&6a{;rEzLo!0xUuk5t(1) zYokK_E2X)~h*mL4QX*&?s=38nMJS2~g4WQaSz$p$_4cDY=`6^)(O>P61C3}3L1#O= z`kZ<~ToVy#2B1OCUQ(L`OzQ(H=Q7E|o@-WgMtj)L3+6Sn^A3DnUb|G%nyg zl;f?U?TgbU8rYt2p!tMNC1{`)QD+T0f(xC82PdF4h0($IRCS;ZIUMf9uQL|wK%fSQ zoqbpbP#b`JUdmjlWLm{Ph)4h)dD9T#pD;A<7`d z^;GSOh)wNuzlK=bQ)o{#HD-IumuTX?szC&bQz@dW*k?Dj5H(XnLt$3@)cM?7 z5Gdw?s|xL>N_8T4k}@rQ6`DO?+FB-MP$@u)Xto4JnKJ~aG+H@F&4l{1BvUgh3pk;T z>!{|Z%KbqS2SEjaYe8yo)i4Kf*wQe<5H9G<-1XK;B>|7C_L&Odml{^EShQQ0|L8n7Wl|OIL2?8BT z1#2NtmFae;x^9X{`+D?(U>1IjTxO=zh*c95 zuW3;cD3>bsC&~f!u9$5qO8J_4wFAMKrSb2IctD^Q4`{^jvckcpnrRWUjNt&Wx`8<; zm8WnV*g_patFu!MOf0G!b~DbD4;4iyG?HjM(FD8^3kSv&Us&j%TUPgLh}8rFlvdZ9 zg^Z*i||tRbK|Cg9S^fzqgE zN4m_j^SO>vEhHf&&H9(BfBM8(U7R>iS-2>A7f|;u2($e?HU`1L_6Ex4G z?a8rvty1C+QfvcLp@S-uCTksN=_)iWA5OO~Ake-AGL$kR*&Y+pb?E`58^ zL4hKwT2*HVf-FyGoYtP4*(5~;74ogq0Q056~YY z!Vr@bn=UE`8fw(U)rvIWnDi+YMWcC!O|MnHIzCl56idOPP=>V1}YDO04&*q;JgzXfzh^O7n!)PdSHZ6H=( zPiA$)LpW~GfMWnCegCweH7@^96sgY<*;cTj^HeXNlYF+lcie5n$kh^cLLKQ*~ z1)HH7m1;~<Qf z0Pk$ekqnGhpsHeCO}dp1599>k1@8#j_i& zfN8aRG4AS_1JJn%#AX3lHG)g#-@@f~{6*n8ko~YjJQmPZgS!kmbH8^x2e#v}*)YLY zjr%h22TB+s2Gv#mz?-eVBW#}9e2>7;k!}fsIzQ3kQRg|b@UYEMBfS*3v%N=aAQu%Z z2o$Z6He)RP#KJL`m^tcK!D}PC{&8NA>yv4ry!aqg==) z=gaZq(;K{zN=^sk7TX)S31TuHPR189#vjtHJ9tp91lMli`bfD0)H#!du;u;u7k-i3 z`>YR}Gg;#`aRDZGs#bnZU9!b`KWVMLE|9`HfIPJcuQl^HT!gC(kWnyE)vS>x@^IGk zU-Im(c=^uUoYtjxA2vU>j_!uItPwYMAVHUu_*O3!)D#VuP03f@ao<+AUpZxqAItcnkTkaX#Jdi(Kvip}?9k2fN*3@fUA#jLac!#PC!gjgIWWbAJ zU&?iU_+gnw12;;>xFW64PR>K()mMDT|KQkWiuc0HVryx#aNc+A4=j!CrAfmjrGH>y z>?}tEa1W#8!gwMFf%qB{PvCSk`s1(v~EMHX9qKnKnTYU#*J)brcs)i7!MwfVm| CRII`P diff --git a/netmap/grpc/types_frostfs.pb.go b/netmap/grpc/types_frostfs.pb.go new file mode 100644 index 0000000000000000000000000000000000000000..166b12a4f963ef9ffe27bdf1231be77d8593741f GIT binary patch literal 52066 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 literal 0 HcmV?d00001 diff --git a/netmap/grpc/types_frostfs_fuzz.go b/netmap/grpc/types_frostfs_fuzz.go new file mode 100644 index 0000000..89ccd74 --- /dev/null +++ b/netmap/grpc/types_frostfs_fuzz.go @@ -0,0 +1,159 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package netmap + +func DoFuzzProtoFilter(data []byte) int { + msg := new(Filter) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONFilter(data []byte) int { + msg := new(Filter) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoSelector(data []byte) int { + msg := new(Selector) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONSelector(data []byte) int { + msg := new(Selector) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoReplica(data []byte) int { + msg := new(Replica) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONReplica(data []byte) int { + msg := new(Replica) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoPlacementPolicy(data []byte) int { + msg := new(PlacementPolicy) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONPlacementPolicy(data []byte) int { + msg := new(PlacementPolicy) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoNodeInfo(data []byte) int { + msg := new(NodeInfo) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONNodeInfo(data []byte) int { + msg := new(NodeInfo) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoNetmap(data []byte) int { + msg := new(Netmap) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONNetmap(data []byte) int { + msg := new(Netmap) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoNetworkConfig(data []byte) int { + msg := new(NetworkConfig) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONNetworkConfig(data []byte) int { + msg := new(NetworkConfig) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} +func DoFuzzProtoNetworkInfo(data []byte) int { + msg := new(NetworkInfo) + if err := msg.UnmarshalProtobuf(data); err != nil { + return 0 + } + _ = msg.MarshalProtobuf(nil) + return 1 +} +func DoFuzzJSONNetworkInfo(data []byte) int { + msg := new(NetworkInfo) + if err := msg.UnmarshalJSON(data); err != nil { + return 0 + } + _, err := msg.MarshalJSON() + if err != nil { + panic(err) + } + return 1 +} diff --git a/netmap/grpc/types_frostfs_test.go b/netmap/grpc/types_frostfs_test.go new file mode 100644 index 0000000..9996dc9 --- /dev/null +++ b/netmap/grpc/types_frostfs_test.go @@ -0,0 +1,91 @@ +//go:build gofuzz +// +build gofuzz + +// Code generated by protoc-gen-go-frostfs. DO NOT EDIT. + +package netmap + +import ( + testing "testing" +) + +func FuzzProtoFilter(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoFilter(data) + }) +} +func FuzzJSONFilter(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONFilter(data) + }) +} +func FuzzProtoSelector(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoSelector(data) + }) +} +func FuzzJSONSelector(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONSelector(data) + }) +} +func FuzzProtoReplica(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoReplica(data) + }) +} +func FuzzJSONReplica(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONReplica(data) + }) +} +func FuzzProtoPlacementPolicy(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoPlacementPolicy(data) + }) +} +func FuzzJSONPlacementPolicy(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONPlacementPolicy(data) + }) +} +func FuzzProtoNodeInfo(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoNodeInfo(data) + }) +} +func FuzzJSONNodeInfo(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONNodeInfo(data) + }) +} +func FuzzProtoNetmap(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoNetmap(data) + }) +} +func FuzzJSONNetmap(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONNetmap(data) + }) +} +func FuzzProtoNetworkConfig(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoNetworkConfig(data) + }) +} +func FuzzJSONNetworkConfig(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONNetworkConfig(data) + }) +} +func FuzzProtoNetworkInfo(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzProtoNetworkInfo(data) + }) +} +func FuzzJSONNetworkInfo(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzJSONNetworkInfo(data) + }) +} diff --git a/object/convert.go b/object/convert.go index 9814b58..e237883 100644 --- a/object/convert.go +++ b/object/convert.go @@ -2491,7 +2491,7 @@ func (r *PatchResponseBody) ToGRPCMessage() grpc.Message { if r != nil { m = new(object.PatchResponse_Body) - m.SetObjectID(r.ObjectID.ToGRPCMessage().(*refsGRPC.ObjectID)) + m.SetObjectId(r.ObjectID.ToGRPCMessage().(*refsGRPC.ObjectID)) } return m diff --git a/object/grpc/service.go b/object/grpc/service.go deleted file mode 100644 index ef6422e..0000000 --- a/object/grpc/service.go +++ /dev/null @@ -1,610 +0,0 @@ -package object - -import ( - refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc" - session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session/grpc" -) - -// SetAddress sets address of the requested object. -func (m *GetRequest_Body) SetAddress(v *refs.Address) { - m.Address = v -} - -// SetRaw sets raw flag of the request. -func (m *GetRequest_Body) SetRaw(v bool) { - m.Raw = 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 -} - -// SetObjectId sets identifier of the object. -func (m *GetResponse_Body_Init) SetObjectId(v *refs.ObjectID) { - m.ObjectId = v -} - -// SetSignature sets signature of the object identifier. -func (m *GetResponse_Body_Init) SetSignature(v *refs.Signature) { - m.Signature = v -} - -// SetHeader sets header of the object. -func (m *GetResponse_Body_Init) SetHeader(v *Header) { - m.Header = v -} - -// GetChunk returns chunk of the object payload bytes. -func (m *GetResponse_Body_Chunk) GetChunk() []byte { - if m != nil { - return m.Chunk - } - - return nil -} - -// SetChunk sets chunk of the object payload bytes. -func (m *GetResponse_Body_Chunk) SetChunk(v []byte) { - m.Chunk = v -} - -// SetInit sets initial part of the object. -func (m *GetResponse_Body) SetInit(v *GetResponse_Body_Init) { - m.ObjectPart = &GetResponse_Body_Init_{ - Init: v, - } -} - -// SetChunk sets part of the object payload. -func (m *GetResponse_Body) SetChunk(v *GetResponse_Body_Chunk) { - m.ObjectPart = v -} - -// SetSplitInfo sets part of the object payload. -func (m *GetResponse_Body) SetSplitInfo(v *SplitInfo) { - m.ObjectPart = &GetResponse_Body_SplitInfo{ - SplitInfo: v, - } -} - -// SetEcInfo sets part of the object payload. -func (m *GetResponse_Body) SetEcInfo(v *ECInfo) { - m.ObjectPart = &GetResponse_Body_EcInfo{ - EcInfo: 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 -} - -// SetObjectId sets identifier of the object. -func (m *PutRequest_Body_Init) SetObjectId(v *refs.ObjectID) { - m.ObjectId = v -} - -// SetSignature sets signature of the object identifier. -func (m *PutRequest_Body_Init) SetSignature(v *refs.Signature) { - m.Signature = v -} - -// SetHeader sets header of the object. -func (m *PutRequest_Body_Init) SetHeader(v *Header) { - m.Header = v -} - -// SetCopiesNumber sets number of the copies to save. -func (m *PutRequest_Body_Init) SetCopiesNumber(v []uint32) { - m.CopiesNumber = v -} - -// GetChunk returns chunk of the object payload bytes. -func (m *PutRequest_Body_Chunk) GetChunk() []byte { - if m != nil { - return m.Chunk - } - - return nil -} - -// SetChunk sets chunk of the object payload bytes. -func (m *PutRequest_Body_Chunk) SetChunk(v []byte) { - m.Chunk = v -} - -// SetInit sets initial part of the object. -func (m *PutRequest_Body) SetInit(v *PutRequest_Body_Init) { - m.ObjectPart = &PutRequest_Body_Init_{ - Init: v, - } -} - -// SetChunk sets part of the object payload. -func (m *PutRequest_Body) SetChunk(v *PutRequest_Body_Chunk) { - m.ObjectPart = 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 -} - -// SetObjectId sets identifier of the saved object. -func (m *PutResponse_Body) SetObjectId(v *refs.ObjectID) { - m.ObjectId = 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 -} - -// SetAddress sets address of the object to delete. -func (m *DeleteRequest_Body) SetAddress(v *refs.Address) { - m.Address = 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 -} - -// SetTombstone sets tombstone address. -func (x *DeleteResponse_Body) SetTombstone(v *refs.Address) { - x.Tombstone = 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 -} - -// SetAddress sets address of the object with the requested header. -func (m *HeadRequest_Body) SetAddress(v *refs.Address) { - m.Address = v -} - -// SetMainOnly sets flag to return the minimal header subset. -func (m *HeadRequest_Body) SetMainOnly(v bool) { - m.MainOnly = v -} - -// SetRaw sets raw flag of the request. -func (m *HeadRequest_Body) SetRaw(v bool) { - m.Raw = v -} - -// SetBody sets body of the request. -func (m *HeadRequest) SetBody(v *HeadRequest_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the request. -func (m *HeadRequest) SetMetaHeader(v *session.RequestMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (m *HeadRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - m.VerifyHeader = v -} - -// SetHeader sets object header. -func (m *HeaderWithSignature) SetHeader(v *Header) { - m.Header = v -} - -// SetSignature of the header. -func (m *HeaderWithSignature) SetSignature(v *refs.Signature) { - m.Signature = v -} - -// SetHeader sets full header of the object. -func (m *HeadResponse_Body) SetHeader(v *HeaderWithSignature) { - m.Head = &HeadResponse_Body_Header{ - Header: v, - } -} - -// SetShortHeader sets short header of the object. -func (m *HeadResponse_Body) SetShortHeader(v *ShortHeader) { - m.Head = &HeadResponse_Body_ShortHeader{ - ShortHeader: v, - } -} - -// SetSplitInfo sets meta info about split hierarchy of the object. -func (m *HeadResponse_Body) SetSplitInfo(v *SplitInfo) { - m.Head = &HeadResponse_Body_SplitInfo{ - SplitInfo: v, - } -} - -// SetEcInfo sets meta info about the erasure coded object. -func (m *HeadResponse_Body) SetEcInfo(v *ECInfo) { - m.Head = &HeadResponse_Body_EcInfo{ - EcInfo: v, - } -} - -// SetBody sets body of the response. -func (m *HeadResponse) SetBody(v *HeadResponse_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the response. -func (m *HeadResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (m *HeadResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - m.VerifyHeader = v -} - -// SetMatchType sets match type of the filter. -func (m *SearchRequest_Body_Filter) SetMatchType(v MatchType) { - m.MatchType = v -} - -// SetKey sets key to the filtering header. -func (m *SearchRequest_Body_Filter) SetKey(v string) { - m.Key = v -} - -// SetValue sets value of the filtering header. -func (m *SearchRequest_Body_Filter) SetValue(v string) { - m.Value = v -} - -// SetVersion sets version of the search query. -func (m *SearchRequest_Body) SetVersion(v uint32) { - m.Version = v -} - -// SetFilters sets list of the query filters. -func (m *SearchRequest_Body) SetFilters(v []*SearchRequest_Body_Filter) { - m.Filters = v -} - -// SetContainerId sets container ID of the search requets. -func (m *SearchRequest_Body) SetContainerId(v *refs.ContainerID) { - m.ContainerId = v -} - -// SetBody sets body of the request. -func (m *SearchRequest) SetBody(v *SearchRequest_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the request. -func (m *SearchRequest) SetMetaHeader(v *session.RequestMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (m *SearchRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - m.VerifyHeader = v -} - -// SetIdList sets list of the identifiers of the matched objects. -func (m *SearchResponse_Body) SetIdList(v []*refs.ObjectID) { - m.IdList = v -} - -// SetBody sets body of the response. -func (m *SearchResponse) SetBody(v *SearchResponse_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the response. -func (m *SearchResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (m *SearchResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - m.VerifyHeader = v -} - -// SetOffset sets offset of the payload range. -func (m *Range) SetOffset(v uint64) { - m.Offset = v -} - -// SetLength sets length of the payload range. -func (m *Range) SetLength(v uint64) { - m.Length = v -} - -// SetAddress sets address of the object with the request payload range. -func (m *GetRangeRequest_Body) SetAddress(v *refs.Address) { - m.Address = v -} - -// SetRange sets range of the object payload. -func (m *GetRangeRequest_Body) SetRange(v *Range) { - m.Range = v -} - -// SetRaw sets raw flag of the request. -func (m *GetRangeRequest_Body) SetRaw(v bool) { - m.Raw = v -} - -// SetBody sets body of the request. -func (m *GetRangeRequest) SetBody(v *GetRangeRequest_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the request. -func (m *GetRangeRequest) SetMetaHeader(v *session.RequestMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (m *GetRangeRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - m.VerifyHeader = v -} - -// GetChunk returns chunk of the object payload range bytes. -func (m *GetRangeResponse_Body_Chunk) GetChunk() []byte { - if m != nil { - return m.Chunk - } - - return nil -} - -// SetChunk sets chunk of the object payload range bytes. -func (m *GetRangeResponse_Body_Chunk) SetChunk(v []byte) { - m.Chunk = v -} - -// SetChunk sets chunk of the object payload. -func (m *GetRangeResponse_Body) SetChunk(v *GetRangeResponse_Body_Chunk) { - m.RangePart = v -} - -// SetSplitInfo sets meta info about split hierarchy of the object. -func (m *GetRangeResponse_Body) SetSplitInfo(v *SplitInfo) { - m.RangePart = &GetRangeResponse_Body_SplitInfo{ - SplitInfo: v, - } -} - -// SetEcInfo sets meta info about the erasure-coded object. -func (m *GetRangeResponse_Body) SetEcInfo(v *ECInfo) { - m.RangePart = &GetRangeResponse_Body_EcInfo{ - EcInfo: v, - } -} - -// SetBody sets body of the response. -func (m *GetRangeResponse) SetBody(v *GetRangeResponse_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the response. -func (m *GetRangeResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (m *GetRangeResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - m.VerifyHeader = v -} - -// SetAddress sets address of the object with the request payload range. -func (m *GetRangeHashRequest_Body) SetAddress(v *refs.Address) { - m.Address = v -} - -// SetRanges sets list of the ranges of the object payload. -func (m *GetRangeHashRequest_Body) SetRanges(v []*Range) { - m.Ranges = v -} - -// SetSalt sets salt for the object payload ranges. -func (m *GetRangeHashRequest_Body) SetSalt(v []byte) { - m.Salt = v -} - -// Set sets salt for the object payload ranges. -func (m *GetRangeHashRequest_Body) SetType(v refs.ChecksumType) { - m.Type = v -} - -// SetBody sets body of the request. -func (m *GetRangeHashRequest) SetBody(v *GetRangeHashRequest_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the request. -func (m *GetRangeHashRequest) SetMetaHeader(v *session.RequestMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (m *GetRangeHashRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - m.VerifyHeader = v -} - -// SetHashList returns list of the range hashes. -func (m *GetRangeHashResponse_Body) SetHashList(v [][]byte) { - m.HashList = v -} - -// SetHashList returns list of the range hashes. -func (m *GetRangeHashResponse_Body) SetType(v refs.ChecksumType) { - m.Type = v -} - -// SetBody sets body of the response. -func (m *GetRangeHashResponse) SetBody(v *GetRangeHashResponse_Body) { - m.Body = v -} - -// SetMetaHeader sets meta header of the response. -func (m *GetRangeHashResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (m *GetRangeHashResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - m.VerifyHeader = v -} - -// SetObject set object of the body. -func (m *PutSingleRequest_Body) SetObject(o *Object) { - m.Object = o -} - -// SetCopiesNumber sets copies number of the body. -func (m *PutSingleRequest_Body) SetCopiesNumber(v []uint32) { - m.CopiesNumber = v -} - -// SetBody sets body of the request. -func (m *PutSingleRequest) SetBody(b *PutSingleRequest_Body) { - m.Body = b -} - -// SetMetaHeader sets meta header of the request. -func (m *PutSingleRequest) SetMetaHeader(v *session.RequestMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the request. -func (m *PutSingleRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - m.VerifyHeader = v -} - -// SetBody sets body of the response. -func (m *PutSingleResponse) SetBody(b *PutSingleResponse_Body) { - m.Body = b -} - -// SetMetaHeader sets meta header of the response. -func (m *PutSingleResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - m.MetaHeader = v -} - -// SetVerifyHeader sets verification header of the response. -func (m *PutSingleResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - m.VerifyHeader = v -} - -func (m *PatchRequest_Body) SetAddress(addr *refs.Address) { - m.Address = addr -} - -func (m *PatchRequest_Body) SetNewAttributes(attrs []*Header_Attribute) { - m.NewAttributes = attrs -} - -func (m *PatchRequest_Body) SetReplaceAttributes(replaceAttributes bool) { - m.ReplaceAttributes = replaceAttributes -} - -func (m *PatchRequest_Body) SetPatch(patch *PatchRequest_Body_Patch) { - m.Patch = patch -} - -func (m *PatchRequest_Body_Patch) SetSourceRange(r *Range) { - m.SourceRange = r -} - -func (m *PatchRequest_Body_Patch) SetChunk(chunk []byte) { - m.Chunk = chunk -} - -func (m *PatchRequest) SetBody(b *PatchRequest_Body) { - m.Body = b -} - -func (m *PatchRequest) SetMetaHeader(v *session.RequestMetaHeader) { - m.MetaHeader = v -} - -func (m *PatchRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { - m.VerifyHeader = v -} - -func (m *PatchResponse_Body) SetObjectID(objectID *refs.ObjectID) { - m.ObjectId = objectID -} - -func (m *PatchResponse) SetBody(b *PatchResponse_Body) { - m.Body = b -} - -func (m *PatchResponse) SetMetaHeader(v *session.ResponseMetaHeader) { - m.MetaHeader = v -} - -func (m *PatchResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { - m.VerifyHeader = v -} diff --git a/object/grpc/service.pb.go b/object/grpc/service.pb.go deleted file mode 100644 index 979c932883f20b823ca3680f998bd6707ed77370..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167583 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

t 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 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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 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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 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..b0308efe74d844b6d27a30b5d0b551c78622d659 GIT binary patch literal 13281 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 literal 0 HcmV?d00001 diff --git a/util/proto/test/test_frostfs.pb.go b/util/proto/test/test_frostfs.pb.go deleted file mode 100644 index 47c6d60e6997b76d86bf71cc3de4a2f97f31a820..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3980 zcmeHK+iv4F5Pi13V&EsaO{6qQv%ms*Xl~o|vRQ1reF=hswkerdnKUTMmoE0-J41?+ ztV`N1ieeuM7_cp!GaQR^&Y|NNuGNA=$|cv#@CD5Fu-3|``7vHQPStUuRc?|zf}00; z`!I#uoBL@L1Zy_`$Wji5=OzfmYOS<^Fc{5*WO@%{F6U|?WE#5*<6vaVZiVJBPL)bC z9;GT{GL4i@V|#N}Byq*7;NxIYEig`niF`*wCMurlf?sE_ABO`>_{DlwL6tAaatSOL!~;F}Kc zPVD%iLVjN%@4LuMvAX6(h5V_Dq?*<5epMlV?jUbvv9iDBj2@$)rxli4^Wy~3<#y({ zYr*HnaQ@14zGNA!+{%5tRKY`RIz?NFCo+A1v3ohYPHU|;n|*w!UGCLZ$-|J4%Aq-j8b$(NluoIT~SHHrSAzx`b$OW)%}7j z%dH5>44$56D6&cU{(?Ro@DpkjU#MXsH&krD;^uzjp+nLLHTMBW1Bn}^(U6jy8ycNp zRDM2GyzdX?hh?7}=Jj(mlw<*IqB8-{L_PL0$raj6@`Z{=Gu_K1qi8cxuxF<=b*NqP zjyBb~N6j5-nCzs@wLVc((NlUmCWmQLoyXK%w3%KmnNFKq+D=VI=jkPr4|T}SiE1*M zQ7@USsY7<=RFl!4ddcKgZ8G_lXIjfTWDXh_!Vdh4Jnulxef6__M z_FoAP>vM9&zZbb4Js7?62!012;~s7GLeDX*bFdk}G8pypoLDTe&c$XT4-u_WEU!+< zWDsGH?>FcnUt7R>En1!XK8KR4FKB&% zFArQ_!Px*As!5V~bVJOe~GT0Y54Ah}eBkOq4FX(>|{*&a1 z*pa2wZg5NgH~EyMe`OoaGN$`A$F)X{6m$pc=v`qxp!t)n90p*4moCn+JS|Qx^H0d- 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..86c3b76 --- /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, " = ", 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..23dde17 --- /dev/null +++ b/util/protogen/internalgengo/json.go @@ -0,0 +1,211 @@ +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: + template = "%s = " + fieldType(g, f).String() + "(in.Int32())" + 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()) +}