@@ -3,8 +3,10 @@ package chainlib
33import (
44 "testing"
55
6+ "github.com/lavanet/lava/v5/protocol/common"
67 "github.com/lavanet/lava/v5/x/spec/types"
78 "github.com/stretchr/testify/assert"
9+ "github.com/stretchr/testify/require"
810)
911
1012func TestIsDefaultApi (t * testing.T ) {
@@ -53,3 +55,197 @@ func TestIsDefaultApi(t *testing.T) {
5355 assert .False (t , baseProtocolMessage .IsDefaultApi ())
5456 })
5557}
58+
59+ func TestGetCrossValidationParameters (t * testing.T ) {
60+ t .Run ("no headers present - returns defaults with headersPresent=false" , func (t * testing.T ) {
61+ bpm := & BaseProtocolMessage {
62+ directiveHeaders : map [string ]string {},
63+ }
64+
65+ params , headersPresent , err := bpm .GetCrossValidationParameters ()
66+ require .NoError (t , err )
67+ assert .False (t , headersPresent )
68+ assert .Equal (t , common .DefaultCrossValidationParams , params )
69+ })
70+
71+ t .Run ("nil headers - returns defaults with headersPresent=false" , func (t * testing.T ) {
72+ bpm := & BaseProtocolMessage {
73+ directiveHeaders : nil ,
74+ }
75+
76+ params , headersPresent , err := bpm .GetCrossValidationParameters ()
77+ require .NoError (t , err )
78+ assert .False (t , headersPresent )
79+ assert .Equal (t , common .DefaultCrossValidationParams , params )
80+ })
81+
82+ t .Run ("valid headers - parses correctly" , func (t * testing.T ) {
83+ bpm := & BaseProtocolMessage {
84+ directiveHeaders : map [string ]string {
85+ common .CROSS_VALIDATION_HEADER_MAX_PARTICIPANTS : "5" ,
86+ common .CROSS_VALIDATION_HEADER_AGREEMENT_THRESHOLD : "3" ,
87+ },
88+ }
89+
90+ params , headersPresent , err := bpm .GetCrossValidationParameters ()
91+ require .NoError (t , err )
92+ assert .True (t , headersPresent )
93+ assert .Equal (t , 5 , params .MaxParticipants )
94+ assert .Equal (t , 3 , params .AgreementThreshold )
95+ })
96+
97+ t .Run ("threshold equals max - valid" , func (t * testing.T ) {
98+ bpm := & BaseProtocolMessage {
99+ directiveHeaders : map [string ]string {
100+ common .CROSS_VALIDATION_HEADER_MAX_PARTICIPANTS : "3" ,
101+ common .CROSS_VALIDATION_HEADER_AGREEMENT_THRESHOLD : "3" ,
102+ },
103+ }
104+
105+ params , headersPresent , err := bpm .GetCrossValidationParameters ()
106+ require .NoError (t , err )
107+ assert .True (t , headersPresent )
108+ assert .Equal (t , 3 , params .MaxParticipants )
109+ assert .Equal (t , 3 , params .AgreementThreshold )
110+ })
111+
112+ t .Run ("only max-participants header - error" , func (t * testing.T ) {
113+ bpm := & BaseProtocolMessage {
114+ directiveHeaders : map [string ]string {
115+ common .CROSS_VALIDATION_HEADER_MAX_PARTICIPANTS : "5" ,
116+ },
117+ }
118+
119+ _ , headersPresent , err := bpm .GetCrossValidationParameters ()
120+ require .Error (t , err )
121+ assert .True (t , headersPresent )
122+ assert .Contains (t , err .Error (), "agreement-threshold header is required" )
123+ })
124+
125+ t .Run ("only agreement-threshold header - error" , func (t * testing.T ) {
126+ bpm := & BaseProtocolMessage {
127+ directiveHeaders : map [string ]string {
128+ common .CROSS_VALIDATION_HEADER_AGREEMENT_THRESHOLD : "3" ,
129+ },
130+ }
131+
132+ _ , headersPresent , err := bpm .GetCrossValidationParameters ()
133+ require .Error (t , err )
134+ assert .True (t , headersPresent )
135+ assert .Contains (t , err .Error (), "max-participants header is required" )
136+ })
137+
138+ t .Run ("threshold greater than max - error" , func (t * testing.T ) {
139+ bpm := & BaseProtocolMessage {
140+ directiveHeaders : map [string ]string {
141+ common .CROSS_VALIDATION_HEADER_MAX_PARTICIPANTS : "3" ,
142+ common .CROSS_VALIDATION_HEADER_AGREEMENT_THRESHOLD : "5" ,
143+ },
144+ }
145+
146+ _ , headersPresent , err := bpm .GetCrossValidationParameters ()
147+ require .Error (t , err )
148+ assert .True (t , headersPresent )
149+ assert .Contains (t , err .Error (), "cannot be greater than max-participants" )
150+ })
151+
152+ t .Run ("invalid max-participants (not a number) - error" , func (t * testing.T ) {
153+ bpm := & BaseProtocolMessage {
154+ directiveHeaders : map [string ]string {
155+ common .CROSS_VALIDATION_HEADER_MAX_PARTICIPANTS : "invalid" ,
156+ common .CROSS_VALIDATION_HEADER_AGREEMENT_THRESHOLD : "3" ,
157+ },
158+ }
159+
160+ _ , headersPresent , err := bpm .GetCrossValidationParameters ()
161+ require .Error (t , err )
162+ assert .True (t , headersPresent )
163+ assert .Contains (t , err .Error (), "invalid cross-validation max-participants" )
164+ })
165+
166+ t .Run ("invalid agreement-threshold (not a number) - error" , func (t * testing.T ) {
167+ bpm := & BaseProtocolMessage {
168+ directiveHeaders : map [string ]string {
169+ common .CROSS_VALIDATION_HEADER_MAX_PARTICIPANTS : "5" ,
170+ common .CROSS_VALIDATION_HEADER_AGREEMENT_THRESHOLD : "invalid" ,
171+ },
172+ }
173+
174+ _ , headersPresent , err := bpm .GetCrossValidationParameters ()
175+ require .Error (t , err )
176+ assert .True (t , headersPresent )
177+ assert .Contains (t , err .Error (), "invalid cross-validation agreement-threshold" )
178+ })
179+
180+ t .Run ("max-participants zero - error" , func (t * testing.T ) {
181+ bpm := & BaseProtocolMessage {
182+ directiveHeaders : map [string ]string {
183+ common .CROSS_VALIDATION_HEADER_MAX_PARTICIPANTS : "0" ,
184+ common .CROSS_VALIDATION_HEADER_AGREEMENT_THRESHOLD : "0" ,
185+ },
186+ }
187+
188+ _ , headersPresent , err := bpm .GetCrossValidationParameters ()
189+ require .Error (t , err )
190+ assert .True (t , headersPresent )
191+ assert .Contains (t , err .Error (), "must be a positive integer" )
192+ })
193+
194+ t .Run ("negative max-participants - error" , func (t * testing.T ) {
195+ bpm := & BaseProtocolMessage {
196+ directiveHeaders : map [string ]string {
197+ common .CROSS_VALIDATION_HEADER_MAX_PARTICIPANTS : "-1" ,
198+ common .CROSS_VALIDATION_HEADER_AGREEMENT_THRESHOLD : "1" ,
199+ },
200+ }
201+
202+ _ , headersPresent , err := bpm .GetCrossValidationParameters ()
203+ require .Error (t , err )
204+ assert .True (t , headersPresent )
205+ assert .Contains (t , err .Error (), "must be a positive integer" )
206+ })
207+
208+ t .Run ("agreement-threshold zero - error" , func (t * testing.T ) {
209+ bpm := & BaseProtocolMessage {
210+ directiveHeaders : map [string ]string {
211+ common .CROSS_VALIDATION_HEADER_MAX_PARTICIPANTS : "5" ,
212+ common .CROSS_VALIDATION_HEADER_AGREEMENT_THRESHOLD : "0" ,
213+ },
214+ }
215+
216+ _ , headersPresent , err := bpm .GetCrossValidationParameters ()
217+ require .Error (t , err )
218+ assert .True (t , headersPresent )
219+ assert .Contains (t , err .Error (), "must be a positive integer" )
220+ })
221+
222+ t .Run ("minimum valid values (1, 1) - valid" , func (t * testing.T ) {
223+ bpm := & BaseProtocolMessage {
224+ directiveHeaders : map [string ]string {
225+ common .CROSS_VALIDATION_HEADER_MAX_PARTICIPANTS : "1" ,
226+ common .CROSS_VALIDATION_HEADER_AGREEMENT_THRESHOLD : "1" ,
227+ },
228+ }
229+
230+ params , headersPresent , err := bpm .GetCrossValidationParameters ()
231+ require .NoError (t , err )
232+ assert .True (t , headersPresent )
233+ assert .Equal (t , 1 , params .MaxParticipants )
234+ assert .Equal (t , 1 , params .AgreementThreshold )
235+ })
236+
237+ t .Run ("large valid values - valid" , func (t * testing.T ) {
238+ bpm := & BaseProtocolMessage {
239+ directiveHeaders : map [string ]string {
240+ common .CROSS_VALIDATION_HEADER_MAX_PARTICIPANTS : "100" ,
241+ common .CROSS_VALIDATION_HEADER_AGREEMENT_THRESHOLD : "51" ,
242+ },
243+ }
244+
245+ params , headersPresent , err := bpm .GetCrossValidationParameters ()
246+ require .NoError (t , err )
247+ assert .True (t , headersPresent )
248+ assert .Equal (t , 100 , params .MaxParticipants )
249+ assert .Equal (t , 51 , params .AgreementThreshold )
250+ })
251+ }
0 commit comments