go.ligato.io/vpp-agent/v3@v3.5.0/plugins/linux/linuxmock/netlink_if_handler_mock.go (about)

     1  // Copyright (c) 2018 Cisco and/or its affiliates.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at:
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package linuxmock
    16  
    17  /*
    18  // IfNetlinkHandlerMock allows to mock netlink-related methods
    19  type IfNetlinkHandlerMock struct {
    20  	responses []*WhenIfResp
    21  	calls     []*called
    22  	respCurr  int
    23  	respMax   int
    24  }
    25  
    26  // NewIfNetlinkHandlerMock creates new instance of the mock and initializes response list
    27  func NewIfNetlinkHandlerMock() *IfNetlinkHandlerMock {
    28  	return &IfNetlinkHandlerMock{
    29  		responses: make([]*WhenIfResp, 0),
    30  	}
    31  }
    32  
    33  // WhenIfResp is helper struct with single method call and desired response items
    34  type WhenIfResp struct {
    35  	methodName string
    36  	items      []interface{}
    37  }
    38  
    39  // called is helper struct with method name which was called including parameters
    40  type called struct {
    41  	methodName string
    42  	params     []interface{}
    43  }
    44  
    45  // When defines name of the related method. It creates a new instance of WhenIfResp with provided method name and
    46  // stores it to the mock.
    47  func (mock *IfNetlinkHandlerMock) When(name string) *WhenIfResp {
    48  	resp := &WhenIfResp{
    49  		methodName: name,
    50  	}
    51  	mock.responses = append(mock.responses, resp)
    52  	return resp
    53  }
    54  
    55  // ThenReturn receives array of items, which are desired to be returned in mocked method defined in "When". The full
    56  // logic is:
    57  // - When('someMethod').ThenReturn('values')
    58  //
    59  // Provided values should match return types of method. If method returns multiple values and only one is provided,
    60  // mock tries to parse the value and returns it, while others will be nil or empty.
    61  //
    62  // If method is called several times, all cases must be defined separately, even if the return value is the same:
    63  // - When('method1').ThenReturn('val1')
    64  // - When('method1').ThenReturn('val1')
    65  //
    66  // All mocked methods are evaluated in same order they were assigned.
    67  func (when *WhenIfResp) ThenReturn(item ...interface{}) {
    68  	when.items = item
    69  }
    70  
    71  // GetCallsFor returns number of calls for specific method including parameters used for every call
    72  func (mock *IfNetlinkHandlerMock) GetCallsFor(name string) (numCalls int, params map[int][]interface{}) {
    73  	params = make(map[int][]interface{})
    74  	index := 0
    75  	for _, call := range mock.calls {
    76  		if call.methodName == name {
    77  			index++
    78  			params[index] = call.params
    79  		}
    80  	}
    81  	return index, params
    82  }
    83  
    84  // Auxiliary method returns next return value for provided method as generic type
    85  func (mock *IfNetlinkHandlerMock) getReturnValues(name string) (response []interface{}) {
    86  	for i, resp := range mock.responses {
    87  		if resp.methodName == name {
    88  			// Remove used response but retain order
    89  			mock.responses = append(mock.responses[:i], mock.responses[i+1:]...)
    90  			return resp.items
    91  		}
    92  	}
    93  	// Return empty response
    94  	return
    95  }
    96  
    97  // Auxiliary method adds method/params entry to the mock
    98  func (mock *IfNetlinkHandlerMock) addCalled(name string, params ...interface{}) {
    99  	var parameters []interface{}
   100  	parameters = append(parameters, params)
   101  	mock.calls = append(mock.calls, &called{methodName: name, params: params})
   102  }
   103  
   104  // Mocked netlink handler methods
   105  
   106  // AddVethInterfacePair implements NetlinkAPI.
   107  func (mock *IfNetlinkHandlerMock) AddVethInterfacePair(ifName, peerIfName string) error {
   108  	items := mock.getReturnValues("AddVethInterfacePair")
   109  	if len(items) >= 1 {
   110  		return items[0].(error)
   111  	}
   112  	return nil
   113  }
   114  
   115  // DelVethInterfacePair implements NetlinkAPI.
   116  func (mock *IfNetlinkHandlerMock) DelVethInterfacePair(ifName, peerIfName string) error {
   117  	items := mock.getReturnValues("DelVethInterfacePair")
   118  	if len(items) >= 1 {
   119  		return items[0].(error)
   120  	}
   121  	return nil
   122  }
   123  
   124  // SetInterfaceUp implements NetlinkAPI.
   125  func (mock *IfNetlinkHandlerMock) SetInterfaceUp(ifName string) error {
   126  	items := mock.getReturnValues("SetInterfaceUp")
   127  	if len(items) >= 1 {
   128  		return items[0].(error)
   129  	}
   130  	return nil
   131  }
   132  
   133  // SetInterfaceDown implements NetlinkAPI.
   134  func (mock *IfNetlinkHandlerMock) SetInterfaceDown(ifName string) error {
   135  	items := mock.getReturnValues("SetInterfaceDown")
   136  	if len(items) >= 1 {
   137  		return items[0].(error)
   138  	}
   139  	return nil
   140  }
   141  
   142  // AddInterfaceIP implements NetlinkAPI.
   143  func (mock *IfNetlinkHandlerMock) AddInterfaceIP(ifName string, addr *net.IPNet) error {
   144  	mock.addCalled("AddInterfaceIP", ifName, addr)
   145  	items := mock.getReturnValues("AddInterfaceIP")
   146  	if len(items) >= 1 {
   147  		return items[0].(error)
   148  	}
   149  	return nil
   150  }
   151  
   152  // DelInterfaceIP implements NetlinkAPI.
   153  func (mock *IfNetlinkHandlerMock) DelInterfaceIP(ifName string, addr *net.IPNet) error {
   154  	items := mock.getReturnValues("DelInterfaceIP")
   155  	if len(items) >= 1 {
   156  		return items[0].(error)
   157  	}
   158  	return nil
   159  }
   160  
   161  // SetInterfaceMac implements NetlinkAPI.
   162  func (mock *IfNetlinkHandlerMock) SetInterfaceMac(ifName string, macAddress string) error {
   163  	items := mock.getReturnValues("SetInterfaceMac")
   164  	if len(items) >= 1 {
   165  		return items[0].(error)
   166  	}
   167  	return nil
   168  }
   169  
   170  // SetInterfaceMTU implements NetlinkAPI.
   171  func (mock *IfNetlinkHandlerMock) SetInterfaceMTU(ifName string, mtu int) error {
   172  	items := mock.getReturnValues("SetInterfaceMTU")
   173  	if len(items) >= 1 {
   174  		return items[0].(error)
   175  	}
   176  	return nil
   177  }
   178  
   179  // RenameInterface implements NetlinkAPI.
   180  func (mock *IfNetlinkHandlerMock) RenameInterface(ifName string, newName string) error {
   181  	items := mock.getReturnValues("RenameInterface")
   182  	if len(items) >= 1 {
   183  		return items[0].(error)
   184  	}
   185  	return nil
   186  }
   187  
   188  // GetLinkByName implements NetlinkAPI.
   189  func (mock *IfNetlinkHandlerMock) GetLinkByName(ifName string) (netlink.Link, error) {
   190  	items := mock.getReturnValues("GetLinkByName")
   191  	if len(items) == 1 {
   192  		switch typed := items[0].(type) {
   193  		case netlink.Link:
   194  			return typed, nil
   195  		case error:
   196  			return nil, typed
   197  		}
   198  	} else if len(items) == 2 {
   199  		return items[0].(netlink.Link), items[1].(error)
   200  	}
   201  	return nil, nil
   202  }
   203  
   204  // GetLinkList implements NetlinkAPI.
   205  func (mock *IfNetlinkHandlerMock) GetLinkList() ([]netlink.Link, error) {
   206  	items := mock.getReturnValues("GetLinkList")
   207  	if len(items) == 1 {
   208  		switch typed := items[0].(type) {
   209  		case []netlink.Link:
   210  			return typed, nil
   211  		case error:
   212  			return nil, typed
   213  		}
   214  	} else if len(items) == 2 {
   215  		return items[0].([]netlink.Link), items[1].(error)
   216  	}
   217  	return nil, nil
   218  }
   219  
   220  // GetAddressList implements NetlinkAPI.
   221  func (mock *IfNetlinkHandlerMock) GetAddressList(ifName string) ([]netlink.Addr, error) {
   222  	items := mock.getReturnValues("GetAddressList")
   223  	if len(items) == 1 {
   224  		switch typed := items[0].(type) {
   225  		case []netlink.Addr:
   226  			return typed, nil
   227  		case error:
   228  			return nil, typed
   229  		}
   230  	} else if len(items) == 2 {
   231  		return items[0].([]netlink.Addr), items[1].(error)
   232  	}
   233  	return nil, nil
   234  }
   235  
   236  // InterfaceExists implements NetlinkAPI.
   237  func (mock *IfNetlinkHandlerMock) InterfaceExists(ifName string) (bool, error) {
   238  	items := mock.getReturnValues("InterfaceExists")
   239  	if len(items) == 1 {
   240  		switch typed := items[0].(type) {
   241  		case bool:
   242  			return typed, nil
   243  		case error:
   244  			return false, typed
   245  		}
   246  	} else if len(items) == 2 {
   247  		return items[0].(bool), items[1].(error)
   248  	}
   249  	return false, nil
   250  }
   251  
   252  // GetInterfaceType implements NetlinkAPI.
   253  func (mock *IfNetlinkHandlerMock) GetInterfaceType(ifName string) (string, error) {
   254  	items := mock.getReturnValues("GetInterfaceType")
   255  	if len(items) == 1 {
   256  		switch typed := items[0].(type) {
   257  		case string:
   258  			return typed, nil
   259  		case error:
   260  			return "", typed
   261  		}
   262  	} else if len(items) == 2 {
   263  		return items[0].(string), items[1].(error)
   264  	}
   265  	return "", nil
   266  }
   267  
   268  // GetVethPeerName implements NetlinkAPI.
   269  func (mock *IfNetlinkHandlerMock) GetVethPeerName(ifName string) (string, error) {
   270  	items := mock.getReturnValues("GetVethPeerName")
   271  	if len(items) == 1 {
   272  		switch typed := items[0].(type) {
   273  		case string:
   274  			return typed, nil
   275  		case error:
   276  			return "", typed
   277  		}
   278  	} else if len(items) == 2 {
   279  		return items[0].(string), items[1].(error)
   280  	}
   281  	return "", nil
   282  }
   283  
   284  // GetInterfaceByName implements NetlinkAPI.
   285  func (mock *IfNetlinkHandlerMock) GetInterfaceByName(ifName string) (*net.Interface, error) {
   286  	items := mock.getReturnValues("GetInterfaceByName")
   287  	if len(items) == 1 {
   288  		switch typed := items[0].(type) {
   289  		case *net.Interface:
   290  			return typed, nil
   291  		case error:
   292  			return nil, typed
   293  		}
   294  	} else if len(items) == 2 {
   295  		return items[0].(*net.Interface), items[1].(error)
   296  	}
   297  	return nil, nil
   298  }
   299  
   300  // DumpInterfaces does not return a value
   301  func (mock *IfNetlinkHandlerMock) DumpInterfaces() ([]*linuxcalls.LinuxInterfaceDetails, error) {
   302  	return nil, nil
   303  }
   304  
   305  // DumpInterfaceStatistics  does not return a value
   306  func (mock *IfNetlinkHandlerMock) DumpInterfaceStatistics() ([]*linuxcalls.LinuxInterfaceStatistics, error) {
   307  	return nil, nil
   308  }
   309  */