Skip to content

Commit

Permalink
refactor(e2e): break e2e tests into atomic files (#116)
Browse files Browse the repository at this point in the history
Signed-off-by: Artur Troian <[email protected]>
  • Loading branch information
troian authored Apr 27, 2023
1 parent 97b9f73 commit a3d7411
Show file tree
Hide file tree
Showing 10 changed files with 1,176 additions and 1,039 deletions.
204 changes: 204 additions & 0 deletions integration/app_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
//go:build e2e

package integration

import (
"encoding/json"
"fmt"
"path/filepath"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/cosmos/cosmos-sdk/client/flags"

dtypes "github.com/akash-network/akash-api/go/node/deployment/v1beta3"
mtypes "github.com/akash-network/akash-api/go/node/market/v1beta3"
"github.com/akash-network/node/sdl"
clitestutil "github.com/akash-network/node/testutil/cli"
deploycli "github.com/akash-network/node/x/deployment/client/cli"
mcli "github.com/akash-network/node/x/market/client/cli"

providerCmd "github.com/akash-network/provider/cmd/provider-services/cmd"
ptestutil "github.com/akash-network/provider/testutil/provider"
)

type E2EApp struct {
IntegrationTestSuite
}

func (s *E2EApp) TestE2EApp() {
// create a deployment
deploymentPath, err := filepath.Abs("../testdata/deployment/deployment-v2.yaml")
s.Require().NoError(err)

cctxJSON := s.validator.ClientCtx.WithOutputFormat("json")

deploymentID := dtypes.DeploymentID{
Owner: s.keyTenant.GetAddress().String(),
DSeq: uint64(103),
}

// Create Deployments and assert query to assert
tenantAddr := s.keyTenant.GetAddress().String()
res, err := deploycli.TxCreateDeploymentExec(
s.validator.ClientCtx,
s.keyTenant.GetAddress(),
deploymentPath,
cliGlobalFlags(fmt.Sprintf("--dseq=%v", deploymentID.DSeq))...,
)
s.Require().NoError(err)
s.Require().NoError(s.network.WaitForNextBlock())
clitestutil.ValidateTxSuccessful(s.T(), s.validator.ClientCtx, res.Bytes())

// Test query deployments ---------------------------------------------
res, err = deploycli.QueryDeploymentsExec(cctxJSON)
s.Require().NoError(err)

deployResp := &dtypes.QueryDeploymentsResponse{}
err = s.validator.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), deployResp)
s.Require().NoError(err)
s.Require().Len(deployResp.Deployments, 1, "Deployment Create Failed")
deployments := deployResp.Deployments
s.Require().Equal(tenantAddr, deployments[0].Deployment.DeploymentID.Owner)

// test query deployment
createdDep := deployments[0]
res, err = deploycli.QueryDeploymentExec(cctxJSON, createdDep.Deployment.DeploymentID)
s.Require().NoError(err)

deploymentResp := dtypes.QueryDeploymentResponse{}
err = s.validator.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &deploymentResp)
s.Require().NoError(err)
s.Require().Equal(createdDep, deploymentResp)
s.Require().NotEmpty(deploymentResp.Deployment.Version)

// test query deployments with filters -----------------------------------
res, err = deploycli.QueryDeploymentsExec(
s.validator.ClientCtx.WithOutputFormat("json"),
fmt.Sprintf("--owner=%s", tenantAddr),
fmt.Sprintf("--dseq=%v", createdDep.Deployment.DeploymentID.DSeq),
)
s.Require().NoError(err, "Error when fetching deployments with owner filter")

deployResp = &dtypes.QueryDeploymentsResponse{}
err = s.validator.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), deployResp)
s.Require().NoError(err)
s.Require().Len(deployResp.Deployments, 1)

// Assert orders created by provider
// test query orders
res, err = mcli.QueryOrdersExec(cctxJSON)
s.Require().NoError(err)

result := &mtypes.QueryOrdersResponse{}
err = s.validator.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), result)
s.Require().NoError(err)
s.Require().Len(result.Orders, 1)
orders := result.Orders
s.Require().Equal(tenantAddr, orders[0].OrderID.Owner)

// Wait for then EndBlock to handle bidding and creating lease
s.Require().NoError(s.waitForBlocksCommitted(15))

