tailscale/tstest/integration/vms/udp_tester.go
Christine Dodrill dc78be12c5
tstest/integration/vms: end-to-end UDP test (#2361)
This tests incoming and outgoing UDP traffic. It would test incoming UDP
traffic however our socks server doesn't seem to allow for connecting to
destinations over UDP. When the socks server gets that support the
incoming test should pass without issue.

Signed-off-by: Christine Dodrill <xe@tailscale.com>
2021-07-08 15:58:18 -04:00

81 lines
1.7 KiB
Go

// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build ignore
// Command udp_tester exists because all of these distros being tested don't
// have a consistent tool for doing UDP traffic. This is a very hacked up tool
// that does that UDP traffic so these tests can be done.
package main
import (
"flag"
"fmt"
"io"
"log"
"net"
"os"
)
var (
client = flag.String("client", "", "host:port to connect to for sending UDP")
server = flag.String("server", "", "host:port to bind to for receiving UDP")
)
func main() {
flag.Parse()
if *client == "" && *server == "" {
log.Fatal("specify -client or -server")
}
if *client != "" {
conn, err := net.Dial("udp", *client)
if err != nil {
log.Fatalf("can't dial %s: %v", *client, err)
}
log.Printf("dialed to %s", conn.RemoteAddr())
defer conn.Close()
buf := make([]byte, 1024)
n, err := os.Stdin.Read(buf)
if err != nil && err != io.EOF {
log.Fatalf("can't read from stdin: %v", err)
}
nn, err := conn.Write(buf[:n])
if err != nil {
log.Fatalf("can't write to %s: %v", conn.RemoteAddr(), err)
}
if n != nn {
log.Fatalf("wanted to write %d bytes, wrote %d bytes", n, nn)
}
}
if *server != "" {
addr, err := net.ResolveUDPAddr("udp", *server)
if err != nil {
log.Fatalf("can't resolve %s: %v", *server, err)
}
ln, err := net.ListenUDP("udp", addr)
if err != nil {
log.Fatalf("can't listen %s: %v", *server, err)
}
defer ln.Close()
buf := make([]byte, 1024)
n, _, err := ln.ReadFromUDP(buf)
if err != nil {
log.Fatal(err)
}
if n == 0 {
log.Fatal("got nothing")
}
fmt.Print(string(buf[:n]))
}
}