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  }