From 6123ef0c7f63867a18a98551cdb75b366386cec9 Mon Sep 17 00:00:00 2001 From: Tim Groeneveld Date: Sat, 11 Jan 2020 13:45:40 +1100 Subject: [PATCH 1/6] [Cosmetic] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c706a9d..d7c4f9e 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Go 1.4 Ready](https://img.shields.io/badge/Go%201.4-Ready-green.svg?style=flat)]() [![Go 1.5 Ready](https://img.shields.io/badge/Go%201.5-Ready-green.svg?style=flat)]() -##FreeSWITCH Event Socket Library Wrapper for Go +## FreeSWITCH Event Socket Library Wrapper for Go GoESL is a small wrapper around [FreeSWITCH](https://freeswitch.org/) [Event Socket Library](https://wiki.freeswitch.org/wiki/Event_Socket_Library) written in [Go](http://golang.org). From 9c2227efff50abd2c72a0dff5634f3dd0675b625 Mon Sep 17 00:00:00 2001 From: Tim Groeneveld Date: Sat, 11 Jan 2020 13:46:37 +1100 Subject: [PATCH 2/6] [Functionality] Allow calling NewMessage externally --- message.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/message.go b/message.go index 1233bd4..a6eec36 100644 --- a/message.go +++ b/message.go @@ -215,3 +215,7 @@ func newMessage(r *bufio.Reader, autoParse bool) (*Message, error) { return &msg, nil } + +func NewMessage(r *bufio.Reader, autoParse bool) (*Message, error) { + return newMessage(r, autoParse) +} From f26fe42c92d03f3c0cc8d2541f65a0d441b79062 Mon Sep 17 00:00:00 2001 From: Tim Groeneveld Date: Sat, 11 Jan 2020 13:47:08 +1100 Subject: [PATCH 3/6] [Functionality] don't be so verbose when logging --- logger.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/logger.go b/logger.go index 345607a..b5e3113 100644 --- a/logger.go +++ b/logger.go @@ -21,10 +21,14 @@ var ( format = logging.MustStringFormatter( "%{color}%{time:15:04:05.000} %{shortfunc} ▶ %{level:.8s}%{color:reset} %{message}", ) + + ShouldOutputDebugMessages = true ) func Debug(message string, args ...interface{}) { - log.Debugf(message, args...) + if ShouldOutputDebugMessages { + log.Debugf(message, args...) + } } func Error(message string, args ...interface{}) { @@ -43,6 +47,10 @@ func Warning(message string, args ...interface{}) { log.Warningf(message, args...) } +func SetLogger(backendLogger logging.Backend) { + logging.SetBackend(backendLogger) +} + func init() { backend := logging.NewLogBackend(os.Stderr, "", 0) formatter := logging.NewBackendFormatter(backend, format) From 7b6b0d72da1787d0cf617a2d818ceae292a6370d Mon Sep 17 00:00:00 2001 From: Tim Groeneveld Date: Sat, 11 Jan 2020 13:47:34 +1100 Subject: [PATCH 4/6] [Unittest] Test NewMessage once --- message_test.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 message_test.go diff --git a/message_test.go b/message_test.go new file mode 100644 index 0000000..2ccd226 --- /dev/null +++ b/message_test.go @@ -0,0 +1,31 @@ +package goesl + +import ( + "bufio" + "testing" + "strings" +) + +// build a bufio reader so we can mock esl's network reader +func reader(s string) *bufio.Reader { + return bufio.NewReader(strings.NewReader(s)) +} + +func TestNewMessage(t *testing.T) { + ShouldOutputDebugMessages = false + var HeartbeatMessage = `Content-Length: 921 +Content-Type: text/event-json + +{"Event-Name":"HEARTBEAT","Core-UUID":"3fe1c014-0cd7-4fd8-8cfe-f97560455ddd","FreeSWITCH-Hostname":"freeswitch01","FreeSWITCH-Switchname":"freeswitch01","FreeSWITCH-IPv4":"192.168.0.1","FreeSWITCH-IPv6":"::1","Event-Date-Local":"2020-01-01 12:00:00","Event-Date-GMT":"Mon, 1 Jan 2020 12:00:00 GMT","Event-Date-Timestamp":"1578709922493848","Event-Calling-File":"switch_core.c","Event-Calling-Function":"send_heartbeat","Event-Calling-Line-Number":"74","Event-Sequence":"1759233","Event-Info":"System Ready","Up-Time":"0 years, 46 days, 1 hour, 43 minutes, 0 seconds, 121 milliseconds, 552 microseconds","FreeSWITCH-Version":"1.10~64bit","Uptime-msec":"3980580121","Session-Count":"0","Max-Sessions":"10000","Session-Per-Sec":"500","Session-Per-Sec-Last":"1","Session-Per-Sec-Max":"42","Session-Per-Sec-FiveMin":"1","Session-Since-Startup":"14960","Session-Peak-Max":"42","Session-Peak-FiveMin":"1","Idle-CPU":"96.733333"}` + + buf := reader(HeartbeatMessage) + fsMsg, err := NewMessage(buf, true) + + if err != nil { + t.Error(err) + } + + if fsMsg.Headers["FreeSWITCH-IPv4"] != "192.168.0.1" { + t.Error("ould not parse FreeSWITCH ip from event") + } +} From 82c040f74fcf2aa2e0b2e38e5f1797376e15c24e Mon Sep 17 00:00:00 2001 From: Tim Groeneveld Date: Sat, 11 Jan 2020 14:21:11 +1100 Subject: [PATCH 5/6] Increase code coverage to 58% for message.go --- message_test.go | 107 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 104 insertions(+), 3 deletions(-) diff --git a/message_test.go b/message_test.go index 2ccd226..dde2f7c 100644 --- a/message_test.go +++ b/message_test.go @@ -11,13 +11,54 @@ func reader(s string) *bufio.Reader { return bufio.NewReader(strings.NewReader(s)) } -func TestNewMessage(t *testing.T) { +func init () { ShouldOutputDebugMessages = false - var HeartbeatMessage = `Content-Length: 921 +} + +var ( + // https://freeswitch.org/confluence/display/FREESWITCH/Event+List + ShutdownMessage = `Content-Length: 436 +Content-Type: text/event-plain + +Event-Info: System Shutting Down +Event-Name: SHUTDOWN +Core-UUID: 596ab2fd-14c5-44b5-a02b-93ffb7cd5dd6 +FreeSWITCH-Hostname: ******** +FreeSWITCH-IPv4: ******** +FreeSWITCH-IPv6: 127.0.0.1 +Event-Date-Local: 2008-01-23 13:48:13 +Event-Date-GMT: Wed,%2023%20Jan%202008%2018%3A48%3A13%20GMT +Event-Date-timestamp: 1201114093012795 +Event-Calling-File: switch_core.c +Event-Calling-Function: switch_core_destroy +Event-Calling-Line-Number: 1046 + +EOF +` + EchoResponse = `Content-Type: api/response +Content-Length: 2 + +hi` + + HeartbeatMessage = `Content-Length: 921 Content-Type: text/event-json {"Event-Name":"HEARTBEAT","Core-UUID":"3fe1c014-0cd7-4fd8-8cfe-f97560455ddd","FreeSWITCH-Hostname":"freeswitch01","FreeSWITCH-Switchname":"freeswitch01","FreeSWITCH-IPv4":"192.168.0.1","FreeSWITCH-IPv6":"::1","Event-Date-Local":"2020-01-01 12:00:00","Event-Date-GMT":"Mon, 1 Jan 2020 12:00:00 GMT","Event-Date-Timestamp":"1578709922493848","Event-Calling-File":"switch_core.c","Event-Calling-Function":"send_heartbeat","Event-Calling-Line-Number":"74","Event-Sequence":"1759233","Event-Info":"System Ready","Up-Time":"0 years, 46 days, 1 hour, 43 minutes, 0 seconds, 121 milliseconds, 552 microseconds","FreeSWITCH-Version":"1.10~64bit","Uptime-msec":"3980580121","Session-Count":"0","Max-Sessions":"10000","Session-Per-Sec":"500","Session-Per-Sec-Last":"1","Session-Per-Sec-Max":"42","Session-Per-Sec-FiveMin":"1","Session-Since-Startup":"14960","Session-Peak-Max":"42","Session-Peak-FiveMin":"1","Idle-CPU":"96.733333"}` +) + +// https://stackoverflow.com/questions/42035104/how-to-unit-test-go-errors +func errorContains(out error, want string) bool { + if out == nil { + return want == "" + } + if want == "" { + return false + } + return strings.Contains(out.Error(), want) +} + +func TestNewMessage(t *testing.T) { buf := reader(HeartbeatMessage) fsMsg, err := NewMessage(buf, true) @@ -26,6 +67,66 @@ Content-Type: text/event-json } if fsMsg.Headers["FreeSWITCH-IPv4"] != "192.168.0.1" { - t.Error("ould not parse FreeSWITCH ip from event") + t.Error("could not parse FreeSWITCH ip from event") + } +} + +func TestNewMessageMissingMime(t *testing.T) { + heartbeatMimeless := strings.Replace(HeartbeatMessage, "Content-Type: text/event-json", "", 1) + buf := reader(heartbeatMimeless) + _, err := NewMessage(buf, true) + + if err == nil { + t.Error("Expected error Parse EOF, got nothing") + return + } + + if !errorContains(err, "Parse EOF") { + t.Error(err) + return + } +} + +func testNewMessageServerShutdown(t *testing.T) (error, *Message) { + buf := reader(ShutdownMessage) + fsMsg, err := NewMessage(buf, true) + + return err, fsMsg +} + +func TestNewMessageServerShutdown(t *testing.T) { + err, fsMsg := testNewMessageServerShutdown(t) + + if err != nil { + t.Error(err) + } + + fsMsg.Headers["Content-Type"] = "text/event-plain" +} + +func TestMessage_Dump(t *testing.T) { + err, fsMsg := testNewMessageServerShutdown(t) + + if err != nil { + t.Error(err) + } + + if !strings.Contains(fsMsg.Dump(), "BODY: Event-Info:") { + t.Error("freeswitch message dump failed") + } +} + +func TestMessageParse(t *testing.T) { + buf := reader(EchoResponse) + fsMsg, err := NewMessage(buf, true) + + if (err != nil) { + t.Error(err) + } + + body := string(fsMsg.Body) + + if body != "hi" { + t.Error("parsing freeswitch response failed") } } From a7def735389e19aa29d6a2eab8c3c8f2ad558681 Mon Sep 17 00:00:00 2001 From: Tim Groeneveld Date: Sat, 11 Jan 2020 14:28:15 +1100 Subject: [PATCH 6/6] Allow travis to run the tests automatically --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1f333fc..927e2da 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,4 +11,4 @@ install: - go get -v "github.com/op/go-logging" script: - - go test -run="TestJustToTest" + - go test