@@ -157,6 +157,25 @@ spec:
157157 require .NoError (t , err )
158158}
159159
160+ type TestInvocation struct {
161+ specTy string
162+ filterVal int
163+ field string
164+ kpArgs []* ec.KprobeArgumentChecker
165+ }
166+
167+ func get_checker (ti TestInvocation , uprobe string ) * ec.ProcessUprobeChecker {
168+ return ec .NewProcessUprobeChecker ("uprobe-resolve" ).
169+ WithProcess (ec .NewProcessChecker ().
170+ WithBinary (sm .Full (uprobe )).
171+ WithArguments (
172+ sm .Full (ti .field + " " + strconv .Itoa (ti .filterVal )),
173+ ),
174+ ).WithArgs (ec .NewKprobeArgumentListMatcher ().
175+ WithOperator (lc .Ordered ).
176+ WithValues (ti .kpArgs ... ))
177+ }
178+
160179func TestUprobeResolve (t * testing.T ) {
161180 if ! config .EnableLargeProgs () || ! bpf .HasUprobeRefCtrOffset () {
162181 t .Skip ("Need 5.3 or newer kernel for uprobe ref_ctr_off support for this test." )
@@ -169,33 +188,39 @@ func TestUprobeResolve(t *testing.T) {
169188 uprobe := testutils .RepoRootPath ("contrib/tester-progs/uprobe-resolve" )
170189 uprobeBtf := testutils .RepoRootPath ("contrib/tester-progs/uprobe-resolve.btf" )
171190
172- tt := []struct {
173- specTy string
174- filterVal int
175- returnVal int
176- field string
177- kpArgs []* ec.KprobeArgumentChecker
178- }{
179- {"uint64" , 10 , 120 , "v64" , []* ec.KprobeArgumentChecker {
191+ tt := []TestInvocation {
192+ {"uint64" , 10 , "v64" , []* ec.KprobeArgumentChecker {
180193 ec .NewKprobeArgumentChecker ().WithIntArg (0 ),
181194 ec .NewKprobeArgumentChecker ().WithSizeArg (10 ), // uint64(10)
182195 ec .NewKprobeArgumentChecker ().WithUintArg (0 ),
183196 ec .NewKprobeArgumentChecker ().WithUintArg (0 ),
197+ ec .NewKprobeArgumentChecker ().WithUintArg (0 ),
184198 }},
185- {"uint32" , 11 , 130 , "v32" , []* ec.KprobeArgumentChecker {
199+ {"uint32" , 11 , "v32" , []* ec.KprobeArgumentChecker {
186200 ec .NewKprobeArgumentChecker ().WithIntArg (0 ),
187201 ec .NewKprobeArgumentChecker ().WithSizeArg (0 ),
188202 ec .NewKprobeArgumentChecker ().WithUintArg (11 ), // uint32(11)
189203 ec .NewKprobeArgumentChecker ().WithUintArg (0 ),
204+ ec .NewKprobeArgumentChecker ().WithUintArg (0 ),
190205 }},
191- {"uint32" , 12 , 140 , "sub.v32" , []* ec.KprobeArgumentChecker {
206+ {"uint32" , 12 , "sub.v32" , []* ec.KprobeArgumentChecker {
192207 ec .NewKprobeArgumentChecker ().WithIntArg (0 ),
193208 ec .NewKprobeArgumentChecker ().WithSizeArg (0 ),
194209 ec .NewKprobeArgumentChecker ().WithUintArg (0 ),
195210 ec .NewKprobeArgumentChecker ().WithUintArg (12 ), // uint32(12)
211+ ec .NewKprobeArgumentChecker ().WithUintArg (0 ),
196212 }},
197213 }
198214
215+ /* filterVal is ignored by uprobe-resolve "null" type mode */
216+ negative_tests := []TestInvocation {{"uint8" , 7 , "null" , []* ec.KprobeArgumentChecker {
217+ ec .NewKprobeArgumentChecker ().WithIntArg (0 ),
218+ ec .NewKprobeArgumentChecker ().WithSizeArg (0 ),
219+ ec .NewKprobeArgumentChecker ().WithUintArg (0 ),
220+ ec .NewKprobeArgumentChecker ().WithUintArg (0 ),
221+ ec .NewKprobeArgumentChecker ().WithUintArg (0 ),
222+ }}}
223+
199224 uprobeHook := `
200225apiVersion: cilium.io/v1alpha1
201226kind: TracingPolicy
@@ -222,6 +247,17 @@ spec:
222247 type: "` + tt [2 ].specTy + `"
223248 btfType: "mystruct"
224249 resolve: "` + tt [2 ].field + `"
250+ - index: 1
251+ type: "uint8"
252+ btfType: "mystruct"
253+ resolve: "sub.v8"
254+ selectors:
255+ - matchArgs:
256+ - args: [4]
257+ operator: "Equal"
258+ values:
259+ - "0"
260+
225261`
226262
227263 uprobeConfigHook := []byte (uprobeHook )
@@ -231,16 +267,13 @@ spec:
231267 }
232268
233269 var checkers []ec.EventChecker
234- for i := range tt {
235- checkers = append (checkers , ec .NewProcessUprobeChecker ("uprobe-resolve" ).
236- WithProcess (ec .NewProcessChecker ().
237- WithBinary (sm .Full (uprobe )).
238- WithArguments (
239- sm .Full (tt [i ].field + " " + strconv .Itoa (tt [i ].filterVal )),
240- ),
241- ).WithArgs (ec .NewKprobeArgumentListMatcher ().
242- WithOperator (lc .Ordered ).
243- WithValues (tt [i ].kpArgs ... )))
270+ for _ , ti := range tt {
271+ checkers = append (checkers , get_checker (ti , uprobe ))
272+ }
273+
274+ var negative_checkers []ec.EventChecker
275+ for _ , ti := range negative_tests {
276+ negative_checkers = append (negative_checkers , get_checker (ti , uprobe ))
244277 }
245278
246279 var doneWG , readyWG sync.WaitGroup
@@ -256,12 +289,15 @@ spec:
256289 observertesthelper .LoopEvents (ctx , t , & doneWG , & readyWG , obs )
257290 readyWG .Wait ()
258291
259- for i := range tt {
260- cmd := exec .Command (uprobe , tt [ i ] .field , strconv .Itoa (tt [ i ] .filterVal ))
292+ for _ , ti := range append ( tt , negative_tests ... ) {
293+ cmd := exec .Command (uprobe , ti .field , strconv .Itoa (ti .filterVal ))
261294 cmdErr := testutils .RunCmdAndLogOutput (t , cmd )
262295 require .NoError (t , cmdErr )
263296 }
264297
265298 err = jsonchecker .JsonTestCheck (t , ec .NewUnorderedEventChecker (checkers ... ))
266299 require .NoError (t , err )
300+
301+ err = jsonchecker .JsonTestCheckExpect (t , ec .NewUnorderedEventChecker (negative_checkers ... ), true )
302+ require .NoError (t , err )
267303}
0 commit comments