83 lines
1.6 KiB
Go

package integration_tests
import (
"crypto/tls"
"io"
"net"
"github.com/apernet/hysteria/core/server"
)
// This file provides utilities for the integration tests.
const (
testCertFile = "test.crt"
testKeyFile = "test.key"
)
func serverTLSConfig() server.TLSConfig {
cert, err := tls.LoadX509KeyPair(testCertFile, testKeyFile)
if err != nil {
panic(err)
}
return server.TLSConfig{
Certificates: []tls.Certificate{cert},
}
}
func serverConn() (net.PacketConn, net.Addr, error) {
udpAddr := &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 14514}
udpConn, err := net.ListenUDP("udp", udpAddr)
if err != nil {
return nil, nil, err
}
return udpConn, udpAddr, nil
}
// tcpEchoServer is a TCP server that echoes what it reads from the connection.
// It will never actively close the connection.
type tcpEchoServer struct {
Listener net.Listener
}
func (s *tcpEchoServer) Serve() error {
for {
conn, err := s.Listener.Accept()
if err != nil {
return err
}
go func() {
_, _ = io.Copy(conn, conn)
_ = conn.Close()
}()
}
}
func (s *tcpEchoServer) Close() error {
return s.Listener.Close()
}
// udpEchoServer is a UDP server that echoes what it reads from the connection.
// It will never actively close the connection.
type udpEchoServer struct {
Conn net.PacketConn
}
func (s *udpEchoServer) Serve() error {
buf := make([]byte, 65536)
for {
n, addr, err := s.Conn.ReadFrom(buf)
if err != nil {
return err
}
_, err = s.Conn.WriteTo(buf[:n], addr)
if err != nil {
return err
}
}
}
func (s *udpEchoServer) Close() error {
return s.Conn.Close()
}