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