@@ -12,6 +12,7 @@ import (
1212
1313 "github.com/operator-framework/operator-controller/internal/operator-controller/bundle"
1414 "github.com/operator-framework/operator-controller/internal/operator-controller/bundleutil"
15+ "github.com/operator-framework/operator-controller/internal/operator-controller/features"
1516)
1617
1718func TestGetVersionAndRelease (t * testing.T ) {
@@ -69,44 +70,6 @@ func TestGetVersionAndRelease(t *testing.T) {
6970 pkgProperty : nil ,
7071 wantErr : true ,
7172 },
72- {
73- name : "explicit release field - takes precedence over build metadata" ,
74- pkgProperty : & property.Property {
75- Type : property .TypePackage ,
76- Value : json .RawMessage (`{"version": "1.0.0+ignored", "release": "2"}` ),
77- },
78- wantVersionRelease : & bundle.VersionRelease {
79- Version : bsemver .MustParse ("1.0.0+ignored" ),
80- Release : bundle .Release ([]bsemver.PRVersion {
81- {VersionNum : 2 , IsNum : true },
82- }),
83- },
84- wantErr : false ,
85- },
86- {
87- name : "explicit release field - complex release" ,
88- pkgProperty : & property.Property {
89- Type : property .TypePackage ,
90- Value : json .RawMessage (`{"version": "2.1.0", "release": "1.alpha.3"}` ),
91- },
92- wantVersionRelease : & bundle.VersionRelease {
93- Version : bsemver .MustParse ("2.1.0" ),
94- Release : bundle .Release ([]bsemver.PRVersion {
95- {VersionNum : 1 , IsNum : true },
96- {VersionStr : "alpha" },
97- {VersionNum : 3 , IsNum : true },
98- }),
99- },
100- wantErr : false ,
101- },
102- {
103- name : "explicit release field - invalid release" ,
104- pkgProperty : & property.Property {
105- Type : property .TypePackage ,
106- Value : json .RawMessage (`{"version": "1.0.0", "release": "001"}` ),
107- },
108- wantErr : true ,
109- },
11073 }
11174
11275 for _ , tc := range tests {
@@ -131,3 +94,103 @@ func TestGetVersionAndRelease(t *testing.T) {
13194 })
13295 }
13396}
97+
98+ // TestGetVersionAndRelease_WithCompositeVersionComparison tests the feature-gated parsing behavior.
99+ // This test detects the current feature gate state and validates the correct behavior path.
100+ // When CompositeVersionComparison is enabled (experimental deployments), bundles with explicit
101+ // pkg.Release field use that value. When disabled (standard deployments), explicit release is
102+ // ignored and parsing falls back to legacy build metadata.
103+ func TestGetVersionAndRelease_WithCompositeVersionComparison (t * testing.T ) {
104+ // Detect current feature gate state and test the appropriate path
105+ if features .OperatorControllerFeatureGate .Enabled (features .CompositeVersionComparison ) {
106+ t .Log ("CompositeVersionComparison enabled - testing explicit release field parsing" )
107+
108+ tests := []struct {
109+ name string
110+ pkgProperty * property.Property
111+ wantVersionRelease * bundle.VersionRelease
112+ wantErr bool
113+ }{
114+ {
115+ name : "explicit release field - takes precedence over build metadata" ,
116+ pkgProperty : & property.Property {
117+ Type : property .TypePackage ,
118+ Value : json .RawMessage (`{"version": "1.0.0+ignored", "release": "2"}` ),
119+ },
120+ wantVersionRelease : & bundle.VersionRelease {
121+ Version : bsemver .MustParse ("1.0.0+ignored" ),
122+ Release : bundle .Release ([]bsemver.PRVersion {
123+ {VersionNum : 2 , IsNum : true },
124+ }),
125+ },
126+ wantErr : false ,
127+ },
128+ {
129+ name : "explicit release field - complex release" ,
130+ pkgProperty : & property.Property {
131+ Type : property .TypePackage ,
132+ Value : json .RawMessage (`{"version": "2.1.0", "release": "1.alpha.3"}` ),
133+ },
134+ wantVersionRelease : & bundle.VersionRelease {
135+ Version : bsemver .MustParse ("2.1.0" ),
136+ Release : bundle .Release ([]bsemver.PRVersion {
137+ {VersionNum : 1 , IsNum : true },
138+ {VersionStr : "alpha" },
139+ {VersionNum : 3 , IsNum : true },
140+ }),
141+ },
142+ wantErr : false ,
143+ },
144+ {
145+ name : "explicit release field - invalid release" ,
146+ pkgProperty : & property.Property {
147+ Type : property .TypePackage ,
148+ Value : json .RawMessage (`{"version": "1.0.0", "release": "001"}` ),
149+ },
150+ wantErr : true ,
151+ },
152+ }
153+
154+ for _ , tc := range tests {
155+ t .Run (tc .name , func (t * testing.T ) {
156+ bundle := declcfg.Bundle {
157+ Name : "test-bundle" ,
158+ Properties : []property.Property {* tc .pkgProperty },
159+ }
160+
161+ actual , err := bundleutil .GetVersionAndRelease (bundle )
162+ if tc .wantErr {
163+ require .Error (t , err )
164+ } else {
165+ require .NoError (t , err )
166+ require .Equal (t , tc .wantVersionRelease , actual )
167+ }
168+ })
169+ }
170+ } else {
171+ t .Log ("CompositeVersionComparison disabled - explicit release field ignored, falls back to build metadata" )
172+
173+ // When gate disabled, explicit release field is ignored and parsing falls back to legacy behavior
174+ bundleWithExplicitRelease := declcfg.Bundle {
175+ Name : "test-bundle" ,
176+ Properties : []property.Property {
177+ {
178+ Type : property .TypePackage ,
179+ Value : json .RawMessage (`{"version": "1.0.0+2", "release": "999"}` ),
180+ },
181+ },
182+ }
183+
184+ actual , err := bundleutil .GetVersionAndRelease (bundleWithExplicitRelease )
185+ require .NoError (t , err )
186+
187+ // Should parse build metadata (+2), not explicit release field (999)
188+ expected := & bundle.VersionRelease {
189+ Version : bsemver .MustParse ("1.0.0" ),
190+ Release : bundle .Release ([]bsemver.PRVersion {
191+ {VersionNum : 2 , IsNum : true },
192+ }),
193+ }
194+ require .Equal (t , expected , actual )
195+ }
196+ }
0 commit comments