github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/edge/pkg/metamanager/process_test.go (about) 1 /* 2 Copyright 2018 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 metamanager 18 19 // TODO re-optimize testcase @kadisi 20 /* 21 import ( 22 "encoding/json" 23 "errors" 24 "testing" 25 "time" 26 27 "github.com/golang/mock/gomock" 28 29 "github.com/kubeedge/beehive/pkg/core" 30 "github.com/kubeedge/beehive/pkg/core/context" 31 "github.com/kubeedge/beehive/pkg/core/model" 32 "github.com/kubeedge/kubeedge/edge/mocks/beego" 33 "github.com/kubeedge/kubeedge/edge/mocks/beehive" 34 connect "github.com/kubeedge/kubeedge/edge/pkg/common/cloudconnection" 35 "github.com/kubeedge/kubeedge/edge/pkg/common/dbm" 36 "github.com/kubeedge/kubeedge/edge/pkg/common/modules" 37 "github.com/kubeedge/kubeedge/edge/pkg/metamanager/dao" 38 ) 39 40 const ( 41 // FailedDBOperation is common Database operation fail message 42 FailedDBOperation = "Failed DB Operation" 43 // ModuleNameEdged is name of edged module 44 ModuleNameEdged = "edged" 45 // ModuleNameEdgeHub is name of edgehub module 46 ModuleNameEdgeHub = "websocket" 47 // ModuleNameController is the name of the controller module 48 ModuleNameController = "edgecontroller" 49 // MarshalErroris common jsonMarshall error 50 MarshalError = "Error to marshal message content: json: unsupported type: chan int" 51 // OperationNodeConnection is message with operation publish 52 OperationNodeConnection = "publish" 53 ) 54 55 // errFailedDBOperation is common Database operation fail error 56 var errFailedDBOperation = errors.New(FailedDBOperation) 57 58 // mainContext is beehive context used for communication between modules 59 var mainContext *context.Context 60 61 // metaMgrModule is metamanager implementation of Module interface 62 var metaMgrModule core.Module 63 64 // TestProcessInsert is function to test processInsert 65 func TestProcessInsert(t *testing.T) { 66 mockCtrl := gomock.NewController(t) 67 defer mockCtrl.Finish() 68 ormerMock := beego.NewMockOrmer(mockCtrl) 69 fakeEdged := beehive.NewMockModule(mockCtrl) 70 fakeEdgeHub := beehive.NewMockModule(mockCtrl) 71 fakeEdgeFunction := beehive.NewMockModule(mockCtrl) 72 dbm.DBAccess = ormerMock 73 74 fakeEdgeHub.EXPECT().Name().Return(ModuleNameEdgeHub).Times(3) 75 fakeEdged.EXPECT().Name().Return(ModuleNameEdged).Times(3) 76 fakeEdgeFunction.EXPECT().Name().Return(EdgeFunctionModel).Times(3) 77 core.Register(fakeEdgeHub) 78 core.Register(fakeEdged) 79 core.Register(fakeEdgeFunction) 80 mainContext = context.GetContext(context.MsgCtxTypeChannel) 81 mainContext.AddModule(ModuleNameEdged) 82 mainContext.AddModule(ModuleNameEdgeHub) 83 mainContext.AddModuleGroup(ModuleNameEdgeHub, modules.HubGroup) 84 mainContext.AddModule(EdgeFunctionModel) 85 86 // metamanager module registration test case 87 core.Register(&metaManager{}) 88 modules := core.GetModules() 89 for name, module := range modules { 90 if name == MetaManagerModuleName { 91 metaMgrModule = module 92 break 93 } 94 } 95 if metaMgrModule == nil { 96 t.Errorf("can not get metaMgrModule") 97 return 98 } 99 t.Run("ModuleRegistration", func(t *testing.T) { 100 if metaMgrModule == nil { 101 t.Errorf("MetaManager Module not Registered with beehive core") 102 } 103 }) 104 mainContext.AddModule(metaMgrModule.Name()) 105 mainContext.AddModuleGroup(metaMgrModule.Name(), metaMgrModule.Group()) 106 metaMgrModule.Start(mainContext) 107 108 //SaveMeta Failed, feedbackError SendToCloud 109 ormerMock.EXPECT().Insert(gomock.Any()).Return(int64(1), errFailedDBOperation).Times(1) 110 msg := model.NewMessage("").BuildRouter(MetaManagerModuleName, GroupResource, model.ResourceTypePodStatus, model.InsertOperation) 111 mainContext.Send(MetaManagerModuleName, *msg) 112 message, err := mainContext.Receive(ModuleNameEdgeHub) 113 t.Run("EdgeHubChannelRegistration", func(t *testing.T) { 114 if err != nil { 115 t.Errorf("EdgeHub Channel not found: %v", err) 116 return 117 } 118 want := "Error to save meta to DB: " + FailedDBOperation 119 if message.GetContent() != want { 120 t.Errorf("Wrong Error message received : Wanted %v and Got %v", want, message.GetContent()) 121 } 122 }) 123 124 //SaveMeta Failed, feedbackError SendToEdged and 2 resources 125 ormerMock.EXPECT().Insert(gomock.Any()).Return(int64(1), errFailedDBOperation).Times(1) 126 msg = model.NewMessage("").BuildRouter(ModuleNameEdged, GroupResource, model.ResourceTypePodStatus+"/secondRes", model.InsertOperation) 127 mainContext.Send(MetaManagerModuleName, *msg) 128 message, err = mainContext.Receive(ModuleNameEdged) 129 t.Run("ErrorMessageToEdged", func(t *testing.T) { 130 if err != nil { 131 t.Errorf("EdgeD Channel not found: %v", err) 132 return 133 } 134 want := "Error to save meta to DB: " + FailedDBOperation 135 if message.GetContent() != want { 136 t.Errorf("Wrong Error message received : Wanted %v and Got %v", want, message.GetContent()) 137 } 138 }) 139 140 //jsonMarshall fail 141 msg = model.NewMessage("").BuildRouter(ModuleNameEdged, GroupResource, model.ResourceTypePodStatus, model.InsertOperation).FillBody(make(chan int)) 142 mainContext.Send(MetaManagerModuleName, *msg) 143 message, _ = mainContext.Receive(ModuleNameEdged) 144 t.Run("MarshallFail", func(t *testing.T) { 145 want := MarshalError 146 if message.GetContent() != want { 147 t.Errorf("Wrong Error message received : Wanted %v and Got %v", want, message.GetContent()) 148 } 149 }) 150 151 //Succesful Case and 3 resources 152 ormerMock.EXPECT().Insert(gomock.Any()).Return(int64(1), nil).Times(1) 153 msg = model.NewMessage("").BuildRouter(ModuleNameEdged, GroupResource, model.ResourceTypePodStatus+"/secondRes"+"/thirdRes", model.InsertOperation) 154 mainContext.Send(MetaManagerModuleName, *msg) 155 message, _ = mainContext.Receive(ModuleNameEdged) 156 t.Run("InsertMessageToEdged", func(t *testing.T) { 157 want := model.InsertOperation 158 if message.GetOperation() != want { 159 t.Errorf("Wrong message received : Wanted %v and Got %v", want, message.GetOperation()) 160 } 161 }) 162 message, _ = mainContext.Receive(ModuleNameEdgeHub) 163 t.Run("ResponseMessageToEdgeHub", func(t *testing.T) { 164 want := OK 165 if message.GetContent() != want { 166 t.Errorf("Wrong message received : Wanted %v and Got %v", want, message.GetContent()) 167 } 168 }) 169 } 170 171 // TestProcessUpdate is function to test processUpdate 172 func TestProcessUpdate(t *testing.T) { 173 mockCtrl := gomock.NewController(t) 174 defer mockCtrl.Finish() 175 ormerMock := beego.NewMockOrmer(mockCtrl) 176 querySeterMock := beego.NewMockQuerySeter(mockCtrl) 177 rawSeterMock := beego.NewMockRawSeter(mockCtrl) 178 dbm.DBAccess = ormerMock 179 180 //jsonMarshall fail 181 msg := model.NewMessage("").BuildRouter(ModuleNameEdged, GroupResource, model.ResourceTypePodStatus, model.UpdateOperation).FillBody(make(chan int)) 182 mainContext.Send(MetaManagerModuleName, *msg) 183 message, _ := mainContext.Receive(ModuleNameEdged) 184 t.Run("MarshallFail", func(t *testing.T) { 185 want := MarshalError 186 if message.GetContent() != want { 187 t.Errorf("Wrong Error message received : Wanted %v and Got %v", want, message.GetContent()) 188 } 189 }) 190 191 //Database save error 192 ormerMock.EXPECT().Raw(gomock.Any(), gomock.Any()).Return(rawSeterMock).Times(1) 193 rawSeterMock.EXPECT().Exec().Return(nil, errFailedDBOperation).Times(1) 194 msg = model.NewMessage("").BuildRouter(ModuleNameEdged, GroupResource, model.ResourceTypePodStatus, model.UpdateOperation) 195 mainContext.Send(MetaManagerModuleName, *msg) 196 message, _ = mainContext.Receive(ModuleNameEdged) 197 t.Run("DatabaseSaveError", func(t *testing.T) { 198 want := "Error to update meta to DB: " + FailedDBOperation 199 if message.GetContent() != want { 200 t.Errorf("Wrong Error message received : Wanted %v and Got %v", want, message.GetContent()) 201 } 202 }) 203 204 //resourceUnchanged true 205 fakeDao := new([]dao.Meta) 206 fakeDaoArray := make([]dao.Meta, 1) 207 fakeDaoArray[0] = dao.Meta{Key: "Test", Value: "\"test\""} 208 fakeDao = &fakeDaoArray 209 querySeterMock.EXPECT().All(gomock.Any()).SetArg(0, *fakeDao).Return(int64(1), nil).Times(1) 210 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 211 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 212 msg = model.NewMessage("").BuildRouter(ModuleNameEdged, GroupResource, "test/"+model.ResourceTypePodStatus, model.UpdateOperation).FillBody("test") 213 mainContext.Send(MetaManagerModuleName, *msg) 214 message, _ = mainContext.Receive(ModuleNameEdged) 215 t.Run("ResourceUnchangedTrue", func(t *testing.T) { 216 want := OK 217 if message.GetContent() != want { 218 t.Errorf("Resource Unchanged Case Failed: Wanted %v and Got %v", want, message.GetContent()) 219 } 220 }) 221 222 //Success Case Source Edged, sync = true 223 ormerMock.EXPECT().Raw(gomock.Any(), gomock.Any()).Return(rawSeterMock).Times(1) 224 rawSeterMock.EXPECT().Exec().Return(nil, nil).Times(1) 225 msg = model.NewMessage("").BuildRouter(ModuleNameEdged, GroupResource, model.ResourceTypePodStatus, model.UpdateOperation) 226 msg.Header.Sync = true 227 message, err := mainContext.SendSync(MetaManagerModuleName, *msg, time.Duration(3)*time.Second) 228 t.Run("SuccessSourceSyncErrorCheck", func(t *testing.T) { 229 if err != nil { 230 t.Errorf("Send Sync Failed with error %v", err) 231 } 232 }) 233 edgehubMsg, _ := mainContext.Receive(ModuleNameEdgeHub) 234 t.Run("SuccessSourceEdgedReceiveEdgehub", func(t *testing.T) { 235 want := model.UpdateOperation 236 if edgehubMsg.GetOperation() != want { 237 t.Errorf("Wrong message received : Wanted operation %v and Got operation %v", want, edgehubMsg.GetOperation()) 238 } 239 }) 240 t.Run("SuccessSourceEdgedReceiveEdged", func(t *testing.T) { 241 want := OK 242 if message.GetContent() != want { 243 t.Errorf("Wrong message received : Wanted %v and Got %v", want, message.GetContent()) 244 } 245 }) 246 247 //Success Case Source CloudControlerModel 248 ormerMock.EXPECT().Raw(gomock.Any(), gomock.Any()).Return(rawSeterMock).Times(1) 249 rawSeterMock.EXPECT().Exec().Return(nil, nil).Times(1) 250 msg = model.NewMessage("").BuildRouter(CloudControlerModel, GroupResource, model.ResourceTypePodStatus, model.UpdateOperation) 251 mainContext.Send(MetaManagerModuleName, *msg) 252 message, _ = mainContext.Receive(ModuleNameEdged) 253 t.Run("SuccessSend[CloudController->Edged]", func(t *testing.T) { 254 want := CloudControlerModel 255 if message.GetSource() != want { 256 t.Errorf("Wrong message received : Wanted from source %v and Got from source %v", want, message.GetSource()) 257 } 258 }) 259 message, _ = mainContext.Receive(ModuleNameEdgeHub) 260 t.Run("SuccessSendCloud[CloudController->EdgeHub]", func(t *testing.T) { 261 want := OK 262 if message.GetContent() != want { 263 t.Errorf("Wrong message received : Wanted %v and Got %v", want, message.GetContent()) 264 } 265 }) 266 267 //Success Case Source CloudFunctionModel 268 ormerMock.EXPECT().Raw(gomock.Any(), gomock.Any()).Return(rawSeterMock).Times(1) 269 rawSeterMock.EXPECT().Exec().Return(nil, nil).Times(1) 270 msg = model.NewMessage("").BuildRouter(CloudFunctionModel, GroupResource, model.ResourceTypePodStatus, model.UpdateOperation) 271 mainContext.Send(MetaManagerModuleName, *msg) 272 message, _ = mainContext.Receive(EdgeFunctionModel) 273 t.Run("SuccessSend[CloudFunction->EdgeFunction]", func(t *testing.T) { 274 want := CloudFunctionModel 275 if message.GetSource() != want { 276 t.Errorf("Wrong message received : Wanted from source %v and Got from source %v", want, message.GetSource()) 277 } 278 }) 279 280 //Success Case Source EdgeFunctionModel 281 ormerMock.EXPECT().Raw(gomock.Any(), gomock.Any()).Return(rawSeterMock).Times(1) 282 rawSeterMock.EXPECT().Exec().Return(nil, nil).Times(1) 283 msg = model.NewMessage("").BuildRouter(EdgeFunctionModel, GroupResource, model.ResourceTypePodStatus, model.UpdateOperation) 284 mainContext.Send(MetaManagerModuleName, *msg) 285 message, _ = mainContext.Receive(ModuleNameEdgeHub) 286 t.Run("SuccessSend[EdgeFunction->EdgeHub]", func(t *testing.T) { 287 want := EdgeFunctionModel 288 if message.GetSource() != want { 289 t.Errorf("Wrong message received : Wanted from source %v and Got from source %v", want, message.GetSource()) 290 } 291 }) 292 } 293 294 // TestProcessResponse is function to test processResponse 295 func TestProcessResponse(t *testing.T) { 296 mockCtrl := gomock.NewController(t) 297 defer mockCtrl.Finish() 298 ormerMock := beego.NewMockOrmer(mockCtrl) 299 rawSeterMock := beego.NewMockRawSeter(mockCtrl) 300 dbm.DBAccess = ormerMock 301 302 //jsonMarshall fail 303 msg := model.NewMessage("").BuildRouter(ModuleNameEdged, GroupResource, model.ResourceTypePodStatus, model.ResponseOperation).FillBody(make(chan int)) 304 mainContext.Send(MetaManagerModuleName, *msg) 305 message, _ := mainContext.Receive(ModuleNameEdged) 306 t.Run("MarshallFail", func(t *testing.T) { 307 want := MarshalError 308 if message.GetContent() != want { 309 t.Errorf("Wrong Error message received : Wanted %v and Got %v", want, message.GetContent()) 310 } 311 }) 312 313 //Database save error 314 ormerMock.EXPECT().Raw(gomock.Any(), gomock.Any()).Return(rawSeterMock).Times(1) 315 rawSeterMock.EXPECT().Exec().Return(nil, errFailedDBOperation).Times(1) 316 msg = model.NewMessage("").BuildRouter(ModuleNameEdged, GroupResource, model.ResourceTypePodStatus, model.ResponseOperation) 317 mainContext.Send(MetaManagerModuleName, *msg) 318 message, _ = mainContext.Receive(ModuleNameEdged) 319 t.Run("DatabaseSaveError", func(t *testing.T) { 320 want := "Error to update meta to DB: " + FailedDBOperation 321 if message.GetContent() != want { 322 t.Errorf("Wrong Error message received : Wanted %v and Got %v", want, message.GetContent()) 323 } 324 }) 325 326 //Success Case Source EdgeD 327 ormerMock.EXPECT().Raw(gomock.Any(), gomock.Any()).Return(rawSeterMock).Times(1) 328 rawSeterMock.EXPECT().Exec().Return(nil, nil).Times(1) 329 msg = model.NewMessage("").BuildRouter(ModuleNameEdged, GroupResource, model.ResourceTypePodStatus, model.ResponseOperation) 330 mainContext.Send(MetaManagerModuleName, *msg) 331 message, _ = mainContext.Receive(ModuleNameEdgeHub) 332 t.Run("SuccessSourceEdged", func(t *testing.T) { 333 want := ModuleNameEdged 334 if message.GetSource() != want { 335 t.Errorf("Wrong message received : Wanted from source %v and Got from source %v", want, message.GetSource()) 336 } 337 }) 338 339 //Success Case Source EdgeHub 340 ormerMock.EXPECT().Raw(gomock.Any(), gomock.Any()).Return(rawSeterMock).Times(1) 341 rawSeterMock.EXPECT().Exec().Return(nil, nil).Times(1) 342 msg = model.NewMessage("").BuildRouter(ModuleNameController, GroupResource, model.ResourceTypePodStatus, model.ResponseOperation) 343 mainContext.Send(MetaManagerModuleName, *msg) 344 message, _ = mainContext.Receive(ModuleNameEdged) 345 t.Run("SuccessSourceEdgeHub", func(t *testing.T) { 346 want := ModuleNameController 347 if message.GetSource() != want { 348 t.Errorf("Wrong message received : Wanted from source %v and Got from source %v", want, message.GetSource()) 349 } 350 }) 351 } 352 353 // TestProcessDelete is function to test processDelete 354 func TestProcessDelete(t *testing.T) { 355 mockCtrl := gomock.NewController(t) 356 defer mockCtrl.Finish() 357 ormerMock := beego.NewMockOrmer(mockCtrl) 358 querySeterMock := beego.NewMockQuerySeter(mockCtrl) 359 dbm.DBAccess = ormerMock 360 361 //Database Save Error 362 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 363 querySeterMock.EXPECT().Delete().Return(int64(1), errFailedDBOperation).Times(1) 364 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 365 msg := model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, model.ResourceTypePodStatus, model.DeleteOperation) 366 mainContext.Send(MetaManagerModuleName, *msg) 367 message, _ := mainContext.Receive(ModuleNameEdgeHub) 368 t.Run("DatabaseDeleteError", func(t *testing.T) { 369 want := "Error to delete meta to DB: " + FailedDBOperation 370 if message.GetContent() != want { 371 t.Errorf("Wrong message received : Wanted %v and Got %v", want, message.GetContent()) 372 } 373 }) 374 375 //Success Case 376 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 377 querySeterMock.EXPECT().Delete().Return(int64(1), nil).Times(1) 378 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 379 msg = model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, model.ResourceTypePodStatus, model.DeleteOperation) 380 mainContext.Send(MetaManagerModuleName, *msg) 381 message, _ = mainContext.Receive(ModuleNameEdged) 382 t.Run("SuccessSourceEdgeHub", func(t *testing.T) { 383 want := ModuleNameEdgeHub 384 if message.GetSource() != want { 385 t.Errorf("Wrong message received : Wanted from source %v and Got from source %v", want, message.GetSource()) 386 } 387 }) 388 message, _ = mainContext.Receive(ModuleNameEdgeHub) 389 t.Run("SuccessResponseOK", func(t *testing.T) { 390 want := OK 391 if message.GetContent() != want { 392 t.Errorf("Wrong message received : Wanted %v and Got %v", want, message.GetContent()) 393 } 394 }) 395 } 396 397 // TestProcessQuery is function to test processQuery 398 func TestProcessQuery(t *testing.T) { 399 mockCtrl := gomock.NewController(t) 400 defer mockCtrl.Finish() 401 ormerMock := beego.NewMockOrmer(mockCtrl) 402 querySeterMock := beego.NewMockQuerySeter(mockCtrl) 403 rawSeterMock := beego.NewMockRawSeter(mockCtrl) 404 dbm.DBAccess = ormerMock 405 406 //process remote query sync error case 407 msg := model.NewMessage("").BuildRouter(ModuleNameEdged, GroupResource, model.ResourceTypePodStatus, OperationNodeConnection).FillBody(connect.CloudConnected) 408 mainContext.Send(MetaManagerModuleName, *msg) 409 //wait for message to be received by metaManager and get processed 410 time.Sleep(1 * time.Second) 411 t.Run("ConnectedTrue", func(t *testing.T) { 412 if connected != true { 413 t.Errorf("Connected was not set to true") 414 } 415 }) 416 querySeterMock.EXPECT().All(gomock.Any()).Return(int64(1), errFailedDBOperation).Times(1) 417 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 418 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 419 msg = model.NewMessage("").BuildRouter(ModuleNameEdged, GroupResource, "test/"+model.ResourceTypeConfigmap, model.QueryOperation) 420 mainContext.Cleanup(ModuleNameEdgeHub) 421 mainContext.Send(MetaManagerModuleName, *msg) 422 message, _ := mainContext.Receive(ModuleNameEdged) 423 t.Run("ProcessRemoteQuerySyncErrorCase", func(t *testing.T) { 424 want := "Error to query meta in DB: bad request module name(websocket)" 425 if message.GetContent() != want { 426 t.Errorf("Wrong message received : Wanted %v and Got %v", want, message.GetContent()) 427 } 428 }) 429 mainContext.AddModule(ModuleNameEdgeHub) 430 mainContext.AddModuleGroup(ModuleNameEdgeHub, modules.HubGroup) 431 432 //process remote query jsonMarshall error 433 querySeterMock.EXPECT().All(gomock.Any()).Return(int64(1), errFailedDBOperation).Times(1) 434 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 435 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 436 msg = model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, "test/"+model.ResourceTypeConfigmap, model.QueryOperation) 437 mainContext.Send(MetaManagerModuleName, *msg) 438 message, _ = mainContext.Receive(ModuleNameEdgeHub) 439 msg = model.NewMessage(message.GetID()).BuildRouter(ModuleNameEdgeHub, GroupResource, "test/"+model.ResourceTypeConfigmap, model.QueryOperation).FillBody(make(chan int)) 440 mainContext.SendResp(*msg) 441 message, _ = mainContext.Receive(ModuleNameEdgeHub) 442 t.Run("ProcessRemoteQueryMarshallFail", func(t *testing.T) { 443 want := MarshalError 444 if message.GetContent() != want { 445 t.Errorf("Wrong Error message received : Wanted %v and Got %v", want, message.GetContent()) 446 } 447 }) 448 449 //process remote query db fail 450 rawSeterMock.EXPECT().Exec().Return(nil, errFailedDBOperation).Times(1) 451 ormerMock.EXPECT().Raw(gomock.Any(), gomock.Any()).Return(rawSeterMock).Times(1) 452 querySeterMock.EXPECT().All(gomock.Any()).Return(int64(1), errFailedDBOperation).Times(1) 453 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 454 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 455 msg = model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, "test/"+model.ResourceTypeConfigmap, model.QueryOperation) 456 mainContext.Send(MetaManagerModuleName, *msg) 457 message, _ = mainContext.Receive(ModuleNameEdgeHub) 458 msg = model.NewMessage(message.GetID()).BuildRouter(ModuleNameEdgeHub, GroupResource, "test/"+model.ResourceTypeConfigmap, model.QueryOperation).FillBody("TestMessage") 459 mainContext.SendResp(*msg) 460 message, _ = mainContext.Receive(ModuleNameEdged) 461 t.Run("ProcessRemoteQueryDbFail", func(t *testing.T) { 462 want := "TestMessage" 463 if message.GetContent() != want { 464 t.Errorf("Wrong message received : Wanted %v and Got %v", want, message.GetContent()) 465 } 466 }) 467 468 //No error and connected true 469 fakeDao := new([]dao.Meta) 470 fakeDaoArray := make([]dao.Meta, 1) 471 fakeDaoArray[0] = dao.Meta{Key: "Test", Value: "Test"} 472 fakeDao = &fakeDaoArray 473 querySeterMock.EXPECT().All(gomock.Any()).SetArg(0, *fakeDao).Return(int64(1), nil).Times(1) 474 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 475 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 476 msg = model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, "test/"+model.ResourceTypeConfigmap, model.QueryOperation) 477 mainContext.Send(MetaManagerModuleName, *msg) 478 message, _ = mainContext.Receive(ModuleNameEdged) 479 t.Run("DatabaseNoErrorAndMetaFound", func(t *testing.T) { 480 want := make([]string, 1) 481 want[0] = "Test" 482 bytesWant, _ := json.Marshal(want) 483 bytesGot, _ := json.Marshal(message.GetContent()) 484 if string(bytesGot) != string(bytesWant) { 485 t.Errorf("Wrong message receive : Wanted %v and Got %v", want, message.GetContent()) 486 } 487 }) 488 489 //ResId Nil database error 490 msg = model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, model.ResourceTypePodStatus, OperationNodeConnection).FillBody(connect.CloudDisconnected) 491 mainContext.Send(MetaManagerModuleName, *msg) 492 time.Sleep(1 * time.Second) 493 t.Run("ConnectedFalse", func(t *testing.T) { 494 if connected != false { 495 t.Errorf("Connected was not set to false") 496 } 497 }) 498 querySeterMock.EXPECT().All(gomock.Any()).Return(int64(1), errFailedDBOperation).Times(1) 499 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 500 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 501 msg = model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, model.ResourceTypeConfigmap, model.QueryOperation) 502 mainContext.Send(MetaManagerModuleName, *msg) 503 message, _ = mainContext.Receive(ModuleNameEdgeHub) 504 t.Run("ResIDNilDatabaseError", func(t *testing.T) { 505 want := "Error to query meta in DB: " + FailedDBOperation 506 if message.GetContent() != want { 507 t.Errorf("Wrong message receive : Wanted %v and Got %v", want, message.GetContent()) 508 } 509 }) 510 511 //ResID not nil database error 512 querySeterMock.EXPECT().All(gomock.Any()).Return(int64(1), errFailedDBOperation).Times(1) 513 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 514 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 515 msg = model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, "test/test/"+model.ResourceTypeConfigmap, model.QueryOperation) 516 mainContext.Send(MetaManagerModuleName, *msg) 517 message, _ = mainContext.Receive(ModuleNameEdgeHub) 518 t.Run("ResIDNotNilDatabaseError", func(t *testing.T) { 519 want := "Error to query meta in DB: " + FailedDBOperation 520 if message.GetContent() != want { 521 t.Errorf("Wrong message receive : Wanted %v and Got %v", want, message.GetContent()) 522 } 523 }) 524 525 //ResID not nil Success Case 526 querySeterMock.EXPECT().All(gomock.Any()).SetArg(0, *fakeDao).Return(int64(1), nil).Times(1) 527 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 528 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 529 msg = model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, "test/test/"+model.ResourceTypeConfigmap, model.QueryOperation) 530 mainContext.Send(MetaManagerModuleName, *msg) 531 message, _ = mainContext.Receive(ModuleNameEdged) 532 t.Run("DatabaseNoErrorAndMetaFound", func(t *testing.T) { 533 want := make([]string, 1) 534 want[0] = "Test" 535 bytesWant, _ := json.Marshal(want) 536 bytesGot, _ := json.Marshal(message.GetContent()) 537 if string(bytesGot) != string(bytesWant) { 538 t.Errorf("Wrong message receive : Wanted %v and Got %v", want, message.GetContent()) 539 } 540 }) 541 } 542 543 // TestProcessNodeConnection is function to test processNodeConnection 544 func TestProcessNodeConnection(t *testing.T) { 545 mockCtrl := gomock.NewController(t) 546 defer mockCtrl.Finish() 547 ormerMock := beego.NewMockOrmer(mockCtrl) 548 dbm.DBAccess = ormerMock 549 550 //connected true 551 msg := model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, model.ResourceTypePodStatus, OperationNodeConnection).FillBody(connect.CloudConnected) 552 mainContext.Send(MetaManagerModuleName, *msg) 553 //wait for message to be received by metaManager and get processed 554 time.Sleep(1 * time.Second) 555 t.Run("ConnectedTrue", func(t *testing.T) { 556 if connected != true { 557 t.Errorf("Connected was not set to true") 558 } 559 }) 560 561 //connected false 562 msg = model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, model.ResourceTypePodStatus, OperationNodeConnection).FillBody(connect.CloudDisconnected) 563 mainContext.Send(MetaManagerModuleName, *msg) 564 //wait for message to be received by metaManager and get processed 565 time.Sleep(1 * time.Second) 566 t.Run("ConnectedFalse", func(t *testing.T) { 567 if connected != false { 568 t.Errorf("Connected was not set to false") 569 } 570 }) 571 } 572 573 // TestProcessSync is function to test processSync 574 func TestProcessSync(t *testing.T) { 575 mockCtrl := gomock.NewController(t) 576 defer mockCtrl.Finish() 577 ormerMock := beego.NewMockOrmer(mockCtrl) 578 querySeterMock := beego.NewMockQuerySeter(mockCtrl) 579 dbm.DBAccess = ormerMock 580 581 //QueryAllMeta Error 582 querySeterMock.EXPECT().All(gomock.Any()).Return(int64(1), errFailedDBOperation).Times(1) 583 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 584 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 585 msg := model.NewMessage("").BuildRouter(MetaManagerModuleName, GroupResource, model.ResourceTypePodStatus, OperationMetaSync) 586 mainContext.Send(MetaManagerModuleName, *msg) 587 588 //Length 0 589 querySeterMock.EXPECT().All(gomock.Any()).Return(int64(1), nil).Times(1) 590 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 591 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 592 mainContext.Send(MetaManagerModuleName, *msg) 593 594 //QueryMetaError 595 fakeDao := new([]dao.Meta) 596 fakeDaoArray := make([]dao.Meta, 1) 597 fakeDaoArray[0] = dao.Meta{Key: "Test/Test/Test", Value: "Test"} 598 fakeDao = &fakeDaoArray 599 querySeterMock.EXPECT().All(gomock.Any()).SetArg(0, *fakeDao).Return(int64(1), nil).Times(1) 600 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 601 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 602 querySeterMock.EXPECT().All(gomock.Any()).Return(int64(1), errFailedDBOperation).Times(1) 603 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 604 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 605 mainContext.Send(MetaManagerModuleName, *msg) 606 607 //QueryMeta Length 0 608 querySeterMock.EXPECT().All(gomock.Any()).SetArg(0, *fakeDao).Return(int64(1), nil).Times(1) 609 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 610 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 611 querySeterMock.EXPECT().All(gomock.Any()).Return(int64(1), nil).Times(1) 612 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 613 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 614 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 615 querySeterMock.EXPECT().Delete().Return(int64(1), errFailedDBOperation).Times(1) 616 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 617 mainContext.Send(MetaManagerModuleName, *msg) 618 message, _ := mainContext.Receive(ModuleNameEdgeHub) 619 t.Run("QueryMetaLengthZero", func(t *testing.T) { 620 want := make([]interface{}, 0) 621 bytesWant, _ := json.Marshal(want) 622 bytesGot, _ := json.Marshal(message.GetContent()) 623 if string(bytesGot) != string(bytesWant) { 624 t.Errorf("Wrong message receive : Wanted %v and Got %v", want, message.GetContent()) 625 } 626 }) 627 628 //QueryMeta Length > 0 UnMarshalError 629 querySeterMock.EXPECT().All(gomock.Any()).SetArg(0, *fakeDao).Return(int64(1), nil).Times(1) 630 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 631 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 632 querySeterMock.EXPECT().All(gomock.Any()).SetArg(0, *fakeDao).Return(int64(1), nil).Times(1) 633 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 634 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 635 mainContext.Send(MetaManagerModuleName, *msg) 636 message, _ = mainContext.Receive(ModuleNameEdgeHub) 637 t.Run("QueryMetaLengthMoreThanZeroUnmarshalError", func(t *testing.T) { 638 want := make([]interface{}, 0) 639 bytesWant, _ := json.Marshal(want) 640 bytesGot, _ := json.Marshal(message.GetContent()) 641 if string(bytesGot) != string(bytesWant) { 642 t.Errorf("Wrong message receive : Wanted %v and Got %v", want, message.GetContent()) 643 } 644 }) 645 646 //QueryMeta Length > 0 Success Case 647 fakeDaoArray[0] = dao.Meta{Key: "Test/Test/Test", Value: "\"Test\""} 648 querySeterMock.EXPECT().All(gomock.Any()).SetArg(0, *fakeDao).Return(int64(1), nil).Times(1) 649 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 650 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 651 querySeterMock.EXPECT().All(gomock.Any()).SetArg(0, *fakeDao).Return(int64(1), nil).Times(1) 652 querySeterMock.EXPECT().Filter(gomock.Any(), gomock.Any()).Return(querySeterMock).Times(1) 653 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 654 mainContext.Send(MetaManagerModuleName, *msg) 655 message, _ = mainContext.Receive(ModuleNameEdgeHub) 656 t.Run("QueryMetaLengthMoreThanZeroUnmarshalError", func(t *testing.T) { 657 want := make([]interface{}, 1) 658 want[0] = "Test" 659 bytesWant, _ := json.Marshal(want) 660 bytesGot, _ := json.Marshal(message.GetContent()) 661 if string(bytesGot) != string(bytesWant) { 662 t.Errorf("Wrong message receive : Wanted %v and Got %v", want, message.GetContent()) 663 } 664 }) 665 } 666 667 // TestProcessFunctionAction is function to test processFunctionAction 668 func TestProcessFunctionAction(t *testing.T) { 669 mockCtrl := gomock.NewController(t) 670 defer mockCtrl.Finish() 671 ormerMock := beego.NewMockOrmer(mockCtrl) 672 dbm.DBAccess = ormerMock 673 674 //jsonMarshall fail 675 msg := model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, model.ResourceTypePodStatus, OperationFunctionAction).FillBody(make(chan int)) 676 mainContext.Send(MetaManagerModuleName, *msg) 677 message, _ := mainContext.Receive(ModuleNameEdgeHub) 678 t.Run("MarshallFail", func(t *testing.T) { 679 want := MarshalError 680 if message.GetContent() != want { 681 t.Errorf("Wrong Error message received : Wanted %v and Got %v", want, message.GetContent()) 682 } 683 }) 684 685 //Database Save Error 686 ormerMock.EXPECT().Insert(gomock.Any()).Return(int64(1), errFailedDBOperation).Times(1) 687 msg = model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, model.ResourceTypePodStatus, OperationFunctionAction) 688 mainContext.Send(MetaManagerModuleName, *msg) 689 message, _ = mainContext.Receive(ModuleNameEdgeHub) 690 t.Run("DatabaseSaveError", func(t *testing.T) { 691 want := "Error to save meta to DB: " + FailedDBOperation 692 if message.GetContent() != want { 693 t.Errorf("Wrong message received : Wanted %v and Got %v", want, message.GetContent()) 694 } 695 }) 696 697 //Success Case 698 ormerMock.EXPECT().Insert(gomock.Any()).Return(int64(1), nil).Times(1) 699 msg = model.NewMessage("").BuildRouter(ModuleNameEdgeHub, GroupResource, model.ResourceTypePodStatus, OperationFunctionAction) 700 mainContext.Send(MetaManagerModuleName, *msg) 701 message, _ = mainContext.Receive(EdgeFunctionModel) 702 t.Run("SuccessCase", func(t *testing.T) { 703 want := ModuleNameEdgeHub 704 if message.GetSource() != want { 705 t.Errorf("Wrong message received : Wanted from source %v and Got from source %v", want, message.GetSource()) 706 } 707 }) 708 } 709 710 // TestProcessFunctionActionResult is function to test processFunctionActionResult 711 func TestProcessFunctionActionResult(t *testing.T) { 712 mockCtrl := gomock.NewController(t) 713 defer mockCtrl.Finish() 714 ormerMock := beego.NewMockOrmer(mockCtrl) 715 dbm.DBAccess = ormerMock 716 717 //jsonMarshall fail 718 msg := model.NewMessage("").BuildRouter(EdgeFunctionModel, GroupResource, model.ResourceTypePodStatus, OperationFunctionActionResult).FillBody(make(chan int)) 719 mainContext.Send(MetaManagerModuleName, *msg) 720 message, _ := mainContext.Receive(ModuleNameEdgeHub) 721 t.Run("MarshallFail", func(t *testing.T) { 722 want := MarshalError 723 if message.GetContent() != want { 724 t.Errorf("Wrong Error message received : Wanted %v and Got %v", want, message.GetContent()) 725 } 726 }) 727 728 //Database Save Error 729 ormerMock.EXPECT().Insert(gomock.Any()).Return(int64(1), errFailedDBOperation).Times(1) 730 msg = model.NewMessage("").BuildRouter(EdgeFunctionModel, GroupResource, model.ResourceTypePodStatus, OperationFunctionActionResult) 731 mainContext.Send(MetaManagerModuleName, *msg) 732 message, _ = mainContext.Receive(ModuleNameEdgeHub) 733 t.Run("DatabaseSaveError", func(t *testing.T) { 734 want := "Error to save meta to DB: " + FailedDBOperation 735 if message.GetContent() != want { 736 t.Errorf("Wrong message received : Wanted %v and Got %v", want, message.GetContent()) 737 } 738 }) 739 740 //Success Case 741 ormerMock.EXPECT().Insert(gomock.Any()).Return(int64(1), nil).Times(1) 742 msg = model.NewMessage("").BuildRouter(EdgeFunctionModel, GroupResource, model.ResourceTypePodStatus, OperationFunctionActionResult) 743 mainContext.Send(MetaManagerModuleName, *msg) 744 message, _ = mainContext.Receive(ModuleNameEdgeHub) 745 t.Run("SuccessCase", func(t *testing.T) { 746 want := EdgeFunctionModel 747 if message.GetSource() != want { 748 t.Errorf("Wrong message received : Wanted %v and Got %v", want, message.GetSource()) 749 } 750 }) 751 752 // CleanUp after Testing 753 metaMgrModule.Cleanup() 754 } 755 756 */