VOL-2640 Restructure openolt-adapter repo to best practices

Change-Id: Icead31e8ecb82ec75a22e66361fbf83f80136589
diff --git a/cmd/openolt-adapter/main_test.go b/cmd/openolt-adapter/main_test.go
new file mode 100644
index 0000000..bdf9366
--- /dev/null
+++ b/cmd/openolt-adapter/main_test.go
@@ -0,0 +1,234 @@
+/*
+ * 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 main
+
+import (
+	"context"
+	"errors"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
+	"testing"
+
+	"github.com/opencord/voltha-lib-go/v3/pkg/kafka"
+	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	"github.com/opencord/voltha-openolt-adapter/internal/pkg/config"
+	"github.com/opencord/voltha-openolt-adapter/pkg/mocks"
+	ca "github.com/opencord/voltha-protos/v3/go/inter_container"
+	"go.etcd.io/etcd/pkg/mock/mockserver"
+)
+
+func init() {
+	log.SetDefaultLogger(log.JSON, log.DebugLevel, nil)
+}
+
+func newMockAdapter() *adapter {
+	conf := config.NewAdapterFlags()
+	conf.KVStoreType = "etcd"
+	cp := mocks.MockCoreProxy{}
+	ap := mocks.MockAdapterProxy{}
+	ad := newAdapter(conf)
+	ad.coreProxy = &cp
+	ad.adapterProxy = &ap
+	return ad
+}
+func Test_adapter_setKVClient(t *testing.T) {
+	adapt := newMockAdapter()
+	adapt1 := newMockAdapter()
+	adapt1.config.KVStoreType = "consul"
+	adapt2 := newMockAdapter()
+	adapt2.config.KVStoreType = ""
+	a, _ := mockserver.StartMockServers(1)
+	a.StartAt(0)
+	defer a.StopAt(0)
+	tests := []struct {
+		name       string
+		clienttype string
+		adapter    *adapter
+		wantErr    bool
+	}{
+		{"setKVClient", adapt.config.KVStoreType, adapt, false},
+		{"setKVClient", adapt1.config.KVStoreType, adapt1, false},
+		{"setKVClient", adapt2.config.KVStoreType, adapt2, true},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if err := tt.adapter.setKVClient(); (err != nil) != tt.wantErr {
+				t.Errorf("adapter.setKVClient() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func Test_adapter_KVClient(t *testing.T) {
+	adapt := newMockAdapter()
+	a, _ := mockserver.StartMockServers(1)
+	a.StartAt(0)
+	defer a.StopAt(0)
+
+	if err := adapt.setKVClient(); err != nil {
+		t.Errorf("adapter.setKVClient() error = %v", err)
+	}
+}
+
+func Test_registerWithCore(t *testing.T) {
+	ad := newMockAdapter()
+	ctx := context.TODO()
+	err := ad.registerWithCore(ctx, 1)
+	if err != nil {
+		t.Errorf("Expected error:nil, got error: %v", err)
+	}
+}
+func Test_startInterContainerProxy(t *testing.T) {
+	ad := newMockAdapter()
+	kc := &mockKafkaClient{}
+	ad.kafkaClient = kc
+	ctx := context.TODO()
+	icp, err := ad.startInterContainerProxy(ctx, 1)
+	if icp != nil {
+		t.Log("Intercontainer proxy ", icp)
+	}
+	if err != nil {
+		t.Errorf("err %v", err)
+	}
+}
+
+func Test_startOpenOLT(t *testing.T) {
+	a, _ := mockserver.StartMockServers(1)
+	a.StartAt(0)
+	defer a.StopAt(0)
+
+	ad := newMockAdapter()
+	oolt, err := ad.startOpenOLT(context.TODO(), nil,
+		ad.coreProxy, ad.adapterProxy, ad.eventProxy, ad.config)
+	if oolt != nil {
+		t.Log("Open OLT ", oolt)
+	}
+	if err != nil {
+		t.Errorf("err %v", err)
+	}
+}
+
+func Test_newKafkaClient(t *testing.T) {
+	a, _ := mockserver.StartMockServers(1)
+	a.StartAt(0)
+	defer a.StopAt(0)
+	adapter := newMockAdapter()
+	type args struct {
+		clientType string
+		host       string
+		port       int
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		// TODO: Add test cases.
+		{"newKafkaClient", args{clientType: "sarama", host: adapter.config.KafkaAdapterHost, port: adapter.config.KafkaAdapterPort}, false},
+		{"newKafkaClient", args{clientType: "sarama", host: adapter.config.KafkaAdapterHost, port: adapter.config.KafkaAdapterPort}, false},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			_, err := newKafkaClient(tt.args.clientType, tt.args.host, tt.args.port)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("newKafkaClient() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+
+		})
+	}
+}
+
+func Test_adapter_setupRequestHandler(t *testing.T) {
+
+	ad := newMockAdapter()
+
+	kip := kafka.NewInterContainerProxy(
+		kafka.InterContainerHost(ad.config.KafkaAdapterHost),
+		kafka.InterContainerPort(ad.config.KafkaAdapterPort),
+		kafka.MsgClient(&mockKafkaClient{}),
+		kafka.DefaultTopic(&kafka.Topic{Name: ad.config.Topic}))
+
+	ad.kip = kip
+	ad.kip.Start()
+
+	oolt, _ := ad.startOpenOLT(context.TODO(), nil,
+		ad.coreProxy, ad.adapterProxy, ad.eventProxy, ad.config)
+	printBanner()
+	printVersion()
+	ctx := context.TODO()
+	if err := ad.setupRequestHandler(ctx, ad.config.InstanceID, oolt); err != nil {
+		t.Logf("adapter.setupRequestHandler() error = %v", err)
+	}
+
+}
+
+// Kafka client mocker
+type mockKafkaClient struct {
+}
+
+func (kc *mockKafkaClient) Start() error {
+	return nil
+}
+func (kc *mockKafkaClient) Stop() {
+}
+func (kc *mockKafkaClient) CreateTopic(topic *kafka.Topic, numPartition int, repFactor int) error {
+	if topic != nil {
+		return nil
+	}
+	return errors.New("invalid Topic")
+}
+func (kc *mockKafkaClient) DeleteTopic(topic *kafka.Topic) error {
+	if topic != nil {
+		return nil
+	}
+	return errors.New("invalid Topic")
+}
+func (kc *mockKafkaClient) Subscribe(topic *kafka.Topic, kvArgs ...*kafka.KVArg) (<-chan *ca.InterContainerMessage, error) {
+	if topic != nil {
+		ch := make(chan *ca.InterContainerMessage)
+		return ch, nil
+	}
+	return nil, errors.New("invalid Topic")
+}
+func (kc *mockKafkaClient) UnSubscribe(topic *kafka.Topic, ch <-chan *ca.InterContainerMessage) error {
+	if topic == nil {
+		return nil
+	}
+	return errors.New("invalid Topic")
+}
+func (kc *mockKafkaClient) Send(msg interface{}, topic *kafka.Topic, keys ...string) error {
+	if topic != nil {
+		return nil
+	}
+	return errors.New("invalid topic")
+}
+
+func (kc *mockKafkaClient) SendLiveness() error {
+	return status.Error(codes.Unimplemented, "SendLiveness")
+}
+
+func (kc *mockKafkaClient) EnableLivenessChannel(enable bool) chan bool {
+	return nil
+}
+
+func (kc *mockKafkaClient) EnableHealthinessChannel(enable bool) chan bool {
+	return nil
+}
+
+func (kc *mockKafkaClient) SubscribeForMetadata(func(fromTopic string, timestamp int64)) {
+	return
+}