github.com/cilium/cilium@v1.16.2/pkg/datapath/linux/probes/probes_test.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package probes 5 6 import ( 7 "bytes" 8 "strings" 9 "testing" 10 11 "github.com/cilium/cilium/pkg/testutils" 12 ) 13 14 func TestSystemConfigProbes(t *testing.T) { 15 testCases := []struct { 16 systemConfig SystemConfig 17 expectErr bool 18 }{ 19 { 20 systemConfig: SystemConfig{ 21 ConfigBpf: "y", 22 ConfigBpfSyscall: "y", 23 ConfigNetSchIngress: "y", 24 ConfigNetClsBpf: "y", 25 ConfigNetClsAct: "y", 26 ConfigBpfJit: "y", 27 ConfigHaveEbpfJit: "y", 28 ConfigCgroupBpf: "y", 29 ConfigLwtunnelBpf: "y", 30 ConfigBpfEvents: "y", 31 }, 32 expectErr: false, 33 }, 34 { 35 systemConfig: SystemConfig{ 36 ConfigBpf: "y", 37 ConfigBpfSyscall: "y", 38 ConfigNetSchIngress: "m", 39 ConfigNetClsBpf: "m", 40 ConfigNetClsAct: "y", 41 ConfigBpfJit: "y", 42 ConfigHaveEbpfJit: "y", 43 ConfigCgroupBpf: "y", 44 ConfigLwtunnelBpf: "y", 45 ConfigBpfEvents: "y", 46 }, 47 expectErr: false, 48 }, 49 // Disable options which generate errors 50 { 51 systemConfig: SystemConfig{ 52 ConfigBpf: "n", 53 ConfigBpfSyscall: "n", 54 ConfigNetSchIngress: "n", 55 ConfigNetClsBpf: "n", 56 ConfigNetClsAct: "n", 57 ConfigBpfJit: "n", 58 ConfigHaveEbpfJit: "n", 59 ConfigCgroupBpf: "n", 60 ConfigLwtunnelBpf: "n", 61 ConfigBpfEvents: "n", 62 }, 63 expectErr: true, 64 }, 65 { 66 systemConfig: SystemConfig{ 67 ConfigBpf: "n", 68 ConfigBpfSyscall: "y", 69 ConfigNetSchIngress: "y", 70 ConfigNetClsBpf: "y", 71 ConfigNetClsAct: "y", 72 ConfigBpfJit: "y", 73 ConfigHaveEbpfJit: "y", 74 ConfigCgroupBpf: "y", 75 ConfigLwtunnelBpf: "y", 76 ConfigBpfEvents: "y", 77 }, 78 expectErr: true, 79 }, 80 { 81 systemConfig: SystemConfig{ 82 ConfigBpf: "y", 83 ConfigBpfSyscall: "n", 84 ConfigNetSchIngress: "y", 85 ConfigNetClsBpf: "y", 86 ConfigNetClsAct: "y", 87 ConfigBpfJit: "y", 88 ConfigHaveEbpfJit: "y", 89 ConfigCgroupBpf: "y", 90 ConfigLwtunnelBpf: "y", 91 ConfigBpfEvents: "y", 92 }, 93 expectErr: true, 94 }, 95 { 96 systemConfig: SystemConfig{ 97 ConfigBpf: "y", 98 ConfigBpfSyscall: "y", 99 ConfigNetSchIngress: "n", 100 ConfigNetClsBpf: "y", 101 ConfigNetClsAct: "y", 102 ConfigBpfJit: "y", 103 ConfigHaveEbpfJit: "y", 104 ConfigCgroupBpf: "y", 105 ConfigLwtunnelBpf: "y", 106 ConfigBpfEvents: "y", 107 }, 108 expectErr: true, 109 }, 110 { 111 systemConfig: SystemConfig{ 112 ConfigBpf: "y", 113 ConfigBpfSyscall: "y", 114 ConfigNetSchIngress: "y", 115 ConfigNetClsBpf: "n", 116 ConfigNetClsAct: "y", 117 ConfigBpfJit: "y", 118 ConfigHaveEbpfJit: "y", 119 ConfigCgroupBpf: "y", 120 ConfigLwtunnelBpf: "y", 121 ConfigBpfEvents: "y", 122 }, 123 expectErr: true, 124 }, 125 { 126 systemConfig: SystemConfig{ 127 ConfigBpf: "y", 128 ConfigBpfSyscall: "y", 129 ConfigNetSchIngress: "y", 130 ConfigNetClsBpf: "y", 131 ConfigNetClsAct: "n", 132 ConfigBpfJit: "y", 133 ConfigHaveEbpfJit: "y", 134 ConfigCgroupBpf: "y", 135 ConfigLwtunnelBpf: "y", 136 ConfigBpfEvents: "y", 137 }, 138 expectErr: true, 139 }, 140 { 141 systemConfig: SystemConfig{ 142 ConfigBpf: "y", 143 ConfigBpfSyscall: "y", 144 ConfigNetSchIngress: "y", 145 ConfigNetClsBpf: "y", 146 ConfigNetClsAct: "y", 147 ConfigBpfJit: "n", 148 ConfigHaveEbpfJit: "y", 149 ConfigCgroupBpf: "y", 150 ConfigLwtunnelBpf: "y", 151 ConfigBpfEvents: "y", 152 }, 153 expectErr: true, 154 }, 155 { 156 systemConfig: SystemConfig{ 157 ConfigBpf: "y", 158 ConfigBpfSyscall: "y", 159 ConfigNetSchIngress: "y", 160 ConfigNetClsBpf: "y", 161 ConfigNetClsAct: "y", 162 ConfigBpfJit: "y", 163 ConfigHaveEbpfJit: "n", 164 ConfigCgroupBpf: "y", 165 ConfigLwtunnelBpf: "y", 166 ConfigBpfEvents: "y", 167 }, 168 expectErr: true, 169 }, 170 // Disable options which generate warnings 171 { 172 systemConfig: SystemConfig{ 173 ConfigBpf: "y", 174 ConfigBpfSyscall: "y", 175 ConfigNetSchIngress: "y", 176 ConfigNetClsBpf: "y", 177 ConfigNetClsAct: "y", 178 ConfigBpfJit: "y", 179 ConfigHaveEbpfJit: "y", 180 ConfigCgroupBpf: "n", 181 ConfigLwtunnelBpf: "n", 182 ConfigBpfEvents: "n", 183 }, 184 expectErr: false, 185 }, 186 { 187 systemConfig: SystemConfig{ 188 ConfigBpf: "y", 189 ConfigBpfSyscall: "y", 190 ConfigNetSchIngress: "y", 191 ConfigNetClsBpf: "y", 192 ConfigNetClsAct: "y", 193 ConfigBpfJit: "y", 194 ConfigHaveEbpfJit: "y", 195 ConfigCgroupBpf: "n", 196 ConfigLwtunnelBpf: "y", 197 ConfigBpfEvents: "y", 198 }, 199 expectErr: false, 200 }, 201 { 202 systemConfig: SystemConfig{ 203 ConfigBpf: "y", 204 ConfigBpfSyscall: "y", 205 ConfigNetSchIngress: "y", 206 ConfigNetClsBpf: "y", 207 ConfigNetClsAct: "y", 208 ConfigBpfJit: "y", 209 ConfigHaveEbpfJit: "y", 210 ConfigCgroupBpf: "y", 211 ConfigLwtunnelBpf: "n", 212 ConfigBpfEvents: "y", 213 }, 214 expectErr: false, 215 }, 216 { 217 systemConfig: SystemConfig{ 218 ConfigBpf: "y", 219 ConfigBpfSyscall: "y", 220 ConfigNetSchIngress: "y", 221 ConfigNetClsBpf: "y", 222 ConfigNetClsAct: "y", 223 ConfigBpfJit: "y", 224 ConfigHaveEbpfJit: "y", 225 ConfigCgroupBpf: "y", 226 ConfigLwtunnelBpf: "y", 227 ConfigBpfEvents: "n", 228 }, 229 expectErr: false, 230 }, 231 } 232 for _, tc := range testCases { 233 manager := &ProbeManager{ 234 features: Features{SystemConfig: tc.systemConfig}, 235 } 236 err := manager.SystemConfigProbes() 237 if tc.expectErr { 238 if err == nil { 239 t.Error("unexpected nil error") 240 } 241 } else { 242 if err != nil { 243 t.Error(err) 244 } 245 } 246 } 247 } 248 249 func TestWriteFeatureHeader(t *testing.T) { 250 testCases := []struct { 251 features map[string]bool 252 common bool 253 expectedLines []string 254 }{ 255 { 256 features: map[string]bool{ 257 "HAVE_FEATURE_MACRO": true, 258 }, 259 common: true, 260 expectedLines: []string{ 261 "#define HAVE_FEATURE_MACRO 1", 262 }, 263 }, 264 { 265 features: map[string]bool{ 266 "HAVE_FEATURE_MACRO": true, 267 }, 268 common: false, 269 expectedLines: []string{ 270 "#include \"features.h\"", 271 "#define HAVE_FEATURE_MACRO 1", 272 }, 273 }, 274 } 275 276 for _, tc := range testCases { 277 buf := new(bytes.Buffer) 278 if err := writeFeatureHeader(buf, tc.features, tc.common); err != nil { 279 t.Error(err) 280 } 281 str := buf.String() 282 283 for _, s := range tc.expectedLines { 284 if !strings.Contains(str, s) { 285 t.Errorf("expected %s to contain %s", str, s) 286 } 287 } 288 } 289 } 290 291 func TestExecuteSystemConfigProbes(t *testing.T) { 292 testutils.PrivilegedTest(t) 293 294 if err := NewProbeManager().SystemConfigProbes(); err != nil { 295 t.Error(err) 296 } 297 } 298 299 func TestExecuteHeaderProbes(t *testing.T) { 300 testutils.PrivilegedTest(t) 301 302 if ExecuteHeaderProbes() == nil { 303 t.Error("expected probes to not be nil") 304 } 305 } 306 307 func TestOuterSourceIPProbe(t *testing.T) { 308 testutils.PrivilegedTest(t) 309 testutils.SkipOnOldKernel(t, "5.19", "source IP support in struct bpf_tunnel_key") 310 311 if err := HaveOuterSourceIPSupport(); err != nil { 312 t.Fatal(err) 313 } 314 } 315 316 func TestSKBAdjustRoomL2RoomMACSupportProbe(t *testing.T) { 317 testutils.PrivilegedTest(t) 318 testutils.SkipOnOldKernel(t, "5.2", "BPF_ADJ_ROOM_MAC mode support in bpf_skb_adjust_room") 319 320 if err := HaveSKBAdjustRoomL2RoomMACSupport(); err != nil { 321 t.Fatal(err) 322 } 323 } 324 325 func TestIPv6Support(t *testing.T) { 326 if err := HaveIPv6Support(); err != nil { 327 t.Fatal(err) 328 } 329 } 330 331 func TestHaveDeadCodeElimSupport(t *testing.T) { 332 testutils.PrivilegedTest(t) 333 334 if err := HaveDeadCodeElim(); err != nil { 335 t.Fatal(err) 336 } 337 } 338 339 func TestHaveTCX(t *testing.T) { 340 testutils.PrivilegedTest(t) 341 testutils.SkipOnOldKernel(t, "6.6", "tcx bpf_link") 342 343 if err := HaveTCX(); err != nil { 344 t.Fatal(err) 345 } 346 }