diff --git a/cli/chain.go b/cli/chain.go index 6e774e0e7..1e41a759c 100644 --- a/cli/chain.go +++ b/cli/chain.go @@ -932,6 +932,8 @@ var ChainBisectCmd = &cli.Command{ For special path elements see 'chain get' help `, Action: func(cctx *cli.Context) error { + afmt := NewAppFmt(cctx.App) + api, closer, err := GetFullNodeAPI(cctx) if err != nil { return err @@ -975,7 +977,7 @@ var ChainBisectCmd = &cli.Command{ } path := "/ipld/" + midTs.ParentState().String() + "/" + subPath - fmt.Printf("* Testing %d (%d - %d) (%s): ", mid, start, end, path) + afmt.Printf("* Testing %d (%d - %d) (%s): ", mid, start, end, path) nd, err := api.ChainGetNode(ctx, path) if err != nil { @@ -1002,32 +1004,32 @@ var ChainBisectCmd = &cli.Command{ if strings.TrimSpace(out.String()) != "false" { end = mid highest = midTs - fmt.Println("true") + afmt.Println("true") } else { start = mid - fmt.Printf("false (cli)\n") + afmt.Printf("false (cli)\n") } case *exec.ExitError: if len(serr.String()) > 0 { - fmt.Println("error") + afmt.Println("error") - fmt.Printf("> Command: %s\n---->\n", strings.Join(cctx.Args().Slice()[3:], " ")) - fmt.Println(string(b)) - fmt.Println("<----") + afmt.Printf("> Command: %s\n---->\n", strings.Join(cctx.Args().Slice()[3:], " ")) + afmt.Println(string(b)) + afmt.Println("<----") return xerrors.Errorf("error running bisect check: %s", serr.String()) } start = mid - fmt.Println("false") + afmt.Println("false") default: return err } if start == end { if strings.TrimSpace(out.String()) == "true" { - fmt.Println(midTs.Height()) + afmt.Println(midTs.Height()) } else { - fmt.Println(prev) + afmt.Println(prev) } return nil } diff --git a/cli/chain_test.go b/cli/chain_test.go index be75ebd05..70a4a4953 100644 --- a/cli/chain_test.go +++ b/cli/chain_test.go @@ -368,8 +368,6 @@ func TestChainGet(t *testing.T) { ts := mock.TipSet(blk) cmd := WithCategory("chain", ChainGetCmd) - // lotus chain get /ipfs/[cid]/some/path - // given no -as-type flag & ipfs prefix, should print object as JSON if it's marshalable t.Run("ipfs", func(t *testing.T) { path := fmt.Sprintf("/ipfs/%s", blk.Cid().String()) @@ -437,7 +435,42 @@ func TestChainGet(t *testing.T) { }) } -func TestChainBisect(t *testing.T) {} +func TestChainBisect(t *testing.T) { + blk1 := mock.MkBlock(nil, 0, 0) + blk1.Height = 0 + ts1 := mock.TipSet(blk1) + + blk2 := mock.MkBlock(ts1, 0, 0) + blk2.Height = 1 + ts2 := mock.TipSet(blk2) + + subpath := "whatever/its/mocked" + minHeight := uint64(0) + maxHeight := uint64(1) + shell := "echo" + + path := fmt.Sprintf("/ipld/%s/%s", ts2.ParentState(), subpath) + + cmd := WithCategory("chain", ChainBisectCmd) + + app, mockApi, buf, done := NewMockAppWithFullAPI(t, cmd) + defer done() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + gomock.InOrder( + mockApi.EXPECT().ChainGetTipSetByHeight(ctx, abi.ChainEpoch(maxHeight), types.EmptyTSK).Return(ts2, nil), + mockApi.EXPECT().ChainGetTipSetByHeight(ctx, abi.ChainEpoch(maxHeight), ts2.Key()).Return(ts2, nil), + mockApi.EXPECT().ChainGetNode(ctx, path).Return(&api.IpldObject{Cid: blk2.Cid(), Obj: blk2}, nil), + ) + + err := app.Run([]string{"chain", "bisect", fmt.Sprintf("%d", minHeight), fmt.Sprintf("%d", maxHeight), subpath, shell}) + assert.NoError(t, err) + + out := buf.String() + assert.Contains(t, out, path) +} func TestChainExport(t *testing.T) {}