github.com/filecoin-project/specs-actors/v4@v4.0.2/actors/builtin/miner/termination_test.go (about)

     1  package miner_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/filecoin-project/go-bitfield"
     7  	"github.com/filecoin-project/go-state-types/abi"
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/miner"
    11  )
    12  
    13  func TestTerminationResult(t *testing.T) {
    14  	var result miner.TerminationResult
    15  	require.True(t, result.IsEmpty())
    16  	err := result.ForEach(func(epoch abi.ChainEpoch, sectors bitfield.BitField) error {
    17  		require.FailNow(t, "unreachable")
    18  		return nil
    19  	})
    20  	require.NoError(t, err)
    21  
    22  	resultA := miner.TerminationResult{
    23  		Sectors: map[abi.ChainEpoch]bitfield.BitField{
    24  			3: bitfield.NewFromSet([]uint64{9}),
    25  			0: bitfield.NewFromSet([]uint64{1, 2, 4}),
    26  			2: bitfield.NewFromSet([]uint64{3, 5, 7}),
    27  		},
    28  		PartitionsProcessed: 1,
    29  		SectorsProcessed:    7,
    30  	}
    31  	require.False(t, resultA.IsEmpty())
    32  	resultB := miner.TerminationResult{
    33  		Sectors: map[abi.ChainEpoch]bitfield.BitField{
    34  			1: bitfield.NewFromSet([]uint64{12}),
    35  			0: bitfield.NewFromSet([]uint64{10}),
    36  		},
    37  		PartitionsProcessed: 1,
    38  		SectorsProcessed:    2,
    39  	}
    40  	require.False(t, resultB.IsEmpty())
    41  	require.NoError(t, result.Add(resultA))
    42  	require.NoError(t, result.Add(resultB))
    43  	require.False(t, result.IsEmpty())
    44  	expected := miner.TerminationResult{
    45  		Sectors: map[abi.ChainEpoch]bitfield.BitField{
    46  			2: bitfield.NewFromSet([]uint64{3, 5, 7}),
    47  			0: bitfield.NewFromSet([]uint64{1, 2, 4, 10}),
    48  			1: bitfield.NewFromSet([]uint64{12}),
    49  			3: bitfield.NewFromSet([]uint64{9}),
    50  		},
    51  		PartitionsProcessed: 2,
    52  		SectorsProcessed:    9,
    53  	}
    54  	require.Equal(t, expected.SectorsProcessed, result.SectorsProcessed)
    55  	require.Equal(t, expected.PartitionsProcessed, result.PartitionsProcessed)
    56  	require.Equal(t, len(expected.Sectors), len(result.Sectors))
    57  
    58  	expectedEpoch := abi.ChainEpoch(0)
    59  	err = result.ForEach(func(epoch abi.ChainEpoch, actualBf bitfield.BitField) error {
    60  		require.Equal(t, expectedEpoch, epoch)
    61  		expectedEpoch++
    62  		expectedBf, ok := expected.Sectors[epoch]
    63  		require.True(t, ok)
    64  		expectedNos, err := expectedBf.All(1000)
    65  		require.NoError(t, err)
    66  		actualNos, err := actualBf.All(1000)
    67  		require.NoError(t, err)
    68  		require.Equal(t, expectedNos, actualNos)
    69  		return nil
    70  	})
    71  	require.NoError(t, err)
    72  
    73  	// partitions = 2, sectors = 9
    74  	require.False(t, result.BelowLimit(2, 9))
    75  	require.False(t, result.BelowLimit(3, 9))
    76  	require.False(t, result.BelowLimit(3, 8))
    77  	require.False(t, result.BelowLimit(2, 10))
    78  	require.True(t, result.BelowLimit(3, 10))
    79  }