yanic/runtime/nodes_test.go

209 lines
4.9 KiB
Go
Raw Normal View History

package runtime
2016-03-20 18:30:44 +01:00
import (
"io/ioutil"
"os"
"testing"
2016-10-08 11:52:11 +02:00
"time"
2016-03-20 18:30:44 +01:00
"github.com/stretchr/testify/assert"
2017-03-03 16:19:35 +01:00
"github.com/FreifunkBremen/yanic/data"
"github.com/FreifunkBremen/yanic/lib/jsontime"
2016-03-20 18:30:44 +01:00
)
2016-10-08 11:52:11 +02:00
func TestExpire(t *testing.T) {
assert := assert.New(t)
config := &NodesConfig{}
config.OfflineAfter.Duration = time.Minute * 10
// to get default (100%) path of testing
// config.PruneAfter.Duration = time.Hour * 24 * 6
2016-10-08 11:52:11 +02:00
nodes := &Nodes{
config: config,
List: make(map[string]*Node),
ifaceToNodeID: make(map[string]string),
2016-10-08 11:52:11 +02:00
}
nodes.Update("expire", &data.ResponseData{}) // should expire
nodes.Update("offline", &data.ResponseData{}) // should become offline
nodes.Update("online", &data.ResponseData{}) // should stay online
expire := nodes.List["expire"]
expire.Lastseen = expire.Lastseen.Add((-7 * time.Hour * 24) - time.Minute)
2016-10-08 11:52:11 +02:00
offline := nodes.List["offline"]
offline.Lastseen = offline.Lastseen.Add((-7 * time.Hour * 24) + time.Minute)
2016-10-08 11:52:11 +02:00
nodes.expire()
// one expired?
assert.Len(nodes.List, 2)
2016-10-08 11:52:11 +02:00
assert.Nil(nodes.List["expire"])
// one offline?
assert.NotNil(nodes.List["offline"])
assert.False(nodes.List["offline"].Online)
2016-10-08 11:52:11 +02:00
// one online?
assert.NotNil(nodes.List["online"])
assert.True(nodes.List["online"].Online)
2016-10-08 11:52:11 +02:00
}
2016-03-20 18:30:44 +01:00
func TestLoadAndSave(t *testing.T) {
assert := assert.New(t)
config := &NodesConfig{}
// not autoload without StatePath
NewNodes(config)
2016-03-20 18:30:44 +01:00
// Test unmarshalable /dev/null - autolead with StatePath
config.StatePath = "/dev/null"
2016-11-20 18:45:18 +01:00
nodes := NewNodes(config)
// Test unopen able
config.StatePath = "/root/nodes.json"
nodes.load()
// works ;)
config.StatePath = "testdata/nodes.json"
2016-03-20 18:30:44 +01:00
nodes.load()
tmpfile, _ := ioutil.TempFile("/tmp", "nodes")
config.StatePath = tmpfile.Name()
nodes.save()
2016-03-20 18:30:44 +01:00
os.Remove(tmpfile.Name())
assert.PanicsWithValue("open /dev/null.tmp: permission denied", func() {
SaveJSON(nodes, "/dev/null")
})
tmpfile, _ = ioutil.TempFile("/tmp", "nodes")
assert.PanicsWithValue("json: unsupported type: func() string", func() {
SaveJSON(tmpfile.Name, tmpfile.Name())
})
os.Remove(tmpfile.Name())
//TODO how to test easy a failing renaming
assert.Len(nodes.List, 2)
2016-03-20 18:30:44 +01:00
}
2016-03-21 12:26:08 +01:00
func TestUpdateNodes(t *testing.T) {
assert := assert.New(t)
nodes := &Nodes{
List: make(map[string]*Node),
ifaceToNodeID: make(map[string]string),
}
assert.Len(nodes.List, 0)
2016-03-21 12:26:08 +01:00
res := &data.ResponseData{
Neighbours: &data.Neighbours{},
Statistics: &data.Statistics{
Wireless: data.WirelessStatistics{
&data.WirelessAirtime{},
},
},
NodeInfo: &data.NodeInfo{},
2016-03-21 12:26:08 +01:00
}
nodes.Update("abcdef012345", res)
// Update wireless statistics by running SetUtilization
nodes.Update("abcdef012345", res)
assert.Len(nodes.List, 1)
2016-03-21 12:26:08 +01:00
}
func TestSelectNodes(t *testing.T) {
assert := assert.New(t)
config := &NodesConfig{}
config.StatePath = "testdata/nodes.json"
nodes := NewNodes(config)
selectedNodes := nodes.Select(func(n *Node) bool {
return true
})
assert.Len(selectedNodes, 2)
selectedNodes = nodes.Select(func(n *Node) bool {
return false
})
assert.Len(selectedNodes, 0)
selectedNodes = nodes.Select(func(n *Node) bool {
return n.Nodeinfo.NodeID == "f4f26dd7a30a"
})
assert.Len(selectedNodes, 1)
time := jsontime.Time{}
time.UnmarshalJSON([]byte("2017-03-10T12:12:01"))
assert.Equal(time, selectedNodes[0].Firstseen)
}
func TestAddNode(t *testing.T) {
assert := assert.New(t)
nodes := NewNodes(&NodesConfig{})
nodes.AddNode(&Node{})
assert.Len(nodes.List, 0)
nodes.AddNode(&Node{Nodeinfo: &data.NodeInfo{}})
assert.Len(nodes.List, 0)
nodes.AddNode(&Node{Nodeinfo: &data.NodeInfo{NodeID: "blub"}})
assert.Len(nodes.List, 1)
}
func TestLinksNodes(t *testing.T) {
assert := assert.New(t)
nodes := &Nodes{
List: make(map[string]*Node),
ifaceToNodeID: make(map[string]string),
}
assert.Len(nodes.List, 0)
nodes.Update("f4f26dd7a30a", &data.ResponseData{
NodeInfo: &data.NodeInfo{
NodeID: "f4f26dd7a30a",
Network: data.Network{
Mac: "f4:f2:6d:d7:a3:0a",
},
},
})
nodes.Update("f4f26dd7a30b", &data.ResponseData{
NodeInfo: &data.NodeInfo{
NodeID: "f4f26dd7a30b",
},
Neighbours: &data.Neighbours{
NodeID: "f4f26dd7a30b",
Batadv: map[string]data.BatadvNeighbours{
2018-01-13 16:40:23 +01:00
"f4:f2:6d:d7:a3:0b": {
Neighbours: map[string]data.BatmanLink{
2018-01-13 16:40:23 +01:00
"f4:f2:6d:d7:a3:0a": {
Tq: 200, Lastseen: 0.42,
},
},
},
},
},
})
node := nodes.List["f4f26dd7a30a"]
assert.NotNil(node)
links := nodes.NodeLinks(node)
assert.Len(links, 0)
node = nodes.List["f4f26dd7a30b"]
assert.NotNil(node)
links = nodes.NodeLinks(node)
assert.Len(links, 1)
link := links[0]
assert.Equal(link.SourceID, "f4f26dd7a30b")
assert.Equal(link.SourceMAC, "f4:f2:6d:d7:a3:0b")
assert.Equal(link.TargetID, "f4f26dd7a30a")
assert.Equal(link.TargetMAC, "f4:f2:6d:d7:a3:0a")
assert.Equal(link.TQ, 200)
nodeid := nodes.GetNodeIDbyMAC("f4:f2:6d:d7:a3:0a")
assert.Equal("f4f26dd7a30a", nodeid)
}