2019-01-02 00:55:51 +00:00
|
|
|
/* SPDX-License-Identifier: MIT
|
2018-05-03 13:04:00 +00:00
|
|
|
*
|
2019-01-02 00:55:51 +00:00
|
|
|
* Copyright (C) 2017-2019 WireGuard LLC. All Rights Reserved.
|
2018-05-03 13:04:00 +00:00
|
|
|
*/
|
|
|
|
|
2019-03-03 03:04:41 +00:00
|
|
|
package tun
|
2017-06-28 21:45:45 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
2018-05-21 03:12:55 +00:00
|
|
|
"errors"
|
2019-02-18 03:44:41 +00:00
|
|
|
"golang.zx2c4.com/wireguard/tun"
|
2017-11-17 16:25:45 +00:00
|
|
|
"os"
|
2017-06-28 21:45:45 +00:00
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
/* Helpers for writing unit tests
|
|
|
|
*/
|
|
|
|
|
|
|
|
type DummyTUN struct {
|
|
|
|
name string
|
2017-07-02 13:28:38 +00:00
|
|
|
mtu int
|
2017-06-28 21:45:45 +00:00
|
|
|
packets chan []byte
|
2018-05-24 17:58:16 +00:00
|
|
|
events chan tun.TUNEvent
|
2017-06-28 21:45:45 +00:00
|
|
|
}
|
|
|
|
|
2017-11-17 16:25:45 +00:00
|
|
|
func (tun *DummyTUN) File() *os.File {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-05-13 17:35:11 +00:00
|
|
|
func (tun *DummyTUN) Name() (string, error) {
|
|
|
|
return tun.name, nil
|
2017-06-28 21:45:45 +00:00
|
|
|
}
|
|
|
|
|
2017-07-12 21:11:49 +00:00
|
|
|
func (tun *DummyTUN) MTU() (int, error) {
|
|
|
|
return tun.mtu, nil
|
2017-06-28 21:45:45 +00:00
|
|
|
}
|
|
|
|
|
2018-02-02 19:45:25 +00:00
|
|
|
func (tun *DummyTUN) Write(d []byte, offset int) (int, error) {
|
|
|
|
tun.packets <- d[offset:]
|
2017-06-28 21:45:45 +00:00
|
|
|
return len(d), nil
|
|
|
|
}
|
|
|
|
|
2017-08-11 14:18:20 +00:00
|
|
|
func (tun *DummyTUN) Close() error {
|
2018-05-21 03:12:55 +00:00
|
|
|
close(tun.events)
|
|
|
|
close(tun.packets)
|
2017-08-11 14:18:20 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-05-24 17:58:16 +00:00
|
|
|
func (tun *DummyTUN) Events() chan tun.TUNEvent {
|
2017-08-11 14:18:20 +00:00
|
|
|
return tun.events
|
|
|
|
}
|
|
|
|
|
2018-02-02 19:45:25 +00:00
|
|
|
func (tun *DummyTUN) Read(d []byte, offset int) (int, error) {
|
2018-05-21 03:12:55 +00:00
|
|
|
t, ok := <-tun.packets
|
|
|
|
if !ok {
|
|
|
|
return 0, errors.New("device closed")
|
|
|
|
}
|
2018-02-02 19:45:25 +00:00
|
|
|
copy(d[offset:], t)
|
2017-06-28 21:45:45 +00:00
|
|
|
return len(t), nil
|
|
|
|
}
|
|
|
|
|
2018-05-24 17:58:16 +00:00
|
|
|
func CreateDummyTUN(name string) (tun.TUNDevice, error) {
|
2017-06-28 21:45:45 +00:00
|
|
|
var dummy DummyTUN
|
2017-06-30 12:41:08 +00:00
|
|
|
dummy.mtu = 0
|
2017-06-28 21:45:45 +00:00
|
|
|
dummy.packets = make(chan []byte, 100)
|
2018-05-24 17:58:16 +00:00
|
|
|
dummy.events = make(chan tun.TUNEvent, 10)
|
2017-06-28 21:45:45 +00:00
|
|
|
return &dummy, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func assertNil(t *testing.T, err error) {
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func assertEqual(t *testing.T, a []byte, b []byte) {
|
|
|
|
if bytes.Compare(a, b) != 0 {
|
|
|
|
t.Fatal(a, "!=", b)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func randDevice(t *testing.T) *Device {
|
|
|
|
sk, err := newPrivateKey()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
tun, _ := CreateDummyTUN("dummy")
|
2017-11-17 16:25:45 +00:00
|
|
|
logger := NewLogger(LogLevelError, "")
|
|
|
|
device := NewDevice(tun, logger)
|
2017-06-28 21:45:45 +00:00
|
|
|
device.SetPrivateKey(sk)
|
|
|
|
return device
|
|
|
|
}
|