From 4e37131602c30e2734d4c7a20a1908cc311499be Mon Sep 17 00:00:00 2001 From: Nikola Divic Date: Wed, 9 Feb 2022 23:47:40 +0100 Subject: [PATCH] test: chain inspect-usage cli command --- cli/chain.go | 19 ++++++++-------- cli/chain_test.go | 57 ++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 62 insertions(+), 14 deletions(-) diff --git a/cli/chain.go b/cli/chain.go index d3259c6c8..03dc309e0 100644 --- a/cli/chain.go +++ b/cli/chain.go @@ -416,6 +416,7 @@ var ChainInspectUsage = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { + afmt := NewAppFmt(cctx.App) api, closer, err := GetFullNodeAPI(cctx) if err != nil { return err @@ -517,23 +518,23 @@ var ChainInspectUsage = &cli.Command{ numRes := cctx.Int("num-results") - fmt.Printf("Total Gas Limit: %d\n", sum) - fmt.Printf("By Sender:\n") + afmt.Printf("Total Gas Limit: %d\n", sum) + afmt.Printf("By Sender:\n") for i := 0; i < numRes && i < len(senderVals); i++ { sv := senderVals[i] - fmt.Printf("%s\t%0.2f%%\t(total: %d, count: %d)\n", sv.Key, (100*float64(sv.Gas))/float64(sum), sv.Gas, bySenderC[sv.Key]) + afmt.Printf("%s\t%0.2f%%\t(total: %d, count: %d)\n", sv.Key, (100*float64(sv.Gas))/float64(sum), sv.Gas, bySenderC[sv.Key]) } - fmt.Println() - fmt.Printf("By Receiver:\n") + afmt.Println() + afmt.Printf("By Receiver:\n") for i := 0; i < numRes && i < len(destVals); i++ { sv := destVals[i] - fmt.Printf("%s\t%0.2f%%\t(total: %d, count: %d)\n", sv.Key, (100*float64(sv.Gas))/float64(sum), sv.Gas, byDestC[sv.Key]) + afmt.Printf("%s\t%0.2f%%\t(total: %d, count: %d)\n", sv.Key, (100*float64(sv.Gas))/float64(sum), sv.Gas, byDestC[sv.Key]) } - fmt.Println() - fmt.Printf("By Method:\n") + afmt.Println() + afmt.Printf("By Method:\n") for i := 0; i < numRes && i < len(methodVals); i++ { sv := methodVals[i] - fmt.Printf("%s\t%0.2f%%\t(total: %d, count: %d)\n", sv.Key, (100*float64(sv.Gas))/float64(sum), sv.Gas, byMethodC[sv.Key]) + afmt.Printf("%s\t%0.2f%%\t(total: %d, count: %d)\n", sv.Key, (100*float64(sv.Gas))/float64(sum), sv.Gas, byMethodC[sv.Key]) } return nil diff --git a/cli/chain_test.go b/cli/chain_test.go index 7607ea08d..105d9d550 100644 --- a/cli/chain_test.go +++ b/cli/chain_test.go @@ -10,9 +10,11 @@ import ( "testing" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/lotus/api" types "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/mock" + "github.com/filecoin-project/specs-actors/v7/actors/builtin" "github.com/golang/mock/gomock" cid "github.com/ipfs/go-cid" "github.com/stretchr/testify/assert" @@ -36,7 +38,6 @@ func TestChainHead(t *testing.T) { assert.Regexp(t, regexp.MustCompile(ts.Cids()[0].String()), buf.String()) } -// TestGetBlock checks if "chain getblock" returns the block information in the expected format func TestGetBlock(t *testing.T) { app, mockApi, buf, done := NewMockAppWithFullAPI(t, WithCategory("chain", ChainGetBlock)) defer done() @@ -72,7 +73,6 @@ func TestGetBlock(t *testing.T) { assert.True(t, block.Cid().Equals(out.Cid())) } -// TestChainReadObj checks if "chain read-obj" prints the referenced IPLD node as hex, if exists func TestReadOjb(t *testing.T) { app, mockApi, buf, done := NewMockAppWithFullAPI(t, WithCategory("chain", ChainReadObjCmd)) defer done() @@ -95,7 +95,6 @@ func TestReadOjb(t *testing.T) { assert.Equal(t, buf.String(), fmt.Sprintf("%x\n", obj.Bytes())) } -// TestChainDeleteObj checks if "chain delete-obj" deletes an object from the chain blockstore, respecting the --really-do-it flag func TestChainDeleteObj(t *testing.T) { cmd := WithCategory("chain", ChainDeleteObjCmd) block := mock.MkBlock(nil, 0, 0) @@ -128,7 +127,6 @@ func TestChainDeleteObj(t *testing.T) { }) } -// TestChainStatObj checks if "chain delete-obj" prints size and IPLD link counts for object, respecting the --base flag func TestChainStatObj(t *testing.T) { cmd := WithCategory("chain", ChainStatObjCmd) block := mock.MkBlock(nil, 0, 0) @@ -179,7 +177,6 @@ func TestChainStatObj(t *testing.T) { }) } -// TestChainGetMsg checks if "chain getmessage" properly decodes and serializes as JSON a Message fetched from the IPLD store func TestChainGetMsg(t *testing.T) { app, mockApi, buf, done := NewMockAppWithFullAPI(t, WithCategory("chain", ChainGetMsgCmd)) defer done() @@ -272,3 +269,53 @@ func TestSetHead(t *testing.T) { assert.NoError(t, err) }) } + +func TestInspectUsage(t *testing.T) { + cmd := WithCategory("chain", ChainInspectUsage) + ts := mock.TipSet(mock.MkBlock(nil, 0, 0)) + + from, err := mock.RandomActorAddress() + assert.NoError(t, err) + + to, err := mock.RandomActorAddress() + assert.NoError(t, err) + + msg := mock.UnsignedMessage(*from, *to, 0) + msgs := []api.Message{{Cid: msg.Cid(), Message: msg}} + + actor := &types.Actor{ + Code: builtin.StorageMarketActorCodeID, + Nonce: 0, + Balance: big.NewInt(1000000000), + } + + t.Run("default", func(t *testing.T) { + app, mockApi, buf, done := NewMockAppWithFullAPI(t, cmd) + defer done() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + gomock.InOrder( + mockApi.EXPECT().ChainHead(ctx).Return(ts, nil), + mockApi.EXPECT().ChainGetParentMessages(ctx, ts.Blocks()[0].Cid()).Return(msgs, nil), + mockApi.EXPECT().ChainGetTipSet(ctx, ts.Parents()).Return(nil, nil), + mockApi.EXPECT().StateGetActor(ctx, *to, ts.Key()).Return(actor, nil), + ) + + err := app.Run([]string{"chain", "inspect-usage"}) + assert.NoError(t, err) + + out := buf.String() + + fmt.Println("🔥: ", out) + + // output is plaintext, had to do string matching + assert.Contains(t, out, "By Sender") + assert.Contains(t, out, from.String()) + assert.Contains(t, out, "By Receiver") + assert.Contains(t, out, to.String()) + assert.Contains(t, out, "By Method") + assert.Contains(t, out, "Send") + }) +}