Completed the EAPOL State machine
Stopping BBSim in the proper way when OLT-Reboot is received

Change-Id: I142eaa70e329121a5331f1a5706ed864fcf5d993
diff --git a/internal/bbsim/responders/eapol/eapol_test.go b/internal/bbsim/responders/eapol/eapol_test.go
new file mode 100644
index 0000000..2d8a06c
--- /dev/null
+++ b/internal/bbsim/responders/eapol/eapol_test.go
@@ -0,0 +1,117 @@
+/*
+ * 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 eapol
+
+import (
+	bbsim "github.com/opencord/bbsim/internal/bbsim/types"
+	"github.com/looplab/fsm"
+	"github.com/opencord/voltha-protos/go/openolt"
+	"google.golang.org/grpc"
+	"gotest.tools/assert"
+	"os"
+	"sync"
+	"testing"
+	"time"
+)
+
+var (
+	originalSendEapStart func(onuId uint32, ponPortId uint32, serialNumber *openolt.SerialNumber, stream openolt.Openolt_EnableIndicationServer) error
+)
+
+type fakeStream struct {
+	calledSend int
+	grpc.ServerStream
+}
+
+func (s fakeStream) Send(flow *openolt.Indication) error {
+	s.calledSend++
+	return nil
+}
+
+func setUp()  {
+	originalSendEapStart = sendEapStart
+}
+
+
+func tearDown()  {
+	sendEapStart = originalSendEapStart
+}
+
+func TestMain(m *testing.M) {
+	setUp()
+	code := m.Run()
+	tearDown()
+	os.Exit(code)
+}
+
+func TestCreateWPASupplicant(t *testing.T) {
+
+	// mocks
+	mockSendEapStartCalled := 0
+	mockSendEapStartArgs := struct {
+		onuId uint32
+		ponPortId uint32
+		serialNumber *openolt.SerialNumber
+		stream openolt.Openolt_EnableIndicationServer
+	}{}
+	mockSendEapStart := func(onuId uint32, ponPortId uint32, serialNumber *openolt.SerialNumber, stream openolt.Openolt_EnableIndicationServer) error {
+		mockSendEapStartCalled++
+		mockSendEapStartArgs.onuId = onuId
+		mockSendEapStartArgs.ponPortId = ponPortId
+		return nil
+	}
+	sendEapStart = mockSendEapStart
+
+	// params for the function under test
+	var onuId uint32 = 1
+	var ponPortId uint32 = 0
+	var serialNumber = new(openolt.SerialNumber)
+
+	serialNumber.VendorId = []byte("BBSM")
+	serialNumber.VendorSpecific = []byte{0, byte(0 % 256), byte(ponPortId), byte(onuId)}
+
+	eapolStateMachine := fsm.NewFSM(
+	"auth_started",
+	fsm.Events{
+		{Name: "eap_start_sent", Src: []string{"auth_started"}, Dst: "eap_start_sent"},
+		{Name: "eap_resonse_identity_sent", Src: []string{"eap_start_sent"}, Dst: "eap_resonse_identity_sent"},
+		{Name: "eap_resonse_challenge_sent", Src: []string{"eap_resonse_identity_sent"}, Dst: "eap_resonse_challenge_sent"},
+		{Name: "eap_resonse_success_received", Src: []string{"eap_resonse_challenge_sent"}, Dst: "eap_resonse_success_received"},
+	},
+	fsm.Callbacks{},
+	)
+
+	pktOutCh := make(chan *bbsim.ByteMsg, 1024)
+
+	stream := fakeStream{}
+
+	wg := sync.WaitGroup{}
+	wg.Add(1)
+
+	go CreateWPASupplicant(onuId, ponPortId, serialNumber, eapolStateMachine, stream, pktOutCh)
+	go func(){
+		time.Sleep(1 * time.Second)
+		close(pktOutCh)
+		wg.Done()
+	}()
+
+	wg.Wait()
+
+	assert.Equal(t, mockSendEapStartCalled, 1)
+	assert.Equal(t, mockSendEapStartArgs.onuId, onuId)
+	assert.Equal(t, mockSendEapStartArgs.ponPortId, ponPortId)
+}
\ No newline at end of file