github.com/prysmaticlabs/prysm@v1.4.4/spectest/shared/phase0/operations/block_header.go (about) 1 package operations 2 3 import ( 4 "io/ioutil" 5 "path" 6 "strings" 7 "testing" 8 9 "github.com/bazelbuild/rules_go/go/tools/bazel" 10 "github.com/golang/snappy" 11 "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" 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/shared/testutil" 16 "github.com/prysmaticlabs/prysm/shared/testutil/require" 17 "github.com/prysmaticlabs/prysm/spectest/utils" 18 "google.golang.org/protobuf/proto" 19 "gopkg.in/d4l3k/messagediff.v1" 20 ) 21 22 // RunBlockHeaderTest executes "operations/block_header" tests. 23 func RunBlockHeaderTest(t *testing.T, config string) { 24 require.NoError(t, utils.SetConfig(t, config)) 25 testFolders, testsFolderPath := utils.TestFolders(t, config, "phase0", "operations/block_header/pyspec_tests") 26 for _, folder := range testFolders { 27 t.Run(folder.Name(), func(t *testing.T) { 28 blockFile, err := testutil.BazelFileBytes(testsFolderPath, folder.Name(), "block.ssz_snappy") 29 require.NoError(t, err) 30 blockSSZ, err := snappy.Decode(nil /* dst */, blockFile) 31 require.NoError(t, err, "Failed to decompress") 32 block := ðpb.BeaconBlock{} 33 require.NoError(t, block.UnmarshalSSZ(blockSSZ), "Failed to unmarshal") 34 35 preBeaconStateFile, err := testutil.BazelFileBytes(testsFolderPath, folder.Name(), "pre.ssz_snappy") 36 require.NoError(t, err) 37 preBeaconStateSSZ, err := snappy.Decode(nil /* dst */, preBeaconStateFile) 38 require.NoError(t, err, "Failed to decompress") 39 preBeaconStateBase := &pb.BeaconState{} 40 require.NoError(t, preBeaconStateBase.UnmarshalSSZ(preBeaconStateSSZ), "Failed to unmarshal") 41 preBeaconState, err := v1.InitializeFromProto(preBeaconStateBase) 42 require.NoError(t, err) 43 44 // If the post.ssz is not present, it means the test should fail on our end. 45 postSSZFilepath, err := bazel.Runfile(path.Join(testsFolderPath, folder.Name(), "post.ssz_snappy")) 46 postSSZExists := true 47 if err != nil && strings.Contains(err.Error(), "could not locate file") { 48 postSSZExists = false 49 } else { 50 require.NoError(t, err) 51 } 52 53 // Spectest blocks are not signed, so we'll call NoVerify to skip sig verification. 54 bodyRoot, err := block.Body.HashTreeRoot() 55 require.NoError(t, err) 56 beaconState, err := blocks.ProcessBlockHeaderNoVerify(preBeaconState, block.Slot, block.ProposerIndex, block.ParentRoot, bodyRoot[:]) 57 if postSSZExists { 58 require.NoError(t, err) 59 60 postBeaconStateFile, err := ioutil.ReadFile(postSSZFilepath) 61 require.NoError(t, err) 62 postBeaconStateSSZ, err := snappy.Decode(nil /* dst */, postBeaconStateFile) 63 require.NoError(t, err, "Failed to decompress") 64 65 postBeaconState := &pb.BeaconState{} 66 require.NoError(t, postBeaconState.UnmarshalSSZ(postBeaconStateSSZ), "Failed to unmarshal") 67 pbState, err := v1.ProtobufBeaconState(beaconState.CloneInnerState()) 68 require.NoError(t, err) 69 if !proto.Equal(pbState, postBeaconState) { 70 diff, _ := messagediff.PrettyDiff(beaconState.CloneInnerState(), postBeaconState) 71 t.Log(diff) 72 t.Fatal("Post state does not match expected") 73 } 74 } else { 75 // Note: This doesn't test anything worthwhile. It essentially tests 76 // that *any* error has occurred, not any specific error. 77 if err == nil { 78 t.Fatal("Did not fail when expected") 79 } 80 t.Logf("Expected failure; failure reason = %v", err) 81 return 82 } 83 }) 84 } 85 }