// Assert provider made bid and created lease; test query leases
// Assert provider made bid and created lease; test query leases
res, err = mcli.QueryBidsExec(cctxJSON)
s.Require().NoError(err)
bidsRes := &mtypes.QueryBidsResponse{}
err = s.validator.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), bidsRes)
s.Require().NoError(err)
s.Require().Len(bidsRes.Bids, 1)

res, err = mcli.TxCreateLeaseExec(
cctxJSON,
bidsRes.Bids[0].Bid.BidID,
s.keyTenant.GetAddress(),
cliGlobalFlags()...,
)
s.Require().NoError(err)
s.Require().NoError(s.waitForBlocksCommitted(6))
clitestutil.ValidateTxSuccessful(s.T(), s.validator.ClientCtx, res.Bytes())

res, err = mcli.QueryLeasesExec(cctxJSON)
s.Require().NoError(err)

leaseRes := &mtypes.QueryLeasesResponse{}
err = s.validator.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), leaseRes)
s.Require().NoError(err)
s.Require().Len(leaseRes.Leases, 1)

lease := newestLease(leaseRes.Leases)
lid := lease.LeaseID
s.Require().Equal(s.keyProvider.GetAddress().String(), lid.Provider)

// Send Manifest to Provider ----------------------------------------------
_, err = ptestutil.TestSendManifest(
cctxJSON,
lid.BidID(),
deploymentPath,
fmt.Sprintf("--%s=%s", flags.FlagFrom, s.keyTenant.GetAddress().String()),
fmt.Sprintf("--%s=%s", flags.FlagHome, s.validator.ClientCtx.HomeDir),
)
s.Require().NoError(err)
s.Require().NoError(s.waitForBlocksCommitted(20))

appURL := fmt.Sprintf("http://%s:%s/", s.appHost, s.appPort)
queryApp(s.T(), appURL, 50)

cmdResult, err := providerCmd.ProviderStatusExec(s.validator.ClientCtx, lid.Provider)
assert.NoError(s.T(), err)
data := make(map[string]interface{})
err = json.Unmarshal(cmdResult.Bytes(), &data)
assert.NoError(s.T(), err)
leaseCount, ok := data["cluster"].(map[string]interface{})["leases"]
assert.True(s.T(), ok)
assert.Equal(s.T(), float64(1), leaseCount)

// Read SDL into memory so each service can be checked
deploymentSdl, err := sdl.ReadFile(deploymentPath)
require.NoError(s.T(), err)
mani, err := deploymentSdl.Manifest()
require.NoError(s.T(), err)

cmdResult, err = providerCmd.ProviderLeaseStatusExec(
s.validator.ClientCtx,
fmt.Sprintf("--%s=%v", "dseq", lid.DSeq),
fmt.Sprintf("--%s=%v", "gseq", lid.GSeq),
fmt.Sprintf("--%s=%v", "oseq", lid.OSeq),
fmt.Sprintf("--%s=%v", "provider", lid.Provider),
fmt.Sprintf("--%s=%s", flags.FlagFrom, s.keyTenant.GetAddress().String()),
fmt.Sprintf("--%s=%s", flags.FlagHome, s.validator.ClientCtx.HomeDir),
)
assert.NoError(s.T(), err)
err = json.Unmarshal(cmdResult.Bytes(), &data)
assert.NoError(s.T(), err)
for _, group := range mani.GetGroups() {
for _, service := range group.Services {
serviceTotalCount, ok := data["services"].(map[string]interface{})[service.Name].(map[string]interface{})["total"]
assert.True(s.T(), ok)
assert.Greater(s.T(), serviceTotalCount, float64(0))
}
}

for _, group := range mani.GetGroups() {
for _, service := range group.Services {
cmdResult, err = providerCmd.ProviderServiceStatusExec(
s.validator.ClientCtx,
fmt.Sprintf("--%s=%v", "dseq", lid.DSeq),
fmt.Sprintf("--%s=%v", "gseq", lid.GSeq),
fmt.Sprintf("--%s=%v", "oseq", lid.OSeq),
fmt.Sprintf("--%s=%v", "provider", lid.Provider),
fmt.Sprintf("--%s=%v", "service", service.Name),
fmt.Sprintf("--%s=%s", flags.FlagFrom, s.keyTenant.GetAddress().String()),
fmt.Sprintf("--%s=%s", flags.FlagHome, s.validator.ClientCtx.HomeDir),
)
assert.NoError(s.T(), err)
err = json.Unmarshal(cmdResult.Bytes(), &data)
assert.NoError(s.T(), err)
serviceTotalCount, ok := data["services"].(map[string]interface{})[service.Name].(map[string]interface{})["total"]
assert.True(s.T(), ok)
assert.Greater(s.T(), serviceTotalCount, float64(0))
}
}
}
96 changes: 96 additions & 0 deletions integration/container2container_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
//go:build e2e

