1- package version
1+ package version_test
22
33import (
44 "slices"
55 "sort"
66 "testing"
77
8+ "github.com/OffchainLabs/prysm/v7/config/params"
9+ "github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
10+ "github.com/OffchainLabs/prysm/v7/runtime/version"
811 "github.com/stretchr/testify/assert"
12+ "github.com/stretchr/testify/require"
913)
1014
1115func TestVersionString (t * testing.T ) {
@@ -16,26 +20,26 @@ func TestVersionString(t *testing.T) {
1620 }{
1721 {
1822 name : "phase0" ,
19- version : Phase0 ,
23+ version : version . Phase0 ,
2024 want : "phase0" ,
2125 },
2226 {
2327 name : "altair" ,
24- version : Altair ,
28+ version : version . Altair ,
2529 want : "altair" ,
2630 },
2731 }
2832 for _ , tt := range tests {
2933 t .Run (tt .name , func (t * testing.T ) {
30- if got := String (tt .version ); got != tt .want {
34+ if got := version . String (tt .version ); got != tt .want {
3135 t .Errorf ("String() = %v, want %v" , got , tt .want )
3236 }
3337 })
3438 }
3539}
3640
3741func TestVersionSorting (t * testing.T ) {
38- versions := All ()
42+ versions := version . All ()
3943 expected := slices .Clone (versions )
4044 sort .Ints (expected )
4145 tests := []struct {
@@ -54,3 +58,82 @@ func TestVersionSorting(t *testing.T) {
5458 })
5559 }
5660}
61+
62+ func TestReleasedExcludesFeatureGated (t * testing.T ) {
63+ released := version .Released ()
64+ gated := version .FeatureGated ()
65+
66+ for _ , v := range gated {
67+ assert .NotContains (t , released , v , "released versions should exclude feature gated fork %s" , version .String (v ))
68+ }
69+
70+ releasedSet := make (map [int ]struct {}, len (released ))
71+ for _ , v := range released {
72+ releasedSet [v ] = struct {}{}
73+ }
74+
75+ gatedSet := make (map [int ]struct {}, len (gated ))
76+ for _ , v := range gated {
77+ gatedSet [v ] = struct {}{}
78+ }
79+
80+ for _ , v := range version .All () {
81+ if _ , skip := gatedSet [v ]; skip {
82+ continue
83+ }
84+ if _ , ok := releasedSet [v ]; ! ok {
85+ t .Fatalf ("version %s missing from released versions" , version .String (v ))
86+ }
87+ }
88+ }
89+
90+ func TestFeatureGatedVersionsAreNotScheduledOnTestnets (t * testing.T ) {
91+ if len (version .FeatureGated ()) == 0 {
92+ t .Skip ("no feature gated versions defined" )
93+ }
94+
95+ testnetConfigs := []* params.BeaconChainConfig {
96+ params .HoleskyConfig (),
97+ params .SepoliaConfig (),
98+ params .HoodiConfig (),
99+ }
100+
101+ for _ , v := range version .FeatureGated () {
102+ for _ , cfg := range testnetConfigs {
103+ epoch := forkEpochForVersion (cfg , v )
104+ require .Equalf (
105+ t ,
106+ cfg .FarFutureEpoch ,
107+ epoch ,
108+ "feature gated version %s should not be scheduled on %s (epoch=%d)" ,
109+ version .String (v ),
110+ cfg .ConfigName ,
111+ epoch ,
112+ )
113+ }
114+ }
115+ }
116+
117+ func forkEpochForVersion (cfg * params.BeaconChainConfig , v int ) primitives.Epoch {
118+ switch v {
119+ case version .Phase0 :
120+ return cfg .GenesisEpoch
121+ case version .Altair :
122+ return cfg .AltairForkEpoch
123+ case version .Bellatrix :
124+ return cfg .BellatrixForkEpoch
125+ case version .Capella :
126+ return cfg .CapellaForkEpoch
127+ case version .Deneb :
128+ return cfg .DenebForkEpoch
129+ case version .Electra :
130+ return cfg .ElectraForkEpoch
131+ case version .Fulu :
132+ return cfg .FuluForkEpoch
133+ default :
134+ if version .IsFeatureGated (v ) {
135+ return cfg .FarFutureEpoch
136+ }
137+ panic ("forkEpochForVersion missing version " + version .String (v ))
138+ }
139+ }
0 commit comments