Setup integration tests and CI (#11)
All checks were successful
Integration Tests / test-integration (push) Successful in 2m17s
All checks were successful
Integration Tests / test-integration (push) Successful in 2m17s
- Setup integration tests following pattern suggested in cosmos-sdk docs: https://docs.cosmos.network/v0.50/build/building-modules/testing#integration-tests - Add tests for laconic modules query services - Setup a CI workflow to run the integration tests Reviewed-on: deep-stack/laconic2d#11 Co-authored-by: Prathamesh Musale <prathamesh.musale0@gmail.com> Co-committed-by: Prathamesh Musale <prathamesh.musale0@gmail.com>
This commit is contained in:
parent
d2505367aa
commit
0af44b5f17
19
.gitea/workflows/test-integration.yml
Normal file
19
.gitea/workflows/test-integration.yml
Normal file
@ -0,0 +1,19 @@
|
||||
name: Integration Tests
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
test-integration:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: 1.21
|
||||
check-latest: true
|
||||
- uses: actions/checkout@v3
|
||||
- name: Test
|
||||
run: |
|
||||
make test-integration
|
7
Makefile
7
Makefile
@ -81,3 +81,10 @@ lint-fix:
|
||||
@$(golangci_lint_cmd) run ./... --fix --timeout 15m
|
||||
|
||||
.PHONY: lint lint-fix
|
||||
|
||||
#################
|
||||
### Tests ###
|
||||
#################
|
||||
|
||||
test-integration:
|
||||
$(MAKE) -C tests test-integration
|
||||
|
@ -12,3 +12,9 @@ Install and run `laconic2d`:
|
||||
# start the chain
|
||||
laconic2d start
|
||||
```
|
||||
|
||||
Run tests:
|
||||
|
||||
```bash
|
||||
make test-integration
|
||||
```
|
||||
|
@ -6130,6 +6130,486 @@ func (x *fastReflection_ExpiryQueue) ProtoMethods() *protoiface.Methods {
|
||||
}
|
||||
}
|
||||
|
||||
var _ protoreflect.List = (*_RecordsList_1_list)(nil)
|
||||
|
||||
type _RecordsList_1_list struct {
|
||||
list *[]string
|
||||
}
|
||||
|
||||
func (x *_RecordsList_1_list) Len() int {
|
||||
if x.list == nil {
|
||||
return 0
|
||||
}
|
||||
return len(*x.list)
|
||||
}
|
||||
|
||||
func (x *_RecordsList_1_list) Get(i int) protoreflect.Value {
|
||||
return protoreflect.ValueOfString((*x.list)[i])
|
||||
}
|
||||
|
||||
func (x *_RecordsList_1_list) Set(i int, value protoreflect.Value) {
|
||||
valueUnwrapped := value.String()
|
||||
concreteValue := valueUnwrapped
|
||||
(*x.list)[i] = concreteValue
|
||||
}
|
||||
|
||||
func (x *_RecordsList_1_list) Append(value protoreflect.Value) {
|
||||
valueUnwrapped := value.String()
|
||||
concreteValue := valueUnwrapped
|
||||
*x.list = append(*x.list, concreteValue)
|
||||
}
|
||||
|
||||
func (x *_RecordsList_1_list) AppendMutable() protoreflect.Value {
|
||||
panic(fmt.Errorf("AppendMutable can not be called on message RecordsList at list field Value as it is not of Message kind"))
|
||||
}
|
||||
|
||||
func (x *_RecordsList_1_list) Truncate(n int) {
|
||||
*x.list = (*x.list)[:n]
|
||||
}
|
||||
|
||||
func (x *_RecordsList_1_list) NewElement() protoreflect.Value {
|
||||
v := ""
|
||||
return protoreflect.ValueOfString(v)
|
||||
}
|
||||
|
||||
func (x *_RecordsList_1_list) IsValid() bool {
|
||||
return x.list != nil
|
||||
}
|
||||
|
||||
var (
|
||||
md_RecordsList protoreflect.MessageDescriptor
|
||||
fd_RecordsList_value protoreflect.FieldDescriptor
|
||||
)
|
||||
|
||||
func init() {
|
||||
file_cerc_registry_v1_registry_proto_init()
|
||||
md_RecordsList = File_cerc_registry_v1_registry_proto.Messages().ByName("RecordsList")
|
||||
fd_RecordsList_value = md_RecordsList.Fields().ByName("value")
|
||||
}
|
||||
|
||||
var _ protoreflect.Message = (*fastReflection_RecordsList)(nil)
|
||||
|
||||
type fastReflection_RecordsList RecordsList
|
||||
|
||||
func (x *RecordsList) ProtoReflect() protoreflect.Message {
|
||||
return (*fastReflection_RecordsList)(x)
|
||||
}
|
||||
|
||||
func (x *RecordsList) slowProtoReflect() protoreflect.Message {
|
||||
mi := &file_cerc_registry_v1_registry_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)
|
||||
}
|
||||
|
||||
var _fastReflection_RecordsList_messageType fastReflection_RecordsList_messageType
|
||||
var _ protoreflect.MessageType = fastReflection_RecordsList_messageType{}
|
||||
|
||||
type fastReflection_RecordsList_messageType struct{}
|
||||
|
||||
func (x fastReflection_RecordsList_messageType) Zero() protoreflect.Message {
|
||||
return (*fastReflection_RecordsList)(nil)
|
||||
}
|
||||
func (x fastReflection_RecordsList_messageType) New() protoreflect.Message {
|
||||
return new(fastReflection_RecordsList)
|
||||
}
|
||||
func (x fastReflection_RecordsList_messageType) Descriptor() protoreflect.MessageDescriptor {
|
||||
return md_RecordsList
|
||||
}
|
||||
|
||||
// Descriptor returns message descriptor, which contains only the protobuf
|
||||
// type information for the message.
|
||||
func (x *fastReflection_RecordsList) Descriptor() protoreflect.MessageDescriptor {
|
||||
return md_RecordsList
|
||||
}
|
||||
|
||||
// Type returns the message type, which encapsulates both Go and protobuf
|
||||
// type information. If the Go type information is not needed,
|
||||
// it is recommended that the message descriptor be used instead.
|
||||
func (x *fastReflection_RecordsList) Type() protoreflect.MessageType {
|
||||
return _fastReflection_RecordsList_messageType
|
||||
}
|
||||
|
||||
// New returns a newly allocated and mutable empty message.
|
||||
func (x *fastReflection_RecordsList) New() protoreflect.Message {
|
||||
return new(fastReflection_RecordsList)
|
||||
}
|
||||
|
||||
// Interface unwraps the message reflection interface and
|
||||
// returns the underlying ProtoMessage interface.
|
||||
func (x *fastReflection_RecordsList) Interface() protoreflect.ProtoMessage {
|
||||
return (*RecordsList)(x)
|
||||
}
|
||||
|
||||
// Range iterates over every populated field in an undefined order,
|
||||
// calling f for each field descriptor and value encountered.
|
||||
// Range returns immediately if f returns false.
|
||||
// While iterating, mutating operations may only be performed
|
||||
// on the current field descriptor.
|
||||
func (x *fastReflection_RecordsList) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
|
||||
if len(x.Value) != 0 {
|
||||
value := protoreflect.ValueOfList(&_RecordsList_1_list{list: &x.Value})
|
||||
if !f(fd_RecordsList_value, value) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Has reports whether a field is populated.
|
||||
//
|
||||
// Some fields have the property of nullability where it is possible to
|
||||
// distinguish between the default value of a field and whether the field
|
||||
// was explicitly populated with the default value. Singular message fields,
|
||||
// member fields of a oneof, and proto2 scalar fields are nullable. Such
|
||||
// fields are populated only if explicitly set.
|
||||
//
|
||||
// In other cases (aside from the nullable cases above),
|
||||
// a proto3 scalar field is populated if it contains a non-zero value, and
|
||||
// a repeated field is populated if it is non-empty.
|
||||
func (x *fastReflection_RecordsList) Has(fd protoreflect.FieldDescriptor) bool {
|
||||
switch fd.FullName() {
|
||||
case "cerc.registry.v1.RecordsList.value":
|
||||
return len(x.Value) != 0
|
||||
default:
|
||||
if fd.IsExtension() {
|
||||
panic(fmt.Errorf("proto3 declared messages do not support extensions: cerc.registry.v1.RecordsList"))
|
||||
}
|
||||
panic(fmt.Errorf("message cerc.registry.v1.RecordsList does not contain field %s", fd.FullName()))
|
||||
}
|
||||
}
|
||||
|
||||
// Clear clears the field such that a subsequent Has call reports false.
|
||||
//
|
||||
// Clearing an extension field clears both the extension type and value
|
||||
// associated with the given field number.
|
||||
//
|
||||
// Clear is a mutating operation and unsafe for concurrent use.
|
||||
func (x *fastReflection_RecordsList) Clear(fd protoreflect.FieldDescriptor) {
|
||||
switch fd.FullName() {
|
||||
case "cerc.registry.v1.RecordsList.value":
|
||||
x.Value = nil
|
||||
default:
|
||||
if fd.IsExtension() {
|
||||
panic(fmt.Errorf("proto3 declared messages do not support extensions: cerc.registry.v1.RecordsList"))
|
||||
}
|
||||
panic(fmt.Errorf("message cerc.registry.v1.RecordsList does not contain field %s", fd.FullName()))
|
||||
}
|
||||
}
|
||||
|
||||
// Get retrieves the value for a field.
|
||||
//
|
||||
// For unpopulated scalars, it returns the default value, where
|
||||
// the default value of a bytes scalar is guaranteed to be a copy.
|
||||
// For unpopulated composite types, it returns an empty, read-only view
|
||||
// of the value; to obtain a mutable reference, use Mutable.
|
||||
func (x *fastReflection_RecordsList) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value {
|
||||
switch descriptor.FullName() {
|
||||
case "cerc.registry.v1.RecordsList.value":
|
||||
if len(x.Value) == 0 {
|
||||
return protoreflect.ValueOfList(&_RecordsList_1_list{})
|
||||
}
|
||||
listValue := &_RecordsList_1_list{list: &x.Value}
|
||||
return protoreflect.ValueOfList(listValue)
|
||||
default:
|
||||
if descriptor.IsExtension() {
|
||||
panic(fmt.Errorf("proto3 declared messages do not support extensions: cerc.registry.v1.RecordsList"))
|
||||
}
|
||||
panic(fmt.Errorf("message cerc.registry.v1.RecordsList does not contain field %s", descriptor.FullName()))
|
||||
}
|
||||
}
|
||||
|
||||
// Set stores the value for a field.
|
||||
//
|
||||
// For a field belonging to a oneof, it implicitly clears any other field
|
||||
// that may be currently set within the same oneof.
|
||||
// For extension fields, it implicitly stores the provided ExtensionType.
|
||||
// When setting a composite type, it is unspecified whether the stored value
|
||||
// aliases the source's memory in any way. If the composite value is an
|
||||
// empty, read-only value, then it panics.
|
||||
//
|
||||
// Set is a mutating operation and unsafe for concurrent use.
|
||||
func (x *fastReflection_RecordsList) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) {
|
||||
switch fd.FullName() {
|
||||
case "cerc.registry.v1.RecordsList.value":
|
||||
lv := value.List()
|
||||
clv := lv.(*_RecordsList_1_list)
|
||||
x.Value = *clv.list
|
||||
default:
|
||||
if fd.IsExtension() {
|
||||
panic(fmt.Errorf("proto3 declared messages do not support extensions: cerc.registry.v1.RecordsList"))
|
||||
}
|
||||
panic(fmt.Errorf("message cerc.registry.v1.RecordsList does not contain field %s", fd.FullName()))
|
||||
}
|
||||
}
|
||||
|
||||
// Mutable returns a mutable reference to a composite type.
|
||||
//
|
||||
// If the field is unpopulated, it may allocate a composite value.
|
||||
// For a field belonging to a oneof, it implicitly clears any other field
|
||||
// that may be currently set within the same oneof.
|
||||
// For extension fields, it implicitly stores the provided ExtensionType
|
||||
// if not already stored.
|
||||
// It panics if the field does not contain a composite type.
|
||||
//
|
||||
// Mutable is a mutating operation and unsafe for concurrent use.
|
||||
func (x *fastReflection_RecordsList) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
||||
switch fd.FullName() {
|
||||
case "cerc.registry.v1.RecordsList.value":
|
||||
if x.Value == nil {
|
||||
x.Value = []string{}
|
||||
}
|
||||
value := &_RecordsList_1_list{list: &x.Value}
|
||||
return protoreflect.ValueOfList(value)
|
||||
default:
|
||||
if fd.IsExtension() {
|
||||
panic(fmt.Errorf("proto3 declared messages do not support extensions: cerc.registry.v1.RecordsList"))
|
||||
}
|
||||
panic(fmt.Errorf("message cerc.registry.v1.RecordsList does not contain field %s", fd.FullName()))
|
||||
}
|
||||
}
|
||||
|
||||
// NewField returns a new value that is assignable to the field
|
||||
// for the given descriptor. For scalars, this returns the default value.
|
||||
// For lists, maps, and messages, this returns a new, empty, mutable value.
|
||||
func (x *fastReflection_RecordsList) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
||||
switch fd.FullName() {
|
||||
case "cerc.registry.v1.RecordsList.value":
|
||||
list := []string{}
|
||||
return protoreflect.ValueOfList(&_RecordsList_1_list{list: &list})
|
||||
default:
|
||||
if fd.IsExtension() {
|
||||
panic(fmt.Errorf("proto3 declared messages do not support extensions: cerc.registry.v1.RecordsList"))
|
||||
}
|
||||
panic(fmt.Errorf("message cerc.registry.v1.RecordsList does not contain field %s", fd.FullName()))
|
||||
}
|
||||
}
|
||||
|
||||
// WhichOneof reports which field within the oneof is populated,
|
||||
// returning nil if none are populated.
|
||||
// It panics if the oneof descriptor does not belong to this message.
|
||||
func (x *fastReflection_RecordsList) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
|
||||
switch d.FullName() {
|
||||
default:
|
||||
panic(fmt.Errorf("%s is not a oneof field in cerc.registry.v1.RecordsList", d.FullName()))
|
||||
}
|
||||
panic("unreachable")
|
||||
}
|
||||
|
||||
// GetUnknown retrieves the entire list of unknown fields.
|
||||
// The caller may only mutate the contents of the RawFields
|
||||
// if the mutated bytes are stored back into the message with SetUnknown.
|
||||
func (x *fastReflection_RecordsList) GetUnknown() protoreflect.RawFields {
|
||||
return x.unknownFields
|
||||
}
|
||||
|
||||
// SetUnknown stores an entire list of unknown fields.
|
||||
// The raw fields must be syntactically valid according to the wire format.
|
||||
// An implementation may panic if this is not the case.
|
||||
// Once stored, the caller must not mutate the content of the RawFields.
|
||||
// An empty RawFields may be passed to clear the fields.
|
||||
//
|
||||
// SetUnknown is a mutating operation and unsafe for concurrent use.
|
||||
func (x *fastReflection_RecordsList) SetUnknown(fields protoreflect.RawFields) {
|
||||
x.unknownFields = fields
|
||||
}
|
||||
|
||||
// IsValid reports whether the message is valid.
|
||||
//
|
||||
// An invalid message is an empty, read-only value.
|
||||
//
|
||||
// An invalid message often corresponds to a nil pointer of the concrete
|
||||
// message type, but the details are implementation dependent.
|
||||
// Validity is not part of the protobuf data model, and may not
|
||||
// be preserved in marshaling or other operations.
|
||||
func (x *fastReflection_RecordsList) IsValid() bool {
|
||||
return x != nil
|
||||
}
|
||||
|
||||
// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations.
|
||||
// This method may return nil.
|
||||
//
|
||||
// The returned methods type is identical to
|
||||
// "google.golang.org/protobuf/runtime/protoiface".Methods.
|
||||
// Consult the protoiface package documentation for details.
|
||||
func (x *fastReflection_RecordsList) ProtoMethods() *protoiface.Methods {
|
||||
size := func(input protoiface.SizeInput) protoiface.SizeOutput {
|
||||
x := input.Message.Interface().(*RecordsList)
|
||||
if x == nil {
|
||||
return protoiface.SizeOutput{
|
||||
NoUnkeyedLiterals: input.NoUnkeyedLiterals,
|
||||
Size: 0,
|
||||
}
|
||||
}
|
||||
options := runtime.SizeInputToOptions(input)
|
||||
_ = options
|
||||
var n int
|
||||
var l int
|
||||
_ = l
|
||||
if len(x.Value) > 0 {
|
||||
for _, s := range x.Value {
|
||||
l = len(s)
|
||||
n += 1 + l + runtime.Sov(uint64(l))
|
||||
}
|
||||
}
|
||||
if x.unknownFields != nil {
|
||||
n += len(x.unknownFields)
|
||||
}
|
||||
return protoiface.SizeOutput{
|
||||
NoUnkeyedLiterals: input.NoUnkeyedLiterals,
|
||||
Size: n,
|
||||
}
|
||||
}
|
||||
|
||||
marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) {
|
||||
x := input.Message.Interface().(*RecordsList)
|
||||
if x == nil {
|
||||
return protoiface.MarshalOutput{
|
||||
NoUnkeyedLiterals: input.NoUnkeyedLiterals,
|
||||
Buf: input.Buf,
|
||||
}, nil
|
||||
}
|
||||
options := runtime.MarshalInputToOptions(input)
|
||||
_ = options
|
||||
size := options.Size(x)
|
||||
dAtA := make([]byte, size)
|
||||
i := len(dAtA)
|
||||
_ = i
|
||||
var l int
|
||||
_ = l
|
||||
if x.unknownFields != nil {
|
||||
i -= len(x.unknownFields)
|
||||
copy(dAtA[i:], x.unknownFields)
|
||||
}
|
||||
if len(x.Value) > 0 {
|
||||
for iNdEx := len(x.Value) - 1; iNdEx >= 0; iNdEx-- {
|
||||
i -= len(x.Value[iNdEx])
|
||||
copy(dAtA[i:], x.Value[iNdEx])
|
||||
i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Value[iNdEx])))
|
||||
i--
|
||||
dAtA[i] = 0xa
|
||||
}
|
||||
}
|
||||
if input.Buf != nil {
|
||||
input.Buf = append(input.Buf, dAtA...)
|
||||
} else {
|
||||
input.Buf = dAtA
|
||||
}
|
||||
return protoiface.MarshalOutput{
|
||||
NoUnkeyedLiterals: input.NoUnkeyedLiterals,
|
||||
Buf: input.Buf,
|
||||
}, nil
|
||||
}
|
||||
unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) {
|
||||
x := input.Message.Interface().(*RecordsList)
|
||||
if x == nil {
|
||||
return protoiface.UnmarshalOutput{
|
||||
NoUnkeyedLiterals: input.NoUnkeyedLiterals,
|
||||
Flags: input.Flags,
|
||||
}, nil
|
||||
}
|
||||
options := runtime.UnmarshalInputToOptions(input)
|
||||
_ = options
|
||||
dAtA := input.Buf
|
||||
l := len(dAtA)
|
||||
iNdEx := 0
|
||||
for iNdEx < l {
|
||||
preIndex := iNdEx
|
||||
var wire uint64
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
if shift >= 64 {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
|
||||
}
|
||||
if iNdEx >= l {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
|
||||
}
|
||||
b := dAtA[iNdEx]
|
||||
iNdEx++
|
||||
wire |= uint64(b&0x7F) << shift
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
fieldNum := int32(wire >> 3)
|
||||
wireType := int(wire & 0x7)
|
||||
if wireType == 4 {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: RecordsList: wiretype end group for non-group")
|
||||
}
|
||||
if fieldNum <= 0 {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: RecordsList: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||
}
|
||||
switch fieldNum {
|
||||
case 1:
|
||||
if wireType != 2 {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
|
||||
}
|
||||
var stringLen uint64
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
if shift >= 64 {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
|
||||
}
|
||||
if iNdEx >= l {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
|
||||
}
|
||||
b := dAtA[iNdEx]
|
||||
iNdEx++
|
||||
stringLen |= uint64(b&0x7F) << shift
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
intStringLen := int(stringLen)
|
||||
if intStringLen < 0 {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
|
||||
}
|
||||
postIndex := iNdEx + intStringLen
|
||||
if postIndex < 0 {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
|
||||
}
|
||||
if postIndex > l {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
|
||||
}
|
||||
x.Value = append(x.Value, string(dAtA[iNdEx:postIndex]))
|
||||
iNdEx = postIndex
|
||||
default:
|
||||
iNdEx = preIndex
|
||||
skippy, err := runtime.Skip(dAtA[iNdEx:])
|
||||
if err != nil {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err
|
||||
}
|
||||
if (skippy < 0) || (iNdEx+skippy) < 0 {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
|
||||
}
|
||||
if (iNdEx + skippy) > l {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
|
||||
}
|
||||
if !options.DiscardUnknown {
|
||||
x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
|
||||
}
|
||||
iNdEx += skippy
|
||||
}
|
||||
}
|
||||
|
||||
if iNdEx > l {
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
|
||||
}
|
||||
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil
|
||||
}
|
||||
return &protoiface.Methods{
|
||||
NoUnkeyedLiterals: struct{}{},
|
||||
Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown,
|
||||
Size: size,
|
||||
Marshal: marshal,
|
||||
Unmarshal: unmarshal,
|
||||
Merge: nil,
|
||||
CheckInitialized: nil,
|
||||
}
|
||||
}
|
||||
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.27.0
|
||||
@ -6712,6 +7192,43 @@ func (x *ExpiryQueue) GetValue() []string {
|
||||
return nil
|
||||
}
|
||||
|
||||
// List of record ids
|
||||
// Value type to be used in AttributesMap
|
||||
type RecordsList struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Value []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
|
||||
}
|
||||
|
||||
func (x *RecordsList) Reset() {
|
||||
*x = RecordsList{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_cerc_registry_v1_registry_proto_msgTypes[9]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *RecordsList) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*RecordsList) ProtoMessage() {}
|
||||
|
||||
// Deprecated: Use RecordsList.ProtoReflect.Descriptor instead.
|
||||
func (*RecordsList) Descriptor() ([]byte, []int) {
|
||||
return file_cerc_registry_v1_registry_proto_rawDescGZIP(), []int{9}
|
||||
}
|
||||
|
||||
func (x *RecordsList) GetValue() []string {
|
||||
if x != nil {
|
||||
return x.Value
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var File_cerc_registry_v1_registry_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_cerc_registry_v1_registry_proto_rawDesc = []byte{
|
||||
@ -6932,20 +7449,23 @@ var file_cerc_registry_v1_registry_proto_rawDesc = []byte{
|
||||
0x22, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, 0x33, 0x0a, 0x0b, 0x45, 0x78, 0x70,
|
||||
0x69, 0x72, 0x79, 0x51, 0x75, 0x65, 0x75, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
|
||||
0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0xc5,
|
||||
0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x65, 0x72, 0x63, 0x2e, 0x72, 0x65, 0x67, 0x69,
|
||||
0x73, 0x74, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,
|
||||
0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x2e, 0x76, 0x64,
|
||||
0x62, 0x2e, 0x74, 0x6f, 0x2f, 0x63, 0x65, 0x72, 0x63, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x63,
|
||||
0x6f, 0x6e, 0x69, 0x63, 0x32, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x65, 0x72, 0x63, 0x2f,
|
||||
0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x65, 0x67, 0x69,
|
||||
0x73, 0x74, 0x72, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x52, 0x58, 0xaa, 0x02, 0x10, 0x43,
|
||||
0x65, 0x72, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x56, 0x31, 0xca,
|
||||
0x02, 0x10, 0x43, 0x65, 0x72, 0x63, 0x5c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5c,
|
||||
0x56, 0x31, 0xe2, 0x02, 0x1c, 0x43, 0x65, 0x72, 0x63, 0x5c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
|
||||
0x72, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
|
||||
0x61, 0xea, 0x02, 0x12, 0x43, 0x65, 0x72, 0x63, 0x3a, 0x3a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
|
||||
0x72, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23,
|
||||
0x0a, 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a,
|
||||
0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61,
|
||||
0x6c, 0x75, 0x65, 0x42, 0xc5, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x65, 0x72, 0x63,
|
||||
0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x52, 0x65,
|
||||
0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3c, 0x67,
|
||||
0x69, 0x74, 0x2e, 0x76, 0x64, 0x62, 0x2e, 0x74, 0x6f, 0x2f, 0x63, 0x65, 0x72, 0x63, 0x2d, 0x69,
|
||||
0x6f, 0x2f, 0x6c, 0x61, 0x63, 0x6f, 0x6e, 0x69, 0x63, 0x32, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f,
|
||||
0x63, 0x65, 0x72, 0x63, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2f, 0x76, 0x31,
|
||||
0x3b, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x52,
|
||||
0x58, 0xaa, 0x02, 0x10, 0x43, 0x65, 0x72, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,
|
||||
0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x43, 0x65, 0x72, 0x63, 0x5c, 0x52, 0x65, 0x67, 0x69,
|
||||
0x73, 0x74, 0x72, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x43, 0x65, 0x72, 0x63, 0x5c, 0x52,
|
||||
0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65,
|
||||
0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x43, 0x65, 0x72, 0x63, 0x3a, 0x3a, 0x52,
|
||||
0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f,
|
||||
0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
@ -6960,7 +7480,7 @@ func file_cerc_registry_v1_registry_proto_rawDescGZIP() []byte {
|
||||
return file_cerc_registry_v1_registry_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_cerc_registry_v1_registry_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
|
||||
var file_cerc_registry_v1_registry_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
|
||||
var file_cerc_registry_v1_registry_proto_goTypes = []interface{}{
|
||||
(*Params)(nil), // 0: cerc.registry.v1.Params
|
||||
(*Record)(nil), // 1: cerc.registry.v1.Record
|
||||
@ -6971,23 +7491,24 @@ var file_cerc_registry_v1_registry_proto_goTypes = []interface{}{
|
||||
(*NameRecordEntry)(nil), // 6: cerc.registry.v1.NameRecordEntry
|
||||
(*Signature)(nil), // 7: cerc.registry.v1.Signature
|
||||
(*ExpiryQueue)(nil), // 8: cerc.registry.v1.ExpiryQueue
|
||||
(*v1beta1.Coin)(nil), // 9: cosmos.base.v1beta1.Coin
|
||||
(*durationpb.Duration)(nil), // 10: google.protobuf.Duration
|
||||
(*timestamppb.Timestamp)(nil), // 11: google.protobuf.Timestamp
|
||||
(*RecordsList)(nil), // 9: cerc.registry.v1.RecordsList
|
||||
(*v1beta1.Coin)(nil), // 10: cosmos.base.v1beta1.Coin
|
||||
(*durationpb.Duration)(nil), // 11: google.protobuf.Duration
|
||||
(*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp
|
||||
}
|
||||
var file_cerc_registry_v1_registry_proto_depIdxs = []int32{
|
||||
9, // 0: cerc.registry.v1.Params.record_rent:type_name -> cosmos.base.v1beta1.Coin
|
||||
10, // 1: cerc.registry.v1.Params.record_rent_duration:type_name -> google.protobuf.Duration
|
||||
9, // 2: cerc.registry.v1.Params.authority_rent:type_name -> cosmos.base.v1beta1.Coin
|
||||
10, // 3: cerc.registry.v1.Params.authority_rent_duration:type_name -> google.protobuf.Duration
|
||||
10, // 4: cerc.registry.v1.Params.authority_grace_period:type_name -> google.protobuf.Duration
|
||||
10, // 5: cerc.registry.v1.Params.authority_auction_commits_duration:type_name -> google.protobuf.Duration
|
||||
10, // 6: cerc.registry.v1.Params.authority_auction_reveals_duration:type_name -> google.protobuf.Duration
|
||||
9, // 7: cerc.registry.v1.Params.authority_auction_commit_fee:type_name -> cosmos.base.v1beta1.Coin
|
||||
9, // 8: cerc.registry.v1.Params.authority_auction_reveal_fee:type_name -> cosmos.base.v1beta1.Coin
|
||||
9, // 9: cerc.registry.v1.Params.authority_auction_minimum_bid:type_name -> cosmos.base.v1beta1.Coin
|
||||
10, // 0: cerc.registry.v1.Params.record_rent:type_name -> cosmos.base.v1beta1.Coin
|
||||
11, // 1: cerc.registry.v1.Params.record_rent_duration:type_name -> google.protobuf.Duration
|
||||
10, // 2: cerc.registry.v1.Params.authority_rent:type_name -> cosmos.base.v1beta1.Coin
|
||||
11, // 3: cerc.registry.v1.Params.authority_rent_duration:type_name -> google.protobuf.Duration
|
||||
11, // 4: cerc.registry.v1.Params.authority_grace_period:type_name -> google.protobuf.Duration
|
||||
11, // 5: cerc.registry.v1.Params.authority_auction_commits_duration:type_name -> google.protobuf.Duration
|
||||
11, // 6: cerc.registry.v1.Params.authority_auction_reveals_duration:type_name -> google.protobuf.Duration
|
||||
10, // 7: cerc.registry.v1.Params.authority_auction_commit_fee:type_name -> cosmos.base.v1beta1.Coin
|
||||
10, // 8: cerc.registry.v1.Params.authority_auction_reveal_fee:type_name -> cosmos.base.v1beta1.Coin
|
||||
10, // 9: cerc.registry.v1.Params.authority_auction_minimum_bid:type_name -> cosmos.base.v1beta1.Coin
|
||||
3, // 10: cerc.registry.v1.AuthorityEntry.entry:type_name -> cerc.registry.v1.NameAuthority
|
||||
11, // 11: cerc.registry.v1.NameAuthority.expiry_time:type_name -> google.protobuf.Timestamp
|
||||
12, // 11: cerc.registry.v1.NameAuthority.expiry_time:type_name -> google.protobuf.Timestamp
|
||||
5, // 12: cerc.registry.v1.NameEntry.entry:type_name -> cerc.registry.v1.NameRecord
|
||||
6, // 13: cerc.registry.v1.NameRecord.latest:type_name -> cerc.registry.v1.NameRecordEntry
|
||||
6, // 14: cerc.registry.v1.NameRecord.history:type_name -> cerc.registry.v1.NameRecordEntry
|
||||
@ -7112,6 +7633,18 @@ func file_cerc_registry_v1_registry_proto_init() {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_cerc_registry_v1_registry_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*RecordsList); 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{
|
||||
@ -7119,7 +7652,7 @@ func file_cerc_registry_v1_registry_proto_init() {
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_cerc_registry_v1_registry_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 9,
|
||||
NumMessages: 10,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
|
@ -79,7 +79,6 @@ type LaconicApp struct {
|
||||
AuctionKeeper *auctionkeeper.Keeper // (Use * as per ProvideModule implementation)
|
||||
BondKeeper *bondkeeper.Keeper
|
||||
RegistryKeeper registrykeeper.Keeper
|
||||
// RegistryRecordKeeper registrykeeper.RecordKeeper
|
||||
|
||||
// simulation manager
|
||||
sm *module.SimulationManager
|
||||
@ -141,7 +140,6 @@ func NewLaconicApp(
|
||||
&app.ConsensusParamsKeeper,
|
||||
&app.AuctionKeeper,
|
||||
&app.BondKeeper,
|
||||
// &app.RegistryRecordKeeper,
|
||||
&app.RegistryKeeper,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
|
@ -106,7 +106,7 @@ func NewRootCmd() *cobra.Command {
|
||||
// overwrite the block timeout
|
||||
cmtCfg := cmtcfg.DefaultConfig()
|
||||
cmtCfg.Consensus.TimeoutCommit = 3 * time.Second
|
||||
cmtCfg.LogLevel = "*:error,p2p:info,state:info" // better default logging
|
||||
cmtCfg.LogLevel = "*:error,p2p:info,state:info,auction:info,bond:info,registry:info" // better default logging
|
||||
|
||||
return server.InterceptConfigsPreRunHandler(cmd, serverconfig.DefaultConfigTemplate, srvCfg, cmtCfg)
|
||||
},
|
||||
|
2
go.mod
2
go.mod
@ -37,6 +37,7 @@ require (
|
||||
github.com/ipld/go-ipld-prime v0.21.0
|
||||
github.com/spf13/cobra v1.8.0
|
||||
github.com/spf13/viper v1.17.0
|
||||
github.com/stretchr/testify v1.8.4
|
||||
golang.org/x/exp v0.0.0-20231006140011-7918f672742d
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f
|
||||
google.golang.org/grpc v1.60.1
|
||||
@ -160,7 +161,6 @@ require (
|
||||
github.com/spf13/afero v1.10.0 // indirect
|
||||
github.com/spf13/cast v1.5.1 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/stretchr/testify v1.8.4 // indirect
|
||||
github.com/subosito/gotenv v1.6.0 // indirect
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
|
||||
github.com/tendermint/go-amino v0.16.0 // indirect
|
||||
|
@ -138,3 +138,9 @@ message ExpiryQueue {
|
||||
string id = 1;
|
||||
repeated string value = 2;
|
||||
}
|
||||
|
||||
// List of record ids
|
||||
// Value type to be used in AttributesMap
|
||||
message RecordsList {
|
||||
repeated string value = 1;
|
||||
}
|
||||
|
@ -3,7 +3,6 @@
|
||||
rm -r ~/.laconic2d || true
|
||||
LACONIC2D_BIN=$(which laconic2d)
|
||||
# configure laconic2d
|
||||
$LACONIC2D_BIN config set config log_level "*:error,p2p:info,state:info,auction:info,bond:info,registry:info" --skip-validate
|
||||
$LACONIC2D_BIN config set client chain-id demo
|
||||
$LACONIC2D_BIN config set client keyring-backend test
|
||||
$LACONIC2D_BIN keys add alice
|
||||
|
2
tests/Makefile
Normal file
2
tests/Makefile
Normal file
@ -0,0 +1,2 @@
|
||||
test-integration:
|
||||
go test -mod=readonly ./integration/... -test.v -timeout 10m
|
30
tests/integration/auction/keeper/common_test.go
Normal file
30
tests/integration/auction/keeper/common_test.go
Normal file
@ -0,0 +1,30 @@
|
||||
package keeper_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
integrationTest "git.vdb.to/cerc-io/laconic2d/tests/integration"
|
||||
types "git.vdb.to/cerc-io/laconic2d/x/auction"
|
||||
)
|
||||
|
||||
type KeeperTestSuite struct {
|
||||
suite.Suite
|
||||
integrationTest.TestFixture
|
||||
|
||||
queryClient types.QueryClient
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) SetupTest() {
|
||||
err := kts.TestFixture.Setup()
|
||||
assert.Nil(kts.T(), err)
|
||||
|
||||
qr := kts.App.QueryHelper()
|
||||
kts.queryClient = types.NewQueryClient(qr)
|
||||
}
|
||||
|
||||
func TestAuctionKeeperTestSuite(t *testing.T) {
|
||||
suite.Run(t, new(KeeperTestSuite))
|
||||
}
|
349
tests/integration/auction/keeper/query_server_test.go
Normal file
349
tests/integration/auction/keeper/query_server_test.go
Normal file
@ -0,0 +1,349 @@
|
||||
package keeper_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"cosmossdk.io/math"
|
||||
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
|
||||
|
||||
integrationTest "git.vdb.to/cerc-io/laconic2d/tests/integration"
|
||||
types "git.vdb.to/cerc-io/laconic2d/x/auction"
|
||||
)
|
||||
|
||||
const testCommitHash = "71D8CF34026E32A3A34C2C2D4ADF25ABC8D7943A4619761BE27F196603D91B9D"
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcQueryParams() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryParamsRequest
|
||||
}{
|
||||
{
|
||||
"fetch params",
|
||||
&types.QueryParamsRequest{},
|
||||
},
|
||||
}
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s", test.msg), func() {
|
||||
resp, err := kts.queryClient.Params(context.Background(), test.req)
|
||||
kts.Require().Nil(err)
|
||||
kts.Require().Equal(*(resp.Params), types.DefaultParams())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcGetAuction() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryAuctionRequest
|
||||
createAuction bool
|
||||
}{
|
||||
{
|
||||
"fetch auction with empty auction ID",
|
||||
&types.QueryAuctionRequest{},
|
||||
false,
|
||||
},
|
||||
{
|
||||
"fetch auction with valid auction ID",
|
||||
&types.QueryAuctionRequest{},
|
||||
true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s", test.msg), func() {
|
||||
var expectedAuction types.Auction
|
||||
if test.createAuction {
|
||||
auction, _, err := kts.createAuctionAndCommitBid(false)
|
||||
kts.Require().Nil(err)
|
||||
test.req.Id = auction.Id
|
||||
expectedAuction = *auction
|
||||
}
|
||||
|
||||
resp, err := kts.queryClient.GetAuction(context.Background(), test.req)
|
||||
if test.createAuction {
|
||||
kts.Require().Nil(err)
|
||||
kts.Require().NotNil(resp.GetAuction())
|
||||
kts.Require().EqualExportedValues(expectedAuction, *(resp.GetAuction()))
|
||||
} else {
|
||||
kts.Require().NotNil(err)
|
||||
kts.Require().Error(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcGetAllAuctions() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryAuctionsRequest
|
||||
createAuctions bool
|
||||
auctionCount int
|
||||
}{
|
||||
{
|
||||
"fetch auctions when no auctions exist",
|
||||
&types.QueryAuctionsRequest{},
|
||||
false,
|
||||
0,
|
||||
},
|
||||
|
||||
{
|
||||
"fetch auctions with one auction created",
|
||||
&types.QueryAuctionsRequest{},
|
||||
true,
|
||||
1,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s", test.msg), func() {
|
||||
if test.createAuctions {
|
||||
_, _, err := kts.createAuctionAndCommitBid(false)
|
||||
kts.Require().Nil(err)
|
||||
}
|
||||
|
||||
resp, _ := kts.queryClient.Auctions(context.Background(), test.req)
|
||||
kts.Require().Equal(test.auctionCount, len(resp.GetAuctions().Auctions))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcGetBids() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryBidsRequest
|
||||
createAuction bool
|
||||
commitBid bool
|
||||
bidCount int
|
||||
}{
|
||||
{
|
||||
"fetch all bids when no auction exists",
|
||||
&types.QueryBidsRequest{},
|
||||
false,
|
||||
false,
|
||||
0,
|
||||
},
|
||||
{
|
||||
"fetch all bids for valid auction but no added bids",
|
||||
&types.QueryBidsRequest{},
|
||||
true,
|
||||
false,
|
||||
0,
|
||||
},
|
||||
{
|
||||
"fetch all bids for valid auction and valid bid",
|
||||
&types.QueryBidsRequest{},
|
||||
true,
|
||||
true,
|
||||
1,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s", test.msg), func() {
|
||||
if test.createAuction {
|
||||
auction, _, err := kts.createAuctionAndCommitBid(test.commitBid)
|
||||
kts.Require().NoError(err)
|
||||
test.req.AuctionId = auction.Id
|
||||
}
|
||||
|
||||
resp, err := kts.queryClient.GetBids(context.Background(), test.req)
|
||||
if test.createAuction {
|
||||
kts.Require().Nil(err)
|
||||
kts.Require().Equal(test.bidCount, len(resp.GetBids()))
|
||||
} else {
|
||||
kts.Require().NotNil(err)
|
||||
kts.Require().Error(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcGetBid() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryBidRequest
|
||||
createAuctionAndBid bool
|
||||
}{
|
||||
{
|
||||
"fetch bid when bid does not exist",
|
||||
&types.QueryBidRequest{},
|
||||
false,
|
||||
},
|
||||
{
|
||||
"fetch bid when valid bid exists",
|
||||
&types.QueryBidRequest{},
|
||||
true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s", test.msg), func() {
|
||||
if test.createAuctionAndBid {
|
||||
auction, bid, err := kts.createAuctionAndCommitBid(test.createAuctionAndBid)
|
||||
kts.Require().NoError(err)
|
||||
test.req.AuctionId = auction.Id
|
||||
test.req.Bidder = bid.BidderAddress
|
||||
}
|
||||
|
||||
resp, err := kts.queryClient.GetBid(context.Background(), test.req)
|
||||
if test.createAuctionAndBid {
|
||||
kts.Require().NoError(err)
|
||||
kts.Require().NotNil(resp.Bid)
|
||||
kts.Require().Equal(test.req.Bidder, resp.Bid.BidderAddress)
|
||||
} else {
|
||||
kts.Require().NotNil(err)
|
||||
kts.Require().Error(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcGetAuctionsByBidder() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryAuctionsByBidderRequest
|
||||
createAuctionAndCommitBid bool
|
||||
auctionCount int
|
||||
}{
|
||||
{
|
||||
"get auctions by bidder with invalid bidder address",
|
||||
&types.QueryAuctionsByBidderRequest{},
|
||||
false,
|
||||
0,
|
||||
},
|
||||
{
|
||||
"get auctions by bidder with valid auction and bid",
|
||||
&types.QueryAuctionsByBidderRequest{},
|
||||
true,
|
||||
1,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s", test.msg), func() {
|
||||
if test.createAuctionAndCommitBid {
|
||||
_, bid, err := kts.createAuctionAndCommitBid(test.createAuctionAndCommitBid)
|
||||
kts.Require().NoError(err)
|
||||
test.req.BidderAddress = bid.BidderAddress
|
||||
}
|
||||
|
||||
resp, err := kts.queryClient.AuctionsByBidder(context.Background(), test.req)
|
||||
if test.createAuctionAndCommitBid {
|
||||
kts.Require().NoError(err)
|
||||
kts.Require().NotNil(resp.Auctions)
|
||||
kts.Require().Equal(test.auctionCount, len(resp.Auctions.Auctions))
|
||||
} else {
|
||||
kts.Require().NotNil(err)
|
||||
kts.Require().Error(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcGetAuctionsByOwner() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryAuctionsByOwnerRequest
|
||||
createAuction bool
|
||||
auctionCount int
|
||||
}{
|
||||
{
|
||||
"get auctions by owner with invalid owner address",
|
||||
&types.QueryAuctionsByOwnerRequest{},
|
||||
false,
|
||||
0,
|
||||
},
|
||||
{
|
||||
"get auctions by owner with valid auction",
|
||||
&types.QueryAuctionsByOwnerRequest{},
|
||||
true,
|
||||
1,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s", test.msg), func() {
|
||||
if test.createAuction {
|
||||
auction, _, err := kts.createAuctionAndCommitBid(false)
|
||||
kts.Require().NoError(err)
|
||||
test.req.OwnerAddress = auction.OwnerAddress
|
||||
}
|
||||
|
||||
resp, err := kts.queryClient.AuctionsByOwner(context.Background(), test.req)
|
||||
if test.createAuction {
|
||||
kts.Require().NoError(err)
|
||||
kts.Require().NotNil(resp.Auctions)
|
||||
kts.Require().Equal(test.auctionCount, len(resp.Auctions.Auctions))
|
||||
} else {
|
||||
kts.Require().NotNil(err)
|
||||
kts.Require().Error(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcQueryBalance() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryGetAuctionModuleBalanceRequest
|
||||
createAuction bool
|
||||
auctionCount int
|
||||
}{
|
||||
{
|
||||
"get balance with no auctions created",
|
||||
&types.QueryGetAuctionModuleBalanceRequest{},
|
||||
false,
|
||||
0,
|
||||
},
|
||||
{
|
||||
"get balance with single auction created",
|
||||
&types.QueryGetAuctionModuleBalanceRequest{},
|
||||
true,
|
||||
1,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
if test.createAuction {
|
||||
_, _, err := kts.createAuctionAndCommitBid(true)
|
||||
kts.Require().NoError(err)
|
||||
}
|
||||
|
||||
resp, err := kts.queryClient.GetAuctionModuleBalance(context.Background(), test.req)
|
||||
kts.Require().NoError(err)
|
||||
kts.Require().Equal(test.auctionCount, len(resp.GetBalance()))
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) createAuctionAndCommitBid(commitBid bool) (*types.Auction, *types.Bid, error) {
|
||||
ctx, k := kts.SdkCtx, kts.AuctionKeeper
|
||||
accCount := 1
|
||||
if commitBid {
|
||||
accCount++
|
||||
}
|
||||
|
||||
// Create funded account(s)
|
||||
accounts := simtestutil.AddTestAddrs(kts.BankKeeper, integrationTest.BondDenomProvider{}, ctx, accCount, math.NewInt(100))
|
||||
|
||||
params, err := k.GetParams(ctx)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
auction, err := k.CreateAuction(ctx, types.NewMsgCreateAuction(*params, accounts[0]))
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
if commitBid {
|
||||
bid, err := k.CommitBid(ctx, types.NewMsgCommitBid(auction.Id, testCommitHash, accounts[1]))
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
return auction, bid, nil
|
||||
}
|
||||
|
||||
return auction, nil, nil
|
||||
}
|
30
tests/integration/bond/keeper/common_test.go
Normal file
30
tests/integration/bond/keeper/common_test.go
Normal file
@ -0,0 +1,30 @@
|
||||
package keeper_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
integrationTest "git.vdb.to/cerc-io/laconic2d/tests/integration"
|
||||
types "git.vdb.to/cerc-io/laconic2d/x/bond"
|
||||
)
|
||||
|
||||
type KeeperTestSuite struct {
|
||||
suite.Suite
|
||||
integrationTest.TestFixture
|
||||
|
||||
queryClient types.QueryClient
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) SetupTest() {
|
||||
err := kts.TestFixture.Setup()
|
||||
assert.Nil(kts.T(), err)
|
||||
|
||||
qr := kts.App.QueryHelper()
|
||||
kts.queryClient = types.NewQueryClient(qr)
|
||||
}
|
||||
|
||||
func TestBondKeeperTestSuite(t *testing.T) {
|
||||
suite.Run(t, new(KeeperTestSuite))
|
||||
}
|
210
tests/integration/bond/keeper/query_server_test.go
Normal file
210
tests/integration/bond/keeper/query_server_test.go
Normal file
@ -0,0 +1,210 @@
|
||||
package keeper_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"cosmossdk.io/math"
|
||||
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
|
||||
integrationTest "git.vdb.to/cerc-io/laconic2d/tests/integration"
|
||||
types "git.vdb.to/cerc-io/laconic2d/x/bond"
|
||||
)
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcQueryParams() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryParamsRequest
|
||||
}{
|
||||
{
|
||||
"fetch params",
|
||||
&types.QueryParamsRequest{},
|
||||
},
|
||||
}
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s", test.msg), func() {
|
||||
resp, err := kts.queryClient.Params(context.Background(), test.req)
|
||||
kts.Require().Nil(err)
|
||||
kts.Require().Equal(*(resp.Params), types.DefaultParams())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcQueryBondsList() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryGetBondsRequest
|
||||
resp *types.QueryGetBondsResponse
|
||||
noOfBonds int
|
||||
createBonds bool
|
||||
}{
|
||||
{
|
||||
"empty request",
|
||||
&types.QueryGetBondsRequest{},
|
||||
&types.QueryGetBondsResponse{},
|
||||
0,
|
||||
false,
|
||||
},
|
||||
{
|
||||
"Get Bonds",
|
||||
&types.QueryGetBondsRequest{},
|
||||
&types.QueryGetBondsResponse{},
|
||||
1,
|
||||
true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s ", test.msg), func() {
|
||||
if test.createBonds {
|
||||
_, err := kts.createBond()
|
||||
kts.Require().NoError(err)
|
||||
}
|
||||
resp, _ := kts.queryClient.Bonds(context.Background(), test.req)
|
||||
kts.Require().Equal(test.noOfBonds, len(resp.GetBonds()))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcQueryBondByBondId() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryGetBondByIdRequest
|
||||
createBonds bool
|
||||
errResponse bool
|
||||
bondId string
|
||||
}{
|
||||
{
|
||||
"empty request",
|
||||
&types.QueryGetBondByIdRequest{},
|
||||
false,
|
||||
true,
|
||||
"",
|
||||
},
|
||||
{
|
||||
"Get Bond By ID",
|
||||
&types.QueryGetBondByIdRequest{},
|
||||
true,
|
||||
false,
|
||||
"",
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s ", test.msg), func() {
|
||||
if test.createBonds {
|
||||
bond, err := kts.createBond()
|
||||
kts.Require().NoError(err)
|
||||
test.req.Id = bond.Id
|
||||
}
|
||||
resp, err := kts.queryClient.GetBondById(context.Background(), test.req)
|
||||
if !test.errResponse {
|
||||
kts.Require().Nil(err)
|
||||
kts.Require().NotNil(resp.GetBond())
|
||||
kts.Require().Equal(test.req.Id, resp.GetBond().GetId())
|
||||
} else {
|
||||
kts.Require().NotNil(err)
|
||||
kts.Require().Error(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcGetBondsByOwner() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryGetBondsByOwnerRequest
|
||||
noOfBonds int
|
||||
createBonds bool
|
||||
errResponse bool
|
||||
bondId string
|
||||
}{
|
||||
{
|
||||
"empty request",
|
||||
&types.QueryGetBondsByOwnerRequest{},
|
||||
0,
|
||||
false,
|
||||
true,
|
||||
"",
|
||||
},
|
||||
{
|
||||
"Get Bond By Owner",
|
||||
&types.QueryGetBondsByOwnerRequest{},
|
||||
1,
|
||||
true,
|
||||
false,
|
||||
"",
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s ", test.msg), func() {
|
||||
if test.createBonds {
|
||||
bond, err := kts.createBond()
|
||||
kts.Require().NoError(err)
|
||||
test.req.Owner = bond.Owner
|
||||
}
|
||||
resp, err := kts.queryClient.GetBondsByOwner(context.Background(), test.req)
|
||||
if !test.errResponse {
|
||||
kts.Require().Nil(err)
|
||||
kts.Require().NotNil(resp.GetBonds())
|
||||
kts.Require().Equal(test.noOfBonds, len(resp.GetBonds()))
|
||||
} else {
|
||||
kts.Require().NotNil(err)
|
||||
kts.Require().Error(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcGetModuleBalance() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryGetBondModuleBalanceRequest
|
||||
noOfBonds int
|
||||
createBonds bool
|
||||
errResponse bool
|
||||
}{
|
||||
{
|
||||
"empty request",
|
||||
&types.QueryGetBondModuleBalanceRequest{},
|
||||
0,
|
||||
true,
|
||||
false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s ", test.msg), func() {
|
||||
if test.createBonds {
|
||||
_, err := kts.createBond()
|
||||
kts.Require().NoError(err)
|
||||
}
|
||||
resp, err := kts.queryClient.GetBondsModuleBalance(context.Background(), test.req)
|
||||
if !test.errResponse {
|
||||
kts.Require().Nil(err)
|
||||
kts.Require().NotNil(resp.GetBalance())
|
||||
kts.Require().Equal(resp.GetBalance(), sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(10))))
|
||||
} else {
|
||||
kts.Require().NotNil(err)
|
||||
kts.Require().Error(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) createBond() (*types.Bond, error) {
|
||||
ctx, k := kts.SdkCtx, kts.BondKeeper
|
||||
accCount := 1
|
||||
|
||||
// Create funded account(s)
|
||||
accounts := simtestutil.AddTestAddrs(kts.BankKeeper, integrationTest.BondDenomProvider{}, ctx, accCount, math.NewInt(1000))
|
||||
|
||||
bond, err := k.CreateBond(ctx, accounts[0], sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(10))))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return bond, nil
|
||||
}
|
157
tests/integration/common.go
Normal file
157
tests/integration/common.go
Normal file
@ -0,0 +1,157 @@
|
||||
package integration_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"cosmossdk.io/core/appmodule"
|
||||
"cosmossdk.io/log"
|
||||
storetypes "cosmossdk.io/store/types"
|
||||
cmtprototypes "github.com/cometbft/cometbft/proto/tendermint/types"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
addresscodec "github.com/cosmos/cosmos-sdk/codec/address"
|
||||
"github.com/cosmos/cosmos-sdk/runtime"
|
||||
"github.com/cosmos/cosmos-sdk/testutil/integration"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
|
||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
||||
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
||||
authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation"
|
||||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/bank"
|
||||
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
||||
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
|
||||
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
|
||||
|
||||
auctionTypes "git.vdb.to/cerc-io/laconic2d/x/auction"
|
||||
auctionkeeper "git.vdb.to/cerc-io/laconic2d/x/auction/keeper"
|
||||
auctionmodule "git.vdb.to/cerc-io/laconic2d/x/auction/module"
|
||||
bondTypes "git.vdb.to/cerc-io/laconic2d/x/bond"
|
||||
bondkeeper "git.vdb.to/cerc-io/laconic2d/x/bond/keeper"
|
||||
bondmodule "git.vdb.to/cerc-io/laconic2d/x/bond/module"
|
||||
registryTypes "git.vdb.to/cerc-io/laconic2d/x/registry"
|
||||
registrykeeper "git.vdb.to/cerc-io/laconic2d/x/registry/keeper"
|
||||
registrymodule "git.vdb.to/cerc-io/laconic2d/x/registry/module"
|
||||
)
|
||||
|
||||
type TestFixture struct {
|
||||
App *integration.App
|
||||
|
||||
SdkCtx sdk.Context
|
||||
cdc codec.Codec
|
||||
keys map[string]*storetypes.KVStoreKey
|
||||
|
||||
AccountKeeper authkeeper.AccountKeeper
|
||||
BankKeeper bankkeeper.Keeper
|
||||
|
||||
AuctionKeeper *auctionkeeper.Keeper
|
||||
BondKeeper *bondkeeper.Keeper
|
||||
RegistryKeeper registrykeeper.Keeper
|
||||
}
|
||||
|
||||
func (tf *TestFixture) Setup() error {
|
||||
keys := storetypes.NewKVStoreKeys(
|
||||
authtypes.StoreKey, banktypes.StoreKey, auctionTypes.StoreKey, bondTypes.StoreKey, registryTypes.StoreKey,
|
||||
)
|
||||
cdc := moduletestutil.MakeTestEncodingConfig(
|
||||
auth.AppModuleBasic{},
|
||||
auctionmodule.AppModule{},
|
||||
bondmodule.AppModule{},
|
||||
registrymodule.AppModule{},
|
||||
).Codec
|
||||
|
||||
logger := log.NewNopLogger() // Use log.NewTestLogger(kts.T()) for help with debugging
|
||||
cms := integration.CreateMultiStore(keys, logger)
|
||||
|
||||
newCtx := sdk.NewContext(cms, cmtprototypes.Header{}, true, logger)
|
||||
|
||||
authority := authtypes.NewModuleAddress("gov")
|
||||
|
||||
maccPerms := map[string][]string{
|
||||
minttypes.ModuleName: {authtypes.Minter},
|
||||
auctionTypes.ModuleName: {},
|
||||
auctionTypes.AuctionBurnModuleAccountName: {},
|
||||
bondTypes.ModuleName: {},
|
||||
registryTypes.ModuleName: {},
|
||||
registryTypes.RecordRentModuleAccountName: {},
|
||||
registryTypes.AuthorityRentModuleAccountName: {},
|
||||
}
|
||||
|
||||
accountKeeper := authkeeper.NewAccountKeeper(
|
||||
cdc,
|
||||
runtime.NewKVStoreService(keys[authtypes.StoreKey]),
|
||||
authtypes.ProtoBaseAccount,
|
||||
maccPerms,
|
||||
addresscodec.NewBech32Codec(sdk.Bech32MainPrefix),
|
||||
sdk.Bech32MainPrefix,
|
||||
authority.String(),
|
||||
)
|
||||
|
||||
blockedAddresses := map[string]bool{
|
||||
accountKeeper.GetAuthority(): false,
|
||||
}
|
||||
bankKeeper := bankkeeper.NewBaseKeeper(
|
||||
cdc,
|
||||
runtime.NewKVStoreService(keys[banktypes.StoreKey]),
|
||||
accountKeeper,
|
||||
blockedAddresses,
|
||||
authority.String(),
|
||||
log.NewNopLogger(),
|
||||
)
|
||||
|
||||
auctionKeeper := auctionkeeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[auctionTypes.StoreKey]), accountKeeper, bankKeeper)
|
||||
|
||||
bondKeeper := bondkeeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[bondTypes.StoreKey]), accountKeeper, bankKeeper)
|
||||
|
||||
registryKeeper := registrykeeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[registryTypes.StoreKey]), accountKeeper, bankKeeper, bondKeeper, auctionKeeper)
|
||||
|
||||
authModule := auth.NewAppModule(cdc, accountKeeper, authsims.RandomGenesisAccounts, nil)
|
||||
bankModule := bank.NewAppModule(cdc, bankKeeper, accountKeeper, nil)
|
||||
auctionModule := auctionmodule.NewAppModule(cdc, auctionKeeper)
|
||||
bondModule := bondmodule.NewAppModule(cdc, bondKeeper)
|
||||
registryModule := registrymodule.NewAppModule(cdc, registryKeeper)
|
||||
|
||||
integrationApp := integration.NewIntegrationApp(newCtx, logger, keys, cdc, map[string]appmodule.AppModule{
|
||||
authtypes.ModuleName: authModule,
|
||||
banktypes.ModuleName: bankModule,
|
||||
auctionTypes.ModuleName: auctionModule,
|
||||
bondTypes.ModuleName: bondModule,
|
||||
registryTypes.ModuleName: registryModule,
|
||||
})
|
||||
|
||||
sdkCtx := sdk.UnwrapSDKContext(integrationApp.Context())
|
||||
|
||||
// Register MsgServer and QueryServer
|
||||
auctionTypes.RegisterMsgServer(integrationApp.MsgServiceRouter(), auctionkeeper.NewMsgServerImpl(auctionKeeper))
|
||||
auctionTypes.RegisterQueryServer(integrationApp.QueryHelper(), auctionkeeper.NewQueryServerImpl(auctionKeeper))
|
||||
|
||||
bondTypes.RegisterMsgServer(integrationApp.MsgServiceRouter(), bondkeeper.NewMsgServerImpl(bondKeeper))
|
||||
bondTypes.RegisterQueryServer(integrationApp.QueryHelper(), bondkeeper.NewQueryServerImpl(bondKeeper))
|
||||
|
||||
registryTypes.RegisterMsgServer(integrationApp.MsgServiceRouter(), registrykeeper.NewMsgServerImpl(registryKeeper))
|
||||
registryTypes.RegisterQueryServer(integrationApp.QueryHelper(), registrykeeper.NewQueryServerImpl(registryKeeper))
|
||||
|
||||
// set default params
|
||||
if err := auctionKeeper.Params.Set(sdkCtx, auctionTypes.DefaultParams()); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := bondKeeper.Params.Set(sdkCtx, bondTypes.DefaultParams()); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := registryKeeper.Params.Set(sdkCtx, registryTypes.DefaultParams()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
tf.App = integrationApp
|
||||
tf.SdkCtx, tf.cdc, tf.keys = sdkCtx, cdc, keys
|
||||
tf.AccountKeeper, tf.BankKeeper = accountKeeper, bankKeeper
|
||||
tf.AuctionKeeper, tf.BondKeeper, tf.RegistryKeeper = auctionKeeper, bondKeeper, registryKeeper
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
type BondDenomProvider struct{}
|
||||
|
||||
func (bdp BondDenomProvider) BondDenom(ctx context.Context) (string, error) {
|
||||
return sdk.DefaultBondDenom, nil
|
||||
}
|
7
tests/integration/data/examples/example1.yml
Normal file
7
tests/integration/data/examples/example1.yml
Normal file
@ -0,0 +1,7 @@
|
||||
record:
|
||||
attr1: value1
|
||||
attr2: value2
|
||||
link1:
|
||||
/: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D
|
||||
link2:
|
||||
/: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
|
@ -0,0 +1,7 @@
|
||||
record:
|
||||
type: GeneralRecord
|
||||
name: foo
|
||||
version: 1.0.0
|
||||
tags:
|
||||
- tagA
|
||||
- tagB
|
13
tests/integration/data/examples/service_provider_example.yml
Normal file
13
tests/integration/data/examples/service_provider_example.yml
Normal file
@ -0,0 +1,13 @@
|
||||
|
||||
record:
|
||||
type: ServiceProviderRegistration
|
||||
bond_id: madeUpBondID
|
||||
laconic_id: madeUpLaconicID
|
||||
version: 1.0.0
|
||||
x500:
|
||||
common_name: cerc-io
|
||||
organization_unit: xyz
|
||||
organization_name: abc
|
||||
state_name: california
|
||||
country: US
|
||||
locality_name: local
|
@ -0,0 +1,7 @@
|
||||
record:
|
||||
type: WebsiteRegistrationRecord
|
||||
url: https://cerc.io
|
||||
repo_registration_record_cid: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D
|
||||
build_artifact_cid: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
|
||||
tls_cerc_cid: QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR
|
||||
version: 1.0.0
|
59
tests/integration/registry/keeper/common_test.go
Normal file
59
tests/integration/registry/keeper/common_test.go
Normal file
@ -0,0 +1,59 @@
|
||||
package keeper_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"cosmossdk.io/math"
|
||||
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
integrationTest "git.vdb.to/cerc-io/laconic2d/tests/integration"
|
||||
bondTypes "git.vdb.to/cerc-io/laconic2d/x/bond"
|
||||
types "git.vdb.to/cerc-io/laconic2d/x/registry"
|
||||
)
|
||||
|
||||
type KeeperTestSuite struct {
|
||||
suite.Suite
|
||||
integrationTest.TestFixture
|
||||
|
||||
queryClient types.QueryClient
|
||||
|
||||
accounts []sdk.AccAddress
|
||||
bond bondTypes.Bond
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) SetupTest() {
|
||||
kts.TestFixture.Setup()
|
||||
|
||||
// set default params
|
||||
err := kts.RegistryKeeper.Params.Set(kts.SdkCtx, types.DefaultParams())
|
||||
assert.Nil(kts.T(), err)
|
||||
|
||||
qr := kts.App.QueryHelper()
|
||||
kts.queryClient = types.NewQueryClient(qr)
|
||||
|
||||
// Create a bond
|
||||
bond, err := kts.createBond()
|
||||
assert.Nil(kts.T(), err)
|
||||
kts.bond = *bond
|
||||
}
|
||||
|
||||
func TestRegistryKeeperTestSuite(t *testing.T) {
|
||||
suite.Run(t, new(KeeperTestSuite))
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) createBond() (*bondTypes.Bond, error) {
|
||||
ctx := kts.SdkCtx
|
||||
|
||||
// Create a funded account
|
||||
kts.accounts = simtestutil.AddTestAddrs(kts.BankKeeper, integrationTest.BondDenomProvider{}, ctx, 1, math.NewInt(100000000000))
|
||||
|
||||
bond, err := kts.BondKeeper.CreateBond(ctx, kts.accounts[0], sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(1000000000))))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return bond, nil
|
||||
}
|
421
tests/integration/registry/keeper/query_server_test.go
Normal file
421
tests/integration/registry/keeper/query_server_test.go
Normal file
@ -0,0 +1,421 @@
|
||||
package keeper_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
|
||||
types "git.vdb.to/cerc-io/laconic2d/x/registry"
|
||||
"git.vdb.to/cerc-io/laconic2d/x/registry/client/cli"
|
||||
"git.vdb.to/cerc-io/laconic2d/x/registry/helpers"
|
||||
registryKeeper "git.vdb.to/cerc-io/laconic2d/x/registry/keeper"
|
||||
)
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcQueryParams() {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryParamsRequest
|
||||
}{
|
||||
{
|
||||
"Get Params",
|
||||
&types.QueryParamsRequest{},
|
||||
},
|
||||
}
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s ", test.msg), func() {
|
||||
resp, _ := kts.queryClient.Params(context.Background(), test.req)
|
||||
defaultParams := types.DefaultParams()
|
||||
kts.Require().Equal(defaultParams.String(), resp.GetParams().String())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcGetRecordLists() {
|
||||
ctx, queryClient := kts.SdkCtx, kts.queryClient
|
||||
sr := kts.Require()
|
||||
|
||||
var recordId string
|
||||
examples := []string{
|
||||
"../../data/examples/service_provider_example.yml",
|
||||
"../../data/examples/website_registration_example.yml",
|
||||
"../../data/examples/general_record_example.yml",
|
||||
}
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryRecordsRequest
|
||||
createRecords bool
|
||||
expErr bool
|
||||
noOfRecords int
|
||||
}{
|
||||
{
|
||||
"Empty Records",
|
||||
&types.QueryRecordsRequest{},
|
||||
false,
|
||||
false,
|
||||
0,
|
||||
},
|
||||
{
|
||||
"List Records",
|
||||
&types.QueryRecordsRequest{},
|
||||
true,
|
||||
false,
|
||||
3,
|
||||
},
|
||||
{
|
||||
"Filter with type",
|
||||
&types.QueryRecordsRequest{
|
||||
Attributes: []*types.QueryRecordsRequest_KeyValueInput{
|
||||
{
|
||||
Key: "type",
|
||||
Value: &types.QueryRecordsRequest_ValueInput{
|
||||
Value: &types.QueryRecordsRequest_ValueInput_String_{String_: "WebsiteRegistrationRecord"},
|
||||
},
|
||||
},
|
||||
},
|
||||
All: true,
|
||||
},
|
||||
true,
|
||||
false,
|
||||
1,
|
||||
},
|
||||
// Skip the following test as querying with recursive values not supported (PR https://git.vdb.to/cerc-io/laconicd/pulls/112)
|
||||
// See function RecordsFromAttributes (QueryValueToJSON call) in the registry keeper implementation (x/registry/keeper/keeper.go)
|
||||
// {
|
||||
// "Filter with tag (extant) (https://git.vdb.to/cerc-io/laconicd/issues/129)",
|
||||
// &types.QueryRecordsRequest{
|
||||
// Attributes: []*types.QueryRecordsRequest_KeyValueInput{
|
||||
// {
|
||||
// Key: "tags",
|
||||
// // Value: &types.QueryRecordsRequest_ValueInput{
|
||||
// // Value: &types.QueryRecordsRequest_ValueInput_String_{"tagA"},
|
||||
// // },
|
||||
// Value: &types.QueryRecordsRequest_ValueInput{
|
||||
// Value: &types.QueryRecordsRequest_ValueInput_Array{Array: &types.QueryRecordsRequest_ArrayInput{
|
||||
// Values: []*types.QueryRecordsRequest_ValueInput{
|
||||
// {
|
||||
// Value: &types.QueryRecordsRequest_ValueInput_String_{"tagA"},
|
||||
// },
|
||||
// },
|
||||
// }},
|
||||
// },
|
||||
// // Throws: "Recursive query values are not supported"
|
||||
// },
|
||||
// },
|
||||
// All: true,
|
||||
// },
|
||||
// true,
|
||||
// false,
|
||||
// 1,
|
||||
// },
|
||||
{
|
||||
"Filter with tag (non-existent) (https://git.vdb.to/cerc-io/laconicd/issues/129)",
|
||||
&types.QueryRecordsRequest{
|
||||
Attributes: []*types.QueryRecordsRequest_KeyValueInput{
|
||||
{
|
||||
Key: "tags",
|
||||
Value: &types.QueryRecordsRequest_ValueInput{
|
||||
Value: &types.QueryRecordsRequest_ValueInput_String_{String_: "NOEXIST"},
|
||||
},
|
||||
},
|
||||
},
|
||||
All: true,
|
||||
},
|
||||
true,
|
||||
false,
|
||||
0,
|
||||
},
|
||||
{
|
||||
"Filter test for key collision (https://git.vdb.to/cerc-io/laconicd/issues/122)",
|
||||
&types.QueryRecordsRequest{
|
||||
Attributes: []*types.QueryRecordsRequest_KeyValueInput{
|
||||
{
|
||||
Key: "typ",
|
||||
Value: &types.QueryRecordsRequest_ValueInput{
|
||||
Value: &types.QueryRecordsRequest_ValueInput_String_{String_: "eWebsiteRegistrationRecord"},
|
||||
},
|
||||
},
|
||||
},
|
||||
All: true,
|
||||
},
|
||||
true,
|
||||
false,
|
||||
0,
|
||||
},
|
||||
{
|
||||
"Filter with attributes ServiceProviderRegistration",
|
||||
&types.QueryRecordsRequest{
|
||||
Attributes: []*types.QueryRecordsRequest_KeyValueInput{
|
||||
{
|
||||
Key: "x500state_name",
|
||||
Value: &types.QueryRecordsRequest_ValueInput{
|
||||
Value: &types.QueryRecordsRequest_ValueInput_String_{String_: "california"},
|
||||
},
|
||||
},
|
||||
},
|
||||
All: true,
|
||||
},
|
||||
true,
|
||||
false,
|
||||
1,
|
||||
},
|
||||
}
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s ", test.msg), func() {
|
||||
if test.createRecords {
|
||||
for _, example := range examples {
|
||||
filePath, err := filepath.Abs(example)
|
||||
sr.NoError(err)
|
||||
payloadType, err := cli.GetPayloadFromFile(filePath)
|
||||
sr.NoError(err)
|
||||
payload := payloadType.ToPayload()
|
||||
record, err := kts.RegistryKeeper.SetRecord(ctx, types.MsgSetRecord{
|
||||
BondId: kts.bond.GetId(),
|
||||
Signer: kts.accounts[0].String(),
|
||||
Payload: payload,
|
||||
})
|
||||
sr.NoError(err)
|
||||
sr.NotNil(record.Id)
|
||||
}
|
||||
}
|
||||
|
||||
resp, err := queryClient.Records(context.Background(), test.req)
|
||||
|
||||
if test.expErr {
|
||||
kts.Error(err)
|
||||
} else {
|
||||
sr.NoError(err)
|
||||
sr.Equal(test.noOfRecords, len(resp.GetRecords()))
|
||||
if test.createRecords && test.noOfRecords > 0 {
|
||||
recordId = resp.GetRecords()[0].GetId()
|
||||
sr.NotZero(resp.GetRecords())
|
||||
sr.Equal(resp.GetRecords()[0].GetBondId(), kts.bond.GetId())
|
||||
|
||||
for _, record := range resp.GetRecords() {
|
||||
recAttr := helpers.MustUnmarshalJSON[types.AttributeMap](record.Attributes)
|
||||
|
||||
for _, attr := range test.req.GetAttributes() {
|
||||
enc, err := registryKeeper.QueryValueToJSON(attr.Value)
|
||||
sr.NoError(err)
|
||||
av := helpers.MustUnmarshalJSON[any](enc)
|
||||
|
||||
if nil != av && nil != recAttr[attr.Key] &&
|
||||
reflect.Slice == reflect.TypeOf(recAttr[attr.Key]).Kind() &&
|
||||
reflect.Slice != reflect.TypeOf(av).Kind() {
|
||||
found := false
|
||||
allValues := recAttr[attr.Key].([]interface{})
|
||||
for i := range allValues {
|
||||
if av == allValues[i] {
|
||||
fmt.Printf("Found %s in %s", allValues[i], recAttr[attr.Key])
|
||||
found = true
|
||||
}
|
||||
}
|
||||
sr.Equal(true, found, fmt.Sprintf("Unable to find %s in %s", av, recAttr[attr.Key]))
|
||||
} else {
|
||||
if attr.Key[:4] == "x500" {
|
||||
sr.Equal(av, recAttr["x500"].(map[string]interface{})[attr.Key[4:]])
|
||||
} else {
|
||||
sr.Equal(av, recAttr[attr.Key])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Get the records by record id
|
||||
testCases1 := []struct {
|
||||
msg string
|
||||
req *types.QueryRecordByIdRequest
|
||||
createRecord bool
|
||||
expErr bool
|
||||
noOfRecords int
|
||||
}{
|
||||
{
|
||||
"Invalid Request without record id",
|
||||
&types.QueryRecordByIdRequest{},
|
||||
false,
|
||||
true,
|
||||
0,
|
||||
},
|
||||
{
|
||||
"With Record ID",
|
||||
&types.QueryRecordByIdRequest{
|
||||
Id: recordId,
|
||||
},
|
||||
true,
|
||||
false,
|
||||
1,
|
||||
},
|
||||
}
|
||||
for _, test := range testCases1 {
|
||||
kts.Run(fmt.Sprintf("Case %s ", test.msg), func() {
|
||||
resp, err := queryClient.GetRecord(context.Background(), test.req)
|
||||
|
||||
if test.expErr {
|
||||
kts.Error(err)
|
||||
} else {
|
||||
sr.NoError(err)
|
||||
sr.NotNil(resp.GetRecord())
|
||||
if test.createRecord {
|
||||
sr.Equal(resp.GetRecord().BondId, kts.bond.GetId())
|
||||
sr.Equal(resp.GetRecord().Id, recordId)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Get the records by record id
|
||||
testCasesByBondID := []struct {
|
||||
msg string
|
||||
req *types.QueryRecordsByBondIdRequest
|
||||
createRecord bool
|
||||
expErr bool
|
||||
noOfRecords int
|
||||
}{
|
||||
{
|
||||
"Invalid Request without bond id",
|
||||
&types.QueryRecordsByBondIdRequest{},
|
||||
false,
|
||||
true,
|
||||
0,
|
||||
},
|
||||
{
|
||||
"With Bond ID",
|
||||
&types.QueryRecordsByBondIdRequest{
|
||||
Id: kts.bond.GetId(),
|
||||
},
|
||||
true,
|
||||
false,
|
||||
1,
|
||||
},
|
||||
}
|
||||
for _, test := range testCasesByBondID {
|
||||
kts.Run(fmt.Sprintf("Case %s ", test.msg), func() {
|
||||
resp, err := queryClient.GetRecordsByBondId(context.Background(), test.req)
|
||||
|
||||
if test.expErr {
|
||||
sr.Zero(resp.GetRecords())
|
||||
} else {
|
||||
sr.NoError(err)
|
||||
sr.NotNil(resp.GetRecords())
|
||||
if test.createRecord {
|
||||
sr.NotZero(resp.GetRecords())
|
||||
sr.Equal(resp.GetRecords()[0].GetBondId(), kts.bond.GetId())
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcQueryRegistryModuleBalance() {
|
||||
queryClient, ctx := kts.queryClient, kts.SdkCtx
|
||||
sr := kts.Require()
|
||||
examples := []string{
|
||||
"../../data/examples/service_provider_example.yml",
|
||||
"../../data/examples/website_registration_example.yml",
|
||||
}
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryGetRegistryModuleBalanceRequest
|
||||
createRecords bool
|
||||
expErr bool
|
||||
noOfRecords int
|
||||
}{
|
||||
{
|
||||
"Get Module Balance",
|
||||
&types.QueryGetRegistryModuleBalanceRequest{},
|
||||
true,
|
||||
false,
|
||||
1,
|
||||
},
|
||||
}
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s ", test.msg), func() {
|
||||
if test.createRecords {
|
||||
for _, example := range examples {
|
||||
filePath, err := filepath.Abs(example)
|
||||
sr.NoError(err)
|
||||
payloadType, err := cli.GetPayloadFromFile(filePath)
|
||||
sr.NoError(err)
|
||||
payload := payloadType.ToPayload()
|
||||
record, err := kts.RegistryKeeper.SetRecord(ctx, types.MsgSetRecord{
|
||||
BondId: kts.bond.GetId(),
|
||||
Signer: kts.accounts[0].String(),
|
||||
Payload: payload,
|
||||
})
|
||||
sr.NoError(err)
|
||||
sr.NotNil(record.Id)
|
||||
}
|
||||
}
|
||||
resp, err := queryClient.GetRegistryModuleBalance(context.Background(), test.req)
|
||||
if test.expErr {
|
||||
kts.Error(err)
|
||||
} else {
|
||||
sr.NoError(err)
|
||||
sr.Equal(test.noOfRecords, len(resp.GetBalances()))
|
||||
if test.createRecords {
|
||||
balance := resp.GetBalances()[0]
|
||||
sr.Equal(balance.AccountName, types.RecordRentModuleAccountName)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (kts *KeeperTestSuite) TestGrpcQueryWhoIs() {
|
||||
queryClient, ctx := kts.queryClient, kts.SdkCtx
|
||||
sr := kts.Require()
|
||||
authorityName := "TestGrpcQueryWhoIs"
|
||||
|
||||
testCases := []struct {
|
||||
msg string
|
||||
req *types.QueryWhoisRequest
|
||||
createName bool
|
||||
expErr bool
|
||||
noOfRecords int
|
||||
}{
|
||||
{
|
||||
"Invalid Request without name",
|
||||
&types.QueryWhoisRequest{},
|
||||
false,
|
||||
true,
|
||||
1,
|
||||
},
|
||||
{
|
||||
"Success",
|
||||
&types.QueryWhoisRequest{},
|
||||
true,
|
||||
false,
|
||||
1,
|
||||
},
|
||||
}
|
||||
for _, test := range testCases {
|
||||
kts.Run(fmt.Sprintf("Case %s ", test.msg), func() {
|
||||
if test.createName {
|
||||
err := kts.RegistryKeeper.ReserveAuthority(ctx, types.MsgReserveAuthority{
|
||||
Name: authorityName,
|
||||
Signer: kts.accounts[0].String(),
|
||||
Owner: kts.accounts[0].String(),
|
||||
})
|
||||
sr.NoError(err)
|
||||
test.req = &types.QueryWhoisRequest{Name: authorityName}
|
||||
}
|
||||
resp, err := queryClient.Whois(context.Background(), test.req)
|
||||
if test.expErr {
|
||||
kts.Error(err)
|
||||
sr.Nil(resp)
|
||||
} else {
|
||||
sr.NoError(err)
|
||||
if test.createName {
|
||||
nameAuth := resp.NameAuthority
|
||||
sr.NotNil(nameAuth)
|
||||
sr.Equal(nameAuth.OwnerAddress, kts.accounts[0].String())
|
||||
sr.Equal(types.AuthorityActive, nameAuth.Status)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
@ -5,6 +5,9 @@ import "cosmossdk.io/collections"
|
||||
const (
|
||||
ModuleName = "auction"
|
||||
|
||||
// StoreKey defines the primary module store key
|
||||
StoreKey = ModuleName
|
||||
|
||||
// AuctionBurnModuleAccountName is the name of the auction burn module account.
|
||||
AuctionBurnModuleAccountName = "auction_burn"
|
||||
)
|
||||
|
@ -4,6 +4,9 @@ import "cosmossdk.io/collections"
|
||||
|
||||
const (
|
||||
ModuleName = "bond"
|
||||
|
||||
// StoreKey defines the primary module store key
|
||||
StoreKey = ModuleName
|
||||
)
|
||||
|
||||
// Store prefixes
|
||||
|
@ -19,8 +19,10 @@ import (
|
||||
auth "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
||||
bank "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
||||
"github.com/gibson042/canonicaljson-go"
|
||||
cid "github.com/ipfs/go-cid"
|
||||
"github.com/ipld/go-ipld-prime"
|
||||
"github.com/ipld/go-ipld-prime/codec/dagjson"
|
||||
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
|
||||
"github.com/ipld/go-ipld-prime/node/basicnode"
|
||||
|
||||
auctionkeeper "git.vdb.to/cerc-io/laconic2d/x/auction/keeper"
|
||||
@ -105,6 +107,7 @@ type Keeper struct {
|
||||
NameRecords *collections.IndexedMap[string, registrytypes.NameRecord, NameRecordsIndexes]
|
||||
RecordExpiryQueue collections.Map[time.Time, registrytypes.ExpiryQueue]
|
||||
AuthorityExpiryQueue collections.Map[time.Time, registrytypes.ExpiryQueue]
|
||||
AttributesMap collections.Map[collections.Pair[string, string], registrytypes.RecordsList]
|
||||
}
|
||||
|
||||
// NewKeeper creates a new Keeper instance
|
||||
@ -147,6 +150,10 @@ func NewKeeper(
|
||||
sb, registrytypes.AuthorityExpiryQueuePrefix, "authority_expiry_queue",
|
||||
sdk.TimeKey, codec.CollValue[registrytypes.ExpiryQueue](cdc),
|
||||
),
|
||||
AttributesMap: collections.NewMap(
|
||||
sb, registrytypes.AttributesMapPrefix, "attributes_map",
|
||||
collections.PairKeyCodec(collections.StringKey, collections.StringKey), codec.CollValue[registrytypes.RecordsList](cdc),
|
||||
),
|
||||
}
|
||||
|
||||
schema, err := sb.Build()
|
||||
@ -237,7 +244,90 @@ func (k Keeper) GetRecordsByBondId(ctx sdk.Context, bondId string) ([]registryty
|
||||
|
||||
// RecordsFromAttributes gets a list of records whose attributes match all provided values
|
||||
func (k Keeper) RecordsFromAttributes(ctx sdk.Context, attributes []*registrytypes.QueryRecordsRequest_KeyValueInput, all bool) ([]registrytypes.Record, error) {
|
||||
panic("unimplemented")
|
||||
resultRecordIds := []string{}
|
||||
for i, attr := range attributes {
|
||||
suffix, err := QueryValueToJSON(attr.Value)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mapKey := collections.Join(attr.Key, string(suffix))
|
||||
recordIds, err := k.getAttributeMapping(ctx, mapKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if i == 0 {
|
||||
resultRecordIds = recordIds
|
||||
} else {
|
||||
resultRecordIds = getIntersection(recordIds, resultRecordIds)
|
||||
}
|
||||
}
|
||||
|
||||
records := []registrytypes.Record{}
|
||||
for _, id := range resultRecordIds {
|
||||
record, err := k.GetRecordById(ctx, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if record.Deleted {
|
||||
continue
|
||||
}
|
||||
if !all && len(record.Names) == 0 {
|
||||
continue
|
||||
}
|
||||
records = append(records, record)
|
||||
}
|
||||
|
||||
return records, nil
|
||||
}
|
||||
|
||||
// TODO not recursive, and only should be if we want to support querying with whole sub-objects,
|
||||
// which seems unnecessary.
|
||||
func QueryValueToJSON(input *registrytypes.QueryRecordsRequest_ValueInput) ([]byte, error) {
|
||||
np := basicnode.Prototype.Any
|
||||
nb := np.NewBuilder()
|
||||
|
||||
switch value := input.GetValue().(type) {
|
||||
case *registrytypes.QueryRecordsRequest_ValueInput_String_:
|
||||
err := nb.AssignString(value.String_)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
case *registrytypes.QueryRecordsRequest_ValueInput_Int:
|
||||
err := nb.AssignInt(value.Int)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
case *registrytypes.QueryRecordsRequest_ValueInput_Float:
|
||||
err := nb.AssignFloat(value.Float)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
case *registrytypes.QueryRecordsRequest_ValueInput_Boolean:
|
||||
err := nb.AssignBool(value.Boolean)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
case *registrytypes.QueryRecordsRequest_ValueInput_Link:
|
||||
link := cidlink.Link{Cid: cid.MustParse(value.Link)}
|
||||
err := nb.AssignLink(link)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
case *registrytypes.QueryRecordsRequest_ValueInput_Array:
|
||||
return nil, fmt.Errorf("recursive query values are not supported")
|
||||
case *registrytypes.QueryRecordsRequest_ValueInput_Map:
|
||||
return nil, fmt.Errorf("recursive query values are not supported")
|
||||
default:
|
||||
return nil, fmt.Errorf("value has unexpected type %T", value)
|
||||
}
|
||||
|
||||
n := nb.Build()
|
||||
var buf bytes.Buffer
|
||||
if err := dagjson.Encode(n, &buf); err != nil {
|
||||
return nil, fmt.Errorf("encoding value to JSON failed: %w", err)
|
||||
}
|
||||
return buf.Bytes(), nil
|
||||
}
|
||||
|
||||
// PutRecord - saves a record to the store.
|
||||
@ -321,20 +411,14 @@ func (k Keeper) processRecord(ctx sdk.Context, record *registrytypes.ReadableRec
|
||||
|
||||
// TODO look up/validate record type here
|
||||
|
||||
if err := k.processAttributes(ctx, record.Attributes, record.Id, ""); err != nil {
|
||||
if err := k.processAttributes(ctx, record.Attributes, record.Id); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// TODO
|
||||
// expiryTimeKey := GetAttributesIndexKey(ExpiryTimeAttributeName, []byte(record.ExpiryTime))
|
||||
// if err := k.SetAttributeMapping(ctx, expiryTimeKey, record.ID); err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
return k.insertRecordExpiryQueue(ctx, recordObj)
|
||||
}
|
||||
|
||||
func (k Keeper) processAttributes(ctx sdk.Context, attrs registrytypes.AttributeMap, id string, prefix string) error {
|
||||
func (k Keeper) processAttributes(ctx sdk.Context, attrs registrytypes.AttributeMap, id string) error {
|
||||
np := basicnode.Prototype.Map
|
||||
nb := np.NewBuilder()
|
||||
encAttrs, err := canonicaljson.Marshal(attrs)
|
||||
@ -353,7 +437,7 @@ func (k Keeper) processAttributes(ctx sdk.Context, attrs registrytypes.Attribute
|
||||
return fmt.Errorf("record attributes must be a map, not %T", n.Kind())
|
||||
}
|
||||
|
||||
return k.processAttributeMap(ctx, n, id, prefix)
|
||||
return k.processAttributeMap(ctx, n, id, "")
|
||||
}
|
||||
|
||||
func (k Keeper) processAttributeMap(ctx sdk.Context, n ipld.Node, id string, prefix string) error {
|
||||
@ -378,17 +462,55 @@ func (k Keeper) processAttributeMap(ctx sdk.Context, n ipld.Node, id string, pre
|
||||
if err := dagjson.Encode(valuenode, &buf); err != nil {
|
||||
return err
|
||||
}
|
||||
// TODO
|
||||
// value := buf.Bytes()
|
||||
// indexKey := GetAttributesIndexKey(prefix+key, value)
|
||||
// if err := k.SetAttributeMapping(ctx, indexKey, id); err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
value := buf.Bytes()
|
||||
mapKey := collections.Join(prefix+key, string(value))
|
||||
if err := k.setAttributeMapping(ctx, mapKey, id); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (k Keeper) setAttributeMapping(ctx sdk.Context, key collections.Pair[string, string], recordId string) error {
|
||||
var recordIds []string
|
||||
|
||||
has, err := k.AttributesMap.Has(ctx, key)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if has {
|
||||
value, err := k.AttributesMap.Get(ctx, key)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
recordIds = value.Value
|
||||
}
|
||||
|
||||
recordIds = append(recordIds, recordId)
|
||||
|
||||
return k.AttributesMap.Set(ctx, key, registrytypes.RecordsList{Value: recordIds})
|
||||
}
|
||||
|
||||
func (k Keeper) getAttributeMapping(ctx sdk.Context, key collections.Pair[string, string]) ([]string, error) {
|
||||
if has, err := k.AttributesMap.Has(ctx, key); !has {
|
||||
if err != nil {
|
||||
return []string{}, err
|
||||
}
|
||||
|
||||
k.Logger(ctx).Debug(fmt.Sprintf("store doesn't have key: %v", key))
|
||||
return []string{}, nil
|
||||
}
|
||||
|
||||
value, err := k.AttributesMap.Get(ctx, key)
|
||||
if err != nil {
|
||||
return []string{}, err
|
||||
}
|
||||
|
||||
return value.Value, nil
|
||||
}
|
||||
|
||||
func (k Keeper) populateRecordNames(ctx sdk.Context, record *registrytypes.Record) error {
|
||||
iter, err := k.NameRecords.Indexes.Cid.MatchExact(ctx, record.Id)
|
||||
if err != nil {
|
||||
@ -571,3 +693,30 @@ func (k Keeper) tryTakeRecordRent(ctx sdk.Context, record registrytypes.Record)
|
||||
record.Deleted = false
|
||||
return k.SaveRecord(ctx, record)
|
||||
}
|
||||
|
||||
func getIntersection(a []string, b []string) []string {
|
||||
result := []string{}
|
||||
if len(a) < len(b) {
|
||||
for _, str := range a {
|
||||
if contains(b, str) {
|
||||
result = append(result, str)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for _, str := range b {
|
||||
if contains(a, str) {
|
||||
result = append(result, str)
|
||||
}
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func contains(arr []string, str string) bool {
|
||||
for _, s := range arr {
|
||||
if s == str {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
@ -6,6 +6,9 @@ const (
|
||||
// ModuleName is the name of the registry module
|
||||
ModuleName = "registry"
|
||||
|
||||
// StoreKey defines the primary module store key
|
||||
StoreKey = ModuleName
|
||||
|
||||
// RecordRentModuleAccountName is the name of the module account that keeps track of record rents paid.
|
||||
RecordRentModuleAccountName = "record_rent"
|
||||
|
||||
@ -30,4 +33,6 @@ var (
|
||||
|
||||
RecordExpiryQueuePrefix = collections.NewPrefix(8)
|
||||
AuthorityExpiryQueuePrefix = collections.NewPrefix(9)
|
||||
|
||||
AttributesMapPrefix = collections.NewPrefix(10)
|
||||
)
|
||||
|
@ -679,6 +679,52 @@ func (m *ExpiryQueue) GetValue() []string {
|
||||
return nil
|
||||
}
|
||||
|
||||
// List of record ids
|
||||
// Value type to be used in AttributesMap
|
||||
type RecordsList struct {
|
||||
Value []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
|
||||
}
|
||||
|
||||
func (m *RecordsList) Reset() { *m = RecordsList{} }
|
||||
func (m *RecordsList) String() string { return proto.CompactTextString(m) }
|
||||
func (*RecordsList) ProtoMessage() {}
|
||||
func (*RecordsList) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_d792f2373089b5b9, []int{9}
|
||||
}
|
||||
func (m *RecordsList) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
}
|
||||
func (m *RecordsList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
if deterministic {
|
||||
return xxx_messageInfo_RecordsList.Marshal(b, m, deterministic)
|
||||
} else {
|
||||
b = b[:cap(b)]
|
||||
n, err := m.MarshalToSizedBuffer(b)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return b[:n], nil
|
||||
}
|
||||
}
|
||||
func (m *RecordsList) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_RecordsList.Merge(m, src)
|
||||
}
|
||||
func (m *RecordsList) XXX_Size() int {
|
||||
return m.Size()
|
||||
}
|
||||
func (m *RecordsList) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_RecordsList.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_RecordsList proto.InternalMessageInfo
|
||||
|
||||
func (m *RecordsList) GetValue() []string {
|
||||
if m != nil {
|
||||
return m.Value
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*Params)(nil), "cerc.registry.v1.Params")
|
||||
proto.RegisterType((*Record)(nil), "cerc.registry.v1.Record")
|
||||
@ -689,89 +735,91 @@ func init() {
|
||||
proto.RegisterType((*NameRecordEntry)(nil), "cerc.registry.v1.NameRecordEntry")
|
||||
proto.RegisterType((*Signature)(nil), "cerc.registry.v1.Signature")
|
||||
proto.RegisterType((*ExpiryQueue)(nil), "cerc.registry.v1.ExpiryQueue")
|
||||
proto.RegisterType((*RecordsList)(nil), "cerc.registry.v1.RecordsList")
|
||||
}
|
||||
|
||||
func init() { proto.RegisterFile("cerc/registry/v1/registry.proto", fileDescriptor_d792f2373089b5b9) }
|
||||
|
||||
var fileDescriptor_d792f2373089b5b9 = []byte{
|
||||
// 1221 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xcb, 0x6e, 0xdb, 0x46,
|
||||
0x17, 0x36, 0x6d, 0x59, 0xb6, 0x8e, 0x63, 0xff, 0xc1, 0xfc, 0x4e, 0x22, 0xbb, 0xb1, 0xe8, 0xa8,
|
||||
0x28, 0xec, 0x20, 0x30, 0x09, 0xd9, 0x28, 0x82, 0x24, 0xe8, 0xc2, 0x72, 0x1d, 0xc3, 0x0d, 0xda,
|
||||
0x3a, 0xe3, 0xac, 0x5a, 0x14, 0x02, 0x2f, 0x13, 0x79, 0x5a, 0x91, 0x14, 0xc8, 0xa1, 0x1a, 0x2d,
|
||||
0x0b, 0x74, 0xd3, 0x9d, 0x97, 0x59, 0xf4, 0x0d, 0xba, 0xe8, 0x63, 0x34, 0xcb, 0x2c, 0xbb, 0x29,
|
||||
0x5b, 0xd8, 0x40, 0x1f, 0x40, 0x4f, 0x50, 0x70, 0x66, 0x78, 0x95, 0x14, 0xb5, 0xc8, 0x8e, 0xe7,
|
||||
0xf6, 0xcd, 0x37, 0xdf, 0x9c, 0xb9, 0x10, 0x54, 0x8b, 0xf8, 0x96, 0xee, 0x93, 0x2e, 0x0d, 0x98,
|
||||
0x3f, 0xd4, 0x07, 0xad, 0xf4, 0x5b, 0xeb, 0xfb, 0x1e, 0xf3, 0xd0, 0xcd, 0x38, 0x41, 0x4b, 0x9d,
|
||||
0x83, 0xd6, 0x66, 0xa3, 0xeb, 0x79, 0xdd, 0x1e, 0xd1, 0x79, 0xdc, 0x0c, 0x5f, 0xea, 0x76, 0xe8,
|
||||
0x1b, 0x8c, 0x7a, 0xae, 0xa8, 0xd8, 0x54, 0xcb, 0x71, 0x46, 0x1d, 0x12, 0x30, 0xc3, 0xe9, 0xcb,
|
||||
0x84, 0xf5, 0xae, 0xd7, 0xf5, 0xf8, 0xa7, 0x1e, 0x7f, 0x49, 0x6f, 0xc3, 0xf2, 0x02, 0xc7, 0x0b,
|
||||
0x74, 0xd3, 0x08, 0x88, 0x3e, 0x68, 0x99, 0x84, 0x19, 0x2d, 0xdd, 0xf2, 0xa8, 0x84, 0x6d, 0xfe,
|
||||
0xb1, 0x0a, 0xd5, 0x33, 0xc3, 0x37, 0x9c, 0x00, 0x51, 0x58, 0xf1, 0x89, 0xe5, 0xf9, 0x76, 0xc7,
|
||||
0x27, 0x2e, 0xab, 0x2b, 0xdb, 0xca, 0xee, 0xca, 0xfe, 0x86, 0x26, 0x00, 0xb4, 0x18, 0x40, 0x93,
|
||||
0x00, 0xda, 0x91, 0x47, 0xdd, 0xf6, 0xde, 0x9b, 0x48, 0x9d, 0x1b, 0x45, 0xea, 0x47, 0xdf, 0x06,
|
||||
0x9e, 0xfb, 0xb8, 0x99, 0xab, 0x6d, 0x6e, 0x0f, 0x0d, 0xa7, 0x57, 0x74, 0x61, 0x10, 0x16, 0x26,
|
||||
0x2e, 0x43, 0x97, 0x0a, 0xac, 0xe7, 0x82, 0x9d, 0x64, 0xae, 0xf5, 0x79, 0x39, 0xa8, 0x98, 0xac,
|
||||
0x96, 0x4c, 0x56, 0xfb, 0x54, 0x26, 0xb4, 0x8f, 0xe4, 0xa0, 0x0f, 0xc7, 0x06, 0x4d, 0x41, 0x26,
|
||||
0x8c, 0x9e, 0xc5, 0x5e, 0xff, 0xa9, 0x2a, 0x18, 0x65, 0x54, 0x12, 0x60, 0x14, 0xc2, 0x9a, 0x11,
|
||||
0xb2, 0x0b, 0xcf, 0xa7, 0x6c, 0x28, 0x04, 0x58, 0x98, 0x25, 0xc0, 0x81, 0xe4, 0xf2, 0x40, 0x70,
|
||||
0x29, 0x96, 0x27, 0x2c, 0x4a, 0x5e, 0xbc, 0x9a, 0x3a, 0xb8, 0x12, 0x3f, 0x2b, 0x70, 0xa7, 0x98,
|
||||
0x92, 0x89, 0x51, 0x99, 0x25, 0xc6, 0xa9, 0x24, 0xf0, 0xc9, 0x24, 0x02, 0x63, 0x7a, 0x4c, 0x0b,
|
||||
0x73, 0x49, 0x6e, 0x15, 0x68, 0xa5, 0xaa, 0xbc, 0x56, 0xe0, 0x76, 0x56, 0xd7, 0xf5, 0x0d, 0x8b,
|
||||
0x74, 0xfa, 0xc4, 0xa7, 0x9e, 0x5d, 0x5f, 0x9c, 0xc5, 0xee, 0x44, 0xb2, 0x7b, 0x52, 0x66, 0x97,
|
||||
0x87, 0x19, 0x27, 0x57, 0x88, 0x72, 0x6e, 0xeb, 0x69, 0xf0, 0x24, 0x8e, 0x9d, 0xf1, 0x10, 0xfa,
|
||||
0x41, 0x81, 0x8d, 0xac, 0xca, 0x08, 0xad, 0x78, 0xd0, 0x0e, 0x71, 0x0d, 0xb3, 0x47, 0xec, 0x7a,
|
||||
0x75, 0x5b, 0xd9, 0x5d, 0x6e, 0x1f, 0x8f, 0x22, 0xf5, 0xb0, 0x3c, 0x7c, 0x29, 0x75, 0x9c, 0x41,
|
||||
0x39, 0x01, 0x67, 0x2b, 0x74, 0x28, 0x42, 0xc7, 0x22, 0x82, 0x7e, 0x53, 0x60, 0x42, 0x9d, 0xe5,
|
||||
0x39, 0x0e, 0x65, 0x41, 0xb6, 0x90, 0x4b, 0xb3, 0xa4, 0xea, 0x48, 0xa9, 0xce, 0xa7, 0x71, 0x2d,
|
||||
0x43, 0x4e, 0x27, 0x3d, 0x96, 0xc9, 0x25, 0x54, 0xcb, 0x33, 0x38, 0x12, 0x69, 0xe9, 0x42, 0x4f,
|
||||
0x9e, 0x89, 0x4f, 0x06, 0xc4, 0xe8, 0xe5, 0x66, 0xb2, 0xfc, 0xde, 0x33, 0x29, 0x43, 0x4e, 0x9f,
|
||||
0xc9, 0x58, 0xe6, 0xe4, 0x99, 0x60, 0x91, 0x96, 0xce, 0xe4, 0x17, 0x05, 0xee, 0x4e, 0x93, 0xa5,
|
||||
0xf3, 0x92, 0x90, 0x7a, 0x6d, 0xd6, 0xbe, 0xfe, 0x52, 0xce, 0xe1, 0xe4, 0xdd, 0xab, 0x11, 0x83,
|
||||
0xcd, 0x5a, 0x07, 0x9e, 0x83, 0x37, 0x26, 0xab, 0xff, 0x94, 0x90, 0x29, 0x6c, 0xc5, 0xd4, 0x39,
|
||||
0x5b, 0x78, 0x6f, 0xb6, 0x19, 0xd8, 0x2c, 0xad, 0xa7, 0xb0, 0x15, 0x0a, 0xc7, 0x6c, 0x7f, 0x55,
|
||||
0x60, 0x6b, 0xbc, 0xd8, 0xa1, 0x2e, 0x75, 0x42, 0xa7, 0x63, 0x52, 0xbb, 0xbe, 0x32, 0x8b, 0xee,
|
||||
0x73, 0x49, 0xf7, 0x74, 0x1a, 0xdd, 0x1c, 0xda, 0x74, 0xbe, 0xf9, 0x24, 0xbc, 0x59, 0x26, 0xfc,
|
||||
0xb9, 0x88, 0xb6, 0xa9, 0xdd, 0xfc, 0xa9, 0x02, 0x55, 0xcc, 0x4f, 0x7b, 0xb4, 0x03, 0xf3, 0xd4,
|
||||
0xe6, 0xd7, 0x5a, 0xad, 0x7d, 0x67, 0x14, 0xa9, 0xff, 0x17, 0x0c, 0xb2, 0x61, 0x62, 0xac, 0x79,
|
||||
0x6a, 0xa3, 0xc7, 0xb0, 0x64, 0x7a, 0xae, 0xdd, 0xa1, 0x36, 0xbf, 0x8f, 0x6a, 0xed, 0x7b, 0xa3,
|
||||
0x48, 0xdd, 0x12, 0xd9, 0x32, 0x90, 0x94, 0x24, 0x26, 0xae, 0xc6, 0x5f, 0xa7, 0x36, 0xfa, 0x0c,
|
||||
0x56, 0x2c, 0x9f, 0x18, 0x8c, 0x74, 0xe2, 0xfb, 0x99, 0xdf, 0x21, 0xb5, 0xf6, 0xfd, 0xec, 0x96,
|
||||
0xcc, 0x05, 0x13, 0x8c, 0xbc, 0x0b, 0x83, 0xb0, 0x5e, 0x50, 0x87, 0xc4, 0x58, 0xe4, 0x55, 0x9f,
|
||||
0xfa, 0x43, 0x81, 0x55, 0x29, 0x63, 0xe5, 0x82, 0x09, 0x56, 0xde, 0x85, 0x41, 0x58, 0x1c, 0xab,
|
||||
0x0e, 0x4b, 0x36, 0xe9, 0x11, 0x46, 0xc4, 0xc1, 0xbd, 0x8c, 0x13, 0x13, 0x3d, 0x84, 0xaa, 0xf7,
|
||||
0xbd, 0x4b, 0xfc, 0xa0, 0x5e, 0xdd, 0x5e, 0xd8, 0xad, 0xb5, 0xd5, 0x51, 0xa4, 0x7e, 0x20, 0x06,
|
||||
0x10, 0xfe, 0x04, 0x5b, 0x5a, 0x58, 0xa6, 0xa3, 0x13, 0x00, 0x83, 0x31, 0x9f, 0x9a, 0x21, 0x23,
|
||||
0x01, 0x3f, 0xe3, 0x6e, 0xb4, 0x77, 0x46, 0x91, 0xfa, 0xa1, 0x5c, 0xd9, 0x34, 0x96, 0x2e, 0x63,
|
||||
0xe6, 0xc1, 0xb9, 0x52, 0x74, 0x00, 0x8b, 0xae, 0xe1, 0x90, 0xa0, 0xbe, 0xcc, 0x09, 0x6c, 0x8d,
|
||||
0x22, 0x75, 0x43, 0x60, 0x70, 0x77, 0x52, 0x2e, 0x0c, 0x2c, 0x72, 0x51, 0x0b, 0x2a, 0x6c, 0xd8,
|
||||
0x17, 0xbb, 0xb9, 0x50, 0x13, 0x7b, 0xd3, 0x1a, 0x61, 0x60, 0x9e, 0xda, 0xfc, 0x1a, 0xd6, 0x0e,
|
||||
0x93, 0x4e, 0x39, 0x76, 0x99, 0x3f, 0x44, 0x08, 0x2a, 0x31, 0x9a, 0x68, 0x0a, 0xcc, 0xbf, 0xd1,
|
||||
0xc7, 0xb0, 0x48, 0xe2, 0xa0, 0x7c, 0x8b, 0xa8, 0x5a, 0xf9, 0xa9, 0xa6, 0x7d, 0x61, 0x38, 0x24,
|
||||
0x05, 0xc2, 0x22, 0xbb, 0xf9, 0xf7, 0x02, 0xac, 0x16, 0x02, 0xe8, 0x1b, 0xb8, 0xc9, 0x95, 0xea,
|
||||
0xf4, 0x43, 0xb3, 0x47, 0xad, 0xce, 0x77, 0x64, 0x28, 0xbb, 0xef, 0x60, 0x14, 0xa9, 0x7a, 0x4e,
|
||||
0xe2, 0x5c, 0x46, 0x41, 0xec, 0xbc, 0x1f, 0xaf, 0x71, 0xd7, 0x19, 0xf7, 0x3c, 0x23, 0x43, 0x84,
|
||||
0x61, 0x55, 0x24, 0x19, 0xb6, 0xed, 0x93, 0x20, 0x90, 0xbd, 0xba, 0x37, 0x8a, 0xd4, 0xfb, 0x79,
|
||||
0x6c, 0x19, 0x2e, 0x02, 0x27, 0x4e, 0x7c, 0x83, 0xdb, 0x87, 0xc2, 0x44, 0xb7, 0xa1, 0x7a, 0x41,
|
||||
0x68, 0xf7, 0x42, 0x3c, 0x7e, 0x2a, 0x58, 0x5a, 0xb1, 0x3f, 0x60, 0x06, 0x0b, 0x03, 0xd1, 0x84,
|
||||
0x58, 0x5a, 0xe8, 0x29, 0x40, 0xb2, 0x23, 0xa9, 0x68, 0xac, 0x5a, 0xa1, 0x05, 0xd2, 0x58, 0xb6,
|
||||
0x93, 0x53, 0x0f, 0xae, 0x49, 0xe3, 0xb4, 0xb0, 0xe3, 0xaa, 0xff, 0x75, 0xc7, 0xb9, 0xc5, 0x5d,
|
||||
0x22, 0xee, 0xda, 0xcd, 0xb1, 0x1b, 0xea, 0x45, 0xf2, 0x5c, 0x6e, 0xb7, 0x8a, 0xef, 0xd6, 0x19,
|
||||
0xbb, 0xe8, 0x32, 0xbe, 0x74, 0x72, 0x3b, 0xa9, 0x79, 0x0e, 0xb5, 0x78, 0x9d, 0xa7, 0x37, 0xd0,
|
||||
0x7e, 0xb1, 0x81, 0xee, 0x4e, 0x6e, 0x20, 0x71, 0x28, 0x25, 0xdd, 0xf3, 0xa3, 0x02, 0x90, 0x79,
|
||||
0xd1, 0x23, 0xa8, 0xf6, 0x0c, 0x46, 0x82, 0xe4, 0x15, 0x7e, 0xef, 0x5d, 0x18, 0x9c, 0x09, 0x96,
|
||||
0x05, 0xe8, 0x09, 0x2c, 0x5d, 0xd0, 0x80, 0x79, 0x7c, 0xfc, 0x85, 0x7f, 0x57, 0x9b, 0x54, 0x34,
|
||||
0x1f, 0xc1, 0xff, 0x4a, 0x31, 0xb4, 0x96, 0x9d, 0x9a, 0xfc, 0x70, 0xcc, 0x5a, 0x64, 0x3e, 0xdf,
|
||||
0x22, 0x4d, 0x06, 0xb5, 0x73, 0xda, 0x75, 0x0d, 0x16, 0xfa, 0x04, 0x3d, 0x80, 0x85, 0x80, 0x76,
|
||||
0x65, 0xb7, 0x6f, 0x8c, 0x22, 0xf5, 0x96, 0xd0, 0x3a, 0xa0, 0xdd, 0x44, 0xe3, 0xf8, 0x13, 0xc7,
|
||||
0x59, 0xf1, 0xe2, 0xf7, 0x43, 0x93, 0x6f, 0x8f, 0xb1, 0xe3, 0x56, 0x06, 0x92, 0xa2, 0xc4, 0xc4,
|
||||
0xd5, 0x7e, 0x68, 0x3e, 0x23, 0xc3, 0xe6, 0x01, 0xac, 0x1c, 0xf3, 0xa5, 0x79, 0x1e, 0x92, 0x90,
|
||||
0x8c, 0x91, 0x5d, 0x87, 0xc5, 0x81, 0xd1, 0x0b, 0x09, 0x97, 0xa2, 0x86, 0x85, 0xd1, 0x3e, 0x7c,
|
||||
0x73, 0xd5, 0x50, 0xde, 0x5e, 0x35, 0x94, 0xbf, 0xae, 0x1a, 0xca, 0xe5, 0x75, 0x63, 0xee, 0xed,
|
||||
0x75, 0x63, 0xee, 0xf7, 0xeb, 0xc6, 0xdc, 0x57, 0x3b, 0x5d, 0xca, 0xb4, 0x81, 0x6d, 0x6a, 0xcc,
|
||||
0xd3, 0x63, 0xd5, 0xf6, 0xa8, 0xa7, 0xf7, 0x0c, 0xcb, 0x73, 0xa9, 0xb5, 0x6f, 0xeb, 0xaf, 0xd2,
|
||||
0xbf, 0x38, 0xb3, 0xca, 0xfb, 0xea, 0xe0, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd2, 0xef, 0x57,
|
||||
0x0f, 0xe9, 0x0d, 0x00, 0x00,
|
||||
// 1234 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xcd, 0x6e, 0xdb, 0x46,
|
||||
0x10, 0x36, 0x6d, 0x59, 0xb6, 0x46, 0xb1, 0x1b, 0x6c, 0x9d, 0x44, 0x76, 0x63, 0xd1, 0x51, 0x50,
|
||||
0xd8, 0x41, 0x60, 0x12, 0xb2, 0x51, 0x04, 0x49, 0xd0, 0x83, 0xe5, 0x3a, 0x86, 0x9b, 0xfe, 0x38,
|
||||
0xeb, 0x9c, 0x5a, 0x14, 0x02, 0x7f, 0x36, 0xf2, 0xb6, 0x22, 0x29, 0x90, 0x4b, 0x35, 0x3a, 0x16,
|
||||
0xe8, 0xa5, 0x37, 0x1f, 0x73, 0xe8, 0x1b, 0xf4, 0xd0, 0xc7, 0x68, 0x8e, 0x39, 0xf6, 0x52, 0xb5,
|
||||
0xb0, 0x81, 0x3e, 0x80, 0x9e, 0xa0, 0xe0, 0xee, 0xf2, 0x57, 0x52, 0xd4, 0x20, 0x37, 0xce, 0xdf,
|
||||
0xb7, 0xdf, 0xcc, 0xce, 0xec, 0x2e, 0x41, 0xb5, 0x88, 0x6f, 0xe9, 0x3e, 0xe9, 0xd0, 0x80, 0xf9,
|
||||
0x03, 0xbd, 0xdf, 0x4c, 0xbe, 0xb5, 0x9e, 0xef, 0x31, 0x0f, 0x5d, 0x8f, 0x1c, 0xb4, 0x44, 0xd9,
|
||||
0x6f, 0x6e, 0xd4, 0x3b, 0x9e, 0xd7, 0xe9, 0x12, 0x9d, 0xdb, 0xcd, 0xf0, 0x85, 0x6e, 0x87, 0xbe,
|
||||
0xc1, 0xa8, 0xe7, 0x8a, 0x88, 0x0d, 0xb5, 0x68, 0x67, 0xd4, 0x21, 0x01, 0x33, 0x9c, 0x9e, 0x74,
|
||||
0x58, 0xeb, 0x78, 0x1d, 0x8f, 0x7f, 0xea, 0xd1, 0x97, 0xd4, 0xd6, 0x2d, 0x2f, 0x70, 0xbc, 0x40,
|
||||
0x37, 0x8d, 0x80, 0xe8, 0xfd, 0xa6, 0x49, 0x98, 0xd1, 0xd4, 0x2d, 0x8f, 0x4a, 0xd8, 0xc6, 0x5f,
|
||||
0x2b, 0x50, 0x3e, 0x35, 0x7c, 0xc3, 0x09, 0x10, 0x85, 0xaa, 0x4f, 0x2c, 0xcf, 0xb7, 0xdb, 0x3e,
|
||||
0x71, 0x59, 0x4d, 0xd9, 0x52, 0x76, 0xaa, 0x7b, 0xeb, 0x9a, 0x00, 0xd0, 0x22, 0x00, 0x4d, 0x02,
|
||||
0x68, 0x87, 0x1e, 0x75, 0x5b, 0xbb, 0xaf, 0x87, 0xea, 0xdc, 0x68, 0xa8, 0x7e, 0xfc, 0x7d, 0xe0,
|
||||
0xb9, 0x8f, 0x1a, 0x99, 0xd8, 0xc6, 0xd6, 0xc0, 0x70, 0xba, 0x79, 0x15, 0x06, 0x21, 0x61, 0xe2,
|
||||
0x32, 0x74, 0xa1, 0xc0, 0x5a, 0xc6, 0xd8, 0x8e, 0x73, 0xad, 0xcd, 0xcb, 0x45, 0x45, 0xb2, 0x5a,
|
||||
0x9c, 0xac, 0xf6, 0x99, 0x74, 0x68, 0x1d, 0xca, 0x45, 0x1f, 0x8c, 0x2d, 0x9a, 0x80, 0x4c, 0x58,
|
||||
0x3d, 0xb5, 0xbd, 0xfa, 0x5b, 0x55, 0x30, 0x4a, 0xa9, 0xc4, 0xc0, 0x28, 0x84, 0x55, 0x23, 0x64,
|
||||
0xe7, 0x9e, 0x4f, 0xd9, 0x40, 0x14, 0x60, 0x61, 0x56, 0x01, 0xf6, 0x25, 0x97, 0xfb, 0x82, 0x4b,
|
||||
0x3e, 0x3c, 0x66, 0x51, 0xd0, 0xe2, 0x95, 0x44, 0xc1, 0x2b, 0xf1, 0xab, 0x02, 0xb7, 0xf2, 0x2e,
|
||||
0x69, 0x31, 0x4a, 0xb3, 0x8a, 0x71, 0x22, 0x09, 0x7c, 0x3a, 0x89, 0xc0, 0x58, 0x3d, 0xa6, 0x99,
|
||||
0x79, 0x49, 0x6e, 0xe4, 0x68, 0x25, 0x55, 0x79, 0xa5, 0xc0, 0xcd, 0x34, 0xae, 0xe3, 0x1b, 0x16,
|
||||
0x69, 0xf7, 0x88, 0x4f, 0x3d, 0xbb, 0xb6, 0x38, 0x8b, 0xdd, 0xb1, 0x64, 0xf7, 0xb8, 0xc8, 0x2e,
|
||||
0x0b, 0x33, 0x4e, 0x2e, 0x67, 0xe5, 0xdc, 0xd6, 0x12, 0xe3, 0x71, 0x64, 0x3b, 0xe5, 0x26, 0xf4,
|
||||
0x93, 0x02, 0xeb, 0x69, 0x94, 0x11, 0x5a, 0xd1, 0xa2, 0x6d, 0xe2, 0x1a, 0x66, 0x97, 0xd8, 0xb5,
|
||||
0xf2, 0x96, 0xb2, 0xb3, 0xdc, 0x3a, 0x1a, 0x0d, 0xd5, 0x83, 0xe2, 0xf2, 0x05, 0xd7, 0x71, 0x06,
|
||||
0x45, 0x07, 0x9c, 0xee, 0xd0, 0x81, 0x30, 0x1d, 0x09, 0x0b, 0xfa, 0x43, 0x81, 0x09, 0x71, 0x96,
|
||||
0xe7, 0x38, 0x94, 0x05, 0xe9, 0x46, 0x2e, 0xcd, 0x2a, 0x55, 0x5b, 0x96, 0xea, 0x6c, 0x1a, 0xd7,
|
||||
0x22, 0xe4, 0x74, 0xd2, 0x63, 0x9e, 0xbc, 0x84, 0x6a, 0x31, 0x83, 0x43, 0xe1, 0x96, 0x6c, 0xf4,
|
||||
0xe4, 0x4c, 0x7c, 0xd2, 0x27, 0x46, 0x37, 0x93, 0xc9, 0xf2, 0x7b, 0x67, 0x52, 0x84, 0x9c, 0x9e,
|
||||
0xc9, 0x98, 0xe7, 0xe4, 0x4c, 0xb0, 0x70, 0x4b, 0x32, 0xf9, 0x4d, 0x81, 0xdb, 0xd3, 0xca, 0xd2,
|
||||
0x7e, 0x41, 0x48, 0xad, 0x32, 0x6b, 0xae, 0xbf, 0x96, 0x39, 0x1c, 0xbf, 0x7d, 0x37, 0x22, 0xb0,
|
||||
0x59, 0xfb, 0xc0, 0x7d, 0xf0, 0xfa, 0xe4, 0xea, 0x3f, 0x21, 0x64, 0x0a, 0x5b, 0x91, 0x3a, 0x67,
|
||||
0x0b, 0xef, 0xcd, 0x36, 0x05, 0x9b, 0x55, 0xeb, 0x29, 0x6c, 0x45, 0x85, 0x23, 0xb6, 0xbf, 0x2b,
|
||||
0xb0, 0x39, 0x1e, 0xec, 0x50, 0x97, 0x3a, 0xa1, 0xd3, 0x36, 0xa9, 0x5d, 0xab, 0xce, 0xa2, 0xfb,
|
||||
0x4c, 0xd2, 0x3d, 0x99, 0x46, 0x37, 0x83, 0x36, 0x9d, 0x6f, 0xd6, 0x09, 0x6f, 0x14, 0x09, 0x7f,
|
||||
0x29, 0xac, 0x2d, 0x6a, 0x37, 0x7e, 0x29, 0x41, 0x19, 0xf3, 0xd3, 0x1e, 0x6d, 0xc3, 0x3c, 0xb5,
|
||||
0xf9, 0xb5, 0x56, 0x69, 0xdd, 0x1a, 0x0d, 0xd5, 0x0f, 0x05, 0x83, 0x74, 0x99, 0x08, 0x6b, 0x9e,
|
||||
0xda, 0xe8, 0x11, 0x2c, 0x99, 0x9e, 0x6b, 0xb7, 0xa9, 0xcd, 0xef, 0xa3, 0x4a, 0xeb, 0xce, 0x68,
|
||||
0xa8, 0x6e, 0x0a, 0x6f, 0x69, 0x88, 0x43, 0x62, 0x11, 0x97, 0xa3, 0xaf, 0x13, 0x1b, 0x7d, 0x0e,
|
||||
0x55, 0xcb, 0x27, 0x06, 0x23, 0xed, 0xe8, 0x7e, 0xe6, 0x77, 0x48, 0xa5, 0x75, 0x2f, 0xbd, 0x25,
|
||||
0x33, 0xc6, 0x18, 0x23, 0xab, 0xc2, 0x20, 0xa4, 0xe7, 0xd4, 0x21, 0x11, 0x16, 0x79, 0xd9, 0xa3,
|
||||
0xfe, 0x40, 0x60, 0x95, 0x8a, 0x58, 0x19, 0x63, 0x8c, 0x95, 0x55, 0x61, 0x10, 0x12, 0xc7, 0xaa,
|
||||
0xc1, 0x92, 0x4d, 0xba, 0x84, 0x11, 0x71, 0x70, 0x2f, 0xe3, 0x58, 0x44, 0x0f, 0xa0, 0xec, 0xfd,
|
||||
0xe8, 0x12, 0x3f, 0xa8, 0x95, 0xb7, 0x16, 0x76, 0x2a, 0x2d, 0x75, 0x34, 0x54, 0x3f, 0x12, 0x0b,
|
||||
0x08, 0x7d, 0x8c, 0x2d, 0x25, 0x2c, 0xdd, 0xd1, 0x31, 0x80, 0xc1, 0x98, 0x4f, 0xcd, 0x90, 0x91,
|
||||
0x80, 0x9f, 0x71, 0xd7, 0x5a, 0xdb, 0xa3, 0xa1, 0x7a, 0x57, 0xee, 0x6c, 0x62, 0x4b, 0xb6, 0x31,
|
||||
0xd5, 0xe0, 0x4c, 0x28, 0xda, 0x87, 0x45, 0xd7, 0x70, 0x48, 0x50, 0x5b, 0xe6, 0x04, 0x36, 0x47,
|
||||
0x43, 0x75, 0x5d, 0x60, 0x70, 0x75, 0x1c, 0x2e, 0x04, 0x2c, 0x7c, 0x51, 0x13, 0x4a, 0x6c, 0xd0,
|
||||
0x13, 0xd3, 0x9c, 0x8b, 0x89, 0xb4, 0x49, 0x8c, 0x10, 0x30, 0x77, 0x6d, 0x7c, 0x0b, 0xab, 0x07,
|
||||
0x71, 0xa7, 0x1c, 0xb9, 0xcc, 0x1f, 0x20, 0x04, 0xa5, 0x08, 0x4d, 0x34, 0x05, 0xe6, 0xdf, 0xe8,
|
||||
0x13, 0x58, 0x24, 0x91, 0x51, 0xbe, 0x45, 0x54, 0xad, 0xf8, 0x54, 0xd3, 0xbe, 0x32, 0x1c, 0x92,
|
||||
0x00, 0x61, 0xe1, 0xdd, 0xf8, 0x77, 0x01, 0x56, 0x72, 0x06, 0xf4, 0x1d, 0x5c, 0xe7, 0x95, 0x6a,
|
||||
0xf7, 0x42, 0xb3, 0x4b, 0xad, 0xf6, 0x0f, 0x64, 0x20, 0xbb, 0x6f, 0x7f, 0x34, 0x54, 0xf5, 0x4c,
|
||||
0x89, 0x33, 0x1e, 0xb9, 0x62, 0x67, 0xf5, 0x78, 0x95, 0xab, 0x4e, 0xb9, 0xe6, 0x29, 0x19, 0x20,
|
||||
0x0c, 0x2b, 0xc2, 0xc9, 0xb0, 0x6d, 0x9f, 0x04, 0x81, 0xec, 0xd5, 0xdd, 0xd1, 0x50, 0xbd, 0x97,
|
||||
0xc5, 0x96, 0xe6, 0x3c, 0x70, 0xac, 0xc4, 0xd7, 0xb8, 0x7c, 0x20, 0x44, 0x74, 0x13, 0xca, 0xe7,
|
||||
0x84, 0x76, 0xce, 0xc5, 0xe3, 0xa7, 0x84, 0xa5, 0x14, 0xe9, 0x03, 0x66, 0xb0, 0x30, 0x10, 0x4d,
|
||||
0x88, 0xa5, 0x84, 0x9e, 0x00, 0xc4, 0x13, 0x49, 0x45, 0x63, 0x55, 0x72, 0x2d, 0x90, 0xd8, 0xd2,
|
||||
0x49, 0x4e, 0x34, 0xb8, 0x22, 0x85, 0x93, 0xdc, 0xc4, 0x95, 0xdf, 0x75, 0xe2, 0xdc, 0xfc, 0x94,
|
||||
0x88, 0xbb, 0x76, 0x63, 0xec, 0x86, 0x7a, 0x1e, 0x3f, 0x97, 0x5b, 0xcd, 0xfc, 0xbb, 0x75, 0xc6,
|
||||
0x14, 0x5d, 0x44, 0x97, 0x4e, 0x66, 0x92, 0x1a, 0x67, 0x50, 0x89, 0xf6, 0x79, 0x7a, 0x03, 0xed,
|
||||
0xe5, 0x1b, 0xe8, 0xf6, 0xe4, 0x06, 0x12, 0x87, 0x52, 0xdc, 0x3d, 0x3f, 0x2b, 0x00, 0xa9, 0x16,
|
||||
0x3d, 0x84, 0x72, 0xd7, 0x60, 0x24, 0x88, 0x5f, 0xe1, 0x77, 0xde, 0x86, 0xc1, 0x99, 0x60, 0x19,
|
||||
0x80, 0x1e, 0xc3, 0xd2, 0x39, 0x0d, 0x98, 0xc7, 0xd7, 0x5f, 0xf8, 0x7f, 0xb1, 0x71, 0x44, 0xe3,
|
||||
0x21, 0x7c, 0x50, 0xb0, 0xa1, 0xd5, 0xf4, 0xd4, 0xe4, 0x87, 0x63, 0xda, 0x22, 0xf3, 0xd9, 0x16,
|
||||
0x69, 0x30, 0xa8, 0x9c, 0xd1, 0x8e, 0x6b, 0xb0, 0xd0, 0x27, 0xe8, 0x3e, 0x2c, 0x04, 0xb4, 0x23,
|
||||
0xbb, 0x7d, 0x7d, 0x34, 0x54, 0x6f, 0x88, 0x5a, 0x07, 0xb4, 0x13, 0xd7, 0x38, 0xfa, 0xc4, 0x91,
|
||||
0x57, 0xb4, 0xf9, 0xbd, 0xd0, 0xe4, 0xe3, 0x31, 0x76, 0xdc, 0x4a, 0x43, 0x1c, 0x14, 0x8b, 0xb8,
|
||||
0xdc, 0x0b, 0xcd, 0xa7, 0x64, 0xd0, 0xd8, 0x87, 0xea, 0x11, 0xdf, 0x9a, 0x67, 0x21, 0x09, 0xc9,
|
||||
0x18, 0xd9, 0x35, 0x58, 0xec, 0x1b, 0xdd, 0x90, 0xf0, 0x52, 0x54, 0xb0, 0x10, 0x1a, 0x77, 0xa1,
|
||||
0x2a, 0x32, 0x0c, 0xbe, 0xa0, 0x01, 0x4b, 0x9d, 0x94, 0x8c, 0x53, 0xeb, 0xe0, 0xf5, 0x65, 0x5d,
|
||||
0x79, 0x73, 0x59, 0x57, 0xfe, 0xb9, 0xac, 0x2b, 0x17, 0x57, 0xf5, 0xb9, 0x37, 0x57, 0xf5, 0xb9,
|
||||
0x3f, 0xaf, 0xea, 0x73, 0xdf, 0x6c, 0x77, 0x28, 0xd3, 0xfa, 0xb6, 0xa9, 0x31, 0x4f, 0x8f, 0x4a,
|
||||
0xbb, 0x4b, 0x3d, 0xbd, 0x6b, 0x58, 0x9e, 0x4b, 0xad, 0x3d, 0x5b, 0x7f, 0x99, 0xfc, 0xea, 0x99,
|
||||
0x65, 0xde, 0x7c, 0xfb, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x80, 0xc8, 0x98, 0x0e, 0x0e,
|
||||
0x00, 0x00,
|
||||
}
|
||||
|
||||
func (m *Params) Marshal() (dAtA []byte, err error) {
|
||||
@ -1305,6 +1353,38 @@ func (m *ExpiryQueue) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
||||
return len(dAtA) - i, nil
|
||||
}
|
||||
|
||||
func (m *RecordsList) Marshal() (dAtA []byte, err error) {
|
||||
size := m.Size()
|
||||
dAtA = make([]byte, size)
|
||||
n, err := m.MarshalToSizedBuffer(dAtA[:size])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return dAtA[:n], nil
|
||||
}
|
||||
|
||||
func (m *RecordsList) MarshalTo(dAtA []byte) (int, error) {
|
||||
size := m.Size()
|
||||
return m.MarshalToSizedBuffer(dAtA[:size])
|
||||
}
|
||||
|
||||
func (m *RecordsList) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
||||
i := len(dAtA)
|
||||
_ = i
|
||||
var l int
|
||||
_ = l
|
||||
if len(m.Value) > 0 {
|
||||
for iNdEx := len(m.Value) - 1; iNdEx >= 0; iNdEx-- {
|
||||
i -= len(m.Value[iNdEx])
|
||||
copy(dAtA[i:], m.Value[iNdEx])
|
||||
i = encodeVarintRegistry(dAtA, i, uint64(len(m.Value[iNdEx])))
|
||||
i--
|
||||
dAtA[i] = 0xa
|
||||
}
|
||||
}
|
||||
return len(dAtA) - i, nil
|
||||
}
|
||||
|
||||
func encodeVarintRegistry(dAtA []byte, offset int, v uint64) int {
|
||||
offset -= sovRegistry(v)
|
||||
base := offset
|
||||
@ -1535,6 +1615,21 @@ func (m *ExpiryQueue) Size() (n int) {
|
||||
return n
|
||||
}
|
||||
|
||||
func (m *RecordsList) Size() (n int) {
|
||||
if m == nil {
|
||||
return 0
|
||||
}
|
||||
var l int
|
||||
_ = l
|
||||
if len(m.Value) > 0 {
|
||||
for _, s := range m.Value {
|
||||
l = len(s)
|
||||
n += 1 + l + sovRegistry(uint64(l))
|
||||
}
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func sovRegistry(x uint64) (n int) {
|
||||
return (math_bits.Len64(x|1) + 6) / 7
|
||||
}
|
||||
@ -3216,6 +3311,88 @@ func (m *ExpiryQueue) Unmarshal(dAtA []byte) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (m *RecordsList) Unmarshal(dAtA []byte) error {
|
||||
l := len(dAtA)
|
||||
iNdEx := 0
|
||||
for iNdEx < l {
|
||||
preIndex := iNdEx
|
||||
var wire uint64
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
if shift >= 64 {
|
||||
return ErrIntOverflowRegistry
|
||||
}
|
||||
if iNdEx >= l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
b := dAtA[iNdEx]
|
||||
iNdEx++
|
||||
wire |= uint64(b&0x7F) << shift
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
fieldNum := int32(wire >> 3)
|
||||
wireType := int(wire & 0x7)
|
||||
if wireType == 4 {
|
||||
return fmt.Errorf("proto: RecordsList: wiretype end group for non-group")
|
||||
}
|
||||
if fieldNum <= 0 {
|
||||
return fmt.Errorf("proto: RecordsList: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||
}
|
||||
switch fieldNum {
|
||||
case 1:
|
||||
if wireType != 2 {
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
|
||||
}
|
||||
var stringLen uint64
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
if shift >= 64 {
|
||||
return ErrIntOverflowRegistry
|
||||
}
|
||||
if iNdEx >= l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
b := dAtA[iNdEx]
|
||||
iNdEx++
|
||||
stringLen |= uint64(b&0x7F) << shift
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
intStringLen := int(stringLen)
|
||||
if intStringLen < 0 {
|
||||
return ErrInvalidLengthRegistry
|
||||
}
|
||||
postIndex := iNdEx + intStringLen
|
||||
if postIndex < 0 {
|
||||
return ErrInvalidLengthRegistry
|
||||
}
|
||||
if postIndex > l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
m.Value = append(m.Value, string(dAtA[iNdEx:postIndex]))
|
||||
iNdEx = postIndex
|
||||
default:
|
||||
iNdEx = preIndex
|
||||
skippy, err := skipRegistry(dAtA[iNdEx:])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if (skippy < 0) || (iNdEx+skippy) < 0 {
|
||||
return ErrInvalidLengthRegistry
|
||||
}
|
||||
if (iNdEx + skippy) > l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
iNdEx += skippy
|
||||
}
|
||||
}
|
||||
|
||||
if iNdEx > l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func skipRegistry(dAtA []byte) (n int, err error) {
|
||||
l := len(dAtA)
|
||||
iNdEx := 0
|
||||
|
Loading…
Reference in New Issue
Block a user