package integration

import (
"fmt"
"io"
"path/filepath"

"github.com/cosmos/cosmos-sdk/client/flags"

dtypes "github.com/akash-network/akash-api/go/node/deployment/v1beta3"
mtypes "github.com/akash-network/akash-api/go/node/market/v1beta3"
clitestutil "github.com/akash-network/node/testutil/cli"
deploycli "github.com/akash-network/node/x/deployment/client/cli"
mcli "github.com/akash-network/node/x/market/client/cli"

ptestutil "github.com/akash-network/provider/testutil/provider"
)

type E2EContainerToContainer struct {
IntegrationTestSuite
}

func (s *E2EContainerToContainer) TestE2EContainerToContainer() {
// create a deployment
deploymentPath, err := filepath.Abs("../testdata/deployment/deployment-v2-c2c.yaml")
s.Require().NoError(err)

deploymentID := dtypes.DeploymentID{
Owner: s.keyTenant.GetAddress().String(),
DSeq: uint64(100),
}

// Create Deployments
res, err := deploycli.TxCreateDeploymentExec(
s.validator.ClientCtx,
s.keyTenant.GetAddress(),
deploymentPath,
cliGlobalFlags(deploymentDeposit,
fmt.Sprintf("--dseq=%v", deploymentID.DSeq))...,
)
s.Require().NoError(err)
s.Require().NoError(s.waitForBlocksCommitted(7))
clitestutil.ValidateTxSuccessful(s.T(), s.validator.ClientCtx, res.Bytes())

bidID := mtypes.MakeBidID(
mtypes.MakeOrderID(dtypes.MakeGroupID(deploymentID, 1), 1),
s.keyProvider.GetAddress(),
)

// check bid
_, err = mcli.QueryBidExec(s.validator.ClientCtx, bidID)
s.Require().NoError(err)

// create lease
_, err = mcli.TxCreateLeaseExec(
s.validator.ClientCtx,
bidID,
s.keyTenant.GetAddress(),
cliGlobalFlags()...,
)
s.Require().NoError(err)
s.Require().NoError(s.waitForBlocksCommitted(2))
clitestutil.ValidateTxSuccessful(s.T(), s.validator.ClientCtx, res.Bytes())

lid := bidID.LeaseID()

// Send Manifest to Provider ----------------------------------------------
_, err = ptestutil.TestSendManifest(
s.validator.ClientCtx.WithOutputFormat("json"),
lid.BidID(),
deploymentPath,
fmt.Sprintf("--%s=%s", flags.FlagFrom, s.keyTenant.GetAddress().String()),
fmt.Sprintf("--%s=%s", flags.FlagHome, s.validator.ClientCtx.HomeDir),
)
s.Require().NoError(err)
s.Require().NoError(s.waitForBlocksCommitted(2))

// Hit the endpoint to set a key in redis, foo = bar
appURL := fmt.Sprintf("http://%s:%s/SET/foo/bar", s.appHost, s.appPort)

const testHost = "webdistest.localhost"
const attempts = 120
httpResp := queryAppWithRetries(s.T(), appURL, testHost, attempts)
bodyData, err := io.ReadAll(httpResp.Body)
s.Require().NoError(err)
s.Require().Equal(`{"SET":[true,"OK"]}`, string(bodyData))

// Hit the endpoint to read a key in redis, foo
appURL = fmt.Sprintf("http://%s:%s/GET/foo", s.appHost, s.appPort)
httpResp = queryAppWithRetries(s.T(), appURL, testHost, attempts)
bodyData, err = io.ReadAll(httpResp.Body)
s.Require().NoError(err)
s.Require().Equal(`{"GET":"bar"}`, string(bodyData)) // Check that the value is bar
}
Loading

0 comments on commit a3d7411

Please sign in to comment.