test(storage): init retry conformance test scaffolding (#4711)
Co-authored-by: Chris Cotter <cjcotter@google.com>
diff --git a/storage/internal/test/conformance/retry_tests.json b/storage/internal/test/conformance/retry_tests.json
new file mode 100644
index 0000000..0fe1147
--- /dev/null
+++ b/storage/internal/test/conformance/retry_tests.json
@@ -0,0 +1,45 @@
+{
+ "retryTests": [
+ {
+ "id": 1,
+ "description": "always_idempotent",
+ "cases": [
+ {
+ "instructions": ["return-503", "return-503"]
+ },
+ {
+ "instructions": ["return-reset-connection", "return-reset-connection"]
+ },
+ {
+ "instructions": ["return-reset-connection", "return-503"]
+ }
+ ],
+ "methods": [
+ {"name": "storage.bucket_acl.get", "resources": ["BUCKET"]},
+ {"name": "storage.bucket_acl.list", "resources": ["BUCKET"]},
+ {"name": "storage.buckets.delete", "resources": ["BUCKET"]},
+ {"name": "storage.buckets.get", "resources": ["BUCKET"]},
+ {"name": "storage.buckets.getIamPolicy", "resources": ["BUCKET"]},
+ {"name": "storage.buckets.insert", "resources": []},
+ {"name": "storage.buckets.list", "resources": ["BUCKET"]},
+ {"name": "storage.buckets.lockRetentionPolicy", "resources": ["BUCKET"]},
+ {"name": "storage.buckets.testIamPermissions", "resources": ["BUCKET"]},
+ {"name": "storage.default_object_acl.get", "resources": ["BUCKET"]},
+ {"name": "storage.default_object_acl.list", "resources": ["BUCKET"]},
+ {"name": "storage.hmacKey.delete", "resources": ["HMAC_KEY"]},
+ {"name": "storage.hmacKey.get", "resources": ["HMAC_KEY"]},
+ {"name": "storage.hmacKey.list", "resources": ["HMAC_KEY"]},
+ {"name": "storage.notifications.delete", "resources": ["BUCKET", "NOTIFICATION"]},
+ {"name": "storage.notifications.get", "resources": ["BUCKET", "NOTIFICATION"]},
+ {"name": "storage.notifications.list", "resources": ["BUCKET", "NOTIFICATION"]},
+ {"name": "storage.object_acl.get", "resources": ["BUCKET", "OBJECT"]},
+ {"name": "storage.object_acl.list", "resources": ["BUCKET", "OBJECT"]},
+ {"name": "storage.objects.get", "resources": ["BUCKET", "OBJECT"]},
+ {"name": "storage.objects.list", "resources": ["BUCKET", "OBJECT"]},
+ {"name": "storage.serviceaccount.get", "resources": []}
+ ],
+ "preconditionProvided": false,
+ "expectSuccess": true
+ }
+ ]
+}
diff --git a/storage/internal/test/conformance/test.pb.go b/storage/internal/test/conformance/test.pb.go
index df7d64e..2ff5a7e 100644
--- a/storage/internal/test/conformance/test.pb.go
+++ b/storage/internal/test/conformance/test.pb.go
@@ -1,26 +1,40 @@
+// Copyright 2019, Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License
+
// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.27.1
+// protoc v3.17.3
// source: test.proto
-package google_cloud_conformance_storage_v1
+package v1
import (
- fmt "fmt"
- math "math"
+ reflect "reflect"
+ sync "sync"
- proto "github.com/golang/protobuf/proto"
- timestamp "github.com/golang/protobuf/ptypes/timestamp"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ timestamppb "google.golang.org/protobuf/types/known/timestamppb"
)
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
type UrlStyle int32
@@ -30,597 +44,1345 @@
UrlStyle_BUCKET_BOUND_HOSTNAME UrlStyle = 2
)
-var UrlStyle_name = map[int32]string{
- 0: "PATH_STYLE",
- 1: "VIRTUAL_HOSTED_STYLE",
- 2: "BUCKET_BOUND_HOSTNAME",
-}
+// Enum value maps for UrlStyle.
+var (
+ UrlStyle_name = map[int32]string{
+ 0: "PATH_STYLE",
+ 1: "VIRTUAL_HOSTED_STYLE",
+ 2: "BUCKET_BOUND_HOSTNAME",
+ }
+ UrlStyle_value = map[string]int32{
+ "PATH_STYLE": 0,
+ "VIRTUAL_HOSTED_STYLE": 1,
+ "BUCKET_BOUND_HOSTNAME": 2,
+ }
+)
-var UrlStyle_value = map[string]int32{
- "PATH_STYLE": 0,
- "VIRTUAL_HOSTED_STYLE": 1,
- "BUCKET_BOUND_HOSTNAME": 2,
+func (x UrlStyle) Enum() *UrlStyle {
+ p := new(UrlStyle)
+ *p = x
+ return p
}
func (x UrlStyle) String() string {
- return proto.EnumName(UrlStyle_name, int32(x))
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
+func (UrlStyle) Descriptor() protoreflect.EnumDescriptor {
+ return file_test_proto_enumTypes[0].Descriptor()
+}
+
+func (UrlStyle) Type() protoreflect.EnumType {
+ return &file_test_proto_enumTypes[0]
+}
+
+func (x UrlStyle) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use UrlStyle.Descriptor instead.
func (UrlStyle) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_c161fcfdc0c3ff1e, []int{0}
+ return file_test_proto_rawDescGZIP(), []int{0}
+}
+
+// Test resources that are necessary for a method call. For example,
+// storage.objects.get would require BUCKET and OBJECT.
+type Resource int32
+
+const (
+ Resource_BUCKET Resource = 0
+ Resource_OBJECT Resource = 1
+ Resource_NOTIFICATION Resource = 2
+ Resource_HMAC_KEY Resource = 3
+)
+
+// Enum value maps for Resource.
+var (
+ Resource_name = map[int32]string{
+ 0: "BUCKET",
+ 1: "OBJECT",
+ 2: "NOTIFICATION",
+ 3: "HMAC_KEY",
+ }
+ Resource_value = map[string]int32{
+ "BUCKET": 0,
+ "OBJECT": 1,
+ "NOTIFICATION": 2,
+ "HMAC_KEY": 3,
+ }
+)
+
+func (x Resource) Enum() *Resource {
+ p := new(Resource)
+ *p = x
+ return p
+}
+
+func (x Resource) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Resource) Descriptor() protoreflect.EnumDescriptor {
+ return file_test_proto_enumTypes[1].Descriptor()
+}
+
+func (Resource) Type() protoreflect.EnumType {
+ return &file_test_proto_enumTypes[1]
+}
+
+func (x Resource) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Resource.Descriptor instead.
+func (Resource) EnumDescriptor() ([]byte, []int) {
+ return file_test_proto_rawDescGZIP(), []int{1}
}
type TestFile struct {
- SigningV4Tests []*SigningV4Test `protobuf:"bytes,1,rep,name=signing_v4_tests,json=signingV4Tests,proto3" json:"signing_v4_tests,omitempty"`
- PostPolicyV4Tests []*PostPolicyV4Test `protobuf:"bytes,2,rep,name=post_policy_v4_tests,json=postPolicyV4Tests,proto3" json:"post_policy_v4_tests,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ SigningV4Tests []*SigningV4Test `protobuf:"bytes,1,rep,name=signing_v4_tests,json=signingV4Tests,proto3" json:"signing_v4_tests,omitempty"`
+ PostPolicyV4Tests []*PostPolicyV4Test `protobuf:"bytes,2,rep,name=post_policy_v4_tests,json=postPolicyV4Tests,proto3" json:"post_policy_v4_tests,omitempty"`
+ RetryTests []*RetryTest `protobuf:"bytes,3,rep,name=retry_tests,json=retryTests,proto3" json:"retry_tests,omitempty"`
}
-func (m *TestFile) Reset() { *m = TestFile{} }
-func (m *TestFile) String() string { return proto.CompactTextString(m) }
-func (*TestFile) ProtoMessage() {}
+func (x *TestFile) Reset() {
+ *x = TestFile{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_test_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *TestFile) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TestFile) ProtoMessage() {}
+
+func (x *TestFile) ProtoReflect() protoreflect.Message {
+ mi := &file_test_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use TestFile.ProtoReflect.Descriptor instead.
func (*TestFile) Descriptor() ([]byte, []int) {
- return fileDescriptor_c161fcfdc0c3ff1e, []int{0}
+ return file_test_proto_rawDescGZIP(), []int{0}
}
-func (m *TestFile) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_TestFile.Unmarshal(m, b)
-}
-func (m *TestFile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_TestFile.Marshal(b, m, deterministic)
-}
-func (m *TestFile) XXX_Merge(src proto.Message) {
- xxx_messageInfo_TestFile.Merge(m, src)
-}
-func (m *TestFile) XXX_Size() int {
- return xxx_messageInfo_TestFile.Size(m)
-}
-func (m *TestFile) XXX_DiscardUnknown() {
- xxx_messageInfo_TestFile.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TestFile proto.InternalMessageInfo
-
-func (m *TestFile) GetSigningV4Tests() []*SigningV4Test {
- if m != nil {
- return m.SigningV4Tests
+func (x *TestFile) GetSigningV4Tests() []*SigningV4Test {
+ if x != nil {
+ return x.SigningV4Tests
}
return nil
}
-func (m *TestFile) GetPostPolicyV4Tests() []*PostPolicyV4Test {
- if m != nil {
- return m.PostPolicyV4Tests
+func (x *TestFile) GetPostPolicyV4Tests() []*PostPolicyV4Test {
+ if x != nil {
+ return x.PostPolicyV4Tests
+ }
+ return nil
+}
+
+func (x *TestFile) GetRetryTests() []*RetryTest {
+ if x != nil {
+ return x.RetryTests
}
return nil
}
type SigningV4Test struct {
- FileName string `protobuf:"bytes,1,opt,name=fileName,proto3" json:"fileName,omitempty"`
- Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
- Bucket string `protobuf:"bytes,3,opt,name=bucket,proto3" json:"bucket,omitempty"`
- Object string `protobuf:"bytes,4,opt,name=object,proto3" json:"object,omitempty"`
- Method string `protobuf:"bytes,5,opt,name=method,proto3" json:"method,omitempty"`
- Expiration int64 `protobuf:"varint,6,opt,name=expiration,proto3" json:"expiration,omitempty"`
- Timestamp *timestamp.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
- ExpectedUrl string `protobuf:"bytes,8,opt,name=expectedUrl,proto3" json:"expectedUrl,omitempty"`
- Headers map[string]string `protobuf:"bytes,9,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
- QueryParameters map[string]string `protobuf:"bytes,10,rep,name=query_parameters,json=queryParameters,proto3" json:"query_parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
- Scheme string `protobuf:"bytes,11,opt,name=scheme,proto3" json:"scheme,omitempty"`
- UrlStyle UrlStyle `protobuf:"varint,12,opt,name=urlStyle,proto3,enum=google.cloud.conformance.storage.v1.UrlStyle" json:"urlStyle,omitempty"`
- BucketBoundHostname string `protobuf:"bytes,13,opt,name=bucketBoundHostname,proto3" json:"bucketBoundHostname,omitempty"`
- ExpectedCanonicalRequest string `protobuf:"bytes,14,opt,name=expectedCanonicalRequest,proto3" json:"expectedCanonicalRequest,omitempty"`
- ExpectedStringToSign string `protobuf:"bytes,15,opt,name=expectedStringToSign,proto3" json:"expectedStringToSign,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ FileName string `protobuf:"bytes,1,opt,name=fileName,proto3" json:"fileName,omitempty"`
+ Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+ Bucket string `protobuf:"bytes,3,opt,name=bucket,proto3" json:"bucket,omitempty"`
+ Object string `protobuf:"bytes,4,opt,name=object,proto3" json:"object,omitempty"`
+ Method string `protobuf:"bytes,5,opt,name=method,proto3" json:"method,omitempty"`
+ Expiration int64 `protobuf:"varint,6,opt,name=expiration,proto3" json:"expiration,omitempty"`
+ Timestamp *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+ ExpectedUrl string `protobuf:"bytes,8,opt,name=expectedUrl,proto3" json:"expectedUrl,omitempty"`
+ Headers map[string]string `protobuf:"bytes,9,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+ QueryParameters map[string]string `protobuf:"bytes,10,rep,name=query_parameters,json=queryParameters,proto3" json:"query_parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+ Scheme string `protobuf:"bytes,11,opt,name=scheme,proto3" json:"scheme,omitempty"`
+ UrlStyle UrlStyle `protobuf:"varint,12,opt,name=urlStyle,proto3,enum=google.cloud.conformance.storage.v1.UrlStyle" json:"urlStyle,omitempty"`
+ BucketBoundHostname string `protobuf:"bytes,13,opt,name=bucketBoundHostname,proto3" json:"bucketBoundHostname,omitempty"`
+ ExpectedCanonicalRequest string `protobuf:"bytes,14,opt,name=expectedCanonicalRequest,proto3" json:"expectedCanonicalRequest,omitempty"`
+ ExpectedStringToSign string `protobuf:"bytes,15,opt,name=expectedStringToSign,proto3" json:"expectedStringToSign,omitempty"`
}
-func (m *SigningV4Test) Reset() { *m = SigningV4Test{} }
-func (m *SigningV4Test) String() string { return proto.CompactTextString(m) }
-func (*SigningV4Test) ProtoMessage() {}
+func (x *SigningV4Test) Reset() {
+ *x = SigningV4Test{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_test_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SigningV4Test) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SigningV4Test) ProtoMessage() {}
+
+func (x *SigningV4Test) ProtoReflect() protoreflect.Message {
+ mi := &file_test_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SigningV4Test.ProtoReflect.Descriptor instead.
func (*SigningV4Test) Descriptor() ([]byte, []int) {
- return fileDescriptor_c161fcfdc0c3ff1e, []int{1}
+ return file_test_proto_rawDescGZIP(), []int{1}
}
-func (m *SigningV4Test) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_SigningV4Test.Unmarshal(m, b)
-}
-func (m *SigningV4Test) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_SigningV4Test.Marshal(b, m, deterministic)
-}
-func (m *SigningV4Test) XXX_Merge(src proto.Message) {
- xxx_messageInfo_SigningV4Test.Merge(m, src)
-}
-func (m *SigningV4Test) XXX_Size() int {
- return xxx_messageInfo_SigningV4Test.Size(m)
-}
-func (m *SigningV4Test) XXX_DiscardUnknown() {
- xxx_messageInfo_SigningV4Test.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SigningV4Test proto.InternalMessageInfo
-
-func (m *SigningV4Test) GetFileName() string {
- if m != nil {
- return m.FileName
+func (x *SigningV4Test) GetFileName() string {
+ if x != nil {
+ return x.FileName
}
return ""
}
-func (m *SigningV4Test) GetDescription() string {
- if m != nil {
- return m.Description
+func (x *SigningV4Test) GetDescription() string {
+ if x != nil {
+ return x.Description
}
return ""
}
-func (m *SigningV4Test) GetBucket() string {
- if m != nil {
- return m.Bucket
+func (x *SigningV4Test) GetBucket() string {
+ if x != nil {
+ return x.Bucket
}
return ""
}
-func (m *SigningV4Test) GetObject() string {
- if m != nil {
- return m.Object
+func (x *SigningV4Test) GetObject() string {
+ if x != nil {
+ return x.Object
}
return ""
}
-func (m *SigningV4Test) GetMethod() string {
- if m != nil {
- return m.Method
+func (x *SigningV4Test) GetMethod() string {
+ if x != nil {
+ return x.Method
}
return ""
}
-func (m *SigningV4Test) GetExpiration() int64 {
- if m != nil {
- return m.Expiration
+func (x *SigningV4Test) GetExpiration() int64 {
+ if x != nil {
+ return x.Expiration
}
return 0
}
-func (m *SigningV4Test) GetTimestamp() *timestamp.Timestamp {
- if m != nil {
- return m.Timestamp
+func (x *SigningV4Test) GetTimestamp() *timestamppb.Timestamp {
+ if x != nil {
+ return x.Timestamp
}
return nil
}
-func (m *SigningV4Test) GetExpectedUrl() string {
- if m != nil {
- return m.ExpectedUrl
+func (x *SigningV4Test) GetExpectedUrl() string {
+ if x != nil {
+ return x.ExpectedUrl
}
return ""
}
-func (m *SigningV4Test) GetHeaders() map[string]string {
- if m != nil {
- return m.Headers
+func (x *SigningV4Test) GetHeaders() map[string]string {
+ if x != nil {
+ return x.Headers
}
return nil
}
-func (m *SigningV4Test) GetQueryParameters() map[string]string {
- if m != nil {
- return m.QueryParameters
+func (x *SigningV4Test) GetQueryParameters() map[string]string {
+ if x != nil {
+ return x.QueryParameters
}
return nil
}
-func (m *SigningV4Test) GetScheme() string {
- if m != nil {
- return m.Scheme
+func (x *SigningV4Test) GetScheme() string {
+ if x != nil {
+ return x.Scheme
}
return ""
}
-func (m *SigningV4Test) GetUrlStyle() UrlStyle {
- if m != nil {
- return m.UrlStyle
+func (x *SigningV4Test) GetUrlStyle() UrlStyle {
+ if x != nil {
+ return x.UrlStyle
}
return UrlStyle_PATH_STYLE
}
-func (m *SigningV4Test) GetBucketBoundHostname() string {
- if m != nil {
- return m.BucketBoundHostname
+func (x *SigningV4Test) GetBucketBoundHostname() string {
+ if x != nil {
+ return x.BucketBoundHostname
}
return ""
}
-func (m *SigningV4Test) GetExpectedCanonicalRequest() string {
- if m != nil {
- return m.ExpectedCanonicalRequest
+func (x *SigningV4Test) GetExpectedCanonicalRequest() string {
+ if x != nil {
+ return x.ExpectedCanonicalRequest
}
return ""
}
-func (m *SigningV4Test) GetExpectedStringToSign() string {
- if m != nil {
- return m.ExpectedStringToSign
+func (x *SigningV4Test) GetExpectedStringToSign() string {
+ if x != nil {
+ return x.ExpectedStringToSign
}
return ""
}
type ConditionalMatches struct {
- Expression []string `protobuf:"bytes,1,rep,name=expression,proto3" json:"expression,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Expression []string `protobuf:"bytes,1,rep,name=expression,proto3" json:"expression,omitempty"`
}
-func (m *ConditionalMatches) Reset() { *m = ConditionalMatches{} }
-func (m *ConditionalMatches) String() string { return proto.CompactTextString(m) }
-func (*ConditionalMatches) ProtoMessage() {}
+func (x *ConditionalMatches) Reset() {
+ *x = ConditionalMatches{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_test_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ConditionalMatches) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ConditionalMatches) ProtoMessage() {}
+
+func (x *ConditionalMatches) ProtoReflect() protoreflect.Message {
+ mi := &file_test_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ConditionalMatches.ProtoReflect.Descriptor instead.
func (*ConditionalMatches) Descriptor() ([]byte, []int) {
- return fileDescriptor_c161fcfdc0c3ff1e, []int{2}
+ return file_test_proto_rawDescGZIP(), []int{2}
}
-func (m *ConditionalMatches) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_ConditionalMatches.Unmarshal(m, b)
-}
-func (m *ConditionalMatches) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_ConditionalMatches.Marshal(b, m, deterministic)
-}
-func (m *ConditionalMatches) XXX_Merge(src proto.Message) {
- xxx_messageInfo_ConditionalMatches.Merge(m, src)
-}
-func (m *ConditionalMatches) XXX_Size() int {
- return xxx_messageInfo_ConditionalMatches.Size(m)
-}
-func (m *ConditionalMatches) XXX_DiscardUnknown() {
- xxx_messageInfo_ConditionalMatches.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ConditionalMatches proto.InternalMessageInfo
-
-func (m *ConditionalMatches) GetExpression() []string {
- if m != nil {
- return m.Expression
+func (x *ConditionalMatches) GetExpression() []string {
+ if x != nil {
+ return x.Expression
}
return nil
}
type PolicyConditions struct {
- ContentLengthRange []int32 `protobuf:"varint,1,rep,packed,name=contentLengthRange,proto3" json:"contentLengthRange,omitempty"`
- StartsWith []string `protobuf:"bytes,2,rep,name=startsWith,proto3" json:"startsWith,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ ContentLengthRange []int32 `protobuf:"varint,1,rep,packed,name=contentLengthRange,proto3" json:"contentLengthRange,omitempty"`
+ StartsWith []string `protobuf:"bytes,2,rep,name=startsWith,proto3" json:"startsWith,omitempty"`
}
-func (m *PolicyConditions) Reset() { *m = PolicyConditions{} }
-func (m *PolicyConditions) String() string { return proto.CompactTextString(m) }
-func (*PolicyConditions) ProtoMessage() {}
+func (x *PolicyConditions) Reset() {
+ *x = PolicyConditions{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_test_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *PolicyConditions) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PolicyConditions) ProtoMessage() {}
+
+func (x *PolicyConditions) ProtoReflect() protoreflect.Message {
+ mi := &file_test_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use PolicyConditions.ProtoReflect.Descriptor instead.
func (*PolicyConditions) Descriptor() ([]byte, []int) {
- return fileDescriptor_c161fcfdc0c3ff1e, []int{3}
+ return file_test_proto_rawDescGZIP(), []int{3}
}
-func (m *PolicyConditions) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_PolicyConditions.Unmarshal(m, b)
-}
-func (m *PolicyConditions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_PolicyConditions.Marshal(b, m, deterministic)
-}
-func (m *PolicyConditions) XXX_Merge(src proto.Message) {
- xxx_messageInfo_PolicyConditions.Merge(m, src)
-}
-func (m *PolicyConditions) XXX_Size() int {
- return xxx_messageInfo_PolicyConditions.Size(m)
-}
-func (m *PolicyConditions) XXX_DiscardUnknown() {
- xxx_messageInfo_PolicyConditions.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PolicyConditions proto.InternalMessageInfo
-
-func (m *PolicyConditions) GetContentLengthRange() []int32 {
- if m != nil {
- return m.ContentLengthRange
+func (x *PolicyConditions) GetContentLengthRange() []int32 {
+ if x != nil {
+ return x.ContentLengthRange
}
return nil
}
-func (m *PolicyConditions) GetStartsWith() []string {
- if m != nil {
- return m.StartsWith
+func (x *PolicyConditions) GetStartsWith() []string {
+ if x != nil {
+ return x.StartsWith
}
return nil
}
type PolicyInput struct {
- Scheme string `protobuf:"bytes,1,opt,name=scheme,proto3" json:"scheme,omitempty"`
- UrlStyle UrlStyle `protobuf:"varint,2,opt,name=urlStyle,proto3,enum=google.cloud.conformance.storage.v1.UrlStyle" json:"urlStyle,omitempty"`
- BucketBoundHostname string `protobuf:"bytes,3,opt,name=bucketBoundHostname,proto3" json:"bucketBoundHostname,omitempty"`
- Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"`
- Object string `protobuf:"bytes,5,opt,name=object,proto3" json:"object,omitempty"`
- Expiration int32 `protobuf:"varint,6,opt,name=expiration,proto3" json:"expiration,omitempty"`
- Timestamp *timestamp.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
- Fields map[string]string `protobuf:"bytes,8,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
- Conditions *PolicyConditions `protobuf:"bytes,9,opt,name=conditions,proto3" json:"conditions,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // http or https
+ Scheme string `protobuf:"bytes,1,opt,name=scheme,proto3" json:"scheme,omitempty"`
+ UrlStyle UrlStyle `protobuf:"varint,2,opt,name=urlStyle,proto3,enum=google.cloud.conformance.storage.v1.UrlStyle" json:"urlStyle,omitempty"`
+ BucketBoundHostname string `protobuf:"bytes,3,opt,name=bucketBoundHostname,proto3" json:"bucketBoundHostname,omitempty"`
+ Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"`
+ Object string `protobuf:"bytes,5,opt,name=object,proto3" json:"object,omitempty"`
+ Expiration int32 `protobuf:"varint,6,opt,name=expiration,proto3" json:"expiration,omitempty"`
+ Timestamp *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+ //
+ //fields with strict equivalence which are added into
+ //PolicyOutput.expectedDecodedPolicy to generate the
+ //signature.
+ //Expectations
+ //E.1: Order them in lexigraphical order so it's the
+ //signature can be verified across different language
+ //implementations.
+ Fields map[string]string `protobuf:"bytes,8,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+ Conditions *PolicyConditions `protobuf:"bytes,9,opt,name=conditions,proto3" json:"conditions,omitempty"`
}
-func (m *PolicyInput) Reset() { *m = PolicyInput{} }
-func (m *PolicyInput) String() string { return proto.CompactTextString(m) }
-func (*PolicyInput) ProtoMessage() {}
+func (x *PolicyInput) Reset() {
+ *x = PolicyInput{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_test_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *PolicyInput) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PolicyInput) ProtoMessage() {}
+
+func (x *PolicyInput) ProtoReflect() protoreflect.Message {
+ mi := &file_test_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use PolicyInput.ProtoReflect.Descriptor instead.
func (*PolicyInput) Descriptor() ([]byte, []int) {
- return fileDescriptor_c161fcfdc0c3ff1e, []int{4}
+ return file_test_proto_rawDescGZIP(), []int{4}
}
-func (m *PolicyInput) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_PolicyInput.Unmarshal(m, b)
-}
-func (m *PolicyInput) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_PolicyInput.Marshal(b, m, deterministic)
-}
-func (m *PolicyInput) XXX_Merge(src proto.Message) {
- xxx_messageInfo_PolicyInput.Merge(m, src)
-}
-func (m *PolicyInput) XXX_Size() int {
- return xxx_messageInfo_PolicyInput.Size(m)
-}
-func (m *PolicyInput) XXX_DiscardUnknown() {
- xxx_messageInfo_PolicyInput.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PolicyInput proto.InternalMessageInfo
-
-func (m *PolicyInput) GetScheme() string {
- if m != nil {
- return m.Scheme
+func (x *PolicyInput) GetScheme() string {
+ if x != nil {
+ return x.Scheme
}
return ""
}
-func (m *PolicyInput) GetUrlStyle() UrlStyle {
- if m != nil {
- return m.UrlStyle
+func (x *PolicyInput) GetUrlStyle() UrlStyle {
+ if x != nil {
+ return x.UrlStyle
}
return UrlStyle_PATH_STYLE
}
-func (m *PolicyInput) GetBucketBoundHostname() string {
- if m != nil {
- return m.BucketBoundHostname
+func (x *PolicyInput) GetBucketBoundHostname() string {
+ if x != nil {
+ return x.BucketBoundHostname
}
return ""
}
-func (m *PolicyInput) GetBucket() string {
- if m != nil {
- return m.Bucket
+func (x *PolicyInput) GetBucket() string {
+ if x != nil {
+ return x.Bucket
}
return ""
}
-func (m *PolicyInput) GetObject() string {
- if m != nil {
- return m.Object
+func (x *PolicyInput) GetObject() string {
+ if x != nil {
+ return x.Object
}
return ""
}
-func (m *PolicyInput) GetExpiration() int32 {
- if m != nil {
- return m.Expiration
+func (x *PolicyInput) GetExpiration() int32 {
+ if x != nil {
+ return x.Expiration
}
return 0
}
-func (m *PolicyInput) GetTimestamp() *timestamp.Timestamp {
- if m != nil {
- return m.Timestamp
+func (x *PolicyInput) GetTimestamp() *timestamppb.Timestamp {
+ if x != nil {
+ return x.Timestamp
}
return nil
}
-func (m *PolicyInput) GetFields() map[string]string {
- if m != nil {
- return m.Fields
+func (x *PolicyInput) GetFields() map[string]string {
+ if x != nil {
+ return x.Fields
}
return nil
}
-func (m *PolicyInput) GetConditions() *PolicyConditions {
- if m != nil {
- return m.Conditions
+func (x *PolicyInput) GetConditions() *PolicyConditions {
+ if x != nil {
+ return x.Conditions
}
return nil
}
type PolicyOutput struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
Fields map[string]string `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
ExpectedDecodedPolicy string `protobuf:"bytes,3,opt,name=expectedDecodedPolicy,proto3" json:"expectedDecodedPolicy,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
}
-func (m *PolicyOutput) Reset() { *m = PolicyOutput{} }
-func (m *PolicyOutput) String() string { return proto.CompactTextString(m) }
-func (*PolicyOutput) ProtoMessage() {}
+func (x *PolicyOutput) Reset() {
+ *x = PolicyOutput{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_test_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *PolicyOutput) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PolicyOutput) ProtoMessage() {}
+
+func (x *PolicyOutput) ProtoReflect() protoreflect.Message {
+ mi := &file_test_proto_msgTypes[5]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use PolicyOutput.ProtoReflect.Descriptor instead.
func (*PolicyOutput) Descriptor() ([]byte, []int) {
- return fileDescriptor_c161fcfdc0c3ff1e, []int{5}
+ return file_test_proto_rawDescGZIP(), []int{5}
}
-func (m *PolicyOutput) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_PolicyOutput.Unmarshal(m, b)
-}
-func (m *PolicyOutput) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_PolicyOutput.Marshal(b, m, deterministic)
-}
-func (m *PolicyOutput) XXX_Merge(src proto.Message) {
- xxx_messageInfo_PolicyOutput.Merge(m, src)
-}
-func (m *PolicyOutput) XXX_Size() int {
- return xxx_messageInfo_PolicyOutput.Size(m)
-}
-func (m *PolicyOutput) XXX_DiscardUnknown() {
- xxx_messageInfo_PolicyOutput.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PolicyOutput proto.InternalMessageInfo
-
-func (m *PolicyOutput) GetUrl() string {
- if m != nil {
- return m.Url
+func (x *PolicyOutput) GetUrl() string {
+ if x != nil {
+ return x.Url
}
return ""
}
-func (m *PolicyOutput) GetFields() map[string]string {
- if m != nil {
- return m.Fields
+func (x *PolicyOutput) GetFields() map[string]string {
+ if x != nil {
+ return x.Fields
}
return nil
}
-func (m *PolicyOutput) GetExpectedDecodedPolicy() string {
- if m != nil {
- return m.ExpectedDecodedPolicy
+func (x *PolicyOutput) GetExpectedDecodedPolicy() string {
+ if x != nil {
+ return x.ExpectedDecodedPolicy
}
return ""
}
type PostPolicyV4Test struct {
- Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
- PolicyInput *PolicyInput `protobuf:"bytes,2,opt,name=policyInput,proto3" json:"policyInput,omitempty"`
- PolicyOutput *PolicyOutput `protobuf:"bytes,3,opt,name=policyOutput,proto3" json:"policyOutput,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
+ PolicyInput *PolicyInput `protobuf:"bytes,2,opt,name=policyInput,proto3" json:"policyInput,omitempty"`
+ PolicyOutput *PolicyOutput `protobuf:"bytes,3,opt,name=policyOutput,proto3" json:"policyOutput,omitempty"`
}
-func (m *PostPolicyV4Test) Reset() { *m = PostPolicyV4Test{} }
-func (m *PostPolicyV4Test) String() string { return proto.CompactTextString(m) }
-func (*PostPolicyV4Test) ProtoMessage() {}
+func (x *PostPolicyV4Test) Reset() {
+ *x = PostPolicyV4Test{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_test_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *PostPolicyV4Test) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PostPolicyV4Test) ProtoMessage() {}
+
+func (x *PostPolicyV4Test) ProtoReflect() protoreflect.Message {
+ mi := &file_test_proto_msgTypes[6]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use PostPolicyV4Test.ProtoReflect.Descriptor instead.
func (*PostPolicyV4Test) Descriptor() ([]byte, []int) {
- return fileDescriptor_c161fcfdc0c3ff1e, []int{6}
+ return file_test_proto_rawDescGZIP(), []int{6}
}
-func (m *PostPolicyV4Test) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_PostPolicyV4Test.Unmarshal(m, b)
-}
-func (m *PostPolicyV4Test) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_PostPolicyV4Test.Marshal(b, m, deterministic)
-}
-func (m *PostPolicyV4Test) XXX_Merge(src proto.Message) {
- xxx_messageInfo_PostPolicyV4Test.Merge(m, src)
-}
-func (m *PostPolicyV4Test) XXX_Size() int {
- return xxx_messageInfo_PostPolicyV4Test.Size(m)
-}
-func (m *PostPolicyV4Test) XXX_DiscardUnknown() {
- xxx_messageInfo_PostPolicyV4Test.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PostPolicyV4Test proto.InternalMessageInfo
-
-func (m *PostPolicyV4Test) GetDescription() string {
- if m != nil {
- return m.Description
+func (x *PostPolicyV4Test) GetDescription() string {
+ if x != nil {
+ return x.Description
}
return ""
}
-func (m *PostPolicyV4Test) GetPolicyInput() *PolicyInput {
- if m != nil {
- return m.PolicyInput
+func (x *PostPolicyV4Test) GetPolicyInput() *PolicyInput {
+ if x != nil {
+ return x.PolicyInput
}
return nil
}
-func (m *PostPolicyV4Test) GetPolicyOutput() *PolicyOutput {
- if m != nil {
- return m.PolicyOutput
+func (x *PostPolicyV4Test) GetPolicyOutput() *PolicyOutput {
+ if x != nil {
+ return x.PolicyOutput
}
return nil
}
-func init() {
- proto.RegisterEnum("google.cloud.conformance.storage.v1.UrlStyle", UrlStyle_name, UrlStyle_value)
- proto.RegisterType((*TestFile)(nil), "google.cloud.conformance.storage.v1.TestFile")
- proto.RegisterType((*SigningV4Test)(nil), "google.cloud.conformance.storage.v1.SigningV4Test")
- proto.RegisterMapType((map[string]string)(nil), "google.cloud.conformance.storage.v1.SigningV4Test.HeadersEntry")
- proto.RegisterMapType((map[string]string)(nil), "google.cloud.conformance.storage.v1.SigningV4Test.QueryParametersEntry")
- proto.RegisterType((*ConditionalMatches)(nil), "google.cloud.conformance.storage.v1.ConditionalMatches")
- proto.RegisterType((*PolicyConditions)(nil), "google.cloud.conformance.storage.v1.PolicyConditions")
- proto.RegisterType((*PolicyInput)(nil), "google.cloud.conformance.storage.v1.PolicyInput")
- proto.RegisterMapType((map[string]string)(nil), "google.cloud.conformance.storage.v1.PolicyInput.FieldsEntry")
- proto.RegisterType((*PolicyOutput)(nil), "google.cloud.conformance.storage.v1.PolicyOutput")
- proto.RegisterMapType((map[string]string)(nil), "google.cloud.conformance.storage.v1.PolicyOutput.FieldsEntry")
- proto.RegisterType((*PostPolicyV4Test)(nil), "google.cloud.conformance.storage.v1.PostPolicyV4Test")
+type RetryTests struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ RetryTests []*RetryTest `protobuf:"bytes,1,rep,name=retryTests,proto3" json:"retryTests,omitempty"`
}
-func init() { proto.RegisterFile("test.proto", fileDescriptor_c161fcfdc0c3ff1e) }
+func (x *RetryTests) Reset() {
+ *x = RetryTests{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_test_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
-var fileDescriptor_c161fcfdc0c3ff1e = []byte{
- // 901 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0xef, 0x6e, 0xe2, 0x46,
- 0x10, 0xaf, 0x21, 0x70, 0x30, 0xe4, 0x72, 0x74, 0xcb, 0x55, 0x2e, 0x1f, 0x5a, 0x44, 0x3f, 0x94,
- 0x56, 0xaa, 0xef, 0x42, 0x73, 0xd2, 0x35, 0x6a, 0x55, 0x05, 0xc2, 0x5d, 0xa2, 0xe6, 0x12, 0x6a,
- 0x4c, 0x4e, 0x27, 0x55, 0x42, 0xc6, 0x1e, 0xc0, 0x3d, 0xe3, 0x75, 0xbc, 0xeb, 0xe8, 0x78, 0x8f,
- 0x3e, 0x45, 0x9f, 0xa6, 0x6f, 0xd0, 0x4f, 0x95, 0xfa, 0x18, 0xd5, 0xee, 0xda, 0x60, 0x2e, 0x44,
- 0x82, 0xfe, 0xf9, 0xc6, 0xcc, 0xec, 0xfc, 0x7e, 0xeb, 0x99, 0xdf, 0xcc, 0x02, 0xc0, 0x91, 0x71,
- 0x23, 0x8c, 0x28, 0xa7, 0xe4, 0xf3, 0x29, 0xa5, 0x53, 0x1f, 0x0d, 0xc7, 0xa7, 0xb1, 0x6b, 0x38,
- 0x34, 0x98, 0xd0, 0x68, 0x6e, 0x07, 0x0e, 0x1a, 0x8c, 0xd3, 0xc8, 0x9e, 0xa2, 0x71, 0x7b, 0x58,
- 0xff, 0x4c, 0x1d, 0x7a, 0x22, 0x53, 0xc6, 0xf1, 0xe4, 0x09, 0xf7, 0xe6, 0xc8, 0xb8, 0x3d, 0x0f,
- 0x15, 0x4a, 0xf3, 0x77, 0x0d, 0x4a, 0x16, 0x32, 0xfe, 0xc2, 0xf3, 0x91, 0xfc, 0x0c, 0x55, 0xe6,
- 0x4d, 0x03, 0x2f, 0x98, 0x8e, 0x6e, 0x8f, 0x46, 0x82, 0x8b, 0xe9, 0x5a, 0x23, 0xdf, 0xaa, 0xb4,
- 0xdb, 0xc6, 0x16, 0x6c, 0xc6, 0x40, 0x25, 0x5f, 0x1f, 0x09, 0x44, 0xf3, 0x80, 0x65, 0x4d, 0x46,
- 0x26, 0x50, 0x0b, 0x29, 0xe3, 0xa3, 0x90, 0xfa, 0x9e, 0xb3, 0x58, 0x31, 0xe4, 0x24, 0xc3, 0xb3,
- 0xad, 0x18, 0xfa, 0x94, 0xf1, 0xbe, 0xcc, 0x4f, 0x48, 0x3e, 0x0c, 0xdf, 0xf3, 0xb0, 0xe6, 0x9f,
- 0x45, 0x78, 0xb8, 0x76, 0x13, 0x52, 0x87, 0xd2, 0xc4, 0xf3, 0xf1, 0xd2, 0x9e, 0xa3, 0xae, 0x35,
- 0xb4, 0x56, 0xd9, 0x5c, 0xda, 0xa4, 0x01, 0x15, 0x17, 0x99, 0x13, 0x79, 0x21, 0xf7, 0x68, 0xa0,
- 0xe7, 0x64, 0x38, 0xeb, 0x22, 0x1f, 0x43, 0x71, 0x1c, 0x3b, 0x6f, 0x91, 0xeb, 0x79, 0x19, 0x4c,
- 0x2c, 0xe1, 0xa7, 0xe3, 0x5f, 0xd0, 0xe1, 0xfa, 0x9e, 0xf2, 0x2b, 0x4b, 0xf8, 0xe7, 0xc8, 0x67,
- 0xd4, 0xd5, 0x0b, 0xca, 0xaf, 0x2c, 0xf2, 0x29, 0x00, 0xbe, 0x0b, 0xbd, 0xc8, 0x96, 0x44, 0xc5,
- 0x86, 0xd6, 0xca, 0x9b, 0x19, 0x0f, 0x79, 0x0e, 0xe5, 0x65, 0x77, 0xf4, 0x07, 0x0d, 0xad, 0x55,
- 0x69, 0xd7, 0xd3, 0xa2, 0xa4, 0xfd, 0x33, 0xac, 0xf4, 0x84, 0xb9, 0x3a, 0x2c, 0xbe, 0x01, 0xdf,
- 0x85, 0xe8, 0x70, 0x74, 0x87, 0x91, 0xaf, 0x97, 0xd4, 0x37, 0x64, 0x5c, 0xe4, 0x0d, 0x3c, 0x98,
- 0xa1, 0xed, 0x62, 0xc4, 0xf4, 0xb2, 0x2c, 0xf7, 0x0f, 0xbb, 0x37, 0xd4, 0x38, 0x53, 0x08, 0xbd,
- 0x80, 0x47, 0x0b, 0x33, 0xc5, 0x23, 0x11, 0x54, 0x6f, 0x62, 0x8c, 0x16, 0xa3, 0xd0, 0x8e, 0xec,
- 0x39, 0x72, 0xc1, 0x01, 0x92, 0xe3, 0xe5, 0x3f, 0xe0, 0xf8, 0x49, 0x40, 0xf5, 0x97, 0x48, 0x8a,
- 0xeb, 0xd1, 0xcd, 0xba, 0x57, 0x94, 0x98, 0x39, 0x33, 0x9c, 0xa3, 0x5e, 0x51, 0x25, 0x56, 0x16,
- 0x39, 0x87, 0x52, 0x1c, 0xf9, 0x03, 0xbe, 0xf0, 0x51, 0xdf, 0x6f, 0x68, 0xad, 0x83, 0xf6, 0xd7,
- 0x5b, 0xdd, 0x61, 0x98, 0x24, 0x99, 0xcb, 0x74, 0xf2, 0x14, 0x3e, 0x52, 0x7d, 0xee, 0xd0, 0x38,
- 0x70, 0xcf, 0x28, 0xe3, 0x81, 0x90, 0xcf, 0x43, 0xc9, 0xb7, 0x29, 0x44, 0x8e, 0x41, 0x4f, 0x4b,
- 0xde, 0xb5, 0x03, 0x1a, 0x78, 0x8e, 0xed, 0x9b, 0x78, 0x13, 0x23, 0xe3, 0xfa, 0x81, 0x4c, 0xbb,
- 0x37, 0x4e, 0xda, 0x50, 0x4b, 0x63, 0x03, 0x1e, 0x79, 0xc1, 0xd4, 0xa2, 0xa2, 0x2e, 0xfa, 0x23,
- 0x99, 0xb7, 0x31, 0x56, 0x3f, 0x86, 0xfd, 0x6c, 0x47, 0x48, 0x15, 0xf2, 0x6f, 0x71, 0x91, 0x08,
- 0x5c, 0xfc, 0x24, 0x35, 0x28, 0xdc, 0xda, 0x7e, 0x8c, 0x89, 0xaa, 0x95, 0x71, 0x9c, 0x7b, 0xae,
- 0xd5, 0x3b, 0x50, 0xdb, 0x54, 0xe9, 0x5d, 0x30, 0x9a, 0x47, 0x40, 0xba, 0x34, 0x70, 0x3d, 0x21,
- 0x5e, 0xdb, 0x7f, 0x65, 0x73, 0x67, 0x86, 0x2c, 0x51, 0x79, 0x84, 0x8c, 0x09, 0x95, 0x8b, 0xed,
- 0x51, 0x36, 0x33, 0x9e, 0xe6, 0x18, 0xaa, 0x6a, 0x5c, 0x97, 0xb9, 0x8c, 0x18, 0x40, 0x1c, 0x1a,
- 0x70, 0x0c, 0xf8, 0x05, 0x06, 0x53, 0x3e, 0x33, 0xed, 0x60, 0x8a, 0x32, 0xb7, 0x60, 0x6e, 0x88,
- 0x08, 0x0e, 0xc6, 0xed, 0x88, 0xb3, 0xd7, 0x1e, 0x9f, 0xc9, 0xfd, 0x51, 0x36, 0x33, 0x9e, 0xe6,
- 0xaf, 0x7b, 0x50, 0x51, 0x24, 0xe7, 0x41, 0x18, 0xf3, 0x8c, 0x5c, 0xb4, 0x7b, 0xe5, 0x92, 0xfb,
- 0x5f, 0xe4, 0x92, 0xbf, 0x5f, 0x2e, 0xab, 0xb5, 0xb2, 0x77, 0xcf, 0x5a, 0x29, 0xac, 0xad, 0x95,
- 0xbb, 0xeb, 0xa3, 0xf0, 0x1f, 0xad, 0x0f, 0x0b, 0x8a, 0x13, 0x0f, 0x7d, 0x97, 0xe9, 0x25, 0x39,
- 0xb7, 0xdf, 0x6d, 0xb9, 0x8a, 0x97, 0x05, 0x36, 0x5e, 0xc8, 0x74, 0x35, 0xac, 0x09, 0x16, 0x19,
- 0x02, 0x38, 0xcb, 0x16, 0xeb, 0x65, 0x79, 0xa1, 0x67, 0x3b, 0x20, 0xaf, 0xf4, 0x61, 0x66, 0x80,
- 0xea, 0xdf, 0x42, 0x25, 0xc3, 0xb6, 0x93, 0x60, 0xff, 0xd2, 0x60, 0x5f, 0x61, 0x5f, 0xc5, 0x5c,
- 0xe8, 0xa2, 0x0a, 0xf9, 0x38, 0xf2, 0xd3, 0xe4, 0x38, 0xf2, 0xc9, 0x70, 0x59, 0x0a, 0xf5, 0x2a,
- 0x7d, 0xbf, 0xc3, 0x85, 0x15, 0xe8, 0xc6, 0x5a, 0x1c, 0xc1, 0xe3, 0x74, 0x84, 0x4f, 0xd1, 0xa1,
- 0x2e, 0xba, 0x2a, 0x25, 0xd1, 0xc7, 0xe6, 0xe0, 0xbf, 0xf9, 0xd4, 0x3f, 0x34, 0x31, 0x66, 0xeb,
- 0x2f, 0xe3, 0xfb, 0x4f, 0x9d, 0x76, 0xf7, 0xa9, 0x33, 0xa1, 0x12, 0xae, 0xda, 0x2a, 0x61, 0x2b,
- 0xed, 0xa7, 0xbb, 0xca, 0xc1, 0xcc, 0x82, 0x90, 0x21, 0xec, 0x87, 0x99, 0xfa, 0xc8, 0x4f, 0xae,
- 0xb4, 0x0f, 0x77, 0x2e, 0xac, 0xb9, 0x06, 0xf3, 0xd5, 0x15, 0x94, 0xd2, 0x31, 0x24, 0x07, 0x00,
- 0xfd, 0x13, 0xeb, 0x6c, 0x34, 0xb0, 0xde, 0x5c, 0xf4, 0xaa, 0x1f, 0x10, 0x1d, 0x6a, 0xd7, 0xe7,
- 0xa6, 0x35, 0x3c, 0xb9, 0x18, 0x9d, 0x5d, 0x0d, 0xac, 0xde, 0x69, 0x12, 0xd1, 0xc8, 0x27, 0xf0,
- 0xb8, 0x33, 0xec, 0xfe, 0xd8, 0xb3, 0x46, 0x9d, 0xab, 0xe1, 0xe5, 0xa9, 0x0c, 0x5f, 0x9e, 0xbc,
- 0xea, 0x55, 0x73, 0x9d, 0xd7, 0xf0, 0x85, 0x43, 0xe7, 0xdb, 0x5c, 0xab, 0xaf, 0xfd, 0x96, 0xfb,
- 0xf2, 0xa5, 0x3a, 0xd7, 0x95, 0xe7, 0x06, 0x49, 0xec, 0xfa, 0xd0, 0x90, 0xff, 0x41, 0x8c, 0xee,
- 0x2a, 0x71, 0x5c, 0x94, 0xd3, 0xf7, 0xcd, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x35, 0x7d,
- 0xfd, 0xbd, 0x09, 0x00, 0x00,
+func (x *RetryTests) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RetryTests) ProtoMessage() {}
+
+func (x *RetryTests) ProtoReflect() protoreflect.Message {
+ mi := &file_test_proto_msgTypes[7]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RetryTests.ProtoReflect.Descriptor instead.
+func (*RetryTests) Descriptor() ([]byte, []int) {
+ return file_test_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *RetryTests) GetRetryTests() []*RetryTest {
+ if x != nil {
+ return x.RetryTests
+ }
+ return nil
+}
+
+// A list of instructions to send as headers to the GCS emulator. Each
+// instruction will force a specified failure for that request.
+type InstructionList struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Instructions []string `protobuf:"bytes,1,rep,name=instructions,proto3" json:"instructions,omitempty"`
+}
+
+func (x *InstructionList) Reset() {
+ *x = InstructionList{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_test_proto_msgTypes[8]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *InstructionList) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InstructionList) ProtoMessage() {}
+
+func (x *InstructionList) ProtoReflect() protoreflect.Message {
+ mi := &file_test_proto_msgTypes[8]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use InstructionList.ProtoReflect.Descriptor instead.
+func (*InstructionList) Descriptor() ([]byte, []int) {
+ return file_test_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *InstructionList) GetInstructions() []string {
+ if x != nil {
+ return x.Instructions
+ }
+ return nil
+}
+
+// A particular storage API method and required resources in order to test it.
+// Methods must be implemented in tests for each language.
+type Method struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // e.g. storage.objects.get
+ Resources []Resource `protobuf:"varint,2,rep,packed,name=resources,proto3,enum=google.cloud.conformance.storage.v1.Resource" json:"resources,omitempty"`
+}
+
+func (x *Method) Reset() {
+ *x = Method{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_test_proto_msgTypes[9]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Method) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Method) ProtoMessage() {}
+
+func (x *Method) ProtoReflect() protoreflect.Message {
+ mi := &file_test_proto_msgTypes[9]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Method.ProtoReflect.Descriptor instead.
+func (*Method) Descriptor() ([]byte, []int) {
+ return file_test_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *Method) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *Method) GetResources() []Resource {
+ if x != nil {
+ return x.Resources
+ }
+ return nil
+}
+
+// Schema for a retry test, corresponding to a single scenario from the design
+// doc.
+type RetryTest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Scenario number
+ Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
+ // Human-readable description of the test case.
+ Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+ // list of emulator instruction sets.
+ Cases []*InstructionList `protobuf:"bytes,3,rep,name=cases,proto3" json:"cases,omitempty"`
+ // List of API methods to be tested.
+ Methods []*Method `protobuf:"bytes,4,rep,name=methods,proto3" json:"methods,omitempty"`
+ // Whether a precondition is provided (for conditionally-idempotent methods
+ // only).
+ PreconditionProvided bool `protobuf:"varint,5,opt,name=preconditionProvided,proto3" json:"preconditionProvided,omitempty"`
+ // Whether we expect the method calls to eventually succeed after the client
+ // library retries.
+ ExpectSuccess bool `protobuf:"varint,6,opt,name=expectSuccess,proto3" json:"expectSuccess,omitempty"`
+}
+
+func (x *RetryTest) Reset() {
+ *x = RetryTest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_test_proto_msgTypes[10]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RetryTest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RetryTest) ProtoMessage() {}
+
+func (x *RetryTest) ProtoReflect() protoreflect.Message {
+ mi := &file_test_proto_msgTypes[10]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RetryTest.ProtoReflect.Descriptor instead.
+func (*RetryTest) Descriptor() ([]byte, []int) {
+ return file_test_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *RetryTest) GetId() int32 {
+ if x != nil {
+ return x.Id
+ }
+ return 0
+}
+
+func (x *RetryTest) GetDescription() string {
+ if x != nil {
+ return x.Description
+ }
+ return ""
+}
+
+func (x *RetryTest) GetCases() []*InstructionList {
+ if x != nil {
+ return x.Cases
+ }
+ return nil
+}
+
+func (x *RetryTest) GetMethods() []*Method {
+ if x != nil {
+ return x.Methods
+ }
+ return nil
+}
+
+func (x *RetryTest) GetPreconditionProvided() bool {
+ if x != nil {
+ return x.PreconditionProvided
+ }
+ return false
+}
+
+func (x *RetryTest) GetExpectSuccess() bool {
+ if x != nil {
+ return x.ExpectSuccess
+ }
+ return false
+}
+
+var File_test_proto protoreflect.FileDescriptor
+
+var file_test_proto_rawDesc = []byte{
+ 0x0a, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x23, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
+ 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+ 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x22, 0xa1, 0x02, 0x0a, 0x08, 0x54, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12,
+ 0x5c, 0x0a, 0x10, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x34, 0x5f, 0x74, 0x65,
+ 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+ 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x34, 0x54, 0x65, 0x73, 0x74, 0x52, 0x0e, 0x73,
+ 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x34, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x66, 0x0a,
+ 0x14, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x76, 0x34, 0x5f,
+ 0x74, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
+ 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x34, 0x54, 0x65,
+ 0x73, 0x74, 0x52, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x34,
+ 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x4f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x74,
+ 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31,
+ 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72,
+ 0x79, 0x54, 0x65, 0x73, 0x74, 0x73, 0x22, 0xe5, 0x06, 0x0a, 0x0d, 0x53, 0x69, 0x67, 0x6e, 0x69,
+ 0x6e, 0x67, 0x56, 0x34, 0x54, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65,
+ 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65,
+ 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+ 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
+ 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x16,
+ 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e,
+ 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01,
+ 0x28, 0x03, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38,
+ 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74,
+ 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x65,
+ 0x63, 0x74, 0x65, 0x64, 0x55, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65,
+ 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x68, 0x65,
+ 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
+ 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x34, 0x54, 0x65, 0x73, 0x74, 0x2e,
+ 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65,
+ 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x72, 0x0a, 0x10, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x70,
+ 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32,
+ 0x47, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x63,
+ 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
+ 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x34, 0x54,
+ 0x65, 0x73, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74,
+ 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50,
+ 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68,
+ 0x65, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d,
+ 0x65, 0x12, 0x49, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x0c, 0x20,
+ 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f,
+ 0x75, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73,
+ 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x72, 0x6c, 0x53, 0x74, 0x79,
+ 0x6c, 0x65, 0x52, 0x08, 0x75, 0x72, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x13,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x6f, 0x73, 0x74, 0x6e,
+ 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a,
+ 0x0a, 0x18, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69,
+ 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x18, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69,
+ 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78,
+ 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x53, 0x69,
+ 0x67, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x53, 0x69, 0x67, 0x6e, 0x1a, 0x3a,
+ 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
+ 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
+ 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x42, 0x0a, 0x14, 0x51, 0x75,
+ 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74,
+ 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x34,
+ 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4d, 0x61, 0x74,
+ 0x63, 0x68, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69,
+ 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73,
+ 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x62, 0x0a, 0x10, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f,
+ 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01,
+ 0x20, 0x03, 0x28, 0x05, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e,
+ 0x67, 0x74, 0x68, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72,
+ 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74,
+ 0x61, 0x72, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x22, 0x94, 0x04, 0x0a, 0x0b, 0x50, 0x6f, 0x6c,
+ 0x69, 0x63, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65,
+ 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65,
+ 0x12, 0x49, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
+ 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74,
+ 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x72, 0x6c, 0x53, 0x74, 0x79, 0x6c,
+ 0x65, 0x52, 0x08, 0x75, 0x72, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61,
+ 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a,
+ 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18,
+ 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a,
+ 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28,
+ 0x05, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a,
+ 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+ 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69,
+ 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x54, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64,
+ 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e,
+ 0x63, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f,
+ 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73,
+ 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x55, 0x0a,
+ 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
+ 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x6f,
+ 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f,
+ 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e,
+ 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22,
+ 0xe8, 0x01, 0x0a, 0x0c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74,
+ 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75,
+ 0x72, 0x6c, 0x12, 0x55, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03,
+ 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
+ 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74,
+ 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4f,
+ 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72,
+ 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x65, 0x78, 0x70,
+ 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69,
+ 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74,
+ 0x65, 0x64, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a,
+ 0x39, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
+ 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
+ 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdf, 0x01, 0x0a, 0x10, 0x50,
+ 0x6f, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x34, 0x54, 0x65, 0x73, 0x74, 0x12,
+ 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+ 0x6e, 0x12, 0x52, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63,
+ 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c,
+ 0x69, 0x63, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79,
+ 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x55, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4f,
+ 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
+ 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x0c,
+ 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x5c, 0x0a, 0x0a,
+ 0x52, 0x65, 0x74, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x4e, 0x0a, 0x0a, 0x72, 0x65,
+ 0x74, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x63, 0x6f,
+ 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+ 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x52, 0x0a,
+ 0x72, 0x65, 0x74, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x73, 0x22, 0x35, 0x0a, 0x0f, 0x49, 0x6e,
+ 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x22, 0x0a,
+ 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20,
+ 0x03, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x22, 0x69, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
+ 0x4b, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03,
+ 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
+ 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74,
+ 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
+ 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xaa, 0x02, 0x0a,
+ 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65,
+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x05,
+ 0x63, 0x61, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
+ 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73,
+ 0x74, 0x52, 0x05, 0x63, 0x61, 0x73, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x68,
+ 0x6f, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+ 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x12,
+ 0x32, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x50,
+ 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x70,
+ 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69,
+ 0x64, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x53, 0x75, 0x63,
+ 0x63, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, 0x78, 0x70, 0x65,
+ 0x63, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2a, 0x4f, 0x0a, 0x08, 0x55, 0x72, 0x6c,
+ 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x41, 0x54, 0x48, 0x5f, 0x53, 0x54,
+ 0x59, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x56, 0x49, 0x52, 0x54, 0x55, 0x41, 0x4c,
+ 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x10, 0x01, 0x12,
+ 0x19, 0x0a, 0x15, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f,
+ 0x48, 0x4f, 0x53, 0x54, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x02, 0x2a, 0x42, 0x0a, 0x08, 0x52, 0x65,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54,
+ 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x01, 0x12, 0x10,
+ 0x0a, 0x0c, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02,
+ 0x12, 0x0c, 0x0a, 0x08, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x03, 0x42, 0x7c,
+ 0x0a, 0x27, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f,
+ 0x75, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x73,
+ 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x50, 0x01, 0x5a, 0x23, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x76, 0x31,
+ 0xaa, 0x02, 0x29, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e,
+ 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x56, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x73,
+ 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_test_proto_rawDescOnce sync.Once
+ file_test_proto_rawDescData = file_test_proto_rawDesc
+)
+
+func file_test_proto_rawDescGZIP() []byte {
+ file_test_proto_rawDescOnce.Do(func() {
+ file_test_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_proto_rawDescData)
+ })
+ return file_test_proto_rawDescData
+}
+
+var file_test_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_test_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
+var file_test_proto_goTypes = []interface{}{
+ (UrlStyle)(0), // 0: google.cloud.conformance.storage.v1.UrlStyle
+ (Resource)(0), // 1: google.cloud.conformance.storage.v1.Resource
+ (*TestFile)(nil), // 2: google.cloud.conformance.storage.v1.TestFile
+ (*SigningV4Test)(nil), // 3: google.cloud.conformance.storage.v1.SigningV4Test
+ (*ConditionalMatches)(nil), // 4: google.cloud.conformance.storage.v1.ConditionalMatches
+ (*PolicyConditions)(nil), // 5: google.cloud.conformance.storage.v1.PolicyConditions
+ (*PolicyInput)(nil), // 6: google.cloud.conformance.storage.v1.PolicyInput
+ (*PolicyOutput)(nil), // 7: google.cloud.conformance.storage.v1.PolicyOutput
+ (*PostPolicyV4Test)(nil), // 8: google.cloud.conformance.storage.v1.PostPolicyV4Test
+ (*RetryTests)(nil), // 9: google.cloud.conformance.storage.v1.RetryTests
+ (*InstructionList)(nil), // 10: google.cloud.conformance.storage.v1.InstructionList
+ (*Method)(nil), // 11: google.cloud.conformance.storage.v1.Method
+ (*RetryTest)(nil), // 12: google.cloud.conformance.storage.v1.RetryTest
+ nil, // 13: google.cloud.conformance.storage.v1.SigningV4Test.HeadersEntry
+ nil, // 14: google.cloud.conformance.storage.v1.SigningV4Test.QueryParametersEntry
+ nil, // 15: google.cloud.conformance.storage.v1.PolicyInput.FieldsEntry
+ nil, // 16: google.cloud.conformance.storage.v1.PolicyOutput.FieldsEntry
+ (*timestamppb.Timestamp)(nil), // 17: google.protobuf.Timestamp
+}
+var file_test_proto_depIdxs = []int32{
+ 3, // 0: google.cloud.conformance.storage.v1.TestFile.signing_v4_tests:type_name -> google.cloud.conformance.storage.v1.SigningV4Test
+ 8, // 1: google.cloud.conformance.storage.v1.TestFile.post_policy_v4_tests:type_name -> google.cloud.conformance.storage.v1.PostPolicyV4Test
+ 12, // 2: google.cloud.conformance.storage.v1.TestFile.retry_tests:type_name -> google.cloud.conformance.storage.v1.RetryTest
+ 17, // 3: google.cloud.conformance.storage.v1.SigningV4Test.timestamp:type_name -> google.protobuf.Timestamp
+ 13, // 4: google.cloud.conformance.storage.v1.SigningV4Test.headers:type_name -> google.cloud.conformance.storage.v1.SigningV4Test.HeadersEntry
+ 14, // 5: google.cloud.conformance.storage.v1.SigningV4Test.query_parameters:type_name -> google.cloud.conformance.storage.v1.SigningV4Test.QueryParametersEntry
+ 0, // 6: google.cloud.conformance.storage.v1.SigningV4Test.urlStyle:type_name -> google.cloud.conformance.storage.v1.UrlStyle
+ 0, // 7: google.cloud.conformance.storage.v1.PolicyInput.urlStyle:type_name -> google.cloud.conformance.storage.v1.UrlStyle
+ 17, // 8: google.cloud.conformance.storage.v1.PolicyInput.timestamp:type_name -> google.protobuf.Timestamp
+ 15, // 9: google.cloud.conformance.storage.v1.PolicyInput.fields:type_name -> google.cloud.conformance.storage.v1.PolicyInput.FieldsEntry
+ 5, // 10: google.cloud.conformance.storage.v1.PolicyInput.conditions:type_name -> google.cloud.conformance.storage.v1.PolicyConditions
+ 16, // 11: google.cloud.conformance.storage.v1.PolicyOutput.fields:type_name -> google.cloud.conformance.storage.v1.PolicyOutput.FieldsEntry
+ 6, // 12: google.cloud.conformance.storage.v1.PostPolicyV4Test.policyInput:type_name -> google.cloud.conformance.storage.v1.PolicyInput
+ 7, // 13: google.cloud.conformance.storage.v1.PostPolicyV4Test.policyOutput:type_name -> google.cloud.conformance.storage.v1.PolicyOutput
+ 12, // 14: google.cloud.conformance.storage.v1.RetryTests.retryTests:type_name -> google.cloud.conformance.storage.v1.RetryTest
+ 1, // 15: google.cloud.conformance.storage.v1.Method.resources:type_name -> google.cloud.conformance.storage.v1.Resource
+ 10, // 16: google.cloud.conformance.storage.v1.RetryTest.cases:type_name -> google.cloud.conformance.storage.v1.InstructionList
+ 11, // 17: google.cloud.conformance.storage.v1.RetryTest.methods:type_name -> google.cloud.conformance.storage.v1.Method
+ 18, // [18:18] is the sub-list for method output_type
+ 18, // [18:18] is the sub-list for method input_type
+ 18, // [18:18] is the sub-list for extension type_name
+ 18, // [18:18] is the sub-list for extension extendee
+ 0, // [0:18] is the sub-list for field type_name
+}
+
+func init() { file_test_proto_init() }
+func file_test_proto_init() {
+ if File_test_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*TestFile); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SigningV4Test); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_test_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ConditionalMatches); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_test_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*PolicyConditions); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_test_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*PolicyInput); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_test_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*PolicyOutput); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_test_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*PostPolicyV4Test); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_test_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RetryTests); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_test_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*InstructionList); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_test_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Method); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_test_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RetryTest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_test_proto_rawDesc,
+ NumEnums: 2,
+ NumMessages: 15,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_test_proto_goTypes,
+ DependencyIndexes: file_test_proto_depIdxs,
+ EnumInfos: file_test_proto_enumTypes,
+ MessageInfos: file_test_proto_msgTypes,
+ }.Build()
+ File_test_proto = out.File
+ file_test_proto_rawDesc = nil
+ file_test_proto_goTypes = nil
+ file_test_proto_depIdxs = nil
}
diff --git a/storage/internal/test/conformance/test.proto b/storage/internal/test/conformance/test.proto
index 49e913b..b7f440c 100644
--- a/storage/internal/test/conformance/test.proto
+++ b/storage/internal/test/conformance/test.proto
@@ -21,10 +21,12 @@
option csharp_namespace = "Google.Cloud.Storage.V1.Tests.Conformance";
option java_package = "com.google.cloud.conformance.storage.v1";
option java_multiple_files = true;
+option go_package = "google/cloud/conformance/storage/v1";
message TestFile {
repeated SigningV4Test signing_v4_tests = 1;
repeated PostPolicyV4Test post_policy_v4_tests = 2;
+ repeated RetryTest retry_tests = 3;
}
enum UrlStyle {
@@ -60,7 +62,11 @@
repeated string startsWith = 2;
}
+// Specification documentation is located at:
+// https://cloud.google.com/storage/docs/authentication/signatures
+
message PolicyInput {
+ // http or https
string scheme = 1;
UrlStyle urlStyle = 2;
string bucketBoundHostname = 3;
@@ -68,6 +74,15 @@
string object = 5;
int32 expiration = 6;
google.protobuf.Timestamp timestamp = 7;
+ /*
+ fields with strict equivalence which are added into
+ PolicyOutput.expectedDecodedPolicy to generate the
+ signature.
+ Expectations
+ E.1: Order them in lexigraphical order so it's the
+ signature can be verified across different language
+ implementations.
+ */
map<string, string> fields = 8;
PolicyConditions conditions = 9;
}
@@ -75,6 +90,54 @@
message PolicyOutput {
string url = 1;
map<string, string> fields = 2;
+ /*
+ Expectations
+ E.1: PolicyInput.fields must be prepended to form expectedDecodedPolicy
+ for consistent result across languages. Ordering doesn't matter to the
+ service but the decision is made to make it easier to conform implementations
+ in implementation.
+ Example:
+ # Step 1
+ PolicyInput.fields has:
+ {
+ "content-disposition":"attachment; filename=\"~._-%=/é0Aa\"",
+ "content-encoding":"gzip",
+ "content-type":"text/plain",
+ "success_action_redirect":"http://www.google.com/"
+ }
+ # Step 2
+ The expectedDecodedPolicy before prepending the PolicyInput.fields
+ would look like this:
+ {
+ "conditions":[
+ ...prepend here in the same order provided in PolicyInput.fields...
+ {"bucket":"bucket-name"},
+ {"key":"test-object"},
+ {"x-goog-date":"20200123T043530Z"},
+ {"x-goog-credential":"test-iam-credentials@dummy-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request"},
+ {"x-goog-algorithm":"GOOG4-RSA-SHA256"}
+ ],
+ "expiration":"2020-01-23T04:35:40Z"
+ }
+ # Step 3
+ Then expectedDecodedPolicy should prepends PolicyInput.fields in
+ the same order to PolicyOutput.expectedDecodedPolicy `conditions` key.
+ {
+ "conditions":[
+ {"content-disposition":"attachment; filename=\"~._-%=/é0Aa\""},
+ {"content-encoding":"gzip"},
+ {"content-type":"text/plain"},
+ {"success_action_redirect":"http://www.google.com/"},
+ {"bucket":"bucket-name"},
+ {"key":"test-object"},
+ {"x-goog-date":"20200123T043530Z"},
+ {"x-goog-credential":"test-iam-credentials@dummy-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request"},
+ {"x-goog-algorithm":"GOOG4-RSA-SHA256"}
+ ],
+ "expiration":"2020-01-23T04:35:40Z"
+ }
+ */
+
string expectedDecodedPolicy = 3;
}
@@ -83,3 +146,59 @@
PolicyInput policyInput = 2;
PolicyOutput policyOutput = 3;
}
+
+/*
+ ------------------------------------------------------------------------------
+ Data types for retry conformance tests
+ ------------------------------------------------------------------------------
+*/
+
+message RetryTests {
+ repeated RetryTest retryTests = 1;
+}
+
+// A list of instructions to send as headers to the GCS emulator. Each
+// instruction will force a specified failure for that request.
+message InstructionList {
+ repeated string instructions = 1;
+}
+
+// Test resources that are necessary for a method call. For example,
+// storage.objects.get would require BUCKET and OBJECT.
+enum Resource {
+ BUCKET = 0;
+ OBJECT = 1;
+ NOTIFICATION = 2;
+ HMAC_KEY = 3;
+}
+
+// A particular storage API method and required resources in order to test it.
+// Methods must be implemented in tests for each language.
+message Method {
+ string name = 1; // e.g. storage.objects.get
+ repeated Resource resources = 2;
+}
+
+// Schema for a retry test, corresponding to a single scenario from the design
+// doc.
+message RetryTest {
+ // Scenario number
+ int32 id = 1;
+
+ // Human-readable description of the test case.
+ string description = 2;
+
+ // list of emulator instruction sets.
+ repeated InstructionList cases = 3;
+
+ // List of API methods to be tested.
+ repeated Method methods = 4;
+
+ // Whether a precondition is provided (for conditionally-idempotent methods
+ // only).
+ bool preconditionProvided = 5;
+
+ // Whether we expect the method calls to eventually succeed after the client
+ // library retries.
+ bool expectSuccess = 6;
+}
diff --git a/storage/retry_conformance_test.go b/storage/retry_conformance_test.go
new file mode 100644
index 0000000..894fb5f
--- /dev/null
+++ b/storage/retry_conformance_test.go
@@ -0,0 +1,318 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package storage
+
+import (
+ "bytes"
+ "context"
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "net/http/httputil"
+ "net/url"
+ "os"
+ "strings"
+ "testing"
+
+ "cloud.google.com/go/internal/uid"
+ storage_v1_tests "cloud.google.com/go/storage/internal/test/conformance"
+ "google.golang.org/api/option"
+ raw "google.golang.org/api/storage/v1"
+ htransport "google.golang.org/api/transport/http"
+)
+
+var (
+ // Resource vars for retry tests
+ bucketIDs = uid.NewSpace("bucket", nil)
+ objectIDs = uid.NewSpace("object", nil)
+ notificationIDs = uid.NewSpace("notification", nil)
+ projectID = "my-project-id"
+ serviceAccountEmail = "my-sevice-account@my-project-id.iam.gserviceaccount.com"
+ randomBytesToWrite = []byte("abcdef")
+)
+
+type retryFunc func(ctx context.Context, c *Client, fs *resources, preconditions bool) error
+
+// Methods to retry. This is a map whose keys are a string describing a standard
+// API call (e.g. storage.objects.get) and values are a list of functions which
+// wrap library methods that implement these calls. There may be multiple values
+// because multiple library methods may use the same call (e.g. get could be a
+// read or just a metadata get).
+var methods = map[string][]retryFunc{
+ "storage.buckets.get": {
+ func(ctx context.Context, c *Client, fs *resources, _ bool) error {
+ _, err := c.Bucket(fs.bucket.Name).Attrs(ctx)
+ return err
+ },
+ },
+}
+
+func TestRetryConformance(t *testing.T) {
+ host := os.Getenv("STORAGE_EMULATOR_HOST")
+ if host == "" {
+ // This test is currently skipped in CI as the env variable is not set
+ // TODO: Add test to CI
+ t.Skip("This test must use the testbench emulator; set STORAGE_EMULATOR_HOST to run.")
+ }
+ endpoint, err := url.Parse(host)
+ if err != nil {
+ t.Fatalf("error parsing emulator host (make sure it includes the scheme such as http://host): %v", err)
+ }
+
+ ctx := context.Background()
+
+ // Create non-wrapped client to use for setup steps.
+ client, err := NewClient(ctx)
+ if err != nil {
+ t.Fatalf("storage.NewClient: %v", err)
+ }
+
+ _, _, testFiles := parseFiles(t)
+
+ for _, testFile := range testFiles {
+ for _, retryTest := range testFile.RetryTests {
+ for _, instructions := range retryTest.Cases {
+ for _, method := range retryTest.Methods {
+ if len(methods[method.Name]) == 0 {
+ t.Logf("No tests for operation %v", method.Name)
+ }
+ for i, fn := range methods[method.Name] {
+ testName := fmt.Sprintf("%v-%v-%v-%v", retryTest.Id, instructions.Instructions, method.Name, i)
+ t.Run(testName, func(t *testing.T) {
+
+ // Create the retry subtest
+ subtest := &emulatorTest{T: t, name: testName, host: endpoint}
+ subtest.create(map[string][]string{
+ method.Name: instructions.Instructions,
+ })
+
+ // Create necessary test resources in the emulator
+ subtest.populateResources(ctx, client, method.Resources)
+
+ // Test
+ err = fn(ctx, subtest.wrappedClient, &subtest.resources, retryTest.PreconditionProvided)
+ if retryTest.ExpectSuccess && err != nil {
+ t.Errorf("want success, got %v", err)
+ }
+ if !retryTest.ExpectSuccess && err == nil {
+ t.Errorf("want failure, got success")
+ }
+
+ // Verify that all instructions were used up during the test
+ // (indicates that the client sent the correct requests).
+ subtest.check()
+
+ // Close out test in emulator.
+ subtest.delete()
+ })
+ }
+ }
+ }
+ }
+ }
+}
+
+type emulatorTest struct {
+ *testing.T
+ name string
+ id string // ID to pass as a header in the test execution
+ resources resources
+ host *url.URL // set the path when using; path is not guaranteed between calls
+ wrappedClient *Client
+}
+
+// Holds the resources for a particular test case. Only the necessary fields will
+// be populated; others will be nil.
+type resources struct {
+ bucket *BucketAttrs
+ object *ObjectAttrs
+ notification *Notification
+ hmacKey *HMACKey
+}
+
+// Creates given test resources with the provided client
+func (et *emulatorTest) populateResources(ctx context.Context, c *Client, resources []storage_v1_tests.Resource) {
+ for _, resource := range resources {
+ switch resource {
+ case storage_v1_tests.Resource_BUCKET:
+ bkt := c.Bucket(bucketIDs.New())
+ if err := bkt.Create(ctx, projectID, &BucketAttrs{}); err != nil {
+ et.Fatalf("creating bucket: %v", err)
+ }
+ attrs, err := bkt.Attrs(ctx)
+ if err != nil {
+ et.Fatalf("getting bucket attrs: %v", err)
+ }
+ et.resources.bucket = attrs
+ case storage_v1_tests.Resource_OBJECT:
+ // Assumes bucket has been populated first.
+ obj := c.Bucket(et.resources.bucket.Name).Object(objectIDs.New())
+ w := obj.NewWriter(ctx)
+ if _, err := w.Write(randomBytesToWrite); err != nil {
+ et.Fatalf("writing object: %v", err)
+ }
+ if err := w.Close(); err != nil {
+ et.Fatalf("closing object: %v", err)
+ }
+ attrs, err := obj.Attrs(ctx)
+ if err != nil {
+ et.Fatalf("getting object attrs: %v", err)
+ }
+ et.resources.object = attrs
+ case storage_v1_tests.Resource_NOTIFICATION:
+ // Assumes bucket has been populated first.
+ n, err := c.Bucket(et.resources.bucket.Name).AddNotification(ctx, &Notification{
+ TopicProjectID: projectID,
+ TopicID: notificationIDs.New(),
+ PayloadFormat: JSONPayload,
+ })
+ if err != nil {
+ et.Fatalf("adding notification: %v", err)
+ }
+ et.resources.notification = n
+ case storage_v1_tests.Resource_HMAC_KEY:
+ key, err := c.CreateHMACKey(ctx, projectID, serviceAccountEmail)
+ if err != nil {
+ et.Fatalf("creating HMAC key: %v", err)
+ }
+ et.resources.hmacKey = key
+ }
+ }
+}
+
+// Creates a retry test resource in the emulator
+func (et *emulatorTest) create(instructions map[string][]string) {
+ c := http.DefaultClient
+ data := struct {
+ Instructions map[string][]string `json:"instructions"`
+ }{
+ Instructions: instructions,
+ }
+
+ buf := new(bytes.Buffer)
+ if err := json.NewEncoder(buf).Encode(data); err != nil {
+ et.Fatalf("encoding request: %v", err)
+ }
+
+ et.host.Path = "retry_test"
+ resp, err := c.Post(et.host.String(), "application/json", buf)
+ if err != nil || resp.StatusCode != 200 {
+ et.Fatalf("creating retry test: err: %v, resp: %+v", err, resp)
+ }
+ defer func() {
+ closeErr := resp.Body.Close()
+ if err == nil {
+ err = closeErr
+ }
+ }()
+ testRes := struct {
+ TestID string `json:"id"`
+ }{}
+ if err := json.NewDecoder(resp.Body).Decode(&testRes); err != nil {
+ et.Fatalf("decoding test ID: %v", err)
+ }
+
+ et.id = testRes.TestID
+
+ // Create wrapped client which will send emulator instructions
+ et.host.Path = ""
+ client, err := wrappedClient(et.T, et.host.String(), et.id)
+ if err != nil {
+ et.Fatalf("creating wrapped client: %v", err)
+ }
+ et.wrappedClient = client
+}
+
+// Verifies that all instructions for a given retry testID have been used up
+func (et *emulatorTest) check() {
+ et.host.Path = strings.Join([]string{"retry_test", et.id}, "/")
+ c := http.DefaultClient
+ resp, err := c.Get(et.host.String())
+ if err != nil || resp.StatusCode != 200 {
+ et.Errorf("getting retry test: err: %v, resp: %+v", err, resp)
+ }
+ defer func() {
+ closeErr := resp.Body.Close()
+ if err == nil {
+ err = closeErr
+ }
+ }()
+ testRes := struct {
+ Instructions map[string][]string
+ Completed bool
+ }{}
+ if err := json.NewDecoder(resp.Body).Decode(&testRes); err != nil {
+ et.Errorf("decoding response: %v", err)
+ }
+ if !testRes.Completed {
+ et.Errorf("test not completed; unused instructions: %+v", testRes.Instructions)
+ }
+}
+
+// Deletes a retry test resource
+func (et *emulatorTest) delete() {
+ et.host.Path = strings.Join([]string{"retry_test", et.id}, "/")
+ c := http.DefaultClient
+ req, err := http.NewRequest("DELETE", et.host.String(), nil)
+ if err != nil {
+ et.Errorf("creating request: %v", err)
+ }
+ resp, err := c.Do(req)
+ if err != nil || resp.StatusCode != 200 {
+ et.Errorf("deleting test: err: %v, resp: %+v", err, resp)
+ }
+}
+
+// retryTestRoundTripper sends the retry test ID to the emulator with each request
+type retryTestRoundTripper struct {
+ *testing.T
+ rt http.RoundTripper
+ testID string
+}
+
+func (wt *retryTestRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) {
+ r.Header.Set("x-retry-test-id", wt.testID)
+
+ requestDump, err := httputil.DumpRequest(r, false)
+ if err != nil {
+ wt.Logf("error creating request dump: %v", err)
+ }
+
+ resp, err := wt.rt.RoundTrip(r)
+ if err != nil {
+ wt.Logf("roundtrip error (may be expected): %v\nrequest: %s", err, requestDump)
+ }
+ return resp, err
+}
+
+// Create custom client that sends instructions to the storage testbench Retry Test API
+func wrappedClient(t *testing.T, host, testID string) (*Client, error) {
+ ctx := context.Background()
+ base := http.DefaultTransport
+ trans, err := htransport.NewTransport(ctx, base, option.WithScopes(raw.DevstorageFullControlScope),
+ option.WithUserAgent("custom-user-agent"))
+ if err != nil {
+ return nil, fmt.Errorf("failed to create http client: %v", err)
+ }
+ c := http.Client{Transport: trans}
+
+ // Add RoundTripper to the created HTTP client
+ wrappedTrans := &retryTestRoundTripper{rt: c.Transport, testID: testID, T: t}
+ c.Transport = wrappedTrans
+
+ // Supply this client to storage.NewClient
+ client, err := NewClient(ctx, option.WithHTTPClient(&c), option.WithEndpoint(host+"/storage/v1/"))
+ return client, err
+}