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