test: chain list (love) cli command
Some "funky" string matching in this one, but I think that's ok.
Chain is love. ❤️
This commit is contained in:
parent
4e37131602
commit
b3f7db7a15
15
cli/chain.go
15
cli/chain.go
@ -559,6 +559,7 @@ var ChainListCmd = &cli.Command{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
|
afmt := NewAppFmt(cctx.App)
|
||||||
api, closer, err := GetFullNodeAPI(cctx)
|
api, closer, err := GetFullNodeAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -606,7 +607,7 @@ var ChainListCmd = &cli.Command{
|
|||||||
tss = otss
|
tss = otss
|
||||||
for i, ts := range tss {
|
for i, ts := range tss {
|
||||||
pbf := ts.Blocks()[0].ParentBaseFee
|
pbf := ts.Blocks()[0].ParentBaseFee
|
||||||
fmt.Printf("%d: %d blocks (baseFee: %s -> maxFee: %s)\n", ts.Height(), len(ts.Blocks()), ts.Blocks()[0].ParentBaseFee, types.FIL(types.BigMul(pbf, types.NewInt(uint64(build.BlockGasLimit)))))
|
afmt.Printf("%d: %d blocks (baseFee: %s -> maxFee: %s)\n", ts.Height(), len(ts.Blocks()), ts.Blocks()[0].ParentBaseFee, types.FIL(types.BigMul(pbf, types.NewInt(uint64(build.BlockGasLimit)))))
|
||||||
|
|
||||||
for _, b := range ts.Blocks() {
|
for _, b := range ts.Blocks() {
|
||||||
msgs, err := api.ChainGetBlockMessages(ctx, b.Cid())
|
msgs, err := api.ChainGetBlockMessages(ctx, b.Cid())
|
||||||
@ -632,7 +633,7 @@ var ChainListCmd = &cli.Command{
|
|||||||
avgpremium = big.Div(psum, big.NewInt(int64(lenmsgs)))
|
avgpremium = big.Div(psum, big.NewInt(int64(lenmsgs)))
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("\t%s: \t%d msgs, gasLimit: %d / %d (%0.2f%%), avgPremium: %s\n", b.Miner, len(msgs.BlsMessages)+len(msgs.SecpkMessages), limitSum, build.BlockGasLimit, 100*float64(limitSum)/float64(build.BlockGasLimit), avgpremium)
|
afmt.Printf("\t%s: \t%d msgs, gasLimit: %d / %d (%0.2f%%), avgPremium: %s\n", b.Miner, len(msgs.BlsMessages)+len(msgs.SecpkMessages), limitSum, build.BlockGasLimit, 100*float64(limitSum)/float64(build.BlockGasLimit), avgpremium)
|
||||||
}
|
}
|
||||||
if i < len(tss)-1 {
|
if i < len(tss)-1 {
|
||||||
msgs, err := api.ChainGetParentMessages(ctx, tss[i+1].Blocks()[0].Cid())
|
msgs, err := api.ChainGetParentMessages(ctx, tss[i+1].Blocks()[0].Cid())
|
||||||
@ -657,13 +658,13 @@ var ChainListCmd = &cli.Command{
|
|||||||
gasEfficiency := 100 * float64(gasUsed) / float64(limitSum)
|
gasEfficiency := 100 * float64(gasUsed) / float64(limitSum)
|
||||||
gasCapacity := 100 * float64(limitSum) / float64(build.BlockGasLimit)
|
gasCapacity := 100 * float64(limitSum) / float64(build.BlockGasLimit)
|
||||||
|
|
||||||
fmt.Printf("\ttipset: \t%d msgs, %d (%0.2f%%) / %d (%0.2f%%)\n", len(msgs), gasUsed, gasEfficiency, limitSum, gasCapacity)
|
afmt.Printf("\ttipset: \t%d msgs, %d (%0.2f%%) / %d (%0.2f%%)\n", len(msgs), gasUsed, gasEfficiency, limitSum, gasCapacity)
|
||||||
}
|
}
|
||||||
fmt.Println()
|
afmt.Println()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for i := len(tss) - 1; i >= 0; i-- {
|
for i := len(tss) - 1; i >= 0; i-- {
|
||||||
printTipSet(cctx.String("format"), tss[i])
|
printTipSet(cctx.String("format"), tss[i], afmt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -889,7 +890,7 @@ func handleHamtAddress(ctx context.Context, api v0api.FullNode, r cid.Cid) error
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func printTipSet(format string, ts *types.TipSet) {
|
func printTipSet(format string, ts *types.TipSet, afmt *AppFmt) {
|
||||||
format = strings.ReplaceAll(format, "<height>", fmt.Sprint(ts.Height()))
|
format = strings.ReplaceAll(format, "<height>", fmt.Sprint(ts.Height()))
|
||||||
format = strings.ReplaceAll(format, "<time>", time.Unix(int64(ts.MinTimestamp()), 0).Format(time.Stamp))
|
format = strings.ReplaceAll(format, "<time>", time.Unix(int64(ts.MinTimestamp()), 0).Format(time.Stamp))
|
||||||
blks := "[ "
|
blks := "[ "
|
||||||
@ -908,7 +909,7 @@ func printTipSet(format string, ts *types.TipSet) {
|
|||||||
format = strings.ReplaceAll(format, "<blocks>", blks)
|
format = strings.ReplaceAll(format, "<blocks>", blks)
|
||||||
format = strings.ReplaceAll(format, "<weight>", fmt.Sprint(ts.Blocks()[0].ParentWeight))
|
format = strings.ReplaceAll(format, "<weight>", fmt.Sprint(ts.Blocks()[0].ParentWeight))
|
||||||
|
|
||||||
fmt.Println(format)
|
afmt.Println(format)
|
||||||
}
|
}
|
||||||
|
|
||||||
var ChainBisectCmd = &cli.Command{
|
var ChainBisectCmd = &cli.Command{
|
||||||
|
@ -308,14 +308,57 @@ func TestInspectUsage(t *testing.T) {
|
|||||||
|
|
||||||
out := buf.String()
|
out := buf.String()
|
||||||
|
|
||||||
fmt.Println("🔥: ", out)
|
|
||||||
|
|
||||||
// output is plaintext, had to do string matching
|
// output is plaintext, had to do string matching
|
||||||
assert.Contains(t, out, "By Sender")
|
|
||||||
assert.Contains(t, out, from.String())
|
assert.Contains(t, out, from.String())
|
||||||
assert.Contains(t, out, "By Receiver")
|
|
||||||
assert.Contains(t, out, to.String())
|
assert.Contains(t, out, to.String())
|
||||||
assert.Contains(t, out, "By Method")
|
|
||||||
assert.Contains(t, out, "Send")
|
assert.Contains(t, out, "Send")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestChainList(t *testing.T) {
|
||||||
|
cmd := WithCategory("chain", ChainListCmd)
|
||||||
|
genesis := mock.TipSet(mock.MkBlock(nil, 0, 0))
|
||||||
|
blk := mock.MkBlock(genesis, 0, 0)
|
||||||
|
blk.Height = 1
|
||||||
|
head := mock.TipSet(blk)
|
||||||
|
|
||||||
|
head.Height()
|
||||||
|
|
||||||
|
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}}
|
||||||
|
blockMsgs := &api.BlockMessages{}
|
||||||
|
receipts := []*types.MessageReceipt{}
|
||||||
|
|
||||||
|
t.Run("default", func(t *testing.T) {
|
||||||
|
app, mockApi, buf, done := NewMockAppWithFullAPI(t, cmd)
|
||||||
|
defer done()
|
||||||
|
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
// same method gets called mocked multiple times bcs it's called in a for loop for all tipsets (2 in this case)
|
||||||
|
gomock.InOrder(
|
||||||
|
mockApi.EXPECT().ChainHead(ctx).Return(head, nil),
|
||||||
|
mockApi.EXPECT().ChainGetTipSet(ctx, head.Parents()).Return(genesis, nil),
|
||||||
|
mockApi.EXPECT().ChainGetBlockMessages(ctx, genesis.Blocks()[0].Cid()).Return(blockMsgs, nil),
|
||||||
|
mockApi.EXPECT().ChainGetParentMessages(ctx, head.Blocks()[0].Cid()).Return(msgs, nil),
|
||||||
|
mockApi.EXPECT().ChainGetParentReceipts(ctx, head.Blocks()[0].Cid()).Return(receipts, nil),
|
||||||
|
mockApi.EXPECT().ChainGetBlockMessages(ctx, head.Blocks()[0].Cid()).Return(blockMsgs, nil),
|
||||||
|
)
|
||||||
|
|
||||||
|
err := app.Run([]string{"chain", "love", "--gas-stats=true"}) // chain is love ❤️
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
out := buf.String()
|
||||||
|
|
||||||
|
// should print out 2 blocks, indexed with 0: and 1:
|
||||||
|
assert.Contains(t, out, "0:")
|
||||||
|
assert.Contains(t, out, "1:")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user