github.com/prysmaticlabs/prysm@v1.4.4/spectest/shared/phase0/finality/runner.go (about)

     1  package finality
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/golang/snappy"
     9  	"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
    10  	"github.com/prysmaticlabs/prysm/beacon-chain/core/state"
    11  	iface "github.com/prysmaticlabs/prysm/beacon-chain/state/interface"
    12  	"github.com/prysmaticlabs/prysm/beacon-chain/state/v1"
    13  	pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
    14  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
    15  	"github.com/prysmaticlabs/prysm/proto/eth/v1alpha1/wrapper"
    16  	"github.com/prysmaticlabs/prysm/shared/testutil"
    17  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    18  	"github.com/prysmaticlabs/prysm/spectest/utils"
    19  	"google.golang.org/protobuf/proto"
    20  	"gopkg.in/d4l3k/messagediff.v1"
    21  )
    22  
    23  func init() {
    24  	state.SkipSlotCache.Disable()
    25  }
    26  
    27  type Config struct {
    28  	BlocksCount int `json:"blocks_count"`
    29  }
    30  
    31  // RunFinalityTest executes finality spec tests.
    32  func RunFinalityTest(t *testing.T, config string) {
    33  	require.NoError(t, utils.SetConfig(t, config))
    34  
    35  	testFolders, testsFolderPath := utils.TestFolders(t, config, "phase0", "finality/finality/pyspec_tests")
    36  	for _, folder := range testFolders {
    37  		t.Run(folder.Name(), func(t *testing.T) {
    38  			helpers.ClearCache()
    39  			preBeaconStateFile, err := testutil.BazelFileBytes(testsFolderPath, folder.Name(), "pre.ssz_snappy")
    40  			require.NoError(t, err)
    41  			preBeaconStateSSZ, err := snappy.Decode(nil /* dst */, preBeaconStateFile)
    42  			require.NoError(t, err, "Failed to decompress")
    43  			beaconStateBase := &pb.BeaconState{}
    44  			require.NoError(t, beaconStateBase.UnmarshalSSZ(preBeaconStateSSZ), "Failed to unmarshal")
    45  			beaconState, err := v1.InitializeFromProto(beaconStateBase)
    46  			require.NoError(t, err)
    47  
    48  			file, err := testutil.BazelFileBytes(testsFolderPath, folder.Name(), "meta.yaml")
    49  			require.NoError(t, err)
    50  
    51  			metaYaml := &Config{}
    52  			require.NoError(t, utils.UnmarshalYaml(file, metaYaml), "Failed to Unmarshal")
    53  
    54  			var processedState iface.BeaconState
    55  			var ok bool
    56  			for i := 0; i < metaYaml.BlocksCount; i++ {
    57  				filename := fmt.Sprintf("blocks_%d.ssz_snappy", i)
    58  				blockFile, err := testutil.BazelFileBytes(testsFolderPath, folder.Name(), filename)
    59  				require.NoError(t, err)
    60  				blockSSZ, err := snappy.Decode(nil /* dst */, blockFile)
    61  				require.NoError(t, err, "Failed to decompress")
    62  				block := &ethpb.SignedBeaconBlock{}
    63  				require.NoError(t, block.UnmarshalSSZ(blockSSZ), "Failed to unmarshal")
    64  				processedState, err = state.ExecuteStateTransition(context.Background(), beaconState, wrapper.WrappedPhase0SignedBeaconBlock(block))
    65  				require.NoError(t, err)
    66  				beaconState, ok = processedState.(*v1.BeaconState)
    67  				require.Equal(t, true, ok)
    68  			}
    69  
    70  			postBeaconStateFile, err := testutil.BazelFileBytes(testsFolderPath, folder.Name(), "post.ssz_snappy")
    71  			require.NoError(t, err)
    72  			postBeaconStateSSZ, err := snappy.Decode(nil /* dst */, postBeaconStateFile)
    73  			require.NoError(t, err, "Failed to decompress")
    74  			postBeaconState := &pb.BeaconState{}
    75  			require.NoError(t, postBeaconState.UnmarshalSSZ(postBeaconStateSSZ), "Failed to unmarshal")
    76  			pbState, err := v1.ProtobufBeaconState(beaconState.InnerStateUnsafe())
    77  			require.NoError(t, err)
    78  			if !proto.Equal(pbState, postBeaconState) {
    79  				diff, _ := messagediff.PrettyDiff(beaconState.InnerStateUnsafe(), postBeaconState)
    80  				t.Log(diff)
    81  				t.Fatal("Post state does not match expected")
    82  			}
    83  		})
    84  	}
    85  }