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 := &ethpb.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  }