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

     1  package miner_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/filecoin-project/go-state-types/abi"
     7  	"github.com/stretchr/testify/assert"
     8  
     9  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/miner"
    10  )
    11  
    12  func TestProvingPeriodDeadlines(t *testing.T) {
    13  
    14  	t.Run("quantization spec rounds to the next deadline", func(t *testing.T) {
    15  		periodStart := abi.ChainEpoch(2)
    16  		curr := periodStart + miner.WPoStProvingPeriod
    17  		d := miner.NewDeadlineInfo(periodStart, 10, curr)
    18  		quant := miner.QuantSpecForDeadline(d)
    19  		assert.Equal(t, d.NextNotElapsed().Last(), quant.QuantizeUp(curr))
    20  	})
    21  }
    22  
    23  func TestDeadlineInfoFromOffsetAndEpoch(t *testing.T) {
    24  
    25  	// All proving periods equivalent mod WPoStProving period should give equivalent
    26  	// dlines for a given epoch. Only the offset property should matter
    27  	t.Run("Offset and epoch invariant checking", func(t *testing.T) {
    28  		pp := abi.ChainEpoch(1972)
    29  		ppThree := abi.ChainEpoch(1972 + 2880*3)
    30  		ppMillion := abi.ChainEpoch(1972 + 2880*10e6)
    31  
    32  		epochs := []abi.ChainEpoch{4, 2000, 400000, 5000000}
    33  		for _, epoch := range epochs {
    34  			dlineA := miner.NewDeadlineInfoFromOffsetAndEpoch(pp, epoch)
    35  			dlineB := miner.NewDeadlineInfoFromOffsetAndEpoch(ppThree, epoch)
    36  			dlineC := miner.NewDeadlineInfoFromOffsetAndEpoch(ppMillion, epoch)
    37  
    38  			assert.Equal(t, *dlineA, *dlineB)
    39  			assert.Equal(t, *dlineB, *dlineC)
    40  		}
    41  	})
    42  	t.Run("sanity checks", func(t *testing.T) {
    43  		offset := abi.ChainEpoch(7)
    44  		start := abi.ChainEpoch(2880*103) + offset
    45  		// epoch 2880*103 + offset we are in deadline 0, pp start = 2880*103 + offset
    46  		dline := miner.NewDeadlineInfoFromOffsetAndEpoch(offset, start)
    47  		assert.Equal(t, uint64(0), dline.Index)
    48  		assert.Equal(t, start, dline.PeriodStart)
    49  
    50  		// epoch 2880*103 + offset + WPoStChallengeWindow - 1 we are in deadline 0
    51  		dline = miner.NewDeadlineInfoFromOffsetAndEpoch(offset, start+miner.WPoStChallengeWindow-1)
    52  		assert.Equal(t, uint64(0), dline.Index)
    53  		assert.Equal(t, start, dline.PeriodStart)
    54  
    55  		// epoch 2880*103 + offset + WPoStChallengeWindow we are in deadline 1
    56  		dline = miner.NewDeadlineInfoFromOffsetAndEpoch(offset, start+miner.WPoStChallengeWindow)
    57  		assert.Equal(t, uint64(1), dline.Index)
    58  		assert.Equal(t, start, dline.PeriodStart)
    59  
    60  		// epoch 2880*103 + offset + 40*WPoStChallengeWindow we are in deadline 40
    61  		dline = miner.NewDeadlineInfoFromOffsetAndEpoch(offset, start+40*miner.WPoStChallengeWindow)
    62  		assert.Equal(t, uint64(40), dline.Index)
    63  		assert.Equal(t, start, dline.PeriodStart)
    64  
    65  		// epoch 2880*103 + offset + 40*WPoStChallengeWindow - 1 we are in deadline 39
    66  		dline = miner.NewDeadlineInfoFromOffsetAndEpoch(offset, start+40*miner.WPoStChallengeWindow-1)
    67  		assert.Equal(t, uint64(39), dline.Index)
    68  		assert.Equal(t, start, dline.PeriodStart)
    69  
    70  		// epoch 2880*103 + offset + 40*WPoStChallengeWindow + 1 we are in deadline 40
    71  		dline = miner.NewDeadlineInfoFromOffsetAndEpoch(offset, start+40*miner.WPoStChallengeWindow+1)
    72  		assert.Equal(t, uint64(40), dline.Index)
    73  		assert.Equal(t, start, dline.PeriodStart)
    74  
    75  		// epoch 2880*103 + offset + WPoStPeriodDeadlines*WPoStChallengeWindow -1 we are in deadline WPoStPeriodDeadlines - 1
    76  		dline = miner.NewDeadlineInfoFromOffsetAndEpoch(offset, start+abi.ChainEpoch(miner.WPoStPeriodDeadlines)*miner.WPoStChallengeWindow-abi.ChainEpoch(1))
    77  		assert.Equal(t, uint64(miner.WPoStPeriodDeadlines-1), dline.Index)
    78  		assert.Equal(t, start, dline.PeriodStart)
    79  
    80  		// epoch 2880*103 + offset + WPoStPeriodDeadlines*WPoStChallengeWindow + 1 we are in deadline 0, pp start = 2880*104 + offset
    81  		dline = miner.NewDeadlineInfoFromOffsetAndEpoch(offset, start+abi.ChainEpoch(miner.WPoStPeriodDeadlines)*miner.WPoStChallengeWindow)
    82  		assert.Equal(t, uint64(0), dline.Index)
    83  		assert.Equal(t, start+miner.WPoStProvingPeriod, dline.PeriodStart)
    84  
    85  	})
    86  }