github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/edge/pkg/devicetwin/dtmanager/membership_test.go (about) 1 /* 2 Copyright 2019 The KubeEdge Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package dtmanager 18 19 import ( 20 "encoding/json" 21 "errors" 22 "sync" 23 "testing" 24 25 "github.com/golang/mock/gomock" 26 "github.com/stretchr/testify/assert" 27 28 "github.com/kubeedge/beehive/pkg/core/model" 29 "github.com/kubeedge/kubeedge/edge/mocks/beego" 30 "github.com/kubeedge/kubeedge/edge/pkg/common/dbm" 31 "github.com/kubeedge/kubeedge/edge/pkg/devicetwin/dtcontext" 32 "github.com/kubeedge/kubeedge/edge/pkg/devicetwin/dttype" 33 ) 34 35 func TestGetRemoveList(t *testing.T) { 36 dtc := &dtcontext.DTContext{ 37 DeviceList: &sync.Map{}, 38 } 39 40 var device dttype.Device 41 dtc.DeviceList.Store("DeviceB", &device) 42 dArray := []dttype.Device{} 43 d := dttype.Device{ 44 ID: "123", 45 } 46 dArray = append(dArray, d) 47 value := getRemoveList(dtc, dArray) 48 for i := range value { 49 assert.Equal(t, "DeviceB", value[i].ID) 50 } 51 } 52 53 func TestGetRemoveListProperDevideID(t *testing.T) { 54 dtc := &dtcontext.DTContext{ 55 DeviceList: &sync.Map{}, 56 } 57 var device dttype.Device 58 dtc.DeviceList.Store("123", &device) 59 dArray := []dttype.Device{} 60 d := dttype.Device{ 61 ID: "123", 62 } 63 dArray = append(dArray, d) 64 value := getRemoveList(dtc, dArray) 65 for i := range value { 66 assert.Equal(t, "123", value[i].ID) 67 } 68 } 69 70 func TestDealMembershipDetailInvalidEmptyMessage(t *testing.T) { 71 dtc := &dtcontext.DTContext{ 72 DeviceList: &sync.Map{}, 73 GroupID: "1", 74 } 75 value, err := dealMembershipDetail(dtc, "t", "invalid") 76 assert.Error(t, err) 77 assert.Equal(t, nil, value) 78 } 79 80 func TestDealMembershipDetailInvalidMsg(t *testing.T) { 81 dtc := &dtcontext.DTContext{ 82 DeviceList: &sync.Map{}, 83 GroupID: "1", 84 } 85 86 var m = &model.Message{ 87 Content: "invalidmsg", 88 } 89 90 value, err := dealMembershipDetail(dtc, "t", m) 91 assert.Error(t, err) 92 assert.Equal(t, errors.New("assertion failed"), err) 93 assert.Equal(t, nil, value) 94 } 95 96 func TestDealMembershipDetailInvalidContent(t *testing.T) { 97 98 dtc := &dtcontext.DTContext{ 99 DeviceList: &sync.Map{}, 100 GroupID: "1", 101 } 102 var cnt []uint8 103 cnt = append(cnt, 1) 104 var m = &model.Message{ 105 Content: cnt, 106 } 107 108 value, err := dealMembershipDetail(dtc, "t", m) 109 assert.Error(t, err) 110 assert.Equal(t, nil, value) 111 } 112 113 func TestDealMembershipDetailValid(t *testing.T) { 114 dtc := &dtcontext.DTContext{ 115 DeviceList: &sync.Map{}, 116 Mutex: &sync.RWMutex{}, 117 GroupID: "1", 118 } 119 120 payload := dttype.MembershipUpdate{AddDevices: []dttype.Device{{ID: "DeviceA", Name: "Router", 121 State: "unknown"}}, BaseMessage: dttype.BaseMessage{EventID: "eventid"}} 122 content, _ := json.Marshal(payload) 123 var m = &model.Message{ 124 Content: content, 125 } 126 value, err := dealMembershipDetail(dtc, "t", m) 127 assert.NoError(t, err) 128 assert.Equal(t, nil, value) 129 } 130 131 func TestDealMembershipUpdatedEmptyMessage(t *testing.T) { 132 dtc := &dtcontext.DTContext{ 133 DeviceList: &sync.Map{}, 134 GroupID: "1", 135 } 136 value, err := dealMembershipDetail(dtc, "t", "invalid") 137 assert.Error(t, err) 138 assert.Equal(t, errors.New("msg not Message type"), err) 139 assert.Equal(t, nil, value) 140 } 141 142 func TestDealMembershipUpdatedInvalidMsg(t *testing.T) { 143 144 dtc := &dtcontext.DTContext{ 145 DeviceList: &sync.Map{}, 146 GroupID: "1", 147 } 148 149 var m = &model.Message{ 150 Content: "invalidmessage", 151 } 152 153 value, err := dealMembershipUpdated(dtc, "t", m) 154 assert.Error(t, err) 155 assert.Equal(t, errors.New("assertion failed"), err) 156 assert.Equal(t, nil, value) 157 } 158 func TestDealMembershipUpdatedInvalidContent(t *testing.T) { 159 160 dtc := &dtcontext.DTContext{ 161 DeviceList: &sync.Map{}, 162 GroupID: "1", 163 } 164 165 var cnt []uint8 166 cnt = append(cnt, 1) 167 var m = &model.Message{ 168 Content: cnt, 169 } 170 171 value, err := dealMembershipUpdated(dtc, "t", m) 172 assert.Error(t, err) 173 assert.Equal(t, nil, value) 174 } 175 176 func TestDealMembershipUpdatedValidAddedDevice(t *testing.T) { 177 var ormerMock *beego.MockOrmer 178 179 mockCtrl := gomock.NewController(t) 180 defer mockCtrl.Finish() 181 ormerMock = beego.NewMockOrmer(mockCtrl) 182 dbm.DBAccess = ormerMock 183 184 ormerMock.EXPECT().Begin().Return(nil) 185 ormerMock.EXPECT().Insert(gomock.Any()).Return(int64(1), nil).Times(1) 186 ormerMock.EXPECT().Commit().Return(nil) 187 188 dtc := &dtcontext.DTContext{ 189 DeviceList: &sync.Map{}, 190 DeviceMutex: &sync.Map{}, 191 Mutex: &sync.RWMutex{}, 192 GroupID: "1", 193 } 194 195 payload := dttype.MembershipUpdate{ 196 AddDevices: []dttype.Device{ 197 { 198 ID: "DeviceA", 199 Name: "Router", 200 State: "unknown", 201 }, 202 }, 203 BaseMessage: dttype.BaseMessage{ 204 EventID: "eventid", 205 }, 206 } 207 content, _ := json.Marshal(payload) 208 var m = &model.Message{ 209 Content: content, 210 } 211 value, err := dealMembershipUpdated(dtc, "t", m) 212 assert.NoError(t, err) 213 assert.Equal(t, nil, value) 214 } 215 216 func TestDealMembershipUpdatedValidRemovedDevice(t *testing.T) { 217 dtc := &dtcontext.DTContext{ 218 DeviceList: &sync.Map{}, 219 DeviceMutex: &sync.Map{}, 220 Mutex: &sync.RWMutex{}, 221 GroupID: "1", 222 } 223 224 payload := dttype.MembershipUpdate{ 225 RemoveDevices: []dttype.Device{ 226 { 227 ID: "DeviceA", 228 Name: "Router", 229 State: "unknown", 230 }, 231 }, 232 BaseMessage: dttype.BaseMessage{ 233 EventID: "eventid", 234 }, 235 } 236 content, _ := json.Marshal(payload) 237 var m = &model.Message{ 238 Content: content, 239 } 240 value, err := dealMembershipUpdated(dtc, "t", m) 241 assert.NoError(t, err) 242 assert.Equal(t, nil, value) 243 } 244 245 func TestDealMerbershipGetEmptyMsg(t *testing.T) { 246 dtc := &dtcontext.DTContext{ 247 DeviceList: &sync.Map{}, 248 GroupID: "1", 249 } 250 value, err := dealMerbershipGet(dtc, "t", "invalid") 251 assert.Error(t, err) 252 assert.Equal(t, errors.New("msg not Message type"), err) 253 assert.Equal(t, nil, value) 254 } 255 256 func TestDealMerbershipGetInvalidMsg(t *testing.T) { 257 258 dtc := &dtcontext.DTContext{ 259 DeviceList: &sync.Map{}, 260 GroupID: "1", 261 } 262 263 var m = &model.Message{ 264 Content: "hello", 265 } 266 267 value, err := dealMerbershipGet(dtc, "t", m) 268 assert.Error(t, err) 269 assert.Equal(t, errors.New("assertion failed"), err) 270 assert.Equal(t, nil, value) 271 } 272 273 func TestDealMerbershipGetValid(t *testing.T) { 274 dtc := &dtcontext.DTContext{ 275 DeviceList: &sync.Map{}, 276 DeviceMutex: &sync.Map{}, 277 Mutex: &sync.RWMutex{}, 278 GroupID: "1", 279 } 280 281 payload := dttype.MembershipUpdate{ 282 AddDevices: []dttype.Device{ 283 { 284 ID: "DeviceA", 285 Name: "Router", 286 State: "unknown", 287 }, 288 }, 289 BaseMessage: dttype.BaseMessage{ 290 EventID: "eventid", 291 }, 292 } 293 content, _ := json.Marshal(payload) 294 var m = &model.Message{ 295 Content: content, 296 } 297 value, err := dealMerbershipGet(dtc, "t", m) 298 assert.Equal(t, nil, value) 299 assert.NoError(t, err) 300 } 301 302 func TestDealGetMembershipValid(t *testing.T) { 303 dtc := &dtcontext.DTContext{ 304 DeviceList: &sync.Map{}, 305 DeviceMutex: &sync.Map{}, 306 Mutex: &sync.RWMutex{}, 307 GroupID: "1", 308 } 309 310 payload := dttype.MembershipUpdate{ 311 AddDevices: []dttype.Device{ 312 { 313 ID: "DeviceA", 314 Name: "Router", 315 State: "unknown", 316 }, 317 }, 318 BaseMessage: dttype.BaseMessage{ 319 EventID: "eventid", 320 }, 321 } 322 content, _ := json.Marshal(payload) 323 324 err := DealGetMembership(dtc, content) 325 assert.NoError(t, err) 326 } 327 328 func TestDealGetMembershipInValid(t *testing.T) { 329 dtc := &dtcontext.DTContext{ 330 DeviceList: &sync.Map{}, 331 DeviceMutex: &sync.Map{}, 332 Mutex: &sync.RWMutex{}, 333 GroupID: "1", 334 } 335 336 err := DealGetMembership(dtc, []byte("invalid")) 337 assert.NoError(t, err) 338 } 339 340 //Commented As we are not considering about the coverage incase for coverage we can uncomment below cases. 341 /* 342 func TestAdded(t *testing.T) { 343 dtc := &dtcontext.DTContext{ 344 DeviceList: &sync.Map{}, 345 DeviceMutex: &sync.Map{}, 346 Mutex: &sync.Mutex{}, 347 GroupID: "1", 348 } 349 var d = []dttype.Device{{ 350 ID: "DeviceA", 351 Name: "Router", 352 State: "unknown", 353 }} 354 var b = dttype.BaseMessage{ 355 EventID: "eventid", 356 } 357 Added(dtc, d, b, true) 358 } 359 func TestRemoved(t *testing.T) { 360 ormerMock.EXPECT().Begin().Return(nil).Times(1) 361 ormerMock.EXPECT().Rollback().Return(nil).Times(0) 362 ormerMock.EXPECT().Commit().Return(nil).Times(1) 363 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(3) 364 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(3) 365 // success delete 366 querySeterMock.EXPECT().Delete().Return(int64(1), nil).Times(3) 367 // fail delete 368 querySeterMock.EXPECT().Delete().Return(int64(1), errors.New("failed to delete")).Times(0) 369 dtc := &dtcontext.DTContext{ 370 DeviceList: &sync.Map{}, 371 DeviceMutex: &sync.Map{}, 372 Mutex: &sync.Mutex{}, 373 GroupID: "1", 374 } 375 var device dttype.Device 376 dtc.DeviceList.Store("DeviceA", &device) 377 var d = []dttype.Device{{ 378 ID: "DeviceA", 379 Name: "Router", 380 State: "unknown", 381 }} 382 var b = dttype.BaseMessage{ 383 EventID: "eventid", 384 } 385 Removed(dtc, d, b, true) 386 } 387 */