Files
RemLink/internal/overlay/clientwg/muxtun_test.go
T
qsc20001102 142e5dc7d6
ci / Go checks (ubuntu-latest) (push) Has been cancelled
ci / Go checks (windows-latest) (push) Has been cancelled
初版功能完成
2026-08-29 13:12:17 +08:00

97 lines
2.4 KiB
Go

package clientwg
import (
"errors"
"os"
"testing"
"golang.zx2c4.com/wireguard/tun"
)
func TestMuxTunProxiesBaseSemanticsAndClosesOnce(t *testing.T) {
t.Parallel()
base := newFakeTUN()
mux := NewMuxTun(base)
if name, err := mux.Name(); err != nil || name != "RemLink" {
t.Fatalf("Name() = (%q, %v)", name, err)
}
if mtu, err := mux.MTU(); err != nil || mtu != 1280 {
t.Fatalf("MTU() = (%d, %v)", mtu, err)
}
if mux.BatchSize() != 1 {
t.Fatalf("BatchSize() = %d, want 1", mux.BatchSize())
}
if mux.Events() != base.events {
t.Fatal("Events() did not return the base channel")
}
buffer := make([]byte, 32)
sizes := make([]int, 1)
n, err := mux.Read([][]byte{buffer}, sizes, 4)
if err != nil || n != 1 || sizes[0] != 3 || string(buffer[4:7]) != "out" {
t.Fatalf("Read() = n=%d sizes=%v data=%q err=%v", n, sizes, buffer[4:7], err)
}
n, err = mux.Write([][]byte{[]byte("xxxxin")}, 4)
if err != nil || n != 1 || string(base.written) != "in" {
t.Fatalf("Write() = n=%d written=%q err=%v", n, base.written, err)
}
if err := mux.Close(); err != nil {
t.Fatalf("Close() error = %v", err)
}
if err := mux.Close(); err != nil {
t.Fatalf("second Close() error = %v", err)
}
if base.closeCalls != 1 {
t.Fatalf("base Close() calls = %d, want 1", base.closeCalls)
}
}
func TestMuxTunPreservesBaseErrors(t *testing.T) {
t.Parallel()
want := errors.New("read failed")
base := newFakeTUN()
base.readErr = want
_, err := NewMuxTun(base).Read([][]byte{make([]byte, 8)}, make([]int, 1), 0)
if !errors.Is(err, want) {
t.Fatalf("Read() error = %v, want %v", err, want)
}
}
type fakeTUN struct {
events chan tun.Event
written []byte
readErr error
closeCalls int
}
func newFakeTUN() *fakeTUN {
return &fakeTUN{events: make(chan tun.Event, 1)}
}
func (f *fakeTUN) File() *os.File { return nil }
func (f *fakeTUN) Read(bufs [][]byte, sizes []int, offset int) (int, error) {
if f.readErr != nil {
return 0, f.readErr
}
sizes[0] = copy(bufs[0][offset:], []byte("out"))
return 1, nil
}
func (f *fakeTUN) Write(bufs [][]byte, offset int) (int, error) {
f.written = append(f.written[:0], bufs[0][offset:]...)
return len(bufs), nil
}
func (f *fakeTUN) MTU() (int, error) { return 1280, nil }
func (f *fakeTUN) Name() (string, error) { return "RemLink", nil }
func (f *fakeTUN) Events() <-chan tun.Event {
return f.events
}
func (f *fakeTUN) Close() error {
f.closeCalls++
return nil
}
func (f *fakeTUN) BatchSize() int { return 1 }