From 02b00195b1f71d49bcccd5a268e12647331baf91 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 20 Nov 2024 09:52:18 +0100 Subject: [PATCH 1/6] Extract system test framework; minor refactorings --- {tests/systemtests => systemtests}/cli.go | 93 +- .../systemtests => systemtests}/genesis_io.go | 0 systemtests/getting_started.md | 215 ++++ systemtests/go.mod | 171 +++ systemtests/go.sum | 1032 +++++++++++++++++ .../systemtests => systemtests}/io_utils.go | 0 .../systemtests => systemtests}/node_utils.go | 0 .../rest_support.go | 24 +- .../systemtests => systemtests}/rpc_client.go | 0 {tests/systemtests => systemtests}/system.go | 25 +- .../test_runner.go | 22 +- .../testnet_init.go | 8 +- tests/systemtests/.gitignore | 1 + tests/systemtests/account_test.go | 29 +- tests/systemtests/auth_test.go | 123 +- tests/systemtests/authz_test.go | 126 +- tests/systemtests/bank_test.go | 52 +- tests/systemtests/bankv2_test.go | 11 +- tests/systemtests/circuit_test.go | 56 +- tests/systemtests/cometbft_client_test.go | 110 +- tests/systemtests/distribution_test.go | 85 +- tests/systemtests/export_test.go | 37 +- tests/systemtests/fraud_test.go | 29 +- tests/systemtests/go.mod | 11 +- tests/systemtests/gov_test.go | 64 +- tests/systemtests/group_test.go | 39 +- tests/systemtests/main_test.go | 7 +- tests/systemtests/mint_test.go | 19 +- tests/systemtests/snapshots_test.go | 31 +- tests/systemtests/staking_test.go | 13 +- tests/systemtests/tx_test.go | 213 ++-- tests/systemtests/unordered_tx_test.go | 21 +- tests/systemtests/upgrade_test.go | 57 +- 33 files changed, 2102 insertions(+), 622 deletions(-) rename {tests/systemtests => systemtests}/cli.go (88%) rename {tests/systemtests => systemtests}/genesis_io.go (100%) create mode 100644 systemtests/getting_started.md create mode 100644 systemtests/go.mod create mode 100644 systemtests/go.sum rename {tests/systemtests => systemtests}/io_utils.go (100%) rename {tests/systemtests => systemtests}/node_utils.go (100%) rename tests/systemtests/rest_cli.go => systemtests/rest_support.go (78%) rename {tests/systemtests => systemtests}/rpc_client.go (100%) rename {tests/systemtests => systemtests}/system.go (96%) rename {tests/systemtests => systemtests}/test_runner.go (89%) rename {tests/systemtests => systemtests}/testnet_init.go (98%) diff --git a/tests/systemtests/cli.go b/systemtests/cli.go similarity index 88% rename from tests/systemtests/cli.go rename to systemtests/cli.go index 423b27dc57f5..2e93cd9db7f6 100644 --- a/tests/systemtests/cli.go +++ b/systemtests/cli.go @@ -100,39 +100,30 @@ func (c CLIWrapper) WithRunErrorsIgnored() CLIWrapper { // WithRunErrorMatcher assert function to ensure run command error value func (c CLIWrapper) WithRunErrorMatcher(f RunErrorAssert) CLIWrapper { - return *NewCLIWrapperX( - c.t, - c.execBinary, - c.nodeAddress, - c.chainID, - c.awaitNextBlock, - c.nodesCount, - c.homeDir, - c.fees, - c.Debug, - f, - c.expTXCommitted, - ) + return c.clone(func(r *CLIWrapper) { + r.assertErrorFn = f + }) } func (c CLIWrapper) WithNodeAddress(nodeAddr string) CLIWrapper { - return *NewCLIWrapperX( - c.t, - c.execBinary, - nodeAddr, - c.chainID, - c.awaitNextBlock, - c.nodesCount, - c.homeDir, - c.fees, - c.Debug, - c.assertErrorFn, - c.expTXCommitted, - ) + return c.clone(func(r *CLIWrapper) { + r.nodeAddress = nodeAddr + }) } func (c CLIWrapper) WithAssertTXUncommitted() CLIWrapper { - return *NewCLIWrapperX( + return c.clone(func(r *CLIWrapper) { + r.expTXCommitted = false + }) +} +func (c CLIWrapper) WithChainID(newChainID string) CLIWrapper { + return c.clone(func(r *CLIWrapper) { + r.chainID = newChainID + }) +} + +func (c CLIWrapper) clone(mutator ...func(r *CLIWrapper)) CLIWrapper { + r := NewCLIWrapperX( c.t, c.execBinary, c.nodeAddress, @@ -143,8 +134,12 @@ func (c CLIWrapper) WithAssertTXUncommitted() CLIWrapper { c.fees, c.Debug, c.assertErrorFn, - false, + c.expTXCommitted, ) + for _, m := range mutator { + m(r) + } + return *r } // Run main entry for executing cli commands. @@ -156,7 +151,7 @@ func (c CLIWrapper) Run(args ...string) string { }) { args = append(args, "--fees="+c.fees) // add default fee } - args = c.withTXFlags(args...) + args = c.WithTXFlags(args...) execOutput, ok := c.run(args) if !ok { return execOutput @@ -207,14 +202,14 @@ func (c CLIWrapper) AwaitTxCommitted(submitResp string, timeout ...time.Duration // Keys wasmd keys CLI command func (c CLIWrapper) Keys(args ...string) string { - args = c.withKeyringFlags(args...) + args = c.WithKeyringFlags(args...) out, _ := c.run(args) return out } // CustomQuery main entrypoint for wasmd CLI queries func (c CLIWrapper) CustomQuery(args ...string) string { - args = c.withQueryFlags(args...) + args = c.WithQueryFlags(args...) out, _ := c.run(args) return out } @@ -254,23 +249,32 @@ func (c CLIWrapper) runWithInput(args []string, input io.Reader) (output string, return strings.TrimSpace(string(gotOut)), ok } -func (c CLIWrapper) withQueryFlags(args ...string) []string { +// WithQueryFlags append the test default query flags to the given args +func (c CLIWrapper) WithQueryFlags(args ...string) []string { args = append(args, "--output", "json") - return c.withChainFlags(args...) + return c.WithTargetNodeFlags(args...) } -func (c CLIWrapper) withTXFlags(args ...string) []string { +// WithTXFlags append the test default TX flags to the given args. +// This includes +// - broadcast-mode: sync +// - output: json +// - chain-id +// - keyring flags +// - target-node +func (c CLIWrapper) WithTXFlags(args ...string) []string { args = append(args, "--broadcast-mode", "sync", "--output", "json", "--yes", "--chain-id", c.chainID, ) - args = c.withKeyringFlags(args...) - return c.withChainFlags(args...) + args = c.WithKeyringFlags(args...) + return c.WithTargetNodeFlags(args...) } -func (c CLIWrapper) withKeyringFlags(args ...string) []string { +// WithKeyringFlags append the test default keyring flags to the given args +func (c CLIWrapper) WithKeyringFlags(args ...string) []string { r := append(args, "--home", c.homeDir, "--keyring-backend", "test", @@ -283,7 +287,8 @@ func (c CLIWrapper) withKeyringFlags(args ...string) []string { return append(r, "--output", "json") } -func (c CLIWrapper) withChainFlags(args ...string) []string { +// WithTargetNodeFlags append the test default target node address flags to the given args +func (c CLIWrapper) WithTargetNodeFlags(args ...string) []string { return append(args, "--node", c.nodeAddress, ) @@ -297,7 +302,7 @@ func (c CLIWrapper) WasmExecute(contractAddr, msg, from string, args ...string) // AddKey add key to default keyring. Returns address func (c CLIWrapper) AddKey(name string) string { - cmd := c.withKeyringFlags("keys", "add", name, "--no-backup") + cmd := c.WithKeyringFlags("keys", "add", name, "--no-backup") out, _ := c.run(cmd) addr := gjson.Get(out, "address").String() require.NotEmpty(c.t, addr, "got %q", out) @@ -306,7 +311,7 @@ func (c CLIWrapper) AddKey(name string) string { // AddKeyFromSeed recovers the key from given seed and add it to default keyring. Returns address func (c CLIWrapper) AddKeyFromSeed(name, mnemoic string) string { - cmd := c.withKeyringFlags("keys", "add", name, "--recover") + cmd := c.WithKeyringFlags("keys", "add", name, "--recover") out, _ := c.runWithInput(cmd, strings.NewReader(mnemoic)) addr := gjson.Get(out, "address").String() require.NotEmpty(c.t, addr, "got %q", out) @@ -315,7 +320,7 @@ func (c CLIWrapper) AddKeyFromSeed(name, mnemoic string) string { // GetKeyAddr returns Acc address func (c CLIWrapper) GetKeyAddr(name string) string { - cmd := c.withKeyringFlags("keys", "show", name, "-a") + cmd := c.WithKeyringFlags("keys", "show", name, "-a") out, _ := c.run(cmd) addr := strings.Trim(out, "\n") require.NotEmpty(c.t, addr, "got %q", out) @@ -324,7 +329,7 @@ func (c CLIWrapper) GetKeyAddr(name string) string { // GetKeyAddrPrefix returns key address with Beach32 prefix encoding for a key (acc|val|cons) func (c CLIWrapper) GetKeyAddrPrefix(name, prefix string) string { - cmd := c.withKeyringFlags("keys", "show", name, "-a", "--bech="+prefix) + cmd := c.WithKeyringFlags("keys", "show", name, "-a", "--bech="+prefix) out, _ := c.run(cmd) addr := strings.Trim(out, "\n") require.NotEmpty(c.t, addr, "got %q", out) @@ -413,6 +418,10 @@ func (c CLIWrapper) SubmitAndVoteGovProposal(proposalJson string, args ...string return ourProposalID } +func (c CLIWrapper) ChainID() string { + return c.chainID +} + // Version returns the current version of the client binary func (c CLIWrapper) Version() string { v, ok := c.run([]string{"version"}) diff --git a/tests/systemtests/genesis_io.go b/systemtests/genesis_io.go similarity index 100% rename from tests/systemtests/genesis_io.go rename to systemtests/genesis_io.go diff --git a/systemtests/getting_started.md b/systemtests/getting_started.md new file mode 100644 index 000000000000..7adc98f1b3e9 --- /dev/null +++ b/systemtests/getting_started.md @@ -0,0 +1,215 @@ +# Getting started with a new system test + +## Preparation + +Build a new binary from current branch and copy it to the `tests/systemtests/binaries` folder by running system tests. +In project root: + +```shell +make test-system +``` + +Or via manual steps + +```shell +make build +mkdir -p ./tests/systemtests/binaries +cp ./build/simd ./tests/systemtests/binaries/ +``` + +## Part 1: Writing the first system test + +Switch to the `tests/systemtests` folder to work from here. + +If there is no test file matching your use case, start a new test file here. +for example `bank_test.go` to begin with: + +```go +//go:build system_test + +package systemtests + +import ( + "testing" +) + +func TestQueryTotalSupply(t *testing.T) { + sut.ResetChain(t) + sut.StartChain(t) + + cli := NewCLIWrapper(t, sut, verbose) + raw := cli.CustomQuery("q", "bank", "total-supply") + t.Log("### got: " + raw) +} +``` + +The file begins with a Go build tag to exclude it from regular go test runs. +All tests in the `systemtests` folder build upon the *test runner* initialized in `main_test.go`. +This gives you a multi node chain started on your box. +It is a good practice to reset state in the beginning so that you have a stable base. + +The system tests framework comes with a CLI wrapper that makes it easier to interact or parse results. +In this example we want to execute `simd q bank total-supply --output json --node tcp://localhost:26657` which queries +the bank module. +Then print the result to for the next steps + +### Run the test + +```shell +go test -mod=readonly -tags='system_test' -v ./... --run TestQueryTotalSupply --verbose +``` + +This give very verbose output. You would see all simd CLI commands used for starting the server or by the client to interact. +In the example code, we just log the output. Watch out for + +```shell + bank_test.go:15: ### got: { + "supply": [ + { + "denom": "stake", + "amount": "2000000190" + }, + { + "denom": "testtoken", + "amount": "4000000000" + } + ], + "pagination": { + "total": "2" + } + } +``` + +At the end is a tail from the server log printed. This can sometimes be handy when debugging issues. + + +### Tips + +* Passing `--nodes-count=1` overwrites the default node count and can speed up your test for local runs + +## Part 2: Working with json + +When we have a json response, the [gjson](https://github.com/tidwall/gjson) lib can shine. It comes with jquery like +syntax that makes it easy to navigation within the document. + +For example `gjson.Get(raw, "supply").Array()` gives us all the childs to `supply` as an array. +Or `gjson.Get("supply.#(denom==stake).amount").Int()` for the amount of the stake token as int64 type. + +In order to test our assumptions in the system test, we modify the code to use `gjson` to fetch the data: + +```go + raw := cli.CustomQuery("q", "bank", "total-supply") + + exp := map[string]int64{ + "stake": int64(500000000 * sut.nodesCount), + "testtoken": int64(1000000000 * sut.nodesCount), + } + require.Len(t, gjson.Get(raw, "supply").Array(), len(exp), raw) + + for k, v := range exp { + got := gjson.Get(raw, fmt.Sprintf("supply.#(denom==%q).amount", k)).Int() + assert.Equal(t, v, got, raw) + } +``` + +The assumption on the staking token usually fails due to inflation minted on the staking token. Let's fix this in the next step + +### Run the test + +```shell +go test -mod=readonly -tags='system_test' -v ./... --run TestQueryTotalSupply --verbose +``` + +### Tips + +* Putting the `raw` json response to the assert/require statements helps with debugging on failures. You are usually lacking + context when you look at the values only. + + +## Part 3: Setting state via genesis + +First step is to disable inflation. This can be done via the `ModifyGenesisJSON` helper. But to add some complexity, +we also introduce a new token and update the balance of the account for key `node0`. +The setup code looks quite big and unreadable now. Usually a good time to think about extracting helper functions for +common operations. The `genesis_io.go` file contains some examples already. I would skip this and take this to showcase the mix +of `gjson`, `sjson` and stdlib json operations. + +```go + sut.ResetChain(t) + cli := NewCLIWrapper(t, sut, verbose) + + sut.ModifyGenesisJSON(t, func(genesis []byte) []byte { + // disable inflation + genesis, err := sjson.SetRawBytes(genesis, "app_state.mint.minter.inflation", []byte(`"0.000000000000000000"`)) + require.NoError(t, err) + + // add new token to supply + var supply []json.RawMessage + rawSupply := gjson.Get(string(genesis), "app_state.bank.supply").String() + require.NoError(t, json.Unmarshal([]byte(rawSupply), &supply)) + supply = append(supply, json.RawMessage(`{"denom": "mytoken","amount": "1000000"}`)) + newSupply, err := json.Marshal(supply) + require.NoError(t, err) + genesis, err = sjson.SetRawBytes(genesis, "app_state.bank.supply", newSupply) + require.NoError(t, err) + + // add amount to any balance + anyAddr := cli.GetKeyAddr("node0") + newBalances := GetGenesisBalance(genesis, anyAddr).Add(sdk.NewInt64Coin("mytoken", 1000000)) + newBalancesBz, err := newBalances.MarshalJSON() + require.NoError(t, err) + newState, err := sjson.SetRawBytes(genesis, fmt.Sprintf("app_state.bank.balances.#[address==%q]#.coins", anyAddr), newBalancesBz) + require.NoError(t, err) + return newState + }) + sut.StartChain(t) +``` + +Next step is to add the new token to the assert map. But we can also make it more resilient to different node counts. + +```go + exp := map[string]int64{ + "stake": int64(500000000 * sut.nodesCount), + "testtoken": int64(1000000000 * sut.nodesCount), + "mytoken": 1000000, + } +``` + +```shell +go test -mod=readonly -tags='system_test' -v ./... --run TestQueryTotalSupply --verbose --nodes-count=1 +``` + +## Part 4: Set state via TX + +Complexer workflows and tests require modifying state on a running chain. This works only with builtin logic and operations. +If we want to burn some of our new tokens, we need to submit a bank burn message to do this. +The CLI wrapper works similar to the query. Just pass the parameters. It uses the `node0` key as *default*: + +```go + // and when + txHash := cli.Run("tx", "bank", "burn", "node0", "400000mytoken") + RequireTxSuccess(t, txHash) +``` + +`RequireTxSuccess` or `RequireTxFailure` can be used to ensure the expected result of the operation. +Next, check that the changes are applied. + +```go + exp["mytoken"] = 600_000 // update expected state + raw = cli.CustomQuery("q", "bank", "total-supply") + for k, v := range exp { + got := gjson.Get(raw, fmt.Sprintf("supply.#(denom==%q).amount", k)).Int() + assert.Equal(t, v, got, raw) + } + assert.Equal(t, int64(600_000), cli.QueryBalance(cli.GetKeyAddr("node0"), "mytoken")) +``` + +While tests are still more or less readable, it can gets harder the longer they are. I found it helpful to add +some comments at the beginning to describe what the intention is. For example: + +```go + // scenario: + // given a chain with a custom token on genesis + // when an amount is burned + // then this is reflected in the total supply +``` diff --git a/systemtests/go.mod b/systemtests/go.mod new file mode 100644 index 000000000000..4432219ce2ae --- /dev/null +++ b/systemtests/go.mod @@ -0,0 +1,171 @@ +module cosmossdk.io/systemtests + +go 1.23 + +require ( + github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect + github.com/cosmos/cosmos-sdk v0.50.6 + github.com/cosmos/gogogateway v1.2.0 // indirect + github.com/cosmos/gogoproto v1.7.0 // indirect + github.com/cosmos/iavl v1.1.4 // indirect + github.com/dvsekhvalnov/jose2go v1.6.0 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/gorilla/mux v1.8.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect + github.com/spf13/cast v1.7.0 // indirect + github.com/spf13/cobra v1.8.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/testify v1.9.0 + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect + google.golang.org/grpc v1.68.0 +) + +require ( + cosmossdk.io/math v1.3.0 + github.com/cometbft/cometbft v0.38.15 + github.com/cometbft/cometbft/api v1.0.0-rc.1 + github.com/creachadair/tomledit v0.0.26 + github.com/tidwall/gjson v1.14.2 + github.com/tidwall/sjson v1.2.5 +) + +require ( + cosmossdk.io/api v0.7.6 // indirect + cosmossdk.io/collections v0.4.0 // indirect + cosmossdk.io/core v0.11.0 // indirect + cosmossdk.io/depinject v1.1.0 // indirect + cosmossdk.io/errors v1.0.1 // indirect + cosmossdk.io/log v1.5.0 // indirect + cosmossdk.io/store v1.1.0 // indirect + cosmossdk.io/x/tx v0.13.3-0.20240419091757-db5906b1e894 // indirect + filippo.io/edwards25519 v1.0.0 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.1 // indirect + github.com/DataDog/datadog-go v3.2.0+incompatible // indirect + github.com/DataDog/zstd v1.5.5 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/speakeasy v0.2.0 // indirect + github.com/bytedance/sonic v1.12.4 // indirect + github.com/bytedance/sonic/loader v0.2.1 // indirect + github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.1 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft-db v0.14.1 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-db v1.0.3-0.20240829004618-717cba019b33 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/ics23/go v0.11.0 // indirect + github.com/cosmos/ledger-cosmos-go v0.13.3 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect + github.com/dgraph-io/badger/v4 v4.2.0 // indirect + github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/emicklei/dot v1.6.2 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect + github.com/go-kit/kit v0.13.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect + github.com/gogo/googleapis v1.4.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/glog v1.2.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/flatbuffers v1.12.1 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/orderedcode v0.0.1 // indirect + github.com/gorilla/handlers v1.5.1 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-metrics v0.5.3 // indirect + github.com/hashicorp/go-plugin v1.6.2 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/yamux v0.1.2 // indirect + github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/huandu/skiplist v1.2.1 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/improbable-eng/grpc-web v0.15.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/klauspost/compress v1.17.9 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/linxGnu/grocksdb v1.9.3 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/minio/highwayhash v1.0.3 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mtibben/percent v0.2.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.60.1 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/rs/zerolog v1.33.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sasha-s/go-deadlock v0.3.5 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tidwall/btree v1.7.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect + go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 // indirect + go.opencensus.io v0.24.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/arch v0.12.0 // indirect + golang.org/x/crypto v0.29.0 // indirect + golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sync v0.9.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/term v0.26.0 // indirect + golang.org/x/text v0.20.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gotest.tools/v3 v3.5.1 // indirect + nhooyr.io/websocket v1.8.6 // indirect + pgregory.net/rapid v1.1.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) diff --git a/systemtests/go.sum b/systemtests/go.sum new file mode 100644 index 000000000000..3e7387681597 --- /dev/null +++ b/systemtests/go.sum @@ -0,0 +1,1032 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cosmossdk.io/api v0.7.6 h1:PC20PcXy1xYKH2KU4RMurVoFjjKkCgYRbVAD4PdqUuY= +cosmossdk.io/api v0.7.6/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= +cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= +cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= +cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= +cosmossdk.io/core v0.11.0/go.mod h1:LaTtayWBSoacF5xNzoF8tmLhehqlA9z1SWiPuNC6X1w= +cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E= +cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= +cosmossdk.io/log v1.5.0 h1:dVdzPJW9kMrnAYyMf1duqacoidB9uZIl+7c6z0mnq0g= +cosmossdk.io/log v1.5.0/go.mod h1:Tr46PUJjiUthlwQ+hxYtUtPn4D/oCZXAkYevBeh5+FI= +cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= +cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= +cosmossdk.io/store v1.1.0 h1:LnKwgYMc9BInn9PhpTFEQVbL9UK475G2H911CGGnWHk= +cosmossdk.io/store v1.1.0/go.mod h1:oZfW/4Fc/zYqu3JmQcQdUJ3fqu5vnYTn3LZFFy8P8ng= +cosmossdk.io/x/tx v0.13.3-0.20240419091757-db5906b1e894 h1:kHEvzVqpNv/9pnaEPBsgE/FMc+cVmWjSsInRufkZkpQ= +cosmossdk.io/x/tx v0.13.3-0.20240419091757-db5906b1e894/go.mod h1:Tb6/tpONmtL5qFdOMdv1pdvrtJNxcazZBoz04HB71ss= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= +filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= +github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/adlio/schema v1.3.6 h1:k1/zc2jNfeiZBA5aFTRy37jlBIuCkXCm0XmvpzCKI9I= +github.com/adlio/schema v1.3.6/go.mod h1:qkxwLgPBd1FgLRHYVCmQT/rrBr3JH38J9LjmVzWNudg= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bgentry/speakeasy v0.2.0 h1:tgObeVOf8WAvtuAX6DhJ4xks4CFNwPDZiqzGqIHE51E= +github.com/bgentry/speakeasy v0.2.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= +github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= +github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= +github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= +github.com/bytedance/sonic v1.12.4 h1:9Csb3c9ZJhfUWeMtpCDCq6BUoH5ogfDFLUgQ/jG+R0k= +github.com/bytedance/sonic v1.12.4/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.1 h1:1GgorWTqf12TA8mma4DDSbaQigE2wOgQo7iCjjJv3+E= +github.com/bytedance/sonic/loader v0.2.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw= +github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/cometbft/cometbft v0.38.15 h1:5veFd8k1uXM27PBg9sMO3hAfRJ3vbh4OmmLf6cVrqXg= +github.com/cometbft/cometbft v0.38.15/go.mod h1:+wh6ap6xctVG+JOHwbl8pPKZ0GeqdPYqISu7F4b43cQ= +github.com/cometbft/cometbft-db v0.14.1 h1:SxoamPghqICBAIcGpleHbmoPqy+crij/++eZz3DlerQ= +github.com/cometbft/cometbft-db v0.14.1/go.mod h1:KHP1YghilyGV/xjD5DP3+2hyigWx0WTp9X+0Gnx0RxQ= +github.com/cometbft/cometbft/api v1.0.0-rc.1 h1:GtdXwDGlqwHYs16A4egjwylfYOMYyEacLBrs3Zvpt7g= +github.com/cometbft/cometbft/api v1.0.0-rc.1/go.mod h1:NDFKiBBD8HJC6QQLAoUI99YhsiRZtg2+FJWfk6A6m6o= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-db v1.0.3-0.20240829004618-717cba019b33 h1:NnqmEOIzUPazzBrhGenzI1AQCBtJ0Hbnb/DDoykpko0= +github.com/cosmos/cosmos-db v1.0.3-0.20240829004618-717cba019b33/go.mod h1:Z8IXcFJ9PqKK6BIsVOB3QXtkKoqUOp1vRvPT39kOXEA= +github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= +github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= +github.com/cosmos/cosmos-sdk v0.50.6 h1:efR3MsvMHX5sxS3be+hOobGk87IzlZbSpsI2x/Vw3hk= +github.com/cosmos/cosmos-sdk v0.50.6/go.mod h1:lVkRY6cdMJ0fG3gp8y4hFrsKZqF4z7y0M2UXFb9Yt40= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= +github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= +github.com/cosmos/iavl v1.1.4 h1:Z0cVVjeQqOUp78/nWt/uhQy83vYluWlAMGQ4zbH9G34= +github.com/cosmos/iavl v1.1.4/go.mod h1:vCYmRQUJU1wwj0oRD3wMEtOM9sJNDP+GFMaXmIxZ/rU= +github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= +github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= +github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5nvue4rK+yM= +github.com/cosmos/ledger-cosmos-go v0.13.3/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creachadair/tomledit v0.0.26 h1:MoDdgHIHZ5PctBVsAZDjxdxreWUEa9ObPKTRkk5PPwA= +github.com/creachadair/tomledit v0.0.26/go.mod h1:SJi1OxKpMyR141tq1lzsbPtIg3j8TeVPM/ZftfieD7o= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= +github.com/dgraph-io/badger/v4 v4.2.0 h1:kJrlajbXXL9DFTNuhhu9yCx7JJa4qpYWxtE8BzuWsEs= +github.com/dgraph-io/badger/v4 v4.2.0/go.mod h1:qfCqhPoWDFJRx1gp5QwwyGo8xk1lbHUxvK9nK0OGAak= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= +github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= +github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= +github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= +github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= +github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= +github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= +github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYSucoNE= +github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= +github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= +github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= +github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.1 h1:dTi93MgjwErA/8idWTzIw4Y1kZsMWx35fmI2c8Rij7w= +github.com/huandu/skiplist v1.2.1/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= +github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linxGnu/grocksdb v1.9.3 h1:s1cbPcOd0cU2SKXRG1nEqCOWYAELQjdqg3RVI2MH9ik= +github.com/linxGnu/grocksdb v1.9.3/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= +github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= +github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= +github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= +github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= +github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/gjson v1.14.2 h1:6BBkirS0rAHjumnjHF6qgy5d2YAJ1TLIaFE2lzfOLqo= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 h1:qxen9oVGzDdIRP6ejyAJc760RwW4SnVDiTYTzwnXuxo= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5/go.mod h1:eW0HG9/oHQhvRCvb1/pIXW4cOvtDqeQK+XSi3TnwaXY= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +golang.org/x/arch v0.12.0 h1:UsYJhbzPYGsT0HbEdmYcqtCv8UNGvnaL561NnIUvaKg= +golang.org/x/arch v0.12.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc h1:O9NuF4s+E/PvMIy+9IUZB9znFwUIXEWSstNjek6VpVg= +golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= +google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/tests/systemtests/io_utils.go b/systemtests/io_utils.go similarity index 100% rename from tests/systemtests/io_utils.go rename to systemtests/io_utils.go diff --git a/tests/systemtests/node_utils.go b/systemtests/node_utils.go similarity index 100% rename from tests/systemtests/node_utils.go rename to systemtests/node_utils.go diff --git a/tests/systemtests/rest_cli.go b/systemtests/rest_support.go similarity index 78% rename from tests/systemtests/rest_cli.go rename to systemtests/rest_support.go index 3ad1e30dda68..aa7efd807cc4 100644 --- a/tests/systemtests/rest_cli.go +++ b/systemtests/rest_support.go @@ -12,21 +12,21 @@ import ( ) type RestTestCase struct { - name string - url string - expCode int - expOut string + Name string + Url string + ExpCode int + ExpOut string } // RunRestQueries runs given Rest testcases by making requests and // checking response with expected output -func RunRestQueries(t *testing.T, testCases []RestTestCase) { +func RunRestQueries(t *testing.T, testCases ...RestTestCase) { t.Helper() for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - resp := GetRequestWithHeaders(t, tc.url, nil, tc.expCode) - require.JSONEq(t, tc.expOut, string(resp)) + t.Run(tc.Name, func(t *testing.T) { + resp := GetRequestWithHeaders(t, tc.Url, nil, tc.ExpCode) + require.JSONEq(t, tc.ExpOut, string(resp)) }) } } @@ -34,12 +34,12 @@ func RunRestQueries(t *testing.T, testCases []RestTestCase) { // TestRestQueryIgnoreNumbers runs given rest testcases by making requests and // checking response with expected output ignoring number values // This method is used when number values in response are non-deterministic -func TestRestQueryIgnoreNumbers(t *testing.T, testCases []RestTestCase) { +func TestRestQueryIgnoreNumbers(t *testing.T, testCases ...RestTestCase) { t.Helper() for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - resp, err := testutil.GetRequest(tc.url) + t.Run(tc.Name, func(t *testing.T) { + resp, err := testutil.GetRequest(tc.Url) require.NoError(t, err) // regular expression pattern to match any numeric value in the JSON @@ -50,7 +50,7 @@ func TestRestQueryIgnoreNumbers(t *testing.T, testCases []RestTestCase) { require.NoError(t, err) // replace all numeric values in the above JSONs with `NUMBER` text - expectedJSON := r.ReplaceAllString(tc.expOut, `"NUMBER"`) + expectedJSON := r.ReplaceAllString(tc.ExpOut, `"NUMBER"`) actualJSON := r.ReplaceAllString(string(resp), `"NUMBER"`) // compare two jsons diff --git a/tests/systemtests/rpc_client.go b/systemtests/rpc_client.go similarity index 100% rename from tests/systemtests/rpc_client.go rename to systemtests/rpc_client.go diff --git a/tests/systemtests/system.go b/systemtests/system.go similarity index 96% rename from tests/systemtests/system.go rename to systemtests/system.go index 7105ff400ed1..efd69543d7cd 100644 --- a/tests/systemtests/system.go +++ b/systemtests/system.go @@ -37,6 +37,8 @@ var ( ExecBinaryUnversionedRegExp = regexp.MustCompile(`^(\w+)-?.*$`) MaxGas = 10_000_000 + // DefaultApiPort is the port for the node to interact with + DefaultApiPort = 1317 ) type TestnetInitializer interface { @@ -89,7 +91,7 @@ func NewSystemUnderTest(execBinary string, verbose bool, nodesCount int, blockTi outputDir: "./testnet", blockTime: blockTime, rpcAddr: "tcp://localhost:26657", - apiAddr: fmt.Sprintf("http://localhost:%d", apiPortStart), + apiAddr: fmt.Sprintf("http://localhost:%d", DefaultApiPort), initialNodesCount: nodesCount, outBuff: ring.New(100), errBuff: ring.New(100), @@ -99,18 +101,34 @@ func NewSystemUnderTest(execBinary string, verbose bool, nodesCount int, blockTi projectName: nameTokens[0], pids: make(map[int]struct{}, nodesCount), } - s.testnetInitializer = NewSingleHostTestnetCmdInitializer(execBinary, WorkDir, s.chainID, s.outputDir, s.initialNodesCount, s.minGasPrice, s.CommitTimeout(), s.Log) + if len(initer) > 0 { + s.testnetInitializer = initer[0] + } else { + s.testnetInitializer = NewSingleHostTestnetCmdInitializer(execBinary, WorkDir, s.chainID, s.outputDir, s.initialNodesCount, s.minGasPrice, s.CommitTimeout(), s.Log) + } return s } +// SetExecBinary sets the executable binary for the system under test. func (s *SystemUnderTest) SetExecBinary(binary string) { s.execBinary = binary } +// ExecBinary returns the path of the binary executable associated with the SystemUnderTest instance. +func (s *SystemUnderTest) ExecBinary() string { + return s.execBinary +} + +// SetTestnetInitializer sets the initializer for the testnet configuration. func (s *SystemUnderTest) SetTestnetInitializer(testnetInitializer TestnetInitializer) { s.testnetInitializer = testnetInitializer } +// TestnetInitializer returns the testnet initializer associated with the SystemUnderTest. +func (s *SystemUnderTest) TestnetInitializer() TestnetInitializer { + return s.testnetInitializer +} + // CommitTimeout returns the max time to wait for a commit. Default to 90% of block time func (s *SystemUnderTest) CommitTimeout() time.Duration { // The commit timeout is a lower bound for the block time. We try to set it to a level that allows us to reach the expected block time. @@ -762,6 +780,9 @@ func (s *SystemUnderTest) CurrentHeight() int64 { func (s *SystemUnderTest) NodesCount() int { return s.nodesCount } +func (s *SystemUnderTest) BlockTime() time.Duration { + return s.blockTime +} type Node struct { ID string diff --git a/tests/systemtests/test_runner.go b/systemtests/test_runner.go similarity index 89% rename from tests/systemtests/test_runner.go rename to systemtests/test_runner.go index e1227e9b386f..2cd4fefbf4b2 100644 --- a/tests/systemtests/test_runner.go +++ b/systemtests/test_runner.go @@ -14,8 +14,8 @@ import ( ) var ( - sut *SystemUnderTest - verbose bool + Sut *SystemUnderTest + Verbose bool execBinaryName string ) @@ -25,7 +25,7 @@ func RunTests(m *testing.M) { blockTime := flag.Duration("block-time", 1000*time.Millisecond, "block creation time") execBinary := flag.String("binary", "simd", "executable binary for server/ client side") bech32Prefix := flag.String("bech32", "cosmos", "bech32 prefix to be used with addresses") - flag.BoolVar(&verbose, "verbose", false, "verbose output") + flag.BoolVar(&Verbose, "verbose", false, "verbose output") flag.Parse() // fail fast on most common setup issue @@ -36,7 +36,7 @@ func RunTests(m *testing.M) { panic(err) } WorkDir = dir - if verbose { + if Verbose { println("Work dir: ", WorkDir) } initSDKConfig(*bech32Prefix) @@ -47,16 +47,16 @@ func RunTests(m *testing.M) { } execBinaryName = *execBinary - sut = NewSystemUnderTest(*execBinary, verbose, *nodesCount, *blockTime) - sut.SetupChain() // setup chain and keyring + Sut = NewSystemUnderTest(*execBinary, Verbose, *nodesCount, *blockTime) + Sut.SetupChain() // setup chain and keyring // run tests exitCode := m.Run() // postprocess - sut.StopChain() - if verbose || exitCode != 0 { - sut.PrintBuffer() + Sut.StopChain() + if Verbose || exitCode != 0 { + Sut.PrintBuffer() printResultFlag(exitCode == 0) } @@ -64,11 +64,11 @@ func RunTests(m *testing.M) { } func GetSystemUnderTest() *SystemUnderTest { - return sut + return Sut } func IsVerbose() bool { - return verbose + return Verbose } func GetExecutableName() string { diff --git a/tests/systemtests/testnet_init.go b/systemtests/testnet_init.go similarity index 98% rename from tests/systemtests/testnet_init.go rename to systemtests/testnet_init.go index 9033c283e43a..4f872019f889 100644 --- a/tests/systemtests/testnet_init.go +++ b/systemtests/testnet_init.go @@ -13,8 +13,8 @@ import ( "github.com/creachadair/tomledit/parser" ) -// isV2 checks if the tests run with simapp v2 -func isV2() bool { +// IsV2 checks if the tests run with simapp v2 +func IsV2() bool { buildOptions := os.Getenv("COSMOS_BUILD_OPTIONS") return strings.Contains(buildOptions, "v2") } @@ -77,7 +77,7 @@ func (s SingleHostTestnetCmdInitializer) Initialize() { "--single-host", } - if isV2() { + if IsV2() { args = append(args, "--server.minimum-gas-prices="+s.minGasPrice) } else { args = append(args, "--minimum-gas-prices="+s.minGasPrice) @@ -136,7 +136,7 @@ func (s ModifyConfigYamlInitializer) Initialize() { "--keyring-backend=test", } - if isV2() { + if IsV2() { args = append(args, "--server.minimum-gas-prices="+s.minGasPrice) } else { args = append(args, "--minimum-gas-prices="+s.minGasPrice) diff --git a/tests/systemtests/.gitignore b/tests/systemtests/.gitignore index 22873da42dfe..1769c53afc59 100644 --- a/tests/systemtests/.gitignore +++ b/tests/systemtests/.gitignore @@ -1,2 +1,3 @@ /testnet /binaries +foo/ diff --git a/tests/systemtests/account_test.go b/tests/systemtests/account_test.go index db4fed5c7126..3780a4f9a7ba 100644 --- a/tests/systemtests/account_test.go +++ b/tests/systemtests/account_test.go @@ -1,6 +1,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "fmt" "strings" "testing" @@ -18,24 +19,24 @@ func TestAccountCreation(t *testing.T) { // when accountB is sending funds to accountA, // AccountB should be created - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // add genesis account with some tokens account1Addr := cli.AddKey("account1") account2Addr := cli.AddKey("account2") require.NotEqual(t, account1Addr, account2Addr) - sut.ModifyGenesisCLI(t, + systest.Sut.ModifyGenesisCLI(t, []string{"genesis", "add-genesis-account", account1Addr, "10000000stake"}, ) - sut.StartChain(t) + systest.Sut.StartChain(t) // query account1 rsp := cli.CustomQuery("q", "auth", "account", account1Addr) assert.Equal(t, account1Addr, gjson.Get(rsp, "account.value.address").String(), rsp) rsp1 := cli.RunAndWait("tx", "bank", "send", account1Addr, account2Addr, "5000stake", "--from="+account1Addr, "--fees=1stake") - RequireTxSuccess(t, rsp1) + systest.RequireTxSuccess(t, rsp1) // query account2 assertNotFound := func(t assert.TestingT, err error, msgAndArgs ...interface{}) (ok bool) { @@ -44,7 +45,7 @@ func TestAccountCreation(t *testing.T) { _ = cli.WithRunErrorMatcher(assertNotFound).CustomQuery("q", "auth", "account", account2Addr) rsp3 := cli.RunAndWait("tx", "bank", "send", account2Addr, account1Addr, "1000stake", "--from="+account2Addr, "--fees=1stake") - RequireTxSuccess(t, rsp3) + systest.RequireTxSuccess(t, rsp3) // query account2 to make sure its created rsp4 := cli.CustomQuery("q", "auth", "account", account2Addr) @@ -54,19 +55,19 @@ func TestAccountCreation(t *testing.T) { } func TestAccountsMigration(t *testing.T) { - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) - legacyAddress := cli.GetKeyAddr(defaultSrcAddr) + legacyAddress := cli.GetKeyAddr("node0") // Create a receiver account receiverName := "receiver-account" receiverAddress := cli.AddKey(receiverName) require.NotEmpty(t, receiverAddress) - sut.ModifyGenesisCLI(t, + systest.Sut.ModifyGenesisCLI(t, []string{"genesis", "add-genesis-account", receiverAddress, "1000000stake"}, ) - sut.StartChain(t) + systest.Sut.StartChain(t) // Get pubkey pubKeyValue := cli.GetPubKeyByCustomField(legacyAddress, "address") @@ -99,7 +100,7 @@ func TestAccountsMigration(t *testing.T) { fmt.Sprintf("--account-init-msg=%s", accountInitMsg), fmt.Sprintf("--from=%s", legacyAddress), "--fees=1stake") - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // 3. Now the account should be existed, query the account Sequence rsp = cli.CustomQuery("q", "accounts", "query", legacyAddress, "cosmos.accounts.defaults.base.v1.QuerySequence", "{}") @@ -121,7 +122,7 @@ func TestAccountsMigration(t *testing.T) { transferAmount+"stake", fmt.Sprintf("--from=%s", legacyAddress), "--fees=1stake") - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // Verify the balances after the transaction newLegacyBalance := cli.QueryBalance(legacyAddress, "stake") @@ -151,5 +152,5 @@ func TestAccountsMigration(t *testing.T) { rsp = cli.RunAndWait("tx", "accounts", "execute", legacyAddress, "cosmos.accounts.defaults.base.v1.MsgSwapPubKey", swapKeyMsg, fmt.Sprintf("--from=%s", legacyAddress), "--fees=1stake") - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) } diff --git a/tests/systemtests/auth_test.go b/tests/systemtests/auth_test.go index feae7f4f1bee..b21b8507d761 100644 --- a/tests/systemtests/auth_test.go +++ b/tests/systemtests/auth_test.go @@ -3,6 +3,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "fmt" "testing" @@ -20,10 +21,10 @@ func TestAuthSignAndBroadcastTxCmd(t *testing.T) { // scenario: test auth sign and broadcast commands // given a running chain - sut.ResetChain(t) - require.GreaterOrEqual(t, sut.NodesCount(), 2) + systest.Sut.ResetChain(t) + require.GreaterOrEqual(t, systest.Sut.NodesCount(), 2) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator addresses val1Addr := cli.GetKeyAddr("node0") @@ -32,7 +33,7 @@ func TestAuthSignAndBroadcastTxCmd(t *testing.T) { val2Addr := cli.GetKeyAddr("node1") require.NotEmpty(t, val2Addr) - sut.StartChain(t) + systest.Sut.StartChain(t) var transferAmount, feeAmount int64 = 1000, 1 @@ -40,37 +41,37 @@ func TestAuthSignAndBroadcastTxCmd(t *testing.T) { // run bank tx send with --generate-only flag sendTx := generateBankSendTx(t, cli, val1Addr, val2Addr, transferAmount, feeAmount, "") - txFile := StoreTempFile(t, []byte(fmt.Sprintf("%s\n", sendTx))) + txFile := systest.StoreTempFile(t, []byte(fmt.Sprintf("%s\n", sendTx))) // query node0 account details - signTxCmd := []string{"tx", "sign", txFile.Name(), "--from=" + val1Addr, "--chain-id=" + cli.chainID} + signTxCmd := []string{"tx", "sign", txFile.Name(), "--from=" + val1Addr, "--chain-id=" + cli.ChainID()} testSignTxBroadcast(t, cli, signTxCmd, "sign tx", val1Addr, val2Addr, transferAmount, feeAmount) // test broadcast with empty public key in signed tx - rsp := cli.RunCommandWithArgs(cli.withTXFlags("tx", "sign", txFile.Name(), "--from="+val1Addr)...) + rsp := cli.RunCommandWithArgs(cli.WithTXFlags("tx", "sign", txFile.Name(), "--from="+val1Addr)...) updated, err := sjson.Set(rsp, "auth_info.signer_infos.0.public_key", nil) require.NoError(t, err) - newSignFile := StoreTempFile(t, []byte(updated)) + newSignFile := systest.StoreTempFile(t, []byte(updated)) broadcastCmd := []string{"tx", "broadcast", newSignFile.Name()} - rsp = cli.RunCommandWithArgs(cli.withTXFlags(broadcastCmd...)...) - RequireTxFailure(t, rsp) + rsp = cli.RunCommandWithArgs(cli.WithTXFlags(broadcastCmd...)...) + systest.RequireTxFailure(t, rsp) // test sign-batch tx command // generate another bank send tx with less amount newAmount := int64(100) sendTx2 := generateBankSendTx(t, cli, val1Addr, val2Addr, newAmount, feeAmount, "") - tx2File := StoreTempFile(t, []byte(fmt.Sprintf("%s\n", sendTx2))) + tx2File := systest.StoreTempFile(t, []byte(fmt.Sprintf("%s\n", sendTx2))) - signBatchCmd := []string{"tx", "sign-batch", txFile.Name(), tx2File.Name(), "--from=" + val1Addr, "--chain-id=" + cli.chainID} + signBatchCmd := []string{"tx", "sign-batch", txFile.Name(), tx2File.Name(), "--from=" + val1Addr, "--chain-id=" + cli.ChainID()} sendAmount := transferAmount + newAmount fees := feeAmount * 2 testSignTxBroadcast(t, cli, signBatchCmd, "sign-batch tx", val1Addr, val2Addr, sendAmount, fees) } -func testSignTxBroadcast(t *testing.T, cli *CLIWrapper, txCmd []string, prefix, fromAddr, toAddr string, amount, fees int64) { +func testSignTxBroadcast(t *testing.T, cli *systest.CLIWrapper, txCmd []string, prefix, fromAddr, toAddr string, amount, fees int64) { t.Helper() fromAddrBal := cli.QueryBalance(fromAddr, authTestDenom) @@ -109,21 +110,21 @@ func testSignTxBroadcast(t *testing.T, cli *CLIWrapper, txCmd []string, prefix, cmd := append(txCmd, tc.extraArgs...) // run tx sign command and verify signatures count - rsp = cli.RunCommandWithArgs(cli.withKeyringFlags(cmd...)...) + rsp = cli.RunCommandWithArgs(cli.WithKeyringFlags(cmd...)...) signatures := gjson.Get(rsp, "signatures").Array() require.Len(t, signatures, 1) - signFile := StoreTempFile(t, []byte(rsp)) + signFile := systest.StoreTempFile(t, []byte(rsp)) // validate signature - rsp = cli.RunCommandWithArgs(cli.withKeyringFlags("tx", "validate-signatures", signFile.Name(), "--from="+fromAddr, "--chain-id="+cli.chainID)...) + rsp = cli.RunCommandWithArgs(cli.WithKeyringFlags("tx", "validate-signatures", signFile.Name(), "--from="+fromAddr, "--chain-id="+cli.ChainID())...) require.Contains(t, rsp, "[OK]") // run broadcast tx command broadcastCmd := []string{"tx", "broadcast", signFile.Name()} rsp = cli.RunAndWait(broadcastCmd...) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // query balance and confirm transaction expVal1Bal := fromAddrBal - amount - fees @@ -141,10 +142,10 @@ func TestAuthQueryTxCmds(t *testing.T) { // scenario: test query tx and txs commands // given a running chain - sut.ResetChain(t) - require.GreaterOrEqual(t, sut.NodesCount(), 2) + systest.Sut.ResetChain(t) + require.GreaterOrEqual(t, systest.Sut.NodesCount(), 2) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator addresses val1Addr := cli.GetKeyAddr("node0") @@ -153,12 +154,12 @@ func TestAuthQueryTxCmds(t *testing.T) { val2Addr := cli.GetKeyAddr("node1") require.NotEmpty(t, val2Addr) - sut.StartChain(t) + systest.Sut.StartChain(t) // do a bank transfer and use it for query txs feeAmount := "2stake" rsp := cli.RunAndWait("tx", "bank", "send", val1Addr, val2Addr, "10000stake", "--fees="+feeAmount) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // parse values from above tx height := gjson.Get(rsp, "height").String() @@ -231,8 +232,8 @@ func TestAuthMultisigTxCmds(t *testing.T) { // scenario: test auth multisig related tx commands // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") @@ -248,11 +249,11 @@ func TestAuthMultisigTxCmds(t *testing.T) { acc3Addr := cli.AddKey("acc3") require.NotEqual(t, acc1Addr, acc3Addr) - out := cli.RunCommandWithArgs(cli.withKeyringFlags("keys", "add", "multi", "--multisig=acc1,acc2,acc3", "--multisig-threshold=2")...) + out := cli.RunCommandWithArgs(cli.WithKeyringFlags("keys", "add", "multi", "--multisig=acc1,acc2,acc3", "--multisig-threshold=2")...) multiAddr := gjson.Get(out, "address").String() require.NotEmpty(t, multiAddr) - sut.StartChain(t) + systest.Sut.StartChain(t) // fund multisig address some amount var initialAmount, transferAmount, feeAmount int64 = 10000, 100, 1 @@ -265,10 +266,10 @@ func TestAuthMultisigTxCmds(t *testing.T) { // run bank tx send with --generate-only flag sendTx := generateBankSendTx(t, cli, multiAddr, valAddr, transferAmount, feeAmount, "") - txFile := StoreTempFile(t, []byte(sendTx)) + txFile := systest.StoreTempFile(t, []byte(sendTx)) - signTxCmd := cli.withKeyringFlags("tx", "sign", txFile.Name(), "--multisig="+multiAddr, "--chain-id="+cli.chainID) - multiSignTxCmd := cli.withKeyringFlags("tx", "multisign", txFile.Name(), "multi", "--chain-id="+cli.chainID) + signTxCmd := cli.WithKeyringFlags("tx", "sign", txFile.Name(), "--multisig="+multiAddr, "--chain-id="+cli.ChainID()) + multiSignTxCmd := cli.WithKeyringFlags("tx", "multisign", txFile.Name(), "multi", "--chain-id="+cli.ChainID()) testMultisigTxBroadcast(t, cli, multiSigTxInput{ "multisign", @@ -287,10 +288,10 @@ func TestAuthMultisigTxCmds(t *testing.T) { // generate two send transactions in single file multiSendTx := fmt.Sprintf("%s\n%s", sendTx, sendTx) - multiTxFile := StoreTempFile(t, []byte(multiSendTx)) + multiTxFile := systest.StoreTempFile(t, []byte(multiSendTx)) - signBatchTxCmd := cli.withKeyringFlags("tx", "sign-batch", multiTxFile.Name(), "--multisig="+multiAddr, "--signature-only", "--chain-id="+cli.chainID) - multiSignBatchTxCmd := cli.withKeyringFlags("tx", "multisign-batch", multiTxFile.Name(), "multi", "--chain-id="+cli.chainID) + signBatchTxCmd := cli.WithKeyringFlags("tx", "sign-batch", multiTxFile.Name(), "--multisig="+multiAddr, "--signature-only", "--chain-id="+cli.ChainID()) + multiSignBatchTxCmd := cli.WithKeyringFlags("tx", "multisign-batch", multiTxFile.Name(), "multi", "--chain-id="+cli.ChainID()) // as we done couple of bank transactions as batch, // transferred amount will be twice @@ -311,7 +312,7 @@ func TestAuthMultisigTxCmds(t *testing.T) { }) } -func generateBankSendTx(t *testing.T, cli *CLIWrapper, fromAddr, toAddr string, amount, fees int64, memo string) string { +func generateBankSendTx(t *testing.T, cli *systest.CLIWrapper, fromAddr, toAddr string, amount, fees int64, memo string) string { t.Helper() bankSendGenCmd := []string{ @@ -322,7 +323,7 @@ func generateBankSendTx(t *testing.T, cli *CLIWrapper, fromAddr, toAddr string, "--note=" + memo, } - return cli.RunCommandWithArgs(cli.withTXFlags(bankSendGenCmd...)...) + return cli.RunCommandWithArgs(cli.WithTXFlags(bankSendGenCmd...)...) } type multiSigTxInput struct { @@ -338,7 +339,7 @@ type multiSigTxInput struct { feeAmount int64 } -func testMultisigTxBroadcast(t *testing.T, cli *CLIWrapper, i multiSigTxInput) { +func testMultisigTxBroadcast(t *testing.T, cli *systest.CLIWrapper, i multiSigTxInput) { t.Helper() multiAddrBal := cli.QueryBalance(i.multiAddr, authTestDenom) @@ -372,23 +373,23 @@ func testMultisigTxBroadcast(t *testing.T, cli *CLIWrapper, i multiSigTxInput) { cmd := i.multiSignCmd for _, acc := range tc.signingAccs { rsp := cli.RunCommandWithArgs(append(i.signCmd, "--from="+acc)...) - signFile := StoreTempFile(t, []byte(rsp)) + signFile := systest.StoreTempFile(t, []byte(rsp)) cmd = append(cmd, signFile.Name()) } rsp := cli.RunCommandWithArgs(cmd...) - multiSignFile := StoreTempFile(t, []byte(rsp)) + multiSignFile := systest.StoreTempFile(t, []byte(rsp)) // run broadcast tx command broadcastCmd := []string{"tx", "broadcast", multiSignFile.Name()} if tc.expErrMsg != "" { - rsp = cli.RunCommandWithArgs(cli.withTXFlags(broadcastCmd...)...) - RequireTxFailure(t, rsp) + rsp = cli.RunCommandWithArgs(cli.WithTXFlags(broadcastCmd...)...) + systest.RequireTxFailure(t, rsp) require.Contains(t, rsp, tc.expErrMsg) return } rsp = cli.RunAndWait(broadcastCmd...) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // query balance and confirm transaction expMultiBal := multiAddrBal - i.transferAmount - i.feeAmount @@ -406,10 +407,10 @@ func TestAuxSigner(t *testing.T) { // scenario: test tx with direct aux sign mode // given a running chain - sut.ResetChain(t) - require.GreaterOrEqual(t, sut.NodesCount(), 2) + systest.Sut.ResetChain(t) + require.GreaterOrEqual(t, systest.Sut.NodesCount(), 2) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator addresses val1Addr := cli.GetKeyAddr("node0") @@ -418,7 +419,7 @@ func TestAuxSigner(t *testing.T) { val2Addr := cli.GetKeyAddr("node1") require.NotEmpty(t, val2Addr) - sut.StartChain(t) + systest.Sut.StartChain(t) bankSendCmd := []string{"tx", "bank", "send", val1Addr, val2Addr, "10000stake", "--from=" + val1Addr} @@ -467,7 +468,7 @@ func TestAuxSigner(t *testing.T) { return false } - _ = cli.WithRunErrorMatcher(assertTxOutput).Run(cli.withTXFlags(cmd...)...) + _ = cli.WithRunErrorMatcher(assertTxOutput).Run(cli.WithTXFlags(cmd...)...) }) } } @@ -475,7 +476,7 @@ func TestAuxSigner(t *testing.T) { func TestTxEncodeandDecode(t *testing.T) { // scenario: test tx encode and decode commands - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address val1Addr := cli.GetKeyAddr("node0") @@ -483,7 +484,7 @@ func TestTxEncodeandDecode(t *testing.T) { memoText := "testmemo" sendTx := generateBankSendTx(t, cli, val1Addr, val1Addr, 100, 1, memoText) - txFile := StoreTempFile(t, []byte(sendTx)) + txFile := systest.StoreTempFile(t, []byte(sendTx)) // run encode command encodedText := cli.RunCommandWithArgs("tx", "encode", txFile.Name()) @@ -501,45 +502,45 @@ func TestTxWithFeePayer(t *testing.T) { // check tx executed ok // check fees had been deducted from feePayers balance - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose).WithRunErrorsIgnored() + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose).WithRunErrorsIgnored() // add sender and feePayer accounts senderAddr := cli.AddKey("sender") - sut.ModifyGenesisCLI(t, + systest.Sut.ModifyGenesisCLI(t, []string{"genesis", "add-genesis-account", senderAddr, "10000000stake"}, ) feePayerAddr := cli.AddKey("feePayer") - sut.ModifyGenesisCLI(t, + systest.Sut.ModifyGenesisCLI(t, []string{"genesis", "add-genesis-account", feePayerAddr, "10000000stake"}, ) - sut.StartChain(t) + systest.Sut.StartChain(t) // send a tx with FeePayer without his signature - rsp := cli.RunCommandWithArgs(cli.withTXFlags( + rsp := cli.RunCommandWithArgs(cli.WithTXFlags( "tx", "bank", "send", senderAddr, "cosmos108jsm625z3ejy63uef2ke7t67h6nukt4ty93nr", "1000stake", "--fees", "1000000stake", "--fee-payer", feePayerAddr, )...) - RequireTxFailure(t, rsp, "invalid number of signatures") + systest.RequireTxFailure(t, rsp, "invalid number of signatures") // send tx with feePayers signature - rsp = cli.RunCommandWithArgs(cli.withTXFlags( + rsp = cli.RunCommandWithArgs(cli.WithTXFlags( "tx", "bank", "send", senderAddr, "cosmos108jsm625z3ejy63uef2ke7t67h6nukt4ty93nr", "1000stake", "--fees", "1000000stake", "--fee-payer", feePayerAddr, "--generate-only", )...) - tempFile := StoreTempFile(t, []byte(rsp)) + tempFile := systest.StoreTempFile(t, []byte(rsp)) - rsp = cli.RunCommandWithArgs(cli.withTXFlags( + rsp = cli.RunCommandWithArgs(cli.WithTXFlags( "tx", "sign", tempFile.Name(), "--from", senderAddr, "--sign-mode", "amino-json", )...) - tempFile = StoreTempFile(t, []byte(rsp)) + tempFile = systest.StoreTempFile(t, []byte(rsp)) - rsp = cli.RunCommandWithArgs(cli.withTXFlags( + rsp = cli.RunCommandWithArgs(cli.WithTXFlags( "tx", "sign", tempFile.Name(), "--from", feePayerAddr, "--sign-mode", "amino-json", )...) - tempFile = StoreTempFile(t, []byte(rsp)) + tempFile = systest.StoreTempFile(t, []byte(rsp)) rsp = cli.RunAndWait([]string{"tx", "broadcast", tempFile.Name()}...) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // Query to check fee has been deducted from feePayer balance := cli.QueryBalance(feePayerAddr, authTestDenom) diff --git a/tests/systemtests/authz_test.go b/tests/systemtests/authz_test.go index f3e0ec748c8b..b8c9cb7914c0 100644 --- a/tests/systemtests/authz_test.go +++ b/tests/systemtests/authz_test.go @@ -3,6 +3,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "fmt" "net/http" "os" @@ -29,8 +30,8 @@ func TestAuthzGrantTxCmd(t *testing.T) { // scenario: test authz grant command // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address which will be used as granter granterAddr := cli.GetKeyAddr("node0") @@ -49,7 +50,7 @@ func TestAuthzGrantTxCmd(t *testing.T) { grantee6Addr := cli.AddKey("grantee6") require.NotEqual(t, granterAddr, grantee6Addr) - sut.StartChain(t) + systest.Sut.StartChain(t) // query validator operator address rsp := cli.CustomQuery("q", "staking", "validators") @@ -202,7 +203,7 @@ func TestAuthzGrantTxCmd(t *testing.T) { if tc.expErrMsg != "" { if tc.queryTx { rsp := cli.Run(cmd...) - RequireTxFailure(t, rsp) + systest.RequireTxFailure(t, rsp) require.Contains(t, rsp, tc.expErrMsg) } else { assertErr := func(_ assert.TestingT, gotErr error, gotOutputs ...interface{}) bool { @@ -216,7 +217,7 @@ func TestAuthzGrantTxCmd(t *testing.T) { return } rsp := cli.RunAndWait(cmd...) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // query granter-grantee grants resp := cli.CustomQuery("q", "authz", "grants", granterAddr, tc.grantee) @@ -237,8 +238,8 @@ func TestAuthzExecSendAuthorization(t *testing.T) { // scenario: test authz exec send authorization // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address which will be used as granter granterAddr := cli.GetKeyAddr("node0") @@ -256,12 +257,12 @@ func TestAuthzExecSendAuthorization(t *testing.T) { var initialAmount int64 = 10000000 initialBalance := fmt.Sprintf("%d%s", initialAmount, testDenom) - sut.ModifyGenesisCLI(t, + systest.Sut.ModifyGenesisCLI(t, []string{"genesis", "add-genesis-account", granteeAddr, initialBalance}, []string{"genesis", "add-genesis-account", allowedAddr, initialBalance}, []string{"genesis", "add-genesis-account", newAccount, initialBalance}, ) - sut.StartChain(t) + systest.Sut.StartChain(t) // query balances granterBal := cli.QueryBalance(granterAddr, testDenom) @@ -271,7 +272,7 @@ func TestAuthzExecSendAuthorization(t *testing.T) { require.Equal(t, initialAmount, allowedAddrBal) var spendLimitAmount int64 = 1000 - expirationTime := time.Now().Add(time.Second * 10).Unix() + expirationTime := time.Now().Add(systest.Sut.BlockTime() * 10) // test exec send authorization @@ -279,10 +280,10 @@ func TestAuthzExecSendAuthorization(t *testing.T) { rsp := cli.RunAndWait("tx", "authz", "grant", granteeAddr, "send", "--spend-limit="+fmt.Sprintf("%d%s", spendLimitAmount, testDenom), "--allow-list="+allowedAddr, - "--expiration="+fmt.Sprintf("%d", expirationTime), + "--expiration="+fmt.Sprintf("%d", expirationTime.Unix()), "--fees=1"+testDenom, "--from", granterAddr) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // reduce fees of above tx from granter balance granterBal-- @@ -329,12 +330,12 @@ func TestAuthzExecSendAuthorization(t *testing.T) { cmd := msgSendExec(t, granterAddr, tc.grantee, tc.toAddr, testDenom, tc.amount) if tc.expErrMsg != "" { rsp := cli.Run(cmd...) - RequireTxFailure(t, rsp) + systest.RequireTxFailure(t, rsp) require.Contains(t, rsp, tc.expErrMsg) return } rsp := cli.RunAndWait(cmd...) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // check granter balance equals to granterBal - transferredAmount expGranterBal := granterBal - tc.amount @@ -349,11 +350,15 @@ func TestAuthzExecSendAuthorization(t *testing.T) { } // test grant expiry - time.Sleep(time.Second * 10) + require.Eventually(t, func() bool { + resp := cli.CustomQuery("q", "authz", "grants", granterAddr, granteeAddr) + grants := gjson.Get(resp, "grants").Array() + return len(grants) == 0 + }, 10*systest.Sut.BlockTime(), 200*time.Millisecond) execSendCmd := msgSendExec(t, granterAddr, granteeAddr, allowedAddr, testDenom, 10) rsp = cli.Run(execSendCmd...) - RequireTxFailure(t, rsp) + systest.RequireTxFailure(t, rsp) require.Contains(t, rsp, "authorization not found") } @@ -369,30 +374,33 @@ func TestAuthzExecGenericAuthorization(t *testing.T) { // query balances granterBal := cli.QueryBalance(granterAddr, testDenom) - expirationTime := time.Now().Add(time.Second * 5).Unix() - execSendCmd := msgSendExec(t, granterAddr, granteeAddr, allowedAddr, testDenom, 10) + expirationTime := time.Now().Add(systest.Sut.BlockTime() * 5) // create generic authorization grant - rsp := cli.RunAndWait("tx", "authz", "grant", granteeAddr, "generic", + _ = cli.RunAndWait("tx", "authz", "grant", granteeAddr, "generic", "--msg-type="+msgSendTypeURL, - "--expiration="+fmt.Sprintf("%d", expirationTime), + "--expiration="+fmt.Sprintf("%d", expirationTime.Unix()), "--fees=1"+testDenom, "--from", granterAddr) - RequireTxSuccess(t, rsp) granterBal-- - rsp = cli.RunAndWait(execSendCmd...) - RequireTxSuccess(t, rsp) + execSendCmd := msgSendExec(t, granterAddr, granteeAddr, allowedAddr, testDenom, 10) + _ = cli.RunAndWait(execSendCmd...) // check granter balance equals to granterBal - transferredAmount expGranterBal := granterBal - 10 require.Equal(t, expGranterBal, cli.QueryBalance(granterAddr, testDenom)) - time.Sleep(time.Second * 5) - - // check grants after expiration - resp := cli.CustomQuery("q", "authz", "grants", granterAddr, granteeAddr) - grants := gjson.Get(resp, "grants").Array() - require.Len(t, grants, 0) + // wait until block after expired has passed + maxWait := max(expirationTime.Sub(time.Now()), time.Nanosecond) + 5*systest.Sut.BlockTime() + require.Eventually(t, func() bool { + resp := cli.CustomQuery("q", "authz", "grants", granterAddr, granteeAddr) + grants := gjson.Get(resp, "grants").Array() + if len(grants) != 0 { + t.Log(time.Now().Format(time.RFC3339)) + t.Log(resp) + } + return len(grants) == 0 + }, maxWait, 200*time.Millisecond) } func TestAuthzExecDelegateAuthorization(t *testing.T) { @@ -419,7 +427,7 @@ func TestAuthzExecDelegateAuthorization(t *testing.T) { "--allowed-validators="+val1Addr, "--fees=1"+testDenom, "--from", granterAddr) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // reduce fees of above tx from granter balance granterBal-- @@ -478,12 +486,12 @@ func TestAuthzExecDelegateAuthorization(t *testing.T) { cmd := append(append(execCmdArgs, execMsg.Name()), "--from="+tc.grantee) if tc.expErrMsg != "" { rsp := cli.Run(cmd...) - RequireTxFailure(t, rsp) + systest.RequireTxFailure(t, rsp) require.Contains(t, rsp, tc.expErrMsg) return } rsp := cli.RunAndWait(cmd...) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // check granter balance equals to granterBal - transferredAmount expGranterBal := granterBal - tc.amount @@ -508,7 +516,7 @@ func TestAuthzExecUndelegateAuthorization(t *testing.T) { // delegate some tokens rsp = cli.RunAndWait("tx", "staking", "delegate", val1Addr, "10000"+testDenom, "--from="+granterAddr) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // query delegated tokens count resp := cli.CustomQuery("q", "staking", "delegation", granterAddr, val1Addr) @@ -518,7 +526,7 @@ func TestAuthzExecUndelegateAuthorization(t *testing.T) { "--allowed-validators="+val1Addr, "--fees=1"+testDenom, "--from", granterAddr) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) undelegateTestCases := []struct { name string @@ -552,12 +560,12 @@ func TestAuthzExecUndelegateAuthorization(t *testing.T) { cmd := []string{"tx", "authz", "exec", execMsg.Name(), "--from=" + tc.grantee} if tc.expErrMsg != "" { rsp := cli.Run(cmd...) - RequireTxFailure(t, rsp) + systest.RequireTxFailure(t, rsp) require.Contains(t, rsp, tc.expErrMsg) return } rsp := cli.RunAndWait(cmd...) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // query delegation and check balance reduced expectedAmount := delegatedAmount - tc.amount @@ -569,7 +577,7 @@ func TestAuthzExecUndelegateAuthorization(t *testing.T) { // revoke existing grant rsp = cli.RunAndWait("tx", "authz", "revoke", granteeAddr, msgUndelegateTypeURL, "--from", granterAddr) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // check grants between granter and grantee after revoking resp = cli.CustomQuery("q", "authz", "grants", granterAddr, granteeAddr) @@ -592,14 +600,14 @@ func TestAuthzExecRedelegateAuthorization(t *testing.T) { // delegate some tokens rsp = cli.RunAndWait("tx", "staking", "delegate", val1Addr, "10000"+testDenom, "--from="+granterAddr) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // test exec redelegate authorization rsp = cli.RunAndWait("tx", "authz", "grant", granteeAddr, "redelegate", fmt.Sprintf("--allowed-validators=%s,%s", val1Addr, val2Addr), "--fees=1"+testDenom, "--from", granterAddr) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) var redelegationAmount int64 = 10 @@ -609,7 +617,7 @@ func TestAuthzExecRedelegateAuthorization(t *testing.T) { redelegateCmd := []string{"tx", "authz", "exec", execMsg.Name(), "--from=" + granteeAddr, "--gas=500000", "--fees=10stake"} rsp = cli.RunAndWait(redelegateCmd...) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // query new delegation and check balance increased resp := cli.CustomQuery("q", "staking", "delegation", granterAddr, val2Addr) @@ -618,7 +626,7 @@ func TestAuthzExecRedelegateAuthorization(t *testing.T) { // revoke all existing grants rsp = cli.RunAndWait("tx", "authz", "revoke-all", "--from", granterAddr) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // check grants after revoking resp = cli.CustomQuery("q", "authz", "grants-by-granter", granterAddr) @@ -640,28 +648,28 @@ func TestAuthzGRPCQueries(t *testing.T) { rsp := cli.RunAndWait("tx", "authz", "grant", grantee1Addr, "send", "--spend-limit=10000"+testDenom, "--from", granterAddr) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) grant1 := fmt.Sprintf(`"authorization":{"@type":"%s","spend_limit":[{"denom":"%s","amount":"10000"}],"allow_list":[]},"expiration":null`, sendAuthzTypeURL, testDenom) rsp = cli.RunAndWait("tx", "authz", "grant", grantee2Addr, "send", "--spend-limit=1000"+testDenom, "--from", granterAddr) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) grant2 := fmt.Sprintf(`"authorization":{"@type":"%s","spend_limit":[{"denom":"%s","amount":"1000"}],"allow_list":[]},"expiration":null`, sendAuthzTypeURL, testDenom) rsp = cli.RunAndWait("tx", "authz", "grant", grantee2Addr, "generic", "--msg-type="+msgVoteTypeURL, "--from", granterAddr) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) grant3 := fmt.Sprintf(`"authorization":{"@type":"%s","msg":"%s"},"expiration":null`, genericAuthzTypeURL, msgVoteTypeURL) rsp = cli.RunAndWait("tx", "authz", "grant", grantee2Addr, "generic", "--msg-type="+msgDelegateTypeURL, "--from", grantee1Addr) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) grant4 := fmt.Sprintf(`"authorization":{"@type":"%s","msg":"%s"},"expiration":null`, genericAuthzTypeURL, msgDelegateTypeURL) - baseurl := sut.APIAddress() + baseurl := systest.Sut.APIAddress() // test query grant grpc endpoint grantURL := baseurl + "/cosmos/authz/v1beta1/grants?granter=%s&grantee=%s&msg_type_url=%s" @@ -671,7 +679,7 @@ func TestAuthzGRPCQueries(t *testing.T) { invalidMsgTypeOutput := `{"code":2, "message":"codespace authz code 2: authorization not found: authorization not found for invalidMsg type", "details":[]}` expGrantOutput := fmt.Sprintf(`{"grants":[{%s}],"pagination":null}`, grant1) - grantTestCases := []RestTestCase{ + grantTestCases := []systest.RestTestCase{ { "invalid granter address", fmt.Sprintf(grantURL, "invalid_granter", grantee1Addr, msgSendTypeURL), @@ -710,12 +718,12 @@ func TestAuthzGRPCQueries(t *testing.T) { }, } - RunRestQueries(t, grantTestCases) + systest.RunRestQueries(t, grantTestCases...) // test query grants grpc endpoint grantsURL := baseurl + "/cosmos/authz/v1beta1/grants?granter=%s&grantee=%s" - grantsTestCases := []RestTestCase{ + grantsTestCases := []systest.RestTestCase{ { "expect single grant", fmt.Sprintf(grantsURL, granterAddr, grantee1Addr), @@ -748,7 +756,7 @@ func TestAuthzGRPCQueries(t *testing.T) { }, } - RunRestQueries(t, grantsTestCases) + systest.RunRestQueries(t, grantsTestCases...) // test query grants by granter grpc endpoint grantsByGranterURL := baseurl + "/cosmos/authz/v1beta1/grants/granter/%s" @@ -757,7 +765,7 @@ func TestAuthzGRPCQueries(t *testing.T) { granterQueryOutput := fmt.Sprintf(`{"grants":[{"granter":"%s","grantee":"%s",%s}],"pagination":{"next_key":null,"total":"1"}}`, grantee1Addr, grantee2Addr, grant4) - granterTestCases := []RestTestCase{ + granterTestCases := []systest.RestTestCase{ { "invalid granter account address", fmt.Sprintf(grantsByGranterURL, "invalid address"), @@ -778,13 +786,13 @@ func TestAuthzGRPCQueries(t *testing.T) { }, } - RunRestQueries(t, granterTestCases) + systest.RunRestQueries(t, granterTestCases...) // test query grants by grantee grpc endpoint grantsByGranteeURL := baseurl + "/cosmos/authz/v1beta1/grants/grantee/%s" grantee1GrantsOutput := fmt.Sprintf(`{"grants":[{"granter":"%s","grantee":"%s",%s}],"pagination":{"next_key":null,"total":"1"}}`, granterAddr, grantee1Addr, grant1) - granteeTestCases := []RestTestCase{ + granteeTestCases := []systest.RestTestCase{ { "invalid grantee account address", fmt.Sprintf(grantsByGranteeURL, "invalid address"), @@ -805,16 +813,16 @@ func TestAuthzGRPCQueries(t *testing.T) { }, } - RunRestQueries(t, granteeTestCases) + systest.RunRestQueries(t, granteeTestCases...) } -func setupChain(t *testing.T) (*CLIWrapper, string, string) { +func setupChain(t *testing.T) (*systest.CLIWrapper, string, string) { t.Helper() - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) - require.GreaterOrEqual(t, cli.nodesCount, 2) + require.GreaterOrEqual(t, systest.Sut.NodesCount(), 2) // get validators' address which will be used as granter and grantee granterAddr := cli.GetKeyAddr("node0") @@ -822,7 +830,7 @@ func setupChain(t *testing.T) (*CLIWrapper, string, string) { granteeAddr := cli.GetKeyAddr("node1") require.NotEmpty(t, granteeAddr) - sut.StartChain(t) + systest.Sut.StartChain(t) return cli, granterAddr, granteeAddr } diff --git a/tests/systemtests/bank_test.go b/tests/systemtests/bank_test.go index d776bc06a874..ddf8933718ed 100644 --- a/tests/systemtests/bank_test.go +++ b/tests/systemtests/bank_test.go @@ -3,6 +3,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "fmt" "net/http" "testing" @@ -17,8 +18,8 @@ func TestBankSendTxCmd(t *testing.T) { // scenario: test bank send command // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") @@ -27,7 +28,7 @@ func TestBankSendTxCmd(t *testing.T) { // add new key receiverAddr := cli.AddKey("account1") denom := "stake" - sut.StartChain(t) + systest.Sut.StartChain(t) // query validator balance and make sure it has enough balance var transferAmount int64 = 1000 @@ -40,7 +41,7 @@ func TestBankSendTxCmd(t *testing.T) { rsp := cli.Run(append(bankSendCmdArgs, "--fees=1stake")...) txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) // check valaddr balance equals to valBalance-(transferedAmount+feeAmount) require.Equal(t, valBalance-(transferAmount+1), cli.QueryBalance(valAddr, denom)) // check receiver balance equals to transferAmount @@ -50,7 +51,7 @@ func TestBankSendTxCmd(t *testing.T) { insufficientCmdArgs := bankSendCmdArgs[0 : len(bankSendCmdArgs)-1] insufficientCmdArgs = append(insufficientCmdArgs, fmt.Sprintf("%d%s", valBalance, denom), "--fees=10stake") rsp = cli.Run(insufficientCmdArgs...) - RequireTxFailure(t, rsp) + systest.RequireTxFailure(t, rsp) require.Contains(t, rsp, "insufficient funds") // test tx bank send with unauthorized signature @@ -58,13 +59,12 @@ func TestBankSendTxCmd(t *testing.T) { require.Len(t, gotOutputs, 1) code := gjson.Get(gotOutputs[0].(string), "code") require.True(t, code.Exists()) - require.Greater(t, code.Int(), int64(0)) + require.Greater(t, code.Int(), int64(0), gotOutputs[0]) return false } - invalidCli := cli - invalidCli.chainID = cli.chainID + "a" // set invalid chain-id + invalidCli := cli.WithChainID(cli.ChainID() + "a") // set invalid chain-id rsp = invalidCli.WithRunErrorMatcher(assertUnauthorizedErr).Run(bankSendCmdArgs...) - RequireTxFailure(t, rsp) + systest.RequireTxFailure(t, rsp) // test tx bank send generate only assertGenOnlyOutput := func(_ assert.TestingT, gotErr error, gotOutputs ...interface{}) bool { @@ -100,8 +100,8 @@ func TestBankMultiSendTxCmd(t *testing.T) { // scenario: test bank multi-send command // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // add genesis account with some tokens account1Addr := cli.AddKey("account1") account2Addr := cli.AddKey("account2") @@ -111,11 +111,11 @@ func TestBankMultiSendTxCmd(t *testing.T) { denom := "stake" var initialAmount int64 = 10000000 initialBalance := fmt.Sprintf("%d%s", initialAmount, denom) - sut.ModifyGenesisCLI(t, + systest.Sut.ModifyGenesisCLI(t, []string{"genesis", "add-genesis-account", account1Addr, initialBalance}, []string{"genesis", "add-genesis-account", account2Addr, initialBalance}, ) - sut.StartChain(t) + systest.Sut.StartChain(t) // query accounts balances account1Bal := cli.QueryBalance(account1Addr, denom) @@ -172,7 +172,7 @@ func TestBankMultiSendTxCmd(t *testing.T) { rsp := cli.Run(tc.cmdArgs...) txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) // check account1 balance equals to account1Bal - transferredAmount*no_of_accounts - fees expAcc1Balance := account1Bal - (1000 * 2) - 1 require.Equal(t, expAcc1Balance, cli.QueryBalance(account1Addr, denom)) @@ -193,8 +193,8 @@ func TestBankGRPCQueries(t *testing.T) { // scenario: test bank grpc gateway queries // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // update bank denom metadata in genesis atomDenomMetadata := `{"description":"The native staking token of the Cosmos Hub.","denom_units":[{"denom":"uatom","exponent":0,"aliases":["microatom"]},{"denom":"atom","exponent":6,"aliases":["ATOM"]}],"base":"uatom","display":"atom","name":"Cosmos Hub Atom","symbol":"ATOM","uri":"","uri_hash":""}` @@ -202,7 +202,7 @@ func TestBankGRPCQueries(t *testing.T) { bankDenomMetadata := fmt.Sprintf("[%s,%s]", atomDenomMetadata, ethDenomMetadata) - sut.ModifyGenesisJSON(t, func(genesis []byte) []byte { + systest.Sut.ModifyGenesisJSON(t, func(genesis []byte) []byte { state, err := sjson.SetRawBytes(genesis, "app_state.bank.denom_metadata", []byte(bankDenomMetadata)) require.NoError(t, err) return state @@ -212,13 +212,13 @@ func TestBankGRPCQueries(t *testing.T) { account1Addr := cli.AddKey("account1") newDenom := "newdenom" initialAmount := "10000000" - sut.ModifyGenesisCLI(t, + systest.Sut.ModifyGenesisCLI(t, []string{"genesis", "add-genesis-account", account1Addr, "10000000stake," + initialAmount + newDenom}, ) // start chain - sut.StartChain(t) - baseurl := sut.APIAddress() + systest.Sut.StartChain(t) + baseurl := systest.Sut.APIAddress() // test supply grpc endpoint supplyUrl := baseurl + "/cosmos/bank/v1beta1/supply" @@ -229,7 +229,7 @@ func TestBankGRPCQueries(t *testing.T) { bogusDenomOutput := `{"denom":"foobar","amount":"0"}` blockHeightHeader := "x-cosmos-block-height" - blockHeight := sut.CurrentHeight() + blockHeight := systest.Sut.CurrentHeight() supplyTestCases := []struct { name string @@ -275,14 +275,14 @@ func TestBankGRPCQueries(t *testing.T) { for _, tc := range supplyTestCases { t.Run(tc.name, func(t *testing.T) { - resp := GetRequestWithHeaders(t, tc.url, tc.headers, tc.expHttpCode) + resp := systest.GetRequestWithHeaders(t, tc.url, tc.headers, tc.expHttpCode) require.Contains(t, string(resp), tc.expOut) }) } // test denom metadata endpoint denomMetadataUrl := baseurl + "/cosmos/bank/v1beta1/denoms_metadata" - dmTestCases := []RestTestCase{ + dmTestCases := []systest.RestTestCase{ { "test GRPC client metadata", denomMetadataUrl, @@ -303,13 +303,13 @@ func TestBankGRPCQueries(t *testing.T) { }, } - RunRestQueries(t, dmTestCases) + systest.RunRestQueries(t, dmTestCases...) // test bank balances endpoint balanceUrl := baseurl + "/cosmos/bank/v1beta1/balances/" allBalancesOutput := `{"balances":[` + specificDenomOutput + `,{"denom":"stake","amount":"10000000"}],"pagination":{"next_key":null,"total":"2"}}` - balanceTestCases := []RestTestCase{ + balanceTestCases := []systest.RestTestCase{ { "test GRPC total account balance", balanceUrl + account1Addr, @@ -330,5 +330,5 @@ func TestBankGRPCQueries(t *testing.T) { }, } - RunRestQueries(t, balanceTestCases) + systest.RunRestQueries(t, balanceTestCases...) } diff --git a/tests/systemtests/bankv2_test.go b/tests/systemtests/bankv2_test.go index b753ee0be430..1358aacf9943 100644 --- a/tests/systemtests/bankv2_test.go +++ b/tests/systemtests/bankv2_test.go @@ -3,6 +3,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "fmt" "testing" @@ -12,14 +13,14 @@ import ( func TestBankV2SendTxCmd(t *testing.T) { // Currently only run with app v2 - if !isV2() { + if !systest.IsV2() { t.Skip() } // scenario: test bank send command // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := gjson.Get(cli.Keys("keys", "list"), "1.address").String() @@ -28,7 +29,7 @@ func TestBankV2SendTxCmd(t *testing.T) { // add new key receiverAddr := cli.AddKey("account1") denom := "stake" - sut.StartChain(t) + systest.Sut.StartChain(t) // query validator balance and make sure it has enough balance var transferAmount int64 = 1000 @@ -43,7 +44,7 @@ func TestBankV2SendTxCmd(t *testing.T) { rsp := cli.Run(append(bankSendCmdArgs, "--fees=1stake")...) txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) // Check balance after send valRaw := cli.CustomQuery("q", "bankv2", "balance", valAddr, denom) diff --git a/tests/systemtests/circuit_test.go b/tests/systemtests/circuit_test.go index e6b660e22eca..ad63c8cebbc2 100644 --- a/tests/systemtests/circuit_test.go +++ b/tests/systemtests/circuit_test.go @@ -3,6 +3,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "encoding/json" "fmt" "strings" @@ -19,10 +20,10 @@ func TestCircuitCommands(t *testing.T) { // scenario: test circuit commands // given a running chain - sut.ResetChain(t) - require.GreaterOrEqual(t, sut.NodesCount(), 2) + systest.Sut.ResetChain(t) + require.GreaterOrEqual(t, systest.Sut.NodesCount(), 2) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator addresses superAdmin := cli.GetKeyAddr("node0") @@ -33,13 +34,14 @@ func TestCircuitCommands(t *testing.T) { // short voting period // update expedited voting period to avoid validation error - sut.ModifyGenesisJSON( + votingPeriod := 5 * time.Second + systest.Sut.ModifyGenesisJSON( t, - SetGovVotingPeriod(t, time.Second*8), - SetGovExpeditedVotingPeriod(t, time.Second*7), + systest.SetGovVotingPeriod(t, votingPeriod), + systest.SetGovExpeditedVotingPeriod(t, votingPeriod-time.Second), ) - sut.StartChain(t) + systest.Sut.StartChain(t) allMsgsAcc := cli.AddKey("allMsgsAcc") require.NotEmpty(t, allMsgsAcc) @@ -51,11 +53,11 @@ func TestCircuitCommands(t *testing.T) { var amount int64 = 100000 denom := "stake" rsp := cli.FundAddress(allMsgsAcc, fmt.Sprintf("%d%s", amount, denom)) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) require.Equal(t, amount, cli.QueryBalance(allMsgsAcc, denom)) rsp = cli.FundAddress(someMsgsAcc, fmt.Sprintf("%d%s", amount, denom)) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) require.Equal(t, amount, cli.QueryBalance(someMsgsAcc, denom)) // query gov module account address @@ -77,24 +79,23 @@ func TestCircuitCommands(t *testing.T) { "deposit": "10000000stake", "summary": "A short summary of my proposal" }`, govModAddr, superAdmin) - proposalFile := StoreTempFile(t, []byte(validProposal)) + proposalFile := systest.StoreTempFile(t, []byte(validProposal)) rsp = cli.RunAndWait("tx", "gov", "submit-proposal", proposalFile.Name(), "--from="+superAdmin) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // vote to proposal from two validators rsp = cli.RunAndWait("tx", "gov", "vote", "1", "yes", "--from="+superAdmin) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) rsp = cli.RunAndWait("tx", "gov", "vote", "1", "yes", "--from="+superAdmin2) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // wait for proposal to pass - time.Sleep(time.Second * 8) - - rsp = cli.CustomQuery("q", "circuit", "accounts") - - level := gjson.Get(rsp, fmt.Sprintf("accounts.#(address==%s).permissions.level", superAdmin)).String() - require.Equal(t, "LEVEL_SUPER_ADMIN", level) + require.Eventually(t, func() bool { + rsp = cli.CustomQuery("q", "circuit", "accounts") + level := gjson.Get(rsp, fmt.Sprintf("accounts.#(address==%s).permissions.level", superAdmin)).String() + return "LEVEL_SUPER_ADMIN" == level + }, votingPeriod+systest.Sut.BlockTime(), 200*time.Millisecond) authorizeTestCases := []struct { name string @@ -133,7 +134,7 @@ func TestCircuitCommands(t *testing.T) { permissionJSON = fmt.Sprintf(`{"level":%d,"limit_type_urls":["%s"]}`, tc.level, strings.Join(tc.limtTypeURLs[:], `","`)) } rsp = cli.RunAndWait("tx", "circuit", "authorize", tc.address, permissionJSON, "--from="+superAdmin) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // query account permissions rsp = cli.CustomQuery("q", "circuit", "account", tc.address) @@ -157,7 +158,7 @@ func TestCircuitCommands(t *testing.T) { testCircuitTxCommand(t, cli, "reset", superAdmin, superAdmin2, allMsgsAcc, someMsgsAcc) } -func testCircuitTxCommand(t *testing.T, cli *CLIWrapper, txType, superAdmin, superAdmin2, allMsgsAcc, someMsgsAcc string) { +func testCircuitTxCommand(t *testing.T, cli *systest.CLIWrapper, txType, superAdmin, superAdmin2, allMsgsAcc, someMsgsAcc string) { t.Helper() disableTestCases := []struct { @@ -206,7 +207,7 @@ func testCircuitTxCommand(t *testing.T, cli *CLIWrapper, txType, superAdmin, sup cmd := []string{"tx", "circuit", txType, "--from=" + tc.fromAddr} cmd = append(cmd, tc.disableMsgs...) rsp := cli.RunAndWait(cmd...) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // execute given type transaction rsp = cli.CustomQuery("q", "circuit", "disabled-list") @@ -228,15 +229,16 @@ func testCircuitTxCommand(t *testing.T, cli *CLIWrapper, txType, superAdmin, sup // test given msg transaction to confirm for _, tx := range tc.executeTxs { tx = append(tx, "--fees=2stake") - rsp = cli.RunCommandWithArgs(cli.withTXFlags(tx...)...) + rsp = cli.RunCommandWithArgs(cli.WithTXFlags(tx...)...) if txType == "disable" { - RequireTxFailure(t, rsp) + systest.RequireTxFailure(t, rsp) require.Contains(t, gjson.Get(rsp, "raw_log").String(), "tx type not allowed") - } else { - RequireTxSuccess(t, rsp) + continue } + systest.RequireTxSuccess(t, rsp) // wait for sometime to avoid sequence error - time.Sleep(time.Second * 2) + _, found := cli.AwaitTxCommitted(rsp) + require.True(t, found) } }) } diff --git a/tests/systemtests/cometbft_client_test.go b/tests/systemtests/cometbft_client_test.go index cee97baa0c61..bab67ff2378b 100644 --- a/tests/systemtests/cometbft_client_test.go +++ b/tests/systemtests/cometbft_client_test.go @@ -4,6 +4,7 @@ package systemtests import ( "context" + systest "cosmossdk.io/systemtests" "fmt" "net/http" "net/url" @@ -21,79 +22,78 @@ import ( ) func TestQueryNodeInfo(t *testing.T) { - baseurl := fmt.Sprintf("http://localhost:%d", apiPortStart) - sut.ResetChain(t) - sut.StartChain(t) + systest.Sut.ResetChain(t) + systest.Sut.StartChain(t) - qc := cmtservice.NewServiceClient(sut.RPCClient(t)) + qc := cmtservice.NewServiceClient(systest.Sut.RPCClient(t)) res, err := qc.GetNodeInfo(context.Background(), &cmtservice.GetNodeInfoRequest{}) assert.NoError(t, err) - v := NewCLIWrapper(t, sut, true).Version() + v := systest.NewCLIWrapper(t, systest.Sut, true).Version() assert.Equal(t, res.ApplicationVersion.Version, v) + baseurl := systest.Sut.APIAddress() // TODO: we should be adding a way to distinguish a v2. Eventually we should skip some v2 system depending on the consensus engine we want to test - restRes := GetRequest(t, mustV(url.JoinPath(baseurl, "/cosmos/base/tendermint/v1beta1/node_info"))) + restRes := systest.GetRequest(t, must(url.JoinPath(baseurl, "/cosmos/base/tendermint/v1beta1/node_info"))) assert.NoError(t, err) assert.Equal(t, gjson.GetBytes(restRes, "application_version.version").String(), res.ApplicationVersion.Version) } func TestQuerySyncing(t *testing.T) { - baseurl := fmt.Sprintf("http://localhost:%d", apiPortStart) - sut.ResetChain(t) - sut.StartChain(t) + systest.Sut.ResetChain(t) + systest.Sut.StartChain(t) - qc := cmtservice.NewServiceClient(sut.RPCClient(t)) + qc := cmtservice.NewServiceClient(systest.Sut.RPCClient(t)) res, err := qc.GetSyncing(context.Background(), &cmtservice.GetSyncingRequest{}) assert.NoError(t, err) - restRes := GetRequest(t, mustV(url.JoinPath(baseurl, "/cosmos/base/tendermint/v1beta1/syncing"))) + baseurl := systest.Sut.APIAddress() + restRes := systest.GetRequest(t, must(url.JoinPath(baseurl, "/cosmos/base/tendermint/v1beta1/syncing"))) assert.Equal(t, gjson.GetBytes(restRes, "syncing").Bool(), res.Syncing) } func TestQueryLatestBlock(t *testing.T) { - baseurl := fmt.Sprintf("http://localhost:%d", apiPortStart) - sut.ResetChain(t) - sut.StartChain(t) + systest.Sut.ResetChain(t) + systest.Sut.StartChain(t) - qc := cmtservice.NewServiceClient(sut.RPCClient(t)) + qc := cmtservice.NewServiceClient(systest.Sut.RPCClient(t)) res, err := qc.GetLatestBlock(context.Background(), &cmtservice.GetLatestBlockRequest{}) assert.NoError(t, err) assert.Contains(t, res.SdkBlock.Header.ProposerAddress, "cosmosvalcons") - _ = GetRequest(t, mustV(url.JoinPath(baseurl, "/cosmos/base/tendermint/v1beta1/blocks/latest"))) + baseurl := systest.Sut.APIAddress() + _ = systest.GetRequest(t, must(url.JoinPath(baseurl, "/cosmos/base/tendermint/v1beta1/blocks/latest"))) } func TestQueryBlockByHeight(t *testing.T) { - baseurl := fmt.Sprintf("http://localhost:%d", apiPortStart) - sut.ResetChain(t) - sut.StartChain(t) + systest.Sut.ResetChain(t) + systest.Sut.StartChain(t) - sut.AwaitNBlocks(t, 2, time.Second*25) + systest.Sut.AwaitNBlocks(t, 2, time.Second*25) - qc := cmtservice.NewServiceClient(sut.RPCClient(t)) + qc := cmtservice.NewServiceClient(systest.Sut.RPCClient(t)) res, err := qc.GetBlockByHeight(context.Background(), &cmtservice.GetBlockByHeightRequest{Height: 2}) assert.NoError(t, err) assert.Equal(t, res.SdkBlock.Header.Height, int64(2)) assert.Contains(t, res.SdkBlock.Header.ProposerAddress, "cosmosvalcons") - restRes := GetRequest(t, mustV(url.JoinPath(baseurl, "/cosmos/base/tendermint/v1beta1/blocks/2"))) + baseurl := systest.Sut.APIAddress() + restRes := systest.GetRequest(t, must(url.JoinPath(baseurl, "/cosmos/base/tendermint/v1beta1/blocks/2"))) assert.Equal(t, gjson.GetBytes(restRes, "sdk_block.header.height").Int(), int64(2)) assert.Contains(t, gjson.GetBytes(restRes, "sdk_block.header.proposer_address").String(), "cosmosvalcons") } func TestQueryLatestValidatorSet(t *testing.T) { - if sut.NodesCount() < 2 { + if systest.Sut.NodesCount() < 2 { t.Skip("not enough nodes") return } - baseurl := fmt.Sprintf("http://localhost:%d", apiPortStart) - sut.ResetChain(t) - sut.StartChain(t) + systest.Sut.ResetChain(t) + systest.Sut.StartChain(t) - vals := sut.RPCClient(t).Validators() + vals := systest.Sut.RPCClient(t).Validators() - qc := cmtservice.NewServiceClient(sut.RPCClient(t)) + qc := cmtservice.NewServiceClient(systest.Sut.RPCClient(t)) res, err := qc.GetLatestValidatorSet(context.Background(), &cmtservice.GetLatestValidatorSetRequest{ Pagination: nil, }) @@ -108,17 +108,18 @@ func TestQueryLatestValidatorSet(t *testing.T) { assert.NoError(t, err) assert.Equal(t, len(res.Validators), 2) - restRes := GetRequest(t, fmt.Sprintf("%s/cosmos/base/tendermint/v1beta1/validatorsets/latest?pagination.offset=%d&pagination.limit=%d", baseurl, 0, 2)) + baseurl := systest.Sut.APIAddress() + restRes := systest.GetRequest(t, fmt.Sprintf("%s/cosmos/base/tendermint/v1beta1/validatorsets/latest?pagination.offset=%d&pagination.limit=%d", baseurl, 0, 2)) assert.Equal(t, len(gjson.GetBytes(restRes, "validators").Array()), 2) } func TestLatestValidatorSet(t *testing.T) { - sut.ResetChain(t) - sut.StartChain(t) + systest.Sut.ResetChain(t) + systest.Sut.StartChain(t) - vals := sut.RPCClient(t).Validators() + vals := systest.Sut.RPCClient(t).Validators() - qc := cmtservice.NewServiceClient(sut.RPCClient(t)) + qc := cmtservice.NewServiceClient(systest.Sut.RPCClient(t)) testCases := []struct { name string req *cmtservice.GetLatestValidatorSetRequest @@ -147,12 +148,12 @@ func TestLatestValidatorSet(t *testing.T) { } func TestLatestValidatorSet_GRPCGateway(t *testing.T) { - sut.ResetChain(t) - sut.StartChain(t) + systest.Sut.ResetChain(t) + systest.Sut.StartChain(t) - baseurl := fmt.Sprintf("http://localhost:%d", apiPortStart) + baseurl := systest.Sut.APIAddress() - vals := sut.RPCClient(t).Validators() + vals := systest.Sut.RPCClient(t).Validators() testCases := []struct { name string @@ -167,23 +168,23 @@ func TestLatestValidatorSet_GRPCGateway(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { if tc.expErr { - rsp := GetRequestWithHeaders(t, baseurl+tc.url, nil, http.StatusBadRequest) + rsp := systest.GetRequestWithHeaders(t, baseurl+tc.url, nil, http.StatusBadRequest) errMsg := gjson.GetBytes(rsp, "message").String() assert.Contains(t, errMsg, tc.expErrMsg) return } - rsp := GetRequest(t, baseurl+tc.url) + rsp := systest.GetRequest(t, baseurl+tc.url) assert.Equal(t, len(vals), int(gjson.GetBytes(rsp, "pagination.total").Int())) }) } } func TestValidatorSetByHeight(t *testing.T) { - sut.ResetChain(t) - sut.StartChain(t) + systest.Sut.ResetChain(t) + systest.Sut.StartChain(t) - qc := cmtservice.NewServiceClient(sut.RPCClient(t)) - vals := sut.RPCClient(t).Validators() + qc := cmtservice.NewServiceClient(systest.Sut.RPCClient(t)) + vals := systest.Sut.RPCClient(t).Validators() testCases := []struct { name string @@ -211,13 +212,13 @@ func TestValidatorSetByHeight(t *testing.T) { } func TestValidatorSetByHeight_GRPCRestGateway(t *testing.T) { - sut.ResetChain(t) - sut.StartChain(t) + systest.Sut.ResetChain(t) + systest.Sut.StartChain(t) - vals := sut.RPCClient(t).Validators() + vals := systest.Sut.RPCClient(t).Validators() - baseurl := sut.APIAddress() - block := sut.AwaitNextBlock(t, time.Second*3) + baseurl := systest.Sut.APIAddress() + block := systest.Sut.AwaitNextBlock(t, time.Second*3) testCases := []struct { name string url string @@ -232,7 +233,7 @@ func TestValidatorSetByHeight_GRPCRestGateway(t *testing.T) { } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - rsp := GetRequestWithHeaders(t, tc.url, nil, tc.expHttpCode) + rsp := systest.GetRequestWithHeaders(t, tc.url, nil, tc.expHttpCode) if tc.expErr { errMsg := gjson.GetBytes(rsp, "message").String() assert.Contains(t, errMsg, tc.expErrMsg) @@ -244,9 +245,9 @@ func TestValidatorSetByHeight_GRPCRestGateway(t *testing.T) { } func TestABCIQuery(t *testing.T) { - sut.StartChain(t) + systest.Sut.StartChain(t) - qc := cmtservice.NewServiceClient(sut.RPCClient(t)) + qc := cmtservice.NewServiceClient(systest.Sut.RPCClient(t)) cdc := codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) testCases := []struct { name string @@ -328,3 +329,10 @@ func TestABCIQuery(t *testing.T) { }) } } + +func must[T any](r T, err error) T { + if err != nil { + panic(err) + } + return r +} diff --git a/tests/systemtests/distribution_test.go b/tests/systemtests/distribution_test.go index e074b89e7cf3..13bf54e11f27 100644 --- a/tests/systemtests/distribution_test.go +++ b/tests/systemtests/distribution_test.go @@ -3,11 +3,11 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "fmt" "net/http" "os" "path/filepath" - "regexp" "strings" "testing" @@ -25,18 +25,18 @@ func TestWithdrawAllRewardsCmd(t *testing.T) { // scenario: test distribution withdraw all rewards command // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) newAddr := cli.AddKey("newAddr") require.NotEmpty(t, newAddr) var initialAmount int64 = 10000000 initialBalance := fmt.Sprintf("%d%s", initialAmount, distrTestDenom) - sut.ModifyGenesisCLI(t, + systest.Sut.ModifyGenesisCLI(t, []string{"genesis", "add-genesis-account", newAddr, initialBalance}, ) - sut.StartChain(t) + systest.Sut.StartChain(t) // query balance newAddrBal := cli.QueryBalance(newAddr, distrTestDenom) @@ -54,11 +54,11 @@ func TestWithdrawAllRewardsCmd(t *testing.T) { // delegate tokens to validator1 rsp = cli.RunAndWait("tx", "staking", "delegate", val1Addr, delegation, "--from="+newAddr, "--fees=1"+distrTestDenom) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // delegate tokens to validator2 rsp = cli.RunAndWait("tx", "staking", "delegate", val2Addr, delegation, "--from="+newAddr, "--fees=1"+distrTestDenom) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // check updated balance: newAddrBal - delegatedBal - fees expBal := newAddrBal - (delegationAmount * 2) - 2 @@ -101,32 +101,32 @@ func TestWithdrawAllRewardsCmd(t *testing.T) { // test withdraw-all-rewards transaction rsp = cli.RunAndWait(withdrawCmdArgs...) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) } func TestDistrValidatorGRPCQueries(t *testing.T) { // scenario: test distribution validator grpc gateway queries // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) valOperAddr := cli.GetKeyAddrPrefix("node0", "val") require.NotEmpty(t, valOperAddr) - sut.StartChain(t) + systest.Sut.StartChain(t) - sut.AwaitNBlocks(t, 3) + systest.Sut.AwaitNBlocks(t, 3) - baseurl := sut.APIAddress() + baseurl := systest.Sut.APIAddress() expectedAmountOutput := fmt.Sprintf(`{"denom":"%s","amount":"203.105000000000000000"}`, distrTestDenom) // test params grpc endpoint paramsURL := baseurl + "/cosmos/distribution/v1beta1/params" - paramsTestCases := []RestTestCase{ + paramsTestCases := []systest.RestTestCase{ { "gRPC request params", paramsURL, @@ -134,13 +134,13 @@ func TestDistrValidatorGRPCQueries(t *testing.T) { `{"params":{"community_tax":"0.020000000000000000","base_proposer_reward":"0.000000000000000000","bonus_proposer_reward":"0.000000000000000000","withdraw_addr_enabled":true}}`, }, } - RunRestQueries(t, paramsTestCases) + systest.RunRestQueries(t, paramsTestCases...) // test validator distribution info grpc endpoint validatorsURL := baseurl + `/cosmos/distribution/v1beta1/validators/%s` validatorsOutput := fmt.Sprintf(`{"operator_address":"%s","self_bond_rewards":[],"commission":[%s]}`, valAddr, expectedAmountOutput) - validatorsTestCases := []RestTestCase{ + validatorsTestCases := []systest.RestTestCase{ { "gRPC request validator with valid validator address", fmt.Sprintf(validatorsURL, valOperAddr), @@ -148,12 +148,12 @@ func TestDistrValidatorGRPCQueries(t *testing.T) { validatorsOutput, }, } - TestRestQueryIgnoreNumbers(t, validatorsTestCases) + systest.TestRestQueryIgnoreNumbers(t, validatorsTestCases...) // test outstanding rewards grpc endpoint outstandingRewardsURL := baseurl + `/cosmos/distribution/v1beta1/validators/%s/outstanding_rewards` - rewardsTestCases := []RestTestCase{ + rewardsTestCases := []systest.RestTestCase{ { "gRPC request outstanding rewards with valid validator address", fmt.Sprintf(outstandingRewardsURL, valOperAddr), @@ -161,12 +161,12 @@ func TestDistrValidatorGRPCQueries(t *testing.T) { fmt.Sprintf(`{"rewards":{"rewards":[%s]}}`, expectedAmountOutput), }, } - TestRestQueryIgnoreNumbers(t, rewardsTestCases) + systest.TestRestQueryIgnoreNumbers(t, rewardsTestCases...) // test validator commission grpc endpoint commissionURL := baseurl + `/cosmos/distribution/v1beta1/validators/%s/commission` - commissionTestCases := []RestTestCase{ + commissionTestCases := []systest.RestTestCase{ { "gRPC request commission with valid validator address", fmt.Sprintf(commissionURL, valOperAddr), @@ -174,13 +174,13 @@ func TestDistrValidatorGRPCQueries(t *testing.T) { fmt.Sprintf(`{"commission":{"commission":[%s]}}`, expectedAmountOutput), }, } - TestRestQueryIgnoreNumbers(t, commissionTestCases) + systest.TestRestQueryIgnoreNumbers(t, commissionTestCases...) // test validator slashes grpc endpoint slashURL := baseurl + `/cosmos/distribution/v1beta1/validators/%s/slashes` invalidHeightOutput := `{"code":3, "message":"strconv.ParseUint: parsing \"-3\": invalid syntax", "details":[]}` - slashTestCases := []RestTestCase{ + slashTestCases := []systest.RestTestCase{ { "invalid start height", fmt.Sprintf(slashURL+`?starting_height=%s&ending_height=%s`, valOperAddr, "-3", "3"), @@ -200,15 +200,15 @@ func TestDistrValidatorGRPCQueries(t *testing.T) { `{"slashes":[],"pagination":{"next_key":null,"total":"0"}}`, }, } - RunRestQueries(t, slashTestCases) + systest.RunRestQueries(t, slashTestCases...) } func TestDistrDelegatorGRPCQueries(t *testing.T) { // scenario: test distribution validator gsrpc gateway queries // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") @@ -218,17 +218,12 @@ func TestDistrDelegatorGRPCQueries(t *testing.T) { // update commission rate of node0 validator // generate new gentx and copy it to genesis.json before starting network - rsp := cli.RunCommandWithArgs("genesis", "gentx", "node0", "100000000"+distrTestDenom, "--chain-id="+cli.chainID, "--commission-rate=0.01", "--home", sut.nodePath(0), "--keyring-backend=test") - // extract gentx path from above command output - re := regexp.MustCompile(`"(.*?\.json)"`) - match := re.FindStringSubmatch(rsp) - require.GreaterOrEqual(t, len(match), 1) - - updatedGentx := filepath.Join(WorkDir, match[1]) - updatedGentxBz, err := os.ReadFile(updatedGentx) // #nosec G304 + outFile := filepath.Join(t.TempDir(), "gentx.json") + rsp := cli.RunCommandWithArgs("genesis", "gentx", "node0", "100000000"+distrTestDenom, "--chain-id="+cli.ChainID(), "--commission-rate=0.01", "--home", systest.Sut.NodeDir(0), "--keyring-backend=test", "--output-document="+outFile) + updatedGentxBz, err := os.ReadFile(outFile) // #nosec G304 require.NoError(t, err) - sut.ModifyGenesisJSON(t, func(genesis []byte) []byte { + systest.Sut.ModifyGenesisJSON(t, func(genesis []byte) []byte { state, err := sjson.SetRawBytes(genesis, "app_state.genutil.gen_txs.0", updatedGentxBz) require.NoError(t, err) return state @@ -240,26 +235,26 @@ func TestDistrDelegatorGRPCQueries(t *testing.T) { var initialAmount int64 = 1000000000 initialBalance := fmt.Sprintf("%d%s", initialAmount, distrTestDenom) - sut.ModifyGenesisCLI(t, + systest.Sut.ModifyGenesisCLI(t, []string{"genesis", "add-genesis-account", delAddr, initialBalance}, ) - sut.StartChain(t) + systest.Sut.StartChain(t) // delegate some tokens to valOperAddr rsp = cli.RunAndWait("tx", "staking", "delegate", valOperAddr, "100000000"+distrTestDenom, "--from="+delAddr) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) - sut.AwaitNBlocks(t, 5) + systest.Sut.AwaitNBlocks(t, 5) - baseurl := sut.APIAddress() + baseurl := systest.Sut.APIAddress() // test delegator rewards grpc endpoint delegatorRewardsURL := baseurl + `/cosmos/distribution/v1beta1/delegators/%s/rewards` expectedAmountOutput := `{"denom":"stake","amount":"0.121275000000000000"}` rewardsOutput := fmt.Sprintf(`{"rewards":[{"validator_address":"%s","reward":[%s]}],"total":[%s]}`, valOperAddr, expectedAmountOutput, expectedAmountOutput) - delegatorRewardsTestCases := []RestTestCase{ + delegatorRewardsTestCases := []systest.RestTestCase{ { "valid rewards request with valid delegator address", fmt.Sprintf(delegatorRewardsURL, delAddr), @@ -273,11 +268,11 @@ func TestDistrDelegatorGRPCQueries(t *testing.T) { fmt.Sprintf(`{"rewards":[%s]}`, expectedAmountOutput), }, } - TestRestQueryIgnoreNumbers(t, delegatorRewardsTestCases) + systest.TestRestQueryIgnoreNumbers(t, delegatorRewardsTestCases...) // test delegator validators grpc endpoint delegatorValsURL := baseurl + `/cosmos/distribution/v1beta1/delegators/%s/validators` - valsTestCases := []RestTestCase{ + valsTestCases := []systest.RestTestCase{ { "gRPC request delegator validators with valid delegator address", fmt.Sprintf(delegatorValsURL, delAddr), @@ -285,11 +280,11 @@ func TestDistrDelegatorGRPCQueries(t *testing.T) { fmt.Sprintf(`{"validators":["%s"]}`, valOperAddr), }, } - RunRestQueries(t, valsTestCases) + systest.RunRestQueries(t, valsTestCases...) // test withdraw address grpc endpoint withdrawAddrURL := baseurl + `/cosmos/distribution/v1beta1/delegators/%s/withdraw_address` - withdrawAddrTestCases := []RestTestCase{ + withdrawAddrTestCases := []systest.RestTestCase{ { "gRPC request withdraw address with valid delegator address", fmt.Sprintf(withdrawAddrURL, delAddr), @@ -297,5 +292,5 @@ func TestDistrDelegatorGRPCQueries(t *testing.T) { fmt.Sprintf(`{"withdraw_address":"%s"}`, delAddr), }, } - RunRestQueries(t, withdrawAddrTestCases) + systest.RunRestQueries(t, withdrawAddrTestCases...) } diff --git a/tests/systemtests/export_test.go b/tests/systemtests/export_test.go index 5d392d8ce10f..cc4eb5c2d9f1 100644 --- a/tests/systemtests/export_test.go +++ b/tests/systemtests/export_test.go @@ -3,35 +3,34 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "fmt" - "os" - "testing" - "time" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tidwall/gjson" + "os" + "testing" ) func TestExportCmd_WithHeight(t *testing.T) { - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) - sut.StartChain(t) + systest.Sut.StartChain(t) // Wait 10s for producing blocks - time.Sleep(10 * time.Second) + systest.Sut.AwaitNBlocks(t, 10) - sut.StopChain() + systest.Sut.StopChain() testCases := []struct { name string args []string expZeroHeight bool }{ - {"should export correct height", []string{"genesis", "export", "--home", sut.nodePath(0)}, false}, - {"should export correct height with --height", []string{"genesis", "export", "--height=5", "--home", sut.nodePath(0), "--log_level=disabled"}, false}, - {"should export height 0 with --for-zero-height", []string{"genesis", "export", "--for-zero-height=true", "--home", sut.nodePath(0)}, true}, + {"should export correct height", []string{"genesis", "export", "--home", systest.Sut.NodeDir(0)}, false}, + {"should export correct height with --height", []string{"genesis", "export", "--height=5", "--home", systest.Sut.NodeDir(0), "--log_level=disabled"}, false}, + {"should export height 0 with --for-zero-height", []string{"genesis", "export", "--for-zero-height=true", "--home", systest.Sut.NodeDir(0)}, true}, } for _, tc := range testCases { @@ -45,21 +44,21 @@ func TestExportCmd_WithHeight(t *testing.T) { // Check consensus params of exported state maxGas := gjson.Get(res, "consensus.params.block.max_gas").Int() - require.Equal(t, maxGas, int64(MaxGas)) + require.Equal(t, maxGas, int64(systest.MaxGas)) } } func TestExportCmd_WithFileFlag(t *testing.T) { - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) exportFile := "foobar.json" - sut.StartChain(t) + systest.Sut.StartChain(t) // Wait 10s for producing blocks - time.Sleep(10 * time.Second) + systest.Sut.AwaitNBlocks(t, 10) - sut.StopChain() + systest.Sut.StopChain() testCases := []struct { name string @@ -68,7 +67,7 @@ func TestExportCmd_WithFileFlag(t *testing.T) { errMsg string }{ {"invalid home dir", []string{"genesis", "export", "--home=foo"}, true, "no such file or directory"}, - {"should export state to the specified file", []string{"genesis", "export", fmt.Sprintf("--output-document=%s", exportFile), "--home", sut.nodePath(0)}, false, ""}, + {"should export state to the specified file", []string{"genesis", "export", fmt.Sprintf("--output-document=%s", exportFile), "--home", systest.Sut.NodeDir(0)}, false, ""}, } for _, tc := range testCases { diff --git a/tests/systemtests/fraud_test.go b/tests/systemtests/fraud_test.go index 0479f526cc2d..5086a488313e 100644 --- a/tests/systemtests/fraud_test.go +++ b/tests/systemtests/fraud_test.go @@ -3,6 +3,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "fmt" "os" "path/filepath" @@ -18,35 +19,35 @@ func TestValidatorDoubleSign(t *testing.T) { // given: a running chain // when: a second instance with the same val key signs a block // then: the validator is removed from the active set and jailed forever - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) - sut.StartChain(t) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) + systest.Sut.StartChain(t) // Check the validator is in the active set rsp := cli.CustomQuery("q", "staking", "validators") t.Log(rsp) - validatorPubKey := LoadValidatorPubKeyForNode(t, sut, 0) - rpc, pkBz := sut.RPCClient(t), validatorPubKey.Bytes() + validatorPubKey := systest.LoadValidatorPubKeyForNode(t, systest.Sut, 0) + rpc, pkBz := systest.Sut.RPCClient(t), validatorPubKey.Bytes() - nodePowerBefore := QueryCometValidatorPower(rpc, pkBz) + nodePowerBefore := systest.QueryCometValidatorPower(rpc, pkBz) require.NotEmpty(t, nodePowerBefore) t.Logf("nodePowerBefore: %v", nodePowerBefore) - newNode := sut.AddFullnode(t, func(nodeNumber int, nodePath string) { - valKeyFile := filepath.Join(WorkDir, nodePath, "config", "priv_validator_key.json") + newNode := systest.Sut.AddFullnode(t, func(nodeNumber int, nodePath string) { + valKeyFile := filepath.Join(systest.WorkDir, nodePath, "config", "priv_validator_key.json") _ = os.Remove(valKeyFile) - _ = MustCopyFile(filepath.Join(WorkDir, sut.nodePath(0), "config", "priv_validator_key.json"), valKeyFile) + _ = systest.MustCopyFile(filepath.Join(systest.Sut.NodeDir(0), "config", "priv_validator_key.json"), valKeyFile) }) - sut.AwaitNodeUp(t, fmt.Sprintf("http://%s:%d", newNode.IP, newNode.RPCPort)) + systest.Sut.AwaitNodeUp(t, fmt.Sprintf("http://%s:%d", newNode.IP, newNode.RPCPort)) // let's wait some blocks to have evidence and update persisted var nodePowerAfter int64 = -1 for i := 0; i < 30; i++ { - sut.AwaitNextBlock(t) - if nodePowerAfter = QueryCometValidatorPower(rpc, pkBz); nodePowerAfter == 0 { + systest.Sut.AwaitNextBlock(t) + if nodePowerAfter = systest.QueryCometValidatorPower(rpc, pkBz); nodePowerAfter == 0 { break } - t.Logf("wait %d", sut.CurrentHeight()) + t.Logf("wait %d", systest.Sut.CurrentHeight()) } // then comet status updated require.Empty(t, nodePowerAfter) @@ -57,5 +58,5 @@ func TestValidatorDoubleSign(t *testing.T) { assert.True(t, gjson.Get(rsp, "validator.jailed").Bool(), rsp) // let's run for some blocks to confirm all good - sut.AwaitNBlocks(t, 5) + systest.Sut.AwaitNBlocks(t, 5) } diff --git a/tests/systemtests/go.mod b/tests/systemtests/go.mod index 6b1140d713f5..a738b7a7850a 100644 --- a/tests/systemtests/go.mod +++ b/tests/systemtests/go.mod @@ -20,14 +20,12 @@ require ( github.com/stretchr/testify v1.9.0 github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/grpc v1.68.0 + google.golang.org/grpc v1.68.0 // indirect ) require ( cosmossdk.io/math v1.3.0 - github.com/cometbft/cometbft v0.38.15 - github.com/cometbft/cometbft/api v1.0.0-rc.1 - github.com/creachadair/tomledit v0.0.26 + cosmossdk.io/systemtests v0.0.0-00010101000000-000000000000 github.com/tidwall/gjson v1.14.2 github.com/tidwall/sjson v1.2.5 ) @@ -60,12 +58,15 @@ require ( github.com/cockroachdb/pebble v1.1.1 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft v0.38.15 // indirect github.com/cometbft/cometbft-db v0.14.1 // indirect + github.com/cometbft/cometbft/api v1.0.0-rc.1 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-db v1.0.3-0.20240829004618-717cba019b33 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/ics23/go v0.11.0 // indirect github.com/cosmos/ledger-cosmos-go v0.13.3 // indirect + github.com/creachadair/tomledit v0.0.26 // indirect github.com/danieljoos/wincred v1.1.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect @@ -169,3 +170,5 @@ require ( pgregory.net/rapid v1.1.0 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) + +replace cosmossdk.io/systemtests => ../../systemtests diff --git a/tests/systemtests/gov_test.go b/tests/systemtests/gov_test.go index b3270275b454..fe870e8e4fb2 100644 --- a/tests/systemtests/gov_test.go +++ b/tests/systemtests/gov_test.go @@ -3,6 +3,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "encoding/base64" "fmt" "testing" @@ -21,14 +22,14 @@ import ( func TestSubmitProposal(t *testing.T) { // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := gjson.Get(cli.Keys("keys", "list"), "0.address").String() require.NotEmpty(t, valAddr) - sut.StartChain(t) + systest.Sut.StartChain(t) // get gov module address resp := cli.CustomQuery("q", "auth", "module-account", "gov") @@ -41,7 +42,7 @@ func TestSubmitProposal(t *testing.T) { "deposit": "-324foocoin" }` - invalidPropFile := StoreTempFile(t, []byte(invalidProp)) + invalidPropFile := systest.StoreTempFile(t, []byte(invalidProp)) defer invalidPropFile.Close() // Create a valid new proposal JSON. @@ -64,7 +65,7 @@ func TestSubmitProposal(t *testing.T) { "metadata": "%s", "deposit": "%s" }`, govAddress, base64.StdEncoding.EncodeToString(propMetadata), sdk.NewCoin("stake", math.NewInt(100000))) - validPropFile := StoreTempFile(t, []byte(validProp)) + validPropFile := systest.StoreTempFile(t, []byte(validProp)) defer validPropFile.Close() testCases := []struct { @@ -114,7 +115,7 @@ func TestSubmitProposal(t *testing.T) { rsp := cli.Run(tc.args...) txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) } }) } @@ -123,14 +124,14 @@ func TestSubmitProposal(t *testing.T) { func TestSubmitLegacyProposal(t *testing.T) { // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := gjson.Get(cli.Keys("keys", "list"), "0.address").String() require.NotEmpty(t, valAddr) - sut.StartChain(t) + systest.Sut.StartChain(t) invalidProp := `{ "title": "", @@ -138,7 +139,7 @@ func TestSubmitLegacyProposal(t *testing.T) { "type": "Text", "deposit": "-324foocoin" }` - invalidPropFile := StoreTempFile(t, []byte(invalidProp)) + invalidPropFile := systest.StoreTempFile(t, []byte(invalidProp)) defer invalidPropFile.Close() validProp := fmt.Sprintf(`{ @@ -147,7 +148,7 @@ func TestSubmitLegacyProposal(t *testing.T) { "type": "Text", "deposit": "%s" }`, sdk.NewCoin("stake", math.NewInt(154310))) - validPropFile := StoreTempFile(t, []byte(validProp)) + validPropFile := systest.StoreTempFile(t, []byte(validProp)) defer validPropFile.Close() testCases := []struct { @@ -227,7 +228,7 @@ func TestSubmitLegacyProposal(t *testing.T) { rsp := cli.Run(tc.args...) txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) } }) } @@ -236,14 +237,14 @@ func TestSubmitLegacyProposal(t *testing.T) { func TestNewCmdWeightedVote(t *testing.T) { // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := gjson.Get(cli.Keys("keys", "list"), "0.address").String() require.NotEmpty(t, valAddr) - sut.StartChain(t) + systest.Sut.StartChain(t) // Submit a new proposal for voting proposalArgs := []string{ @@ -260,7 +261,7 @@ func TestNewCmdWeightedVote(t *testing.T) { rsp := cli.Run(proposalArgs...) txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) proposalsResp := cli.CustomQuery("q", "gov", "proposals") proposals := gjson.Get(proposalsResp, "proposals.#.id").Array() @@ -361,7 +362,7 @@ func TestNewCmdWeightedVote(t *testing.T) { } else { rsp := cli.Run(tc.args...) if tc.expectErr { - RequireTxFailure(t, rsp) + systest.RequireTxFailure(t, rsp) } else { cli.AwaitTxCommitted(rsp) } @@ -372,22 +373,20 @@ func TestNewCmdWeightedVote(t *testing.T) { func TestQueryDeposit(t *testing.T) { // given a running chain - - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) // short voting period // update expedited voting period to avoid validation error - sut.ModifyGenesisJSON( + votingPeriod := 3 * time.Second + systest.Sut.ModifyGenesisJSON( t, - SetGovVotingPeriod(t, time.Second*8), - SetGovExpeditedVotingPeriod(t, time.Second*7), + systest.SetGovVotingPeriod(t, votingPeriod), + systest.SetGovExpeditedVotingPeriod(t, votingPeriod-time.Second), ) + systest.Sut.StartChain(t) // get validator address - valAddr := gjson.Get(cli.Keys("keys", "list"), "0.address").String() - require.NotEmpty(t, valAddr) - - sut.StartChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) + valAddr := cli.GetKeyAddr("node0") // Submit a new proposal for voting proposalArgs := []string{ @@ -404,7 +403,7 @@ func TestQueryDeposit(t *testing.T) { rsp := cli.Run(proposalArgs...) txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) // Query initial deposit resp := cli.CustomQuery("q", "gov", "deposit", "1", valAddr) @@ -415,8 +414,9 @@ func TestQueryDeposit(t *testing.T) { deposits := gjson.Get(resp, "deposits").Array() require.Equal(t, len(deposits), 1) - time.Sleep(time.Second * 8) - resp = cli.CustomQuery("q", "gov", "deposits", "1") - deposits = gjson.Get(resp, "deposits").Array() - require.Equal(t, len(deposits), 0) + assert.Eventually(t, func() bool { + resp = cli.CustomQuery("q", "gov", "deposits", "1") + deposits = gjson.Get(resp, "deposits").Array() + return len(deposits) == 0 + }, votingPeriod, 100*time.Millisecond) } diff --git a/tests/systemtests/group_test.go b/tests/systemtests/group_test.go index 6966d30751e5..9928168a2fe6 100644 --- a/tests/systemtests/group_test.go +++ b/tests/systemtests/group_test.go @@ -3,6 +3,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "fmt" "testing" @@ -18,18 +19,18 @@ func TestGroupCommands(t *testing.T) { // scenario: test group commands // given a running chain - sut.ResetChain(t) - require.GreaterOrEqual(t, sut.NodesCount(), 2) + systest.Sut.ResetChain(t) + require.GreaterOrEqual(t, systest.Sut.NodesCount(), 2) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) - sut.StartChain(t) + systest.Sut.StartChain(t) - baseurl := sut.APIAddress() + baseurl := systest.Sut.APIAddress() // test create group memberWeight := "5" @@ -43,10 +44,10 @@ func TestGroupCommands(t *testing.T) { } ] }`, valAddr, memberWeight, validMetadata) - validMembersFile := StoreTempFile(t, []byte(validMembers)) + validMembersFile := systest.StoreTempFile(t, []byte(validMembers)) createGroupCmd := []string{"tx", "group", "create-group", valAddr, validMetadata, validMembersFile.Name(), "--from=" + valAddr} rsp := cli.RunAndWait(createGroupCmd...) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // query groups by admin to confirm group creation rsp = cli.CustomQuery("q", "group", "groups-by-admin", valAddr) @@ -56,34 +57,34 @@ func TestGroupCommands(t *testing.T) { // test create group policies for i := 0; i < 5; i++ { threshold := i + 1 - policyFile := StoreTempFile(t, []byte(fmt.Sprintf(`{"@type":"/cosmos.group.v1.ThresholdDecisionPolicy", "threshold":"%d", "windows":{"voting_period":"30000s"}}`, threshold))) + policyFile := systest.StoreTempFile(t, []byte(fmt.Sprintf(`{"@type":"/cosmos.group.v1.ThresholdDecisionPolicy", "threshold":"%d", "windows":{"voting_period":"30000s"}}`, threshold))) policyCmd := []string{"tx", "group", "create-group-policy", valAddr, groupId, validMetadata, policyFile.Name(), "--from=" + valAddr} rsp = cli.RunAndWait(policyCmd...) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // TODO: remove isV2() check once v2 is integrated with grpc gateway var groupPoliciesResp, policyAddrQuery string - if isV2() { + if systest.IsV2() { groupPoliciesResp = cli.CustomQuery("q", "group", "group-policies-by-group", groupId) policyAddrQuery = fmt.Sprintf("group_policies.#(decision_policy.value.threshold==%d).address", threshold) } else { - groupPoliciesResp = string(GetRequest(t, fmt.Sprintf("%s/cosmos/group/v1/group_policies_by_group/%s", baseurl, groupId))) + groupPoliciesResp = string(systest.GetRequest(t, fmt.Sprintf("%s/cosmos/group/v1/group_policies_by_group/%s", baseurl, groupId))) policyAddrQuery = fmt.Sprintf("group_policies.#(decision_policy.threshold==%d).address", threshold) } require.Equal(t, gjson.Get(groupPoliciesResp, "pagination.total").Int(), int64(threshold)) policyAddr := gjson.Get(groupPoliciesResp, policyAddrQuery).String() require.NotEmpty(t, policyAddr) - rsp = cli.RunCommandWithArgs(cli.withTXFlags("tx", "bank", "send", valAddr, policyAddr, "1000stake", "--generate-only")...) + rsp = cli.RunCommandWithArgs(cli.WithTXFlags("tx", "bank", "send", valAddr, policyAddr, "1000stake", "--generate-only")...) require.Equal(t, policyAddr, gjson.Get(rsp, "body.messages.0.to_address").String()) } // test create group policy with percentage decision policy percentagePolicyType := "/cosmos.group.v1.PercentageDecisionPolicy" - policyFile := StoreTempFile(t, []byte(fmt.Sprintf(`{"@type":"%s", "percentage":"%f", "windows":{"voting_period":"30000s"}}`, percentagePolicyType, 0.5))) + policyFile := systest.StoreTempFile(t, []byte(fmt.Sprintf(`{"@type":"%s", "percentage":"%f", "windows":{"voting_period":"30000s"}}`, percentagePolicyType, 0.5))) policyCmd := []string{"tx", "group", "create-group-policy", valAddr, groupId, validMetadata, policyFile.Name(), "--from=" + valAddr} rsp = cli.RunAndWait(policyCmd...) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) groupPoliciesResp := cli.CustomQuery("q", "group", "group-policies-by-admin", valAddr) require.Equal(t, gjson.Get(groupPoliciesResp, "pagination.total").Int(), int64(6)) @@ -106,9 +107,9 @@ func TestGroupCommands(t *testing.T) { "summary": "Summary", "proposers": ["%s"] }`, policyAddr, policyAddr, valAddr, validMetadata, valAddr) - proposalFile := StoreTempFile(t, []byte(proposalJSON)) + proposalFile := systest.StoreTempFile(t, []byte(proposalJSON)) rsp = cli.RunAndWait("tx", "group", "submit-proposal", proposalFile.Name()) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // query proposals rsp = cli.CustomQuery("q", "group", "proposals-by-group-policy", policyAddr) @@ -117,15 +118,15 @@ func TestGroupCommands(t *testing.T) { // test vote proposal rsp = cli.RunAndWait("tx", "group", "vote", proposalId, valAddr, "yes", validMetadata) - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) // query votes // TODO: remove isV2() check once v2 is integrated with grpc gateway var voteResp string - if isV2() { + if systest.IsV2() { voteResp = cli.CustomQuery("q", "group", "vote", proposalId, valAddr) } else { - voteResp = string(GetRequest(t, fmt.Sprintf("%s/cosmos/group/v1/vote_by_proposal_voter/%s/%s", baseurl, proposalId, valAddr))) + voteResp = string(systest.GetRequest(t, fmt.Sprintf("%s/cosmos/group/v1/vote_by_proposal_voter/%s/%s", baseurl, proposalId, valAddr))) } require.Equal(t, "VOTE_OPTION_YES", gjson.Get(voteResp, "vote.option").String()) } diff --git a/tests/systemtests/main_test.go b/tests/systemtests/main_test.go index f561a892d990..6f2be6a51638 100644 --- a/tests/systemtests/main_test.go +++ b/tests/systemtests/main_test.go @@ -2,8 +2,11 @@ package systemtests -import "testing" +import ( + systest "cosmossdk.io/systemtests" + "testing" +) func TestMain(m *testing.M) { - RunTests(m) + systest.RunTests(m) } diff --git a/tests/systemtests/mint_test.go b/tests/systemtests/mint_test.go index c95aaaee1233..1deb2064066a 100644 --- a/tests/systemtests/mint_test.go +++ b/tests/systemtests/mint_test.go @@ -1,6 +1,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "fmt" "net/http" "testing" @@ -13,10 +14,10 @@ func TestMintQueries(t *testing.T) { // scenario: test mint grpc queries // given a running chain - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) - sut.ModifyGenesisJSON(t, + systest.Sut.ModifyGenesisJSON(t, func(genesis []byte) []byte { state, err := sjson.Set(string(genesis), "app_state.mint.minter.inflation", "1.00") require.NoError(t, err) @@ -29,17 +30,17 @@ func TestMintQueries(t *testing.T) { }, ) - sut.StartChain(t) + systest.Sut.StartChain(t) - sut.AwaitNextBlock(t) + systest.Sut.AwaitNextBlock(t) - baseurl := sut.APIAddress() + baseurl := systest.Sut.APIAddress() blockHeightHeader := "x-cosmos-block-height" queryAtHeight := "1" // TODO: check why difference in values when querying with height between v1 and v2 // ref: https://github.com/cosmos/cosmos-sdk/issues/22302 - if isV2() { + if systest.IsV2() { queryAtHeight = "2" } @@ -78,10 +79,10 @@ func TestMintQueries(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { // TODO: remove below check once grpc gateway is implemented in v2 - if isV2() { + if systest.IsV2() { return } - resp := GetRequestWithHeaders(t, tc.url, tc.headers, http.StatusOK) + resp := systest.GetRequestWithHeaders(t, tc.url, tc.headers, http.StatusOK) require.JSONEq(t, tc.expOut, string(resp)) }) } diff --git a/tests/systemtests/snapshots_test.go b/tests/systemtests/snapshots_test.go index c4d6b257fc93..e75264548125 100644 --- a/tests/systemtests/snapshots_test.go +++ b/tests/systemtests/snapshots_test.go @@ -3,6 +3,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "fmt" "os" "testing" @@ -11,21 +12,21 @@ import ( ) func TestSnapshots(t *testing.T) { - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) - sut.StartChain(t) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) + systest.Sut.StartChain(t) // Wait for chain produce some blocks - sut.AwaitNBlocks(t, 6) + systest.Sut.AwaitNBlocks(t, 6) // Stop all nodes - sut.StopChain() + systest.Sut.StopChain() var ( command string restoreableDirs []string ) - node0Dir := sut.NodeDir(0) - if isV2() { + node0Dir := systest.Sut.NodeDir(0) + if systest.IsV2() { command = "store" restoreableDirs = []string{fmt.Sprintf("%s/data/application.db", node0Dir), fmt.Sprintf("%s/data/ss", node0Dir)} } else { @@ -62,7 +63,7 @@ func TestSnapshots(t *testing.T) { // Remove database err := os.RemoveAll(fmt.Sprintf("%s/data/application.db", node0Dir)) require.NoError(t, err) - if isV2() { + if systest.IsV2() { require.NoError(t, os.RemoveAll(fmt.Sprintf("%s/data/ss", node0Dir))) } @@ -73,22 +74,22 @@ func TestSnapshots(t *testing.T) { } func TestPrune(t *testing.T) { - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) - sut.StartChain(t) + systest.Sut.StartChain(t) // Wait for chain produce some blocks - sut.AwaitNBlocks(t, 6) + systest.Sut.AwaitNBlocks(t, 6) // Stop all nodes - sut.StopChain() + systest.Sut.StopChain() - node0Dir := sut.NodeDir(0) + node0Dir := systest.Sut.NodeDir(0) // prune var command []string - if isV2() { + if systest.IsV2() { command = []string{"store", "prune", "--store.keep-recent=1"} } else { command = []string{"prune", "everything"} diff --git a/tests/systemtests/staking_test.go b/tests/systemtests/staking_test.go index 58b6c863a744..a65afc50a7de 100644 --- a/tests/systemtests/staking_test.go +++ b/tests/systemtests/staking_test.go @@ -3,6 +3,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "testing" "github.com/stretchr/testify/assert" @@ -15,17 +16,17 @@ func TestStakeUnstake(t *testing.T) { // check validator has been updated // undelegate some tokens - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // add genesis account with some tokens account1Addr := cli.AddKey("account1") - sut.ModifyGenesisCLI(t, + systest.Sut.ModifyGenesisCLI(t, []string{"genesis", "add-genesis-account", account1Addr, "10000000stake"}, ) - sut.StartChain(t) + systest.Sut.StartChain(t) // query validator address to delegate tokens rsp := cli.CustomQuery("q", "staking", "validators") @@ -34,7 +35,7 @@ func TestStakeUnstake(t *testing.T) { // stake tokens rsp = cli.RunAndWait("tx", "staking", "delegate", valAddr, "1000000stake", "--from="+account1Addr, "--fees=1stake") - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) t.Log(cli.QueryBalance(account1Addr, "stake")) assert.Equal(t, int64(8999999), cli.QueryBalance(account1Addr, "stake")) @@ -52,7 +53,7 @@ func TestStakeUnstake(t *testing.T) { // unstake tokens rsp = cli.RunAndWait("tx", "staking", "unbond", valAddr, "5000stake", "--from="+account1Addr, "--fees=1stake") - RequireTxSuccess(t, rsp) + systest.RequireTxSuccess(t, rsp) rsp = cli.CustomQuery("q", "staking", "delegation", account1Addr, valAddr) assert.Equal(t, "995000", gjson.Get(rsp, "delegation_response.balance.amount").String(), rsp) diff --git a/tests/systemtests/tx_test.go b/tests/systemtests/tx_test.go index 2e44057c7bb5..cbfe181ef932 100644 --- a/tests/systemtests/tx_test.go +++ b/tests/systemtests/tx_test.go @@ -4,6 +4,7 @@ package systemtests import ( "context" + systest "cosmossdk.io/systemtests" "encoding/base64" "encoding/json" "os" @@ -34,9 +35,9 @@ var ( ) func TestQueryBySig(t *testing.T) { - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) @@ -44,21 +45,21 @@ func TestQueryBySig(t *testing.T) { // add new key receiverAddr := cli.AddKey("account1") - sut.StartChain(t) + systest.Sut.StartChain(t) - qc := tx.NewServiceClient(sut.RPCClient(t)) + qc := tx.NewServiceClient(systest.Sut.RPCClient(t)) // create unsign tx - bankSendCmdArgs := []string{"tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--fees=10stake", fmt.Sprintf("--chain-id=%s", sut.chainID), "--sign-mode=direct", "--generate-only"} + bankSendCmdArgs := []string{"tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--fees=10stake", "--chain-id=" + cli.ChainID(), "--sign-mode=direct", "--generate-only"} unsignedTx := cli.RunCommandWithArgs(bankSendCmdArgs...) - txFile := StoreTempFile(t, []byte(unsignedTx)) + txFile := systest.StoreTempFile(t, []byte(unsignedTx)) - signedTx := cli.RunCommandWithArgs("tx", "sign", txFile.Name(), fmt.Sprintf("--from=%s", valAddr), fmt.Sprintf("--chain-id=%s", sut.chainID), "--keyring-backend=test", "--home=./testnet/node0/simd") + signedTx := cli.RunCommandWithArgs("tx", "sign", txFile.Name(), "--from="+valAddr, "--chain-id="+cli.ChainID(), "--keyring-backend=test", "--home="+systest.Sut.NodeDir(0)) sig := gjson.Get(signedTx, "signatures.0").String() - signedTxFile := StoreTempFile(t, []byte(signedTx)) + signedTxFile := systest.StoreTempFile(t, []byte(signedTx)) res := cli.Run("tx", "broadcast", signedTxFile.Name()) - RequireTxSuccess(t, res) + systest.RequireTxSuccess(t, res) sigFormatted := fmt.Sprintf("%s.%s='%s'", sdk.EventTypeTx, sdk.AttributeKeySignature, sig) resp, err := qc.GetTxsEvent(context.Background(), &tx.GetTxsEventRequest{ @@ -73,9 +74,9 @@ func TestQueryBySig(t *testing.T) { } func TestSimulateTx_GRPC(t *testing.T) { - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) @@ -83,17 +84,17 @@ func TestSimulateTx_GRPC(t *testing.T) { // add new key receiverAddr := cli.AddKey("account1") - sut.StartChain(t) + systest.Sut.StartChain(t) - qc := tx.NewServiceClient(sut.RPCClient(t)) + qc := tx.NewServiceClient(systest.Sut.RPCClient(t)) // create unsign tx - bankSendCmdArgs := []string{"tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), fmt.Sprintf("--chain-id=%s", sut.chainID), "--fees=10stake", "--sign-mode=direct", "--generate-only"} + bankSendCmdArgs := []string{"tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--chain-id=" + cli.ChainID(), "--fees=10stake", "--sign-mode=direct", "--generate-only"} res := cli.RunCommandWithArgs(bankSendCmdArgs...) - txFile := StoreTempFile(t, []byte(res)) + txFile := systest.StoreTempFile(t, []byte(res)) - res = cli.RunCommandWithArgs("tx", "sign", txFile.Name(), fmt.Sprintf("--from=%s", valAddr), fmt.Sprintf("--chain-id=%s", sut.chainID), "--keyring-backend=test", "--home=./testnet/node0/simd") - signedTxFile := StoreTempFile(t, []byte(res)) + res = cli.RunCommandWithArgs("tx", "sign", txFile.Name(), "--from="+valAddr, "--chain-id="+cli.ChainID(), "--keyring-backend=test", "--home="+systest.Sut.NodeDir(0)) + signedTxFile := systest.StoreTempFile(t, []byte(res)) res = cli.RunCommandWithArgs("tx", "encode", signedTxFile.Name()) txBz, err := base64.StdEncoding.DecodeString(res) @@ -135,9 +136,9 @@ func TestSimulateTx_GRPC(t *testing.T) { } func TestSimulateTx_GRPCGateway(t *testing.T) { - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) @@ -145,18 +146,18 @@ func TestSimulateTx_GRPCGateway(t *testing.T) { // add new key receiverAddr := cli.AddKey("account1") - sut.StartChain(t) + systest.Sut.StartChain(t) // qc := tx.NewServiceClient(sut.RPCClient(t)) - baseURL := sut.APIAddress() + baseURL := systest.Sut.APIAddress() // create unsign tx - bankSendCmdArgs := []string{"tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), fmt.Sprintf("--chain-id=%s", sut.chainID), "--fees=10stake", "--sign-mode=direct", "--generate-only"} + bankSendCmdArgs := []string{"tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--chain-id=" + cli.ChainID(), "--fees=10stake", "--sign-mode=direct", "--generate-only"} res := cli.RunCommandWithArgs(bankSendCmdArgs...) - txFile := StoreTempFile(t, []byte(res)) + txFile := systest.StoreTempFile(t, []byte(res)) - res = cli.RunCommandWithArgs("tx", "sign", txFile.Name(), fmt.Sprintf("--from=%s", valAddr), fmt.Sprintf("--chain-id=%s", sut.chainID), "--keyring-backend=test", "--home=./testnet/node0/simd") - signedTxFile := StoreTempFile(t, []byte(res)) + res = cli.RunCommandWithArgs("tx", "sign", txFile.Name(), "--from="+valAddr, "--chain-id="+cli.ChainID(), "--keyring-backend=test", "--home="+systest.Sut.NodeDir(0)) + signedTxFile := systest.StoreTempFile(t, []byte(res)) res = cli.RunCommandWithArgs("tx", "encode", signedTxFile.Name()) txBz, err := base64.StdEncoding.DecodeString(res) @@ -197,9 +198,9 @@ func TestSimulateTx_GRPCGateway(t *testing.T) { } func TestGetTxEvents_GRPC(t *testing.T) { - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) @@ -207,18 +208,18 @@ func TestGetTxEvents_GRPC(t *testing.T) { // add new key receiverAddr := cli.AddKey("account1") - sut.StartChain(t) + systest.Sut.StartChain(t) - qc := tx.NewServiceClient(sut.RPCClient(t)) + qc := tx.NewServiceClient(systest.Sut.RPCClient(t)) rsp := cli.Run("tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--note=foobar", "--fees=1stake") txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) rsp = cli.Run("tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--fees=1stake") txResult, found = cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) testCases := []struct { name string @@ -311,9 +312,9 @@ func TestGetTxEvents_GRPC(t *testing.T) { } func TestGetTxEvents_GRPCGateway(t *testing.T) { - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) @@ -321,19 +322,19 @@ func TestGetTxEvents_GRPCGateway(t *testing.T) { // add new key receiverAddr := cli.AddKey("account1") - sut.StartChain(t) + systest.Sut.StartChain(t) // qc := tx.NewServiceClient(sut.RPCClient(t)) - baseURL := sut.APIAddress() + baseURL := systest.Sut.APIAddress() rsp := cli.Run("tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--note=foobar", "--fees=1stake") txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) rsp = cli.Run("tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--fees=1stake") txResult, found = cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) testCases := []struct { name string @@ -407,9 +408,9 @@ func TestGetTxEvents_GRPCGateway(t *testing.T) { } func TestGetTx_GRPC(t *testing.T) { - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) @@ -417,14 +418,14 @@ func TestGetTx_GRPC(t *testing.T) { // add new key receiverAddr := cli.AddKey("account1") - sut.StartChain(t) + systest.Sut.StartChain(t) - qc := tx.NewServiceClient(sut.RPCClient(t)) + qc := tx.NewServiceClient(systest.Sut.RPCClient(t)) rsp := cli.Run("tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--fees=1stake", "--note=foobar") txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) txHash := gjson.Get(txResult, "txhash").String() testCases := []struct { @@ -454,9 +455,9 @@ func TestGetTx_GRPC(t *testing.T) { } func TestGetTx_GRPCGateway(t *testing.T) { - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) @@ -464,14 +465,14 @@ func TestGetTx_GRPCGateway(t *testing.T) { // add new key receiverAddr := cli.AddKey("account1") - sut.StartChain(t) + systest.Sut.StartChain(t) - baseURL := sut.APIAddress() + baseURL := systest.Sut.APIAddress() rsp := cli.Run("tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--fees=1stake", "--note=foobar") txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) txHash := gjson.Get(txResult, "txhash").String() testCases := []struct { @@ -517,9 +518,9 @@ func TestGetTx_GRPCGateway(t *testing.T) { } func TestGetBlockWithTxs_GRPC(t *testing.T) { - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) @@ -527,14 +528,14 @@ func TestGetBlockWithTxs_GRPC(t *testing.T) { // add new key receiverAddr := cli.AddKey("account1") - sut.StartChain(t) + systest.Sut.StartChain(t) - qc := tx.NewServiceClient(sut.RPCClient(t)) + qc := tx.NewServiceClient(systest.Sut.RPCClient(t)) rsp := cli.Run("tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--fees=1stake", "--note=foobar") txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) height := gjson.Get(txResult, "height").Int() testCases := []struct { @@ -575,9 +576,9 @@ func TestGetBlockWithTxs_GRPC(t *testing.T) { } func TestGetBlockWithTxs_GRPCGateway(t *testing.T) { - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) @@ -585,14 +586,14 @@ func TestGetBlockWithTxs_GRPCGateway(t *testing.T) { // add new key receiverAddr := cli.AddKey("account1") - sut.StartChain(t) + systest.Sut.StartChain(t) - baseUrl := sut.APIAddress() + baseUrl := systest.Sut.APIAddress() rsp := cli.Run("tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--fees=1stake", "--note=foobar") txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) height := gjson.Get(txResult, "height").Int() testCases := []struct { @@ -635,16 +636,16 @@ func TestGetBlockWithTxs_GRPCGateway(t *testing.T) { } func TestTxEncode_GRPC(t *testing.T) { - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) - sut.StartChain(t) + systest.Sut.StartChain(t) - qc := tx.NewServiceClient(sut.RPCClient(t)) + qc := tx.NewServiceClient(systest.Sut.RPCClient(t)) protoTx := &tx.Tx{ Body: &tx.TxBody{ @@ -680,16 +681,16 @@ func TestTxEncode_GRPC(t *testing.T) { } func TestTxEncode_GRPCGateway(t *testing.T) { - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) - sut.StartChain(t) + systest.Sut.StartChain(t) - baseUrl := sut.APIAddress() + baseUrl := systest.Sut.APIAddress() protoTx := &tx.Tx{ Body: &tx.TxBody{ @@ -724,9 +725,9 @@ func TestTxEncode_GRPCGateway(t *testing.T) { } func TestTxDecode_GRPC(t *testing.T) { - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) @@ -734,17 +735,17 @@ func TestTxDecode_GRPC(t *testing.T) { // add new key receiverAddr := cli.AddKey("account1") - sut.StartChain(t) + systest.Sut.StartChain(t) - qc := tx.NewServiceClient(sut.RPCClient(t)) + qc := tx.NewServiceClient(systest.Sut.RPCClient(t)) // create unsign tx - bankSendCmdArgs := []string{"tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), fmt.Sprintf("--chain-id=%s", sut.chainID), "--fees=10stake", "--sign-mode=direct", "--generate-only"} + bankSendCmdArgs := []string{"tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--chain-id=" + cli.ChainID(), "--fees=10stake", "--sign-mode=direct", "--generate-only"} res := cli.RunCommandWithArgs(bankSendCmdArgs...) - txFile := StoreTempFile(t, []byte(res)) + txFile := systest.StoreTempFile(t, []byte(res)) - res = cli.RunCommandWithArgs("tx", "sign", txFile.Name(), fmt.Sprintf("--from=%s", valAddr), fmt.Sprintf("--chain-id=%s", sut.chainID), "--keyring-backend=test", "--home=./testnet/node0/simd") - signedTxFile := StoreTempFile(t, []byte(res)) + res = cli.RunCommandWithArgs("tx", "sign", txFile.Name(), "--from="+valAddr, "--chain-id="+cli.ChainID(), "--keyring-backend=test", "--home="+systest.Sut.NodeDir(0)) + signedTxFile := systest.StoreTempFile(t, []byte(res)) res = cli.RunCommandWithArgs("tx", "encode", signedTxFile.Name()) txBz, err := base64.StdEncoding.DecodeString(res) @@ -779,9 +780,9 @@ func TestTxDecode_GRPC(t *testing.T) { } func TestTxDecode_GRPCGateway(t *testing.T) { - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) @@ -789,17 +790,17 @@ func TestTxDecode_GRPCGateway(t *testing.T) { // add new key receiverAddr := cli.AddKey("account1") - sut.StartChain(t) + systest.Sut.StartChain(t) - basrUrl := sut.APIAddress() + basrUrl := systest.Sut.APIAddress() // create unsign tx - bankSendCmdArgs := []string{"tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), fmt.Sprintf("--chain-id=%s", sut.chainID), "--fees=10stake", "--sign-mode=direct", "--generate-only"} + bankSendCmdArgs := []string{"tx", "bank", "send", valAddr, receiverAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--chain-id=" + cli.ChainID(), "--fees=10stake", "--sign-mode=direct", "--generate-only"} res := cli.RunCommandWithArgs(bankSendCmdArgs...) - txFile := StoreTempFile(t, []byte(res)) + txFile := systest.StoreTempFile(t, []byte(res)) - res = cli.RunCommandWithArgs("tx", "sign", txFile.Name(), fmt.Sprintf("--from=%s", valAddr), fmt.Sprintf("--chain-id=%s", sut.chainID), "--keyring-backend=test", "--home=./testnet/node0/simd") - signedTxFile := StoreTempFile(t, []byte(res)) + res = cli.RunCommandWithArgs("tx", "sign", txFile.Name(), "--from="+valAddr, "--chain-id="+cli.ChainID(), "--keyring-backend=test", "--home="+systest.Sut.NodeDir(0)) + signedTxFile := systest.StoreTempFile(t, []byte(res)) res = cli.RunCommandWithArgs("tx", "encode", signedTxFile.Name()) txBz, err := base64.StdEncoding.DecodeString(res) @@ -835,15 +836,15 @@ func TestTxDecode_GRPCGateway(t *testing.T) { } func TestTxEncodeAmino_GRPC(t *testing.T) { - sut.ResetChain(t) - sut.StartChain(t) + systest.Sut.ResetChain(t) + systest.Sut.StartChain(t) legacyAmino := codec.NewLegacyAmino() std.RegisterLegacyAminoCodec(legacyAmino) legacytx.RegisterLegacyAminoCodec(legacyAmino) legacy.RegisterAminoMsg(legacyAmino, &banktypes.MsgSend{}, "cosmos-sdk/MsgSend") - qc := tx.NewServiceClient(sut.RPCClient(t)) + qc := tx.NewServiceClient(systest.Sut.RPCClient(t)) txJSONBytes, stdTx := readTestAminoTxJSON(t, legacyAmino) testCases := []struct { @@ -879,15 +880,15 @@ func TestTxEncodeAmino_GRPC(t *testing.T) { } func TestTxEncodeAmino_GRPCGateway(t *testing.T) { - sut.ResetChain(t) - sut.StartChain(t) + systest.Sut.ResetChain(t) + systest.Sut.StartChain(t) legacyAmino := codec.NewLegacyAmino() std.RegisterLegacyAminoCodec(legacyAmino) legacytx.RegisterLegacyAminoCodec(legacyAmino) legacy.RegisterAminoMsg(legacyAmino, &banktypes.MsgSend{}, "cosmos-sdk/MsgSend") - baseUrl := sut.APIAddress() + baseUrl := systest.Sut.APIAddress() txJSONBytes, stdTx := readTestAminoTxJSON(t, legacyAmino) testCases := []struct { @@ -925,15 +926,15 @@ func TestTxEncodeAmino_GRPCGateway(t *testing.T) { } func TestTxDecodeAmino_GRPC(t *testing.T) { - sut.ResetChain(t) - sut.StartChain(t) + systest.Sut.ResetChain(t) + systest.Sut.StartChain(t) legacyAmino := codec.NewLegacyAmino() std.RegisterLegacyAminoCodec(legacyAmino) legacytx.RegisterLegacyAminoCodec(legacyAmino) legacy.RegisterAminoMsg(legacyAmino, &banktypes.MsgSend{}, "cosmos-sdk/MsgSend") - qc := tx.NewServiceClient(sut.RPCClient(t)) + qc := tx.NewServiceClient(systest.Sut.RPCClient(t)) encodedTx, stdTx := readTestAminoTxBinary(t, legacyAmino) invalidTxBytes := append(encodedTx, byte(0o00)) @@ -971,15 +972,15 @@ func TestTxDecodeAmino_GRPC(t *testing.T) { } func TestTxDecodeAmino_GRPCGateway(t *testing.T) { - sut.ResetChain(t) - sut.StartChain(t) + systest.Sut.ResetChain(t) + systest.Sut.StartChain(t) legacyAmino := codec.NewLegacyAmino() std.RegisterLegacyAminoCodec(legacyAmino) legacytx.RegisterLegacyAminoCodec(legacyAmino) legacy.RegisterAminoMsg(legacyAmino, &banktypes.MsgSend{}, "cosmos-sdk/MsgSend") - baseUrl := sut.APIAddress() + baseUrl := systest.Sut.APIAddress() encodedTx, stdTx := readTestAminoTxBinary(t, legacyAmino) invalidTxBytes := append(encodedTx, byte(0o00)) @@ -1021,9 +1022,9 @@ func TestTxDecodeAmino_GRPCGateway(t *testing.T) { func TestSimMultiSigTx(t *testing.T) { t.Skip() // waiting for @hieuvubk fix - sut.ResetChain(t) + systest.Sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // get validator address valAddr := cli.GetKeyAddr("node0") require.NotEmpty(t, valAddr) @@ -1032,7 +1033,7 @@ func TestSimMultiSigTx(t *testing.T) { _ = cli.AddKey("account1") _ = cli.AddKey("account2") - sut.StartChain(t) + systest.Sut.StartChain(t) multiSigName := "multisig" cli.RunCommandWithArgs("keys", "add", multiSigName, "--multisig=account1,account2", "--multisig-threshold=2", "--keyring-backend=test", "--home=./testnet") @@ -1042,7 +1043,7 @@ func TestSimMultiSigTx(t *testing.T) { rsp := cli.Run("tx", "bank", "send", valAddr, multiSigAddr, fmt.Sprintf("%d%s", transferAmount, denom), "--fees=1stake") txResult, found := cli.AwaitTxCommitted(rsp) require.True(t, found) - RequireTxSuccess(t, txResult) + systest.RequireTxSuccess(t, txResult) multiSigBalance := cli.QueryBalance(multiSigAddr, denom) require.Equal(t, multiSigBalance, transferAmount) @@ -1050,20 +1051,20 @@ func TestSimMultiSigTx(t *testing.T) { // Send from multisig to validator // create unsign tx var newTransferAmount int64 = 100 - bankSendCmdArgs := []string{"tx", "bank", "send", multiSigAddr, valAddr, fmt.Sprintf("%d%s", newTransferAmount, denom), fmt.Sprintf("--chain-id=%s", sut.chainID), "--fees=10stake", "--sign-mode=direct", "--generate-only"} + bankSendCmdArgs := []string{"tx", "bank", "send", multiSigAddr, valAddr, fmt.Sprintf("%d%s", newTransferAmount, denom), "--chain-id=" + cli.ChainID(), "--fees=10stake", "--sign-mode=direct", "--generate-only"} res := cli.RunCommandWithArgs(bankSendCmdArgs...) - txFile := StoreTempFile(t, []byte(res)) + txFile := systest.StoreTempFile(t, []byte(res)) - res = cli.RunCommandWithArgs("tx", "sign", txFile.Name(), fmt.Sprintf("--from=%s", "account1"), fmt.Sprintf("--multisig=%s", multiSigAddr), fmt.Sprintf("--chain-id=%s", sut.chainID), "--keyring-backend=test", "--home=./testnet") - account1Signed := StoreTempFile(t, []byte(res)) - res = cli.RunCommandWithArgs("tx", "sign", txFile.Name(), fmt.Sprintf("--from=%s", "account2"), fmt.Sprintf("--multisig=%s", multiSigAddr), fmt.Sprintf("--chain-id=%s", sut.chainID), "--keyring-backend=test", "--home=./testnet") - account2Signed := StoreTempFile(t, []byte(res)) + res = cli.RunCommandWithArgs("tx", "sign", txFile.Name(), fmt.Sprintf("--from=%s", "account1"), fmt.Sprintf("--multisig=%s", multiSigAddr), "--chain-id="+cli.ChainID(), "--keyring-backend=test", "--home=./testnet") + account1Signed := systest.StoreTempFile(t, []byte(res)) + res = cli.RunCommandWithArgs("tx", "sign", txFile.Name(), fmt.Sprintf("--from=%s", "account2"), fmt.Sprintf("--multisig=%s", multiSigAddr), "--chain-id="+cli.ChainID(), "--keyring-backend=test", "--home=./testnet") + account2Signed := systest.StoreTempFile(t, []byte(res)) - res = cli.RunCommandWithArgs("tx", "multisign-batch", txFile.Name(), multiSigName, account1Signed.Name(), account2Signed.Name(), fmt.Sprintf("--chain-id=%s", sut.chainID), "--keyring-backend=test", "--home=./testnet") - txSignedFile := StoreTempFile(t, []byte(res)) + res = cli.RunCommandWithArgs("tx", "multisign-batch", txFile.Name(), multiSigName, account1Signed.Name(), account2Signed.Name(), "--chain-id="+cli.ChainID(), "--keyring-backend=test", "--home=./testnet") + txSignedFile := systest.StoreTempFile(t, []byte(res)) res = cli.Run("tx", "broadcast", txSignedFile.Name()) - RequireTxSuccess(t, res) + systest.RequireTxSuccess(t, res) multiSigBalance = cli.QueryBalance(multiSigAddr, denom) require.Equal(t, multiSigBalance, transferAmount-newTransferAmount-10) diff --git a/tests/systemtests/unordered_tx_test.go b/tests/systemtests/unordered_tx_test.go index 579552efe0e7..a641ab702521 100644 --- a/tests/systemtests/unordered_tx_test.go +++ b/tests/systemtests/unordered_tx_test.go @@ -3,6 +3,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "fmt" "testing" "time" @@ -12,28 +13,30 @@ import ( ) func TestUnorderedTXDuplicate(t *testing.T) { - t.Skip("The unordered tx handling is not wired in v2") - + if systest.IsV2() { + t.Skip("The unordered tx handling is not wired in v2") + return + } // scenario: test unordered tx duplicate // given a running chain with a tx in the unordered tx pool // when a new tx with the same hash is broadcasted // then the new tx should be rejected - sut.ResetChain(t) - cli := NewCLIWrapper(t, sut, verbose) + systest.Sut.ResetChain(t) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // add genesis account with some tokens account1Addr := cli.AddKey("account1") account2Addr := cli.AddKey("account2") - sut.ModifyGenesisCLI(t, + systest.Sut.ModifyGenesisCLI(t, []string{"genesis", "add-genesis-account", account1Addr, "10000000stake"}, ) - sut.StartChain(t) + systest.Sut.StartChain(t) timeoutTimestamp := time.Now().Add(time.Minute) // send tokens rsp1 := cli.Run("tx", "bank", "send", account1Addr, account2Addr, "5000stake", "--from="+account1Addr, "--fees=1stake", fmt.Sprintf("--timeout-timestamp=%v", timeoutTimestamp.Unix()), "--unordered", "--sequence=1", "--note=1") - RequireTxSuccess(t, rsp1) + systest.RequireTxSuccess(t, rsp1) assertDuplicateErr := func(xt assert.TestingT, gotErr error, gotOutputs ...interface{}) bool { require.Len(t, gotOutputs, 1) @@ -41,9 +44,9 @@ func TestUnorderedTXDuplicate(t *testing.T) { return false // always abort } rsp2 := cli.WithRunErrorMatcher(assertDuplicateErr).Run("tx", "bank", "send", account1Addr, account2Addr, "5000stake", "--from="+account1Addr, "--fees=1stake", fmt.Sprintf("--timeout-timestamp=%v", timeoutTimestamp.Unix()), "--unordered", "--sequence=1") - RequireTxFailure(t, rsp2) + systest.RequireTxFailure(t, rsp2) require.Eventually(t, func() bool { return cli.QueryBalance(account2Addr, "stake") == 5000 - }, time.Minute, time.Microsecond*500, "TX was not executed before timeout") + }, 10*systest.Sut.BlockTime(), 200*time.Millisecond, "TX was not executed before timeout") } diff --git a/tests/systemtests/upgrade_test.go b/tests/systemtests/upgrade_test.go index c7de9e6dfa99..2f186e2995ac 100644 --- a/tests/systemtests/upgrade_test.go +++ b/tests/systemtests/upgrade_test.go @@ -3,6 +3,7 @@ package systemtests import ( + systest "cosmossdk.io/systemtests" "fmt" "os" "path/filepath" @@ -24,26 +25,26 @@ func TestChainUpgrade(t *testing.T) { // start a legacy chain with some state // when a chain upgrade proposal is executed // then the chain upgrades successfully - sut.StopChain() + systest.Sut.StopChain() legacyBinary := FetchExecutable(t, "v0.52") t.Logf("+++ legacy binary: %s\n", legacyBinary) - currentBranchBinary := sut.execBinary - currentInitializer := sut.testnetInitializer - sut.SetExecBinary(legacyBinary) - sut.SetTestnetInitializer(InitializerWithBinary(legacyBinary, sut)) - sut.SetupChain() + currentBranchBinary := systest.Sut.ExecBinary() + currentInitializer := systest.Sut.TestnetInitializer() + systest.Sut.SetExecBinary(legacyBinary) + systest.Sut.SetTestnetInitializer(systest.InitializerWithBinary(legacyBinary, systest.Sut)) + systest.Sut.SetupChain() votingPeriod := 5 * time.Second // enough time to vote - sut.ModifyGenesisJSON(t, SetGovVotingPeriod(t, votingPeriod)) + systest.Sut.ModifyGenesisJSON(t, systest.SetGovVotingPeriod(t, votingPeriod)) const ( upgradeHeight int64 = 22 upgradeName = "v052-to-v054" // must match UpgradeName in simapp/upgrades.go ) - sut.StartChain(t, fmt.Sprintf("--halt-height=%d", upgradeHeight+1)) + systest.Sut.StartChain(t, fmt.Sprintf("--halt-height=%d", upgradeHeight+1)) - cli := NewCLIWrapper(t, sut, verbose) + cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) govAddr := sdk.AccAddress(address.Module("gov")).String() // submit upgrade proposal proposal := fmt.Sprintf(` @@ -64,32 +65,32 @@ func TestChainUpgrade(t *testing.T) { "summary": "testing" }`, govAddr, upgradeName, upgradeHeight) proposalID := cli.SubmitAndVoteGovProposal(proposal) - t.Logf("current_height: %d\n", sut.currentHeight) + t.Logf("current_height: %d\n", systest.Sut.CurrentHeight()) raw := cli.CustomQuery("q", "gov", "proposal", proposalID) t.Log(raw) - sut.AwaitBlockHeight(t, upgradeHeight-1, 60*time.Second) - t.Logf("current_height: %d\n", sut.currentHeight) + systest.Sut.AwaitBlockHeight(t, upgradeHeight-1, 60*time.Second) + t.Logf("current_height: %d\n", systest.Sut.CurrentHeight()) raw = cli.CustomQuery("q", "gov", "proposal", proposalID) proposalStatus := gjson.Get(raw, "proposal.status").String() require.Equal(t, "PROPOSAL_STATUS_PASSED", proposalStatus, raw) // PROPOSAL_STATUS_PASSED t.Log("waiting for upgrade info") - sut.AwaitUpgradeInfo(t) - sut.StopChain() + systest.Sut.AwaitUpgradeInfo(t) + systest.Sut.StopChain() t.Log("Upgrade height was reached. Upgrading chain") - sut.SetExecBinary(currentBranchBinary) - sut.SetTestnetInitializer(currentInitializer) - sut.StartChain(t) - cli = NewCLIWrapper(t, sut, verbose) + systest.Sut.SetExecBinary(currentBranchBinary) + systest.Sut.SetTestnetInitializer(currentInitializer) + systest.Sut.StartChain(t) + cli = systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) // smoke test that new version runs - ownerAddr := cli.GetKeyAddr(defaultSrcAddr) - got := cli.Run("tx", "accounts", "init", "continuous-locking-account", `{"end_time":"2034-01-22T11:38:15.116127Z", "owner":"`+ownerAddr+`"}`, "--from="+defaultSrcAddr) - RequireTxSuccess(t, got) - got = cli.Run("tx", "protocolpool", "fund-community-pool", "100stake", "--from="+defaultSrcAddr) - RequireTxSuccess(t, got) + ownerAddr := cli.GetKeyAddr("node0") + got := cli.Run("tx", "accounts", "init", "continuous-locking-account", `{"end_time":"2034-01-22T11:38:15.116127Z", "owner":"`+ownerAddr+`"}`, "--from=node0") + systest.RequireTxSuccess(t, got) + got = cli.Run("tx", "protocolpool", "fund-community-pool", "100stake", "--from=node0") + systest.RequireTxSuccess(t, got) } const cacheDir = "binaries" @@ -97,20 +98,20 @@ const cacheDir = "binaries" // FetchExecutable to download and extract tar.gz for linux func FetchExecutable(t *testing.T, version string) string { // use local cache - cacheFolder := filepath.Join(WorkDir, cacheDir) + cacheFolder := filepath.Join(systest.WorkDir, cacheDir) err := os.MkdirAll(cacheFolder, 0o777) if err != nil && !os.IsExist(err) { panic(err) } - cacheFile := filepath.Join(cacheFolder, fmt.Sprintf("%s_%s", execBinaryName, version)) + cacheFile := filepath.Join(cacheFolder, fmt.Sprintf("%s_%s", systest.GetExecutableName(), version)) if _, err := os.Stat(cacheFile); err == nil { return cacheFile } destFile := cacheFile t.Log("+++ version not in cache, downloading from docker image") - MustRunShellCmd(t, "docker", "pull", "ghcr.io/cosmos/simapp:"+version) - MustRunShellCmd(t, "docker", "create", "--name=ci_temp", "ghcr.io/cosmos/simapp:"+version) - MustRunShellCmd(t, "docker", "cp", "ci_temp:/usr/bin/simd", destFile) + systest.MustRunShellCmd(t, "docker", "pull", "ghcr.io/cosmos/simapp:"+version) + systest.MustRunShellCmd(t, "docker", "create", "--name=ci_temp", "ghcr.io/cosmos/simapp:"+version) + systest.MustRunShellCmd(t, "docker", "cp", "ci_temp:/usr/bin/simd", destFile) return destFile } From dc300842b41890249d4b4a5af0f3c9f1bf05c1b7 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 21 Nov 2024 15:25:36 +0100 Subject: [PATCH 2/6] Review feedback --- {tests/systemtests => systemtests}/README.md | 2 +- systemtests/cli.go | 1 + systemtests/go.mod | 2 +- systemtests/go.sum | 4 ++-- systemtests/system.go | 1 + tests/go.mod | 2 +- tests/go.sum | 15 +++++++++++++-- tests/systemtests/account_test.go | 3 ++- tests/systemtests/auth_test.go | 3 ++- tests/systemtests/authz_test.go | 3 ++- tests/systemtests/bank_test.go | 3 ++- tests/systemtests/bankv2_test.go | 3 ++- tests/systemtests/circuit_test.go | 3 ++- tests/systemtests/cometbft_client_test.go | 3 ++- tests/systemtests/distribution_test.go | 3 ++- tests/systemtests/export_test.go | 8 +++++--- tests/systemtests/fraud_test.go | 3 ++- tests/systemtests/go.mod | 4 ++-- tests/systemtests/go.sum | 4 ++-- tests/systemtests/gov_test.go | 2 +- tests/systemtests/group_test.go | 3 ++- tests/systemtests/main_test.go | 3 ++- tests/systemtests/mint_test.go | 3 ++- tests/systemtests/snapshots_test.go | 3 ++- tests/systemtests/staking_test.go | 3 ++- tests/systemtests/tx_test.go | 11 +++++------ tests/systemtests/unordered_tx_test.go | 3 ++- tests/systemtests/upgrade_test.go | 3 ++- 28 files changed, 67 insertions(+), 37 deletions(-) rename {tests/systemtests => systemtests}/README.md (93%) diff --git a/tests/systemtests/README.md b/systemtests/README.md similarity index 93% rename from tests/systemtests/README.md rename to systemtests/README.md index ac9fcb49cdc9..44d165029456 100644 --- a/tests/systemtests/README.md +++ b/systemtests/README.md @@ -27,7 +27,7 @@ Therefore, we focus on the **critical path** and do not cover every condition. ## How to use -Read the [getting_started.md](getting_started.md) guide to get started. +Read the [getting_started.md](../tests/systemtests/getting_started.md) guide to get started. ### Execute a single test diff --git a/systemtests/cli.go b/systemtests/cli.go index 2e93cd9db7f6..2ae6b0da5e67 100644 --- a/systemtests/cli.go +++ b/systemtests/cli.go @@ -116,6 +116,7 @@ func (c CLIWrapper) WithAssertTXUncommitted() CLIWrapper { r.expTXCommitted = false }) } + func (c CLIWrapper) WithChainID(newChainID string) CLIWrapper { return c.clone(func(r *CLIWrapper) { r.chainID = newChainID diff --git a/systemtests/go.mod b/systemtests/go.mod index 4432219ce2ae..6a507c647041 100644 --- a/systemtests/go.mod +++ b/systemtests/go.mod @@ -24,7 +24,7 @@ require ( ) require ( - cosmossdk.io/math v1.3.0 + cosmossdk.io/math v1.4.0 github.com/cometbft/cometbft v0.38.15 github.com/cometbft/cometbft/api v1.0.0-rc.1 github.com/creachadair/tomledit v0.0.26 diff --git a/systemtests/go.sum b/systemtests/go.sum index 3e7387681597..36283124bd5c 100644 --- a/systemtests/go.sum +++ b/systemtests/go.sum @@ -12,8 +12,8 @@ cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= cosmossdk.io/log v1.5.0 h1:dVdzPJW9kMrnAYyMf1duqacoidB9uZIl+7c6z0mnq0g= cosmossdk.io/log v1.5.0/go.mod h1:Tr46PUJjiUthlwQ+hxYtUtPn4D/oCZXAkYevBeh5+FI= -cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= -cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= +cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= +cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= cosmossdk.io/store v1.1.0 h1:LnKwgYMc9BInn9PhpTFEQVbL9UK475G2H911CGGnWHk= cosmossdk.io/store v1.1.0/go.mod h1:oZfW/4Fc/zYqu3JmQcQdUJ3fqu5vnYTn3LZFFy8P8ng= cosmossdk.io/x/tx v0.13.3-0.20240419091757-db5906b1e894 h1:kHEvzVqpNv/9pnaEPBsgE/FMc+cVmWjSsInRufkZkpQ= diff --git a/systemtests/system.go b/systemtests/system.go index efd69543d7cd..cb1adb13040e 100644 --- a/systemtests/system.go +++ b/systemtests/system.go @@ -780,6 +780,7 @@ func (s *SystemUnderTest) CurrentHeight() int64 { func (s *SystemUnderTest) NodesCount() int { return s.nodesCount } + func (s *SystemUnderTest) BlockTime() time.Duration { return s.blockTime } diff --git a/tests/go.mod b/tests/go.mod index c847222250fc..f8e1375c5191 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -8,7 +8,7 @@ require ( cosmossdk.io/core v1.0.0-alpha.6 cosmossdk.io/depinject v1.1.0 cosmossdk.io/log v1.5.0 - cosmossdk.io/math v1.3.0 + cosmossdk.io/math v1.4.0 cosmossdk.io/simapp v0.0.0-20230309163709-87da587416ba cosmossdk.io/store v1.1.1 cosmossdk.io/x/evidence v0.0.0-20230613133644-0a778132a60f diff --git a/tests/go.sum b/tests/go.sum index 567deb1d86aa..83fabc8756f8 100644 --- a/tests/go.sum +++ b/tests/go.sum @@ -202,8 +202,8 @@ cosmossdk.io/errors/v2 v2.0.0-20240731132947-df72853b3ca5 h1:IQNdY2kB+k+1OM2DvqF cosmossdk.io/errors/v2 v2.0.0-20240731132947-df72853b3ca5/go.mod h1:0CuYKkFHxc1vw2JC+t21THBCALJVROrWVR/3PQ1urpc= cosmossdk.io/log v1.5.0 h1:dVdzPJW9kMrnAYyMf1duqacoidB9uZIl+7c6z0mnq0g= cosmossdk.io/log v1.5.0/go.mod h1:Tr46PUJjiUthlwQ+hxYtUtPn4D/oCZXAkYevBeh5+FI= -cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= -cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= +cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= +cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= cosmossdk.io/schema v0.3.0/go.mod h1:RDAhxIeNB4bYqAlF4NBJwRrgtnciMcyyg0DOKnhNZQQ= cosmossdk.io/schema v0.3.1-0.20241010135032-192601639cac h1:3joNZZWZ3k7fMsrBDL1ktuQ2xQwYLZOaDhkruadDFmc= cosmossdk.io/schema v0.3.1-0.20241010135032-192601639cac/go.mod h1:RDAhxIeNB4bYqAlF4NBJwRrgtnciMcyyg0DOKnhNZQQ= @@ -344,6 +344,8 @@ github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStK github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5nvue4rK+yM= github.com/cosmos/ledger-cosmos-go v0.13.3/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creachadair/tomledit v0.0.26 h1:MoDdgHIHZ5PctBVsAZDjxdxreWUEa9ObPKTRkk5PPwA= +github.com/creachadair/tomledit v0.0.26/go.mod h1:SJi1OxKpMyR141tq1lzsbPtIg3j8TeVPM/ZftfieD7o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/danieljoos/wincred v1.2.1 h1:dl9cBrupW8+r5250DYkYxocLeZ1Y4vB1kxgtjxw8GQs= github.com/danieljoos/wincred v1.2.1/go.mod h1:uGaFL9fDn3OLTvzCGulzE+SzjEe5NGlh5FdCcyfPwps= @@ -817,6 +819,15 @@ github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2l github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= diff --git a/tests/systemtests/account_test.go b/tests/systemtests/account_test.go index 3780a4f9a7ba..1b66199ba026 100644 --- a/tests/systemtests/account_test.go +++ b/tests/systemtests/account_test.go @@ -1,7 +1,6 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "fmt" "strings" "testing" @@ -9,6 +8,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tidwall/gjson" + + systest "cosmossdk.io/systemtests" ) func TestAccountCreation(t *testing.T) { diff --git a/tests/systemtests/auth_test.go b/tests/systemtests/auth_test.go index b21b8507d761..afc366de65d8 100644 --- a/tests/systemtests/auth_test.go +++ b/tests/systemtests/auth_test.go @@ -3,7 +3,6 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "fmt" "testing" @@ -11,6 +10,8 @@ import ( "github.com/stretchr/testify/require" "github.com/tidwall/gjson" "github.com/tidwall/sjson" + + systest "cosmossdk.io/systemtests" ) const ( diff --git a/tests/systemtests/authz_test.go b/tests/systemtests/authz_test.go index b8c9cb7914c0..902b6631e8f8 100644 --- a/tests/systemtests/authz_test.go +++ b/tests/systemtests/authz_test.go @@ -3,7 +3,6 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "fmt" "net/http" "os" @@ -13,6 +12,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tidwall/gjson" + + systest "cosmossdk.io/systemtests" ) const ( diff --git a/tests/systemtests/bank_test.go b/tests/systemtests/bank_test.go index ddf8933718ed..e968dc736b2c 100644 --- a/tests/systemtests/bank_test.go +++ b/tests/systemtests/bank_test.go @@ -3,7 +3,6 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "fmt" "net/http" "testing" @@ -12,6 +11,8 @@ import ( "github.com/stretchr/testify/require" "github.com/tidwall/gjson" "github.com/tidwall/sjson" + + systest "cosmossdk.io/systemtests" ) func TestBankSendTxCmd(t *testing.T) { diff --git a/tests/systemtests/bankv2_test.go b/tests/systemtests/bankv2_test.go index 1358aacf9943..03debeb771fe 100644 --- a/tests/systemtests/bankv2_test.go +++ b/tests/systemtests/bankv2_test.go @@ -3,12 +3,13 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "fmt" "testing" "github.com/stretchr/testify/require" "github.com/tidwall/gjson" + + systest "cosmossdk.io/systemtests" ) func TestBankV2SendTxCmd(t *testing.T) { diff --git a/tests/systemtests/circuit_test.go b/tests/systemtests/circuit_test.go index ad63c8cebbc2..291c52aba565 100644 --- a/tests/systemtests/circuit_test.go +++ b/tests/systemtests/circuit_test.go @@ -3,7 +3,6 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "encoding/json" "fmt" "strings" @@ -12,6 +11,8 @@ import ( "github.com/stretchr/testify/require" "github.com/tidwall/gjson" + + systest "cosmossdk.io/systemtests" ) var someMsgs = []string{"/cosmos.bank.v1beta1.MsgSend", "/cosmos.bank.v1beta1.MsgMultiSend"} diff --git a/tests/systemtests/cometbft_client_test.go b/tests/systemtests/cometbft_client_test.go index bab67ff2378b..ae8ae2da9797 100644 --- a/tests/systemtests/cometbft_client_test.go +++ b/tests/systemtests/cometbft_client_test.go @@ -4,7 +4,6 @@ package systemtests import ( "context" - systest "cosmossdk.io/systemtests" "fmt" "net/http" "net/url" @@ -14,6 +13,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/tidwall/gjson" + systest "cosmossdk.io/systemtests" + "github.com/cosmos/cosmos-sdk/client/grpc/cmtservice" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" diff --git a/tests/systemtests/distribution_test.go b/tests/systemtests/distribution_test.go index 13bf54e11f27..7e40589bf5da 100644 --- a/tests/systemtests/distribution_test.go +++ b/tests/systemtests/distribution_test.go @@ -3,7 +3,6 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "fmt" "net/http" "os" @@ -15,6 +14,8 @@ import ( "github.com/stretchr/testify/require" "github.com/tidwall/gjson" "github.com/tidwall/sjson" + + systest "cosmossdk.io/systemtests" ) const ( diff --git a/tests/systemtests/export_test.go b/tests/systemtests/export_test.go index cc4eb5c2d9f1..0f5f91176e78 100644 --- a/tests/systemtests/export_test.go +++ b/tests/systemtests/export_test.go @@ -3,13 +3,15 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "fmt" + "os" + "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tidwall/gjson" - "os" - "testing" + + systest "cosmossdk.io/systemtests" ) func TestExportCmd_WithHeight(t *testing.T) { diff --git a/tests/systemtests/fraud_test.go b/tests/systemtests/fraud_test.go index 5086a488313e..a4c0b7875d8e 100644 --- a/tests/systemtests/fraud_test.go +++ b/tests/systemtests/fraud_test.go @@ -3,7 +3,6 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "fmt" "os" "path/filepath" @@ -12,6 +11,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tidwall/gjson" + + systest "cosmossdk.io/systemtests" ) func TestValidatorDoubleSign(t *testing.T) { diff --git a/tests/systemtests/go.mod b/tests/systemtests/go.mod index a738b7a7850a..3690da20cf1d 100644 --- a/tests/systemtests/go.mod +++ b/tests/systemtests/go.mod @@ -1,4 +1,4 @@ -module cosmossdk.io/tests/systemtests +module github.com/cosmos/tests/systemtests go 1.23 @@ -24,7 +24,7 @@ require ( ) require ( - cosmossdk.io/math v1.3.0 + cosmossdk.io/math v1.4.0 cosmossdk.io/systemtests v0.0.0-00010101000000-000000000000 github.com/tidwall/gjson v1.14.2 github.com/tidwall/sjson v1.2.5 diff --git a/tests/systemtests/go.sum b/tests/systemtests/go.sum index 3e7387681597..36283124bd5c 100644 --- a/tests/systemtests/go.sum +++ b/tests/systemtests/go.sum @@ -12,8 +12,8 @@ cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= cosmossdk.io/log v1.5.0 h1:dVdzPJW9kMrnAYyMf1duqacoidB9uZIl+7c6z0mnq0g= cosmossdk.io/log v1.5.0/go.mod h1:Tr46PUJjiUthlwQ+hxYtUtPn4D/oCZXAkYevBeh5+FI= -cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= -cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= +cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= +cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= cosmossdk.io/store v1.1.0 h1:LnKwgYMc9BInn9PhpTFEQVbL9UK475G2H911CGGnWHk= cosmossdk.io/store v1.1.0/go.mod h1:oZfW/4Fc/zYqu3JmQcQdUJ3fqu5vnYTn3LZFFy8P8ng= cosmossdk.io/x/tx v0.13.3-0.20240419091757-db5906b1e894 h1:kHEvzVqpNv/9pnaEPBsgE/FMc+cVmWjSsInRufkZkpQ= diff --git a/tests/systemtests/gov_test.go b/tests/systemtests/gov_test.go index fe870e8e4fb2..3f9d41cf6fb5 100644 --- a/tests/systemtests/gov_test.go +++ b/tests/systemtests/gov_test.go @@ -3,7 +3,6 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "encoding/base64" "fmt" "testing" @@ -14,6 +13,7 @@ import ( "github.com/tidwall/gjson" "cosmossdk.io/math" + systest "cosmossdk.io/systemtests" "github.com/cosmos/cosmos-sdk/client/flags" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/tests/systemtests/group_test.go b/tests/systemtests/group_test.go index 9928168a2fe6..fd7e6ef448bf 100644 --- a/tests/systemtests/group_test.go +++ b/tests/systemtests/group_test.go @@ -3,12 +3,13 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "fmt" "testing" "github.com/stretchr/testify/require" "github.com/tidwall/gjson" + + systest "cosmossdk.io/systemtests" ) const ( diff --git a/tests/systemtests/main_test.go b/tests/systemtests/main_test.go index 6f2be6a51638..3bcc3ba8b2ca 100644 --- a/tests/systemtests/main_test.go +++ b/tests/systemtests/main_test.go @@ -3,8 +3,9 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "testing" + + systest "cosmossdk.io/systemtests" ) func TestMain(m *testing.M) { diff --git a/tests/systemtests/mint_test.go b/tests/systemtests/mint_test.go index 1deb2064066a..1be1a713743b 100644 --- a/tests/systemtests/mint_test.go +++ b/tests/systemtests/mint_test.go @@ -1,13 +1,14 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "fmt" "net/http" "testing" "github.com/stretchr/testify/require" "github.com/tidwall/sjson" + + systest "cosmossdk.io/systemtests" ) func TestMintQueries(t *testing.T) { diff --git a/tests/systemtests/snapshots_test.go b/tests/systemtests/snapshots_test.go index e75264548125..b47708e7b449 100644 --- a/tests/systemtests/snapshots_test.go +++ b/tests/systemtests/snapshots_test.go @@ -3,12 +3,13 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "fmt" "os" "testing" "github.com/stretchr/testify/require" + + systest "cosmossdk.io/systemtests" ) func TestSnapshots(t *testing.T) { diff --git a/tests/systemtests/staking_test.go b/tests/systemtests/staking_test.go index a65afc50a7de..ba734d6e8d90 100644 --- a/tests/systemtests/staking_test.go +++ b/tests/systemtests/staking_test.go @@ -3,11 +3,12 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "testing" "github.com/stretchr/testify/assert" "github.com/tidwall/gjson" + + systest "cosmossdk.io/systemtests" ) func TestStakeUnstake(t *testing.T) { diff --git a/tests/systemtests/tx_test.go b/tests/systemtests/tx_test.go index cbfe181ef932..84a0c9fc20c2 100644 --- a/tests/systemtests/tx_test.go +++ b/tests/systemtests/tx_test.go @@ -4,26 +4,25 @@ package systemtests import ( "context" - systest "cosmossdk.io/systemtests" "encoding/base64" "encoding/json" - "os" - "fmt" - + "os" "testing" - "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/types/tx" "github.com/stretchr/testify/require" "github.com/tidwall/gjson" + systest "cosmossdk.io/systemtests" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/legacy" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/std" + "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" + "github.com/cosmos/cosmos-sdk/types/tx" "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ) diff --git a/tests/systemtests/unordered_tx_test.go b/tests/systemtests/unordered_tx_test.go index a641ab702521..aec8f914130c 100644 --- a/tests/systemtests/unordered_tx_test.go +++ b/tests/systemtests/unordered_tx_test.go @@ -3,13 +3,14 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "fmt" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + systest "cosmossdk.io/systemtests" ) func TestUnorderedTXDuplicate(t *testing.T) { diff --git a/tests/systemtests/upgrade_test.go b/tests/systemtests/upgrade_test.go index 2f186e2995ac..94dc1b771e63 100644 --- a/tests/systemtests/upgrade_test.go +++ b/tests/systemtests/upgrade_test.go @@ -3,7 +3,6 @@ package systemtests import ( - systest "cosmossdk.io/systemtests" "fmt" "os" "path/filepath" @@ -13,6 +12,8 @@ import ( "github.com/stretchr/testify/require" "github.com/tidwall/gjson" + systest "cosmossdk.io/systemtests" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/address" ) From adc530e1ad9fe5e67a01a7217dce922dde9d58d2 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 22 Nov 2024 13:46:16 +0100 Subject: [PATCH 3/6] Cleanup --- tests/systemtests/go.mod | 8 ++++---- tests/systemtests/go.sum | 11 +++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/tests/systemtests/go.mod b/tests/systemtests/go.mod index 502c1df45ada..a8a4acc3b7fa 100644 --- a/tests/systemtests/go.mod +++ b/tests/systemtests/go.mod @@ -20,15 +20,12 @@ require ( github.com/stretchr/testify v1.9.0 github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/grpc v1.68.0 + google.golang.org/grpc v1.68.0 // indirect ) require ( cosmossdk.io/math v1.4.0 cosmossdk.io/systemtests v0.0.0-00010101000000-000000000000 - github.com/cometbft/cometbft v0.38.15 - github.com/cometbft/cometbft/api v1.0.0-rc.1 - github.com/creachadair/tomledit v0.0.26 github.com/tidwall/gjson v1.14.2 github.com/tidwall/sjson v1.2.5 ) @@ -61,12 +58,15 @@ require ( github.com/cockroachdb/pebble v1.1.1 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft v0.38.15 // indirect github.com/cometbft/cometbft-db v0.14.1 // indirect + github.com/cometbft/cometbft/api v1.0.0-rc.1 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-db v1.0.3-0.20240829004618-717cba019b33 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/ics23/go v0.11.0 // indirect github.com/cosmos/ledger-cosmos-go v0.13.3 // indirect + github.com/creachadair/tomledit v0.0.26 // indirect github.com/danieljoos/wincred v1.1.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect diff --git a/tests/systemtests/go.sum b/tests/systemtests/go.sum index 00148bcc6249..36283124bd5c 100644 --- a/tests/systemtests/go.sum +++ b/tests/systemtests/go.sum @@ -772,9 +772,8 @@ golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgR golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc h1:O9NuF4s+E/PvMIy+9IUZB9znFwUIXEWSstNjek6VpVg= golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo= -golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -788,8 +787,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -921,8 +920,8 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= -golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 1ca3a7add419606e1853098122f5f2c11536d626 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 22 Nov 2024 14:30:43 +0100 Subject: [PATCH 4/6] Better readme --- systemtests/README.md | 28 +++++++++++--------- tests/systemtests/README.md | 48 ++++++++++++++++++++++++++++++++++ tests/systemtests/bank_test.go | 1 - 3 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 tests/systemtests/README.md diff --git a/systemtests/README.md b/systemtests/README.md index 44d165029456..5a9b51a603a3 100644 --- a/systemtests/README.md +++ b/systemtests/README.md @@ -1,21 +1,23 @@ -# Testing +# System Tests -Test framework for system tests. -Starts and interacts with a (multi node) blockchain in Go. -Supports +This package contains the testing framework for black-box system tests. It includes a test runner that sets up a +multi-node blockchain locally for use in tests. The framework provides utilities and helpers for easy access and +setup in tests. -* CLI -* Servers -* Events -* RPC +## Components -Uses: +- **CLI**: Command-line interface wrapper for interacting with the chain or keyring +- **Servers**: Server instances to run the blockchain environment. +- **Events**: Event listeners +- **RPC**: Remote Procedure Call setup for communication. -* testify -* gjson -* sjson +## Dependencies -Server and client side are executed on the host machine. +- **testify**: Testing toolkit. +- **gjson**: JSON parser. +- **sjson**: JSON modifier. + +Server and client-side operations are executed on the host machine. ## Developer diff --git a/tests/systemtests/README.md b/tests/systemtests/README.md new file mode 100644 index 000000000000..d2aa7112d5be --- /dev/null +++ b/tests/systemtests/README.md @@ -0,0 +1,48 @@ +# System tests + +Go black box tests that setup and interact with a local blockchain. The system test [framework](../../systemtests) +works with the compiled binary of the chain artifact only. +To get up to speed, checkout the [getting started guide](../../systemtests/getting_started.md). + +Beside the Go tests and testdata files, this directory can contain the following directories: + +* `binaries` - cache for binary +* `testnet` - node files + +Please make sure to not add or push them to git. + +## Execution + +Build a new binary from current branch and copy it to the `tests/systemtests/binaries` folder by running system tests. +In project root: + +```shell +make test-system +``` + +Or via manual steps + +```shell +make build +mkdir -p ./tests/systemtests/binaries +cp ./build/simd ./tests/systemtests/binaries/ +``` + +### Manual test run + +```shell +go test -v -mod=readonly -failfast -tags='system_test' --run TestStakeUnstake ./... --verbose +``` + +### Working with macOS + +Most tests should function seamlessly. However, the file [upgrade_test.go](upgrade_test.go) includes a **build annotation** for Linux only. + +For the system upgrade test, an older version of the binary is utilized to perform a chain upgrade. This artifact is retrieved from a Docker container built for Linux. + +To circumvent this limitation locally: +1. Checkout and build the older version of the artifact from a specific tag for your OS. +2. Place the built artifact into the `binaries` folder. +3. Ensure that the filename, including the version, is correct. + +With the cached artifact in place, the test will use this file instead of attempting to pull it from Docker. \ No newline at end of file diff --git a/tests/systemtests/bank_test.go b/tests/systemtests/bank_test.go index e968dc736b2c..4591233f5cc8 100644 --- a/tests/systemtests/bank_test.go +++ b/tests/systemtests/bank_test.go @@ -24,7 +24,6 @@ func TestBankSendTxCmd(t *testing.T) { // get validator address valAddr := cli.GetKeyAddr("node0") - require.NotEmpty(t, valAddr) // add new key receiverAddr := cli.AddKey("account1") From 80a4803dd3beccad103d1d87d8d63085318b5968 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Tue, 26 Nov 2024 09:36:20 +0100 Subject: [PATCH 5/6] Add changelog to systemtest framework --- systemtests/CHANGELOG.md | 41 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 systemtests/CHANGELOG.md diff --git a/systemtests/CHANGELOG.md b/systemtests/CHANGELOG.md new file mode 100644 index 000000000000..52aaba381361 --- /dev/null +++ b/systemtests/CHANGELOG.md @@ -0,0 +1,41 @@ + + +# Changelog + +## [Unreleased] + +### Features + +* [#22578](https://github.com/cosmos/cosmos-sdk/pull/22578) Extract system test framework From 4c41f883ab7433d336fbb57acc06c1655ed89522 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Tue, 26 Nov 2024 15:32:59 +0100 Subject: [PATCH 6/6] add to go work example --- go.work.example | 1 + 1 file changed, 1 insertion(+) diff --git a/go.work.example b/go.work.example index d402f72de0dc..f8a9021395e7 100644 --- a/go.work.example +++ b/go.work.example @@ -22,6 +22,7 @@ use ( ./server/v2/appmanager ./store ./store/v2 + ./systemtests ./runtime/v2 ./tools/cosmovisor ./tools/confix