Skip to content

Commit

Permalink
Merge remote-tracking branch 'pokt/main' into feat/replay-observable
Browse files Browse the repository at this point in the history
* pokt/main:
  chore: enforce go standard interface implementation registration (#87)
  [E2E] Add Regression Testing for Send E2E Feature Test (#84)
  feat: seperate tests from go_develop (#89)
  • Loading branch information
bryanchriswhite committed Oct 24, 2023
2 parents 65c9e6e + bc38510 commit de9c0ee
Show file tree
Hide file tree
Showing 18 changed files with 125 additions and 36 deletions.
16 changes: 15 additions & 1 deletion .github/workflows/reviewdog.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,20 @@ jobs:
fail_on_error: true
pattern: TODO_IN_THIS_

check_non_standard_interface_implementations:
name: Check for non-standard interface implementation statements
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pokt-network/action-fail-on-found@v1
with:
github_token: ${{ secrets.github_token }}
reporter: github-pr-review
level: error
fail_on_error: true
pattern: var _ .* = &.*{}
ignore: .github,.git

# More info: https://github.com/reviewdog/action-misspell
check_misspell:
name: Check misspelling
Expand All @@ -31,4 +45,4 @@ jobs:
github_token: ${{ secrets.github_token }}
reporter: github-check
level: warning
locale: "US"
locale: "US"
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,10 @@ go_mockgen: ## Use `mockgen` to generate mocks used for testing purposes of all
go generate ./x/supplier/types/

.PHONY: go_develop
go_develop: proto_regen go_mockgen go_test ## Generate protos, mocks and run all tests
go_develop: proto_regen go_mockgen ## Generate protos and mocks

.PHONY: go_develop_and_test
go_develop_and_test: go_develop go_test ## Generate protos, mocks and run all tests

#############
### TODOS ###
Expand Down
103 changes: 85 additions & 18 deletions e2e/tests/init_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,37 @@ package e2e
import (
"fmt"
"regexp"
"strconv"
"strings"
"testing"
"time"

"github.com/regen-network/gocuke"
"github.com/stretchr/testify/require"
)

var addrRe *regexp.Regexp
var (
addrRe *regexp.Regexp
amountRe *regexp.Regexp
accNameToAddrMap = make(map[string]string)
keyRingFlag = "--keyring-backend=test"
)

func init() {
addrRe = regexp.MustCompile(`address:\s+(pokt1\w+)`)
addrRe = regexp.MustCompile(`address: (\S+)\s+name: (\S+)`)
amountRe = regexp.MustCompile(`amount: "(.+?)"\s+denom: upokt`)
}

type suite struct {
gocuke.TestingT
pocketd *pocketdBin
pocketd *pocketdBin
scenarioState map[string]any // temporary state for each scenario
}

func (s *suite) Before() {
s.pocketd = new(pocketdBin)
s.scenarioState = make(map[string]any)
s.buildAddrMap()
}

// TestFeatures runs the e2e tests specified in any .features files in this directory
Expand Down Expand Up @@ -56,17 +67,15 @@ func (s *suite) TheUserShouldBeAbleToSeeStandardOutputContaining(arg1 string) {
}
}

func (s *suite) TheUserSendsUpoktToAnotherAddress(amount int64) {
addrs := s.getAddresses()
func (s *suite) TheUserSendsUpoktFromAccountToAccount(amount int64, accName1, accName2 string) {
args := []string{
"tx",
"bank",
"send",
addrs[0],
addrs[1],
accNameToAddrMap[accName1],
accNameToAddrMap[accName2],
fmt.Sprintf("%dupokt", amount),
"--keyring-backend",
"test",
keyRingFlag,
"-y",
}
res, err := s.pocketd.RunCommandOnHost("", args...)
Expand All @@ -76,20 +85,78 @@ func (s *suite) TheUserSendsUpoktToAnotherAddress(amount int64) {
s.pocketd.result = res
}

func (s *suite) getAddresses() [2]string {
var strs [2]string
func (s *suite) TheAccountHasABalanceGreaterThanUpokt(accName string, amount int64) {
bal := s.getAccBalance(accName)
if int64(bal) < amount {
s.Fatalf("account %s does not have enough upokt: %d < %d", accName, bal, amount)
}
s.scenarioState[accName] = bal // save the balance for later
}

func (s *suite) AnAccountExistsFor(accName string) {
bal := s.getAccBalance(accName)
s.scenarioState[accName] = bal // save the balance for later
}

func (s *suite) TheAccountBalanceOfShouldBeUpoktThanBefore(accName string, amount int64, condition string) {
prev, ok := s.scenarioState[accName]
if !ok {
s.Fatalf("no previous balance found for %s", accName)
}

bal := s.getAccBalance(accName)
switch condition {
case "more":
if bal <= prev.(int) {
s.Fatalf("account %s expected to have more upokt but: %d <= %d", accName, bal, prev)
}
case "less":
if bal >= prev.(int) {
s.Fatalf("account %s expected to have less upokt but: %d >= %d", accName, bal, prev)
}
default:
s.Fatalf("unknown condition %s", condition)
}
}

func (s *suite) TheUserShouldWaitForSeconds(dur int64) {
time.Sleep(time.Duration(dur) * time.Second)
}

func (s *suite) buildAddrMap() {
s.Helper()
res, err := s.pocketd.RunCommand(
"keys", "list", "--keyring-backend", "test",
"keys", "list", keyRingFlag,
)
if err != nil {
s.Fatalf("error getting keys: %s", err)
}
matches := addrRe.FindAllStringSubmatch(res.Stdout, -1)
if len(matches) >= 2 {
strs[0] = matches[0][1]
strs[1] = matches[len(matches)-1][1]
} else {
s.Fatalf("could not find two addresses in output: %s", res.Stdout)
for _, match := range matches {
name := match[2]
address := match[1]
accNameToAddrMap[name] = address
}
}

func (s *suite) getAccBalance(accName string) int {
s.Helper()
args := []string{
"query",
"bank",
"balances",
accNameToAddrMap[accName],
}
res, err := s.pocketd.RunCommandOnHost("", args...)
if err != nil {
s.Fatalf("error getting balance: %s", err)
}
s.pocketd.result = res
match := amountRe.FindStringSubmatch(res.Stdout)
if len(match) < 2 {
s.Fatalf("no balance found for %s", accName)
}
return strs
found, err := strconv.Atoi(match[1])
require.NoError(s, err)
return found
}
4 changes: 2 additions & 2 deletions e2e/tests/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ func init() {
defaultRPCURL = fmt.Sprintf("tcp://%s:%d", defaultRPCHost, defaultRPCPort)
}
if defaultHome == "" {
defaultHome = "./localnet/pocketd"
defaultHome = "../../localnet/pocketd"
}
}

Expand All @@ -42,7 +42,7 @@ type PocketClient interface {
}

// Ensure that pocketdBin struct fulfills PocketClient
var _ PocketClient = &pocketdBin{}
var _ PocketClient = (*pocketdBin)(nil)

// pocketdBin holds the reults of the last command that was run
type pocketdBin struct {
Expand Down
7 changes: 6 additions & 1 deletion e2e/tests/send.feature
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@ Feature: Tx Namespace

Scenario: User can send uPOKT
Given the user has the pocketd binary installed
When the user sends 10000 uPOKT to another address
And the account "app1" has a balance greater than "1000" uPOKT
And an account exists for "app2"
When the user sends "1000" uPOKT from account "app1" to account "app2"
Then the user should be able to see standard output containing "txhash:"
And the user should be able to see standard output containing "code: 0"
And the pocketd binary should exit without error
And the user should wait for "5" seconds
And the account balance of "app1" should be "1000" uPOKT "less" than before
And the account balance of "app2" should be "1000" uPOKT "more" than before
2 changes: 1 addition & 1 deletion pkg/observable/channel/observable.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (
// defaultSubscribeBufferSize is the buffer size of a observable's publish channel.
const defaultPublishBufferSize = 50

var _ observable.Observable[any] = &channelObservable[any]{}
var _ observable.Observable[any] = (*channelObservable[any])(nil)

// option is a function which receives and can modify the channelObservable state.
type option[V any] func(obs *channelObservable[V])
Expand Down
2 changes: 1 addition & 1 deletion pkg/observable/channel/observer.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ const (
sendRetryInterval = 100 * time.Millisecond
)

var _ observable.Observer[any] = &channelObserver[any]{}
var _ observable.Observer[any] = (*channelObserver[any])(nil)

// channelObserver implements the observable.Observer interface.
type channelObserver[V any] struct {
Expand Down
2 changes: 1 addition & 1 deletion pkg/relayer/proxy/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (
suppliertypes "pocket/x/supplier/types"
)

var _ RelayerProxy = &relayerProxy{}
var _ RelayerProxy = (*relayerProxy)(nil)

type relayerProxy struct {
// keyName is the supplier's key name in the Cosmos's keybase. It is used along with the keyring to
Expand Down
2 changes: 1 addition & 1 deletion x/application/types/message_delegate_to_gateway.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (

const TypeMsgDelegateToGateway = "delegate_to_gateway"

var _ sdk.Msg = &MsgDelegateToGateway{}
var _ sdk.Msg = (*MsgDelegateToGateway)(nil)

func NewMsgDelegateToGateway(address string) *MsgDelegateToGateway {
return &MsgDelegateToGateway{
Expand Down
2 changes: 1 addition & 1 deletion x/application/types/message_stake_application.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (

const TypeMsgStakeApplication = "stake_application"

var _ sdk.Msg = &MsgStakeApplication{}
var _ sdk.Msg = (*MsgStakeApplication)(nil)

func NewMsgStakeApplication(
address string,
Expand Down
2 changes: 1 addition & 1 deletion x/application/types/message_undelegate_from_gateway.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (

const TypeMsgUndelegateFromGateway = "undelegate_from_gateway"

var _ sdk.Msg = &MsgUndelegateFromGateway{}
var _ sdk.Msg = (*MsgUndelegateFromGateway)(nil)

func NewMsgUndelegateFromGateway(address string) *MsgUndelegateFromGateway {
return &MsgUndelegateFromGateway{
Expand Down
2 changes: 1 addition & 1 deletion x/application/types/message_unstake_application.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (

const TypeMsgUnstakeApplication = "unstake_application"

var _ sdk.Msg = &MsgUnstakeApplication{}
var _ sdk.Msg = (*MsgUnstakeApplication)(nil)

func NewMsgUnstakeApplication(address string) *MsgUnstakeApplication {
return &MsgUnstakeApplication{
Expand Down
2 changes: 1 addition & 1 deletion x/gateway/types/message_stake_gateway.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (

const TypeMsgStakeGateway = "stake_gateway"

var _ sdk.Msg = &MsgStakeGateway{}
var _ sdk.Msg = (*MsgStakeGateway)(nil)

func NewMsgStakeGateway(address string, stake types.Coin) *MsgStakeGateway {
return &MsgStakeGateway{
Expand Down
2 changes: 1 addition & 1 deletion x/gateway/types/message_unstake_gateway.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (

const TypeMsgUnstakeGateway = "unstake_gateway"

var _ sdk.Msg = &MsgUnstakeGateway{}
var _ sdk.Msg = (*MsgUnstakeGateway)(nil)

func NewMsgUnstakeGateway(address string) *MsgUnstakeGateway {
return &MsgUnstakeGateway{
Expand Down
2 changes: 1 addition & 1 deletion x/supplier/types/message_create_claim.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (

const TypeMsgCreateClaim = "create_claim"

var _ sdk.Msg = &MsgCreateClaim{}
var _ sdk.Msg = (*MsgCreateClaim)(nil)

func NewMsgCreateClaim(supplierAddress string, sessionHeader *sessiontypes.SessionHeader, rootHash []byte) *MsgCreateClaim {
return &MsgCreateClaim{
Expand Down
2 changes: 1 addition & 1 deletion x/supplier/types/message_stake_supplier.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (

const TypeMsgStakeSupplier = "stake_supplier"

var _ sdk.Msg = &MsgStakeSupplier{}
var _ sdk.Msg = (*MsgStakeSupplier)(nil)

func NewMsgStakeSupplier(
address string,
Expand Down
2 changes: 1 addition & 1 deletion x/supplier/types/message_submit_proof.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (

const TypeMsgSubmitProof = "submit_proof"

var _ sdk.Msg = &MsgSubmitProof{}
var _ sdk.Msg = (*MsgSubmitProof)(nil)

func NewMsgSubmitProof(supplierAddress string, sessionHeader *sessiontypes.SessionHeader, proof []byte) *MsgSubmitProof {
return &MsgSubmitProof{
Expand Down
2 changes: 1 addition & 1 deletion x/supplier/types/message_unstake_supplier.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (

const TypeMsgUnstakeSupplier = "unstake_supplier"

var _ sdk.Msg = &MsgUnstakeSupplier{}
var _ sdk.Msg = (*MsgUnstakeSupplier)(nil)

func NewMsgUnstakeSupplier(address string) *MsgUnstakeSupplier {
return &MsgUnstakeSupplier{
Expand Down

0 comments on commit de9c0ee

Please sign in to comment.