[TASK] add golang client

This commit is contained in:
Martin Geno 2017-05-29 21:34:10 +02:00
parent 8ab3f832f9
commit faff3e4f63
No known key found for this signature in database
GPG Key ID: F0D39A37E925E941
2 changed files with 155 additions and 0 deletions

View File

@ -0,0 +1,86 @@
package yanic
import (
"encoding/json"
"log"
"net"
"github.com/FreifunkBremen/yanic/database/socket"
"github.com/FreifunkBremen/yanic/runtime"
)
type Dialer struct {
conn net.Conn
queue chan socket.Message
quit chan struct{}
NodeHandler func(*runtime.Node)
GlobalsHandler func(*runtime.GlobalStats)
PruneNodesHandler func()
}
func Dial(ctype, addr string) *Dialer {
conn, err := net.Dial(ctype, addr)
if err != nil {
log.Panicf("yanic dial to %s:%s failed", ctype, addr)
}
dialer := &Dialer{
conn: conn,
queue: make(chan socket.Message),
quit: make(chan struct{}),
}
return dialer
}
func (d *Dialer) Start() {
go d.reciever()
d.parser()
}
func (d *Dialer) Close() {
d.conn.Close()
close(d.quit)
}
func (d *Dialer) reciever() {
decoder := json.NewDecoder(d.conn)
var msg socket.Message
for {
select {
case <-d.quit:
close(d.queue)
return
default:
decoder.Decode(&msg)
d.queue <- msg
}
}
}
func (d *Dialer) parser() {
for msg := range d.queue {
switch msg.Event {
case socket.MessageEventInsertNode:
if d.NodeHandler != nil {
var node runtime.Node
obj, _ := json.Marshal(msg.Body)
json.Unmarshal(obj, &node)
d.NodeHandler(&node)
}
case socket.MessageEventInsertGlobals:
if d.GlobalsHandler != nil {
var globals runtime.GlobalStats
obj, _ := json.Marshal(msg.Body)
json.Unmarshal(obj, &globals)
d.GlobalsHandler(&globals)
}
case socket.MessageEventPruneNodes:
if d.PruneNodesHandler != nil {
d.PruneNodesHandler()
}
}
}
}

View File

@ -0,0 +1,69 @@
package yanic
import (
"testing"
"time"
"github.com/FreifunkBremen/yanic/database/socket"
"github.com/FreifunkBremen/yanic/runtime"
"github.com/stretchr/testify/assert"
)
func TestConnectError(t *testing.T) {
assert := assert.New(t)
assert.Panics(func() {
Dial("unix", "/tmp/yanic-database-error.socket")
}, "could connect")
}
func TestRecieveMessages(t *testing.T) {
assert := assert.New(t)
server, err := socket.Connect(map[string]interface{}{
"enable": true,
"type": "unix",
"address": "/tmp/yanic-database.socket",
})
assert.NoError(err)
d := Dial("unix", "/tmp/yanic-database.socket")
assert.NotNil(d)
go d.Start()
time.Sleep(5 * time.Millisecond)
runned := false
d.NodeHandler = func(node *runtime.Node) {
runned = true
}
server.InsertNode(nil)
time.Sleep(5 * time.Millisecond)
assert.True(runned, "node not inserted")
runned = false
d.GlobalsHandler = func(stats *runtime.GlobalStats) {
runned = true
}
server.InsertGlobals(nil, time.Now())
time.Sleep(5 * time.Millisecond)
assert.True(runned, "global stats not inserted")
runned = false
d.PruneNodesHandler = func() {
runned = true
}
server.PruneNodes(time.Hour * 24 * 7)
time.Sleep(5 * time.Millisecond)
assert.True(runned, "node not pruned")
d.Close()
time.Sleep(5 * time.Millisecond)
runned = false
d.PruneNodesHandler = func() {
runned = true
}
server.PruneNodes(time.Hour * 24 * 7)
time.Sleep(5 * time.Millisecond)
assert.False(runned, "message recieve")
server.Close()
}