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 := ðpb.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 }