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