[TASK] extract enable to all databases + increase testing in database
(#78)
This commit is contained in:
parent
3422a29254
commit
69079b7d64
26
data/nodeinfo_test.go
Normal file
26
data/nodeinfo_test.go
Normal file
@ -0,0 +1,26 @@
|
||||
package data
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestNodeinfoBatAddresses(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
batIface := &BatInterface{
|
||||
Interfaces: struct {
|
||||
Wireless []string `json:"wireless,omitempty"`
|
||||
Other []string `json:"other,omitempty"`
|
||||
Tunnel []string `json:"tunnel,omitempty"`
|
||||
}{
|
||||
Wireless: nil,
|
||||
Other: []string{"aa:aa:aa:aa:aa", "aa:aa:aa:aa:ab"},
|
||||
Tunnel: []string{},
|
||||
},
|
||||
}
|
||||
|
||||
addr := batIface.Addresses()
|
||||
assert.NotNil(addr)
|
||||
assert.Equal([]string{"aa:aa:aa:aa:aa", "aa:aa:aa:aa:ab"}, addr)
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
package all
|
||||
|
||||
import (
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/FreifunkBremen/yanic/database"
|
||||
@ -12,12 +13,23 @@ type Connection struct {
|
||||
list []database.Connection
|
||||
}
|
||||
|
||||
func Connect(configuration interface{}) (database.Connection, error) {
|
||||
func Connect(allConnection map[string]interface{}) (database.Connection, error) {
|
||||
var list []database.Connection
|
||||
allConnection := configuration.(map[string][]interface{})
|
||||
for dbType, conn := range database.Adapters {
|
||||
dbConfigs := allConnection[dbType]
|
||||
configForType := allConnection[dbType]
|
||||
if configForType == nil {
|
||||
log.Printf("the output type '%s' has no configuration\n", dbType)
|
||||
continue
|
||||
}
|
||||
dbConfigs, ok := configForType.([]map[string]interface{})
|
||||
if !ok {
|
||||
log.Panicf("the output type '%s' has the wrong format\n", dbType)
|
||||
}
|
||||
|
||||
for _, config := range dbConfigs {
|
||||
if c, ok := config["enable"].(bool); ok && !c {
|
||||
continue
|
||||
}
|
||||
connected, err := conn(config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -1 +1,156 @@
|
||||
package all
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/FreifunkBremen/yanic/database"
|
||||
"github.com/FreifunkBremen/yanic/runtime"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
type testConn struct {
|
||||
database.Connection
|
||||
countNode int
|
||||
countLink int
|
||||
countGlobals int
|
||||
countPrune int
|
||||
countClose int
|
||||
sync.Mutex
|
||||
}
|
||||
|
||||
func (c *testConn) InsertNode(node *runtime.Node) {
|
||||
c.Lock()
|
||||
c.countNode++
|
||||
c.Unlock()
|
||||
}
|
||||
func (c *testConn) GetNode() int {
|
||||
c.Lock()
|
||||
defer c.Unlock()
|
||||
return c.countNode
|
||||
}
|
||||
func (c *testConn) InsertLink(link *runtime.Link, time time.Time) {
|
||||
c.Lock()
|
||||
c.countLink++
|
||||
c.Unlock()
|
||||
}
|
||||
func (c *testConn) GetLink() int {
|
||||
c.Lock()
|
||||
defer c.Unlock()
|
||||
return c.countLink
|
||||
}
|
||||
func (c *testConn) InsertGlobals(stats *runtime.GlobalStats, time time.Time, site string) {
|
||||
c.Lock()
|
||||
c.countGlobals++
|
||||
c.Unlock()
|
||||
}
|
||||
func (c *testConn) GetGlobal() int {
|
||||
c.Lock()
|
||||
defer c.Unlock()
|
||||
return c.countGlobals
|
||||
}
|
||||
func (c *testConn) PruneNodes(time.Duration) {
|
||||
c.Lock()
|
||||
c.countPrune++
|
||||
c.Unlock()
|
||||
}
|
||||
func (c *testConn) GetPrune() int {
|
||||
c.Lock()
|
||||
defer c.Unlock()
|
||||
return c.countPrune
|
||||
}
|
||||
func (c *testConn) Close() {
|
||||
c.Lock()
|
||||
c.countClose++
|
||||
c.Unlock()
|
||||
}
|
||||
func (c *testConn) GetClose() int {
|
||||
c.Lock()
|
||||
defer c.Unlock()
|
||||
return c.countClose
|
||||
}
|
||||
|
||||
func TestStart(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
globalConn := &testConn{}
|
||||
database.RegisterAdapter("a", func(config map[string]interface{}) (database.Connection, error) {
|
||||
return globalConn, nil
|
||||
})
|
||||
database.RegisterAdapter("b", func(config map[string]interface{}) (database.Connection, error) {
|
||||
return globalConn, nil
|
||||
})
|
||||
database.RegisterAdapter("c", func(config map[string]interface{}) (database.Connection, error) {
|
||||
return globalConn, nil
|
||||
})
|
||||
database.RegisterAdapter("d", func(config map[string]interface{}) (database.Connection, error) {
|
||||
return nil, nil
|
||||
})
|
||||
database.RegisterAdapter("e", func(config map[string]interface{}) (database.Connection, error) {
|
||||
return nil, errors.New("blub")
|
||||
})
|
||||
allConn, err := Connect(map[string]interface{}{
|
||||
"a": []map[string]interface{}{
|
||||
map[string]interface{}{
|
||||
"enable": false,
|
||||
"path": "a1",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"path": "a2",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"enable": true,
|
||||
"path": "a3",
|
||||
},
|
||||
},
|
||||
"b": nil,
|
||||
"c": []map[string]interface{}{
|
||||
map[string]interface{}{
|
||||
"path": "c1",
|
||||
},
|
||||
},
|
||||
// fetch continue command in Connect
|
||||
"d": []map[string]interface{}{
|
||||
map[string]interface{}{
|
||||
"path": "d0",
|
||||
},
|
||||
},
|
||||
})
|
||||
assert.NoError(err)
|
||||
|
||||
assert.Equal(0, globalConn.GetNode())
|
||||
allConn.InsertNode(nil)
|
||||
assert.Equal(3, globalConn.GetNode())
|
||||
|
||||
assert.Equal(0, globalConn.GetLink())
|
||||
allConn.InsertLink(nil, time.Now())
|
||||
assert.Equal(3, globalConn.GetLink())
|
||||
|
||||
assert.Equal(0, globalConn.GetGlobal())
|
||||
allConn.InsertGlobals(nil, time.Now(), runtime.GLOBAL_SITE)
|
||||
assert.Equal(3, globalConn.GetGlobal())
|
||||
|
||||
assert.Equal(0, globalConn.GetPrune())
|
||||
allConn.PruneNodes(time.Second)
|
||||
assert.Equal(3, globalConn.GetPrune())
|
||||
|
||||
assert.Equal(0, globalConn.GetClose())
|
||||
allConn.Close()
|
||||
assert.Equal(3, globalConn.GetClose())
|
||||
|
||||
_, err = Connect(map[string]interface{}{
|
||||
"e": []map[string]interface{}{
|
||||
map[string]interface{}{},
|
||||
},
|
||||
})
|
||||
assert.Error(err)
|
||||
|
||||
// wrong format -> the only panic in Register
|
||||
assert.Panics(func() {
|
||||
Connect(map[string]interface{}{
|
||||
"e": true,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ type Connection interface {
|
||||
}
|
||||
|
||||
// Connect function with config to get DB connection interface
|
||||
type Connect func(config interface{}) (Connection, error)
|
||||
type Connect func(config map[string]interface{}) (Connection, error)
|
||||
|
||||
// Adapters is the list of registered database adapters
|
||||
var Adapters = map[string]Connect{}
|
||||
|
@ -6,11 +6,11 @@ import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestNow(t *testing.T) {
|
||||
func TestRegister(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
assert.Len(Adapters, 0)
|
||||
|
||||
RegisterAdapter("blub", func(config interface{}) (Connection, error) {
|
||||
RegisterAdapter("blub", func(config map[string]interface{}) (Connection, error) {
|
||||
return nil, nil
|
||||
})
|
||||
|
||||
|
@ -33,18 +33,10 @@ func (c Config) Prefix() string {
|
||||
return c["prefix"].(string)
|
||||
}
|
||||
|
||||
func (c Config) Enable() bool {
|
||||
return c["enable"].(bool)
|
||||
}
|
||||
|
||||
func Connect(configuration interface{}) (database.Connection, error) {
|
||||
func Connect(configuration map[string]interface{}) (database.Connection, error) {
|
||||
var config Config
|
||||
|
||||
config = configuration.(map[string]interface{})
|
||||
|
||||
if !config.Enable() {
|
||||
return nil, nil
|
||||
}
|
||||
config = configuration
|
||||
|
||||
con := &Connection{
|
||||
client: graphigo.Client{
|
||||
|
@ -32,9 +32,6 @@ type Connection struct {
|
||||
|
||||
type Config map[string]interface{}
|
||||
|
||||
func (c Config) Enable() bool {
|
||||
return c["enable"].(bool)
|
||||
}
|
||||
func (c Config) Address() string {
|
||||
return c["address"].(string)
|
||||
}
|
||||
@ -57,12 +54,10 @@ func (c Config) Tags() map[string]interface{} {
|
||||
func init() {
|
||||
database.RegisterAdapter("influxdb", Connect)
|
||||
}
|
||||
func Connect(configuration interface{}) (database.Connection, error) {
|
||||
func Connect(configuration map[string]interface{}) (database.Connection, error) {
|
||||
var config Config
|
||||
config = configuration.(map[string]interface{})
|
||||
if !config.Enable() {
|
||||
return nil, nil
|
||||
}
|
||||
config = configuration
|
||||
|
||||
// Make client
|
||||
c, err := client.NewHTTPClient(client.HTTPConfig{
|
||||
Addr: config.Address(),
|
||||
|
@ -10,6 +10,27 @@ import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestConnect(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
conn, err := Connect(map[string]interface{}{
|
||||
"address": "",
|
||||
"username": "",
|
||||
"password": "",
|
||||
})
|
||||
assert.Nil(conn)
|
||||
assert.Error(err)
|
||||
|
||||
conn, err = Connect(map[string]interface{}{
|
||||
"address": "http://localhost",
|
||||
"database": "",
|
||||
"username": "",
|
||||
"password": "",
|
||||
})
|
||||
assert.NotNil(conn)
|
||||
assert.NoError(err)
|
||||
}
|
||||
|
||||
func TestAddPoint(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
|
@ -1,8 +1,11 @@
|
||||
package influxdb
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/influxdata/influxdb/client/v2"
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/FreifunkBremen/yanic/data"
|
||||
@ -20,9 +23,68 @@ func TestGlobalStats(t *testing.T) {
|
||||
fields := GlobalStatsFields(stats[runtime.GLOBAL_SITE])
|
||||
assert.EqualValues(3, fields["nodes"])
|
||||
|
||||
// check TEST_SITE fields
|
||||
fields = GlobalStatsFields(stats[TEST_SITE])
|
||||
assert.EqualValues(2, fields["nodes"])
|
||||
assert.EqualValues(1, fields["nodes"])
|
||||
|
||||
conn := &Connection{
|
||||
points: make(chan *client.Point),
|
||||
}
|
||||
|
||||
global := 0
|
||||
globalSite := 0
|
||||
model := 0
|
||||
modelSite := 0
|
||||
firmware := 0
|
||||
firmwareSite := 0
|
||||
autoupdater := 0
|
||||
autoupdaterSite := 0
|
||||
wg := sync.WaitGroup{}
|
||||
wg.Add(9)
|
||||
go func() {
|
||||
for p := range conn.points {
|
||||
switch p.Name() {
|
||||
case MeasurementGlobal:
|
||||
global++
|
||||
break
|
||||
case "global_site":
|
||||
globalSite++
|
||||
break
|
||||
case CounterMeasurementModel:
|
||||
model++
|
||||
break
|
||||
case "model_site":
|
||||
modelSite++
|
||||
break
|
||||
case CounterMeasurementFirmware:
|
||||
firmware++
|
||||
break
|
||||
case "firmware_site":
|
||||
firmwareSite++
|
||||
break
|
||||
case CounterMeasurementAutoupdater:
|
||||
autoupdater++
|
||||
break
|
||||
case "autoupdater_site":
|
||||
autoupdaterSite++
|
||||
break
|
||||
default:
|
||||
assert.Equal("invalid p.Name found", p.Name())
|
||||
}
|
||||
wg.Done()
|
||||
}
|
||||
}()
|
||||
for site, stat := range stats {
|
||||
conn.InsertGlobals(stat, time.Now(), site)
|
||||
}
|
||||
wg.Wait()
|
||||
assert.Equal(1, global)
|
||||
assert.Equal(1, globalSite)
|
||||
assert.Equal(2, model)
|
||||
assert.Equal(1, modelSite)
|
||||
assert.Equal(1, firmware)
|
||||
assert.Equal(0, firmwareSite)
|
||||
assert.Equal(2, autoupdater)
|
||||
assert.Equal(1, autoupdaterSite)
|
||||
}
|
||||
|
||||
func createTestNodes() *runtime.Nodes {
|
||||
@ -40,9 +102,7 @@ func createTestNodes() *runtime.Nodes {
|
||||
Hardware: data.Hardware{
|
||||
Model: "TP-Link 841",
|
||||
},
|
||||
System: data.System{
|
||||
SiteCode: TEST_SITE,
|
||||
},
|
||||
System: data.System{},
|
||||
},
|
||||
}
|
||||
nodeData.Nodeinfo.Software.Firmware.Release = "2016.1.6+entenhausen1"
|
||||
|
@ -82,7 +82,9 @@ func TestToInflux(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
LLDP: map[string]data.LLDPNeighbours{},
|
||||
LLDP: map[string]data.LLDPNeighbours{
|
||||
"b-interface": data.LLDPNeighbours{},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
69
database/internal_test.go
Normal file
69
database/internal_test.go
Normal file
@ -0,0 +1,69 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/FreifunkBremen/yanic/runtime"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
type testConn struct {
|
||||
Connection
|
||||
countClose int
|
||||
countPrune int
|
||||
sync.Mutex
|
||||
}
|
||||
|
||||
func (c *testConn) Close() {
|
||||
c.Lock()
|
||||
c.countClose++
|
||||
c.Unlock()
|
||||
}
|
||||
func (c *testConn) GetClose() int {
|
||||
c.Lock()
|
||||
defer c.Unlock()
|
||||
return c.countClose
|
||||
}
|
||||
func (c *testConn) PruneNodes(time.Duration) {
|
||||
c.Lock()
|
||||
c.countPrune++
|
||||
c.Unlock()
|
||||
}
|
||||
func (c *testConn) GetPruneNodes() int {
|
||||
c.Lock()
|
||||
defer c.Unlock()
|
||||
return c.countPrune
|
||||
}
|
||||
|
||||
func TestStart(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
conn := &testConn{}
|
||||
config := &runtime.Config{
|
||||
Database: struct {
|
||||
DeleteInterval runtime.Duration `toml:"delete_interval"`
|
||||
DeleteAfter runtime.Duration `toml:"delete_after"`
|
||||
Connection map[string]interface{}
|
||||
}{
|
||||
DeleteInterval: runtime.Duration{Duration: time.Millisecond * 10},
|
||||
},
|
||||
}
|
||||
assert.Nil(quit)
|
||||
|
||||
Start(conn, config)
|
||||
assert.NotNil(quit)
|
||||
|
||||
assert.Equal(0, conn.GetPruneNodes())
|
||||
time.Sleep(time.Millisecond * 12)
|
||||
assert.Equal(1, conn.GetPruneNodes())
|
||||
|
||||
assert.Equal(0, conn.GetClose())
|
||||
Close(conn)
|
||||
assert.NotNil(quit)
|
||||
assert.Equal(1, conn.GetClose())
|
||||
|
||||
time.Sleep(time.Millisecond * 12) // to reach timer.Stop() line
|
||||
|
||||
}
|
@ -23,9 +23,6 @@ type Connection struct {
|
||||
|
||||
type Config map[string]interface{}
|
||||
|
||||
func (c Config) Enable() bool {
|
||||
return c["enable"].(bool)
|
||||
}
|
||||
func (c Config) Path() string {
|
||||
return c["path"].(string)
|
||||
}
|
||||
@ -34,12 +31,9 @@ func init() {
|
||||
database.RegisterAdapter("logging", Connect)
|
||||
}
|
||||
|
||||
func Connect(configuration interface{}) (database.Connection, error) {
|
||||
func Connect(configuration map[string]interface{}) (database.Connection, error) {
|
||||
var config Config
|
||||
config = configuration.(map[string]interface{})
|
||||
if !config.Enable() {
|
||||
return nil, nil
|
||||
}
|
||||
config = configuration
|
||||
|
||||
file, err := os.OpenFile(config.Path(), os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
|
||||
if err != nil {
|
||||
|
@ -1 +1,60 @@
|
||||
package logging
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/FreifunkBremen/yanic/data"
|
||||
"github.com/FreifunkBremen/yanic/runtime"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestStart(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
conn, err := Connect(map[string]interface{}{
|
||||
"path": "/dev/notexists/file",
|
||||
})
|
||||
assert.Nil(conn)
|
||||
assert.Error(err)
|
||||
|
||||
path := "/tmp/testlogfile"
|
||||
|
||||
conn, err = Connect(map[string]interface{}{
|
||||
"path": path,
|
||||
})
|
||||
|
||||
dat, _ := ioutil.ReadFile(path)
|
||||
assert.NotContains(string(dat), "InsertNode")
|
||||
|
||||
conn.InsertNode(&runtime.Node{
|
||||
Statistics: &data.Statistics{},
|
||||
})
|
||||
|
||||
dat, _ = ioutil.ReadFile(path)
|
||||
assert.Contains(string(dat), "InsertNode")
|
||||
|
||||
assert.NotContains(string(dat), "InsertLink")
|
||||
conn.InsertLink(&runtime.Link{}, time.Now())
|
||||
dat, _ = ioutil.ReadFile(path)
|
||||
assert.Contains(string(dat), "InsertLink")
|
||||
|
||||
assert.NotContains(string(dat), "InsertGlobals")
|
||||
conn.InsertGlobals(&runtime.GlobalStats{}, time.Now(), runtime.GLOBAL_SITE)
|
||||
dat, _ = ioutil.ReadFile(path)
|
||||
assert.Contains(string(dat), "InsertGlobals")
|
||||
|
||||
assert.NotContains(string(dat), "PruneNodes")
|
||||
conn.PruneNodes(time.Second)
|
||||
dat, _ = ioutil.ReadFile(path)
|
||||
assert.Contains(string(dat), "PruneNodes")
|
||||
|
||||
assert.NotContains(string(dat), "Close")
|
||||
conn.Close()
|
||||
dat, _ = ioutil.ReadFile(path)
|
||||
assert.Contains(string(dat), "Close")
|
||||
|
||||
os.Remove(path)
|
||||
}
|
||||
|
@ -172,12 +172,14 @@ func TestTransform(t *testing.T) {
|
||||
assert.Equal("node:b:mac:wifi", link.TargetMAC)
|
||||
assert.Equal(float32(0.6), link.SourceTQ)
|
||||
assert.Equal(float32(0.8), link.TargetTQ)
|
||||
default:
|
||||
case "node:b:mac:lan":
|
||||
assert.Equal("other", link.Type)
|
||||
assert.Equal("node:c:mac:lan", link.TargetMAC)
|
||||
assert.Equal(float32(0.8), link.SourceTQ)
|
||||
assert.Equal(float32(0.4), link.TargetTQ)
|
||||
break
|
||||
default:
|
||||
assert.False(true, "invalid link.SourceMAC found")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ type Config struct {
|
||||
Database struct {
|
||||
DeleteInterval Duration `toml:"delete_interval"` // Delete stats of nodes every n minutes
|
||||
DeleteAfter Duration `toml:"delete_after"` // Delete stats of nodes till now-deletetill n minutes
|
||||
Connection map[string][]interface{}
|
||||
Connection map[string]interface{}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -31,15 +31,15 @@ func TestReadConfig(t *testing.T) {
|
||||
assert.Equal("/var/www/html/meshviewer/data/nodes.json", meshviewer["nodes_path"])
|
||||
|
||||
var influxdb map[string]interface{}
|
||||
dbs := config.Database.Connection["influxdb"]
|
||||
dbs := config.Database.Connection["influxdb"].([]map[string]interface{})
|
||||
assert.Len(dbs, 1, "more influxdb are given")
|
||||
influxdb = dbs[0].(map[string]interface{})
|
||||
influxdb = dbs[0]
|
||||
assert.Equal(influxdb["database"], "ffhb")
|
||||
|
||||
var graphitedb map[string]interface{}
|
||||
dbs = config.Database.Connection["graphite"]
|
||||
dbs = config.Database.Connection["graphite"].([]map[string]interface{})
|
||||
assert.Len(dbs, 1, "more graphitedb are given")
|
||||
graphitedb = dbs[0].(map[string]interface{})
|
||||
graphitedb = dbs[0]
|
||||
assert.Equal(graphitedb["address"], "localhost:2003")
|
||||
|
||||
_, err = ReadConfigFile("testdata/config_failed.toml")
|
||||
|
Loading…
Reference in New Issue
Block a user