github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/edge/pkg/devicetwin/devicetwin_test.go (about) 1 package devicetwin 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/golang/mock/gomock" 8 9 "github.com/kubeedge/beehive/pkg/core" 10 beehiveContext "github.com/kubeedge/beehive/pkg/core/context" 11 "github.com/kubeedge/beehive/pkg/core/model" 12 "github.com/kubeedge/kubeedge/edge/mocks/beego" 13 "github.com/kubeedge/kubeedge/edge/mocks/beehive" 14 "github.com/kubeedge/kubeedge/edge/pkg/common/dbm" 15 "github.com/kubeedge/kubeedge/edge/pkg/devicetwin/dtcommon" 16 ) 17 18 const ( 19 //TestModule is name of test. 20 TestModule = "test" 21 //DeviceTwinModuleName is name of twin 22 DeviceTwinModuleName = "twin" 23 ) 24 25 // TestName is function to test Name(). 26 func TestName(t *testing.T) { 27 tests := []struct { 28 name string 29 want string 30 }{ 31 { 32 name: "DeviceTwinNametest", 33 want: "twin", 34 }, 35 } 36 for _, tt := range tests { 37 t.Run(tt.name, func(t *testing.T) { 38 dt := &DeviceTwin{} 39 if got := dt.Name(); got != tt.want { 40 t.Errorf("DeviceTwin.Name() = %v, want %v", got, tt.want) 41 } 42 }) 43 } 44 } 45 46 // TestGroup is function to test Group(). 47 func TestGroup(t *testing.T) { 48 tests := []struct { 49 name string 50 want string 51 }{ 52 { 53 name: "DeviceTwinGroupTest", 54 want: "twin", 55 }, 56 } 57 for _, tt := range tests { 58 t.Run(tt.name, func(t *testing.T) { 59 dt := &DeviceTwin{} 60 if got := dt.Group(); got != tt.want { 61 t.Errorf("DeviceTwin.Group() = %v, want %v", got, tt.want) 62 } 63 }) 64 } 65 } 66 67 // TestStart is function to test Start(). 68 func TestStart(t *testing.T) { 69 beehiveContext.InitContext(beehiveContext.MsgCtxTypeChannel) 70 //test is for sending test messages from devicetwin module. 71 var test model.Message 72 // ormerMock is mocked Ormer implementation. 73 var ormerMock *beego.MockOrmer 74 // querySeterMock is mocked QuerySeter implementation. 75 var querySeterMock *beego.MockQuerySeter 76 // fakeModule is mocked implementation of TestModule. 77 var fakeModule *beehive.MockModule 78 79 const delay = 10 * time.Millisecond 80 const maxRetries = 5 81 retry := 0 82 83 mockCtrl := gomock.NewController(t) 84 defer mockCtrl.Finish() 85 86 ormerMock = beego.NewMockOrmer(mockCtrl) 87 querySeterMock = beego.NewMockQuerySeter(mockCtrl) 88 fakeModule = beehive.NewMockModule(mockCtrl) 89 dbm.DBAccess = ormerMock 90 91 fakeModule.EXPECT().Enable().Return(true).Times(1) 92 fakeModule.EXPECT().Name().Return(TestModule).MaxTimes(5) 93 94 core.Register(fakeModule) 95 beehiveContext.AddModule(TestModule) 96 dt := newDeviceTwin(true) 97 core.Register(dt) 98 beehiveContext.AddModule(dt.Name()) 99 beehiveContext.AddModuleGroup(dt.Name(), dt.Group()) 100 ormerMock.EXPECT().QueryTable(gomock.Any()).Return(querySeterMock).Times(1) 101 querySeterMock.EXPECT().All(gomock.Any()).Return(int64(1), nil).Times(1) 102 go dt.Start() 103 time.Sleep(delay) 104 retry++ 105 // Sending a message from devicetwin module to the created fake module(TestModule) to check context is initialized properly. 106 beehiveContext.Send(TestModule, test) 107 _, err := beehiveContext.Receive(TestModule) 108 if err != nil { 109 t.Errorf("Error while receiving message: %v", err) 110 return 111 } 112 //Checking whether Mem,Twin,Device and Comm modules are registered and started successfully. 113 tests := []struct { 114 name string 115 moduleName string 116 }{ 117 { 118 name: "MemModuleHealthCheck", 119 moduleName: dtcommon.MemModule, 120 }, 121 { 122 name: "TwinModuleHealthCheck", 123 moduleName: dtcommon.TwinModule, 124 }, 125 { 126 name: "DeviceModuleHealthCheck", 127 moduleName: dtcommon.DeviceModule, 128 }, 129 { 130 name: "CommModuleHealthCheck", 131 moduleName: dtcommon.CommModule, 132 }, 133 } 134 for _, test := range tests { 135 t.Run(test.name, func(t *testing.T) { 136 moduleCheck := false 137 for retry < maxRetries { 138 for _, module := range dt.DTModules { 139 if test.moduleName == module.Name { 140 moduleCheck = true 141 err := dt.DTContexts.HeartBeat(test.moduleName, "ping") 142 if err != nil { 143 t.Errorf("Heartbeat of module %v is expired and dtcontroller will start it again", test.moduleName) 144 } 145 break 146 } 147 } 148 if moduleCheck { 149 break 150 } else { 151 time.Sleep(delay) 152 retry++ 153 } 154 } 155 if retry >= maxRetries { 156 t.Errorf("Registration of module %v failed", test.moduleName) 157 } 158 }) 159 } 160 }