package test import ( "context" "fmt" "os" "sync/atomic" "testing" "time" "github.com/stretchr/testify/require" "github.com/filecoin-project/specs-actors/actors/abi" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/node/impl" ) func TestCCUpgrade(t *testing.T, b APIBuilder, blocktime time.Duration) { _ = os.Setenv("BELLMAN_NO_GPU", "1") ctx := context.Background() n, sn := b(t, 1, OneMiner) client := n[0].FullNode.(*impl.FullNodeAPI) miner := sn[0] addrinfo, err := client.NetAddrsListen(ctx) if err != nil { t.Fatal(err) } if err := miner.NetConnect(ctx, addrinfo); err != nil { t.Fatal(err) } time.Sleep(time.Second) mine := int64(1) done := make(chan struct{}) go func() { defer close(done) for atomic.LoadInt64(&mine) == 1 { time.Sleep(blocktime) if err := sn[0].MineOne(ctx, MineNext); err != nil { t.Error(err) } } }() maddr, err := miner.ActorAddress(ctx) if err != nil { t.Fatal(err) } CC := abi.SectorNumber(GenesisPreseals + 1) Upgraded := CC + 1 pledgeSectors(t, ctx, miner, 1, 0, nil) sl, err := miner.SectorsList(ctx) if err != nil { t.Fatal(err) } if len(sl) != 1 { t.Fatal("expected 1 sector") } if sl[0] != CC { t.Fatal("bad") } { si, err := client.StateSectorGetInfo(ctx, maddr, CC, types.EmptyTSK) require.NoError(t, err) require.Less(t, 50000, int(si.Expiration)) } if err := miner.SectorMarkForUpgrade(ctx, sl[0]); err != nil { t.Fatal(err) } makeDeal(t, ctx, 6, client, miner, false, false) // Validate upgrade { exp, err := client.StateSectorExpiration(ctx, maddr, CC, types.EmptyTSK) require.NoError(t, err) require.Greater(t, 50000, int(exp.OnTime)) } { exp, err := client.StateSectorExpiration(ctx, maddr, Upgraded, types.EmptyTSK) require.NoError(t, err) require.Less(t, 50000, int(exp.OnTime)) } fmt.Println("shutting down mining") atomic.AddInt64(&mine, -1) <-done }