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 */