github.com/prysmaticlabs/prysm@v1.4.4/spectest/shared/phase0/epoch_processing/helpers.go (about) 1 package epoch_processing 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 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 "github.com/prysmaticlabs/prysm/shared/testutil" 15 "github.com/prysmaticlabs/prysm/shared/testutil/require" 16 "google.golang.org/protobuf/proto" 17 "gopkg.in/d4l3k/messagediff.v1" 18 ) 19 20 type epochOperation func(*testing.T, iface.BeaconState) (iface.BeaconState, error) 21 22 // RunEpochOperationTest takes in the prestate and processes it through the 23 // passed in epoch operation function and checks the post state with the expected post state. 24 func RunEpochOperationTest( 25 t *testing.T, 26 testFolderPath string, 27 operationFn epochOperation, 28 ) { 29 preBeaconStateFile, err := testutil.BazelFileBytes(path.Join(testFolderPath, "pre.ssz_snappy")) 30 require.NoError(t, err) 31 preBeaconStateSSZ, err := snappy.Decode(nil /* dst */, preBeaconStateFile) 32 require.NoError(t, err, "Failed to decompress") 33 preBeaconStateBase := &pb.BeaconState{} 34 if err := preBeaconStateBase.UnmarshalSSZ(preBeaconStateSSZ); err != nil { 35 t.Fatalf("Failed to unmarshal: %v", err) 36 } 37 preBeaconState, err := v1.InitializeFromProto(preBeaconStateBase) 38 require.NoError(t, err) 39 40 // If the post.ssz is not present, it means the test should fail on our end. 41 postSSZFilepath, err := bazel.Runfile(path.Join(testFolderPath, "post.ssz_snappy")) 42 postSSZExists := true 43 if err != nil && strings.Contains(err.Error(), "could not locate file") { 44 postSSZExists = false 45 } else if err != nil { 46 t.Fatal(err) 47 } 48 49 beaconState, err := operationFn(t, preBeaconState) 50 if postSSZExists { 51 require.NoError(t, err) 52 53 postBeaconStateFile, err := ioutil.ReadFile(postSSZFilepath) 54 require.NoError(t, err) 55 postBeaconStateSSZ, err := snappy.Decode(nil /* dst */, postBeaconStateFile) 56 require.NoError(t, err, "Failed to decompress") 57 postBeaconState := &pb.BeaconState{} 58 if err := postBeaconState.UnmarshalSSZ(postBeaconStateSSZ); err != nil { 59 t.Fatalf("Failed to unmarshal: %v", err) 60 } 61 62 pbState, err := v1.ProtobufBeaconState(beaconState.InnerStateUnsafe()) 63 require.NoError(t, err) 64 if !proto.Equal(pbState, postBeaconState) { 65 diff, _ := messagediff.PrettyDiff(beaconState.InnerStateUnsafe(), postBeaconState) 66 t.Log(diff) 67 t.Fatal("Post state does not match expected") 68 } 69 } else { 70 // Note: This doesn't test anything worthwhile. It essentially tests 71 // that *any* error has occurred, not any specific error. 72 if err == nil { 73 t.Fatal("Did not fail when expected") 74 } 75 t.Logf("Expected failure; failure reason = %v", err) 76 return 77 } 78 }