77
88 "github.com/google/go-cmp/cmp"
99 "golang.zx2c4.com/wireguard/wgctrl/internal/wginternal"
10+ "golang.zx2c4.com/wireguard/wgctrl/internal/wgtest"
1011 "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
1112)
1213
@@ -224,11 +225,182 @@ func TestClientConfigureDevice(t *testing.T) {
224225 }
225226}
226227
228+ func TestClientConfigureDeviceWithShim (t * testing.T ) {
229+ type supportsFunc func (name string ) (bool , error )
230+
231+ var (
232+ dummyPeerKey = wgtypes.Key {}
233+ peerKey = wgtest .MustPublicKey ()
234+ ip = wgtest .MustCIDR ("192.0.2.0/32" )
235+
236+ notSupported = func (_ string ) (bool , error ) {
237+ return false , nil
238+ }
239+
240+ supported = func (_ string ) (bool , error ) {
241+ return true , nil
242+ }
243+
244+ returnsError = func (_ string ) (bool , error ) {
245+ return false , errFoo
246+ }
247+
248+ removeAllowedIP = wgtypes.Config {
249+ Peers : []wgtypes.PeerConfig {
250+ {
251+ PublicKey : peerKey ,
252+ AllowedIPs : []wgtypes.AllowedIPConfig {
253+ {
254+ IPNet : ip ,
255+ Remove : true ,
256+ },
257+ },
258+ },
259+ },
260+ }
261+
262+ removeAllowedIPUndone = wgtypes.Config {
263+ Peers : []wgtypes.PeerConfig {
264+ {
265+ PublicKey : peerKey ,
266+ AllowedIPs : []wgtypes.AllowedIPConfig {
267+ {
268+ IPNet : ip ,
269+ Remove : true ,
270+ },
271+ {
272+ IPNet : ip ,
273+ },
274+ },
275+ },
276+ },
277+ }
278+
279+ simulatedRemoveAllowedIP = wgtypes.Config {
280+ Peers : []wgtypes.PeerConfig {
281+ {
282+ PublicKey : dummyPeerKey ,
283+ AllowedIPs : []wgtypes.AllowedIPConfig {
284+ {
285+ IPNet : ip ,
286+ },
287+ },
288+ },
289+ {
290+ PublicKey : peerKey ,
291+ },
292+ {
293+ PublicKey : dummyPeerKey ,
294+ Remove : true ,
295+ },
296+ },
297+ }
298+
299+ dontRemoveAllowedIP = wgtypes.Config {
300+ Peers : []wgtypes.PeerConfig {
301+ {
302+ PublicKey : peerKey ,
303+ AllowedIPs : []wgtypes.AllowedIPConfig {
304+ {
305+ IPNet : ip ,
306+ },
307+ },
308+ },
309+ },
310+ }
311+ )
312+
313+ tests := []struct {
314+ name string
315+ fn supportsFunc
316+ cfg wgtypes.Config
317+ expectCfg wgtypes.Config
318+ err error
319+ }{
320+ {
321+ name : "not supported + remove IP" ,
322+ fn : notSupported ,
323+ cfg : removeAllowedIP ,
324+ expectCfg : simulatedRemoveAllowedIP ,
325+ err : nil ,
326+ },
327+ {
328+ name : "not supported + remove IP undone" ,
329+ fn : notSupported ,
330+ cfg : removeAllowedIPUndone ,
331+ expectCfg : dontRemoveAllowedIP ,
332+ err : nil ,
333+ },
334+ {
335+ name : "not supported + don't remove IP" ,
336+ fn : notSupported ,
337+ cfg : dontRemoveAllowedIP ,
338+ expectCfg : dontRemoveAllowedIP ,
339+ err : nil ,
340+ },
341+ {
342+ name : "supported + remove IP" ,
343+ fn : supported ,
344+ cfg : removeAllowedIP ,
345+ expectCfg : removeAllowedIP ,
346+ err : nil ,
347+ },
348+ {
349+ name : "supported + don't remove IP" ,
350+ fn : supported ,
351+ cfg : dontRemoveAllowedIP ,
352+ expectCfg : dontRemoveAllowedIP ,
353+ err : nil ,
354+ },
355+ {
356+ name : "probe error + remove IP" ,
357+ fn : returnsError ,
358+ cfg : removeAllowedIP ,
359+ expectCfg : wgtypes.Config {},
360+ err : errFoo ,
361+ },
362+ {
363+ name : "probe error + don't remove IP" ,
364+ fn : returnsError ,
365+ cfg : dontRemoveAllowedIP ,
366+ expectCfg : wgtypes.Config {},
367+ err : errFoo ,
368+ },
369+ }
370+
371+ for _ , tt := range tests {
372+ t .Run (tt .name , func (t * testing.T ) {
373+ var finalCfg wgtypes.Config
374+
375+ cs , _ := WithShim (& testClient {
376+ ConfigureDeviceFunc : func (name string , cfg wgtypes.Config ) error {
377+ finalCfg = cfg
378+
379+ return nil
380+ },
381+ SupportsAllowedIPRemoveFunc : tt .fn ,
382+ })
383+
384+ c := & Client {cs : []wginternal.Client {cs }}
385+
386+ err := c .ConfigureDevice ("" , tt .cfg )
387+ if ! errors .Is (err , tt .err ) {
388+ t .Fatalf ("unexpected error: got %s, want %s" , err , tt .err )
389+ }
390+
391+ if diff := cmp .Diff (tt .expectCfg , finalCfg ); diff != "" {
392+ t .Fatalf ("unexpected config (-want +got):\n %s" , diff )
393+ }
394+ })
395+ }
396+ }
397+
227398type testClient struct {
228- CloseFunc func () error
229- DevicesFunc func () ([]* wgtypes.Device , error )
230- DeviceFunc func (name string ) (* wgtypes.Device , error )
231- ConfigureDeviceFunc func (name string , cfg wgtypes.Config ) error
399+ CloseFunc func () error
400+ DevicesFunc func () ([]* wgtypes.Device , error )
401+ DeviceFunc func (name string ) (* wgtypes.Device , error )
402+ ConfigureDeviceFunc func (name string , cfg wgtypes.Config ) error
403+ SupportsAllowedIPRemoveFunc func (name string ) (bool , error )
232404}
233405
234406func (c * testClient ) Close () error { return c .CloseFunc () }
@@ -242,5 +414,5 @@ func (c *testClient) ConfigureDevice(name string, cfg wgtypes.Config) error {
242414}
243415
244416func (c * testClient ) SupportsAllowedIPRemove (name string ) (bool , error ) {
245- return false , nil
417+ return c . SupportsAllowedIPRemoveFunc ( name )
246418}
0 commit comments