Commit VOL-4124. Testcases for device package.

Change-Id: I2fe37621e373f57d9f90da14a0bf0600b8328362
diff --git a/pkg/models/device/db_test.go b/pkg/models/device/db_test.go
new file mode 100644
index 0000000..b59d08b
--- /dev/null
+++ b/pkg/models/device/db_test.go
@@ -0,0 +1,382 @@
+/*
+ * Copyright 2020-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Package modifiablecomponent stores ModifiableComponent methods and functions
+package device
+
+import (
+	"context"
+	"fmt"
+	"strings"
+	"testing"
+
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
+	"github.com/opencord/device-management-interface/go/dmi"
+	"github.com/opencord/opendevice-manager/pkg/db"
+)
+
+// mockModifiableComp refers to mocking of modifiable component req
+func mockModifiableComp(id string) *dmi.ModifiableComponent {
+	req := new(dmi.ModifiableComponent)
+	req.Name = "olt-name-" + id
+	req.Alias = "olt-1-alias-" + id
+	req.AssetId = "olt-1-assetid-" + id
+	req.Uri = new(dmi.Uri)
+	req.Uri.Uri = "127.0.0." + id
+	req.Parent = new(dmi.Component)
+	req.AdminState = dmi.ComponentAdminState_COMP_ADMIN_STATE_UNLOCKED
+	return req
+}
+
+func mockHardware(id string) *dmi.Hardware {
+	hw := new(dmi.Hardware)
+	hw.LastChange = new(timestamp.Timestamp)
+	hw.LastBooted = new(timestamp.Timestamp)
+	hw.Root = new(dmi.Component)
+	hw.Root.ModelName = "model-name-" + id
+	return hw
+}
+
+func runTcase(tcaseName string, t *testing.T, tcaseFunc func() (bool, error)) (string, bool) {
+	fmt.Println("\n#======= TESTCASE STARTED : " + tcaseName + " ========#")
+	if ok, err := tcaseFunc(); !ok {
+		fmt.Println("#======= TESTCASE FAILED : "+tcaseName+"  ========#", err)
+		return tcaseName, false
+	}
+	fmt.Println("#======= TESTCASE PASSED : " + tcaseName + " ========#")
+	return tcaseName, true
+}
+
+// _Test_PositiveTcaseNewDeviceRecord refers to the positive tcase defined for testing func NewDeviceRecord
+func Test_PositiveTcaseNewDeviceRecord(t *testing.T) {
+	req := mockModifiableComp("1")
+	var rec *DeviceRecord
+
+	db.MockKVClient()
+	ctx := context.Background()
+	defer db.ClearCache()
+
+	// Positive Testcase for NewDeviceRecord
+	tcase1 := func() (bool, error) {
+		var err error
+		if rec, err = NewDeviceRecord(ctx, req); rec == nil || err != nil {
+			return false, err
+		}
+		return true, nil
+	}
+
+	if name, ok := runTcase("Positive Testcase for NewDeviceRecord-1", t, tcase1); !ok {
+		t.Errorf("#======= FAILED :  Testcase " + name + "  ========#")
+		return
+	}
+}
+
+// _Test_NegativeTcaseDBGetByName refers to the negative tcase defined for testing func DBGetByName
+func Test_NegativeTcaseDBGetByName(t *testing.T) {
+	req := mockModifiableComp("1")
+
+	db.MockKVClient()
+	ctx := context.Background()
+	defer db.ClearCache()
+
+	// Negative Testcase for DBGetByName
+	tcase2 := func() (bool, error) {
+		if rec, err := DBGetByName(ctx, req.Name); rec != nil {
+			return false, err
+		}
+		return true, nil
+	}
+
+	if name, ok := runTcase("Negative Testcase for DBGetByName-1", t, tcase2); !ok {
+		t.Errorf("#======= FAILED :  Testcase " + name + "  ========#")
+		return
+	}
+}
+
+// _Test_Suite refers to all component testcases belongs to all packages
+func Test_Suite(t *testing.T) {
+}
+
+// _Test_NegativeTcaseDBAddByName refers to the negative tcase defined for testing func DBAddByName
+func Test_NegativeTcaseDBAddByName(t *testing.T) {
+
+	db.MockKVClient()
+	ctx := context.Background()
+	defer db.ClearCache()
+
+	// Negative Testcase for DBAddByName
+	tcase3 := func() (bool, error) {
+		emptyDevRec := new(DeviceRecord)
+		if err := emptyDevRec.DBAddByName(ctx); err == nil {
+			return false, err
+		}
+		return true, nil
+	}
+
+	if name, ok := runTcase("Negative Testcase for DBAddByName-1", t, tcase3); !ok {
+		t.Errorf("#======= FAILED :  Testcase " + name + "  ========#")
+		return
+	}
+
+}
+
+// _Test_PositiveTcaseDBAddByName refers to the positive tcase defined for testing func DBAddByName
+func Test_PositiveTcaseDBAddByName(t *testing.T) {
+	req := mockModifiableComp("1")
+	var rec *DeviceRecord
+	db.MockKVClient()
+	ctx := context.Background()
+	defer db.ClearCache()
+
+	// Positive Testcase for DBAddByName
+	tcase4 := func() (bool, error) {
+		var err error
+		if rec, err = NewDeviceRecord(ctx, req); rec == nil || err != nil {
+			return false, err
+		}
+		if err = rec.DBAddByName(ctx); err != nil {
+			return false, err
+		}
+		return true, nil
+	}
+
+	if name, ok := runTcase("Positive Testcase for DBAddByName-1", t, tcase4); !ok {
+		t.Errorf("#======= FAILED :  Testcase " + name + "  ========#")
+		return
+	}
+
+}
+
+// _Test_PositiveTcaseDBGetByName refers to the positive tcase defined for testing func DBGetByName
+func Test_PositiveTcaseDBGetByName(t *testing.T) {
+	req := mockModifiableComp("1")
+	var rec *DeviceRecord
+	db.MockKVClient()
+	ctx := context.Background()
+	defer db.ClearCache()
+
+	// Positive Testcase for DBGetByName
+	tcase5 := func() (bool, error) {
+		var err error
+		if rec, err = NewDeviceRecord(ctx, req); rec == nil || err != nil {
+			return false, err
+		}
+		if err = rec.DBAddByName(ctx); err != nil {
+			return false, err
+		}
+		if rec, err := DBGetByName(ctx, rec.Name); rec == nil || err != nil {
+			return false, err
+		}
+		return true, nil
+	}
+
+	if name, ok := runTcase("Positive Testcase for DBGetByName-1", t, tcase5); !ok {
+		t.Errorf("#======= FAILED :  Testcase " + name + "  ========#")
+		return
+	}
+
+}
+
+// _Test_PositiveTcaseDBGetByNameWithCacheMiss refers to the positive tcase defined for testing func DBGetByName with cache miss
+func Test_PositiveTcaseDBGetByNameWithCacheMiss(t *testing.T) {
+	req := mockModifiableComp("1")
+	var rec *DeviceRecord
+	db.MockKVClient()
+	ctx := context.Background()
+	defer db.ClearCache()
+
+	// Positive Testcase for DBGetByName with cache miss
+	tcase5 := func() (bool, error) {
+		var err error
+		if rec, err = NewDeviceRecord(ctx, req); rec == nil || err != nil {
+			return false, err
+		}
+		if err = rec.DBAddByName(ctx); err != nil {
+			return false, err
+		}
+		if rec, err := DBGetByName(ctx, rec.Name); rec == nil || err != nil {
+			return false, err
+		}
+		ClearCacheEntry(ctx, rec.Name, "")
+		if rec, err := DBGetByName(ctx, rec.Name); rec == nil || err != nil {
+			return false, err
+		}
+		return true, nil
+	}
+
+	if name, ok := runTcase("Positive Testcase for DBGetByName-2 with cache miss", t, tcase5); !ok {
+		t.Errorf("#======= FAILED :  Testcase " + name + "  ========#")
+		return
+	}
+
+}
+
+// _Test_PositiveTcaseDBAddUuidLookup refers to the positive tcase defined for testing func DBAddUuidLookup
+func Test_PositiveTcaseDBAddUuidLookup(t *testing.T) {
+	req := mockModifiableComp("1")
+	var rec *DeviceRecord
+	db.MockKVClient()
+	ctx := context.Background()
+	defer db.ClearCache()
+
+	// Positive Testcase for DBAddUuidLookup
+	tcase6 := func() (bool, error) {
+		var err error
+		if rec, err = NewDeviceRecord(ctx, req); rec == nil || err != nil {
+			return false, err
+		}
+		if err = rec.DBAddByName(ctx); err != nil {
+			return false, err
+		}
+		rec.Uuid = strings.Replace(rec.Name, "name", "uuid", 1)
+		if err := rec.DBAddUuidLookup(ctx); err != nil {
+			return false, err
+		}
+		if err := rec.DBAddByName(ctx); err != nil {
+			return false, err
+		}
+		if rec, err := DBGetByName(ctx, rec.Name); rec == nil || err != nil || rec.Uuid == "" {
+			return false, err
+		}
+		return true, nil
+	}
+
+	if name, ok := runTcase("Positive Testcase for DBAddUuidLookup-1", t, tcase6); !ok {
+		t.Errorf("#======= FAILED :  Testcase " + name + "  ========#")
+		return
+	}
+
+}
+
+// _Test_PositiveTcaseDBGetAll refers to the positive tcase defined for testing func DBGetAll
+func Test_PositiveTcaseDBGetAll(t *testing.T) {
+	req := mockModifiableComp("1")
+	var rec *DeviceRecord
+	db.MockKVClient()
+	ctx := context.Background()
+	defer db.ClearCache()
+
+	// Positive Testcase for DBGetAll
+	tcase8 := func() (bool, error) {
+		var err error
+		if rec, err = NewDeviceRecord(ctx, req); rec == nil || err != nil {
+			return false, err
+		}
+		if err = rec.DBAddByName(ctx); err != nil {
+			return false, err
+		}
+		if list, err := DBGetAll(ctx); list == nil || err != nil || len(list) != 1 {
+			return false, err
+		}
+		return true, nil
+	}
+
+	if name, ok := runTcase("Positive Testcase for DBGetAll-1", t, tcase8); !ok {
+		t.Errorf("#======= FAILED :  Testcase " + name + "  ========#")
+		return
+	}
+
+}
+
+// _Test_NegativeTcaseDBGetByUuid refers to the negative tcase defined for testing func DBGetByUuid
+func Test_NegativeTcaseDBGetByUuid(t *testing.T) {
+
+	db.MockKVClient()
+	ctx := context.Background()
+	defer db.ClearCache()
+
+	// Negative Testcase for DBGetByUuid
+	tcase10 := func() (bool, error) {
+		if rec, err := DBGetByUuid(ctx, "invalid-uuid-1"); rec != nil || err == nil {
+			return false, err
+		}
+		return true, nil
+	}
+
+	if name, ok := runTcase("Negative Testcase for DBGetByUuid-1", t, tcase10); !ok {
+		t.Errorf("#======= FAILED :  Testcase " + name + "  ========#")
+		return
+	}
+
+}
+
+// _Test_PositiveTcaseDBDelRecord refers to the positive tcase defined for testing func DBDelRecord
+func Test_PositiveTcaseDBDelRecord(t *testing.T) {
+	req := mockModifiableComp("1")
+	var rec *DeviceRecord
+	db.MockKVClient()
+	ctx := context.Background()
+	defer db.ClearCache()
+
+	// Positive Testcase for DBDelRecord
+	tcase11 := func() (bool, error) {
+		var err error
+		if rec, err = NewDeviceRecord(ctx, req); rec == nil || err != nil {
+			return false, err
+		}
+		if err = rec.DBAddByName(ctx); err != nil {
+			return false, err
+		}
+		if err := rec.DBDelRecord(ctx); err != nil {
+			return false, err
+		}
+		return true, nil
+	}
+
+	if name, ok := runTcase("Positive Testcase for DBDelRecord-1", t, tcase11); !ok {
+		t.Errorf("#======= FAILED :  Testcase " + name + "  ========#")
+		return
+	}
+
+}
+
+// _Test_PositiveTcaseDBSaveHwInfo refers to the positive tcase defined for testing func DBSaveHwInfo
+func Test_PositiveTcaseDBSaveHwInfo(t *testing.T) {
+	req := mockModifiableComp("1")
+	var rec *DeviceRecord
+	db.MockKVClient()
+	ctx := context.Background()
+	defer db.ClearCache()
+
+	// Positive Testcase for DBSaveHwInfo
+	tcase := func() (bool, error) {
+		var err error
+		if rec, err = NewDeviceRecord(ctx, req); rec == nil || err != nil {
+			return false, err
+		}
+		if err = rec.DBAddByName(ctx); err != nil {
+			return false, err
+		}
+		rec.Uuid = strings.Replace(rec.Name, "name", "uuid", 1)
+		if err := rec.DBAddUuidLookup(ctx); err != nil {
+			return false, err
+		}
+		hwInfo := mockHardware("1")
+		if err := rec.DBSaveHwInfo(ctx, hwInfo); rec == nil || err != nil {
+			return false, err
+		}
+		if rec, err := DBGetByName(ctx, rec.Name); rec == nil || err != nil || rec.ModelName != hwInfo.Root.ModelName {
+			return false, err
+		}
+		return true, nil
+	}
+
+	if name, ok := runTcase("Positive Testcase for DBSaveHwInfo-1", t, tcase); !ok {
+		t.Errorf("#======= FAILED :  Testcase " + name + "  ========#")
+		return
+	}
+
+}