RICPLT-2910

libe2ap library updated and moved to 3rdparty directory
e2ap_wrapper library to be used from go:
 - message wrappers (used now only in tests)
 - function wrappers that manipulates message
Go wrappers for messages
Initial unittest implementation.

Change-Id: Ie77cc2ae90b83b12e5c738e6f570fe4661961da6
Signed-off-by: Juha Hyttinen <juha.hyttinen@nokia.com>
diff --git a/pkg/control/main_test.go b/pkg/control/main_test.go
new file mode 100644
index 0000000..3f1284c
--- /dev/null
+++ b/pkg/control/main_test.go
@@ -0,0 +1,237 @@
+/*
+==================================================================================
+  Copyright (c) 2019 AT&T Intellectual Property.
+  Copyright (c) 2019 Nokia
+
+   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 control
+
+import (
+	"errors"
+	"fmt"
+	"gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
+	"io/ioutil"
+	"os"
+	"testing"
+	"time"
+)
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+type testingControl struct {
+	desc     string
+	syncChan chan struct{}
+}
+
+func (tc *testingControl) ReadyCB(data interface{}) {
+	xapp.Logger.Info("testingControl(%s) ReadyCB", tc.desc)
+	tc.syncChan <- struct{}{}
+	return
+}
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+type testingRmrControl struct {
+	testingControl
+	rmrClientTest *xapp.RMRClient
+	rmrConChan    chan *xapp.RMRParams
+}
+
+func (tc *testingRmrControl) Consume(msg *xapp.RMRParams) (err error) {
+	xapp.Logger.Info("testingRmrControl(%s) Consume", tc.desc)
+	tc.rmrConChan <- msg
+	return
+}
+
+func (tc *testingRmrControl) RmrSend(params *xapp.RMRParams) (err error) {
+	//
+	//NOTE: Do this way until xapp-frame sending is improved
+	//
+	status := false
+	i := 1
+	for ; i <= 10 && status == false; i++ {
+		status = tc.rmrClientTest.SendMsg(params)
+		if status == false {
+			xapp.Logger.Info("rmr.Send() failed. Retry count %v, Mtype: %v, SubId: %v, Xid %s", i, params.Mtype, params.SubId, params.Xid)
+			time.Sleep(500 * time.Millisecond)
+		}
+	}
+	if status == false {
+		err = errors.New("rmr.Send() failed")
+		tc.rmrClientTest.Free(params.Mbuf)
+	}
+	return
+}
+
+func createNewRmrControl(desc string, rtfile string, port string, stat string) *testingRmrControl {
+	os.Setenv("RMR_SEED_RT", rtfile)
+	os.Setenv("RMR_SRC_ID", "localhost:"+port)
+	xapp.Logger.Info("Using rt file %s", os.Getenv("RMR_SEED_RT"))
+	xapp.Logger.Info("Using src id  %s", os.Getenv("RMR_SRC_ID"))
+	newConn := &testingRmrControl{}
+	newConn.desc = desc
+	newConn.syncChan = make(chan struct{})
+	newConn.rmrClientTest = xapp.NewRMRClientWithParams("tcp:"+port, 4096, 1, stat)
+	newConn.rmrConChan = make(chan *xapp.RMRParams)
+	newConn.rmrClientTest.SetReadyCB(newConn.ReadyCB, nil)
+	go newConn.rmrClientTest.Start(newConn)
+	<-newConn.syncChan
+	return newConn
+}
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+
+func testError(t *testing.T, pattern string, args ...interface{}) {
+	xapp.Logger.Error(fmt.Sprintf(pattern, args...))
+	t.Errorf(fmt.Sprintf(pattern, args...))
+}
+
+func testCreateTmpFile(str string) (string, error) {
+	file, err := ioutil.TempFile("/tmp", "*.rt")
+	if err != nil {
+		return "", err
+	}
+	_, err = file.WriteString(str)
+	if err != nil {
+		file.Close()
+		return "", err
+	}
+	return file.Name(), nil
+}
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+
+var xappConn *testingRmrControl
+var e2termConn *testingRmrControl
+
+func TestMain(m *testing.M) {
+	xapp.Logger.Info("TestMain start")
+
+	//
+	//Cfg creation won't work like this as xapp-frame reads it during init.
+	//
+	/*
+	     cfgstr:=`{
+	       "local": {
+	           "host": ":8080"
+	       },
+	       "logger": {
+	           "level": 4
+	       },
+	       "rmr": {
+	          "protPort": "tcp:14560",
+	          "maxSize": 4096,
+	          "numWorkers": 1,
+	          "txMessages": ["RIC_SUB_REQ", "RIC_SUB_DEL_REQ"],
+	          "rxMessages": ["RIC_SUB_RESP", "RIC_SUB_FAILURE", "RIC_SUB_DEL_RESP", "RIC_SUB_DEL_FAILURE", "RIC_INDICATION"]
+	       },
+	       "db": {
+	           "host": "localhost",
+	           "port": 6379,
+	           "namespaces": ["sdl", "rnib"]
+	       }
+	   }`
+
+	     cfgfilename,_ := testCreateTmpFile(cfgstr)
+	     defer os.Remove(cfgfilename)
+	     os.Setenv("CFG_FILE", cfgfilename)
+	*/
+	xapp.Logger.Info("Using cfg file %s", os.Getenv("CFG_FILE"))
+
+	//---------------------------------
+	//
+	//---------------------------------
+	xapp.Logger.Info("### submgr main run ###")
+
+	subsrt := `newrt|start
+mse|12010|-1|localhost:14560
+mse|12010,localhost:14560|-1|localhost:15560
+mse|12011,localhost:15560|-1|localhost:14560
+mse|12011|-1|localhost:13560
+mse|12012,localhost:15560|-1|localhost:14560
+mse|12012|-1|localhost:13560
+mse|12020|-1|localhost:14560
+mse|12020,localhost:14560|-1|localhost:15560
+mse|12021,localhost:15560|-1|localhost:14560
+mse|12021|-1|localhost:13560
+mse|12022,localhost:15560|-1|localhost:14560
+mse|12022|-1|localhost:13560
+newrt|end
+`
+
+	subrtfilename, _ := testCreateTmpFile(subsrt)
+	defer os.Remove(subrtfilename)
+	os.Setenv("RMR_SEED_RT", subrtfilename)
+	xapp.Logger.Info("Using rt file %s", os.Getenv("RMR_SEED_RT"))
+
+	mainCtrl := &testingControl{}
+	mainCtrl.desc = "main"
+	mainCtrl.syncChan = make(chan struct{})
+
+	os.Setenv("RMR_SRC_ID", "localhost:14560")
+	c := NewControl()
+	c.skipRouteUpdate = true
+	xapp.SetReadyCB(mainCtrl.ReadyCB, nil)
+	go xapp.RunWithParams(c, false)
+	<-mainCtrl.syncChan
+
+	//---------------------------------
+	//
+	//---------------------------------
+	xapp.Logger.Info("### xapp rmr run ###")
+
+	xapprt := `newrt|start
+mse|12010|-1|localhost:14560
+mse|12011|-1|localhost:13560
+mse|12012|-1|localhost:13560
+mse|12020|-1|localhost:14560
+mse|12021|-1|localhost:13560
+mse|12022|-1|localhost:13560
+newrt|end
+`
+
+	xapprtfilename, _ := testCreateTmpFile(xapprt)
+	defer os.Remove(xapprtfilename)
+	xappConn = createNewRmrControl("xappConn", xapprtfilename, "13560", "RMRXAPPSTUB")
+
+	//---------------------------------
+	//
+	//---------------------------------
+	xapp.Logger.Info("### e2term rmr run ###")
+
+	e2termrt := `newrt|start
+mse|12010|-1|localhost:15560
+mse|12011|-1|localhost:14560
+mse|12012|-1|localhost:14560
+mse|12020|-1|localhost:15560
+mse|12021|-1|localhost:14560
+mse|12022|-1|localhost:14560
+newrt|end
+`
+
+	e2termrtfilename, _ := testCreateTmpFile(e2termrt)
+	defer os.Remove(e2termrtfilename)
+	e2termConn = createNewRmrControl("e2termConn", e2termrtfilename, "15560", "RMRE2TERMSTUB")
+
+	code := m.Run()
+	os.Exit(code)
+}