/*
 * Copyright 2018-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 model

import (
	"crypto/md5"
	"fmt"
	"reflect"
	"testing"

	"github.com/golang/protobuf/ptypes/any"
	"github.com/opencord/voltha-protos/v3/go/common"
	"github.com/opencord/voltha-protos/v3/go/openflow_13"
	"github.com/opencord/voltha-protos/v3/go/voltha"
)

var (
	TestNodeDevice = &voltha.Device{
		Id:              "Config-SomeNode-01-new-test",
		Type:            "simulated_olt",
		Root:            true,
		ParentId:        "",
		ParentPortNo:    0,
		Vendor:          "voltha-test",
		Model:           "GetLatest-voltha-simulated-olt",
		HardwareVersion: "1.0.0",
		FirmwareVersion: "1.0.0",
		Images:          &voltha.Images{},
		SerialNumber:    "abcdef-123456",
		VendorId:        "DEADBEEF-INC",
		Adapter:         "simulated_olt",
		Vlan:            1234,
		Address:         &voltha.Device_HostAndPort{HostAndPort: "1.2.3.4:5555"},
		ExtraArgs:       "",
		ProxyAddress:    &voltha.Device_ProxyAddress{},
		AdminState:      voltha.AdminState_PREPROVISIONED,
		OperStatus:      common.OperStatus_ACTIVE,
		Reason:          "",
		ConnectStatus:   common.ConnectStatus_REACHABLE,
		Custom:          &any.Any{},
		Ports:           TestNodePort,
		Flows:           &openflow_13.Flows{},
		FlowGroups:      &openflow_13.FlowGroups{},
		PmConfigs:       &voltha.PmConfigs{},
		ImageDownloads:  []*voltha.ImageDownload{},
	}

	TestNodeTxid = fmt.Sprintf("%x", md5.Sum([]byte("node_transaction_id")))
	TestNodeRoot = &root{RevisionClass: reflect.TypeOf(NonPersistedRevision{})}
)

// Exercise node creation code
// This test will
func TestNode_01_NewNode(t *testing.T) {
	node := newNode(TestNodeRoot, TestNodeDevice, false, TestNodeTxid)

	if reflect.ValueOf(node.Type).Type() != reflect.TypeOf(TestNodeDevice) {
		t.Errorf("Node type does not match original data type: %+v", reflect.ValueOf(node.Type).Type())
	} else if node.GetBranch(TestNodeTxid) == nil || node.GetBranch(TestNodeTxid).Latest == nil {
		t.Errorf("No branch associated to txid: %s", TestNodeTxid)
	} else if node.GetBranch(TestNodeTxid).Latest == nil {
		t.Errorf("Branch has no latest revision : %s", TestNodeTxid)
	} else if node.GetBranch(TestNodeTxid).GetLatest().GetConfig() == nil {
		t.Errorf("Latest revision has no assigned data: %+v", node.GetBranch(TestNodeTxid).GetLatest())
	}

	t.Logf("Created new node successfully : %+v\n", node)
}
