/*
 * 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"
	"github.com/golang/protobuf/ptypes/any"
	"github.com/opencord/voltha/protos/go/bbf_fiber"
	"github.com/opencord/voltha/protos/go/common"
	"github.com/opencord/voltha/protos/go/openflow_13"
	"github.com/opencord/voltha/protos/go/voltha"
	"testing"
)

func Test_Node_01_New(t *testing.T) {
	ports := []*voltha.Port{
		{
			PortNo:     123,
			Label:      "test-etcd_port-0",
			Type:       voltha.Port_PON_OLT,
			AdminState: common.AdminState_ENABLED,
			OperStatus: common.OperStatus_ACTIVE,
			DeviceId:   "etcd_port-0-device-id",
			Peers:      []*voltha.Port_PeerPort{},
		},
	}
	data := &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:               ports,
		Flows:               &openflow_13.Flows{},
		FlowGroups:          &openflow_13.FlowGroups{},
		PmConfigs:           &voltha.PmConfigs{},
		ChannelTerminations: []*bbf_fiber.ChannelterminationConfig{},
		ImageDownloads:      []*voltha.ImageDownload{},
	}
	root := &Root{}
	txid := fmt.Sprintf("%x", md5.Sum([]byte("node_transaction_id")))

	node := NewNode(root, data, true, txid)

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