Begin work on full device<->device unit-test

To simulate a full interaction between two WireGuard
instances without networking, using dummy instances of the interfaces
This commit is contained in:
Mathias Hall-Andersen 2018-03-08 16:44:27 +01:00
parent fd248c6cb1
commit 6cecaf3157
4 changed files with 142 additions and 1 deletions

50
bind_test.go Normal file
View file

@ -0,0 +1,50 @@
package main
import "errors"
type DummyDatagram struct {
msg []byte
endpoint Endpoint
world bool // better type
}
type DummyBind struct {
in6 chan DummyDatagram
ou6 chan DummyDatagram
in4 chan DummyDatagram
ou4 chan DummyDatagram
closed bool
}
func (b *DummyBind) SetMark(v uint32) error {
return nil
}
func (b *DummyBind) ReceiveIPv6(buff []byte) (int, Endpoint, error) {
datagram, ok := <-b.in6
if !ok {
return 0, nil, errors.New("closed")
}
copy(buff, datagram.msg)
return len(datagram.msg), datagram.endpoint, nil
}
func (b *DummyBind) ReceiveIPv4(buff []byte) (int, Endpoint, error) {
datagram, ok := <-b.in4
if !ok {
return 0, nil, errors.New("closed")
}
copy(buff, datagram.msg)
return len(datagram.msg), datagram.endpoint, nil
}
func (b *DummyBind) Close() error {
close(b.in6)
close(b.in4)
b.closed = true
return nil
}
func (b *DummyBind) Send(buff []byte, end Endpoint) error {
return nil
}

43
device_test.go Normal file
View file

@ -0,0 +1,43 @@
package main
/* Create two device instances and simulate full WireGuard interaction
* without network dependencies
*/
import "testing"
func TestDevice(t *testing.T) {
// prepare tun devices for generating traffic
tun1, err := CreateDummyTUN("tun1")
if err != nil {
t.Error("failed to create tun:", err.Error())
}
tun2, err := CreateDummyTUN("tun2")
if err != nil {
t.Error("failed to create tun:", err.Error())
}
println(tun1)
println(tun2)
// prepare endpoints
end1, err := CreateDummyEndpoint()
if err != nil {
t.Error("failed to create endpoint:", err.Error())
}
end2, err := CreateDummyEndpoint()
if err != nil {
t.Error("failed to create endpoint:", err.Error())
}
println(end1)
println(end2)
// create binds
}

48
endpoint_test.go Normal file
View file

@ -0,0 +1,48 @@
package main
import (
"math/rand"
"net"
)
type DummyEndpoint struct {
src [16]byte
dst [16]byte
}
func CreateDummyEndpoint() (*DummyEndpoint, error) {
var end DummyEndpoint
if _, err := rand.Read(end.src[:]); err != nil {
return nil, err
}
_, err := rand.Read(end.dst[:])
return &end, err
}
func (e *DummyEndpoint) ClearSrc() {}
func (e *DummyEndpoint) SrcToString() string {
var addr net.UDPAddr
addr.IP = e.SrcIP()
addr.Port = 1000
return addr.String()
}
func (e *DummyEndpoint) DstToString() string {
var addr net.UDPAddr
addr.IP = e.DstIP()
addr.Port = 1000
return addr.String()
}
func (e *DummyEndpoint) SrcToBytes() []byte {
return e.src[:]
}
func (e *DummyEndpoint) DstIP() net.IP {
return e.dst[:]
}
func (e *DummyEndpoint) SrcIP() net.IP {
return e.src[:]
}

View file

@ -475,7 +475,7 @@ func (device *Device) RoutineHandshake() {
peer.endpoint = elem.endpoint peer.endpoint = elem.endpoint
peer.mutex.Unlock() peer.mutex.Unlock()
logDebug.Println("Received handshake initiation from", peer) logDebug.Println(peer, ": Received handshake initiation")
peer.TimerEphemeralKeyCreated() peer.TimerEphemeralKeyCreated()